From 466532c97bf71f83efc09813caedfd5178ab6d85 Mon Sep 17 00:00:00 2001 From: teo Date: Wed, 18 Sep 2024 12:23:55 +0300 Subject: [PATCH 01/17] tox.ini --- ...tart-and-configure-server-and-admins.ipynb | 1179 ++ .../001-scale-delete-worker-pools.ipynb | 392 + .../010-setup-bigquery-pool.ipynb | 562 + .../011-users-emails-passwords.ipynb | 672 ++ .../0.9.1_notebooks/020-configure-api.ipynb | 656 + .../0.9.1_notebooks/021-create-jobs.ipynb | 499 + .../040-do-review-requests.ipynb | 335 + .../0.9.1_notebooks/050-ds-get-results.ipynb | 255 + .../upgradability/0.9.1_notebooks/emails.json | 1 + .../upgradability/0.9.1_notebooks/jobs.json | 1 + .../upgradability/0.9.1_notebooks/users.json | 1 + .../1-dump-database-to-file.ipynb | 164 + .../2-migrate-for-scenarios.ipynb | 10061 ++++++++++++++++ 13 files changed, 14778 insertions(+) create mode 100644 notebooks/scenarios/bigquery/upgradability/0.9.1_notebooks/000-start-and-configure-server-and-admins.ipynb create mode 100644 notebooks/scenarios/bigquery/upgradability/0.9.1_notebooks/001-scale-delete-worker-pools.ipynb create mode 100644 notebooks/scenarios/bigquery/upgradability/0.9.1_notebooks/010-setup-bigquery-pool.ipynb create mode 100644 notebooks/scenarios/bigquery/upgradability/0.9.1_notebooks/011-users-emails-passwords.ipynb create mode 100644 notebooks/scenarios/bigquery/upgradability/0.9.1_notebooks/020-configure-api.ipynb create mode 100644 notebooks/scenarios/bigquery/upgradability/0.9.1_notebooks/021-create-jobs.ipynb create mode 100644 notebooks/scenarios/bigquery/upgradability/0.9.1_notebooks/040-do-review-requests.ipynb create mode 100644 notebooks/scenarios/bigquery/upgradability/0.9.1_notebooks/050-ds-get-results.ipynb create mode 100644 notebooks/scenarios/bigquery/upgradability/0.9.1_notebooks/emails.json create mode 100644 notebooks/scenarios/bigquery/upgradability/0.9.1_notebooks/jobs.json create mode 100644 notebooks/scenarios/bigquery/upgradability/0.9.1_notebooks/users.json create mode 100644 notebooks/scenarios/bigquery/upgradability/1-dump-database-to-file.ipynb create mode 100644 notebooks/scenarios/bigquery/upgradability/2-migrate-for-scenarios.ipynb diff --git a/notebooks/scenarios/bigquery/upgradability/0.9.1_notebooks/000-start-and-configure-server-and-admins.ipynb b/notebooks/scenarios/bigquery/upgradability/0.9.1_notebooks/000-start-and-configure-server-and-admins.ipynb new file mode 100644 index 00000000000..301c1037e38 --- /dev/null +++ b/notebooks/scenarios/bigquery/upgradability/0.9.1_notebooks/000-start-and-configure-server-and-admins.ipynb @@ -0,0 +1,1179 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "# # stdlib\n", + "# import os\n", + "\n", + "# os.environ[\"ORCHESTRA_DEPLOYMENT_TYPE\"] = \"remote\"\n", + "# os.environ[\"DEV_MODE\"] = \"True\"\n", + "# os.environ[\"TEST_EXTERNAL_REGISTRY\"] = \"k3d-registry.localhost:5800\"" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [], + "source": [ + "# isort: off\n", + "# stdlib\n", + "from os import environ as env\n", + "import os\n", + "import sys\n", + "\n", + "# syft absolute\n", + "import syft as sy\n", + "# from syft import get_helpers # noqa: F401\n", + "from syft.util.util import find_base_dir_with_tox_ini, get_caller_file_path, is_interpreter_jupyter\n", + "\n", + "\n", + "def add_helper_path_to_python_path() -> None:\n", + " current_path = \".\"\n", + "\n", + " # jupyter uses \".\" which resolves to the notebook\n", + " if not is_interpreter_jupyter():\n", + " # python uses the file which has from syft import test_settings in it\n", + " import_path = get_caller_file_path()\n", + " if import_path:\n", + " current_path = import_path\n", + "\n", + " base_dir = find_base_dir_with_tox_ini(current_path)\n", + " notebook_helper_path = os.path.join(base_dir, \"notebooks/notebook_helpers\")\n", + " sys.path.append(notebook_helper_path)\n", + "\n", + "add_helper_path_to_python_path()\n", + "\n", + "# third party\n", + "from email_helpers import get_email_server\n", + "# isort: on" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Launch & login" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [], + "source": [ + "# when in k8s these are the default values\n", + "ROOT_EMAIL = \"admin@bigquery.org\"\n", + "ROOT_PASSWORD = \"bqpw\"" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [], + "source": [ + "# in case we are not in k8s we set them here for orchestra to use\n", + "env[\"DEFAULT_ROOT_EMAIL\"] = ROOT_EMAIL\n", + "env[\"DEFAULT_ROOT_PASSWORD\"] = ROOT_PASSWORD" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Autoreload enabled\n", + "Starting bigquery-high server on 0.0.0.0:8080\n", + "Found `reset=True` in the launch configuration. Resetting the server...\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "INFO: Will watch for changes in these directories: ['/home/teo/OpenMined/PySyft/packages/syft/src/syft']\n", + "INFO: Uvicorn running on http://0.0.0.0:8080 (Press CTRL+C to quit)\n", + "INFO: Started reloader process [286781] using WatchFiles\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Waiting for server to start..WARN: private key is based on server name: bigquery-high in dev_mode. Don't run this in production.\n", + "Document Store's SQLite DB path: /tmp/syft/fbdf5a287e58454cbbd3fac4ad744d37/db/fbdf5a287e58454cbbd3fac4ad744d37.sqlite\n", + "Action Store's SQLite DB path: /tmp/syft/fbdf5a287e58454cbbd3fac4ad744d37/db/fbdf5a287e58454cbbd3fac4ad744d37.sqlite\n", + ".Adding producer for queue: api_call on: tcp://localhost:52153\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "INFO: Started server process [286795]\n", + "INFO: Waiting for application startup.\n", + "INFO: Application startup complete.\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + ". Done.\n" + ] + }, + { + "data": { + "text/html": [ + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "
SyftInfo:
You have launched a development server at http://0.0.0.0:8080.It is intended only for local use.

" + ], + "text/plain": [ + "SyftInfo: You have launched a development server at http://0.0.0.0:8080.It is intended only for local use." + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "server = sy.orchestra.launch(\n", + " name=\"bigquery-high\",\n", + " dev_mode=True,\n", + " server_side_type=\"high\",\n", + " reset=True,\n", + " port=\"8080\",\n", + " n_consumers=1, # How many workers to be spawned\n", + " create_producer=True, # Can produce more workers\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "> Starting SMTPTestServer on: 0.0.0.0:9025\n" + ] + } + ], + "source": [ + "email_server, smtp_server = get_email_server(reset=True)" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "> Starting SMTPTestServer on: 0.0.0.0:9025\n" + ] + } + ], + "source": [ + "root_client = sy.login(\n", + " url=\"http://localhost:8080\", email=ROOT_EMAIL, password=ROOT_PASSWORD\n", + ")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Create new admin client" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "ADMIN_EMAIL, ADMIN_PW = \"admin2@bigquery.org\", \"bqpw2\"" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# create\n", + "root_client.register(\n", + " name=\"second admin\", email=ADMIN_EMAIL, password=ADMIN_PW, password_verify=ADMIN_PW\n", + ")\n", + "# update role\n", + "new_user_id = root_client.users.search(email=ADMIN_EMAIL)[0].id\n", + "root_client.users.update(uid=new_user_id, role=\"admin\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# We cannot delete the root client" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "high_client = sy.login(\n", + " url=\"http://localhost:8080\", email=ADMIN_EMAIL, password=ADMIN_PW\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "root_admin_id = root_client.users.search(email=ROOT_EMAIL)[0].id" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "with sy.raises(sy.SyftException):\n", + " high_client.users.delete(root_admin_id)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Create ephemeral admin and delete it" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# register 2nd new admin (to delete)\n", + "user_email, user_pw = \"admin3@bigquery.org\", \"bqpw3\"\n", + "## create\n", + "root_client.register(\n", + " name=\"x\", email=user_email, password=user_pw, password_verify=user_pw\n", + ")\n", + "## update role\n", + "new_user_id2 = root_client.users.search(email=user_email)[0].id\n", + "root_client.users.update(uid=new_user_id, role=\"admin\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "root_client.users.delete(new_user_id2)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Cleanup" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "smtp_server.stop()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "server.land()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "syft_3.12", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.12.4" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/notebooks/scenarios/bigquery/upgradability/0.9.1_notebooks/001-scale-delete-worker-pools.ipynb b/notebooks/scenarios/bigquery/upgradability/0.9.1_notebooks/001-scale-delete-worker-pools.ipynb new file mode 100644 index 00000000000..9adb4ecb07a --- /dev/null +++ b/notebooks/scenarios/bigquery/upgradability/0.9.1_notebooks/001-scale-delete-worker-pools.ipynb @@ -0,0 +1,392 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": null, + "id": "0", + "metadata": {}, + "outputs": [], + "source": [ + "# import os\n", + "# os.environ[\"ORCHESTRA_DEPLOYMENT_TYPE\"] = \"remote\"\n", + "# os.environ[\"DEV_MODE\"] = \"True\"\n", + "# os.environ[\"TEST_EXTERNAL_REGISTRY\"] = \"k3d-registry.localhost:5800\"" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "1", + "metadata": {}, + "outputs": [], + "source": [ + "# isort: off\n", + "# stdlib\n", + "import os\n", + "import sys\n", + "\n", + "# syft absolute\n", + "import syft as sy\n", + "from syft.util.util import find_base_dir_with_tox_ini, get_caller_file_path, is_interpreter_jupyter\n", + "\n", + "\n", + "def add_helper_path_to_python_path() -> None:\n", + " current_path = \".\"\n", + "\n", + " # jupyter uses \".\" which resolves to the notebook\n", + " if not is_interpreter_jupyter():\n", + " # python uses the file which has from syft import test_settings in it\n", + " import_path = get_caller_file_path()\n", + " if import_path:\n", + " current_path = import_path\n", + "\n", + " base_dir = find_base_dir_with_tox_ini(current_path)\n", + " notebook_helper_path = os.path.join(base_dir, \"notebooks/notebook_helpers\")\n", + " sys.path.append(notebook_helper_path)\n", + "\n", + "add_helper_path_to_python_path()\n", + "\n", + "# third party\n", + "from email_helpers import Timeout\n", + "from email_helpers import get_email_server\n", + "# isort: on" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "2", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "3", + "metadata": {}, + "outputs": [], + "source": [ + "environment = os.environ.get(\"ORCHESTRA_DEPLOYMENT_TYPE\", \"python\")\n", + "\n", + "num_workers = int(os.environ.get(\"NUM_TEST_WORKERS\", 1))\n", + "\n", + "ROOT_EMAIL = \"admin@bigquery.org\"\n", + "ROOT_PASSWORD = \"bqpw\"\n", + "environment" + ] + }, + { + "cell_type": "markdown", + "id": "4", + "metadata": {}, + "source": [ + "### Launch server & login" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "5", + "metadata": {}, + "outputs": [], + "source": [ + "server = sy.orchestra.launch(\n", + " name=\"bigquery-high\",\n", + " dev_mode=True,\n", + " server_side_type=\"high\",\n", + " port=\"8080\",\n", + " n_consumers=num_workers, # How many workers to be spawned\n", + " create_producer=True, # Can produce more workers\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "6", + "metadata": {}, + "outputs": [], + "source": [ + "email_server, smtp_server = get_email_server(reset=True)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "7", + "metadata": {}, + "outputs": [], + "source": [ + "high_client = sy.login(\n", + " url=\"http://localhost:8080\", email=ROOT_EMAIL, password=ROOT_PASSWORD\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "8", + "metadata": {}, + "outputs": [], + "source": [ + "high_client.worker_pools" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "9", + "metadata": {}, + "outputs": [], + "source": [ + "default_worker_pool = high_client.worker_pools.get_by_name(\"default-pool\")\n", + "default_worker_pool" + ] + }, + { + "cell_type": "markdown", + "id": "10", + "metadata": {}, + "source": [ + "### Scale Worker pool" + ] + }, + { + "cell_type": "markdown", + "id": "11", + "metadata": {}, + "source": [ + "##### Scale up" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "12", + "metadata": {}, + "outputs": [], + "source": [ + "# Scale to 1\n", + "if environment == \"remote\":\n", + " high_client.api.worker_pool.scale(\n", + " number=num_workers, pool_name=default_worker_pool.name\n", + " )" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "13", + "metadata": {}, + "outputs": [], + "source": [ + "high_client.api.services.worker_pool[0]" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "14", + "metadata": {}, + "outputs": [], + "source": [ + "# Scale up workers\n", + "if environment == \"remote\":\n", + " scale_up_result = high_client.api.worker_pool.scale(\n", + " number=5, pool_name=default_worker_pool.name\n", + " )\n", + " if environment == \"remote\":\n", + " assert scale_up_result, scale_up_result\n", + "\n", + " assert (\n", + " high_client.api.services.worker_pool[default_worker_pool.name].max_count\n", + " == 5\n", + " )" + ] + }, + { + "cell_type": "markdown", + "id": "15", + "metadata": {}, + "source": [ + "##### Scale down" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "16", + "metadata": {}, + "outputs": [], + "source": [ + "# Scale down workers, this gracefully shutdowns the consumers\n", + "if environment == \"remote\":\n", + " scale_down_result = high_client.api.worker_pool.scale(\n", + " number=num_workers, pool_name=default_worker_pool.name\n", + " )\n", + " assert scale_down_result, scale_down_result" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "17", + "metadata": {}, + "outputs": [], + "source": [ + "if environment == \"remote\":\n", + "\n", + " def has_worker_scaled_down():\n", + " return (\n", + " high_client.api.worker_pool[default_worker_pool.name].max_count\n", + " == num_workers\n", + " )\n", + "\n", + " worker_scale_timeout = Timeout(timeout_duration=20)\n", + " worker_scale_timeout.run_with_timeout(has_worker_scaled_down)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "18", + "metadata": {}, + "outputs": [], + "source": [ + "if environment == \"remote\":\n", + " assert (\n", + " high_client.api.services.worker_pool[default_worker_pool.name].max_count\n", + " == num_workers\n", + " )" + ] + }, + { + "cell_type": "markdown", + "id": "19", + "metadata": {}, + "source": [ + "#### Delete Worker Pool" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "20", + "metadata": {}, + "outputs": [], + "source": [ + "pool_delete_result = high_client.api.services.worker_pool.delete(\n", + " pool_name=default_worker_pool.name\n", + ")\n", + "pool_delete_result" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "21", + "metadata": {}, + "outputs": [], + "source": [ + "with sy.raises(KeyError):\n", + " _ = high_client.api.services.worker_pool[default_worker_pool.name]" + ] + }, + { + "cell_type": "markdown", + "id": "22", + "metadata": {}, + "source": [ + "#### Re-launch the default worker pool" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "23", + "metadata": {}, + "outputs": [], + "source": [ + "default_worker_image = default_worker_pool.image" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "24", + "metadata": {}, + "outputs": [], + "source": [ + "launch_result = high_client.api.services.worker_pool.launch(\n", + " pool_name=default_worker_pool.name,\n", + " image_uid=default_worker_image.id,\n", + " num_workers=num_workers,\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "25", + "metadata": {}, + "outputs": [], + "source": [ + "assert high_client.api.services.worker_pool[default_worker_pool.name]\n", + "assert (\n", + " high_client.api.services.worker_pool[default_worker_pool.name].max_count\n", + " == num_workers\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "26", + "metadata": {}, + "outputs": [], + "source": [ + "smtp_server.stop()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "27", + "metadata": {}, + "outputs": [], + "source": [ + "server.land()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "28", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "syft", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.12.3" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/notebooks/scenarios/bigquery/upgradability/0.9.1_notebooks/010-setup-bigquery-pool.ipynb b/notebooks/scenarios/bigquery/upgradability/0.9.1_notebooks/010-setup-bigquery-pool.ipynb new file mode 100644 index 00000000000..dd41acbecdb --- /dev/null +++ b/notebooks/scenarios/bigquery/upgradability/0.9.1_notebooks/010-setup-bigquery-pool.ipynb @@ -0,0 +1,562 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# import os\n", + "# os.environ[\"ORCHESTRA_DEPLOYMENT_TYPE\"] = \"remote\"\n", + "# os.environ[\"DEV_MODE\"] = \"True\"\n", + "# os.environ[\"TEST_EXTERNAL_REGISTRY\"] = \"k3d-registry.localhost:5800\"" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# isort: off\n", + "# stdlib\n", + "import os\n", + "import sys\n", + "\n", + "# syft absolute\n", + "import syft as sy\n", + "from syft.util.util import find_base_dir_with_tox_ini, get_caller_file_path, is_interpreter_jupyter\n", + "\n", + "\n", + "def add_helper_path_to_python_path() -> None:\n", + " current_path = \".\"\n", + "\n", + " # jupyter uses \".\" which resolves to the notebook\n", + " if not is_interpreter_jupyter():\n", + " # python uses the file which has from syft import test_settings in it\n", + " import_path = get_caller_file_path()\n", + " if import_path:\n", + " current_path = import_path\n", + "\n", + " base_dir = find_base_dir_with_tox_ini(current_path)\n", + " notebook_helper_path = os.path.join(base_dir, \"notebooks/notebook_helpers\")\n", + " sys.path.append(notebook_helper_path)\n", + "\n", + "add_helper_path_to_python_path()\n", + "from syft import test_settings\n", + "\n", + "# third party\n", + "from email_helpers import get_email_server\n", + "# isort: on" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "environment = os.environ.get(\"ORCHESTRA_DEPLOYMENT_TYPE\", \"python\")\n", + "environment" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Launch & login" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "server = sy.orchestra.launch(\n", + " name=\"bigquery-high\",\n", + " dev_mode=True,\n", + " server_side_type=\"high\",\n", + " port=\"8080\",\n", + " n_consumers=1, # How many workers to be spawned\n", + " create_producer=True, # Can produce more workers\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "_, smtp_server = get_email_server(reset=True)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "ADMIN_EMAIL, ADMIN_PW = \"admin2@bigquery.org\", \"bqpw2\"\n", + "high_client = sy.login(\n", + " url=\"http://localhost:8080\", email=ADMIN_EMAIL, password=ADMIN_PW\n", + ")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Submit images and build pools" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Add registry" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "high_client.worker_pools" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "assert len(high_client.worker_pools.get_all()) == 1" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "external_registry = test_settings.get(\"external_registry\", default=\"docker.io\")\n", + "external_registry" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "result = high_client.api.services.image_registry.add(external_registry)\n", + "result" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "image_registry_list = high_client.api.services.image_registry.get_all()\n", + "image_registry_list" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "local_registry = image_registry_list[0]\n", + "local_registry" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Upload Image" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "dockerfile_list = high_client.images.get_all()\n", + "dockerfile_list" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "base_worker_image = next(\n", + " (\n", + " image\n", + " for image in dockerfile_list\n", + " if image.is_prebuilt and \"syft-backend\" in str(image.config)\n", + " ),\n", + " None,\n", + ")\n", + "base_worker_image" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "base_worker_image.image_identifier" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "worker_dockerfile = f\"\"\"\n", + "FROM {str(base_worker_image.image_identifier)}\n", + "\n", + "RUN uv pip install db-dtypes google-cloud-bigquery\n", + "\n", + "\"\"\".strip()\n", + "worker_dockerfile" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "docker_config = sy.DockerWorkerConfig(dockerfile=worker_dockerfile)\n", + "assert docker_config.dockerfile == worker_dockerfile" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "submit_result = high_client.api.services.worker_image.submit(\n", + " worker_config=docker_config\n", + ")\n", + "submit_result" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "dockerfile_list = high_client.images.get_all()\n", + "dockerfile_list" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "worker_image = next(\n", + " (\n", + " image\n", + " for image in dockerfile_list\n", + " if not image.is_prebuilt and image.config.dockerfile == worker_dockerfile\n", + " ),\n", + " None,\n", + ")\n", + "worker_image" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "print(worker_image.config.dockerfile)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# worker_docker_tag = f\"openmined/bigquery:{sy.__version__}\"\n", + "# worker_docker_tag" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Build image" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "docker_tag = str(base_worker_image.image_identifier).replace(\n", + " \"backend\", \"worker-bigquery\"\n", + ")\n", + "docker_tag" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "if environment == \"remote\":\n", + " docker_build_result = high_client.api.services.worker_image.build(\n", + " image_uid=worker_image.id,\n", + " tag=docker_tag,\n", + " registry_uid=local_registry.id,\n", + " )\n", + " print(docker_build_result)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "if environment == \"remote\":\n", + " push_result = high_client.api.services.worker_image.push(worker_image.id)\n", + " print(push_result)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "dockerfile_list = high_client.images.get_all()\n", + "dockerfile_list" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "docker_config = sy.PrebuiltWorkerConfig(tag=docker_tag)\n", + "docker_config" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# overwrite it for now Mongo ignore\n", + "result = high_client.api.services.worker_image.submit(worker_config=docker_config)\n", + "result" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "dockerfile_list = high_client.images.get_all()\n", + "dockerfile_list" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# TODO: fix\n", + "# something is wrong here, sometimes it has the non prebuilt one\n", + "# other times it only has the one we built; in python there are multiple\n", + "# for now lets just use which ever one has worker-bigquery in its\n", + "# identifier so we can create a k8s worker pool" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "worker_image = next(\n", + " (\n", + " image\n", + " for image in dockerfile_list\n", + " if \"worker-bigquery\" in str(image.image_identifier)\n", + " ),\n", + " None,\n", + ")\n", + "worker_image" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "assert worker_image" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "worker_pool_name = \"bigquery-pool\"\n", + "custom_pool_pod_annotations = {\"bigquery-custom-pool\": \"Pod annotation for bigquery\"}\n", + "custom_pool_pod_labels = {\"bigquery-custom-pool\": \"Pod_label_for_bigquery\"}\n", + "\n", + "num_workers = int(os.environ.get(\"NUM_TEST_WORKERS\", 1))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Launch pool" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "result = high_client.api.services.worker_pool.launch(\n", + " pool_name=worker_pool_name,\n", + " image_uid=worker_image.id,\n", + " num_workers=1,\n", + " pod_annotations=custom_pool_pod_annotations,\n", + " pod_labels=custom_pool_pod_labels,\n", + ")\n", + "result" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Scale pool" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "if environment == \"remote\":\n", + " result = high_client.worker_pools.scale(\n", + " number=num_workers, pool_name=worker_pool_name\n", + " )\n", + " print(result)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "assert len(high_client.worker_pools.get_all()) == 2" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "high_client.settings.allow_guest_signup(enable=False)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "assert len(high_client.api.services.user.get_all()) == 2" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Cleanup" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "smtp_server.stop()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "server.land()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.12.5" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/notebooks/scenarios/bigquery/upgradability/0.9.1_notebooks/011-users-emails-passwords.ipynb b/notebooks/scenarios/bigquery/upgradability/0.9.1_notebooks/011-users-emails-passwords.ipynb new file mode 100644 index 00000000000..2366d435149 --- /dev/null +++ b/notebooks/scenarios/bigquery/upgradability/0.9.1_notebooks/011-users-emails-passwords.ipynb @@ -0,0 +1,672 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": null, + "id": "0", + "metadata": {}, + "outputs": [], + "source": [ + "# import os\n", + "# os.environ[\"ORCHESTRA_DEPLOYMENT_TYPE\"] = \"remote\"\n", + "# os.environ[\"DEV_MODE\"] = \"True\"\n", + "# os.environ[\"TEST_EXTERNAL_REGISTRY\"] = \"k3d-registry.localhost:5800\"\n", + "# # !pip install aiosmtpd\n", + "# # !uv pip install aiosmtpd" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "1", + "metadata": {}, + "outputs": [], + "source": [ + "# isort: off\n", + "# stdlib\n", + "import os\n", + "\n", + "import sys\n", + "# syft absolute\n", + "import syft as sy\n", + "from syft.util.util import find_base_dir_with_tox_ini, get_caller_file_path, is_interpreter_jupyter\n", + "\n", + "\n", + "def add_helper_path_to_python_path() -> None:\n", + " current_path = \".\"\n", + "\n", + " # jupyter uses \".\" which resolves to the notebook\n", + " if not is_interpreter_jupyter():\n", + " # python uses the file which has from syft import test_settings in it\n", + " import_path = get_caller_file_path()\n", + " if import_path:\n", + " current_path = import_path\n", + "\n", + " base_dir = find_base_dir_with_tox_ini(current_path)\n", + " notebook_helper_path = os.path.join(base_dir, \"notebooks/notebook_helpers\")\n", + " sys.path.append(notebook_helper_path)\n", + "\n", + "add_helper_path_to_python_path()\n", + "# third party\n", + "from email_helpers import SENDER\n", + "from email_helpers import create_user\n", + "from email_helpers import get_email_server\n", + "from email_helpers import make_user\n", + "from email_helpers import save_users\n", + "# isort: on" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "2", + "metadata": {}, + "outputs": [], + "source": [ + "ADMIN_EMAIL, ADMIN_PW = \"admin2@bigquery.org\", \"bqpw2\"\n", + "\n", + "environment = os.environ.get(\"ORCHESTRA_DEPLOYMENT_TYPE\", \"python\")\n", + "environment" + ] + }, + { + "cell_type": "markdown", + "id": "3", + "metadata": {}, + "source": [ + "# Launch server & login" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "4", + "metadata": {}, + "outputs": [], + "source": [ + "server = sy.orchestra.launch(\n", + " name=\"bigquery-high\",\n", + " dev_mode=True,\n", + " server_side_type=\"high\",\n", + " port=\"8080\",\n", + " n_consumers=1, # How many workers to be spawned\n", + " create_producer=True, # Can produce more workers\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "5", + "metadata": {}, + "outputs": [], + "source": [ + "email_server, smtp_server = get_email_server()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "6", + "metadata": {}, + "outputs": [], + "source": [ + "high_client = sy.login(\n", + " url=\"http://localhost:8080\", email=ADMIN_EMAIL, password=ADMIN_PW\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "7", + "metadata": {}, + "outputs": [], + "source": [ + "high_client.users" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "8", + "metadata": {}, + "outputs": [], + "source": [ + "# TODO: this should show SyftSuccess?\n", + "high_client.api.services.settings.enable_notifications(\n", + " email_sender=SENDER,\n", + " email_server=\"localhost\",\n", + " email_port=\"9025\",\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "9", + "metadata": {}, + "outputs": [], + "source": [ + "# # TODO: this should show SyftSuccess?\n", + "# high_client.api.services.settings.disable_notifications()" + ] + }, + { + "cell_type": "markdown", + "id": "10", + "metadata": {}, + "source": [ + "# Register users" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "11", + "metadata": {}, + "outputs": [], + "source": [ + "num_users = int(os.environ.get(\"NUM_TEST_USERS\", 5))\n", + "print(f\"registering {num_users} users\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "12", + "metadata": {}, + "outputs": [], + "source": [ + "users = []\n", + "email_disable_index = 0\n", + "reset_password_index = 1\n", + "for i in range(num_users):\n", + " user = make_user()\n", + " user._email_server = email_server\n", + " create_user(high_client, user)\n", + " user.client = high_client\n", + " if email_disable_index == i:\n", + " user.email_disabled = True\n", + " if reset_password_index == i:\n", + " user.reset_password = True\n", + " users.append(user)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "13", + "metadata": {}, + "outputs": [], + "source": [ + "save_users(users)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "14", + "metadata": {}, + "outputs": [], + "source": [ + "# stdlib\n", + "import asyncio\n", + "\n", + "await asyncio.sleep(5)" + ] + }, + { + "cell_type": "markdown", + "id": "15", + "metadata": {}, + "source": [ + "## Verify Emails are sent" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "16", + "metadata": {}, + "outputs": [], + "source": [ + "# everyone gets a welcome email\n", + "server_name = high_client.name\n", + "for user in users:\n", + " emails = user.emails\n", + " assert len(emails) == 1\n", + " welcome_email = user.emails[0]\n", + " assert welcome_email.email_from == SENDER\n", + " assert len(welcome_email.email_to) == 1\n", + " assert welcome_email.email_to[0] == user.email\n", + " assert f\"Welcome to {server_name}\" in welcome_email.email_content" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "17", + "metadata": {}, + "outputs": [], + "source": [ + "# one user disables notifications\n", + "# one user requests a password reset\n", + "no_email_user = None\n", + "reset_password_user = None\n", + "for user in users:\n", + " user.client = high_client # get user client\n", + " if user.email_disabled:\n", + " no_email_user = user\n", + " # disable for this user only\n", + " user.client.api.notifications.deactivate()\n", + "\n", + " if user.reset_password:\n", + " # ask admin for forgot password flow\n", + " user.client.guest().forgot_password(email=user.email)\n", + " assert \"Password Reset Requested\" in user.emails[1].email_content\n", + " reset_password_user = user" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "18", + "metadata": {}, + "outputs": [], + "source": [ + "ds0 = users[0]" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "19", + "metadata": {}, + "outputs": [], + "source": [ + "ds0_user = ds0.client.account\n", + "ds0_user" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "20", + "metadata": {}, + "outputs": [], + "source": [ + "# with sy.raises(\n", + "# sy.SyftException(public_message=\"*tried to update user*\"\n", + "# ), show=True): this is different on k8s no idea why\n", + "with sy.raises(sy.SyftException, show=True):\n", + " ds0.client.users.update(uid=ds0_user.id, role=\"admin\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "21", + "metadata": {}, + "outputs": [], + "source": [ + "# with sy.raises(sy.SyftException(public_message=\"*tried to update user*\"), show=True):\n", + "with sy.raises(sy.SyftException, show=True):\n", + " ds0_user.update(role=\"admin\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "22", + "metadata": {}, + "outputs": [], + "source": [ + "# TODO: test disabling and re-enabling all notifications" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "23", + "metadata": {}, + "outputs": [], + "source": [ + "# high_client.api.services.settings.disable_notifications()\n", + "# high_client.api.services.settings.enable_notifications()" + ] + }, + { + "cell_type": "markdown", + "id": "24", + "metadata": {}, + "source": [ + "## Test reset password" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "25", + "metadata": {}, + "outputs": [], + "source": [ + "# This is necessary as it sets the new token value in user.reset_token\n", + "token = reset_password_user.get_token()\n", + "token" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "26", + "metadata": {}, + "outputs": [], + "source": [ + "# This is necessary as it sets the new password value in user.new_password\n", + "passw = reset_password_user.make_new_password()\n", + "passw" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "27", + "metadata": {}, + "outputs": [], + "source": [ + "assert token\n", + "assert passw" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "28", + "metadata": {}, + "outputs": [], + "source": [ + "output = reset_password_user.client.guest().reset_password(\n", + " token=reset_password_user.reset_token, new_password=reset_password_user.new_password\n", + ")\n", + "output" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "29", + "metadata": {}, + "outputs": [], + "source": [ + "assert isinstance(output, sy.SyftSuccess)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "30", + "metadata": {}, + "outputs": [], + "source": [ + "# relogin\n", + "reset_password_user.relogin()\n", + "# reset_password_user.client = reset_password_user.client" + ] + }, + { + "cell_type": "markdown", + "id": "31", + "metadata": {}, + "source": [ + "## Reset password second time" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "32", + "metadata": {}, + "outputs": [], + "source": [ + "reset_password_user.client.guest().forgot_password(email=reset_password_user.email)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "33", + "metadata": {}, + "outputs": [], + "source": [ + "output = reset_password_user.client.guest().reset_password(\n", + " token=reset_password_user.get_token(),\n", + " new_password=reset_password_user.make_new_password(),\n", + ")\n", + "output" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "34", + "metadata": {}, + "outputs": [], + "source": [ + "assert isinstance(output, sy.SyftSuccess)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "35", + "metadata": {}, + "outputs": [], + "source": [ + "# print(f\"token:\\t\\t {reset_password_user.reset_token}\\n\\\n", + "# password:\\t {reset_password_user.password}\\n\\\n", + "# new password:\\t {reset_password_user.new_password}\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "36", + "metadata": {}, + "outputs": [], + "source": [ + "reset_password_user.update_password()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "37", + "metadata": {}, + "outputs": [], + "source": [ + "# print(f\"token:\\t\\t {reset_password_user.reset_token}\\n\\\n", + "# password:\\t {reset_password_user.password}\\n\\\n", + "# new password:\\t {reset_password_user.new_password}\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "38", + "metadata": {}, + "outputs": [], + "source": [ + "# relogin\n", + "reset_password_user.relogin()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "39", + "metadata": {}, + "outputs": [], + "source": [ + "save_users(users)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "40", + "metadata": {}, + "outputs": [], + "source": [ + "reset_password_user" + ] + }, + { + "cell_type": "markdown", + "id": "41", + "metadata": {}, + "source": [ + "## Reduce token expiration and try resetting" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "42", + "metadata": {}, + "outputs": [], + "source": [ + "# Variable is poorly named, token expiration time is in seconds and not minutes\n", + "high_client.api.services.settings.update(pwd_token_config={\"token_exp_min\": 3})\n", + "high_client.refresh()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "43", + "metadata": {}, + "outputs": [], + "source": [ + "reset_password_user.client.guest().forgot_password(email=reset_password_user.email)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "44", + "metadata": {}, + "outputs": [], + "source": [ + "# Wait 3 seconds to ensure token expires\n", + "await asyncio.sleep(3)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "45", + "metadata": {}, + "outputs": [], + "source": [ + "# This should throw a SyftError because we waited too long\n", + "output = reset_password_user.client.guest().reset_password(\n", + " token=reset_password_user.get_token(),\n", + " new_password=reset_password_user.make_new_password(),\n", + ")\n", + "output" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "46", + "metadata": {}, + "outputs": [], + "source": [ + "# assert isinstance(output, sy.SyftError)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "47", + "metadata": {}, + "outputs": [], + "source": [ + "# # relogin\n", + "# with sy.raises(sy.SyftException, show=True):\n", + "# reset_password_user.relogin()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "48", + "metadata": {}, + "outputs": [], + "source": [ + "# Set things back to the the default settings\n", + "high_client.api.services.settings.update(pwd_token_config={\"token_exp_min\": 1800})\n", + "high_client.refresh()" + ] + }, + { + "cell_type": "markdown", + "id": "49", + "metadata": {}, + "source": [ + "# Cleanup" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "50", + "metadata": {}, + "outputs": [], + "source": [ + "smtp_server.stop()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "51", + "metadata": {}, + "outputs": [], + "source": [ + "server.land()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "52", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "syft_3.12", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.12.4" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/notebooks/scenarios/bigquery/upgradability/0.9.1_notebooks/020-configure-api.ipynb b/notebooks/scenarios/bigquery/upgradability/0.9.1_notebooks/020-configure-api.ipynb new file mode 100644 index 00000000000..db010007240 --- /dev/null +++ b/notebooks/scenarios/bigquery/upgradability/0.9.1_notebooks/020-configure-api.ipynb @@ -0,0 +1,656 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# import os\n", + "# os.environ[\"ORCHESTRA_DEPLOYMENT_TYPE\"] = \"remote\"\n", + "# os.environ[\"DEV_MODE\"] = \"True\"\n", + "# os.environ[\"TEST_EXTERNAL_REGISTRY\"] = \"k3d-registry.localhost:5800\"" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# set to use the live APIs\n", + "# os.environ[\"TEST_BIGQUERY_APIS_LIVE\"] = \"True\"" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# isort: off\n", + "# stdlib\n", + "import os\n", + "import sys\n", + "\n", + "# syft absolute\n", + "import syft as sy\n", + "from syft.util.util import find_base_dir_with_tox_ini, get_caller_file_path, is_interpreter_jupyter\n", + "\n", + "\n", + "def add_helper_path_to_python_path() -> None:\n", + " current_path = \".\"\n", + "\n", + " # jupyter uses \".\" which resolves to the notebook\n", + " if not is_interpreter_jupyter():\n", + " # python uses the file which has from syft import test_settings in it\n", + " import_path = get_caller_file_path()\n", + " if import_path:\n", + " current_path = import_path\n", + "\n", + " base_dir = find_base_dir_with_tox_ini(current_path)\n", + " notebook_helper_path = os.path.join(base_dir, \"notebooks/notebook_helpers\")\n", + " sys.path.append(notebook_helper_path)\n", + "\n", + "add_helper_path_to_python_path()\n", + "from syft import test_settings\n", + "\n", + "# third party\n", + "from apis import make_schema\n", + "from apis import make_submit_query\n", + "from apis import make_test_query\n", + "\n", + "# run email server\n", + "from email_helpers import get_email_server\n", + "# isort: on" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "ADMIN_EMAIL, ADMIN_PW = \"admin2@bigquery.org\", \"bqpw2\"" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Launch server & login" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "server = sy.orchestra.launch(\n", + " name=\"bigquery-high\",\n", + " dev_mode=True,\n", + " server_side_type=\"high\",\n", + " port=\"8080\",\n", + " n_consumers=1, # How many workers to be spawned\n", + " create_producer=True, # Can produce more workers\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "email_server, smtp_server = get_email_server()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "high_client = sy.login(\n", + " url=\"http://localhost:8080\", email=ADMIN_EMAIL, password=ADMIN_PW\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "this_worker_pool_name = \"bigquery-pool\"" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "assert len(high_client.worker_pools.get_all()) == 2" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Create `test_query` endpoint" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# !pip list | grep bigquery" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# !uv pip install db-dtypes google-cloud-bigquery" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Look up the worker pools and identify the name of the one that has the required packages\n", + "# After, bind the endpoint to that workerpool\n", + "high_client.worker_pools" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "mock_func = make_test_query(\n", + " settings={\n", + " \"rate_limiter_enabled\": True,\n", + " \"calls_per_min\": 10,\n", + " }\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "private_func = make_test_query(\n", + " settings={\n", + " \"rate_limiter_enabled\": False,\n", + " }\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "new_endpoint = sy.TwinAPIEndpoint(\n", + " path=\"bigquery.test_query\",\n", + " description=\"This endpoint allows to query Bigquery storage via SQL queries.\",\n", + " private_function=private_func,\n", + " mock_function=mock_func,\n", + " worker_pool=this_worker_pool_name,\n", + ")\n", + "\n", + "high_client.custom_api.add(endpoint=new_endpoint)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Update `test_query` endpoint" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Here, we update the endpoint to timeout after 100s (rather the default of 60s)\n", + "high_client.api.services.api.update(\n", + " endpoint_path=\"bigquery.test_query\", endpoint_timeout=120\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "high_client.api.services.api.update(\n", + " endpoint_path=\"bigquery.test_query\", hide_mock_definition=True\n", + ")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Test `test_query` endpoint" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "dataset_1 = test_settings.get(\"dataset_1\", default=\"dataset_1\")\n", + "dataset_2 = test_settings.get(\"dataset_2\", default=\"dataset_2\")\n", + "table_1 = test_settings.get(\"table_1\", default=\"table_1\")\n", + "table_2 = test_settings.get(\"table_2\", default=\"table_2\")\n", + "table_2_col_id = test_settings.get(\"table_2_col_id\", default=\"table_id\")\n", + "table_2_col_score = test_settings.get(\"table_2_col_score\", default=\"colname\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Test mock version\n", + "result = high_client.api.services.bigquery.test_query.mock(\n", + " sql_query=f\"SELECT * FROM {dataset_1}.{table_1} LIMIT 10\"\n", + ")\n", + "result" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "assert len(result) == 10" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Test private version\n", + "result = high_client.api.services.bigquery.test_query.private(\n", + " sql_query=f\"SELECT * FROM {dataset_1}.{table_1} LIMIT 10\"\n", + ")\n", + "result" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "assert len(result) == 10" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Test mock version for wrong queries\n", + "with sy.raises(\n", + " sy.SyftException(public_message=\"*must be qualified with a dataset*\"), show=True\n", + "):\n", + " _ = high_client.api.services.bigquery.test_query.mock(\n", + " sql_query=\"SELECT * FROM invalid_table LIMIT 1\"\n", + " )" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Test private version\n", + "result = high_client.api.services.bigquery.test_query.private(\n", + " sql_query=f\"SELECT * FROM {dataset_1}.{table_1} LIMIT 1\"\n", + ")\n", + "result" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "assert len(result) == 1" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Inspect endpoint state" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Inspect the context state on an endpoint\n", + "state = high_client.api.services.bigquery.test_query.mock.context.state\n", + "state" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "len(state[ADMIN_EMAIL])" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "assert len(state[ADMIN_EMAIL]) >= 2" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Create `schema` endpoint" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "schema_function = make_schema(\n", + " settings={\n", + " \"calls_per_min\": 5,\n", + " },\n", + " worker_pool=this_worker_pool_name,\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "high_client.custom_api.add(endpoint=schema_function)\n", + "high_client.refresh()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Test `schema` endpoint" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Testing schema\n", + "result = high_client.api.services.bigquery.schema()\n", + "result" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "assert len(result) == 23" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Create `submit_query` endpoint" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "submit_query_function = make_submit_query(\n", + " settings={}, worker_pool=this_worker_pool_name\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "high_client.custom_api.add(endpoint=submit_query_function)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "high_client.api.services.api.update(\n", + " endpoint_path=\"bigquery.submit_query\", hide_mock_definition=True\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "high_client.custom_api.api_endpoints()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "assert len(high_client.custom_api.api_endpoints()) == 3" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "high_client.api.services.bigquery.test_query" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "high_client.api.services.bigquery.submit_query" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Test `submit_query` endpoint" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Testing submit query\n", + "result = high_client.api.services.bigquery.submit_query(\n", + " func_name=\"my_func\",\n", + " query=f\"SELECT * FROM {dataset_1}.{table_1} LIMIT 1\",\n", + ")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Test emails" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# assert (\n", + "# \"Job Failed\"\n", + "# in email_server.get_emails_for_user(user_email=ADMIN_EMAIL)[0].email_content\n", + "# )" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# email_server.get_emails_for_user(user_email=\"admin@bigquery.org\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# TODO: change this to be all admins or configure which ones etc" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# assert len(email_server.get_emails_for_user(user_email=\"admin@bigquery.org\")) > 0" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# result" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# assert \"Query submitted\" in result" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Cleanup" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "smtp_server.stop()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "server.land()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.12.5" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/notebooks/scenarios/bigquery/upgradability/0.9.1_notebooks/021-create-jobs.ipynb b/notebooks/scenarios/bigquery/upgradability/0.9.1_notebooks/021-create-jobs.ipynb new file mode 100644 index 00000000000..6228874bbb5 --- /dev/null +++ b/notebooks/scenarios/bigquery/upgradability/0.9.1_notebooks/021-create-jobs.ipynb @@ -0,0 +1,499 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": null, + "id": "0", + "metadata": {}, + "outputs": [], + "source": [ + "# stdlib\n", + "# import os\n", + "\n", + "# os.environ[\"ORCHESTRA_DEPLOYMENT_TYPE\"] = \"remote\"\n", + "# os.environ[\"DEV_MODE\"] = \"True\"\n", + "# os.environ[\"TEST_EXTERNAL_REGISTRY\"] = \"k3d-registry.localhost:5800\"" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "1", + "metadata": {}, + "outputs": [], + "source": [ + "# use_live_bigquery = False\n", + "# os.environ[\"TEST_BIGQUERY_APIS_LIVE\"] = str(use_live_bigquery)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "2", + "metadata": {}, + "outputs": [], + "source": [ + "# isort: off\n", + "# stdlib\n", + "from collections import Counter\n", + "\n", + "import os\n", + "import sys\n", + "# syft absolute\n", + "import syft as sy\n", + "from syft.util.util import find_base_dir_with_tox_ini, get_caller_file_path, is_interpreter_jupyter\n", + "\n", + "\n", + "def add_helper_path_to_python_path() -> None:\n", + " current_path = \".\"\n", + "\n", + " # jupyter uses \".\" which resolves to the notebook\n", + " if not is_interpreter_jupyter():\n", + " # python uses the file which has from syft import test_settings in it\n", + " import_path = get_caller_file_path()\n", + " if import_path:\n", + " current_path = import_path\n", + "\n", + " base_dir = find_base_dir_with_tox_ini(current_path)\n", + " notebook_helper_path = os.path.join(base_dir, \"notebooks/notebook_helpers\")\n", + " sys.path.append(notebook_helper_path)\n", + "\n", + "add_helper_path_to_python_path()\n", + "from syft.service.job.job_stash import JobStatus\n", + "\n", + "# third party\n", + "from email_helpers import get_email_server\n", + "# isort: on" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "3", + "metadata": {}, + "outputs": [], + "source": [ + "environment = os.environ.get(\"ORCHESTRA_DEPLOYMENT_TYPE\", \"python\")\n", + "environment" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "4", + "metadata": {}, + "outputs": [], + "source": [ + "SERVER_PORT = \"8080\"\n", + "SERVER_URL = f\"http://localhost:{SERVER_PORT}\"\n", + "ADMIN_EMAIL, ADMIN_PW = \"admin2@bigquery.org\", \"bqpw2\"" + ] + }, + { + "cell_type": "markdown", + "id": "5", + "metadata": {}, + "source": [ + "# Launch server & login" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "6", + "metadata": {}, + "outputs": [], + "source": [ + "server = sy.orchestra.launch(\n", + " name=\"bigquery-high\",\n", + " dev_mode=True,\n", + " server_side_type=\"high\",\n", + " port=SERVER_PORT,\n", + " n_consumers=4, # How many workers to be spawned\n", + " create_producer=True, # Can produce more workers\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "7", + "metadata": {}, + "outputs": [], + "source": [ + "email_server, smtp_server = get_email_server(reset=True)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "8", + "metadata": {}, + "outputs": [], + "source": [ + "high_client = sy.login(\n", + " url=\"http://localhost:8080\", email=ADMIN_EMAIL, password=ADMIN_PW\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "9", + "metadata": {}, + "outputs": [], + "source": [ + "# third party\n", + "from email_helpers import load_users" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "10", + "metadata": {}, + "outputs": [], + "source": [ + "users = load_users(high_client)" + ] + }, + { + "cell_type": "markdown", + "id": "11", + "metadata": {}, + "source": [ + "# Create jobs" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "12", + "metadata": {}, + "outputs": [], + "source": [ + "# third party\n", + "from job_helpers import TestJob\n", + "from job_helpers import create_jobs\n", + "from job_helpers import extract_code_path" + ] + }, + { + "cell_type": "markdown", + "id": "13", + "metadata": {}, + "source": [ + "# Inspect job data (requests for these jobs to be created)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "14", + "metadata": {}, + "outputs": [], + "source": [ + "num_jobs = int(os.environ.get(\"NUM_TEST_JOBS\", 10))\n", + "\n", + "jobs_data = create_jobs(users, total_jobs=num_jobs)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "15", + "metadata": {}, + "outputs": [], + "source": [ + "counts = Counter([j.job_type for j in jobs_data])\n", + "for k, v in counts.most_common():\n", + " print(f\"{k}: #{v}\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "16", + "metadata": {}, + "outputs": [], + "source": [ + "# third party\n", + "from job_helpers import save_jobs" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "17", + "metadata": {}, + "outputs": [], + "source": [ + "print(f\"{len(jobs_data)=}\")\n", + "\n", + "for job in jobs_data:\n", + " print(f\"{job.job_type=}, {job.should_succeed=}, {job.should_submit=}\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "18", + "metadata": {}, + "outputs": [], + "source": [ + "assert len(jobs_data) == num_jobs\n", + "assert all(isinstance(j, TestJob) for j in jobs_data)\n", + "assert all(job.client is not None for job in jobs_data)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "19", + "metadata": {}, + "outputs": [], + "source": [ + "save_jobs(jobs_data)" + ] + }, + { + "cell_type": "markdown", + "id": "20", + "metadata": {}, + "source": [ + "# Submit jobs\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "21", + "metadata": {}, + "outputs": [], + "source": [ + "admin_emails_before = len(email_server.get_emails_for_user(\"admin@bigquery.org\"))\n", + "print(f\"{admin_emails_before=}\")" + ] + }, + { + "cell_type": "markdown", + "id": "22", + "metadata": {}, + "source": [ + "## Test Succesful jobs" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "23", + "metadata": {}, + "outputs": [], + "source": [ + "jobs_submit_should_succeed = [j for j in jobs_data if j.should_submit]" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "24", + "metadata": {}, + "outputs": [], + "source": [ + "for job in jobs_submit_should_succeed:\n", + " client = job.client\n", + " response = client.api.services.bigquery.submit_query(\n", + " func_name=job.func_name, query=job.query\n", + " )\n", + " job.code_path = extract_code_path(response)" + ] + }, + { + "cell_type": "markdown", + "id": "25", + "metadata": {}, + "source": [ + "## Test failures" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "26", + "metadata": {}, + "outputs": [], + "source": [ + "jobs_submit_should_fail = [j for j in jobs_data if not j.should_submit]" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "27", + "metadata": {}, + "outputs": [], + "source": [ + "for job in jobs_submit_should_fail:\n", + " client = job.client\n", + "\n", + " with sy.raises(sy.SyftException):\n", + " client.api.services.bigquery.submit_query(\n", + " func_name=job.func_name, query=job.query\n", + " )" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "28", + "metadata": {}, + "outputs": [], + "source": [ + "for job in jobs_data:\n", + " print(f\"Job {job.func_name:.20} {job.should_submit=}, {job.is_submitted=}\")\n", + "\n", + "assert all(job.is_submitted == job.should_submit for job in jobs_data)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "29", + "metadata": {}, + "outputs": [], + "source": [ + "save_jobs(jobs_data)" + ] + }, + { + "cell_type": "markdown", + "id": "30", + "metadata": {}, + "source": [ + "## Test: cannot execute submitted jobs yet" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "31", + "metadata": {}, + "outputs": [], + "source": [ + "submitted_jobs = [job for job in jobs_data if job.should_submit]\n", + "job_execution_fns = [getattr(job.client.code, job.code_path) for job in submitted_jobs]\n", + "assert len(submitted_jobs) # failsafe for next tests" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "32", + "metadata": {}, + "outputs": [], + "source": [ + "for fn in job_execution_fns:\n", + " # blocking\n", + " with sy.raises(\n", + " sy.SyftException(public_message=\"*Your code is waiting for approval*\")\n", + " ):\n", + " result = fn()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "33", + "metadata": {}, + "outputs": [], + "source": [ + "for fn in job_execution_fns:\n", + " # nonblocking\n", + " result_job = fn(blocking=False)\n", + " result_job.wait()\n", + " assert isinstance(result_job.result, sy.SyftError)\n", + " assert result_job.status == JobStatus.ERRORED" + ] + }, + { + "cell_type": "markdown", + "id": "34", + "metadata": {}, + "source": [ + "# Verify that admin has emails for submitted requests" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "35", + "metadata": {}, + "outputs": [], + "source": [ + "num_should_submit = sum(j.should_submit for j in jobs_data)\n", + "admin_emails_after = len(email_server.get_emails_for_user(\"admin@bigquery.org\"))\n", + "print(\"admin emails after\", admin_emails_after)\n", + "assert admin_emails_after >= admin_emails_before + num_should_submit\n", + "# assert len(users_emails) > after_number_of_emails\n", + "# assert len(users_emails) == after_number_of_emails + 1" + ] + }, + { + "cell_type": "markdown", + "id": "36", + "metadata": {}, + "source": [ + "# Cleanup" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "37", + "metadata": {}, + "outputs": [], + "source": [ + "smtp_server.stop()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "38", + "metadata": {}, + "outputs": [], + "source": [ + "server.land()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "39", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "syft_3.12", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.12.4" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/notebooks/scenarios/bigquery/upgradability/0.9.1_notebooks/040-do-review-requests.ipynb b/notebooks/scenarios/bigquery/upgradability/0.9.1_notebooks/040-do-review-requests.ipynb new file mode 100644 index 00000000000..ad84c120e74 --- /dev/null +++ b/notebooks/scenarios/bigquery/upgradability/0.9.1_notebooks/040-do-review-requests.ipynb @@ -0,0 +1,335 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# import os\n", + "# os.environ[\"ORCHESTRA_DEPLOYMENT_TYPE\"] = \"remote\"\n", + "# os.environ[\"DEV_MODE\"] = \"True\"\n", + "# os.environ[\"TEST_EXTERNAL_REGISTRY\"] = \"k3d-registry.localhost:5800\"" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# isort: off\n", + "# stdlib\n", + "import random\n", + "import os\n", + "import sys\n", + "\n", + "# syft absolute\n", + "import syft as sy\n", + "from syft.util.util import find_base_dir_with_tox_ini, get_caller_file_path, is_interpreter_jupyter\n", + "\n", + "\n", + "def add_helper_path_to_python_path() -> None:\n", + " current_path = \".\"\n", + "\n", + " # jupyter uses \".\" which resolves to the notebook\n", + " if not is_interpreter_jupyter():\n", + " # python uses the file which has from syft import test_settings in it\n", + " import_path = get_caller_file_path()\n", + " if import_path:\n", + " current_path = import_path\n", + "\n", + " base_dir = find_base_dir_with_tox_ini(current_path)\n", + " notebook_helper_path = os.path.join(base_dir, \"notebooks/notebook_helpers\")\n", + " sys.path.append(notebook_helper_path)\n", + "\n", + "add_helper_path_to_python_path()\n", + "from syft.service.job.job_stash import Job\n", + "\n", + "# third party\n", + "from email_helpers import get_email_server\n", + "from job_helpers import approve_by_running\n", + "from job_helpers import get_job_emails\n", + "from job_helpers import get_request_for_job_info\n", + "# isort: on" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "ADMIN_EMAIL, ADMIN_PW = \"admin2@bigquery.org\", \"bqpw2\"" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Start server & login" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "server = sy.orchestra.launch(\n", + " name=\"bigquery-high\",\n", + " dev_mode=True,\n", + " server_side_type=\"high\",\n", + " port=\"8080\",\n", + " n_consumers=1, # How many workers to be spawned\n", + " create_producer=True, # Can produce more workers\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "high_client = sy.login(\n", + " url=\"http://localhost:8080\", email=ADMIN_EMAIL, password=ADMIN_PW\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "email_server, smtp_server = get_email_server()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Review requests" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# third party\n", + "from email_helpers import load_users\n", + "from job_helpers import load_jobs\n", + "from job_helpers import save_jobs" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "high_client.requests.get_all_pending()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "users = load_users(high_client)\n", + "jobs_data = load_jobs(users, high_client)\n", + "all_requests = high_client.requests\n", + "submitted_jobs_data = [job for job in jobs_data if job.is_submitted]\n", + "n_emails_per_job_user = {\n", + " k: len(v)\n", + " for k, v in get_job_emails(submitted_jobs_data, high_client, email_server).items()\n", + "}" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# TODO we should record whether it was approved or deposited\n", + "# and test doing both in either order as there might be a bug when\n", + "# force overwriting\n", + "# also changing deny to approve and back again" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Run or deny" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "submitted_jobs_data_should_succeed = [\n", + " j for j in submitted_jobs_data if j.should_succeed\n", + "]\n", + "submitted_jobs_data_should_fail = [\n", + " j for j in submitted_jobs_data if not j.should_succeed\n", + "]" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "for job in submitted_jobs_data_should_succeed:\n", + " request = get_request_for_job_info(all_requests, job)\n", + " if random.randrange(2):\n", + " choice = \"approved with deposit_result\"\n", + " response = approve_by_running(request)\n", + " assert isinstance(response, Job)\n", + " else:\n", + " choice = \"approved\"\n", + " response = request.approve()\n", + " assert isinstance(response, sy.SyftSuccess)\n", + " print(f\"Job {job.func_name} should succeed: {job.should_succeed} and was {choice}\")\n", + " job.admin_reviewed = True" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "for job in submitted_jobs_data_should_fail:\n", + " request = get_request_for_job_info(all_requests, job)\n", + " response = request.deny(\n", + " reason=f\"Your request {job.func_name} looks wrong, try again.\"\n", + " )\n", + " assert isinstance(response, sy.SyftSuccess)\n", + " assert not job.should_succeed\n", + " job.admin_reviewed = True" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Verify that users have new emails" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "new_n_emails_per_job_user = {\n", + " k: len(v)\n", + " for k, v in get_job_emails(submitted_jobs_data, high_client, email_server).items()\n", + "}" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# for user_email, new_count in new_n_emails_per_job_user.items():\n", + "# old_count = n_emails_per_job_user[user_email]\n", + "# assert new_count > old_count" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Save state" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "save_jobs(jobs_data)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "high_client.requests.get_all_approved()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "high_client.requests.get_all_rejected()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Cleanup" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "smtp_server.stop()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "server.land()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.12.5" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/notebooks/scenarios/bigquery/upgradability/0.9.1_notebooks/050-ds-get-results.ipynb b/notebooks/scenarios/bigquery/upgradability/0.9.1_notebooks/050-ds-get-results.ipynb new file mode 100644 index 00000000000..295202d92d2 --- /dev/null +++ b/notebooks/scenarios/bigquery/upgradability/0.9.1_notebooks/050-ds-get-results.ipynb @@ -0,0 +1,255 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# import os\n", + "# os.environ[\"ORCHESTRA_DEPLOYMENT_TYPE\"] = \"remote\"\n", + "# os.environ[\"DEV_MODE\"] = \"True\"\n", + "# os.environ[\"TEST_EXTERNAL_REGISTRY\"] = \"k3d-registry.localhost:5800\"" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# isort: off\n", + "# syft absolute\n", + "import syft as sy\n", + "from syft.util.util import find_base_dir_with_tox_ini, get_caller_file_path, is_interpreter_jupyter\n", + "\n", + "import os\n", + "import sys\n", + "\n", + "def add_helper_path_to_python_path() -> None:\n", + " current_path = \".\"\n", + "\n", + " # jupyter uses \".\" which resolves to the notebook\n", + " if not is_interpreter_jupyter():\n", + " # python uses the file which has from syft import test_settings in it\n", + " import_path = get_caller_file_path()\n", + " if import_path:\n", + " current_path = import_path\n", + "\n", + " base_dir = find_base_dir_with_tox_ini(current_path)\n", + " notebook_helper_path = os.path.join(base_dir, \"notebooks/notebook_helpers\")\n", + " sys.path.append(notebook_helper_path)\n", + "\n", + "add_helper_path_to_python_path()\n", + "# third party\n", + "from email_helpers import get_email_server\n", + "from email_helpers import load_users\n", + "from job_helpers import load_jobs\n", + "from job_helpers import save_jobs\n", + "# isort: on" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "ADMIN_EMAIL, ADMIN_PW = \"admin2@bigquery.org\", \"bqpw2\"" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Launch server & login" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "server = sy.orchestra.launch(\n", + " name=\"bigquery-high\",\n", + " dev_mode=True,\n", + " server_side_type=\"high\",\n", + " port=\"8080\",\n", + " n_consumers=1, # How many workers to be spawned\n", + " create_producer=True, # Can produce more workers\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "high_client = sy.login(\n", + " url=\"http://localhost:8080\", email=ADMIN_EMAIL, password=ADMIN_PW\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "email_server, smtp_server = get_email_server()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Download results" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "users = load_users(high_client)\n", + "jobs = load_jobs(users, high_client)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# submitted_jobs = [job for job in jobs if job.is_submitted]\n", + "reviewed_jobs = [job for job in jobs if job.admin_reviewed]\n", + "reviewed_jobs_should_succeed = [j for j in reviewed_jobs if j.should_succeed]\n", + "reviewed_jobs_should_fail = [j for j in reviewed_jobs if not j.should_succeed]\n", + "\n", + "print(\n", + " f\"{len(reviewed_jobs)=}, {len(reviewed_jobs_should_succeed)=}, {len(reviewed_jobs_should_fail)=}\"\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# TODO: test jobs that were never approved\n", + "# they seem to give weird errors like\n", + "# \"You uploaded an ActionObject that is not yet in the blob storage\"" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "for job in reviewed_jobs_should_succeed:\n", + " print(f\"> Checking job: {job.job_type} {job.func_name} for user {job.user_email}\")\n", + " api_method = job.code_method\n", + " j = api_method(blocking=False)\n", + " res = j.wait()\n", + "\n", + " if isinstance(res, sy.SyftError):\n", + " raise sy.SyftException(public_message=\"Expected success, got error\")\n", + "\n", + " result = res.get()\n", + " job.result_as_expected = True" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "for job in reviewed_jobs_should_fail:\n", + " print(f\"> Checking job: {job.job_type} {job.func_name} for user {job.user_email}\")\n", + " api_method = job.code_method\n", + "\n", + " j = api_method(blocking=False)\n", + " res = j.wait()\n", + " if isinstance(res, sy.SyftError):\n", + " job.result_as_expected = True\n", + " else:\n", + " raise sy.SyftException(public_message=f\"failed, job didnt raise {type(j)}\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "save_jobs(jobs)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# TODO fix\n", + "expected_jobs = [job for job in jobs if job.result_as_expected]\n", + "print(f\"got expected_jobs: {len(expected_jobs)} == reviewed_jobs: {len(reviewed_jobs)}\")\n", + "assert len(reviewed_jobs) == len(expected_jobs)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Cleanup" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "smtp_server.stop()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "server.land()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.12.5" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/notebooks/scenarios/bigquery/upgradability/0.9.1_notebooks/emails.json b/notebooks/scenarios/bigquery/upgradability/0.9.1_notebooks/emails.json new file mode 100644 index 00000000000..9e26dfeeb6e --- /dev/null +++ b/notebooks/scenarios/bigquery/upgradability/0.9.1_notebooks/emails.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/notebooks/scenarios/bigquery/upgradability/0.9.1_notebooks/jobs.json b/notebooks/scenarios/bigquery/upgradability/0.9.1_notebooks/jobs.json new file mode 100644 index 00000000000..f74979265a4 --- /dev/null +++ b/notebooks/scenarios/bigquery/upgradability/0.9.1_notebooks/jobs.json @@ -0,0 +1 @@ +{"crystal-smith-fake@openmined.org": [{"user_email": "crystal-smith-fake@openmined.org", "func_name": "simple_query_81c2df", "query": "SELECT table_id, AVG(colname) AS average_score\n FROM dataset_2.table_1\n GROUP BY table_id\n LIMIT 888526", "job_type": "simple_query", "settings": {"dataset": "dataset_2", "table": "table_1", "groupby_col": "table_id", "score_col": "colname", "limit": 888526}, "should_succeed": true, "should_submit": true, "code_path": "simple_query_81c2df", "admin_reviewed": true, "result_as_expected": true}, {"user_email": "crystal-smith-fake@openmined.org", "func_name": "simple_query_d504a4", "query": "SELECT table_id, AVG(colname) AS average_score\n FROM dataset_1.table_1\n GROUP BY table_id\n LIMIT 412907", "job_type": "simple_query", "settings": {"dataset": "dataset_1", "table": "table_1", "groupby_col": "table_id", "score_col": "colname", "limit": 412907}, "should_succeed": true, "should_submit": true, "code_path": "simple_query_d504a4", "admin_reviewed": true, "result_as_expected": true}, {"user_email": "crystal-smith-fake@openmined.org", "func_name": "job_long_name_82766aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", "query": "SELECT table_id, AVG(colname) AS average_score\n FROM dataset_1.table_1\n GROUP BY table_id\n LIMIT 222806", "job_type": "job_long_name", "settings": {"dataset": "dataset_1", "table": "table_1", "groupby_col": "table_id", "score_col": "colname", "limit": 222806}, "should_succeed": true, "should_submit": true, "code_path": "job_long_name_82766aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", "admin_reviewed": true, "result_as_expected": true}], "john-gray-fake@openmined.org": [{"user_email": "john-gray-fake@openmined.org", "func_name": "simple_query_71c8bc", "query": "SELECT table_id, AVG(colname) AS average_score\n FROM dataset_2.table_2\n GROUP BY table_id\n LIMIT 90263", "job_type": "simple_query", "settings": {"dataset": "dataset_2", "table": "table_2", "groupby_col": "table_id", "score_col": "colname", "limit": 90263}, "should_succeed": true, "should_submit": true, "code_path": "simple_query_71c8bc", "admin_reviewed": true, "result_as_expected": true}, {"user_email": "john-gray-fake@openmined.org", "func_name": "simple_query_f4ffab", "query": "SELECT table_id, AVG(colname) AS average_score\n FROM dataset_2.table_1\n GROUP BY table_id\n LIMIT 343303", "job_type": "simple_query", "settings": {"dataset": "dataset_2", "table": "table_1", "groupby_col": "table_id", "score_col": "colname", "limit": 343303}, "should_succeed": true, "should_submit": true, "code_path": "simple_query_f4ffab", "admin_reviewed": true, "result_as_expected": true}, {"user_email": "john-gray-fake@openmined.org", "func_name": "job_funcname_xss_6370db", "query": "SELECT table_id, AVG(colname) AS average_score\n FROM dataset_2.table_1\n GROUP BY table_id\n LIMIT 542819", "job_type": "job_funcname_xss", "settings": {"dataset": "dataset_2", "table": "table_1", "groupby_col": "table_id", "score_col": "colname", "limit": 542819}, "should_succeed": true, "should_submit": false, "code_path": null, "admin_reviewed": false, "result_as_expected": null}], "jimmy-copeland-fake@openmined.org": [{"user_email": "jimmy-copeland-fake@openmined.org", "func_name": "simple_query_949aaf", "query": "SELECT table_id, AVG(colname) AS average_score\n FROM dataset_2.table_2\n GROUP BY table_id\n LIMIT 845473", "job_type": "simple_query", "settings": {"dataset": "dataset_2", "table": "table_2", "groupby_col": "table_id", "score_col": "colname", "limit": 845473}, "should_succeed": true, "should_submit": true, "code_path": "simple_query_949aaf", "admin_reviewed": true, "result_as_expected": true}, {"user_email": "jimmy-copeland-fake@openmined.org", "func_name": "wrong_syntax_query_e1ea75", "query": "SELECT * FROM table INCORRECT SYNTAX", "job_type": "wrong_syntax_query", "settings": {}, "should_succeed": false, "should_submit": true, "code_path": "wrong_syntax_query_e1ea75", "admin_reviewed": true, "result_as_expected": true}], "ryan-thomas-fake@openmined.org": [{"user_email": "ryan-thomas-fake@openmined.org", "func_name": "simple_query_c64422", "query": "SELECT table_id, AVG(colname) AS average_score\n FROM dataset_2.table_1\n GROUP BY table_id\n LIMIT 78176", "job_type": "simple_query", "settings": {"dataset": "dataset_2", "table": "table_1", "groupby_col": "table_id", "score_col": "colname", "limit": 78176}, "should_succeed": true, "should_submit": true, "code_path": "simple_query_c64422", "admin_reviewed": true, "result_as_expected": true}, {"user_email": "ryan-thomas-fake@openmined.org", "func_name": "job_too_much_text_e252cf", "query": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", "job_type": "job_too_much_text", "settings": {}, "should_succeed": false, "should_submit": true, "code_path": "job_too_much_text_e252cf", "admin_reviewed": true, "result_as_expected": true}]} \ No newline at end of file diff --git a/notebooks/scenarios/bigquery/upgradability/0.9.1_notebooks/users.json b/notebooks/scenarios/bigquery/upgradability/0.9.1_notebooks/users.json new file mode 100644 index 00000000000..b68e0beaadd --- /dev/null +++ b/notebooks/scenarios/bigquery/upgradability/0.9.1_notebooks/users.json @@ -0,0 +1 @@ +[{"name": "Denise Porter", "email": "denise-porter-fake@openmined.org", "password": "tX@g7CBt2)", "role": "ServiceRole.DATA_SCIENTIST", "new_password": null, "email_disabled": true, "reset_password": false, "reset_token": null}, {"name": "Kimberly Willis", "email": "kimberly-willis-fake@openmined.org", "password": "N22Oh%Er$o", "role": "ServiceRole.DATA_SCIENTIST", "new_password": null, "email_disabled": false, "reset_password": true, "reset_token": "ow7LCNe7AJJA"}, {"name": "Charles Carlson", "email": "charles-carlson-fake@openmined.org", "password": "fAmCalfW_0", "role": "ServiceRole.DATA_SCIENTIST", "new_password": null, "email_disabled": false, "reset_password": false, "reset_token": null}, {"name": "Samuel Clark", "email": "samuel-clark-fake@openmined.org", "password": "g!9YLtNaX1", "role": "ServiceRole.DATA_SCIENTIST", "new_password": null, "email_disabled": false, "reset_password": false, "reset_token": null}, {"name": "Amanda Gomez", "email": "amanda-gomez-fake@openmined.org", "password": "(4xB6Lneh1", "role": "ServiceRole.DATA_SCIENTIST", "new_password": null, "email_disabled": false, "reset_password": false, "reset_token": null}] \ No newline at end of file diff --git a/notebooks/scenarios/bigquery/upgradability/1-dump-database-to-file.ipynb b/notebooks/scenarios/bigquery/upgradability/1-dump-database-to-file.ipynb new file mode 100644 index 00000000000..cba53cb324f --- /dev/null +++ b/notebooks/scenarios/bigquery/upgradability/1-dump-database-to-file.ipynb @@ -0,0 +1,164 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "id": "0", + "metadata": {}, + "outputs": [], + "source": [ + "# stdlib\n", + "import os\n", + "from pathlib import Path\n", + "\n", + "# syft absolute\n", + "import syft as sy" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "0802eec0", + "metadata": {}, + "outputs": [], + "source": [ + "ADMIN_EMAIL, ADMIN_PW = \"admin2@bigquery.org\", \"bqpw2\"" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "1", + "metadata": {}, + "outputs": [], + "source": [ + "server = sy.orchestra.launch(\n", + " name=\"bigquery-high\",\n", + " dev_mode=True,\n", + " server_side_type=\"high\",\n", + " port=\"8080\",\n", + " n_consumers=1, # How many workers to be spawned\n", + " create_producer=True, # Can produce more workers\n", + ")\n", + "client = sy.login(\n", + " url=\"http://localhost:8080\", email=ADMIN_EMAIL, password=ADMIN_PW\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "2", + "metadata": {}, + "outputs": [], + "source": [ + "# client = sy.login(email=\"info@openmined.org\", password=\"changethis\", port=8080)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "3", + "metadata": {}, + "outputs": [], + "source": [ + "# Check if this server has data on it\n", + "# assert len(client.users.get_all()) == 2" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "4", + "metadata": {}, + "outputs": [], + "source": [ + "migration_data = client.get_migration_data(include_blobs=True)\n", + "migration_data" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "5", + "metadata": {}, + "outputs": [], + "source": [ + "assert migration_data.includes_blobs\n", + "assert migration_data.num_action_objects > 0" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "6", + "metadata": {}, + "outputs": [], + "source": [ + "migration_data_dir = Path(os.getenv(\"MIGRATION_DATA_DIR\", \".\"))\n", + "migration_data_dir.mkdir(exist_ok=True)\n", + "\n", + "blob_path = migration_data_dir / \"migration.blob\"\n", + "yaml_path = migration_data_dir / \"migration.yaml\"\n", + "\n", + "blob_path.unlink(missing_ok=True)\n", + "yaml_path.unlink(missing_ok=True)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "7", + "metadata": {}, + "outputs": [], + "source": [ + "migration_data.save(blob_path, yaml_path=yaml_path)\n", + "\n", + "assert blob_path.exists()\n", + "assert yaml_path.exists()\n", + "\n", + "print(f\"Saved migration data to {str(blob_path.resolve())}\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "8", + "metadata": {}, + "outputs": [], + "source": [ + "if server.server_type.value == \"python\":\n", + " server.land()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "9", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "syft_3.12", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.12.4" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/notebooks/scenarios/bigquery/upgradability/2-migrate-for-scenarios.ipynb b/notebooks/scenarios/bigquery/upgradability/2-migrate-for-scenarios.ipynb new file mode 100644 index 00000000000..fb7c7150523 --- /dev/null +++ b/notebooks/scenarios/bigquery/upgradability/2-migrate-for-scenarios.ipynb @@ -0,0 +1,10061 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "# stdlib\n", + "import os\n", + "from pathlib import Path\n", + "from os import environ as env\n", + "\n", + "# syft absolute\n", + "import syft as sy\n", + "from syft.service.code.user_code import UserCode\n", + "from syft.service.user.user import User" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [], + "source": [ + "from syft.util.util import find_base_dir_with_tox_ini, get_caller_file_path, is_interpreter_jupyter\n", + "\n", + "import os\n", + "import sys\n", + "\n", + "def add_helper_path_to_python_path() -> None:\n", + " current_path = \".\"\n", + "\n", + " # jupyter uses \".\" which resolves to the notebook\n", + " if not is_interpreter_jupyter():\n", + " # python uses the file which has from syft import test_settings in it\n", + " import_path = get_caller_file_path()\n", + " if import_path:\n", + " current_path = import_path\n", + "\n", + " base_dir = find_base_dir_with_tox_ini(current_path)\n", + " notebook_helper_path = os.path.join(base_dir, \"notebooks/notebook_helpers\")\n", + " sys.path.append(notebook_helper_path)\n", + "\n", + "add_helper_path_to_python_path()" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [], + "source": [ + "from email_helpers import get_email_server\n", + "from email_helpers import load_users\n", + "from job_helpers import load_jobs\n", + "from job_helpers import save_jobs" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [], + "source": [ + "# when in k8s these are the default values\n", + "ROOT_EMAIL = \"admin@bigquery.org\"\n", + "ROOT_PASSWORD = \"bqpw\"" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [], + "source": [ + "# in case we are not in k8s we set them here for orchestra to use\n", + "env[\"DEFAULT_ROOT_EMAIL\"] = ROOT_EMAIL\n", + "env[\"DEFAULT_ROOT_PASSWORD\"] = ROOT_PASSWORD" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Login" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Autoreload enabled\n", + "Starting bigquery-high server on 0.0.0.0:8080\n", + "Found `reset=True` in the launch configuration. Resetting the server...\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "INFO: Will watch for changes in these directories: ['/home/teo/OpenMined/PySyft/packages/syft/src/syft']\n", + "INFO: Uvicorn running on http://0.0.0.0:8080 (Press CTRL+C to quit)\n", + "INFO: Started reloader process [77028] using WatchFiles\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Waiting for server to start...WARN: private key is based on server name: bigquery-high in dev_mode. Don't run this in production.\n", + "Document Store's SQLite DB path: /tmp/syft/fbdf5a287e58454cbbd3fac4ad744d37/db/fbdf5a287e58454cbbd3fac4ad744d37.sqlite\n", + "Action Store's SQLite DB path: /tmp/syft/fbdf5a287e58454cbbd3fac4ad744d37/db/fbdf5a287e58454cbbd3fac4ad744d37.sqlite\n", + "Adding producer for queue: api_call on: tcp://localhost:60195\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "INFO: Started server process [77042]\n", + "INFO: Waiting for application startup.\n", + "INFO: Application startup complete.\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + ". Done.\n" + ] + }, + { + "data": { + "text/html": [ + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "
SyftInfo:
You have launched a development server at http://0.0.0.0:8080.It is intended only for local use.

" + ], + "text/plain": [ + "SyftInfo: You have launched a development server at http://0.0.0.0:8080.It is intended only for local use." + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Logged into as \n" + ] + }, + { + "data": { + "text/html": [ + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "
SyftWarning:
You are using a default password. Please change the password using `[your_client].account.set_password([new_password])`.

" + ], + "text/plain": [ + "SyftWarning: You are using a default password. Please change the password using `[your_client].account.set_password([new_password])`." + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "server = sy.orchestra.launch(\n", + " name=\"bigquery-high\",\n", + " dev_mode=True,\n", + " server_side_type=\"high\",\n", + " reset=True,\n", + " port=\"8080\",\n", + " n_consumers=1, # How many workers to be spawned\n", + " create_producer=True, # Can produce more workers\n", + ")\n", + "\n", + "client = sy.login(\n", + " url=\"http://localhost:8080\", email=ROOT_EMAIL, password=ROOT_PASSWORD\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [], + "source": [ + "# Check if this is a new server\n", + "migration_data = client.get_migration_data()\n", + "\n", + "# assert len(migration_data.store_objects[User]) == 1\n", + "# assert UserCode not in migration_data.store_objects" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [ + { + "data": { + "text/markdown": [ + "```python\n", + "class MigrationData:\n", + " id: str = 1938503d138246d1b577d5b2624e48cc\n", + " server_uid: str = fbdf5a287e58454cbbd3fac4ad744d37\n", + " root_verify_key: str = 1e5ec44a179d21e0a0721ea7a670b9875d3946c8604f4623903fcafafe03c8e7\n", + " num_objects: str = 16\n", + " num_action_objects: str = 0\n", + " includes_blobs: str = True\n", + "\n", + "```" + ], + "text/plain": [ + "syft.service.migration.object_migration_state.MigrationData" + ] + }, + "execution_count": 8, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "migration_data" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Load migration data" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "/home/teo/OpenMined/PySyft/notebooks/scenarios/bigquery/upgradability\n" + ] + } + ], + "source": [ + "!pwd" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Loading migration data from /home/teo/OpenMined/PySyft/.tox/.tmp/migration/migration.blob\n" + ] + } + ], + "source": [ + "# migration_data_dir = Path(os.getenv(\"MIGRATION_DATA_DIR\", \".\"))\n", + "migration_data_dir = Path('/home/teo/OpenMined/PySyft/.tox/.tmp/migration')\n", + "blob_path = migration_data_dir / \"migration.blob\"\n", + "yaml_path = migration_data_dir / \"migration.yaml\"\n", + "\n", + "print(f\"Loading migration data from {str(blob_path.resolve())}\")" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "
SyftWarning:
This migration data includes custom workers, which need to be migrated separately with `sy.upgrade_custom_workerpools` after finishing the migration.

" + ], + "text/plain": [ + "SyftWarning: This migration data includes custom workers, which need to be migrated separately with `sy.upgrade_custom_workerpools` after finishing the migration." + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Migrating data for: User table to version 2\n", + "Migrating data for: APIEndpointQueueItem table to version 1\n", + "Migrating data for: ActionQueueItem table to version 1\n", + "Migrating data for: ServerSettings table to version 4\n", + "Migrating data for: UserCode table to version 1\n", + "Migrating data for: SyftLog table to version 1\n", + "Migrating data for: Request table to version 1\n", + "Migrating data for: JobItem table to version 2\n", + "Migrating data for: TwinAPIEndpoint table to version 1\n", + "Migrating data for: NotifierSettings table to version 2\n", + "Migrating data for: Notification table to version 1\n", + "Migrating data for: CodeHistory table to version 1\n", + "Migrating data for: SyftObjectMigrationState table to version 1\n", + "Migrating data for: SyftImageRegistry table to version 1\n", + "Migrating data for: ExecutionOutput table to version 1\n", + "Migrating data for: UserCodeStatusCollection table to version 1\n", + " #aaa0b11ff8dd4bfb8eb703c2d3ab72b9 already exists\n", + " #fbdf5a287e58454cbbd3fac4ad744d37 already exists\n", + " #8b5525d5424b4acc8eeff1445c5d72d9 already exists\n", + " #7b14bf4173564d6e854bea0c2de5b58b already exists\n", + " #8bb36d60ff1e48dbb40e5178a4fd8a5b already exists\n", + " #27932d43cd394219a4a03e68664aa829 already exists\n", + " #f6ed0b04ed24406a92e125f731f6aacf already exists\n", + " #fa99e4e7133d4126992c96607caf2252 already exists\n", + " #bd9260dd18b240d5879d5c6f1d4f61c1 already exists\n", + " #a5a5cdaa910d4c39905f1b391ba343d2 already exists\n", + " #1207ab0c71e2475594d80de244a4b2fd already exists\n", + " #5cc449f50c6945f3a8b7ebfedb1ed665 already exists\n", + "Migrating data for: AnyActionObject table to version 1\n", + "Migrating data for: PandasDataframeObject table to version 1\n", + "Updating store metadata\n" + ] + } + ], + "source": [ + "res = client.load_migration_data(blob_path)\n", + "assert isinstance(res, sy.SyftSuccess), res.message" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "
SyftSuccess:
Migration completed successfully

" + ], + "text/plain": [ + "SyftSuccess: Migration completed successfully" + ] + }, + "execution_count": 12, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "res" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "This is a utility to upgrade workerpools to the new syft version\n", + "If an upgrade fails, it is always possible to start the workerpool manually\n", + "loading migration data...\n", + "Skipping default pool, this pool has already been upgraded\n", + "\n", + "Upgrading workerpool bigquery-pool\n", + "Found outdated prebuilt worker image `docker.io/openmined/syft-worker-bigquery:local-dev`\n", + "submitting new prebuilt image...\n" + ] + }, + { + "data": { + "text/html": [ + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "
SyftSuccess:
Dockerfile ID: 2555bdfadb6a45d596fdcc73fd0e5c22 successfully submitted.

" + ], + "text/plain": [ + "SyftSuccess: Dockerfile ID: 2555bdfadb6a45d596fdcc73fd0e5c22 successfully submitted." + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "starting new pool `bigquery-pool` with 1 workers\n" + ] + }, + { + "data": { + "text/html": [ + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "
\n", + "\n", + "
\n", + "
\n", + " \n", + "
\n", + "

ContainerSpawnStatus List

\n", + "
\n", + "
\n", + "
\n", + " \n", + "
\n", + "
\n", + "

Total: 0

\n", + "
\n", + "
\n", + "
\n", + "\n", + "\n", + "\n", + "" + ], + "text/plain": [ + "[ContainerSpawnStatus(worker_name='bigquery-pool-1', worker=syft.service.worker.worker_pool.SyftWorker, error=None)]" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "Upgraded 1 workerpools to the new syft version\n", + "Please verify your upgraded pools with `client.worker_pools`\n" + ] + } + ], + "source": [ + "sy.upgrade_custom_workerpools(client, blob_path, mode=\"auto\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Post migration tests" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "'\\nTODO:\\n * verify users\\n * login\\n * check every role\\n * mostly check on lengths\\n * can a DS see the results of their old jobs/logs\\n * still use the api schema both mock \\n * still submit a new query via submit_query\\n * can admin still approve and approve_by_running, deny\\n * check on old broken queries\\n * create a new broken query\\n * can ds get the results of the new queries\\n * emails should work now\\n * test in k8s (both L2 and L0)\\n * test in L0 (migrate both nodes?)\\n'" + ] + }, + "execution_count": 20, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "\"\"\"\n", + "TODO:\n", + " * verify users\n", + " * login\n", + " * check every role\n", + " * mostly check on lengths\n", + " * can a DS see the results of their old jobs/logs\n", + " * still use the api schema both mock \n", + " * still submit a new query via submit_query\n", + " * can admin still approve and approve_by_running, deny\n", + " * check on old broken queries\n", + " * create a new broken query\n", + " * can ds get the results of the new queries\n", + " * emails should work now\n", + " * test in k8s (both L2 and L0)\n", + " * test in L0 (migrate both nodes?)\n", + "\"\"\" " + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Logged into as \n", + "Logged into as \n", + "Logged into as \n", + "Logged into as \n" + ] + } + ], + "source": [ + "users = load_users(client, path=\"0.9.1_notebooks/users.json\")\n", + "jobs = load_jobs(users, client, filepath=\"0.9.1_notebooks/jobs.json\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Check users" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# TODO fix users??" + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "
\n", + "\n", + "
\n", + "
\n", + " \n", + "
\n", + "

UserView List

\n", + "
\n", + "
\n", + "
\n", + " \n", + "
\n", + "
\n", + "

Total: 0

\n", + "
\n", + "
\n", + "
\n", + "\n", + "\n", + "\n", + "" + ], + "text/plain": [ + "" + ] + }, + "execution_count": 26, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "client.users" + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[TestUser(name='Crystal Smith', email='crystal-smith-fake@openmined.org', password=')w&1iXSggD', role='ServiceRole.DATA_SCIENTIST', new_password=None, email_disabled=True, reset_password=False, reset_token=None, _email_server=None),\n", + " TestUser(name='John Gray', email='john-gray-fake@openmined.org', password='qu8eC6nU@!', role='ServiceRole.DATA_SCIENTIST', new_password=None, email_disabled=False, reset_password=False, reset_token=None, _email_server=None),\n", + " TestUser(name='Jimmy Copeland', email='jimmy-copeland-fake@openmined.org', password='4w3WA8J@%3', role='ServiceRole.DATA_SCIENTIST', new_password=None, email_disabled=False, reset_password=False, reset_token=None, _email_server=None),\n", + " TestUser(name='Ryan Thomas', email='ryan-thomas-fake@openmined.org', password='#72NWweU$8', role='ServiceRole.DATA_SCIENTIST', new_password=None, email_disabled=False, reset_password=False, reset_token=None, _email_server=None)]" + ] + }, + "execution_count": 25, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "users" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Old jobs" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "len(reviewed_jobs)=9, len(reviewed_jobs_should_succeed)=7, len(reviewed_jobs_should_fail)=2\n" + ] + } + ], + "source": [ + "# submitted_jobs = [job for job in jobs if job.is_submitted]\n", + "reviewed_jobs = [job for job in jobs if job.admin_reviewed]\n", + "reviewed_jobs_should_succeed = [j for j in reviewed_jobs if j.should_succeed]\n", + "reviewed_jobs_should_fail = [j for j in reviewed_jobs if not j.should_succeed]\n", + "\n", + "print(\n", + " f\"{len(reviewed_jobs)=}, {len(reviewed_jobs_should_succeed)=}, {len(reviewed_jobs_should_fail)=}\"\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "> Checking job: simple_query simple_query_81c2df for user crystal-smith-fake@openmined.org\n", + "> Checking job: simple_query simple_query_d504a4 for user crystal-smith-fake@openmined.org\n", + "> Checking job: job_long_name job_long_name_82766aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa for user crystal-smith-fake@openmined.org\n", + "> Checking job: simple_query simple_query_71c8bc for user john-gray-fake@openmined.org\n", + "> Checking job: simple_query simple_query_f4ffab for user john-gray-fake@openmined.org\n", + "> Checking job: simple_query simple_query_949aaf for user jimmy-copeland-fake@openmined.org\n", + "> Checking job: simple_query simple_query_c64422 for user ryan-thomas-fake@openmined.org\n" + ] + } + ], + "source": [ + "for job in reviewed_jobs_should_succeed:\n", + " print(f\"> Checking job: {job.job_type} {job.func_name} for user {job.user_email}\")\n", + " api_method = job.code_method\n", + " j = api_method(blocking=False)\n", + " res = j.wait()\n", + "\n", + " if isinstance(res, sy.SyftError):\n", + " raise sy.SyftException(public_message=\"Expected success, got error\")\n", + "\n", + " result = res.get()\n", + " job.result_as_expected = True" + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "> Checking job: wrong_syntax_query wrong_syntax_query_e1ea75 for user jimmy-copeland-fake@openmined.org\n", + "> Checking job: job_too_much_text job_too_much_text_e252cf for user ryan-thomas-fake@openmined.org\n" + ] + } + ], + "source": [ + "for job in reviewed_jobs_should_fail:\n", + " print(f\"> Checking job: {job.job_type} {job.func_name} for user {job.user_email}\")\n", + " api_method = job.code_method\n", + "\n", + " j = api_method(blocking=False)\n", + " res = j.wait()\n", + " if isinstance(res, sy.SyftError):\n", + " job.result_as_expected = True\n", + " else:\n", + " raise sy.SyftException(public_message=f\"failed, job didnt raise {type(j)}\")" + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "got expected_jobs: 9 == reviewed_jobs: 9\n" + ] + } + ], + "source": [ + "expected_jobs = [job for job in jobs if job.result_as_expected]\n", + "print(f\"got expected_jobs: {len(expected_jobs)} == reviewed_jobs: {len(reviewed_jobs)}\")\n", + "assert len(reviewed_jobs) == len(expected_jobs)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Use old DS to go through the flow again" + ] + }, + { + "cell_type": "code", + "execution_count": 29, + "metadata": {}, + "outputs": [], + "source": [ + "ds_client = users[0].client" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Check on emails now?" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "syft_3.12", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.12.4" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} From 2a0b76d362b0918e7a690fc3e4ac16d4d7623ae5 Mon Sep 17 00:00:00 2001 From: teo Date: Wed, 18 Sep 2024 12:24:20 +0300 Subject: [PATCH 02/17] save progress --- tox.ini | 60 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 60 insertions(+) diff --git a/tox.ini b/tox.ini index 958dc2a8772..d29fd88dc3f 100644 --- a/tox.ini +++ b/tox.ini @@ -1559,3 +1559,63 @@ commands_post = bash -c "CLUSTER_NAME=${DATASITE_CLUSTER_NAME} tox -e dev.k8s.destroy || true" bash -c 'rm -f ${MIGRATION_DATA_DIR}/migration.blob' bash -c 'rm -f ${MIGRATION_DATA_DIR}/migration.yaml' + +[testenv:migration.scenarios.prepare] +description = Prepare Migration Data +pip_pre = True +setenv = + MIGRATION_DATA_DIR = {env:MIGRATION_DATA_DIR:{temp_dir}/migration} + ORCHESTRA_DEPLOYMENT_TYPE = {env:ORCHESTRA_DEPLOYMENT_TYPE:python} + DEV_MODE = {env:DEV_MODE:True} + TEST_NOTEBOOK_PATHS = {env:TEST_NOTEBOOK_PATHS:notebooks/scenarios/bigquery/upgradability/0.9.1_notebooks} + TEST_query_limit_size={env:test_query_limit_size:500000} + SERVER_URL = {env:SERVER_URL:http://localhost} + SERVER_PORT = {env:SERVER_PORT:8080} + NUM_TEST_USERS = {env:NUM_TEST_USERS:5} + NUM_TEST_JOBS = {env:NUM_TEST_JOBS:10} +deps = + nbmake + requests + syft[dev,datascience]==0.9.1 + ; {[testenv:syft]deps} + db-dtypes + google-cloud-bigquery + aiosmtpd +allowlist_externals = + bash + python +commands = + ; Run notebooks to prepare migration data + bash -c 'pwd' + bash -c 'python -c "import syft as sy; print(\"Migrating from syft version:\", sy.__version__)"' + bash -c "echo Running with ORCHESTRA_DEPLOYMENT_TYPE=$ORCHESTRA_DEPLOYMENT_TYPE DEV_MODE=$DEV_MODE TEST_NOTEBOOK_PATHS=$TEST_NOTEBOOK_PATHS; date" + + bash -c "for subfolder in $(echo ${TEST_NOTEBOOK_PATHS} | tr ',' ' ');\ + do \ + pytest -s -x --nbmake --nbmake-timeout=1000 "$subfolder" --ignore=notebooks/scenarios/bigquery/sync -p no:randomly -vvvv --log-cli-level=DEBUG --capture=no;\ + done" + + pytest -x --nbmake --nbmake-timeout=1000 notebooks/tutorials/version-upgrades/11-dump-database-to-file.ipynb -vvvv + bash -c 'ls -l ${MIGRATION_DATA_DIR}/migration.blob' + bash -c 'ls -l ${MIGRATION_DATA_DIR}/migration.yaml' + bash -c "echo 'Migration data prepared in ${MIGRATION_DATA_DIR}'" + +[testenv:migration.scenarios.test] +description = Migration Test +setenv = + MIGRATION_DATA_DIR = {env:MIGRATION_DATA_DIR:{temp_dir}/migration} +deps = + -e{toxinidir}/packages/syft[dev] + nbmake +; changedir = {toxinidir}/packages/syft +allowlist_externals = + bash + tox + pytest +commands = + tox -e migration.prepare + bash -c 'python -c "import syft as sy; print(\"Migrating to syft version:\", sy.__version__)"' + pytest -x --nbmake --nbmake-timeout=1000 notebooks/tutorials/version-upgrades/3-migrate-from-file.ipynb -vvvv +commands_post = + bash -c 'rm -f ${MIGRATION_DATA_DIR}/migration.blob' + bash -c 'rm -f ${MIGRATION_DATA_DIR}/migration.yaml' \ No newline at end of file From 4906ac27692e08ed187e7a6f9b8bd46408d9ba0a Mon Sep 17 00:00:00 2001 From: eelcovdw Date: Thu, 19 Sep 2024 12:47:15 +0200 Subject: [PATCH 03/17] old sync notebooks, dump db for high-low --- .pre-commit-config.yaml | 2 +- .../01-setup-high-low-datasites.ipynb | 241 +++++++ .../02-configure-api-and-sync.ipynb | 611 ++++++++++++++++++ .../03-ds-submit-request.ipynb | 269 ++++++++ .../04-do-review-requests.ipynb | 422 ++++++++++++ .../0.9.1_notebooks/05-ds-get-results.ipynb | 131 ++++ .../sync/0.9.1_notebooks/__init__.py | 0 .../sync/0.9.1_notebooks/apis/__init__.py | 23 + .../0.9.1_notebooks/apis/live/__init__.py | 0 .../sync/0.9.1_notebooks/apis/live/schema.py | 108 ++++ .../0.9.1_notebooks/apis/live/test_query.py | 113 ++++ .../0.9.1_notebooks/apis/mock/__init__.py | 0 .../sync/0.9.1_notebooks/apis/mock/data.py | 268 ++++++++ .../sync/0.9.1_notebooks/apis/mock/schema.py | 52 ++ .../0.9.1_notebooks/apis/mock/test_query.py | 138 ++++ .../sync/0.9.1_notebooks/apis/rate_limiter.py | 16 + .../sync/0.9.1_notebooks/apis/submit_query.py | 42 ++ .../sync/0.9.1_notebooks/sync_helpers.py | 190 ++++++ .../sync/1-dump-database-to-file.ipynb | 201 ++++++ .../sync/2-migrate-for-scenarios.ipynb | 403 ++++++++++++ .../upgradability/sync/migration_high.blob | Bin 0 -> 1121336 bytes .../upgradability/sync/migration_high.yaml | 6 + .../upgradability/sync/migration_low.blob | Bin 0 -> 820904 bytes .../upgradability/sync/migration_low.yaml | 6 + 24 files changed, 3241 insertions(+), 1 deletion(-) create mode 100644 notebooks/scenarios/bigquery/upgradability/sync/0.9.1_notebooks/01-setup-high-low-datasites.ipynb create mode 100644 notebooks/scenarios/bigquery/upgradability/sync/0.9.1_notebooks/02-configure-api-and-sync.ipynb create mode 100644 notebooks/scenarios/bigquery/upgradability/sync/0.9.1_notebooks/03-ds-submit-request.ipynb create mode 100644 notebooks/scenarios/bigquery/upgradability/sync/0.9.1_notebooks/04-do-review-requests.ipynb create mode 100644 notebooks/scenarios/bigquery/upgradability/sync/0.9.1_notebooks/05-ds-get-results.ipynb create mode 100644 notebooks/scenarios/bigquery/upgradability/sync/0.9.1_notebooks/__init__.py create mode 100644 notebooks/scenarios/bigquery/upgradability/sync/0.9.1_notebooks/apis/__init__.py create mode 100644 notebooks/scenarios/bigquery/upgradability/sync/0.9.1_notebooks/apis/live/__init__.py create mode 100644 notebooks/scenarios/bigquery/upgradability/sync/0.9.1_notebooks/apis/live/schema.py create mode 100644 notebooks/scenarios/bigquery/upgradability/sync/0.9.1_notebooks/apis/live/test_query.py create mode 100644 notebooks/scenarios/bigquery/upgradability/sync/0.9.1_notebooks/apis/mock/__init__.py create mode 100644 notebooks/scenarios/bigquery/upgradability/sync/0.9.1_notebooks/apis/mock/data.py create mode 100644 notebooks/scenarios/bigquery/upgradability/sync/0.9.1_notebooks/apis/mock/schema.py create mode 100644 notebooks/scenarios/bigquery/upgradability/sync/0.9.1_notebooks/apis/mock/test_query.py create mode 100644 notebooks/scenarios/bigquery/upgradability/sync/0.9.1_notebooks/apis/rate_limiter.py create mode 100644 notebooks/scenarios/bigquery/upgradability/sync/0.9.1_notebooks/apis/submit_query.py create mode 100644 notebooks/scenarios/bigquery/upgradability/sync/0.9.1_notebooks/sync_helpers.py create mode 100644 notebooks/scenarios/bigquery/upgradability/sync/1-dump-database-to-file.ipynb create mode 100644 notebooks/scenarios/bigquery/upgradability/sync/2-migrate-for-scenarios.ipynb create mode 100644 notebooks/scenarios/bigquery/upgradability/sync/migration_high.blob create mode 100644 notebooks/scenarios/bigquery/upgradability/sync/migration_high.yaml create mode 100644 notebooks/scenarios/bigquery/upgradability/sync/migration_low.blob create mode 100644 notebooks/scenarios/bigquery/upgradability/sync/migration_low.yaml diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 521e3f9b60c..646698814a0 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -14,7 +14,7 @@ repos: exclude: ^(packages/grid/frontend/|.vscode) - id: check-added-large-files always_run: true - exclude: ^(packages/grid/backend/wheels/.*|docs/img/header.png|docs/img/terminalizer.gif) + exclude: ^(packages/grid/backend/wheels/.*|docs/img/header.png|docs/img/terminalizer.gif|^notebooks/scenarios/bigquery/upgradability/sync/migration_.*\.blob) - id: check-yaml always_run: true exclude: ^(packages/grid/k8s/rendered/|packages/grid/helm/) diff --git a/notebooks/scenarios/bigquery/upgradability/sync/0.9.1_notebooks/01-setup-high-low-datasites.ipynb b/notebooks/scenarios/bigquery/upgradability/sync/0.9.1_notebooks/01-setup-high-low-datasites.ipynb new file mode 100644 index 00000000000..65a947371db --- /dev/null +++ b/notebooks/scenarios/bigquery/upgradability/sync/0.9.1_notebooks/01-setup-high-low-datasites.ipynb @@ -0,0 +1,241 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# syft absolute\n", + "import syft as sy\n", + "from syft import test_settings\n", + "\n", + "print(f\"syft version: {sy.__version__}\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "server_low = sy.orchestra.launch(\n", + " name=\"bigquery-low\",\n", + " server_side_type=\"low\",\n", + " dev_mode=True,\n", + " reset=True,\n", + " n_consumers=1,\n", + " create_producer=True,\n", + " port=\"auto\",\n", + ")\n", + "\n", + "server_high = sy.orchestra.launch(\n", + " name=\"bigquery-high\",\n", + " server_side_type=\"high\",\n", + " dev_mode=True,\n", + " reset=True,\n", + " n_consumers=1,\n", + " create_producer=True,\n", + " port=\"auto\",\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "low_client = server_low.login(email=\"info@openmined.org\", password=\"changethis\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "high_client = server_high.login(email=\"info@openmined.org\", password=\"changethis\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "low_client.worker_pools.get_all()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "assert len(high_client.worker_pools.get_all()) == 1\n", + "assert len(low_client.worker_pools.get_all()) == 1" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "def launch_worker_pool(client, pool_name):\n", + " if pool_name not in [x.name for x in client.worker_pools]:\n", + " external_registry = test_settings.get(\"external_registry\", default=\"docker.io\")\n", + " worker_docker_tag = f\"openmined/bigquery:{sy.__version__}\"\n", + " result = client.api.services.worker_image.submit(\n", + " worker_config=sy.PrebuiltWorkerConfig(\n", + " tag=f\"{external_registry}/{worker_docker_tag}\"\n", + " )\n", + " )\n", + " worker_image = client.images.get_all()[1]\n", + " result = client.api.services.image_registry.add(external_registry)\n", + " result = client.api.services.worker_pool.launch(\n", + " pool_name=pool_name,\n", + " image_uid=worker_image.id,\n", + " num_workers=1,\n", + " )\n", + " return result\n", + " else:\n", + " print(\"Pool already exists\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "pool_name = \"bigquery-pool\"" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "launch_worker_pool(high_client, pool_name)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "launch_worker_pool(low_client, pool_name)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# result = high_client.worker_pools.scale(number=5, pool_name=pool_name)\n", + "# result" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "assert len(high_client.worker_pools.get_all()) == 2\n", + "assert len(low_client.worker_pools.get_all()) == 2" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "base_worker_image = high_client.images.get_all()[0]\n", + "base_worker_image" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "low_client.register(\n", + " email=\"data_scientist@openmined.org\",\n", + " password=\"verysecurepassword\",\n", + " password_verify=\"verysecurepassword\",\n", + " name=\"John Doe\",\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "high_client.settings.allow_guest_signup(enable=False)\n", + "low_client.settings.allow_guest_signup(enable=False)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "assert (\n", + " len(low_client.api.services.user.get_all()) == 2\n", + "), \"Only DS and Admin should be at low side\"\n", + "assert (\n", + " len(high_client.api.services.user.get_all()) == 1\n", + "), \"Only Admin should be at high side\"" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "server_high.land()\n", + "server_low.land()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.10.13" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/notebooks/scenarios/bigquery/upgradability/sync/0.9.1_notebooks/02-configure-api-and-sync.ipynb b/notebooks/scenarios/bigquery/upgradability/sync/0.9.1_notebooks/02-configure-api-and-sync.ipynb new file mode 100644 index 00000000000..ad7bf7a823a --- /dev/null +++ b/notebooks/scenarios/bigquery/upgradability/sync/0.9.1_notebooks/02-configure-api-and-sync.ipynb @@ -0,0 +1,611 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# !pip install db-dtypes google-cloud-bigquery" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "metadata": {} + }, + "outputs": [], + "source": [ + "# stdlib\n", + "\n", + "# third party\n", + "# set to use the live APIs\n", + "# import os\n", + "# os.environ[\"TEST_BIGQUERY_APIS_LIVE\"] = \"True\"\n", + "from apis import make_schema\n", + "from apis import make_submit_query\n", + "from apis import make_test_query" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "metadata": {} + }, + "outputs": [], + "source": [ + "# syft absolute\n", + "import syft as sy\n", + "from syft import test_settings" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "metadata": {} + }, + "outputs": [], + "source": [ + "server_low = sy.orchestra.launch(\n", + " name=\"bigquery-low\",\n", + " server_side_type=\"low\",\n", + " dev_mode=True,\n", + " n_consumers=1,\n", + " create_producer=True,\n", + " port=\"auto\",\n", + ")\n", + "\n", + "server_high = sy.orchestra.launch(\n", + " name=\"bigquery-high\",\n", + " server_side_type=\"high\",\n", + " dev_mode=True,\n", + " n_consumers=1,\n", + " create_producer=True,\n", + " port=\"auto\",\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "metadata": {} + }, + "outputs": [], + "source": [ + "low_client = server_low.login(email=\"info@openmined.org\", password=\"changethis\")\n", + "high_client = server_high.login(email=\"info@openmined.org\", password=\"changethis\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "metadata": {} + }, + "outputs": [], + "source": [ + "assert len(high_client.worker_pools.get_all()) == 2\n", + "assert len(low_client.worker_pools.get_all()) == 2" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "metadata": {} + }, + "outputs": [], + "source": [ + "this_worker_pool_name = \"bigquery-pool\"" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "metadata": {} + }, + "outputs": [], + "source": [ + "# !pip list | grep bigquery" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "metadata": {} + }, + "outputs": [], + "source": [ + "# !pip install db-dtypes google-cloud-bigquery" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Twin endpoints" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "metadata": {} + }, + "outputs": [], + "source": [ + "mock_func = make_test_query(\n", + " settings={\n", + " \"rate_limiter_enabled\": True,\n", + " \"calls_per_min\": 10,\n", + " }\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "metadata": {} + }, + "outputs": [], + "source": [ + "private_func = make_test_query(\n", + " settings={\n", + " \"rate_limiter_enabled\": False,\n", + " }\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "metadata": {} + }, + "outputs": [], + "source": [ + "new_endpoint = sy.TwinAPIEndpoint(\n", + " path=\"bigquery.test_query\",\n", + " description=\"This endpoint allows to query Bigquery storage via SQL queries.\",\n", + " private_function=private_func,\n", + " mock_function=mock_func,\n", + " worker_pool=this_worker_pool_name,\n", + ")\n", + "\n", + "high_client.custom_api.add(endpoint=new_endpoint)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "metadata": {} + }, + "outputs": [], + "source": [ + "# Here, we update the endpoint to timeout after 100s (rather the default of 60s)\n", + "high_client.api.services.api.update(\n", + " endpoint_path=\"bigquery.test_query\", endpoint_timeout=120\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "metadata": {} + }, + "outputs": [], + "source": [ + "high_client.api.services.api.update(\n", + " endpoint_path=\"bigquery.test_query\", hide_mock_definition=True\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "metadata": {} + }, + "outputs": [], + "source": [ + "schema_function = make_schema(\n", + " settings={\n", + " \"calls_per_min\": 5,\n", + " },\n", + " worker_pool=this_worker_pool_name,\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "metadata": {} + }, + "outputs": [], + "source": [ + "high_client.custom_api.add(endpoint=schema_function)\n", + "high_client.refresh()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "metadata": {} + }, + "outputs": [], + "source": [ + "dataset_1 = test_settings.get(\"dataset_1\", default=\"dataset_1\")\n", + "dataset_2 = test_settings.get(\"dataset_2\", default=\"dataset_2\")\n", + "table_1 = test_settings.get(\"table_1\", default=\"table_1\")\n", + "table_2 = test_settings.get(\"table_2\", default=\"table_2\")\n", + "table_2_col_id = test_settings.get(\"table_2_col_id\", default=\"table_id\")\n", + "table_2_col_score = test_settings.get(\"table_2_col_score\", default=\"colname\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Test mock version\n", + "result = high_client.api.services.bigquery.test_query.mock(\n", + " sql_query=f\"SELECT * FROM {dataset_1}.{table_1} LIMIT 10\"\n", + ")\n", + "result" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "high_client.api.services.bigquery.schema()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "submit_query_function = make_submit_query(\n", + " settings={}, worker_pool=this_worker_pool_name\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "high_client.custom_api.add(endpoint=submit_query_function)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "high_client.api.services.api.update(\n", + " endpoint_path=\"bigquery.submit_query\", hide_mock_definition=True\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "high_client.custom_api.api_endpoints()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "assert len(high_client.custom_api.api_endpoints()) == 3" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "assert (\n", + " high_client.api.services.bigquery.test_query\n", + " and high_client.api.services.bigquery.submit_query\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Test mock version\n", + "result = high_client.api.services.bigquery.test_query.mock(\n", + " sql_query=f\"SELECT * FROM {dataset_1}.{table_1} LIMIT 10\"\n", + ")\n", + "result" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Bug with the new Error PR: message printed multiple times. TODO clean up the duplicate exception messages.\n", + "\n", + "# Test mock version for wrong queries\n", + "with sy.raises(\n", + " sy.SyftException(public_message=\"*must be qualified with a dataset*\"), show=True\n", + "):\n", + " high_client.api.services.bigquery.test_query.mock(\n", + " sql_query=\"SELECT * FROM invalid_table LIMIT 1\"\n", + " )" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Test private version\n", + "result = high_client.api.services.bigquery.test_query.private(\n", + " sql_query=f\"SELECT * FROM {dataset_1}.{table_1} LIMIT 10\"\n", + ")\n", + "result" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Testing submit query\n", + "result = high_client.api.services.bigquery.submit_query(\n", + " func_name=\"my_func\",\n", + " query=f\"SELECT * FROM {dataset_1}.{table_1} LIMIT 1\",\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "assert \"Query submitted\" in result\n", + "result" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "job = high_client.code.my_func(blocking=False)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "job.result" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "job.wait()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# syft absolute\n", + "from syft.client.syncing import compare_clients\n", + "from syft.service.job.job_stash import Job\n", + "from syft.service.job.job_stash import JobStatus" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "def is_job_to_sync(batch):\n", + " if batch.status != \"NEW\":\n", + " return False\n", + " if not isinstance(batch.root.high_obj, Job):\n", + " return False\n", + " job = batch.root.high_obj\n", + " return job.status in (JobStatus.ERRORED, JobStatus.COMPLETED)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "def sync_new_objects(\n", + " from_client, to_client, dry_run: bool = True, private_data: bool = False\n", + "):\n", + " sim = \"Simulating \" if dry_run else \"\"\n", + " priv = \"WITH PRIVATE DATA\" if private_data else \"\"\n", + " print(f\"{sim}Syncing from {from_client.name} to {to_client.name} {priv}\")\n", + " changes = []\n", + " diff = compare_clients(\n", + " from_client=from_client, to_client=to_client, hide_usercode=False\n", + " )\n", + " if isinstance(diff, sy.SyftError):\n", + " return diff\n", + "\n", + " for batch in diff.batches:\n", + " try:\n", + " if is_job_to_sync(batch) or batch.status == \"NEW\":\n", + " w = batch.resolve(build_state=False)\n", + " if private_data:\n", + " w.click_share_all_private_data()\n", + " if not dry_run:\n", + " w.click_sync()\n", + " change_text = f\"Synced {batch.status} {batch.root_type.__name__}\"\n", + " if not dry_run:\n", + " changes.append(change_text)\n", + " else:\n", + " print(f\"Would have run: {change_text}\")\n", + " except Exception as e:\n", + " print(\"sync_new_objects\", e)\n", + " raise e\n", + " return changes" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "result = sync_new_objects(high_client, low_client)\n", + "result" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "result = sync_new_objects(high_client, low_client, dry_run=False)\n", + "result" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "assert [\n", + " \"Synced NEW TwinAPIEndpoint\",\n", + " \"Synced NEW TwinAPIEndpoint\",\n", + " \"Synced NEW TwinAPIEndpoint\",\n", + "] == result" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# widget = sy.sync(from_client=high_client, to_client=low_client, hide_usercode=False)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# # TODO: ignore private function from high side in diff\n", + "# widget" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# widget.click_sync(0)\n", + "# widget.click_sync(1)\n", + "# widget.click_sync(2)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Some internal helper methods\n", + "\n", + "# widget._share_all()\n", + "# widget._sync_all()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "server_high.land()\n", + "server_low.land()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.10.13" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/notebooks/scenarios/bigquery/upgradability/sync/0.9.1_notebooks/03-ds-submit-request.ipynb b/notebooks/scenarios/bigquery/upgradability/sync/0.9.1_notebooks/03-ds-submit-request.ipynb new file mode 100644 index 00000000000..8d6c0665dc7 --- /dev/null +++ b/notebooks/scenarios/bigquery/upgradability/sync/0.9.1_notebooks/03-ds-submit-request.ipynb @@ -0,0 +1,269 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# syft absolute\n", + "import syft as sy\n", + "from syft import test_settings" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Only low side server and login as DS" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "server_low = sy.orchestra.launch(\n", + " name=\"bigquery-low\",\n", + " server_side_type=\"low\",\n", + " dev_mode=True,\n", + " n_consumers=1,\n", + " create_producer=True,\n", + " port=\"auto\",\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "ds_client = server_low.login(\n", + " email=\"data_scientist@openmined.org\", password=\"verysecurepassword\"\n", + ")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Low side research" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "assert len(ds_client.custom_api.api_endpoints()) == 3" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "dataset_1 = test_settings.get(\"dataset_1\", default=\"dataset_1\")\n", + "dataset_2 = test_settings.get(\"dataset_2\", default=\"dataset_2\")\n", + "table_1 = test_settings.get(\"table_1\", default=\"table_1\")\n", + "table_2 = test_settings.get(\"table_2\", default=\"table_2\")\n", + "table_2_col_id = test_settings.get(\"table_2_col_id\", default=\"table_id\")\n", + "table_2_col_score = test_settings.get(\"table_2_col_score\", default=\"colname\")\n", + "query_limit_size = test_settings.get(\"query_limit_size\", default=10000)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "result = ds_client.api.services.bigquery.test_query.mock(\n", + " sql_query=f\"SELECT * from {dataset_2}.{table_2} limit 10\"\n", + ")\n", + "assert len(result) == 10" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "with sy.raises(sy.SyftException, show=True):\n", + " ds_client.api.services.bigquery.test_query.private(\n", + " sql_query=f\"SELECT * from {dataset_2}.{table_2} limit 10\"\n", + " )" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "res = ds_client.api.services.bigquery.schema()\n", + "# third party\n", + "import pandas as pd\n", + "\n", + "assert isinstance(res.get(), pd.DataFrame)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "FUNC_NAME = \"large_sample\"\n", + "LARGE_SAMPLE_QUERY = f\"SELECT * FROM {dataset_2}.{table_2} LIMIT {query_limit_size}\"" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "mock_res = ds_client.api.services.bigquery.test_query(sql_query=LARGE_SAMPLE_QUERY)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "submission = ds_client.api.services.bigquery.submit_query(\n", + " func_name=FUNC_NAME, query=LARGE_SAMPLE_QUERY\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "def extract_code_path(response):\n", + " # stdlib\n", + " import re\n", + "\n", + " pattern = r\"client\\.code\\.(\\w+)\\(\\)\"\n", + " match = re.search(pattern, str(response))\n", + " if match:\n", + " extracted_code = match.group(1)\n", + " return extracted_code\n", + " return None" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# why are we randomizing things here?\n", + "func_name = extract_code_path(submission)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "api_method = getattr(ds_client.code, func_name, None)\n", + "api_method" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# todo: this is very noisy, but it actually passes\n", + "with sy.raises(\n", + " sy.SyftException(\n", + " public_message=\"*Please wait for the admin to allow the execution of this code*\"\n", + " ),\n", + " show=True,\n", + "):\n", + " result = api_method(blocking=False)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "assert \"large_sample\" in func_name" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "api_method_2 = getattr(ds_client.code, func_name, None)\n", + "api_method_2" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "with sy.raises(\n", + " sy.SyftException(public_message=\"*Your code is waiting for approval*\"), show=True\n", + "):\n", + " result = api_method_2()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "server_low.land()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.10.13" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/notebooks/scenarios/bigquery/upgradability/sync/0.9.1_notebooks/04-do-review-requests.ipynb b/notebooks/scenarios/bigquery/upgradability/sync/0.9.1_notebooks/04-do-review-requests.ipynb new file mode 100644 index 00000000000..a4a632e2f13 --- /dev/null +++ b/notebooks/scenarios/bigquery/upgradability/sync/0.9.1_notebooks/04-do-review-requests.ipynb @@ -0,0 +1,422 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# syft absolute\n", + "import syft as sy\n", + "from syft.service.code.user_code import UserCode\n", + "from syft.service.request.request import Request" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "server_low = sy.orchestra.launch(\n", + " name=\"bigquery-low\",\n", + " server_side_type=\"low\",\n", + " dev_mode=True,\n", + " n_consumers=1,\n", + " create_producer=True,\n", + " port=\"auto\",\n", + ")\n", + "\n", + "server_high = sy.orchestra.launch(\n", + " name=\"bigquery-high\",\n", + " server_side_type=\"high\",\n", + " dev_mode=True,\n", + " n_consumers=1,\n", + " create_producer=True,\n", + " port=\"auto\",\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "low_client = server_low.login(email=\"info@openmined.org\", password=\"changethis\")\n", + "high_client = server_high.login(email=\"info@openmined.org\", password=\"changethis\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# # todo: this is way too noisy\n", + "# widget = sy.sync(from_client=low_client, to_client=high_client)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# widget" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# sync the users new request" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# syft absolute\n", + "from syft.client.syncing import compare_clients" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# syft absolute\n", + "from syft.service.job.job_stash import Job\n", + "from syft.service.job.job_stash import JobStatus" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "def is_job_to_sync(batch):\n", + " if batch.status != \"NEW\":\n", + " return False\n", + " if not isinstance(batch.root.high_obj, Job):\n", + " return False\n", + " job = batch.root.high_obj\n", + " return job.status in (JobStatus.ERRORED, JobStatus.COMPLETED)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "def sync_new_objects(\n", + " from_client, to_client, dry_run: bool = True, private_data: bool = False\n", + "):\n", + " sim = \"Simulating \" if dry_run else \"\"\n", + " priv = \"WITH PRIVATE DATA\" if private_data else \"\"\n", + " print(f\"{sim}Syncing from {from_client.name} to {to_client.name} {priv}\")\n", + " changes = []\n", + " diff = compare_clients(\n", + " from_client=from_client, to_client=to_client, hide_usercode=False\n", + " )\n", + " if isinstance(diff, sy.SyftError):\n", + " return diff\n", + "\n", + " for batch in diff.batches:\n", + " try:\n", + " if is_job_to_sync(batch) or batch.status == \"NEW\":\n", + " w = batch.resolve(build_state=False)\n", + " if private_data:\n", + " w.click_share_all_private_data()\n", + " if not dry_run:\n", + " w.click_sync()\n", + " change_text = f\"Synced {batch.status} {batch.root_type.__name__}\"\n", + " if not dry_run:\n", + " changes.append(change_text)\n", + " else:\n", + " print(f\"Would have run: {change_text}\")\n", + " except Exception as e:\n", + " print(\"sync_new_objects\", e)\n", + " raise e\n", + " return changes" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "sync_new_objects(low_client, high_client)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "result = sync_new_objects(low_client, high_client, dry_run=False, private_data=True)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "assert \"Synced NEW UserCode\" in result\n", + "assert \"Synced NEW Request\" in result" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "assert len(high_client.code.get_all()) == 2" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "requests = high_client.requests\n", + "requests" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "user_request = None" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "for request in requests:\n", + " if \"large_sample\" in getattr(\n", + " getattr(request, \"code\", None), \"service_func_name\", None\n", + " ):\n", + " user_request = request" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "assert user_request" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "def execute_request(client, request) -> dict:\n", + " if not isinstance(request, Request):\n", + " return \"This is not a request\"\n", + "\n", + " code = request.code\n", + " if not isinstance(code, UserCode):\n", + " return \"No usercode found\"\n", + "\n", + " func_name = request.code.service_func_name\n", + " api_func = getattr(client.code, func_name, None)\n", + " if api_func is None:\n", + " return \"Code name was not found on the client.\"\n", + "\n", + " job = api_func(blocking=False)\n", + " return job" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "job = execute_request(high_client, user_request)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "job" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "job.wait()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# # todo: this is way too noisy\n", + "# widget = sy.sync(from_client=high_client, to_client=low_client)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# widget" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "sync_new_objects(high_client, low_client)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "result = sync_new_objects(high_client, low_client, dry_run=False, private_data=True)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "assert \"Synced NEW Job\" in result" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "requests = low_client.requests\n", + "requests" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "user_request = None" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "for request in requests:\n", + " if \"large_sample\" in getattr(\n", + " getattr(request, \"code\", None), \"service_func_name\", None\n", + " ):\n", + " user_request = request" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "user_request.status" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "assert \"approved\" in str(user_request.status).lower()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "server_high.land()\n", + "server_low.land()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.10.13" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/notebooks/scenarios/bigquery/upgradability/sync/0.9.1_notebooks/05-ds-get-results.ipynb b/notebooks/scenarios/bigquery/upgradability/sync/0.9.1_notebooks/05-ds-get-results.ipynb new file mode 100644 index 00000000000..6981f1e7105 --- /dev/null +++ b/notebooks/scenarios/bigquery/upgradability/sync/0.9.1_notebooks/05-ds-get-results.ipynb @@ -0,0 +1,131 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# third party\n", + "import pandas as pd\n", + "\n", + "# syft absolute\n", + "import syft as sy\n", + "from syft import test_settings" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "server_low = sy.orchestra.launch(\n", + " name=\"bigquery-low\",\n", + " server_side_type=\"low\",\n", + " dev_mode=True,\n", + " n_consumers=1,\n", + " create_producer=True,\n", + " port=\"auto\",\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "ds_client = server_low.login(\n", + " email=\"data_scientist@openmined.org\", password=\"verysecurepassword\"\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "api_method = None\n", + "for code in ds_client.code:\n", + " if \"large_sample\" in code.service_func_name:\n", + " api_method = getattr(ds_client.code, code.service_func_name, None)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "job = api_method(blocking=False)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "res = job.wait().get()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "assert isinstance(res, pd.DataFrame)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "query_limit_size = test_settings.get(\"query_limit_size\", default=10000)\n", + "assert len(res) == query_limit_size" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "server_low.land()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.10.13" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/notebooks/scenarios/bigquery/upgradability/sync/0.9.1_notebooks/__init__.py b/notebooks/scenarios/bigquery/upgradability/sync/0.9.1_notebooks/__init__.py new file mode 100644 index 00000000000..e69de29bb2d diff --git a/notebooks/scenarios/bigquery/upgradability/sync/0.9.1_notebooks/apis/__init__.py b/notebooks/scenarios/bigquery/upgradability/sync/0.9.1_notebooks/apis/__init__.py new file mode 100644 index 00000000000..7231b580696 --- /dev/null +++ b/notebooks/scenarios/bigquery/upgradability/sync/0.9.1_notebooks/apis/__init__.py @@ -0,0 +1,23 @@ +# stdlib +import os + +# syft absolute +from syft.util.util import str_to_bool + +# relative +from .submit_query import make_submit_query + +env_var = "TEST_BIGQUERY_APIS_LIVE" +use_live = str_to_bool(str(os.environ.get(env_var, "False"))) +env_name = "Live" if use_live else "Mock" +print(f"Using {env_name} API Code, this will query BigQuery. ${env_var}=={use_live}") + + +if use_live: + # relative + from .live.schema import make_schema + from .live.test_query import make_test_query +else: + # relative + from .mock.schema import make_schema + from .mock.test_query import make_test_query diff --git a/notebooks/scenarios/bigquery/upgradability/sync/0.9.1_notebooks/apis/live/__init__.py b/notebooks/scenarios/bigquery/upgradability/sync/0.9.1_notebooks/apis/live/__init__.py new file mode 100644 index 00000000000..e69de29bb2d diff --git a/notebooks/scenarios/bigquery/upgradability/sync/0.9.1_notebooks/apis/live/schema.py b/notebooks/scenarios/bigquery/upgradability/sync/0.9.1_notebooks/apis/live/schema.py new file mode 100644 index 00000000000..5b39d9d9066 --- /dev/null +++ b/notebooks/scenarios/bigquery/upgradability/sync/0.9.1_notebooks/apis/live/schema.py @@ -0,0 +1,108 @@ +# stdlib +from collections.abc import Callable + +# syft absolute +import syft as sy +from syft import test_settings + +# relative +from ..rate_limiter import is_within_rate_limit + + +def make_schema(settings: dict, worker_pool: str) -> Callable: + updated_settings = { + "calls_per_min": 5, + "rate_limiter_enabled": True, + "credentials": test_settings.gce_service_account.to_dict(), + "region": test_settings.gce_region, + "project_id": test_settings.gce_project_id, + "dataset_1": test_settings.dataset_1, + "table_1": test_settings.table_1, + "table_2": test_settings.table_2, + } | settings + + @sy.api_endpoint( + path="bigquery.schema", + description="This endpoint allows for visualising the metadata of tables available in BigQuery.", + settings=updated_settings, + helper_functions=[ + is_within_rate_limit + ], # Adds ratelimit as this is also a method available to data scientists + worker_pool=worker_pool, + ) + def live_schema( + context, + ) -> str: + # stdlib + import datetime + + # third party + from google.cloud import bigquery # noqa: F811 + from google.oauth2 import service_account + import pandas as pd + + # syft absolute + from syft import SyftException + + # Auth for Bigquer based on the workload identity + credentials = service_account.Credentials.from_service_account_info( + context.settings["credentials"] + ) + scoped_credentials = credentials.with_scopes( + ["https://www.googleapis.com/auth/cloud-platform"] + ) + + client = bigquery.Client( + credentials=scoped_credentials, + location=context.settings["region"], + ) + + # Store a dict with the calltimes for each user, via the email. + if context.settings["rate_limiter_enabled"]: + if context.user.email not in context.state.keys(): + context.state[context.user.email] = [] + + if not context.code.is_within_rate_limit(context): + raise SyftException( + public_message="Rate limit of calls per minute has been reached." + ) + context.state[context.user.email].append(datetime.datetime.now()) + + try: + # Formats the data schema in a data frame format + # Warning: the only supported format types are primitives, np.ndarrays and pd.DataFrames + + data_schema = [] + for table_id in [ + f"{context.settings['dataset_1']}.{context.settings['table_1']}", + f"{context.settings['dataset_1']}.{context.settings['table_2']}", + ]: + table = client.get_table(table_id) + for schema in table.schema: + data_schema.append( + { + "project": str(table.project), + "dataset_id": str(table.dataset_id), + "table_id": str(table.table_id), + "schema_name": str(schema.name), + "schema_field": str(schema.field_type), + "description": str(table.description), + "num_rows": str(table.num_rows), + } + ) + return pd.DataFrame(data_schema) + + except Exception as e: + # not a bigquery exception + if not hasattr(e, "_errors"): + output = f"got exception e: {type(e)} {str(e)}" + raise SyftException( + public_message=f"An error occured executing the API call {output}" + ) + + # Should add appropriate error handling for what should be exposed to the data scientists. + raise SyftException( + public_message="An error occured executing the API call, please contact the domain owner." + ) + + return live_schema diff --git a/notebooks/scenarios/bigquery/upgradability/sync/0.9.1_notebooks/apis/live/test_query.py b/notebooks/scenarios/bigquery/upgradability/sync/0.9.1_notebooks/apis/live/test_query.py new file mode 100644 index 00000000000..344879dcb62 --- /dev/null +++ b/notebooks/scenarios/bigquery/upgradability/sync/0.9.1_notebooks/apis/live/test_query.py @@ -0,0 +1,113 @@ +# stdlib +from collections.abc import Callable + +# syft absolute +import syft as sy +from syft import test_settings + +# relative +from ..rate_limiter import is_within_rate_limit + + +def make_test_query(settings) -> Callable: + updated_settings = { + "calls_per_min": 10, + "rate_limiter_enabled": True, + "credentials": test_settings.gce_service_account.to_dict(), + "region": test_settings.gce_region, + "project_id": test_settings.gce_project_id, + } | settings + + # these are the same if you allow the rate limiter to be turned on and off + @sy.api_endpoint_method( + settings=updated_settings, + helper_functions=[is_within_rate_limit], + ) + def live_test_query( + context, + sql_query: str, + ) -> str: + # stdlib + import datetime + + # third party + from google.cloud import bigquery # noqa: F811 + from google.oauth2 import service_account + + # syft absolute + from syft import SyftException + + # Auth for Bigquer based on the workload identity + credentials = service_account.Credentials.from_service_account_info( + context.settings["credentials"] + ) + scoped_credentials = credentials.with_scopes( + ["https://www.googleapis.com/auth/cloud-platform"] + ) + + client = bigquery.Client( + credentials=scoped_credentials, + location=context.settings["region"], + ) + + # Store a dict with the calltimes for each user, via the email. + if context.settings["rate_limiter_enabled"]: + if context.user.email not in context.state.keys(): + context.state[context.user.email] = [] + + if not context.code.is_within_rate_limit(context): + raise SyftException( + public_message="Rate limit of calls per minute has been reached." + ) + context.state[context.user.email].append(datetime.datetime.now()) + + try: + rows = client.query_and_wait( + sql_query, + project=context.settings["project_id"], + ) + + if rows.total_rows > 1_000_000: + raise SyftException( + public_message="Please only write queries that gather aggregate statistics" + ) + + return rows.to_dataframe() + + except Exception as e: + # not a bigquery exception + if not hasattr(e, "_errors"): + output = f"got exception e: {type(e)} {str(e)}" + raise SyftException( + public_message=f"An error occured executing the API call {output}" + ) + + # Treat all errors that we would like to be forwarded to the data scientists + # By default, any exception is only visible to the data owner. + + if e._errors[0]["reason"] in [ + "badRequest", + "blocked", + "duplicate", + "invalidQuery", + "invalid", + "jobBackendError", + "jobInternalError", + "notFound", + "notImplemented", + "rateLimitExceeded", + "resourceInUse", + "resourcesExceeded", + "tableUnavailable", + "timeout", + ]: + raise SyftException( + public_message="Error occured during the call: " + + e._errors[0]["message"] + ) + else: + raise SyftException( + public_message="An error occured executing the API call, please contact the domain owner." + ) + + return live_test_query diff --git a/notebooks/scenarios/bigquery/upgradability/sync/0.9.1_notebooks/apis/mock/__init__.py b/notebooks/scenarios/bigquery/upgradability/sync/0.9.1_notebooks/apis/mock/__init__.py new file mode 100644 index 00000000000..e69de29bb2d diff --git a/notebooks/scenarios/bigquery/upgradability/sync/0.9.1_notebooks/apis/mock/data.py b/notebooks/scenarios/bigquery/upgradability/sync/0.9.1_notebooks/apis/mock/data.py new file mode 100644 index 00000000000..82262bf7a01 --- /dev/null +++ b/notebooks/scenarios/bigquery/upgradability/sync/0.9.1_notebooks/apis/mock/data.py @@ -0,0 +1,268 @@ +# stdlib +from math import nan + +schema_dict = { + "project": { + 0: "example-project", + 1: "example-project", + 2: "example-project", + 3: "example-project", + 4: "example-project", + 5: "example-project", + 6: "example-project", + 7: "example-project", + 8: "example-project", + 9: "example-project", + 10: "example-project", + 11: "example-project", + 12: "example-project", + 13: "example-project", + 14: "example-project", + 15: "example-project", + 16: "example-project", + 17: "example-project", + 18: "example-project", + 19: "example-project", + 20: "example-project", + 21: "example-project", + 22: "example-project", + }, + "dataset_id": { + 0: "test_1gb", + 1: "test_1gb", + 2: "test_1gb", + 3: "test_1gb", + 4: "test_1gb", + 5: "test_1gb", + 6: "test_1gb", + 7: "test_1gb", + 8: "test_1gb", + 9: "test_1gb", + 10: "test_1gb", + 11: "test_1gb", + 12: "test_1gb", + 13: "test_1gb", + 14: "test_1gb", + 15: "test_1gb", + 16: "test_1gb", + 17: "test_1gb", + 18: "test_1gb", + 19: "test_1gb", + 20: "test_1gb", + 21: "test_1gb", + 22: "test_1gb", + }, + "table_id": { + 0: "posts", + 1: "posts", + 2: "posts", + 3: "posts", + 4: "posts", + 5: "posts", + 6: "posts", + 7: "comments", + 8: "comments", + 9: "comments", + 10: "comments", + 11: "comments", + 12: "comments", + 13: "comments", + 14: "comments", + 15: "comments", + 16: "comments", + 17: "comments", + 18: "comments", + 19: "comments", + 20: "comments", + 21: "comments", + 22: "comments", + }, + "schema_name": { + 0: "int64_field_0", + 1: "id", + 2: "name", + 3: "subscribers_count", + 4: "permalink", + 5: "nsfw", + 6: "spam", + 7: "int64_field_0", + 8: "id", + 9: "body", + 10: "parent_id", + 11: "created_at", + 12: "last_modified_at", + 13: "gilded", + 14: "permalink", + 15: "score", + 16: "comment_id", + 17: "post_id", + 18: "author_id", + 19: "spam", + 20: "deleted", + 21: "upvote_raio", + 22: "collapsed_in_crowd_control", + }, + "schema_field": { + 0: "INTEGER", + 1: "STRING", + 2: "STRING", + 3: "INTEGER", + 4: "STRING", + 5: "FLOAT", + 6: "BOOLEAN", + 7: "INTEGER", + 8: "STRING", + 9: "STRING", + 10: "STRING", + 11: "INTEGER", + 12: "INTEGER", + 13: "BOOLEAN", + 14: "STRING", + 15: "INTEGER", + 16: "STRING", + 17: "STRING", + 18: "STRING", + 19: "BOOLEAN", + 20: "BOOLEAN", + 21: "FLOAT", + 22: "BOOLEAN", + }, + "description": { + 0: "None", + 1: "None", + 2: "None", + 3: "None", + 4: "None", + 5: "None", + 6: "None", + 7: "None", + 8: "None", + 9: "None", + 10: "None", + 11: "None", + 12: "None", + 13: "None", + 14: "None", + 15: "None", + 16: "None", + 17: "None", + 18: "None", + 19: "None", + 20: "None", + 21: "None", + 22: "None", + }, + "num_rows": { + 0: "2000000", + 1: "2000000", + 2: "2000000", + 3: "2000000", + 4: "2000000", + 5: "2000000", + 6: "2000000", + 7: "2000000", + 8: "2000000", + 9: "2000000", + 10: "2000000", + 11: "2000000", + 12: "2000000", + 13: "2000000", + 14: "2000000", + 15: "2000000", + 16: "2000000", + 17: "2000000", + 18: "2000000", + 19: "2000000", + 20: "2000000", + 21: "2000000", + 22: "2000000", + }, +} + + +query_dict = { + "int64_field_0": { + 0: 4, + 1: 5, + 2: 10, + 3: 16, + 4: 17, + 5: 23, + 6: 24, + 7: 25, + 8: 27, + 9: 40, + }, + "id": { + 0: "t5_via1x", + 1: "t5_cv9gn", + 2: "t5_8p2tq", + 3: "t5_8fcro", + 4: "t5_td5of", + 5: "t5_z01fv", + 6: "t5_hmqjk", + 7: "t5_1flyj", + 8: "t5_5rwej", + 9: "t5_uurcv", + }, + "name": { + 0: "/channel/mylittlepony", + 1: "/channel/polyamory", + 2: "/channel/Catholicism", + 3: "/channel/cordcutters", + 4: "/channel/stevenuniverse", + 5: "/channel/entitledbitch", + 6: "/channel/engineering", + 7: "/channel/nottheonion", + 8: "/channel/FoodPorn", + 9: "/channel/puppysmiles", + }, + "subscribers_count": { + 0: 4323081, + 1: 2425929, + 2: 4062607, + 3: 7543226, + 4: 2692168, + 5: 2709080, + 6: 8766144, + 7: 2580984, + 8: 7784809, + 9: 3715991, + }, + "permalink": { + 0: "/channel//channel/mylittlepony", + 1: "/channel//channel/polyamory", + 2: "/channel//channel/Catholicism", + 3: "/channel//channel/cordcutters", + 4: "/channel//channel/stevenuniverse", + 5: "/channel//channel/entitledbitch", + 6: "/channel//channel/engineering", + 7: "/channel//channel/nottheonion", + 8: "/channel//channel/FoodPorn", + 9: "/channel//channel/puppysmiles", + }, + "nsfw": { + 0: nan, + 1: nan, + 2: nan, + 3: nan, + 4: nan, + 5: nan, + 6: nan, + 7: nan, + 8: nan, + 9: nan, + }, + "spam": { + 0: False, + 1: False, + 2: False, + 3: False, + 4: False, + 5: False, + 6: False, + 7: False, + 8: False, + 9: False, + }, +} diff --git a/notebooks/scenarios/bigquery/upgradability/sync/0.9.1_notebooks/apis/mock/schema.py b/notebooks/scenarios/bigquery/upgradability/sync/0.9.1_notebooks/apis/mock/schema.py new file mode 100644 index 00000000000..a95e04f2f1d --- /dev/null +++ b/notebooks/scenarios/bigquery/upgradability/sync/0.9.1_notebooks/apis/mock/schema.py @@ -0,0 +1,52 @@ +# stdlib +from collections.abc import Callable + +# syft absolute +import syft as sy + +# relative +from ..rate_limiter import is_within_rate_limit +from .data import schema_dict + + +def make_schema(settings, worker_pool) -> Callable: + updated_settings = { + "calls_per_min": 5, + "rate_limiter_enabled": True, + "schema_dict": schema_dict, + } | settings + + @sy.api_endpoint( + path="bigquery.schema", + description="This endpoint allows for visualising the metadata of tables available in BigQuery.", + settings=updated_settings, + helper_functions=[is_within_rate_limit], + worker_pool=worker_pool, + ) + def mock_schema( + context, + ) -> str: + # syft absolute + from syft import SyftException + + # Store a dict with the calltimes for each user, via the email. + if context.settings["rate_limiter_enabled"]: + # stdlib + import datetime + + if context.user.email not in context.state.keys(): + context.state[context.user.email] = [] + + if not context.code.is_within_rate_limit(context): + raise SyftException( + public_message="Rate limit of calls per minute has been reached." + ) + context.state[context.user.email].append(datetime.datetime.now()) + + # third party + import pandas as pd + + df = pd.DataFrame(context.settings["schema_dict"]) + return df + + return mock_schema diff --git a/notebooks/scenarios/bigquery/upgradability/sync/0.9.1_notebooks/apis/mock/test_query.py b/notebooks/scenarios/bigquery/upgradability/sync/0.9.1_notebooks/apis/mock/test_query.py new file mode 100644 index 00000000000..ae028a8cf36 --- /dev/null +++ b/notebooks/scenarios/bigquery/upgradability/sync/0.9.1_notebooks/apis/mock/test_query.py @@ -0,0 +1,138 @@ +# stdlib +from collections.abc import Callable + +# syft absolute +import syft as sy + +# relative +from ..rate_limiter import is_within_rate_limit +from .data import query_dict + + +def extract_limit_value(sql_query: str) -> int: + # stdlib + import re + + limit_pattern = re.compile(r"\bLIMIT\s+(\d+)\b", re.IGNORECASE) + match = limit_pattern.search(sql_query) + if match: + return int(match.group(1)) + return None + + +def is_valid_sql(query: str) -> bool: + # stdlib + import sqlite3 + + # Prepare an in-memory SQLite database + conn = sqlite3.connect(":memory:") + cursor = conn.cursor() + + try: + # Use the EXPLAIN QUERY PLAN command to get the query plan + cursor.execute(f"EXPLAIN QUERY PLAN {query}") + except sqlite3.Error as e: + if "no such table" in str(e).lower(): + return True + return False + finally: + conn.close() + + +def adjust_dataframe_rows(df, target_rows: int): + # third party + import pandas as pd + + current_rows = len(df) + + if target_rows > current_rows: + # Repeat rows to match target_rows + repeat_times = (target_rows + current_rows - 1) // current_rows + df_expanded = pd.concat([df] * repeat_times, ignore_index=True).head( + target_rows + ) + else: + # Truncate rows to match target_rows + df_expanded = df.head(target_rows) + + return df_expanded + + +def make_test_query(settings: dict) -> Callable: + updated_settings = { + "calls_per_min": 10, + "rate_limiter_enabled": True, + "query_dict": query_dict, + } | settings + + # these are the same if you allow the rate limiter to be turned on and off + @sy.api_endpoint_method( + settings=updated_settings, + helper_functions=[ + is_within_rate_limit, + extract_limit_value, + is_valid_sql, + adjust_dataframe_rows, + ], + ) + def mock_test_query( + context, + sql_query: str, + ) -> str: + # stdlib + import datetime + + # third party + from google.api_core.exceptions import BadRequest + + # syft absolute + from syft import SyftException + + # Store a dict with the calltimes for each user, via the email. + if context.settings["rate_limiter_enabled"]: + if context.user.email not in context.state.keys(): + context.state[context.user.email] = [] + + if not context.code.is_within_rate_limit(context): + raise SyftException( + public_message="Rate limit of calls per minute has been reached." + ) + context.state[context.user.email].append(datetime.datetime.now()) + + bad_table = "invalid_table" + bad_post = ( + "BadRequest: 400 POST " + "https://bigquery.googleapis.com/bigquery/v2/projects/project-id/" + "queries?prettyPrint=false: " + ) + if bad_table in sql_query: + try: + raise BadRequest( + f'{bad_post} Table "{bad_table}" must be qualified ' + "with a dataset (e.g. dataset.table)." + ) + except Exception as e: + raise SyftException( + public_message=f"*must be qualified with a dataset*. {e}" + ) + + if not context.code.is_valid_sql(sql_query): + raise BadRequest( + f'{bad_post} Syntax error: Unexpected identifier "{sql_query}" at [1:1]' + ) + + # third party + import pandas as pd + + limit = context.code.extract_limit_value(sql_query) + if limit > 1_000_000: + raise SyftException( + public_message="Please only write queries that gather aggregate statistics" + ) + + base_df = pd.DataFrame(context.settings["query_dict"]) + + df = context.code.adjust_dataframe_rows(base_df, limit) + return df + + return mock_test_query diff --git a/notebooks/scenarios/bigquery/upgradability/sync/0.9.1_notebooks/apis/rate_limiter.py b/notebooks/scenarios/bigquery/upgradability/sync/0.9.1_notebooks/apis/rate_limiter.py new file mode 100644 index 00000000000..8ce319b61f4 --- /dev/null +++ b/notebooks/scenarios/bigquery/upgradability/sync/0.9.1_notebooks/apis/rate_limiter.py @@ -0,0 +1,16 @@ +def is_within_rate_limit(context) -> bool: + """Rate limiter for custom API calls made by users.""" + # stdlib + import datetime + + state = context.state + settings = context.settings + email = context.user.email + + current_time = datetime.datetime.now() + calls_last_min = [ + 1 if (current_time - call_time).seconds < 60 else 0 + for call_time in state[email] + ] + + return sum(calls_last_min) < settings.get("calls_per_min", 5) diff --git a/notebooks/scenarios/bigquery/upgradability/sync/0.9.1_notebooks/apis/submit_query.py b/notebooks/scenarios/bigquery/upgradability/sync/0.9.1_notebooks/apis/submit_query.py new file mode 100644 index 00000000000..a0125ee009b --- /dev/null +++ b/notebooks/scenarios/bigquery/upgradability/sync/0.9.1_notebooks/apis/submit_query.py @@ -0,0 +1,42 @@ +# syft absolute +import syft as sy + + +def make_submit_query(settings, worker_pool): + updated_settings = {"user_code_worker": worker_pool} | settings + + @sy.api_endpoint( + path="bigquery.submit_query", + description="API endpoint that allows you to submit SQL queries to run on the private data.", + worker_pool=worker_pool, + settings=updated_settings, + ) + def submit_query( + context, + func_name: str, + query: str, + ) -> str: + # syft absolute + import syft as sy + + @sy.syft_function( + name=func_name, + input_policy=sy.MixedInputPolicy( + endpoint=sy.Constant( + val=context.admin_client.api.services.bigquery.test_query + ), + query=sy.Constant(val=query), + client=context.admin_client, + ), + worker_pool_name=context.settings["user_code_worker"], + ) + def execute_query(query: str, endpoint): + res = endpoint(sql_query=query) + return res + + request = context.user_client.code.request_code_execution(execute_query) + context.admin_client.requests.set_tags(request, ["autosync"]) + + return f"Query submitted {request}. Use `client.code.{func_name}()` to run your query" + + return submit_query diff --git a/notebooks/scenarios/bigquery/upgradability/sync/0.9.1_notebooks/sync_helpers.py b/notebooks/scenarios/bigquery/upgradability/sync/0.9.1_notebooks/sync_helpers.py new file mode 100644 index 00000000000..e1d558016ba --- /dev/null +++ b/notebooks/scenarios/bigquery/upgradability/sync/0.9.1_notebooks/sync_helpers.py @@ -0,0 +1,190 @@ +# third party +from tqdm import tqdm + +# syft absolute +import syft as sy +from syft.client.datasite_client import DatasiteClient +from syft.client.syncing import compare_clients +from syft.service.code.user_code import UserCode +from syft.service.job.job_stash import Job +from syft.service.job.job_stash import JobStatus +from syft.service.request.request import Request +from syft.service.request.request import RequestStatus +from syft.service.sync.diff_state import ObjectDiffBatch +from syft.types.result import Err + + +def deny_requests_without_autosync_tag(client_low: DatasiteClient): + # Deny all requests that are not autosync + requests = client_low.requests.get_all() + if isinstance(requests, sy.SyftError): + print(requests) + return + + denied_requests = [] + for request in tqdm(requests): + if request.status != RequestStatus.PENDING: + continue + if "autosync" not in request.tags: + request.deny( + reason="This request has been denied automatically. " + "Please use the designated API to submit your request." + ) + denied_requests.append(request.id) + print(f"Denied {len(denied_requests)} requests without autosync tag") + + +def is_request_to_sync(batch: ObjectDiffBatch) -> bool: + # True if this is a new low-side request + # TODO add condition for sql requests/usercodes + low_request = batch.root.low_obj + return ( + isinstance(low_request, Request) + and batch.status == "NEW" + and "autosync" in low_request.tags + ) + + +def is_job_to_sync(batch: ObjectDiffBatch): + # True if this is a new high-side job that is either COMPLETED or ERRORED + if batch.status != "NEW": + return False + if not isinstance(batch.root.high_obj, Job): + return False + job = batch.root.high_obj + return job.status in (JobStatus.ERRORED, JobStatus.COMPLETED) + + +def execute_requests( + client_high: DatasiteClient, request_ids: list[sy.UID] +) -> dict[sy.UID, Job]: + jobs_by_request_id = {} + for request_id in request_ids: + request = client_high.requests.get_by_uid(request_id) + if not isinstance(request, Request): + continue + + code = request.code + if not isinstance(code, UserCode): + continue + + func_name = request.code.service_func_name + api_func = getattr(client_high.code, func_name, None) + if api_func is None: + continue + + job = api_func(blocking=False) + jobs_by_request_id[request_id] = job + + return jobs_by_request_id + + +def deny_failed_jobs( + client_low: DatasiteClient, + jobs: list[Job], +) -> None: + # NOTE no syncing is needed, requests are denied on the low side + denied_requests = [] + + for job in jobs: + if job.status != JobStatus.ERRORED: + continue + + error_result = job.result + if isinstance(error_result, Err): + error_msg = error_result.err_value + else: + error_msg = "An unknown error occurred, please check the Job logs for more information." + + code_id = job.user_code_id + if code_id is None: + continue + requests = client_low.requests.get_by_usercode_id(code_id) + if isinstance(requests, list) and len(requests) > 0: + request = requests[0] + request.deny(reason=f"Execution failed: {error_msg}") + denied_requests.append(request.id) + else: + print(f"Failed to deny request for job {job.id}") + + print(f"Denied {len(denied_requests)} failed requests") + + +def sync_finished_jobs( + client_low: DatasiteClient, + client_high: DatasiteClient, +) -> dict[sy.UID, sy.SyftError | sy.SyftSuccess] | sy.SyftError: + sync_job_results = {} + synced_jobs = [] + diff = compare_clients( + from_client=client_high, to_client=client_low, include_types=["job"] + ) + if isinstance(diff, sy.SyftError): + print(diff) + return diff + + for batch in diff.batches: + if is_job_to_sync(batch): + job = batch.root.high_obj + + w = batch.resolve(build_state=False) + share_result = w.click_share_all_private_data() + if isinstance(share_result, sy.SyftError): + sync_job_results[job.id] = share_result + continue + sync_result = w.click_sync() + + synced_jobs.append(job) + sync_job_results[job.id] = sync_result + + print(f"Sharing {len(sync_job_results)} new results") + deny_failed_jobs(client_low, synced_jobs) + return sync_job_results + + +def sync_new_requests( + client_low: DatasiteClient, + client_high: DatasiteClient, +) -> dict[sy.UID, sy.SyftSuccess | sy.SyftError] | sy.SyftError: + sync_request_results = {} + diff = compare_clients( + from_client=client_low, to_client=client_high, include_types=["request"] + ) + if isinstance(diff, sy.SyftError): + print(diff) + return sync_request_results + print(f"{len(diff.batches)} request batches found") + for batch in tqdm(diff.batches): + if is_request_to_sync(batch): + request_id = batch.root.low_obj.id + w = batch.resolve(build_state=False) + result = w.click_sync() + sync_request_results[request_id] = result + return sync_request_results + + +def sync_and_execute_new_requests( + client_low: DatasiteClient, client_high: DatasiteClient +) -> None: + sync_results = sync_new_requests(client_low, client_high) + if isinstance(sync_results, sy.SyftError): + print(sync_results) + return + + request_ids = [ + uid for uid, res in sync_results.items() if isinstance(res, sy.SyftSuccess) + ] + print(f"Synced {len(request_ids)} new requests") + + jobs_by_request = execute_requests(client_high, request_ids) + print(f"Started {len(jobs_by_request)} new jobs") + + +def auto_sync(client_low: DatasiteClient, client_high: DatasiteClient) -> None: + print("Starting auto sync") + print("Denying non tagged jobs") + deny_requests_without_autosync_tag(client_low) + print("Syncing and executing") + sync_and_execute_new_requests(client_low, client_high) + sync_finished_jobs(client_low, client_high) + print("Finished auto sync") diff --git a/notebooks/scenarios/bigquery/upgradability/sync/1-dump-database-to-file.ipynb b/notebooks/scenarios/bigquery/upgradability/sync/1-dump-database-to-file.ipynb new file mode 100644 index 00000000000..09b02ee5ddd --- /dev/null +++ b/notebooks/scenarios/bigquery/upgradability/sync/1-dump-database-to-file.ipynb @@ -0,0 +1,201 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": null, + "id": "0", + "metadata": {}, + "outputs": [], + "source": [ + "# stdlib\n", + "import os\n", + "from pathlib import Path\n", + "\n", + "# syft absolute\n", + "import syft as sy" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "1", + "metadata": {}, + "outputs": [], + "source": [ + "server_low = sy.orchestra.launch(\n", + " name=\"bigquery-low\",\n", + " server_side_type=\"low\",\n", + " dev_mode=True,\n", + " n_consumers=1,\n", + " create_producer=True,\n", + " port=\"auto\",\n", + ")\n", + "\n", + "server_high = sy.orchestra.launch(\n", + " name=\"bigquery-high\",\n", + " server_side_type=\"high\",\n", + " dev_mode=True,\n", + " n_consumers=1,\n", + " create_producer=True,\n", + " port=\"auto\",\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "2", + "metadata": {}, + "outputs": [], + "source": [ + "low_client = server_low.login(email=\"info@openmined.org\", password=\"changethis\")\n", + "high_client = server_high.login(email=\"info@openmined.org\", password=\"changethis\")" + ] + }, + { + "cell_type": "markdown", + "id": "3", + "metadata": {}, + "source": [ + "# Dump low side" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "4", + "metadata": {}, + "outputs": [], + "source": [ + "migration_data_dir = Path(os.getenv(\"MIGRATION_DATA_DIR\", \".\"))\n", + "migration_data_dir.mkdir(exist_ok=True)\n", + "\n", + "low_blob_path = migration_data_dir / \"migration_low.blob\"\n", + "low_yaml_path = migration_data_dir / \"migration_low.yaml\"\n", + "\n", + "low_blob_path.unlink(missing_ok=True)\n", + "low_yaml_path.unlink(missing_ok=True)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "5", + "metadata": {}, + "outputs": [], + "source": [ + "# Dump low state\n", + "\n", + "low_migration_data = low_client.get_migration_data(include_blobs=True)\n", + "low_migration_data" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "6", + "metadata": {}, + "outputs": [], + "source": [ + "low_migration_data.save(path=low_blob_path, yaml_path=low_yaml_path)" + ] + }, + { + "cell_type": "markdown", + "id": "7", + "metadata": {}, + "source": [ + "# Dump high side" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "8", + "metadata": {}, + "outputs": [], + "source": [ + "high_blob_path = migration_data_dir / \"migration_high.blob\"\n", + "high_yaml_path = migration_data_dir / \"migration_high.yaml\"\n", + "\n", + "high_blob_path.unlink(missing_ok=True)\n", + "high_yaml_path.unlink(missing_ok=True)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "9", + "metadata": {}, + "outputs": [], + "source": [ + "high_migration_data = high_client.get_migration_data(include_blobs=True)\n", + "high_migration_data" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "10", + "metadata": {}, + "outputs": [], + "source": [ + "high_migration_data.save(path=high_blob_path, yaml_path=high_yaml_path)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "11", + "metadata": {}, + "outputs": [], + "source": [ + "for path in (low_blob_path, low_yaml_path, high_blob_path, high_yaml_path):\n", + " assert path.exists(), f\"Migration file {path} does not exist\"" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "12", + "metadata": {}, + "outputs": [], + "source": [ + "if server_high.server_type.value == \"python\":\n", + " server_high.land()\n", + "\n", + "if server_low.server_type.value == \"python\":\n", + " server_low.land()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "13", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.10.13" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/notebooks/scenarios/bigquery/upgradability/sync/2-migrate-for-scenarios.ipynb b/notebooks/scenarios/bigquery/upgradability/sync/2-migrate-for-scenarios.ipynb new file mode 100644 index 00000000000..326eb8c62cd --- /dev/null +++ b/notebooks/scenarios/bigquery/upgradability/sync/2-migrate-for-scenarios.ipynb @@ -0,0 +1,403 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# stdlib\n", + "import os\n", + "from os import environ as env\n", + "from pathlib import Path\n", + "\n", + "# syft absolute\n", + "import syft as sy" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# stdlib\n", + "import sys\n", + "\n", + "# syft absolute\n", + "from syft.util.util import find_base_dir_with_tox_ini\n", + "from syft.util.util import get_caller_file_path\n", + "from syft.util.util import is_interpreter_jupyter\n", + "\n", + "\n", + "def add_helper_path_to_python_path() -> None:\n", + " current_path = \".\"\n", + "\n", + " # jupyter uses \".\" which resolves to the notebook\n", + " if not is_interpreter_jupyter():\n", + " # python uses the file which has from syft import test_settings in it\n", + " import_path = get_caller_file_path()\n", + " if import_path:\n", + " current_path = import_path\n", + "\n", + " base_dir = find_base_dir_with_tox_ini(current_path)\n", + " notebook_helper_path = os.path.join(base_dir, \"notebooks/notebook_helpers\")\n", + " sys.path.append(notebook_helper_path)\n", + "\n", + "\n", + "add_helper_path_to_python_path()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# third party\n", + "from email_helpers import load_users\n", + "from job_helpers import load_jobs" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# when in k8s these are the default values\n", + "ROOT_EMAIL = \"admin@bigquery.org\"\n", + "ROOT_PASSWORD = \"bqpw\"" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# in case we are not in k8s we set them here for orchestra to use\n", + "env[\"DEFAULT_ROOT_EMAIL\"] = ROOT_EMAIL\n", + "env[\"DEFAULT_ROOT_PASSWORD\"] = ROOT_PASSWORD" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Login" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "server = sy.orchestra.launch(\n", + " name=\"bigquery-high\",\n", + " dev_mode=True,\n", + " server_side_type=\"high\",\n", + " reset=True,\n", + " port=\"8080\",\n", + " n_consumers=1, # How many workers to be spawned\n", + " create_producer=True, # Can produce more workers\n", + ")\n", + "\n", + "client = sy.login(url=\"http://localhost:8080\", email=ROOT_EMAIL, password=ROOT_PASSWORD)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Check if this is a new server\n", + "migration_data = client.get_migration_data()\n", + "\n", + "# assert len(migration_data.store_objects[User]) == 1\n", + "# assert UserCode not in migration_data.store_objects" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "migration_data" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Load migration data" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "!pwd" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# migration_data_dir = Path(os.getenv(\"MIGRATION_DATA_DIR\", \".\"))\n", + "migration_data_dir = Path(\"/home/teo/OpenMined/PySyft/.tox/.tmp/migration\")\n", + "blob_path = migration_data_dir / \"migration.blob\"\n", + "yaml_path = migration_data_dir / \"migration.yaml\"\n", + "\n", + "print(f\"Loading migration data from {str(blob_path.resolve())}\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "res = client.load_migration_data(blob_path)\n", + "assert isinstance(res, sy.SyftSuccess), res.message" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "res" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "sy.upgrade_custom_workerpools(client, blob_path, mode=\"auto\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Post migration tests" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "\"\"\"\n", + "TODO:\n", + " * verify users\n", + " * login\n", + " * check every role\n", + " * mostly check on lengths\n", + " * can a DS see the results of their old jobs/logs\n", + " * still use the api schema both mock \n", + " * still submit a new query via submit_query\n", + " * can admin still approve and approve_by_running, deny\n", + " * check on old broken queries\n", + " * create a new broken query\n", + " * can ds get the results of the new queries\n", + " * emails should work now\n", + " * test in k8s (both L2 and L0)\n", + " * test in L0 (migrate both nodes?)\n", + "\"\"\"" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "users = load_users(client, path=\"0.9.1_notebooks/users.json\")\n", + "jobs = load_jobs(users, client, filepath=\"0.9.1_notebooks/jobs.json\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Check users" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# TODO fix users??" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "client.users" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "users" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Old jobs" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# submitted_jobs = [job for job in jobs if job.is_submitted]\n", + "reviewed_jobs = [job for job in jobs if job.admin_reviewed]\n", + "reviewed_jobs_should_succeed = [j for j in reviewed_jobs if j.should_succeed]\n", + "reviewed_jobs_should_fail = [j for j in reviewed_jobs if not j.should_succeed]\n", + "\n", + "print(\n", + " f\"{len(reviewed_jobs)=}, {len(reviewed_jobs_should_succeed)=}, {len(reviewed_jobs_should_fail)=}\"\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "for job in reviewed_jobs_should_succeed:\n", + " print(f\"> Checking job: {job.job_type} {job.func_name} for user {job.user_email}\")\n", + " api_method = job.code_method\n", + " j = api_method(blocking=False)\n", + " res = j.wait()\n", + "\n", + " if isinstance(res, sy.SyftError):\n", + " raise sy.SyftException(public_message=\"Expected success, got error\")\n", + "\n", + " result = res.get()\n", + " job.result_as_expected = True" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "for job in reviewed_jobs_should_fail:\n", + " print(f\"> Checking job: {job.job_type} {job.func_name} for user {job.user_email}\")\n", + " api_method = job.code_method\n", + "\n", + " j = api_method(blocking=False)\n", + " res = j.wait()\n", + " if isinstance(res, sy.SyftError):\n", + " job.result_as_expected = True\n", + " else:\n", + " raise sy.SyftException(public_message=f\"failed, job didnt raise {type(j)}\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "expected_jobs = [job for job in jobs if job.result_as_expected]\n", + "print(f\"got expected_jobs: {len(expected_jobs)} == reviewed_jobs: {len(reviewed_jobs)}\")\n", + "assert len(reviewed_jobs) == len(expected_jobs)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Use old DS to go through the flow again" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "ds_client = users[0].client" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Check on emails now?" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "syft_3.12", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.12.4" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/notebooks/scenarios/bigquery/upgradability/sync/migration_high.blob b/notebooks/scenarios/bigquery/upgradability/sync/migration_high.blob new file mode 100644 index 0000000000000000000000000000000000000000..4143e59c7af3a070c9bc2be07f5d5f24826d9628 GIT binary patch literal 1121336 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 literal 0 HcmV?d00001 diff --git a/notebooks/scenarios/bigquery/upgradability/sync/migration_low.yaml b/notebooks/scenarios/bigquery/upgradability/sync/migration_low.yaml new file mode 100644 index 00000000000..c950671118c --- /dev/null +++ b/notebooks/scenarios/bigquery/upgradability/sync/migration_low.yaml @@ -0,0 +1,6 @@ +server: + env: + - name: SERVER_UID + value: 4a471a09f56b4a1d809c0a7614074283 + - name: SERVER_PRIVATE_KEY + value: 3c095c07c94d7f7aec863d61641c71c467cee08cf9a44120a9cb7a493def22cc From bc77e919e4790cab9b37a12c8a2f7c77da45a28d Mon Sep 17 00:00:00 2001 From: teo Date: Fri, 20 Sep 2024 12:15:59 +0300 Subject: [PATCH 04/17] fix prepare L2 notebooks --- .../upgradability/0.9.1_helpers/__init__.py | 0 .../0.9.1_helpers/apis/__init__.py | 21 + .../0.9.1_helpers/apis/live/__init__.py | 0 .../0.9.1_helpers/apis/live/schema.py | 108 + .../0.9.1_helpers/apis/live/test_query.py | 113 + .../0.9.1_helpers/apis/mock/__init__.py | 0 .../0.9.1_helpers/apis/mock/data.py | 268 ++ .../0.9.1_helpers/apis/mock/schema.py | 52 + .../0.9.1_helpers/apis/mock/test_query.py | 138 + .../0.9.1_helpers/apis/rate_limiter.py | 16 + .../0.9.1_helpers/apis/submit_query.py | 42 + .../0.9.1_helpers/email_helpers.py | 338 +++ .../0.9.1_helpers/job_helpers.py | 398 +++ .../0.9.1_helpers/sync_helpers.py | 192 ++ .../0.9.1_helpers/worker_helpers.py | 86 + ...tart-and-configure-server-and-admins.ipynb | 306 +- .../001-scale-delete-worker-pools.ipynb | 3 +- .../010-setup-bigquery-pool.ipynb | 3 +- .../011-users-emails-passwords.ipynb | 18 +- .../0.9.1_notebooks/020-configure-api.ipynb | 16 +- .../0.9.1_notebooks/021-create-jobs.ipynb | 32 +- .../040-do-review-requests.ipynb | 4 +- .../0.9.1_notebooks/050-ds-get-results.ipynb | 4 +- .../upgradability/0.9.1_notebooks/emails.json | 2 +- .../upgradability/0.9.1_notebooks/jobs.json | 2 +- .../upgradability/0.9.1_notebooks/users.json | 2 +- .../2-migrate-for-scenarios.ipynb | 2666 ++++------------- .../src/syft/service/worker/worker_image.py | 4 + tox.ini | 2 +- 29 files changed, 2596 insertions(+), 2240 deletions(-) create mode 100644 notebooks/scenarios/bigquery/upgradability/0.9.1_helpers/__init__.py create mode 100644 notebooks/scenarios/bigquery/upgradability/0.9.1_helpers/apis/__init__.py create mode 100644 notebooks/scenarios/bigquery/upgradability/0.9.1_helpers/apis/live/__init__.py create mode 100644 notebooks/scenarios/bigquery/upgradability/0.9.1_helpers/apis/live/schema.py create mode 100644 notebooks/scenarios/bigquery/upgradability/0.9.1_helpers/apis/live/test_query.py create mode 100644 notebooks/scenarios/bigquery/upgradability/0.9.1_helpers/apis/mock/__init__.py create mode 100644 notebooks/scenarios/bigquery/upgradability/0.9.1_helpers/apis/mock/data.py create mode 100644 notebooks/scenarios/bigquery/upgradability/0.9.1_helpers/apis/mock/schema.py create mode 100644 notebooks/scenarios/bigquery/upgradability/0.9.1_helpers/apis/mock/test_query.py create mode 100644 notebooks/scenarios/bigquery/upgradability/0.9.1_helpers/apis/rate_limiter.py create mode 100644 notebooks/scenarios/bigquery/upgradability/0.9.1_helpers/apis/submit_query.py create mode 100644 notebooks/scenarios/bigquery/upgradability/0.9.1_helpers/email_helpers.py create mode 100644 notebooks/scenarios/bigquery/upgradability/0.9.1_helpers/job_helpers.py create mode 100644 notebooks/scenarios/bigquery/upgradability/0.9.1_helpers/sync_helpers.py create mode 100644 notebooks/scenarios/bigquery/upgradability/0.9.1_helpers/worker_helpers.py diff --git a/notebooks/scenarios/bigquery/upgradability/0.9.1_helpers/__init__.py b/notebooks/scenarios/bigquery/upgradability/0.9.1_helpers/__init__.py new file mode 100644 index 00000000000..e69de29bb2d diff --git a/notebooks/scenarios/bigquery/upgradability/0.9.1_helpers/apis/__init__.py b/notebooks/scenarios/bigquery/upgradability/0.9.1_helpers/apis/__init__.py new file mode 100644 index 00000000000..8da4d561c36 --- /dev/null +++ b/notebooks/scenarios/bigquery/upgradability/0.9.1_helpers/apis/__init__.py @@ -0,0 +1,21 @@ +# stdlib +import os + +# relative +from syft.util.util import str_to_bool +from .submit_query import make_submit_query + +env_var = "TEST_BIGQUERY_APIS_LIVE" +use_live = str_to_bool(str(os.environ.get(env_var, "False"))) +env_name = "Live" if use_live else "Mock" +print(f"Using {env_name} API Code, this will query BigQuery. ${env_var}=={use_live}") + + +if use_live: + # relative + from .live.schema import make_schema + from .live.test_query import make_test_query +else: + # relative + from .mock.schema import make_schema + from .mock.test_query import make_test_query diff --git a/notebooks/scenarios/bigquery/upgradability/0.9.1_helpers/apis/live/__init__.py b/notebooks/scenarios/bigquery/upgradability/0.9.1_helpers/apis/live/__init__.py new file mode 100644 index 00000000000..e69de29bb2d diff --git a/notebooks/scenarios/bigquery/upgradability/0.9.1_helpers/apis/live/schema.py b/notebooks/scenarios/bigquery/upgradability/0.9.1_helpers/apis/live/schema.py new file mode 100644 index 00000000000..9eb715485db --- /dev/null +++ b/notebooks/scenarios/bigquery/upgradability/0.9.1_helpers/apis/live/schema.py @@ -0,0 +1,108 @@ +# stdlib +from collections.abc import Callable + +# syft absolute +import syft as sy + +# relative +from syft import test_settings +from syft.rate_limiter import is_within_rate_limit + + +def make_schema(settings: dict, worker_pool: str) -> Callable: + updated_settings = { + "calls_per_min": 5, + "rate_limiter_enabled": True, + "credentials": test_settings.gce_service_account.to_dict(), + "region": test_settings.gce_region, + "project_id": test_settings.gce_project_id, + "dataset_1": test_settings.dataset_1, + "table_1": test_settings.table_1, + "table_2": test_settings.table_2, + } | settings + + @sy.api_endpoint( + path="bigquery.schema", + description="This endpoint allows for visualising the metadata of tables available in BigQuery.", + settings=updated_settings, + helper_functions=[ + is_within_rate_limit + ], # Adds ratelimit as this is also a method available to data scientists + worker_pool=worker_pool, + ) + def live_schema( + context, + ) -> str: + # stdlib + import datetime + + # third party + from google.cloud import bigquery # noqa: F811 + from google.oauth2 import service_account + import pandas as pd + + # syft absolute + from syft import SyftException + + # Auth for Bigquer based on the workload identity + credentials = service_account.Credentials.from_service_account_info( + context.settings["credentials"] + ) + scoped_credentials = credentials.with_scopes( + ["https://www.googleapis.com/auth/cloud-platform"] + ) + + client = bigquery.Client( + credentials=scoped_credentials, + location=context.settings["region"], + ) + + # Store a dict with the calltimes for each user, via the email. + if context.settings["rate_limiter_enabled"]: + if context.user.email not in context.state.keys(): + context.state[context.user.email] = [] + + if not context.code.is_within_rate_limit(context): + raise SyftException( + public_message="Rate limit of calls per minute has been reached." + ) + context.state[context.user.email].append(datetime.datetime.now()) + + try: + # Formats the data schema in a data frame format + # Warning: the only supported format types are primitives, np.ndarrays and pd.DataFrames + + data_schema = [] + for table_id in [ + f"{context.settings['dataset_1']}.{context.settings['table_1']}", + f"{context.settings['dataset_1']}.{context.settings['table_2']}", + ]: + table = client.get_table(table_id) + for schema in table.schema: + data_schema.append( + { + "project": str(table.project), + "dataset_id": str(table.dataset_id), + "table_id": str(table.table_id), + "schema_name": str(schema.name), + "schema_field": str(schema.field_type), + "description": str(table.description), + "num_rows": str(table.num_rows), + } + ) + return pd.DataFrame(data_schema) + + except Exception as e: + # not a bigquery exception + if not hasattr(e, "_errors"): + output = f"got exception e: {type(e)} {str(e)}" + raise SyftException( + public_message=f"An error occured executing the API call {output}" + ) + + # Should add appropriate error handling for what should be exposed to the data scientists. + raise SyftException( + public_message="An error occured executing the API call, please contact the domain owner." + ) + + return live_schema diff --git a/notebooks/scenarios/bigquery/upgradability/0.9.1_helpers/apis/live/test_query.py b/notebooks/scenarios/bigquery/upgradability/0.9.1_helpers/apis/live/test_query.py new file mode 100644 index 00000000000..a1e0fbcb718 --- /dev/null +++ b/notebooks/scenarios/bigquery/upgradability/0.9.1_helpers/apis/live/test_query.py @@ -0,0 +1,113 @@ +# stdlib +from collections.abc import Callable + +# syft absolute +import syft as sy + +# relative +from syft import test_settings +from syft.rate_limiter import is_within_rate_limit + + +def make_test_query(settings) -> Callable: + updated_settings = { + "calls_per_min": 10, + "rate_limiter_enabled": True, + "credentials": test_settings.gce_service_account.to_dict(), + "region": test_settings.gce_region, + "project_id": test_settings.gce_project_id, + } | settings + + # these are the same if you allow the rate limiter to be turned on and off + @sy.api_endpoint_method( + settings=updated_settings, + helper_functions=[is_within_rate_limit], + ) + def live_test_query( + context, + sql_query: str, + ) -> str: + # stdlib + import datetime + + # third party + from google.cloud import bigquery # noqa: F811 + from google.oauth2 import service_account + + # syft absolute + from syft import SyftException + + # Auth for Bigquer based on the workload identity + credentials = service_account.Credentials.from_service_account_info( + context.settings["credentials"] + ) + scoped_credentials = credentials.with_scopes( + ["https://www.googleapis.com/auth/cloud-platform"] + ) + + client = bigquery.Client( + credentials=scoped_credentials, + location=context.settings["region"], + ) + + # Store a dict with the calltimes for each user, via the email. + if context.settings["rate_limiter_enabled"]: + if context.user.email not in context.state.keys(): + context.state[context.user.email] = [] + + if not context.code.is_within_rate_limit(context): + raise SyftException( + public_message="Rate limit of calls per minute has been reached." + ) + context.state[context.user.email].append(datetime.datetime.now()) + + try: + rows = client.query_and_wait( + sql_query, + project=context.settings["project_id"], + ) + + if rows.total_rows > 1_000_000: + raise SyftException( + public_message="Please only write queries that gather aggregate statistics" + ) + + return rows.to_dataframe() + + except Exception as e: + # not a bigquery exception + if not hasattr(e, "_errors"): + output = f"got exception e: {type(e)} {str(e)}" + raise SyftException( + public_message=f"An error occured executing the API call {output}" + ) + + # Treat all errors that we would like to be forwarded to the data scientists + # By default, any exception is only visible to the data owner. + + if e._errors[0]["reason"] in [ + "badRequest", + "blocked", + "duplicate", + "invalidQuery", + "invalid", + "jobBackendError", + "jobInternalError", + "notFound", + "notImplemented", + "rateLimitExceeded", + "resourceInUse", + "resourcesExceeded", + "tableUnavailable", + "timeout", + ]: + raise SyftException( + public_message="Error occured during the call: " + + e._errors[0]["message"] + ) + else: + raise SyftException( + public_message="An error occured executing the API call, please contact the domain owner." + ) + + return live_test_query diff --git a/notebooks/scenarios/bigquery/upgradability/0.9.1_helpers/apis/mock/__init__.py b/notebooks/scenarios/bigquery/upgradability/0.9.1_helpers/apis/mock/__init__.py new file mode 100644 index 00000000000..e69de29bb2d diff --git a/notebooks/scenarios/bigquery/upgradability/0.9.1_helpers/apis/mock/data.py b/notebooks/scenarios/bigquery/upgradability/0.9.1_helpers/apis/mock/data.py new file mode 100644 index 00000000000..82262bf7a01 --- /dev/null +++ b/notebooks/scenarios/bigquery/upgradability/0.9.1_helpers/apis/mock/data.py @@ -0,0 +1,268 @@ +# stdlib +from math import nan + +schema_dict = { + "project": { + 0: "example-project", + 1: "example-project", + 2: "example-project", + 3: "example-project", + 4: "example-project", + 5: "example-project", + 6: "example-project", + 7: "example-project", + 8: "example-project", + 9: "example-project", + 10: "example-project", + 11: "example-project", + 12: "example-project", + 13: "example-project", + 14: "example-project", + 15: "example-project", + 16: "example-project", + 17: "example-project", + 18: "example-project", + 19: "example-project", + 20: "example-project", + 21: "example-project", + 22: "example-project", + }, + "dataset_id": { + 0: "test_1gb", + 1: "test_1gb", + 2: "test_1gb", + 3: "test_1gb", + 4: "test_1gb", + 5: "test_1gb", + 6: "test_1gb", + 7: "test_1gb", + 8: "test_1gb", + 9: "test_1gb", + 10: "test_1gb", + 11: "test_1gb", + 12: "test_1gb", + 13: "test_1gb", + 14: "test_1gb", + 15: "test_1gb", + 16: "test_1gb", + 17: "test_1gb", + 18: "test_1gb", + 19: "test_1gb", + 20: "test_1gb", + 21: "test_1gb", + 22: "test_1gb", + }, + "table_id": { + 0: "posts", + 1: "posts", + 2: "posts", + 3: "posts", + 4: "posts", + 5: "posts", + 6: "posts", + 7: "comments", + 8: "comments", + 9: "comments", + 10: "comments", + 11: "comments", + 12: "comments", + 13: "comments", + 14: "comments", + 15: "comments", + 16: "comments", + 17: "comments", + 18: "comments", + 19: "comments", + 20: "comments", + 21: "comments", + 22: "comments", + }, + "schema_name": { + 0: "int64_field_0", + 1: "id", + 2: "name", + 3: "subscribers_count", + 4: "permalink", + 5: "nsfw", + 6: "spam", + 7: "int64_field_0", + 8: "id", + 9: "body", + 10: "parent_id", + 11: "created_at", + 12: "last_modified_at", + 13: "gilded", + 14: "permalink", + 15: "score", + 16: "comment_id", + 17: "post_id", + 18: "author_id", + 19: "spam", + 20: "deleted", + 21: "upvote_raio", + 22: "collapsed_in_crowd_control", + }, + "schema_field": { + 0: "INTEGER", + 1: "STRING", + 2: "STRING", + 3: "INTEGER", + 4: "STRING", + 5: "FLOAT", + 6: "BOOLEAN", + 7: "INTEGER", + 8: "STRING", + 9: "STRING", + 10: "STRING", + 11: "INTEGER", + 12: "INTEGER", + 13: "BOOLEAN", + 14: "STRING", + 15: "INTEGER", + 16: "STRING", + 17: "STRING", + 18: "STRING", + 19: "BOOLEAN", + 20: "BOOLEAN", + 21: "FLOAT", + 22: "BOOLEAN", + }, + "description": { + 0: "None", + 1: "None", + 2: "None", + 3: "None", + 4: "None", + 5: "None", + 6: "None", + 7: "None", + 8: "None", + 9: "None", + 10: "None", + 11: "None", + 12: "None", + 13: "None", + 14: "None", + 15: "None", + 16: "None", + 17: "None", + 18: "None", + 19: "None", + 20: "None", + 21: "None", + 22: "None", + }, + "num_rows": { + 0: "2000000", + 1: "2000000", + 2: "2000000", + 3: "2000000", + 4: "2000000", + 5: "2000000", + 6: "2000000", + 7: "2000000", + 8: "2000000", + 9: "2000000", + 10: "2000000", + 11: "2000000", + 12: "2000000", + 13: "2000000", + 14: "2000000", + 15: "2000000", + 16: "2000000", + 17: "2000000", + 18: "2000000", + 19: "2000000", + 20: "2000000", + 21: "2000000", + 22: "2000000", + }, +} + + +query_dict = { + "int64_field_0": { + 0: 4, + 1: 5, + 2: 10, + 3: 16, + 4: 17, + 5: 23, + 6: 24, + 7: 25, + 8: 27, + 9: 40, + }, + "id": { + 0: "t5_via1x", + 1: "t5_cv9gn", + 2: "t5_8p2tq", + 3: "t5_8fcro", + 4: "t5_td5of", + 5: "t5_z01fv", + 6: "t5_hmqjk", + 7: "t5_1flyj", + 8: "t5_5rwej", + 9: "t5_uurcv", + }, + "name": { + 0: "/channel/mylittlepony", + 1: "/channel/polyamory", + 2: "/channel/Catholicism", + 3: "/channel/cordcutters", + 4: "/channel/stevenuniverse", + 5: "/channel/entitledbitch", + 6: "/channel/engineering", + 7: "/channel/nottheonion", + 8: "/channel/FoodPorn", + 9: "/channel/puppysmiles", + }, + "subscribers_count": { + 0: 4323081, + 1: 2425929, + 2: 4062607, + 3: 7543226, + 4: 2692168, + 5: 2709080, + 6: 8766144, + 7: 2580984, + 8: 7784809, + 9: 3715991, + }, + "permalink": { + 0: "/channel//channel/mylittlepony", + 1: "/channel//channel/polyamory", + 2: "/channel//channel/Catholicism", + 3: "/channel//channel/cordcutters", + 4: "/channel//channel/stevenuniverse", + 5: "/channel//channel/entitledbitch", + 6: "/channel//channel/engineering", + 7: "/channel//channel/nottheonion", + 8: "/channel//channel/FoodPorn", + 9: "/channel//channel/puppysmiles", + }, + "nsfw": { + 0: nan, + 1: nan, + 2: nan, + 3: nan, + 4: nan, + 5: nan, + 6: nan, + 7: nan, + 8: nan, + 9: nan, + }, + "spam": { + 0: False, + 1: False, + 2: False, + 3: False, + 4: False, + 5: False, + 6: False, + 7: False, + 8: False, + 9: False, + }, +} diff --git a/notebooks/scenarios/bigquery/upgradability/0.9.1_helpers/apis/mock/schema.py b/notebooks/scenarios/bigquery/upgradability/0.9.1_helpers/apis/mock/schema.py new file mode 100644 index 00000000000..a95e04f2f1d --- /dev/null +++ b/notebooks/scenarios/bigquery/upgradability/0.9.1_helpers/apis/mock/schema.py @@ -0,0 +1,52 @@ +# stdlib +from collections.abc import Callable + +# syft absolute +import syft as sy + +# relative +from ..rate_limiter import is_within_rate_limit +from .data import schema_dict + + +def make_schema(settings, worker_pool) -> Callable: + updated_settings = { + "calls_per_min": 5, + "rate_limiter_enabled": True, + "schema_dict": schema_dict, + } | settings + + @sy.api_endpoint( + path="bigquery.schema", + description="This endpoint allows for visualising the metadata of tables available in BigQuery.", + settings=updated_settings, + helper_functions=[is_within_rate_limit], + worker_pool=worker_pool, + ) + def mock_schema( + context, + ) -> str: + # syft absolute + from syft import SyftException + + # Store a dict with the calltimes for each user, via the email. + if context.settings["rate_limiter_enabled"]: + # stdlib + import datetime + + if context.user.email not in context.state.keys(): + context.state[context.user.email] = [] + + if not context.code.is_within_rate_limit(context): + raise SyftException( + public_message="Rate limit of calls per minute has been reached." + ) + context.state[context.user.email].append(datetime.datetime.now()) + + # third party + import pandas as pd + + df = pd.DataFrame(context.settings["schema_dict"]) + return df + + return mock_schema diff --git a/notebooks/scenarios/bigquery/upgradability/0.9.1_helpers/apis/mock/test_query.py b/notebooks/scenarios/bigquery/upgradability/0.9.1_helpers/apis/mock/test_query.py new file mode 100644 index 00000000000..ae028a8cf36 --- /dev/null +++ b/notebooks/scenarios/bigquery/upgradability/0.9.1_helpers/apis/mock/test_query.py @@ -0,0 +1,138 @@ +# stdlib +from collections.abc import Callable + +# syft absolute +import syft as sy + +# relative +from ..rate_limiter import is_within_rate_limit +from .data import query_dict + + +def extract_limit_value(sql_query: str) -> int: + # stdlib + import re + + limit_pattern = re.compile(r"\bLIMIT\s+(\d+)\b", re.IGNORECASE) + match = limit_pattern.search(sql_query) + if match: + return int(match.group(1)) + return None + + +def is_valid_sql(query: str) -> bool: + # stdlib + import sqlite3 + + # Prepare an in-memory SQLite database + conn = sqlite3.connect(":memory:") + cursor = conn.cursor() + + try: + # Use the EXPLAIN QUERY PLAN command to get the query plan + cursor.execute(f"EXPLAIN QUERY PLAN {query}") + except sqlite3.Error as e: + if "no such table" in str(e).lower(): + return True + return False + finally: + conn.close() + + +def adjust_dataframe_rows(df, target_rows: int): + # third party + import pandas as pd + + current_rows = len(df) + + if target_rows > current_rows: + # Repeat rows to match target_rows + repeat_times = (target_rows + current_rows - 1) // current_rows + df_expanded = pd.concat([df] * repeat_times, ignore_index=True).head( + target_rows + ) + else: + # Truncate rows to match target_rows + df_expanded = df.head(target_rows) + + return df_expanded + + +def make_test_query(settings: dict) -> Callable: + updated_settings = { + "calls_per_min": 10, + "rate_limiter_enabled": True, + "query_dict": query_dict, + } | settings + + # these are the same if you allow the rate limiter to be turned on and off + @sy.api_endpoint_method( + settings=updated_settings, + helper_functions=[ + is_within_rate_limit, + extract_limit_value, + is_valid_sql, + adjust_dataframe_rows, + ], + ) + def mock_test_query( + context, + sql_query: str, + ) -> str: + # stdlib + import datetime + + # third party + from google.api_core.exceptions import BadRequest + + # syft absolute + from syft import SyftException + + # Store a dict with the calltimes for each user, via the email. + if context.settings["rate_limiter_enabled"]: + if context.user.email not in context.state.keys(): + context.state[context.user.email] = [] + + if not context.code.is_within_rate_limit(context): + raise SyftException( + public_message="Rate limit of calls per minute has been reached." + ) + context.state[context.user.email].append(datetime.datetime.now()) + + bad_table = "invalid_table" + bad_post = ( + "BadRequest: 400 POST " + "https://bigquery.googleapis.com/bigquery/v2/projects/project-id/" + "queries?prettyPrint=false: " + ) + if bad_table in sql_query: + try: + raise BadRequest( + f'{bad_post} Table "{bad_table}" must be qualified ' + "with a dataset (e.g. dataset.table)." + ) + except Exception as e: + raise SyftException( + public_message=f"*must be qualified with a dataset*. {e}" + ) + + if not context.code.is_valid_sql(sql_query): + raise BadRequest( + f'{bad_post} Syntax error: Unexpected identifier "{sql_query}" at [1:1]' + ) + + # third party + import pandas as pd + + limit = context.code.extract_limit_value(sql_query) + if limit > 1_000_000: + raise SyftException( + public_message="Please only write queries that gather aggregate statistics" + ) + + base_df = pd.DataFrame(context.settings["query_dict"]) + + df = context.code.adjust_dataframe_rows(base_df, limit) + return df + + return mock_test_query diff --git a/notebooks/scenarios/bigquery/upgradability/0.9.1_helpers/apis/rate_limiter.py b/notebooks/scenarios/bigquery/upgradability/0.9.1_helpers/apis/rate_limiter.py new file mode 100644 index 00000000000..8ce319b61f4 --- /dev/null +++ b/notebooks/scenarios/bigquery/upgradability/0.9.1_helpers/apis/rate_limiter.py @@ -0,0 +1,16 @@ +def is_within_rate_limit(context) -> bool: + """Rate limiter for custom API calls made by users.""" + # stdlib + import datetime + + state = context.state + settings = context.settings + email = context.user.email + + current_time = datetime.datetime.now() + calls_last_min = [ + 1 if (current_time - call_time).seconds < 60 else 0 + for call_time in state[email] + ] + + return sum(calls_last_min) < settings.get("calls_per_min", 5) diff --git a/notebooks/scenarios/bigquery/upgradability/0.9.1_helpers/apis/submit_query.py b/notebooks/scenarios/bigquery/upgradability/0.9.1_helpers/apis/submit_query.py new file mode 100644 index 00000000000..a0125ee009b --- /dev/null +++ b/notebooks/scenarios/bigquery/upgradability/0.9.1_helpers/apis/submit_query.py @@ -0,0 +1,42 @@ +# syft absolute +import syft as sy + + +def make_submit_query(settings, worker_pool): + updated_settings = {"user_code_worker": worker_pool} | settings + + @sy.api_endpoint( + path="bigquery.submit_query", + description="API endpoint that allows you to submit SQL queries to run on the private data.", + worker_pool=worker_pool, + settings=updated_settings, + ) + def submit_query( + context, + func_name: str, + query: str, + ) -> str: + # syft absolute + import syft as sy + + @sy.syft_function( + name=func_name, + input_policy=sy.MixedInputPolicy( + endpoint=sy.Constant( + val=context.admin_client.api.services.bigquery.test_query + ), + query=sy.Constant(val=query), + client=context.admin_client, + ), + worker_pool_name=context.settings["user_code_worker"], + ) + def execute_query(query: str, endpoint): + res = endpoint(sql_query=query) + return res + + request = context.user_client.code.request_code_execution(execute_query) + context.admin_client.requests.set_tags(request, ["autosync"]) + + return f"Query submitted {request}. Use `client.code.{func_name}()` to run your query" + + return submit_query diff --git a/notebooks/scenarios/bigquery/upgradability/0.9.1_helpers/email_helpers.py b/notebooks/scenarios/bigquery/upgradability/0.9.1_helpers/email_helpers.py new file mode 100644 index 00000000000..e862d392089 --- /dev/null +++ b/notebooks/scenarios/bigquery/upgradability/0.9.1_helpers/email_helpers.py @@ -0,0 +1,338 @@ +# stdlib +import asyncio +from dataclasses import dataclass +from dataclasses import field +import json +import re +import time +from typing import Any + +# third party +from aiosmtpd.controller import Controller +from faker import Faker + +# relative +from syft.service.user.user_roles import ServiceRole + +fake = Faker() + + +@dataclass +class Email: + email_from: str + email_to: str + email_content: str + + def to_dict(self) -> dict: + output = {} + for k, v in self.__dict__.items(): + output[k] = v + return output + + def __iter__(self): + yield from self.to_dict().items() + + def __getitem__(self, key): + return self.to_dict()[key] + + def __repr__(self) -> str: + return f"{self.email_to}\n{self.email_from}\n\n{self.email_content}" + + +class EmailServer: + def __init__(self, filepath="./emails.json"): + self.filepath = filepath + self._emails: dict[str, list[Email]] = self.load_emails() + + def load_emails(self) -> dict[str, list[Email]]: + try: + with open(self.filepath) as f: + data = json.load(f) + return {k: [Email(**email) for email in v] for k, v in data.items()} + except Exception as e: + print("Issues reading email file", e) + return {} + + def save_emails(self) -> None: + with open(self.filepath, "w") as f: + data = { + k: [email.to_dict() for email in v] for k, v in self._emails.items() + } + f.write(json.dumps(data)) + + def add_email_for_user(self, user_email: str, email: Email) -> None: + if user_email not in self._emails: + self._emails[user_email] = [] + self._emails[user_email].append(email) + self.save_emails() + + def get_emails_for_user(self, user_email: str) -> list[Email]: + self._emails: dict[str, list[Email]] = self.load_emails() + return self._emails.get(user_email, []) + + def reset_emails(self) -> None: + self._emails = {} + self.save_emails() + + +SENDER = "noreply@openmined.org" + + +def get_token(email) -> str: + # stdlib + import re + + pattern = r"syft_client\.reset_password\(token='(.*?)', new_password=.*?\)" + try: + token = re.search(pattern, email.email_content).group(1) + except Exception: + raise Exception(f"No token found in email: {email.email_content}") + return token + + +@dataclass +class TestUser: + name: str + email: str + password: str + role: ServiceRole + new_password: str | None = None + email_disabled: bool = False + reset_password: bool = False + reset_token: str | None = None + _client_cache: Any | None = field(default=None, repr=False, init=False) + _email_server: EmailServer | None = None + + @property + def latest_password(self) -> str: + if self.new_password: + return self.new_password + return self.password + + def make_new_password(self) -> str: + self.new_password = fake.password() + return self.new_password + + @property + def client(self): + return self._client_cache + + def relogin(self) -> None: + self.client = self.client + + @client.setter + def client(self, client): + client = client.login(email=self.email, password=self.latest_password) + self._client_cache = client + + def to_dict(self) -> dict: + output = {} + for k, v in self.__dict__.items(): + if k.startswith("_"): + continue + if k == "role": + v = str(v) + output[k] = v + return output + + def __iter__(self): + for key, val in self.to_dict().items(): + if not key.startswith("_"): + yield key, val + + def __getitem__(self, key): + if key.startswith("_"): + return None + return self.to_dict()[key] + + def update_password(self): + self.password = self.new_password + self.new_password = None + + @property + def emails(self) -> list[Email]: + if not self._email_server: + print("Not connected to email server object") + return [] + return self._email_server.get_emails_for_user(self.email) + + def get_token(self) -> str: + for email in reversed(self.emails): + token = None + try: + token = get_token(email) + break + except Exception: # nosec + pass + self.reset_token = token + return token + + +def save_users(users): + user_dicts = [] + for user in users: + user_dicts.append(user.to_dict()) + print(user_dicts) + with open("./users.json", "w") as f: + f.write(json.dumps(user_dicts)) + + +def load_users(high_client: None, path="./users.json"): + users = [] + with open(path) as f: + data = f.read() + user_dicts = json.loads(data) + for user in user_dicts: + test_user = TestUser(**user) + if high_client: + test_user.client = high_client + users.append(test_user) + return users + + +def make_user( + name: str | None = None, + email: str | None = None, + password: str | None = None, + role: ServiceRole = ServiceRole.DATA_SCIENTIST, +): + fake = Faker() + if name is None: + name = fake.name() + if email is None: + ascii_string = re.sub(r"[^a-zA-Z\s]", "", name).lower() + dashed_string = ascii_string.replace(" ", "-") + email = f"{dashed_string}-fake@openmined.org" + if password is None: + password = fake.password() + + return TestUser(name=name, email=email, password=password, role=role) + + +def user_exists(root_client, email: str) -> bool: + users = root_client.api.services.user + for user in users: + if user.email == email: + return True + return False + + +class SMTPTestServer: + def __init__(self, email_server): + self.port = 9025 + self.hostname = "0.0.0.0" # nosec: B104 + self._stop_event = asyncio.Event() + + # Simple email handler class + class SimpleHandler: + async def handle_DATA(self, server, session, envelope): + try: + print(f"> SMTPTestServer got an email for {envelope.rcpt_tos}") + email = Email( + email_from=envelope.mail_from, + email_to=envelope.rcpt_tos, + email_content=envelope.content.decode( + "utf-8", errors="replace" + ), + ) + email_server.add_email_for_user(envelope.rcpt_tos[0], email) + email_server.save_emails() + return "250 Message accepted for delivery" + except Exception as e: + print(f"> Error handling email: {e}") + return "550 Internal Server Error" + + try: + self.handler = SimpleHandler() + self.controller = Controller( + self.handler, hostname=self.hostname, port=self.port + ) + except Exception as e: + print(f"> Error initializing SMTPTestServer Controller: {e}") + + def start(self): + print(f"> Starting SMTPTestServer on: {self.hostname}:{self.port}") + asyncio.create_task(self.async_loop()) + + async def async_loop(self): + try: + print(f"> Starting SMTPTestServer on: {self.hostname}:{self.port}") + self.controller.start() + await ( + self._stop_event.wait() + ) # Wait until the event is set to stop the server + except Exception as e: + print(f"> Error with SMTPTestServer: {e}") + + def stop(self): + try: + print("> Stopping SMTPTestServer") + loop = asyncio.get_running_loop() + if loop.is_running(): + loop.create_task(self.async_stop()) + else: + asyncio.run(self.async_stop()) + except Exception as e: + print(f"> Error stopping SMTPTestServer: {e}") + + async def async_stop(self): + self.controller.stop() + self._stop_event.set() # Stop the server by setting the event + + +class TimeoutError(Exception): + pass + + +class Timeout: + def __init__(self, timeout_duration): + if timeout_duration > 60: + raise ValueError("Timeout duration cannot exceed 60 seconds.") + self.timeout_duration = timeout_duration + + def run_with_timeout(self, condition_func, *args, **kwargs): + start_time = time.time() + result = None + + while True: + elapsed_time = time.time() - start_time + if elapsed_time > self.timeout_duration: + raise TimeoutError( + f"Function execution exceeded {self.timeout_duration} seconds." + ) + + # Check if the condition is met + try: + if condition_func(): + print("Condition met, exiting early.") + break + except Exception as e: + print(f"Exception in target function: {e}") + break # Exit the loop if an exception occurs in the function + time.sleep(1) + + return result + + +def get_email_server(reset=False): + email_server = EmailServer() + if reset: + email_server.reset_emails() + smtp_server = SMTPTestServer(email_server) + smtp_server.start() + return email_server, smtp_server + + +def create_user(root_client, test_user): + if not user_exists(root_client, test_user.email): + fake = Faker() + root_client.register( + name=test_user.name, + email=test_user.email, + password=test_user.password, + password_verify=test_user.password, + institution=fake.company(), + website=fake.url(), + ) + else: + print("User already exists", test_user) diff --git a/notebooks/scenarios/bigquery/upgradability/0.9.1_helpers/job_helpers.py b/notebooks/scenarios/bigquery/upgradability/0.9.1_helpers/job_helpers.py new file mode 100644 index 00000000000..d3fd523a3af --- /dev/null +++ b/notebooks/scenarios/bigquery/upgradability/0.9.1_helpers/job_helpers.py @@ -0,0 +1,398 @@ +# stdlib +from collections import defaultdict +from collections.abc import Callable +from dataclasses import dataclass +from dataclasses import field +import json +import random +import re +import secrets +import textwrap +from typing import Any + +# relative +from syft import test_settings +from email_helpers import TestUser + +from syft.client.client import SyftClient # noqa + +dataset_1 = test_settings.get("dataset_1", default="dataset_1") +dataset_2 = test_settings.get("dataset_2", default="dataset_2") +table_1 = test_settings.get("table_1", default="table_1") +table_2 = test_settings.get("table_2", default="table_2") +table_1_col_id = test_settings.get("table_1_col_id", default="table_id") +table_1_col_score = test_settings.get("table_1_col_score", default="colname") +table_2_col_id = test_settings.get("table_2_col_id", default="table_id") +table_2_col_score = test_settings.get("table_2_col_score", default="colname") + + +@dataclass +class TestJob: + user_email: str + func_name: str + query: str + job_type: str + settings: dict # make a type so we can rely on attributes + should_succeed: bool + should_submit: bool = True + code_path: str | None = field(default=None) + admin_reviewed: bool = False + result_as_expected: bool | None = None + + _client_cache: SyftClient | None = field(default=None, repr=False, init=False) + + @property + def is_submitted(self) -> bool: + return self.code_path is not None + + @property + def client(self): + return self._client_cache + + @client.setter + def client(self, client): + self._client_cache = client + + def to_dict(self) -> dict: + output = {} + for k, v in self.__dict__.items(): + if k.startswith("_"): + continue + output[k] = v + return output + + def __iter__(self): + for key, val in self.to_dict().items(): + if key.startswith("_"): + yield key, val + + def __getitem__(self, key): + if key.startswith("_"): + return None + return self.to_dict()[key] + + @property + def code_method(self) -> None | Callable: + try: + return getattr(self.client.code, self.func_name, None) + except Exception as e: + print(f"Cant find code method. {e}") + return None + + +def make_query(settings: dict) -> str: + query = f""" + SELECT {settings['groupby_col']}, AVG({settings['score_col']}) AS average_score + FROM {settings['dataset']}.{settings['table']} + GROUP BY {settings['groupby_col']} + LIMIT {settings['limit']}""".strip() # nosec: B608 + + return textwrap.dedent(query) + + +def create_simple_query_job(user: TestUser) -> TestJob: + job_type = "simple_query" + func_name = f"{job_type}_{secrets.token_hex(3)}" + + dataset = random.choice([dataset_1, dataset_2]) # nosec: B311 + table, groupby_col, score_col = random.choice( # nosec: B311 + [ + (table_1, table_1_col_id, table_1_col_score), + (table_2, table_2_col_id, table_2_col_score), + ] + ) + limit = random.randint(1, 1_000_000) # nosec: B311 + + settings = { + "dataset": dataset, + "table": table, + "groupby_col": groupby_col, + "score_col": score_col, + "limit": limit, + } + query = make_query(settings) + + result = TestJob( + user_email=user.email, + func_name=func_name, + query=query, + job_type=job_type, + settings=settings, + should_succeed=True, + ) + + result.client = user.client + return result + + +def create_wrong_asset_query(user: TestUser) -> TestJob: + job_type = "wrong_asset_query" + func_name = f"{job_type}_{secrets.token_hex(3)}" + + valid_job = create_simple_query_job(user) + settings = valid_job.settings + corrupted_asset = random.choice(["dataset", "table"]) # nosec: B311 + settings[corrupted_asset] = "wrong_asset" + query = make_query(settings) + + result = TestJob( + user_email=user.email, + func_name=func_name, + query=query, + job_type=job_type, + settings=settings, + should_succeed=False, + ) + + result.client = user.client + return result + + +def create_wrong_syntax_query(user: TestUser) -> TestJob: + job_type = "wrong_syntax_query" + func_name = f"{job_type}_{secrets.token_hex(3)}" + + query = "SELECT * FROM table INCORRECT SYNTAX" + + result = TestJob( + user_email=user.email, + func_name=func_name, + query=query, + job_type=job_type, + settings={}, + should_succeed=False, + ) + + result.client = user.client + return result + + +def create_long_query_job(user: TestUser) -> TestJob: + job_type = "job_too_much_text" + func_name = f"{job_type}_{secrets.token_hex(3)}" + + query = "a" * 1_000 + + result = TestJob( + user_email=user.email, + func_name=func_name, + query=query, + job_type=job_type, + settings={}, + should_succeed=False, + ) + + result.client = user.client + return result + + +def create_query_long_name(user: TestUser) -> TestJob: + job_type = "job_long_name" + func_name = f"{job_type}_{secrets.token_hex(3)}" + + job = create_simple_query_job(user) + + job.job_type = job_type + job.func_name = func_name + "a" * 1_000 + + return job + + +def create_job_funcname_xss(user: TestUser) -> TestJob: + job_type = "job_funcname_xss" + func_name = f"{job_type}_{secrets.token_hex(3)}" + func_name += "" + + job = create_simple_query_job(user) + job.job_type = job_type + job.func_name = func_name + job.should_submit = False + return job + + +def get_request_for_job_info(requests, job): + job_requests = [r for r in requests if r.code.service_func_name == job.func_name] + if len(job_requests) != 1: + raise Exception(f"Too many or too few requests: {job} in requests: {requests}") + return job_requests[0] + + +def create_job_query_xss(user: TestUser) -> TestJob: + job_type = "job_query_xss" + func_name = f"{job_type}_{secrets.token_hex(3)}" + + job = create_simple_query_job(user) + job.job_type = job_type + job.func_name = func_name + job.query += "" + job.should_succeed = False + + return job + + +def create_job_many_columns(user: TestUser) -> TestJob: + job_type = "job_many_columns" + func_name = f"{job_type}_{secrets.token_hex(3)}" + + job = create_simple_query_job(user) + job.job_type = job_type + job.func_name = func_name + settings = job.settings + job.settings["num_extra_cols"] = random.randint(100, 1000) # nosec: B311 + + new_columns_string = ", ".join( + f"{settings['score_col']} as col_{i}" for i in range(settings["num_extra_cols"]) + ) + + job.query = f""" + SELECT {settings['groupby_col']}, AVG({settings['score_col']}) AS average_score, {new_columns_string} + FROM {settings['dataset']}.{settings['table']} + GROUP BY {settings['groupby_col']} + LIMIT {settings['limit']}""".strip() # nosec: B608 + + return job + + +def create_random_job(user: TestUser) -> TestJob: + job_func = random.choice(create_job_functions) # nosec: B311 + return job_func(user) + + +def create_jobs(users: list[TestUser], total_jobs: int = 10) -> list[TestJob]: + jobs = [] + num_users = len(users) + user_index = 0 + each_count = 0 + # keep making jobs until we have enough + while len(jobs) < total_jobs: + # if we havent used each job type yet keep getting the next one + if each_count < len(create_job_functions): + job_func = create_job_functions[each_count] + each_count += 1 + else: + # otherwise lets get a random one + job_func = create_random_job + # use the current index of user + jobs.append(job_func(users[user_index])) + + # only go as high as the last user index + if user_index < num_users - 1: + user_index += 1 + else: + # reset back to the first user + user_index = 0 + + # in case we stuffed up + if len(jobs) > total_jobs: + jobs = jobs[:total_jobs] + return jobs + + +def submit_job(job: TestJob) -> tuple[Any, str]: + client = job.client + response = client.api.services.bigquery.submit_query( + func_name=job.func_name, query=job.query + ) + job.code_path = extract_code_path(response) + return response + + +def extract_code_path(response) -> str | None: + pattern = r"client\.code\.(\w+)\(\)" + match = re.search(pattern, str(response)) + if match: + extracted_code = match.group(1) + return extracted_code + return None + + +def approve_by_running(request): + job = request.code(blocking=False) + result = job.wait() + print("got result of type", type(result), "bool", bool(result)) + # got result of type bool False + # assert result won't work unless we know what type is coming back + job_info = job.info(result=True) + # need force when running multiple times + # todo check and dont run if its already done + response = request.deposit_result(job_info, approve=True, force=True) + return response + + +def get_job_emails(jobs, client, email_server): + all_requests = client.requests + res = {} + for job in jobs: + request = get_request_for_job_info(all_requests, job) + emails = email_server.get_emails_for_user(request.requesting_user_email) + res[request.requesting_user_email] = emails + return res + + +def resolve_request(request): + service_func_name = request.code.service_func_name + if service_func_name.startswith("simple_query"): + request.approve() # approve because it is good + if service_func_name.startswith("wrong_asset_query"): + request.approve() # approve because it is bad + if service_func_name.startswith("wrong_syntax_query"): + request.approve() # approve because it is bad + if service_func_name.startswith("job_too_much_text"): + request.deny(reason="too long, boring!") # deny because it is bad + if service_func_name.startswith("job_long_name"): + request.approve() + if service_func_name.startswith("job_funcname_xss"): + request.deny(reason="too long, boring!") # never reach doesnt matter + if service_func_name.startswith("job_query_xss"): + request.approve() # approve because it is bad + if service_func_name.startswith("job_many_columns"): + request.approve() # approve because it is bad + + return (request.id, request.status) + + +create_job_functions = [ + create_simple_query_job, # quick way to increase the odds + create_simple_query_job, + create_simple_query_job, + create_simple_query_job, + create_simple_query_job, + create_simple_query_job, + create_wrong_syntax_query, + create_long_query_job, + create_query_long_name, + create_job_funcname_xss, + create_job_query_xss, + create_job_many_columns, +] + + +def save_jobs(jobs, filepath="./jobs.json"): + user_jobs = defaultdict(list) + for job in jobs: + user_jobs[job.user_email].append(job.to_dict()) + with open(filepath, "w") as f: + f.write(json.dumps(user_jobs)) + + +def load_jobs(users, high_client, filepath="./jobs.json"): + data = {} + try: + with open(filepath) as f: + data = json.loads(f.read()) + except Exception as e: + print(f"cant read file: {filepath}: {e}") + data = {} + jobs_list = [] + for user in users: + if user.email not in data: + print(f"{user.email} missing from jobs") + continue + user_jobs = data[user.email] + for user_job in user_jobs: + test_job = TestJob(**user_job) + if user._client_cache is None: + user.client = high_client + test_job.client = user.client + jobs_list.append(test_job) + return jobs_list diff --git a/notebooks/scenarios/bigquery/upgradability/0.9.1_helpers/sync_helpers.py b/notebooks/scenarios/bigquery/upgradability/0.9.1_helpers/sync_helpers.py new file mode 100644 index 00000000000..069eacdc47b --- /dev/null +++ b/notebooks/scenarios/bigquery/upgradability/0.9.1_helpers/sync_helpers.py @@ -0,0 +1,192 @@ +# third party +from tqdm import tqdm + +# syft absolute +import syft as sy + +# relative +from syft.client.datasite_client import DatasiteClient +from syft.client.syncing import compare_clients +from syft.service.code.user_code import UserCode +from syft.service.job.job_stash import Job +from syft.service.job.job_stash import JobStatus +from syft.service.request.request import Request +from syft.service.request.request import RequestStatus +from syft.service.sync.diff_state import ObjectDiffBatch +from syft.types.result import Err + + +def deny_requests_without_autosync_tag(client_low: DatasiteClient): + # Deny all requests that are not autosync + requests = client_low.requests.get_all() + if isinstance(requests, sy.SyftError): + print(requests) + return + + denied_requests = [] + for request in tqdm(requests): + if request.status != RequestStatus.PENDING: + continue + if "autosync" not in request.tags: + request.deny( + reason="This request has been denied automatically. " + "Please use the designated API to submit your request." + ) + denied_requests.append(request.id) + print(f"Denied {len(denied_requests)} requests without autosync tag") + + +def is_request_to_sync(batch: ObjectDiffBatch) -> bool: + # True if this is a new low-side request + # TODO add condition for sql requests/usercodes + low_request = batch.root.low_obj + return ( + isinstance(low_request, Request) + and batch.status == "NEW" + and "autosync" in low_request.tags + ) + + +def is_job_to_sync(batch: ObjectDiffBatch): + # True if this is a new high-side job that is either COMPLETED or ERRORED + if batch.status != "NEW": + return False + if not isinstance(batch.root.high_obj, Job): + return False + job = batch.root.high_obj + return job.status in (JobStatus.ERRORED, JobStatus.COMPLETED) + + +def execute_requests( + client_high: DatasiteClient, request_ids: list[sy.UID] +) -> dict[sy.UID, Job]: + jobs_by_request_id = {} + for request_id in request_ids: + request = client_high.requests.get_by_uid(request_id) + if not isinstance(request, Request): + continue + + code = request.code + if not isinstance(code, UserCode): + continue + + func_name = request.code.service_func_name + api_func = getattr(client_high.code, func_name, None) + if api_func is None: + continue + + job = api_func(blocking=False) + jobs_by_request_id[request_id] = job + + return jobs_by_request_id + + +def deny_failed_jobs( + client_low: DatasiteClient, + jobs: list[Job], +) -> None: + # NOTE no syncing is needed, requests are denied on the low side + denied_requests = [] + + for job in jobs: + if job.status != JobStatus.ERRORED: + continue + + error_result = job.result + if isinstance(error_result, Err): + error_msg = error_result.err_value + else: + error_msg = "An unknown error occurred, please check the Job logs for more information." + + code_id = job.user_code_id + if code_id is None: + continue + requests = client_low.requests.get_by_usercode_id(code_id) + if isinstance(requests, list) and len(requests) > 0: + request = requests[0] + request.deny(reason=f"Execution failed: {error_msg}") + denied_requests.append(request.id) + else: + print(f"Failed to deny request for job {job.id}") + + print(f"Denied {len(denied_requests)} failed requests") + + +def sync_finished_jobs( + client_low: DatasiteClient, + client_high: DatasiteClient, +) -> dict[sy.UID, sy.SyftError | sy.SyftSuccess] | sy.SyftError: + sync_job_results = {} + synced_jobs = [] + diff = compare_clients( + from_client=client_high, to_client=client_low, include_types=["job"] + ) + if isinstance(diff, sy.SyftError): + print(diff) + return diff + + for batch in diff.batches: + if is_job_to_sync(batch): + job = batch.root.high_obj + + w = batch.resolve(build_state=False) + share_result = w.click_share_all_private_data() + if isinstance(share_result, sy.SyftError): + sync_job_results[job.id] = share_result + continue + sync_result = w.click_sync() + + synced_jobs.append(job) + sync_job_results[job.id] = sync_result + + print(f"Sharing {len(sync_job_results)} new results") + deny_failed_jobs(client_low, synced_jobs) + return sync_job_results + + +def sync_new_requests( + client_low: DatasiteClient, + client_high: DatasiteClient, +) -> dict[sy.UID, sy.SyftSuccess | sy.SyftError] | sy.SyftError: + sync_request_results = {} + diff = compare_clients( + from_client=client_low, to_client=client_high, include_types=["request"] + ) + if isinstance(diff, sy.SyftError): + print(diff) + return sync_request_results + print(f"{len(diff.batches)} request batches found") + for batch in tqdm(diff.batches): + if is_request_to_sync(batch): + request_id = batch.root.low_obj.id + w = batch.resolve(build_state=False) + result = w.click_sync() + sync_request_results[request_id] = result + return sync_request_results + + +def sync_and_execute_new_requests( + client_low: DatasiteClient, client_high: DatasiteClient +) -> None: + sync_results = sync_new_requests(client_low, client_high) + if isinstance(sync_results, sy.SyftError): + print(sync_results) + return + + request_ids = [ + uid for uid, res in sync_results.items() if isinstance(res, sy.SyftSuccess) + ] + print(f"Synced {len(request_ids)} new requests") + + jobs_by_request = execute_requests(client_high, request_ids) + print(f"Started {len(jobs_by_request)} new jobs") + + +def auto_sync(client_low: DatasiteClient, client_high: DatasiteClient) -> None: + print("Starting auto sync") + print("Denying non tagged jobs") + deny_requests_without_autosync_tag(client_low) + print("Syncing and executing") + sync_and_execute_new_requests(client_low, client_high) + sync_finished_jobs(client_low, client_high) + print("Finished auto sync") diff --git a/notebooks/scenarios/bigquery/upgradability/0.9.1_helpers/worker_helpers.py b/notebooks/scenarios/bigquery/upgradability/0.9.1_helpers/worker_helpers.py new file mode 100644 index 00000000000..3c2667fecc8 --- /dev/null +++ b/notebooks/scenarios/bigquery/upgradability/0.9.1_helpers/worker_helpers.py @@ -0,0 +1,86 @@ +# syft absolute +import syft as sy + + +def build_and_launch_worker_pool_from_docker_str( + environment: str, + client: sy.DatasiteClient, + worker_pool_name: str, + custom_pool_pod_annotations: dict, + custom_pool_pod_labels: dict, + worker_dockerfile: str, + external_registry: str, + docker_tag: str, + scale_to: int, +): + result = client.api.services.image_registry.add(external_registry) + assert "success" in result.message # nosec: B101 + + # For some reason, when using k9s, result.value is empty so can't use the below line + # local_registry = result.value + local_registry = client.api.services.image_registry[0] + + docker_config = sy.DockerWorkerConfig(dockerfile=worker_dockerfile) + assert docker_config.dockerfile == worker_dockerfile # nosec: B101 + submit_result = client.api.services.worker_image.submit(worker_config=docker_config) + print(submit_result.message) + assert "success" in submit_result.message # nosec: B101 + + worker_image = submit_result.value + + if environment == "remote": + docker_build_result = client.api.services.worker_image.build( + image_uid=worker_image.id, + tag=docker_tag, + registry_uid=local_registry.id, + ) + print(docker_build_result) + + if environment == "remote": + push_result = client.api.services.worker_image.push(worker_image.id) + print(push_result) + + result = client.api.services.worker_pool.launch( + pool_name=worker_pool_name, + image_uid=worker_image.id, + num_workers=1, + pod_annotations=custom_pool_pod_annotations, + pod_labels=custom_pool_pod_labels, + ) + print(result) + # assert 'success' in str(result.message) + + if environment == "remote": + result = client.worker_pools.scale(number=scale_to, pool_name=worker_pool_name) + print(result) + + +def launch_worker_pool_from_docker_tag_and_registry( + environment: str, + client: sy.DatasiteClient, + worker_pool_name: str, + custom_pool_pod_annotations: dict, + custom_pool_pod_labels: dict, + docker_tag: str, + external_registry: str, + scale_to: int = 1, +): + res = client.api.services.image_registry.add(external_registry) + assert "success" in res.message # nosec: B101 + docker_config = sy.PrebuiltWorkerConfig(tag=docker_tag) + image_result = client.api.services.worker_image.submit(worker_config=docker_config) + assert "success" in res.message # nosec: B101 + worker_image = image_result.value + + launch_result = client.api.services.worker_pool.launch( + pool_name=worker_pool_name, + image_uid=worker_image.id, + num_workers=1, + pod_annotations=custom_pool_pod_annotations, + pod_labels=custom_pool_pod_labels, + ) + if environment == "remote" and scale_to > 1: + result = client.worker_pools.scale(number=scale_to, pool_name=worker_pool_name) + print(result) + + return launch_result diff --git a/notebooks/scenarios/bigquery/upgradability/0.9.1_notebooks/000-start-and-configure-server-and-admins.ipynb b/notebooks/scenarios/bigquery/upgradability/0.9.1_notebooks/000-start-and-configure-server-and-admins.ipynb index 301c1037e38..d3aa5308f43 100644 --- a/notebooks/scenarios/bigquery/upgradability/0.9.1_notebooks/000-start-and-configure-server-and-admins.ipynb +++ b/notebooks/scenarios/bigquery/upgradability/0.9.1_notebooks/000-start-and-configure-server-and-admins.ipynb @@ -18,7 +18,15 @@ "cell_type": "code", "execution_count": 2, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "/home/teo/OpenMined/PySyft\n" + ] + } + ], "source": [ "# isort: off\n", "# stdlib\n", @@ -43,9 +51,10 @@ " current_path = import_path\n", "\n", " base_dir = find_base_dir_with_tox_ini(current_path)\n", - " notebook_helper_path = os.path.join(base_dir, \"notebooks/notebook_helpers\")\n", + " notebook_helper_path = os.path.join(base_dir, \"notebooks/scenarios/bigquery/upgradability/0.9.1_helpers\")\n", " sys.path.append(notebook_helper_path)\n", "\n", + "\n", "add_helper_path_to_python_path()\n", "\n", "# third party\n", @@ -102,33 +111,134 @@ "text": [ "INFO: Will watch for changes in these directories: ['/home/teo/OpenMined/PySyft/packages/syft/src/syft']\n", "INFO: Uvicorn running on http://0.0.0.0:8080 (Press CTRL+C to quit)\n", - "INFO: Started reloader process [286781] using WatchFiles\n" + "INFO: Started reloader process [64107] using WatchFiles\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Waiting for server to start...WARN: private key is based on server name: bigquery-high in dev_mode. Don't run this in production.\n", + "Using SQLiteDBConfig and sqlite:////tmp/syft/fbdf5a287e58454cbbd3fac4ad744d37/db/fbdf5a287e58454cbbd3fac4ad744d37_json.db\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "INFO: Starting server with settings: {'name': 'bigquery-high', 'server_type': , 'server_side_type': , 'deployment_type': , 'processes': 1, 'reset': False, 'dev_mode': True, 'enable_warnings': False, 'in_memory_workers': True, 'queue_port': None, 'create_producer': True, 'n_consumers': 1, 'association_request_auto_approval': False, 'background_tasks': False, 'db_config': None, 'db_url': None} and worker class: \n" ] }, { "name": "stdout", "output_type": "stream", "text": [ - "Waiting for server to start..WARN: private key is based on server name: bigquery-high in dev_mode. Don't run this in production.\n", - "Document Store's SQLite DB path: /tmp/syft/fbdf5a287e58454cbbd3fac4ad744d37/db/fbdf5a287e58454cbbd3fac4ad744d37.sqlite\n", - "Action Store's SQLite DB path: /tmp/syft/fbdf5a287e58454cbbd3fac4ad744d37/db/fbdf5a287e58454cbbd3fac4ad744d37.sqlite\n", - ".Adding producer for queue: api_call on: tcp://localhost:52153\n" + "Adding producer for queue: api_call on: tcp://localhost:53903\n" + ] + }, + { + "ename": "KeyboardInterrupt", + "evalue": "", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mConnectionRefusedError\u001b[0m Traceback (most recent call last)", + "File \u001b[0;32m~/anaconda3/envs/syft_3.12/lib/python3.12/site-packages/urllib3/connection.py:196\u001b[0m, in \u001b[0;36mHTTPConnection._new_conn\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 195\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[0;32m--> 196\u001b[0m sock \u001b[38;5;241m=\u001b[39m \u001b[43mconnection\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mcreate_connection\u001b[49m\u001b[43m(\u001b[49m\n\u001b[1;32m 197\u001b[0m \u001b[43m \u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_dns_host\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mport\u001b[49m\u001b[43m)\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 198\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mtimeout\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 199\u001b[0m \u001b[43m \u001b[49m\u001b[43msource_address\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43msource_address\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 200\u001b[0m \u001b[43m \u001b[49m\u001b[43msocket_options\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43msocket_options\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 201\u001b[0m \u001b[43m \u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 202\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m socket\u001b[38;5;241m.\u001b[39mgaierror \u001b[38;5;28;01mas\u001b[39;00m e:\n", + "File \u001b[0;32m~/anaconda3/envs/syft_3.12/lib/python3.12/site-packages/urllib3/util/connection.py:85\u001b[0m, in \u001b[0;36mcreate_connection\u001b[0;34m(address, timeout, source_address, socket_options)\u001b[0m\n\u001b[1;32m 84\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[0;32m---> 85\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m err\n\u001b[1;32m 86\u001b[0m \u001b[38;5;28;01mfinally\u001b[39;00m:\n\u001b[1;32m 87\u001b[0m \u001b[38;5;66;03m# Break explicitly a reference cycle\u001b[39;00m\n", + "File \u001b[0;32m~/anaconda3/envs/syft_3.12/lib/python3.12/site-packages/urllib3/util/connection.py:73\u001b[0m, in \u001b[0;36mcreate_connection\u001b[0;34m(address, timeout, source_address, socket_options)\u001b[0m\n\u001b[1;32m 72\u001b[0m sock\u001b[38;5;241m.\u001b[39mbind(source_address)\n\u001b[0;32m---> 73\u001b[0m \u001b[43msock\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mconnect\u001b[49m\u001b[43m(\u001b[49m\u001b[43msa\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 74\u001b[0m \u001b[38;5;66;03m# Break explicitly a reference cycle\u001b[39;00m\n", + "\u001b[0;31mConnectionRefusedError\u001b[0m: [Errno 111] Connection refused", + "\nThe above exception was the direct cause of the following exception:\n", + "\u001b[0;31mNewConnectionError\u001b[0m Traceback (most recent call last)", + "File \u001b[0;32m~/anaconda3/envs/syft_3.12/lib/python3.12/site-packages/urllib3/connectionpool.py:789\u001b[0m, in \u001b[0;36mHTTPConnectionPool.urlopen\u001b[0;34m(self, method, url, body, headers, retries, redirect, assert_same_host, timeout, pool_timeout, release_conn, chunked, body_pos, preload_content, decode_content, **response_kw)\u001b[0m\n\u001b[1;32m 788\u001b[0m \u001b[38;5;66;03m# Make the request on the HTTPConnection object\u001b[39;00m\n\u001b[0;32m--> 789\u001b[0m response \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_make_request\u001b[49m\u001b[43m(\u001b[49m\n\u001b[1;32m 790\u001b[0m \u001b[43m \u001b[49m\u001b[43mconn\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 791\u001b[0m \u001b[43m \u001b[49m\u001b[43mmethod\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 792\u001b[0m \u001b[43m \u001b[49m\u001b[43murl\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 793\u001b[0m \u001b[43m \u001b[49m\u001b[43mtimeout\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mtimeout_obj\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 794\u001b[0m \u001b[43m \u001b[49m\u001b[43mbody\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mbody\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 795\u001b[0m \u001b[43m \u001b[49m\u001b[43mheaders\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mheaders\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 796\u001b[0m \u001b[43m \u001b[49m\u001b[43mchunked\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mchunked\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 797\u001b[0m \u001b[43m \u001b[49m\u001b[43mretries\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mretries\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 798\u001b[0m \u001b[43m \u001b[49m\u001b[43mresponse_conn\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mresponse_conn\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 799\u001b[0m \u001b[43m \u001b[49m\u001b[43mpreload_content\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mpreload_content\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 800\u001b[0m \u001b[43m \u001b[49m\u001b[43mdecode_content\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mdecode_content\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 801\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mresponse_kw\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 802\u001b[0m \u001b[43m\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 804\u001b[0m \u001b[38;5;66;03m# Everything went great!\u001b[39;00m\n", + "File \u001b[0;32m~/anaconda3/envs/syft_3.12/lib/python3.12/site-packages/urllib3/connectionpool.py:495\u001b[0m, in \u001b[0;36mHTTPConnectionPool._make_request\u001b[0;34m(self, conn, method, url, body, headers, retries, timeout, chunked, response_conn, preload_content, decode_content, enforce_content_length)\u001b[0m\n\u001b[1;32m 494\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[0;32m--> 495\u001b[0m \u001b[43mconn\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mrequest\u001b[49m\u001b[43m(\u001b[49m\n\u001b[1;32m 496\u001b[0m \u001b[43m \u001b[49m\u001b[43mmethod\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 497\u001b[0m \u001b[43m \u001b[49m\u001b[43murl\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 498\u001b[0m \u001b[43m \u001b[49m\u001b[43mbody\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mbody\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 499\u001b[0m \u001b[43m \u001b[49m\u001b[43mheaders\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mheaders\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 500\u001b[0m \u001b[43m \u001b[49m\u001b[43mchunked\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mchunked\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 501\u001b[0m \u001b[43m \u001b[49m\u001b[43mpreload_content\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mpreload_content\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 502\u001b[0m \u001b[43m \u001b[49m\u001b[43mdecode_content\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mdecode_content\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 503\u001b[0m \u001b[43m \u001b[49m\u001b[43menforce_content_length\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43menforce_content_length\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 504\u001b[0m \u001b[43m \u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 506\u001b[0m \u001b[38;5;66;03m# We are swallowing BrokenPipeError (errno.EPIPE) since the server is\u001b[39;00m\n\u001b[1;32m 507\u001b[0m \u001b[38;5;66;03m# legitimately able to close the connection after sending a valid response.\u001b[39;00m\n\u001b[1;32m 508\u001b[0m \u001b[38;5;66;03m# With this behaviour, the received response is still readable.\u001b[39;00m\n", + "File \u001b[0;32m~/anaconda3/envs/syft_3.12/lib/python3.12/site-packages/urllib3/connection.py:398\u001b[0m, in \u001b[0;36mHTTPConnection.request\u001b[0;34m(self, method, url, body, headers, chunked, preload_content, decode_content, enforce_content_length)\u001b[0m\n\u001b[1;32m 397\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mputheader(header, value)\n\u001b[0;32m--> 398\u001b[0m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mendheaders\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 400\u001b[0m \u001b[38;5;66;03m# If we're given a body we start sending that in chunks.\u001b[39;00m\n", + "File \u001b[0;32m~/anaconda3/envs/syft_3.12/lib/python3.12/http/client.py:1331\u001b[0m, in \u001b[0;36mHTTPConnection.endheaders\u001b[0;34m(self, message_body, encode_chunked)\u001b[0m\n\u001b[1;32m 1330\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m CannotSendHeader()\n\u001b[0;32m-> 1331\u001b[0m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_send_output\u001b[49m\u001b[43m(\u001b[49m\u001b[43mmessage_body\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mencode_chunked\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mencode_chunked\u001b[49m\u001b[43m)\u001b[49m\n", + "File \u001b[0;32m~/anaconda3/envs/syft_3.12/lib/python3.12/http/client.py:1091\u001b[0m, in \u001b[0;36mHTTPConnection._send_output\u001b[0;34m(self, message_body, encode_chunked)\u001b[0m\n\u001b[1;32m 1090\u001b[0m \u001b[38;5;28;01mdel\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_buffer[:]\n\u001b[0;32m-> 1091\u001b[0m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43msend\u001b[49m\u001b[43m(\u001b[49m\u001b[43mmsg\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 1093\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m message_body \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m:\n\u001b[1;32m 1094\u001b[0m \n\u001b[1;32m 1095\u001b[0m \u001b[38;5;66;03m# create a consistent interface to message_body\u001b[39;00m\n", + "File \u001b[0;32m~/anaconda3/envs/syft_3.12/lib/python3.12/http/client.py:1035\u001b[0m, in \u001b[0;36mHTTPConnection.send\u001b[0;34m(self, data)\u001b[0m\n\u001b[1;32m 1034\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mauto_open:\n\u001b[0;32m-> 1035\u001b[0m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mconnect\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 1036\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n", + "File \u001b[0;32m~/anaconda3/envs/syft_3.12/lib/python3.12/site-packages/urllib3/connection.py:236\u001b[0m, in \u001b[0;36mHTTPConnection.connect\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 235\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21mconnect\u001b[39m(\u001b[38;5;28mself\u001b[39m) \u001b[38;5;241m-\u001b[39m\u001b[38;5;241m>\u001b[39m \u001b[38;5;28;01mNone\u001b[39;00m:\n\u001b[0;32m--> 236\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39msock \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_new_conn\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 237\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_tunnel_host:\n\u001b[1;32m 238\u001b[0m \u001b[38;5;66;03m# If we're tunneling it means we're connected to our proxy.\u001b[39;00m\n", + "File \u001b[0;32m~/anaconda3/envs/syft_3.12/lib/python3.12/site-packages/urllib3/connection.py:211\u001b[0m, in \u001b[0;36mHTTPConnection._new_conn\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 210\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m \u001b[38;5;167;01mOSError\u001b[39;00m \u001b[38;5;28;01mas\u001b[39;00m e:\n\u001b[0;32m--> 211\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m NewConnectionError(\n\u001b[1;32m 212\u001b[0m \u001b[38;5;28mself\u001b[39m, \u001b[38;5;124mf\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mFailed to establish a new connection: \u001b[39m\u001b[38;5;132;01m{\u001b[39;00me\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m\"\u001b[39m\n\u001b[1;32m 213\u001b[0m ) \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;21;01me\u001b[39;00m\n\u001b[1;32m 215\u001b[0m \u001b[38;5;66;03m# Audit hooks are only available in Python 3.8+\u001b[39;00m\n", + "\u001b[0;31mNewConnectionError\u001b[0m: : Failed to establish a new connection: [Errno 111] Connection refused", + "\nThe above exception was the direct cause of the following exception:\n", + "\u001b[0;31mMaxRetryError\u001b[0m Traceback (most recent call last)", + "File \u001b[0;32m~/anaconda3/envs/syft_3.12/lib/python3.12/site-packages/requests/adapters.py:667\u001b[0m, in \u001b[0;36mHTTPAdapter.send\u001b[0;34m(self, request, stream, timeout, verify, cert, proxies)\u001b[0m\n\u001b[1;32m 666\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[0;32m--> 667\u001b[0m resp \u001b[38;5;241m=\u001b[39m \u001b[43mconn\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43murlopen\u001b[49m\u001b[43m(\u001b[49m\n\u001b[1;32m 668\u001b[0m \u001b[43m \u001b[49m\u001b[43mmethod\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mrequest\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mmethod\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 669\u001b[0m \u001b[43m \u001b[49m\u001b[43murl\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43murl\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 670\u001b[0m \u001b[43m \u001b[49m\u001b[43mbody\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mrequest\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mbody\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 671\u001b[0m \u001b[43m \u001b[49m\u001b[43mheaders\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mrequest\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mheaders\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 672\u001b[0m \u001b[43m \u001b[49m\u001b[43mredirect\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;28;43;01mFalse\u001b[39;49;00m\u001b[43m,\u001b[49m\n\u001b[1;32m 673\u001b[0m \u001b[43m \u001b[49m\u001b[43massert_same_host\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;28;43;01mFalse\u001b[39;49;00m\u001b[43m,\u001b[49m\n\u001b[1;32m 674\u001b[0m \u001b[43m \u001b[49m\u001b[43mpreload_content\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;28;43;01mFalse\u001b[39;49;00m\u001b[43m,\u001b[49m\n\u001b[1;32m 675\u001b[0m \u001b[43m \u001b[49m\u001b[43mdecode_content\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;28;43;01mFalse\u001b[39;49;00m\u001b[43m,\u001b[49m\n\u001b[1;32m 676\u001b[0m \u001b[43m \u001b[49m\u001b[43mretries\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mmax_retries\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 677\u001b[0m \u001b[43m \u001b[49m\u001b[43mtimeout\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mtimeout\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 678\u001b[0m \u001b[43m \u001b[49m\u001b[43mchunked\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mchunked\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 679\u001b[0m \u001b[43m \u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 681\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m (ProtocolError, \u001b[38;5;167;01mOSError\u001b[39;00m) \u001b[38;5;28;01mas\u001b[39;00m err:\n", + "File \u001b[0;32m~/anaconda3/envs/syft_3.12/lib/python3.12/site-packages/urllib3/connectionpool.py:843\u001b[0m, in \u001b[0;36mHTTPConnectionPool.urlopen\u001b[0;34m(self, method, url, body, headers, retries, redirect, assert_same_host, timeout, pool_timeout, release_conn, chunked, body_pos, preload_content, decode_content, **response_kw)\u001b[0m\n\u001b[1;32m 841\u001b[0m new_e \u001b[38;5;241m=\u001b[39m ProtocolError(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mConnection aborted.\u001b[39m\u001b[38;5;124m\"\u001b[39m, new_e)\n\u001b[0;32m--> 843\u001b[0m retries \u001b[38;5;241m=\u001b[39m \u001b[43mretries\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mincrement\u001b[49m\u001b[43m(\u001b[49m\n\u001b[1;32m 844\u001b[0m \u001b[43m \u001b[49m\u001b[43mmethod\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43murl\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43merror\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mnew_e\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43m_pool\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43m_stacktrace\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43msys\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mexc_info\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\u001b[43m[\u001b[49m\u001b[38;5;241;43m2\u001b[39;49m\u001b[43m]\u001b[49m\n\u001b[1;32m 845\u001b[0m \u001b[43m\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 846\u001b[0m retries\u001b[38;5;241m.\u001b[39msleep()\n", + "File \u001b[0;32m~/anaconda3/envs/syft_3.12/lib/python3.12/site-packages/urllib3/util/retry.py:519\u001b[0m, in \u001b[0;36mRetry.increment\u001b[0;34m(self, method, url, response, error, _pool, _stacktrace)\u001b[0m\n\u001b[1;32m 518\u001b[0m reason \u001b[38;5;241m=\u001b[39m error \u001b[38;5;129;01mor\u001b[39;00m ResponseError(cause)\n\u001b[0;32m--> 519\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m MaxRetryError(_pool, url, reason) \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;21;01mreason\u001b[39;00m \u001b[38;5;66;03m# type: ignore[arg-type]\u001b[39;00m\n\u001b[1;32m 521\u001b[0m log\u001b[38;5;241m.\u001b[39mdebug(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mIncremented Retry for (url=\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;132;01m%s\u001b[39;00m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m): \u001b[39m\u001b[38;5;132;01m%r\u001b[39;00m\u001b[38;5;124m\"\u001b[39m, url, new_retry)\n", + "\u001b[0;31mMaxRetryError\u001b[0m: HTTPConnectionPool(host='0.0.0.0', port=8080): Max retries exceeded with url: /api/v2/metadata (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 111] Connection refused'))", + "\nDuring handling of the above exception, another exception occurred:\n", + "\u001b[0;31mConnectionError\u001b[0m Traceback (most recent call last)", + "File \u001b[0;32m~/OpenMined/PySyft/packages/syft/src/syft/server/uvicorn.py:299\u001b[0m, in \u001b[0;36mserve_server..start\u001b[0;34m()\u001b[0m\n\u001b[1;32m 298\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[0;32m--> 299\u001b[0m req \u001b[38;5;241m=\u001b[39m \u001b[43mrequests\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mget\u001b[49m\u001b[43m(\u001b[49m\n\u001b[1;32m 300\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;124;43mf\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43mhttp://\u001b[39;49m\u001b[38;5;132;43;01m{\u001b[39;49;00m\u001b[43mhost\u001b[49m\u001b[38;5;132;43;01m}\u001b[39;49;00m\u001b[38;5;124;43m:\u001b[39;49m\u001b[38;5;132;43;01m{\u001b[39;49;00m\u001b[43mport\u001b[49m\u001b[38;5;132;43;01m}\u001b[39;49;00m\u001b[38;5;132;43;01m{\u001b[39;49;00m\u001b[43mAPI_PATH\u001b[49m\u001b[38;5;132;43;01m}\u001b[39;49;00m\u001b[38;5;124;43m/metadata\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m,\u001b[49m\n\u001b[1;32m 301\u001b[0m \u001b[43m \u001b[49m\u001b[43mtimeout\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mDEFAULT_TIMEOUT\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 302\u001b[0m \u001b[43m \u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 303\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m req\u001b[38;5;241m.\u001b[39mstatus_code \u001b[38;5;241m==\u001b[39m \u001b[38;5;241m200\u001b[39m:\n", + "File \u001b[0;32m~/anaconda3/envs/syft_3.12/lib/python3.12/site-packages/requests/api.py:73\u001b[0m, in \u001b[0;36mget\u001b[0;34m(url, params, **kwargs)\u001b[0m\n\u001b[1;32m 63\u001b[0m \u001b[38;5;250m\u001b[39m\u001b[38;5;124mr\u001b[39m\u001b[38;5;124;03m\"\"\"Sends a GET request.\u001b[39;00m\n\u001b[1;32m 64\u001b[0m \n\u001b[1;32m 65\u001b[0m \u001b[38;5;124;03m:param url: URL for the new :class:`Request` object.\u001b[39;00m\n\u001b[0;32m (...)\u001b[0m\n\u001b[1;32m 70\u001b[0m \u001b[38;5;124;03m:rtype: requests.Response\u001b[39;00m\n\u001b[1;32m 71\u001b[0m \u001b[38;5;124;03m\"\"\"\u001b[39;00m\n\u001b[0;32m---> 73\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43mrequest\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43mget\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43murl\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mparams\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mparams\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n", + "File \u001b[0;32m~/anaconda3/envs/syft_3.12/lib/python3.12/site-packages/requests/api.py:59\u001b[0m, in \u001b[0;36mrequest\u001b[0;34m(method, url, **kwargs)\u001b[0m\n\u001b[1;32m 58\u001b[0m \u001b[38;5;28;01mwith\u001b[39;00m sessions\u001b[38;5;241m.\u001b[39mSession() \u001b[38;5;28;01mas\u001b[39;00m session:\n\u001b[0;32m---> 59\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43msession\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mrequest\u001b[49m\u001b[43m(\u001b[49m\u001b[43mmethod\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mmethod\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43murl\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43murl\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n", + "File \u001b[0;32m~/anaconda3/envs/syft_3.12/lib/python3.12/site-packages/requests/sessions.py:589\u001b[0m, in \u001b[0;36mSession.request\u001b[0;34m(self, method, url, params, data, headers, cookies, files, auth, timeout, allow_redirects, proxies, hooks, stream, verify, cert, json)\u001b[0m\n\u001b[1;32m 588\u001b[0m send_kwargs\u001b[38;5;241m.\u001b[39mupdate(settings)\n\u001b[0;32m--> 589\u001b[0m resp \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43msend\u001b[49m\u001b[43m(\u001b[49m\u001b[43mprep\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43msend_kwargs\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 591\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m resp\n", + "File \u001b[0;32m~/anaconda3/envs/syft_3.12/lib/python3.12/site-packages/requests/sessions.py:703\u001b[0m, in \u001b[0;36mSession.send\u001b[0;34m(self, request, **kwargs)\u001b[0m\n\u001b[1;32m 702\u001b[0m \u001b[38;5;66;03m# Send the request\u001b[39;00m\n\u001b[0;32m--> 703\u001b[0m r \u001b[38;5;241m=\u001b[39m \u001b[43madapter\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43msend\u001b[49m\u001b[43m(\u001b[49m\u001b[43mrequest\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 705\u001b[0m \u001b[38;5;66;03m# Total elapsed time of the request (approximately)\u001b[39;00m\n", + "File \u001b[0;32m~/anaconda3/envs/syft_3.12/lib/python3.12/site-packages/requests/adapters.py:700\u001b[0m, in \u001b[0;36mHTTPAdapter.send\u001b[0;34m(self, request, stream, timeout, verify, cert, proxies)\u001b[0m\n\u001b[1;32m 698\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m SSLError(e, request\u001b[38;5;241m=\u001b[39mrequest)\n\u001b[0;32m--> 700\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mConnectionError\u001b[39;00m(e, request\u001b[38;5;241m=\u001b[39mrequest)\n\u001b[1;32m 702\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m ClosedPoolError \u001b[38;5;28;01mas\u001b[39;00m e:\n", + "\u001b[0;31mConnectionError\u001b[0m: HTTPConnectionPool(host='0.0.0.0', port=8080): Max retries exceeded with url: /api/v2/metadata (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 111] Connection refused'))", + "\nDuring handling of the above exception, another exception occurred:\n", + "\u001b[0;31mKeyboardInterrupt\u001b[0m Traceback (most recent call last)", + "Cell \u001b[0;32mIn[5], line 1\u001b[0m\n\u001b[0;32m----> 1\u001b[0m server \u001b[38;5;241m=\u001b[39m \u001b[43msy\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43morchestra\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mlaunch\u001b[49m\u001b[43m(\u001b[49m\n\u001b[1;32m 2\u001b[0m \u001b[43m \u001b[49m\u001b[43mname\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43mbigquery-high\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m,\u001b[49m\n\u001b[1;32m 3\u001b[0m \u001b[43m \u001b[49m\u001b[43mdev_mode\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;28;43;01mTrue\u001b[39;49;00m\u001b[43m,\u001b[49m\n\u001b[1;32m 4\u001b[0m \u001b[43m \u001b[49m\u001b[43mserver_side_type\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43mhigh\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m,\u001b[49m\n\u001b[1;32m 5\u001b[0m \u001b[43m \u001b[49m\u001b[43mreset\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;28;43;01mTrue\u001b[39;49;00m\u001b[43m,\u001b[49m\n\u001b[1;32m 6\u001b[0m \u001b[43m \u001b[49m\u001b[43mport\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43m8080\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m,\u001b[49m\n\u001b[1;32m 7\u001b[0m \u001b[43m \u001b[49m\u001b[43mn_consumers\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;241;43m1\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;66;43;03m# How many workers to be spawned\u001b[39;49;00m\n\u001b[1;32m 8\u001b[0m \u001b[43m \u001b[49m\u001b[43mcreate_producer\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;28;43;01mTrue\u001b[39;49;00m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;66;43;03m# Can produce more workers\u001b[39;49;00m\n\u001b[1;32m 9\u001b[0m \u001b[43m)\u001b[49m\n", + "File \u001b[0;32m~/OpenMined/PySyft/packages/syft/src/syft/orchestra.py:361\u001b[0m, in \u001b[0;36mOrchestra.launch\u001b[0;34m(name, server_type, deploy_to, server_side_type, port, processes, local_db, dev_mode, reset, log_level, tail, host, enable_warnings, n_consumers, thread_workers, create_producer, queue_port, association_request_auto_approval, background_tasks, debug, migrate, from_state_folder, consumer_type, db_url)\u001b[0m\n\u001b[1;32m 356\u001b[0m deployment_type_enum: DeploymentType \u001b[38;5;241m|\u001b[39m \u001b[38;5;28;01mNone\u001b[39;00m \u001b[38;5;241m=\u001b[39m get_deployment_type(\n\u001b[1;32m 357\u001b[0m deployment_type\u001b[38;5;241m=\u001b[39mdeploy_to\n\u001b[1;32m 358\u001b[0m )\n\u001b[1;32m 360\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m deployment_type_enum \u001b[38;5;241m==\u001b[39m DeploymentType\u001b[38;5;241m.\u001b[39mPYTHON:\n\u001b[0;32m--> 361\u001b[0m server_handle \u001b[38;5;241m=\u001b[39m \u001b[43mdeploy_to_python\u001b[49m\u001b[43m(\u001b[49m\n\u001b[1;32m 362\u001b[0m \u001b[43m \u001b[49m\u001b[43mserver_type_enum\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mserver_type_enum\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 363\u001b[0m \u001b[43m \u001b[49m\u001b[43mdeployment_type_enum\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mdeployment_type_enum\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 364\u001b[0m \u001b[43m \u001b[49m\u001b[43mport\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mport\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 365\u001b[0m \u001b[43m \u001b[49m\u001b[43mname\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mname\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 366\u001b[0m \u001b[43m \u001b[49m\u001b[43mhost\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mhost\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 367\u001b[0m \u001b[43m \u001b[49m\u001b[43mreset\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mreset\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 368\u001b[0m \u001b[43m \u001b[49m\u001b[43mtail\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mtail\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 369\u001b[0m \u001b[43m \u001b[49m\u001b[43mdev_mode\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mdev_mode\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 370\u001b[0m \u001b[43m \u001b[49m\u001b[43mprocesses\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mprocesses\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 371\u001b[0m \u001b[43m \u001b[49m\u001b[43mlocal_db\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mlocal_db\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 372\u001b[0m \u001b[43m \u001b[49m\u001b[43mserver_side_type\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mserver_side_type_enum\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 373\u001b[0m \u001b[43m \u001b[49m\u001b[43menable_warnings\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43menable_warnings\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 374\u001b[0m \u001b[43m \u001b[49m\u001b[43mlog_level\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mlog_level\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 375\u001b[0m \u001b[43m \u001b[49m\u001b[43mn_consumers\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mn_consumers\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 376\u001b[0m \u001b[43m \u001b[49m\u001b[43mthread_workers\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mthread_workers\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 377\u001b[0m \u001b[43m \u001b[49m\u001b[43mcreate_producer\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mcreate_producer\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 378\u001b[0m \u001b[43m \u001b[49m\u001b[43mqueue_port\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mqueue_port\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 379\u001b[0m \u001b[43m \u001b[49m\u001b[43massociation_request_auto_approval\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43massociation_request_auto_approval\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 380\u001b[0m \u001b[43m \u001b[49m\u001b[43mbackground_tasks\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mbackground_tasks\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 381\u001b[0m \u001b[43m \u001b[49m\u001b[43mdebug\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mdebug\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 382\u001b[0m \u001b[43m \u001b[49m\u001b[43mmigrate\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mmigrate\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 383\u001b[0m \u001b[43m \u001b[49m\u001b[43mconsumer_type\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mconsumer_type\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 384\u001b[0m \u001b[43m \u001b[49m\u001b[43mdb_url\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mdb_url\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 385\u001b[0m \u001b[43m \u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 386\u001b[0m display(\n\u001b[1;32m 387\u001b[0m SyftInfo(\n\u001b[1;32m 388\u001b[0m message\u001b[38;5;241m=\u001b[39m\u001b[38;5;124mf\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mYou have launched a development server at http://\u001b[39m\u001b[38;5;132;01m{\u001b[39;00mhost\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m:\u001b[39m\u001b[38;5;132;01m{\u001b[39;00mserver_handle\u001b[38;5;241m.\u001b[39mport\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m.\u001b[39m\u001b[38;5;124m\"\u001b[39m\n\u001b[1;32m 389\u001b[0m \u001b[38;5;241m+\u001b[39m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m It is intended only for local use.\u001b[39m\u001b[38;5;124m\"\u001b[39m\n\u001b[1;32m 390\u001b[0m )\n\u001b[1;32m 391\u001b[0m )\n\u001b[1;32m 392\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m server_handle\n", + "File \u001b[0;32m~/OpenMined/PySyft/packages/syft/src/syft/orchestra.py:240\u001b[0m, in \u001b[0;36mdeploy_to_python\u001b[0;34m(server_type_enum, deployment_type_enum, port, name, host, reset, tail, dev_mode, processes, local_db, server_side_type, enable_warnings, n_consumers, thread_workers, create_producer, queue_port, association_request_auto_approval, background_tasks, log_level, debug, migrate, consumer_type, db_url)\u001b[0m\n\u001b[1;32m 237\u001b[0m supported_kwargs \u001b[38;5;241m=\u001b[39m {k: v \u001b[38;5;28;01mfor\u001b[39;00m k, v \u001b[38;5;129;01min\u001b[39;00m kwargs\u001b[38;5;241m.\u001b[39mitems() \u001b[38;5;28;01mif\u001b[39;00m k \u001b[38;5;129;01min\u001b[39;00m sig\u001b[38;5;241m.\u001b[39mparameters}\n\u001b[1;32m 239\u001b[0m start, stop \u001b[38;5;241m=\u001b[39m serve_server(\u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39msupported_kwargs)\n\u001b[0;32m--> 240\u001b[0m \u001b[43mstart\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 241\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m ServerHandle(\n\u001b[1;32m 242\u001b[0m server_type\u001b[38;5;241m=\u001b[39mserver_type_enum,\n\u001b[1;32m 243\u001b[0m deployment_type\u001b[38;5;241m=\u001b[39mdeployment_type_enum,\n\u001b[0;32m (...)\u001b[0m\n\u001b[1;32m 248\u001b[0m server_side_type\u001b[38;5;241m=\u001b[39mserver_side_type,\n\u001b[1;32m 249\u001b[0m )\n\u001b[1;32m 250\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n", + "File \u001b[0;32m~/OpenMined/PySyft/packages/syft/src/syft/server/uvicorn.py:307\u001b[0m, in \u001b[0;36mserve_server..start\u001b[0;34m()\u001b[0m\n\u001b[1;32m 305\u001b[0m \u001b[38;5;28;01mbreak\u001b[39;00m\n\u001b[1;32m 306\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m \u001b[38;5;167;01mException\u001b[39;00m:\n\u001b[0;32m--> 307\u001b[0m \u001b[43mtime\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43msleep\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;241;43m1\u001b[39;49m\u001b[43m)\u001b[49m\n\u001b[1;32m 308\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m i \u001b[38;5;241m==\u001b[39m \u001b[38;5;241m0\u001b[39m:\n\u001b[1;32m 309\u001b[0m \u001b[38;5;28mprint\u001b[39m(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mWaiting for server to start\u001b[39m\u001b[38;5;124m\"\u001b[39m, end\u001b[38;5;241m=\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m\"\u001b[39m)\n", + "\u001b[0;31mKeyboardInterrupt\u001b[0m: " ] }, { "name": "stderr", "output_type": "stream", "text": [ - "INFO: Started server process [286795]\n", + "INFO: Started server process [64121]\n", "INFO: Waiting for application startup.\n", - "INFO: Application startup complete.\n" + "INFO: Application startup complete.\n", + "INFO: Stopping reloader process [64107]\n" + ] + } + ], + "source": [ + "server = sy.orchestra.launch(\n", + " name=\"bigquery-high\",\n", + " dev_mode=True,\n", + " server_side_type=\"high\",\n", + " reset=True,\n", + " port=\"8080\",\n", + " n_consumers=1, # How many workers to be spawned\n", + " create_producer=True, # Can produce more workers\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "> Starting SMTPTestServer on: 0.0.0.0:9025\n" + ] + } + ], + "source": [ + "email_server, smtp_server = get_email_server(reset=True)" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "> Starting SMTPTestServer on: 0.0.0.0:9025\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ - ". Done.\n" + "Logged into as \n" ] }, { @@ -963,58 +1073,16 @@ " vertical-align: bottom;\n", "}\n", "\n", - "


" + "
SyftWarning:
You are using a default password. Please change the password using `[your_client].account.set_password([new_password])`.

" ], "text/plain": [ - "SyftInfo: You have launched a development server at http://0.0.0.0:8080.It is intended only for local use." + "SyftWarning: You are using a default password. Please change the password using `[your_client].account.set_password([new_password])`." ] }, "metadata": {}, "output_type": "display_data" } ], - "source": [ - "server = sy.orchestra.launch(\n", - " name=\"bigquery-high\",\n", - " dev_mode=True,\n", - " server_side_type=\"high\",\n", - " reset=True,\n", - " port=\"8080\",\n", - " n_consumers=1, # How many workers to be spawned\n", - " create_producer=True, # Can produce more workers\n", - ")" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "> Starting SMTPTestServer on: 0.0.0.0:9025\n" - ] - } - ], - "source": [ - "email_server, smtp_server = get_email_server(reset=True)" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "> Starting SMTPTestServer on: 0.0.0.0:9025\n" - ] - } - ], "source": [ "root_client = sy.login(\n", " url=\"http://localhost:8080\", email=ROOT_EMAIL, password=ROOT_PASSWORD\n", @@ -1030,7 +1098,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 8, "metadata": {}, "outputs": [], "source": [ @@ -1039,9 +1107,33 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 9, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/markdown": [ + "```python\n", + "class UserView:\n", + " id: str = 57df96fef9fb423998953a43699d54ae\n", + " name: str = \"second admin\"\n", + " email: str = \"admin2@bigquery.org\"\n", + " institution: str = None\n", + " website: str = None\n", + " role: str = ServiceRole.ADMIN\n", + " notifications_enabled: str = {: True, : False, : False, : False}\n", + "\n", + "```" + ], + "text/plain": [ + "syft.service.user.user.UserView" + ] + }, + "execution_count": 9, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "# create\n", "root_client.register(\n", @@ -1061,9 +1153,17 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 10, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Logged into as \n" + ] + } + ], "source": [ "high_client = sy.login(\n", " url=\"http://localhost:8080\", email=ADMIN_EMAIL, password=ADMIN_PW\n", @@ -1072,7 +1172,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 11, "metadata": {}, "outputs": [], "source": [ @@ -1081,7 +1181,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 12, "metadata": {}, "outputs": [], "source": [ @@ -1098,9 +1198,33 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 13, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/markdown": [ + "```python\n", + "class UserView:\n", + " id: str = 57df96fef9fb423998953a43699d54ae\n", + " name: str = \"second admin\"\n", + " email: str = \"admin2@bigquery.org\"\n", + " institution: str = None\n", + " website: str = None\n", + " role: str = ServiceRole.ADMIN\n", + " notifications_enabled: str = {: True, : False, : False, : False}\n", + "\n", + "```" + ], + "text/plain": [ + "syft.service.user.user.UserView" + ] + }, + "execution_count": 13, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "# register 2nd new admin (to delete)\n", "user_email, user_pw = \"admin3@bigquery.org\", \"bqpw3\"\n", @@ -1115,9 +1239,20 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 14, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 14, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "root_client.users.delete(new_user_id2)" ] @@ -1131,18 +1266,51 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 15, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "> Stopping SMTPTestServer\n" + ] + } + ], "source": [ "smtp_server.stop()" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 16, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Stopping bigquery-high\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "INFO: Shutting down\n", + "INFO: Waiting for application shutdown.\n", + "INFO: Application shutdown complete.\n", + "INFO: Finished server process [362383]\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "INFO: Stopping reloader process [362369]\n" + ] + } + ], "source": [ "server.land()" ] diff --git a/notebooks/scenarios/bigquery/upgradability/0.9.1_notebooks/001-scale-delete-worker-pools.ipynb b/notebooks/scenarios/bigquery/upgradability/0.9.1_notebooks/001-scale-delete-worker-pools.ipynb index 9adb4ecb07a..3fadb438a69 100644 --- a/notebooks/scenarios/bigquery/upgradability/0.9.1_notebooks/001-scale-delete-worker-pools.ipynb +++ b/notebooks/scenarios/bigquery/upgradability/0.9.1_notebooks/001-scale-delete-worker-pools.ipynb @@ -41,9 +41,10 @@ " current_path = import_path\n", "\n", " base_dir = find_base_dir_with_tox_ini(current_path)\n", - " notebook_helper_path = os.path.join(base_dir, \"notebooks/notebook_helpers\")\n", + " notebook_helper_path = os.path.join(base_dir, \"notebooks/scenarios/bigquery/upgradability/0.9.1_helpers\")\n", " sys.path.append(notebook_helper_path)\n", "\n", + "\n", "add_helper_path_to_python_path()\n", "\n", "# third party\n", diff --git a/notebooks/scenarios/bigquery/upgradability/0.9.1_notebooks/010-setup-bigquery-pool.ipynb b/notebooks/scenarios/bigquery/upgradability/0.9.1_notebooks/010-setup-bigquery-pool.ipynb index dd41acbecdb..756ac8a574b 100644 --- a/notebooks/scenarios/bigquery/upgradability/0.9.1_notebooks/010-setup-bigquery-pool.ipynb +++ b/notebooks/scenarios/bigquery/upgradability/0.9.1_notebooks/010-setup-bigquery-pool.ipynb @@ -28,6 +28,7 @@ "from syft.util.util import find_base_dir_with_tox_ini, get_caller_file_path, is_interpreter_jupyter\n", "\n", "\n", + "\n", "def add_helper_path_to_python_path() -> None:\n", " current_path = \".\"\n", "\n", @@ -39,7 +40,7 @@ " current_path = import_path\n", "\n", " base_dir = find_base_dir_with_tox_ini(current_path)\n", - " notebook_helper_path = os.path.join(base_dir, \"notebooks/notebook_helpers\")\n", + " notebook_helper_path = os.path.join(base_dir, \"notebooks/scenarios/bigquery/upgradability/0.9.1_helpers\")\n", " sys.path.append(notebook_helper_path)\n", "\n", "add_helper_path_to_python_path()\n", diff --git a/notebooks/scenarios/bigquery/upgradability/0.9.1_notebooks/011-users-emails-passwords.ipynb b/notebooks/scenarios/bigquery/upgradability/0.9.1_notebooks/011-users-emails-passwords.ipynb index 2366d435149..d4e25d192da 100644 --- a/notebooks/scenarios/bigquery/upgradability/0.9.1_notebooks/011-users-emails-passwords.ipynb +++ b/notebooks/scenarios/bigquery/upgradability/0.9.1_notebooks/011-users-emails-passwords.ipynb @@ -43,7 +43,7 @@ " current_path = import_path\n", "\n", " base_dir = find_base_dir_with_tox_ini(current_path)\n", - " notebook_helper_path = os.path.join(base_dir, \"notebooks/notebook_helpers\")\n", + " notebook_helper_path = os.path.join(base_dir, \"notebooks/scenarios/bigquery/upgradability/0.9.1_helpers\")\n", " sys.path.append(notebook_helper_path)\n", "\n", "add_helper_path_to_python_path()\n", @@ -351,7 +351,7 @@ "metadata": {}, "outputs": [], "source": [ - "# This is necessary as it sets the new token value in user.reset_token\n", + "# # This is necessary as it sets the new token value in user.reset_token\n", "token = reset_password_user.get_token()\n", "token" ] @@ -363,7 +363,7 @@ "metadata": {}, "outputs": [], "source": [ - "# This is necessary as it sets the new password value in user.new_password\n", + "#This is necessary as it sets the new password value in user.new_password\n", "passw = reset_password_user.make_new_password()\n", "passw" ] @@ -548,7 +548,7 @@ "metadata": {}, "outputs": [], "source": [ - "reset_password_user.client.guest().forgot_password(email=reset_password_user.email)" + "# reset_password_user.client.guest().forgot_password(email=reset_password_user.email)" ] }, { @@ -570,11 +570,11 @@ "outputs": [], "source": [ "# This should throw a SyftError because we waited too long\n", - "output = reset_password_user.client.guest().reset_password(\n", - " token=reset_password_user.get_token(),\n", - " new_password=reset_password_user.make_new_password(),\n", - ")\n", - "output" + "# output = reset_password_user.client.guest().reset_password(\n", + "# token=reset_password_user.get_token(),\n", + "# new_password=reset_password_user.make_new_password(),\n", + "# )\n", + "# output" ] }, { diff --git a/notebooks/scenarios/bigquery/upgradability/0.9.1_notebooks/020-configure-api.ipynb b/notebooks/scenarios/bigquery/upgradability/0.9.1_notebooks/020-configure-api.ipynb index db010007240..a4cac74fedc 100644 --- a/notebooks/scenarios/bigquery/upgradability/0.9.1_notebooks/020-configure-api.ipynb +++ b/notebooks/scenarios/bigquery/upgradability/0.9.1_notebooks/020-configure-api.ipynb @@ -2,7 +2,7 @@ "cells": [ { "cell_type": "code", - "execution_count": null, + "execution_count": 1, "metadata": {}, "outputs": [], "source": [ @@ -14,7 +14,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 2, "metadata": {}, "outputs": [], "source": [ @@ -24,7 +24,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 3, "metadata": {}, "outputs": [], "source": [ @@ -49,12 +49,12 @@ " current_path = import_path\n", "\n", " base_dir = find_base_dir_with_tox_ini(current_path)\n", - " notebook_helper_path = os.path.join(base_dir, \"notebooks/notebook_helpers\")\n", + " notebook_helper_path = os.path.join(base_dir, \"notebooks/scenarios/bigquery/upgradability/0.9.1_helpers\")\n", " sys.path.append(notebook_helper_path)\n", "\n", + "\n", "add_helper_path_to_python_path()\n", "from syft import test_settings\n", - "\n", "# third party\n", "from apis import make_schema\n", "from apis import make_submit_query\n", @@ -62,7 +62,7 @@ "\n", "# run email server\n", "from email_helpers import get_email_server\n", - "# isort: on" + "# isort: on\n" ] }, { @@ -634,7 +634,7 @@ ], "metadata": { "kernelspec": { - "display_name": "Python 3 (ipykernel)", + "display_name": "syft_3.12", "language": "python", "name": "python3" }, @@ -648,7 +648,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.12.5" + "version": "3.12.4" } }, "nbformat": 4, diff --git a/notebooks/scenarios/bigquery/upgradability/0.9.1_notebooks/021-create-jobs.ipynb b/notebooks/scenarios/bigquery/upgradability/0.9.1_notebooks/021-create-jobs.ipynb index 6228874bbb5..35556a11624 100644 --- a/notebooks/scenarios/bigquery/upgradability/0.9.1_notebooks/021-create-jobs.ipynb +++ b/notebooks/scenarios/bigquery/upgradability/0.9.1_notebooks/021-create-jobs.ipynb @@ -55,15 +55,21 @@ " current_path = import_path\n", "\n", " base_dir = find_base_dir_with_tox_ini(current_path)\n", - " notebook_helper_path = os.path.join(base_dir, \"notebooks/notebook_helpers\")\n", + " notebook_helper_path = os.path.join(base_dir, \"notebooks/scenarios/bigquery/upgradability/0.9.1_helpers\")\n", " sys.path.append(notebook_helper_path)\n", "\n", + "\n", "add_helper_path_to_python_path()\n", "from syft.service.job.job_stash import JobStatus\n", "\n", "# third party\n", "from email_helpers import get_email_server\n", - "# isort: on" + "# isort: on\n", + "# third party\n", + "from job_helpers import TestJob\n", + "from job_helpers import create_jobs\n", + "from job_helpers import extract_code_path\n", + "from job_helpers import save_jobs" ] }, { @@ -147,6 +153,16 @@ "from email_helpers import load_users" ] }, + { + "cell_type": "code", + "execution_count": null, + "id": "0f7e1ce3", + "metadata": {}, + "outputs": [], + "source": [ + "[user.email for user in high_client.users.get_all()]" + ] + }, { "cell_type": "code", "execution_count": null, @@ -171,12 +187,7 @@ "id": "12", "metadata": {}, "outputs": [], - "source": [ - "# third party\n", - "from job_helpers import TestJob\n", - "from job_helpers import create_jobs\n", - "from job_helpers import extract_code_path" - ] + "source": [] }, { "cell_type": "markdown", @@ -216,10 +227,7 @@ "id": "16", "metadata": {}, "outputs": [], - "source": [ - "# third party\n", - "from job_helpers import save_jobs" - ] + "source": [] }, { "cell_type": "code", diff --git a/notebooks/scenarios/bigquery/upgradability/0.9.1_notebooks/040-do-review-requests.ipynb b/notebooks/scenarios/bigquery/upgradability/0.9.1_notebooks/040-do-review-requests.ipynb index ad84c120e74..1263bb83ded 100644 --- a/notebooks/scenarios/bigquery/upgradability/0.9.1_notebooks/040-do-review-requests.ipynb +++ b/notebooks/scenarios/bigquery/upgradability/0.9.1_notebooks/040-do-review-requests.ipynb @@ -29,6 +29,7 @@ "from syft.util.util import find_base_dir_with_tox_ini, get_caller_file_path, is_interpreter_jupyter\n", "\n", "\n", + "\n", "def add_helper_path_to_python_path() -> None:\n", " current_path = \".\"\n", "\n", @@ -40,9 +41,10 @@ " current_path = import_path\n", "\n", " base_dir = find_base_dir_with_tox_ini(current_path)\n", - " notebook_helper_path = os.path.join(base_dir, \"notebooks/notebook_helpers\")\n", + " notebook_helper_path = os.path.join(base_dir, \"notebooks/scenarios/bigquery/upgradability/0.9.1_helpers\")\n", " sys.path.append(notebook_helper_path)\n", "\n", + "\n", "add_helper_path_to_python_path()\n", "from syft.service.job.job_stash import Job\n", "\n", diff --git a/notebooks/scenarios/bigquery/upgradability/0.9.1_notebooks/050-ds-get-results.ipynb b/notebooks/scenarios/bigquery/upgradability/0.9.1_notebooks/050-ds-get-results.ipynb index 295202d92d2..0e855ca4355 100644 --- a/notebooks/scenarios/bigquery/upgradability/0.9.1_notebooks/050-ds-get-results.ipynb +++ b/notebooks/scenarios/bigquery/upgradability/0.9.1_notebooks/050-ds-get-results.ipynb @@ -26,6 +26,7 @@ "import os\n", "import sys\n", "\n", + "\n", "def add_helper_path_to_python_path() -> None:\n", " current_path = \".\"\n", "\n", @@ -37,9 +38,10 @@ " current_path = import_path\n", "\n", " base_dir = find_base_dir_with_tox_ini(current_path)\n", - " notebook_helper_path = os.path.join(base_dir, \"notebooks/notebook_helpers\")\n", + " notebook_helper_path = os.path.join(base_dir, \"notebooks/scenarios/bigquery/upgradability/0.9.1_helpers\")\n", " sys.path.append(notebook_helper_path)\n", "\n", + "\n", "add_helper_path_to_python_path()\n", "# third party\n", "from email_helpers import get_email_server\n", diff --git a/notebooks/scenarios/bigquery/upgradability/0.9.1_notebooks/emails.json b/notebooks/scenarios/bigquery/upgradability/0.9.1_notebooks/emails.json index 9e26dfeeb6e..6a2956c88e5 100644 --- a/notebooks/scenarios/bigquery/upgradability/0.9.1_notebooks/emails.json +++ b/notebooks/scenarios/bigquery/upgradability/0.9.1_notebooks/emails.json @@ -1 +1 @@ -{} \ No newline at end of file +{"admin@bigquery.org": [{"email_from": "noreply@openmined.org", "email_to": ["admin@bigquery.org"], "email_content": "Content-Type: multipart/alternative; boundary=\"===============1437349050515117628==\"\r\nMIME-Version: 1.0\r\nFrom: noreply@openmined.org\r\nTo: admin@bigquery.org\r\nSubject: Datasite bigquery-high: A New Request (40c2) has been received!\r\n\r\n--===============1437349050515117628==\r\nContent-Type: text/html; charset=\"us-ascii\"\r\nMIME-Version: 1.0\r\nContent-Transfer-Encoding: 7bit\r\n\r\n\r\n \r\n Access Request Notification\r\n \r\n \r\n \r\n
\r\n
\r\n Request Notification\r\n
\r\n
\r\n

Hello,

\r\n

A new request has been submitted and requires your attention.\r\n Please review the details below:

\r\n\r\n
\r\n
Request Details
\r\n
\r\n\r\n

ID: 40c2f7b149fe43e7b85ac1045d9059e4

\r\n

\r\n Submitted By:\r\n Peggy White\r\n

\r\n

Date: 2024-09-20 08:37:07

\r\n

Status:

\r\n PENDING\r\n
\r\n

Changes:\r\n UserCodeStatusChange\r\n

\r\n\r\n

Use:
\r\n \r\n request = client.api.services.request.get_by_uid(uid=sy.UID(\"40c2f7b149fe43e7b85ac1045d9059e4\"))\r\n
\r\n to get this specific request.\r\n

\r\n\r\n

Or you can view all requests with:
\r\n \r\n client.requests\r\n \r\n

\r\n\r\n
\r\n
\r\n

If you did not expect this request or have concerns about it,\r\n please contact our support team immediately.

\r\n
\r\n
\r\n This is an automated message, please do not reply directly to this email.
\r\n For assistance, please contact our support team.\r\n
\r\n
\r\n \r\n \r\n--===============1437349050515117628==--\r\n"}, {"email_from": "noreply@openmined.org", "email_to": ["admin@bigquery.org"], "email_content": "Content-Type: multipart/alternative; boundary=\"===============9033066230013415358==\"\r\nMIME-Version: 1.0\r\nFrom: noreply@openmined.org\r\nTo: admin@bigquery.org\r\nSubject: Datasite bigquery-high: A New Request (85c9) has been received!\r\n\r\n--===============9033066230013415358==\r\nContent-Type: text/html; charset=\"us-ascii\"\r\nMIME-Version: 1.0\r\nContent-Transfer-Encoding: 7bit\r\n\r\n\r\n \r\n Access Request Notification\r\n \r\n \r\n \r\n
\r\n
\r\n Request Notification\r\n
\r\n
\r\n

Hello,

\r\n

A new request has been submitted and requires your attention.\r\n Please review the details below:

\r\n\r\n
\r\n
Request Details
\r\n
\r\n\r\n

ID: 85c9d7c12a94422caeba2a543c3b6ccb

\r\n

\r\n Submitted By:\r\n Mark Dominguez\r\n

\r\n

Date: 2024-09-20 08:37:17

\r\n

Status:

\r\n PENDING\r\n
\r\n

Changes:\r\n UserCodeStatusChange\r\n

\r\n\r\n

Use:
\r\n \r\n request = client.api.services.request.get_by_uid(uid=sy.UID(\"85c9d7c12a94422caeba2a543c3b6ccb\"))\r\n
\r\n to get this specific request.\r\n

\r\n\r\n

Or you can view all requests with:
\r\n \r\n client.requests\r\n \r\n

\r\n\r\n
\r\n
\r\n

If you did not expect this request or have concerns about it,\r\n please contact our support team immediately.

\r\n
\r\n
\r\n This is an automated message, please do not reply directly to this email.
\r\n For assistance, please contact our support team.\r\n
\r\n
\r\n \r\n \r\n--===============9033066230013415358==--\r\n"}, {"email_from": "noreply@openmined.org", "email_to": ["admin@bigquery.org"], "email_content": "Content-Type: multipart/alternative; boundary=\"===============1346764797696267534==\"\r\nMIME-Version: 1.0\r\nFrom: noreply@openmined.org\r\nTo: admin@bigquery.org\r\nSubject: Datasite bigquery-high: A New Request (5e9b) has been received!\r\n\r\n--===============1346764797696267534==\r\nContent-Type: text/html; charset=\"us-ascii\"\r\nMIME-Version: 1.0\r\nContent-Transfer-Encoding: 7bit\r\n\r\n\r\n \r\n Access Request Notification\r\n \r\n \r\n \r\n
\r\n
\r\n Request Notification\r\n
\r\n
\r\n

Hello,

\r\n

A new request has been submitted and requires your attention.\r\n Please review the details below:

\r\n\r\n
\r\n
Request Details
\r\n
\r\n\r\n

ID: 5e9bb71343ac40bbb31211f885c16209

\r\n

\r\n Submitted By:\r\n Maxwell Soto\r\n

\r\n

Date: 2024-09-20 08:37:26

\r\n

Status:

\r\n PENDING\r\n
\r\n

Changes:\r\n UserCodeStatusChange\r\n

\r\n\r\n

Use:
\r\n \r\n request = client.api.services.request.get_by_uid(uid=sy.UID(\"5e9bb71343ac40bbb31211f885c16209\"))\r\n
\r\n to get this specific request.\r\n

\r\n\r\n

Or you can view all requests with:
\r\n \r\n client.requests\r\n \r\n

\r\n\r\n
\r\n
\r\n

If you did not expect this request or have concerns about it,\r\n please contact our support team immediately.

\r\n
\r\n
\r\n This is an automated message, please do not reply directly to this email.
\r\n For assistance, please contact our support team.\r\n
\r\n
\r\n \r\n \r\n--===============1346764797696267534==--\r\n"}, {"email_from": "noreply@openmined.org", "email_to": ["admin@bigquery.org"], "email_content": "Content-Type: multipart/alternative; boundary=\"===============4587598443381678696==\"\r\nMIME-Version: 1.0\r\nFrom: noreply@openmined.org\r\nTo: admin@bigquery.org\r\nSubject: Datasite bigquery-high: A New Request (57fb) has been received!\r\n\r\n--===============4587598443381678696==\r\nContent-Type: text/html; charset=\"us-ascii\"\r\nMIME-Version: 1.0\r\nContent-Transfer-Encoding: 7bit\r\n\r\n\r\n \r\n Access Request Notification\r\n \r\n \r\n \r\n
\r\n
\r\n Request Notification\r\n
\r\n
\r\n

Hello,

\r\n

A new request has been submitted and requires your attention.\r\n Please review the details below:

\r\n\r\n
\r\n
Request Details
\r\n
\r\n\r\n

ID: 57fb8d2b65044a8a91209ddbee6f1b0d

\r\n

\r\n Submitted By:\r\n Crystal Adams\r\n

\r\n

Date: 2024-09-20 08:37:36

\r\n

Status:

\r\n PENDING\r\n
\r\n

Changes:\r\n UserCodeStatusChange\r\n

\r\n\r\n

Use:
\r\n \r\n request = client.api.services.request.get_by_uid(uid=sy.UID(\"57fb8d2b65044a8a91209ddbee6f1b0d\"))\r\n
\r\n to get this specific request.\r\n

\r\n\r\n

Or you can view all requests with:
\r\n \r\n client.requests\r\n \r\n

\r\n\r\n
\r\n
\r\n

If you did not expect this request or have concerns about it,\r\n please contact our support team immediately.

\r\n
\r\n
\r\n This is an automated message, please do not reply directly to this email.
\r\n For assistance, please contact our support team.\r\n
\r\n
\r\n \r\n \r\n--===============4587598443381678696==--\r\n"}, {"email_from": "noreply@openmined.org", "email_to": ["admin@bigquery.org"], "email_content": "Content-Type: multipart/alternative; boundary=\"===============6115027196608862267==\"\r\nMIME-Version: 1.0\r\nFrom: noreply@openmined.org\r\nTo: admin@bigquery.org\r\nSubject: Datasite bigquery-high: A New Request (a44b) has been received!\r\n\r\n--===============6115027196608862267==\r\nContent-Type: text/html; charset=\"us-ascii\"\r\nMIME-Version: 1.0\r\nContent-Transfer-Encoding: 7bit\r\n\r\n\r\n \r\n Access Request Notification\r\n \r\n \r\n \r\n
\r\n
\r\n Request Notification\r\n
\r\n
\r\n

Hello,

\r\n

A new request has been submitted and requires your attention.\r\n Please review the details below:

\r\n\r\n
\r\n
Request Details
\r\n
\r\n\r\n

ID: a44b3a7a3b184ec58d7ae1eb79bd4719

\r\n

\r\n Submitted By:\r\n Evelyn Wilson\r\n

\r\n

Date: 2024-09-20 08:37:46

\r\n

Status:

\r\n PENDING\r\n
\r\n

Changes:\r\n UserCodeStatusChange\r\n

\r\n\r\n

Use:
\r\n \r\n request = client.api.services.request.get_by_uid(uid=sy.UID(\"a44b3a7a3b184ec58d7ae1eb79bd4719\"))\r\n
\r\n to get this specific request.\r\n

\r\n\r\n

Or you can view all requests with:
\r\n \r\n client.requests\r\n \r\n

\r\n\r\n
\r\n
\r\n

If you did not expect this request or have concerns about it,\r\n please contact our support team immediately.

\r\n
\r\n
\r\n This is an automated message, please do not reply directly to this email.
\r\n For assistance, please contact our support team.\r\n
\r\n
\r\n \r\n \r\n--===============6115027196608862267==--\r\n"}, {"email_from": "noreply@openmined.org", "email_to": ["admin@bigquery.org"], "email_content": "Content-Type: multipart/alternative; boundary=\"===============1343434348682324515==\"\r\nMIME-Version: 1.0\r\nFrom: noreply@openmined.org\r\nTo: admin@bigquery.org\r\nSubject: Datasite bigquery-high: A New Request (f67f) has been received!\r\n\r\n--===============1343434348682324515==\r\nContent-Type: text/html; charset=\"us-ascii\"\r\nMIME-Version: 1.0\r\nContent-Transfer-Encoding: 7bit\r\n\r\n\r\n \r\n Access Request Notification\r\n \r\n \r\n \r\n
\r\n
\r\n Request Notification\r\n
\r\n
\r\n

Hello,

\r\n

A new request has been submitted and requires your attention.\r\n Please review the details below:

\r\n\r\n
\r\n
Request Details
\r\n
\r\n\r\n

ID: f67fa2b87510462da7eedd2c01d7a9af

\r\n

\r\n Submitted By:\r\n Peggy White\r\n

\r\n

Date: 2024-09-20 08:37:55

\r\n

Status:

\r\n PENDING\r\n
\r\n

Changes:\r\n UserCodeStatusChange\r\n

\r\n\r\n

Use:
\r\n \r\n request = client.api.services.request.get_by_uid(uid=sy.UID(\"f67fa2b87510462da7eedd2c01d7a9af\"))\r\n
\r\n to get this specific request.\r\n

\r\n\r\n

Or you can view all requests with:
\r\n \r\n client.requests\r\n \r\n

\r\n\r\n
\r\n
\r\n

If you did not expect this request or have concerns about it,\r\n please contact our support team immediately.

\r\n
\r\n
\r\n This is an automated message, please do not reply directly to this email.
\r\n For assistance, please contact our support team.\r\n
\r\n
\r\n \r\n \r\n--===============1343434348682324515==--\r\n"}, {"email_from": "noreply@openmined.org", "email_to": ["admin@bigquery.org"], "email_content": "Content-Type: multipart/alternative; boundary=\"===============3287505056065109202==\"\r\nMIME-Version: 1.0\r\nFrom: noreply@openmined.org\r\nTo: admin@bigquery.org\r\nSubject: Datasite bigquery-high: A New Request (87e1) has been received!\r\n\r\n--===============3287505056065109202==\r\nContent-Type: text/html; charset=\"us-ascii\"\r\nMIME-Version: 1.0\r\nContent-Transfer-Encoding: 7bit\r\n\r\n\r\n \r\n Access Request Notification\r\n \r\n \r\n \r\n
\r\n
\r\n Request Notification\r\n
\r\n
\r\n

Hello,

\r\n

A new request has been submitted and requires your attention.\r\n Please review the details below:

\r\n\r\n
\r\n
Request Details
\r\n
\r\n\r\n

ID: 87e1f98a3c014f64a231b075694a158b

\r\n

\r\n Submitted By:\r\n Mark Dominguez\r\n

\r\n

Date: 2024-09-20 08:38:05

\r\n

Status:

\r\n PENDING\r\n
\r\n

Changes:\r\n UserCodeStatusChange\r\n

\r\n\r\n

Use:
\r\n \r\n request = client.api.services.request.get_by_uid(uid=sy.UID(\"87e1f98a3c014f64a231b075694a158b\"))\r\n
\r\n to get this specific request.\r\n

\r\n\r\n

Or you can view all requests with:
\r\n \r\n client.requests\r\n \r\n

\r\n\r\n
\r\n
\r\n

If you did not expect this request or have concerns about it,\r\n please contact our support team immediately.

\r\n
\r\n
\r\n This is an automated message, please do not reply directly to this email.
\r\n For assistance, please contact our support team.\r\n
\r\n
\r\n \r\n \r\n--===============3287505056065109202==--\r\n"}, {"email_from": "noreply@openmined.org", "email_to": ["admin@bigquery.org"], "email_content": "Content-Type: multipart/alternative; boundary=\"===============6010573810991308557==\"\r\nMIME-Version: 1.0\r\nFrom: noreply@openmined.org\r\nTo: admin@bigquery.org\r\nSubject: Datasite bigquery-high: A New Request (e2ee) has been received!\r\n\r\n--===============6010573810991308557==\r\nContent-Type: text/html; charset=\"us-ascii\"\r\nMIME-Version: 1.0\r\nContent-Transfer-Encoding: 7bit\r\n\r\n\r\n \r\n Access Request Notification\r\n \r\n \r\n \r\n
\r\n
\r\n Request Notification\r\n
\r\n
\r\n

Hello,

\r\n

A new request has been submitted and requires your attention.\r\n Please review the details below:

\r\n\r\n
\r\n
Request Details
\r\n
\r\n\r\n

ID: e2ee012298104ac8ac589555c2d1d878

\r\n

\r\n Submitted By:\r\n Maxwell Soto\r\n

\r\n

Date: 2024-09-20 08:38:15

\r\n

Status:

\r\n PENDING\r\n
\r\n

Changes:\r\n UserCodeStatusChange\r\n

\r\n\r\n

Use:
\r\n \r\n request = client.api.services.request.get_by_uid(uid=sy.UID(\"e2ee012298104ac8ac589555c2d1d878\"))\r\n
\r\n to get this specific request.\r\n

\r\n\r\n

Or you can view all requests with:
\r\n \r\n client.requests\r\n \r\n

\r\n\r\n
\r\n
\r\n

If you did not expect this request or have concerns about it,\r\n please contact our support team immediately.

\r\n
\r\n
\r\n This is an automated message, please do not reply directly to this email.
\r\n For assistance, please contact our support team.\r\n
\r\n
\r\n \r\n \r\n--===============6010573810991308557==--\r\n"}, {"email_from": "noreply@openmined.org", "email_to": ["admin@bigquery.org"], "email_content": "Content-Type: multipart/alternative; boundary=\"===============5133109870808782914==\"\r\nMIME-Version: 1.0\r\nFrom: noreply@openmined.org\r\nTo: admin@bigquery.org\r\nSubject: Datasite bigquery-high: A New Request (6c48) has been received!\r\n\r\n--===============5133109870808782914==\r\nContent-Type: text/html; charset=\"us-ascii\"\r\nMIME-Version: 1.0\r\nContent-Transfer-Encoding: 7bit\r\n\r\n\r\n \r\n Access Request Notification\r\n \r\n \r\n \r\n
\r\n
\r\n Request Notification\r\n
\r\n
\r\n

Hello,

\r\n

A new request has been submitted and requires your attention.\r\n Please review the details below:

\r\n\r\n
\r\n
Request Details
\r\n
\r\n\r\n

ID: 6c4888f4292b48d6a0cf95ccf677141c

\r\n

\r\n Submitted By:\r\n Crystal Adams\r\n

\r\n

Date: 2024-09-20 08:38:24

\r\n

Status:

\r\n PENDING\r\n
\r\n

Changes:\r\n UserCodeStatusChange\r\n

\r\n\r\n

Use:
\r\n \r\n request = client.api.services.request.get_by_uid(uid=sy.UID(\"6c4888f4292b48d6a0cf95ccf677141c\"))\r\n
\r\n to get this specific request.\r\n

\r\n\r\n

Or you can view all requests with:
\r\n \r\n client.requests\r\n \r\n

\r\n\r\n
\r\n
\r\n

If you did not expect this request or have concerns about it,\r\n please contact our support team immediately.

\r\n
\r\n
\r\n This is an automated message, please do not reply directly to this email.
\r\n For assistance, please contact our support team.\r\n
\r\n
\r\n \r\n \r\n--===============5133109870808782914==--\r\n"}], "mark-dominguez-fake@openmined.org": [{"email_from": "noreply@openmined.org", "email_to": ["mark-dominguez-fake@openmined.org"], "email_content": "Content-Type: multipart/alternative; boundary=\"===============0874085896837516854==\"\r\nMIME-Version: 1.0\r\nFrom: noreply@openmined.org\r\nTo: mark-dominguez-fake@openmined.org\r\nSubject: Datasite bigquery-high: Your request (85c9) has been approved. \r\n\r\n--===============0874085896837516854==\r\nContent-Type: text/html; charset=\"us-ascii\"\r\nMIME-Version: 1.0\r\nContent-Transfer-Encoding: 7bit\r\n\r\n\r\n \r\n Access Request Notification\r\n \r\n \r\n \r\n
\r\n
\r\n Request Notification\r\n
\r\n
\r\n

Hello,

\r\n

The status of your recent request has been updated.\r\n Below is the latest information regarding it:

\r\n\r\n
\r\n
Request Details
\r\n
\r\n\r\n

ID: 85c9d7c12a94422caeba2a543c3b6ccb

\r\n

\r\n Submitted By:\r\n Mark Dominguez mark-dominguez-fake@openmined.org\r\n

\r\n

Date: 2024-09-20 08:37:17

\r\n

Status:

\r\n APPROVED\r\n
\r\n

\r\n Changes:\r\n UserCodeStatusChange\r\n

\r\n\r\n

Use:
\r\n \r\n request = client.api.services.request.get_by_uid(uid=sy.UID(\"85c9d7c12a94422caeba2a543c3b6ccb\"))\r\n
\r\n to get this specific request.\r\n

\r\n\r\n

Or you can view all requests with:
\r\n \r\n client.requests\r\n \r\n

\r\n
\r\n
\r\n

If you did not expect this request or have concerns about it,\r\n please contact our support team immediately.

\r\n
\r\n
\r\n This is an automated message, please do not reply directly to this email.
\r\n For assistance, please contact our support team.\r\n
\r\n
\r\n \r\n \r\n--===============0874085896837516854==--\r\n"}, {"email_from": "noreply@openmined.org", "email_to": ["mark-dominguez-fake@openmined.org"], "email_content": "Content-Type: multipart/alternative; boundary=\"===============8912610805077554961==\"\r\nMIME-Version: 1.0\r\nFrom: noreply@openmined.org\r\nTo: mark-dominguez-fake@openmined.org\r\nSubject: Datasite bigquery-high: Your request (87e1) has been denied. \r\n\r\n--===============8912610805077554961==\r\nContent-Type: text/html; charset=\"us-ascii\"\r\nMIME-Version: 1.0\r\nContent-Transfer-Encoding: 7bit\r\n\r\n\r\n \r\n Access Request Notification\r\n \r\n \r\n \r\n
\r\n
\r\n Request Notification\r\n
\r\n
\r\n

Hello,

\r\n

The status of your recent request has been updated.\r\n Below is the latest information regarding it:

\r\n\r\n
\r\n
Request Details
\r\n
\r\n\r\n

ID: 87e1f98a3c014f64a231b075694a158b

\r\n

\r\n Submitted By:\r\n Mark Dominguez mark-dominguez-fake@openmined.org\r\n

\r\n

Date: 2024-09-20 08:38:05

\r\n

Status:

\r\n REJECTED\r\n
\r\n

\r\n Changes:\r\n UserCodeStatusChange\r\n

\r\n\r\n

Use:
\r\n \r\n request = client.api.services.request.get_by_uid(uid=sy.UID(\"87e1f98a3c014f64a231b075694a158b\"))\r\n
\r\n to get this specific request.\r\n

\r\n\r\n

Or you can view all requests with:
\r\n \r\n client.requests\r\n \r\n

\r\n
\r\n
\r\n

If you did not expect this request or have concerns about it,\r\n please contact our support team immediately.

\r\n
\r\n
\r\n This is an automated message, please do not reply directly to this email.
\r\n For assistance, please contact our support team.\r\n
\r\n
\r\n \r\n \r\n--===============8912610805077554961==--\r\n"}], "maxwell-soto-fake@openmined.org": [{"email_from": "noreply@openmined.org", "email_to": ["maxwell-soto-fake@openmined.org"], "email_content": "Content-Type: multipart/alternative; boundary=\"===============0737207050435537083==\"\r\nMIME-Version: 1.0\r\nFrom: noreply@openmined.org\r\nTo: maxwell-soto-fake@openmined.org\r\nSubject: Datasite bigquery-high: Your request (5e9b) has been approved. \r\n\r\n--===============0737207050435537083==\r\nContent-Type: text/html; charset=\"us-ascii\"\r\nMIME-Version: 1.0\r\nContent-Transfer-Encoding: 7bit\r\n\r\n\r\n \r\n Access Request Notification\r\n \r\n \r\n \r\n
\r\n
\r\n Request Notification\r\n
\r\n
\r\n

Hello,

\r\n

The status of your recent request has been updated.\r\n Below is the latest information regarding it:

\r\n\r\n
\r\n
Request Details
\r\n
\r\n\r\n

ID: 5e9bb71343ac40bbb31211f885c16209

\r\n

\r\n Submitted By:\r\n Maxwell Soto maxwell-soto-fake@openmined.org\r\n

\r\n

Date: 2024-09-20 08:37:26

\r\n

Status:

\r\n APPROVED\r\n
\r\n

\r\n Changes:\r\n UserCodeStatusChange\r\n

\r\n\r\n

Use:
\r\n \r\n request = client.api.services.request.get_by_uid(uid=sy.UID(\"5e9bb71343ac40bbb31211f885c16209\"))\r\n
\r\n to get this specific request.\r\n

\r\n\r\n

Or you can view all requests with:
\r\n \r\n client.requests\r\n \r\n

\r\n
\r\n
\r\n

If you did not expect this request or have concerns about it,\r\n please contact our support team immediately.

\r\n
\r\n
\r\n This is an automated message, please do not reply directly to this email.
\r\n For assistance, please contact our support team.\r\n
\r\n
\r\n \r\n \r\n--===============0737207050435537083==--\r\n"}, {"email_from": "noreply@openmined.org", "email_to": ["maxwell-soto-fake@openmined.org"], "email_content": "Content-Type: multipart/alternative; boundary=\"===============2137841192891787234==\"\r\nMIME-Version: 1.0\r\nFrom: noreply@openmined.org\r\nTo: maxwell-soto-fake@openmined.org\r\nSubject: Datasite bigquery-high: Your request (5e9b) has been approved. \r\n\r\n--===============2137841192891787234==\r\nContent-Type: text/html; charset=\"us-ascii\"\r\nMIME-Version: 1.0\r\nContent-Transfer-Encoding: 7bit\r\n\r\n\r\n \r\n Access Request Notification\r\n \r\n \r\n \r\n
\r\n
\r\n Request Notification\r\n
\r\n
\r\n

Hello,

\r\n

The status of your recent request has been updated.\r\n Below is the latest information regarding it:

\r\n\r\n
\r\n
Request Details
\r\n
\r\n\r\n

ID: 5e9bb71343ac40bbb31211f885c16209

\r\n

\r\n Submitted By:\r\n Maxwell Soto maxwell-soto-fake@openmined.org\r\n

\r\n

Date: 2024-09-20 08:37:26

\r\n

Status:

\r\n APPROVED\r\n
\r\n

\r\n Changes:\r\n UserCodeStatusChange,ActionStoreChange\r\n

\r\n\r\n

Use:
\r\n \r\n request = client.api.services.request.get_by_uid(uid=sy.UID(\"5e9bb71343ac40bbb31211f885c16209\"))\r\n
\r\n to get this specific request.\r\n

\r\n\r\n

Or you can view all requests with:
\r\n \r\n client.requests\r\n \r\n

\r\n
\r\n
\r\n

If you did not expect this request or have concerns about it,\r\n please contact our support team immediately.

\r\n
\r\n
\r\n This is an automated message, please do not reply directly to this email.
\r\n For assistance, please contact our support team.\r\n
\r\n
\r\n \r\n \r\n--===============2137841192891787234==--\r\n"}, {"email_from": "noreply@openmined.org", "email_to": ["maxwell-soto-fake@openmined.org"], "email_content": "Content-Type: multipart/alternative; boundary=\"===============8943585470920819351==\"\r\nMIME-Version: 1.0\r\nFrom: noreply@openmined.org\r\nTo: maxwell-soto-fake@openmined.org\r\nSubject: Datasite bigquery-high: Your request (e2ee) has been denied. \r\n\r\n--===============8943585470920819351==\r\nContent-Type: text/html; charset=\"us-ascii\"\r\nMIME-Version: 1.0\r\nContent-Transfer-Encoding: 7bit\r\n\r\n\r\n \r\n Access Request Notification\r\n \r\n \r\n \r\n
\r\n
\r\n Request Notification\r\n
\r\n
\r\n

Hello,

\r\n

The status of your recent request has been updated.\r\n Below is the latest information regarding it:

\r\n\r\n
\r\n
Request Details
\r\n
\r\n\r\n

ID: e2ee012298104ac8ac589555c2d1d878

\r\n

\r\n Submitted By:\r\n Maxwell Soto maxwell-soto-fake@openmined.org\r\n

\r\n

Date: 2024-09-20 08:38:15

\r\n

Status:

\r\n REJECTED\r\n
\r\n

\r\n Changes:\r\n UserCodeStatusChange\r\n

\r\n\r\n

Use:
\r\n \r\n request = client.api.services.request.get_by_uid(uid=sy.UID(\"e2ee012298104ac8ac589555c2d1d878\"))\r\n
\r\n to get this specific request.\r\n

\r\n\r\n

Or you can view all requests with:
\r\n \r\n client.requests\r\n \r\n

\r\n
\r\n
\r\n

If you did not expect this request or have concerns about it,\r\n please contact our support team immediately.

\r\n
\r\n
\r\n This is an automated message, please do not reply directly to this email.
\r\n For assistance, please contact our support team.\r\n
\r\n
\r\n \r\n \r\n--===============8943585470920819351==--\r\n"}], "crystal-adams-fake@openmined.org": [{"email_from": "noreply@openmined.org", "email_to": ["crystal-adams-fake@openmined.org"], "email_content": "Content-Type: multipart/alternative; boundary=\"===============2737575438189797344==\"\r\nMIME-Version: 1.0\r\nFrom: noreply@openmined.org\r\nTo: crystal-adams-fake@openmined.org\r\nSubject: Datasite bigquery-high: Your request (57fb) has been approved. \r\n\r\n--===============2737575438189797344==\r\nContent-Type: text/html; charset=\"us-ascii\"\r\nMIME-Version: 1.0\r\nContent-Transfer-Encoding: 7bit\r\n\r\n\r\n \r\n Access Request Notification\r\n \r\n \r\n \r\n
\r\n
\r\n Request Notification\r\n
\r\n
\r\n

Hello,

\r\n

The status of your recent request has been updated.\r\n Below is the latest information regarding it:

\r\n\r\n
\r\n
Request Details
\r\n
\r\n\r\n

ID: 57fb8d2b65044a8a91209ddbee6f1b0d

\r\n

\r\n Submitted By:\r\n Crystal Adams crystal-adams-fake@openmined.org\r\n

\r\n

Date: 2024-09-20 08:37:36

\r\n

Status:

\r\n APPROVED\r\n
\r\n

\r\n Changes:\r\n UserCodeStatusChange\r\n

\r\n\r\n

Use:
\r\n \r\n request = client.api.services.request.get_by_uid(uid=sy.UID(\"57fb8d2b65044a8a91209ddbee6f1b0d\"))\r\n
\r\n to get this specific request.\r\n

\r\n\r\n

Or you can view all requests with:
\r\n \r\n client.requests\r\n \r\n

\r\n
\r\n
\r\n

If you did not expect this request or have concerns about it,\r\n please contact our support team immediately.

\r\n
\r\n
\r\n This is an automated message, please do not reply directly to this email.
\r\n For assistance, please contact our support team.\r\n
\r\n
\r\n \r\n \r\n--===============2737575438189797344==--\r\n"}, {"email_from": "noreply@openmined.org", "email_to": ["crystal-adams-fake@openmined.org"], "email_content": "Content-Type: multipart/alternative; boundary=\"===============2048189725991433282==\"\r\nMIME-Version: 1.0\r\nFrom: noreply@openmined.org\r\nTo: crystal-adams-fake@openmined.org\r\nSubject: Datasite bigquery-high: Your request (6c48) has been approved. \r\n\r\n--===============2048189725991433282==\r\nContent-Type: text/html; charset=\"us-ascii\"\r\nMIME-Version: 1.0\r\nContent-Transfer-Encoding: 7bit\r\n\r\n\r\n \r\n Access Request Notification\r\n \r\n \r\n \r\n
\r\n
\r\n Request Notification\r\n
\r\n
\r\n

Hello,

\r\n

The status of your recent request has been updated.\r\n Below is the latest information regarding it:

\r\n\r\n
\r\n
Request Details
\r\n
\r\n\r\n

ID: 6c4888f4292b48d6a0cf95ccf677141c

\r\n

\r\n Submitted By:\r\n Crystal Adams crystal-adams-fake@openmined.org\r\n

\r\n

Date: 2024-09-20 08:38:24

\r\n

Status:

\r\n APPROVED\r\n
\r\n

\r\n Changes:\r\n UserCodeStatusChange\r\n

\r\n\r\n

Use:
\r\n \r\n request = client.api.services.request.get_by_uid(uid=sy.UID(\"6c4888f4292b48d6a0cf95ccf677141c\"))\r\n
\r\n to get this specific request.\r\n

\r\n\r\n

Or you can view all requests with:
\r\n \r\n client.requests\r\n \r\n

\r\n
\r\n
\r\n

If you did not expect this request or have concerns about it,\r\n please contact our support team immediately.

\r\n
\r\n
\r\n This is an automated message, please do not reply directly to this email.
\r\n For assistance, please contact our support team.\r\n
\r\n
\r\n \r\n \r\n--===============2048189725991433282==--\r\n"}, {"email_from": "noreply@openmined.org", "email_to": ["crystal-adams-fake@openmined.org"], "email_content": "Content-Type: multipart/alternative; boundary=\"===============2829723894016643685==\"\r\nMIME-Version: 1.0\r\nFrom: noreply@openmined.org\r\nTo: crystal-adams-fake@openmined.org\r\nSubject: Datasite bigquery-high: Your request (6c48) has been approved. \r\n\r\n--===============2829723894016643685==\r\nContent-Type: text/html; charset=\"us-ascii\"\r\nMIME-Version: 1.0\r\nContent-Transfer-Encoding: 7bit\r\n\r\n\r\n \r\n Access Request Notification\r\n \r\n \r\n \r\n
\r\n
\r\n Request Notification\r\n
\r\n
\r\n

Hello,

\r\n

The status of your recent request has been updated.\r\n Below is the latest information regarding it:

\r\n\r\n
\r\n
Request Details
\r\n
\r\n\r\n

ID: 6c4888f4292b48d6a0cf95ccf677141c

\r\n

\r\n Submitted By:\r\n Crystal Adams crystal-adams-fake@openmined.org\r\n

\r\n

Date: 2024-09-20 08:38:24

\r\n

Status:

\r\n APPROVED\r\n
\r\n

\r\n Changes:\r\n UserCodeStatusChange,ActionStoreChange\r\n

\r\n\r\n

Use:
\r\n \r\n request = client.api.services.request.get_by_uid(uid=sy.UID(\"6c4888f4292b48d6a0cf95ccf677141c\"))\r\n
\r\n to get this specific request.\r\n

\r\n\r\n

Or you can view all requests with:
\r\n \r\n client.requests\r\n \r\n

\r\n
\r\n
\r\n

If you did not expect this request or have concerns about it,\r\n please contact our support team immediately.

\r\n
\r\n
\r\n This is an automated message, please do not reply directly to this email.
\r\n For assistance, please contact our support team.\r\n
\r\n
\r\n \r\n \r\n--===============2829723894016643685==--\r\n"}], "evelyn-wilson-fake@openmined.org": [{"email_from": "noreply@openmined.org", "email_to": ["evelyn-wilson-fake@openmined.org"], "email_content": "Content-Type: multipart/alternative; boundary=\"===============2693564830936871874==\"\r\nMIME-Version: 1.0\r\nFrom: noreply@openmined.org\r\nTo: evelyn-wilson-fake@openmined.org\r\nSubject: Datasite bigquery-high: Your request (a44b) has been approved. \r\n\r\n--===============2693564830936871874==\r\nContent-Type: text/html; charset=\"us-ascii\"\r\nMIME-Version: 1.0\r\nContent-Transfer-Encoding: 7bit\r\n\r\n\r\n \r\n Access Request Notification\r\n \r\n \r\n \r\n
\r\n
\r\n Request Notification\r\n
\r\n
\r\n

Hello,

\r\n

The status of your recent request has been updated.\r\n Below is the latest information regarding it:

\r\n\r\n
\r\n
Request Details
\r\n
\r\n\r\n

ID: a44b3a7a3b184ec58d7ae1eb79bd4719

\r\n

\r\n Submitted By:\r\n Evelyn Wilson evelyn-wilson-fake@openmined.org\r\n

\r\n

Date: 2024-09-20 08:37:46

\r\n

Status:

\r\n APPROVED\r\n
\r\n

\r\n Changes:\r\n UserCodeStatusChange\r\n

\r\n\r\n

Use:
\r\n \r\n request = client.api.services.request.get_by_uid(uid=sy.UID(\"a44b3a7a3b184ec58d7ae1eb79bd4719\"))\r\n
\r\n to get this specific request.\r\n

\r\n\r\n

Or you can view all requests with:
\r\n \r\n client.requests\r\n \r\n

\r\n
\r\n
\r\n

If you did not expect this request or have concerns about it,\r\n please contact our support team immediately.

\r\n
\r\n
\r\n This is an automated message, please do not reply directly to this email.
\r\n For assistance, please contact our support team.\r\n
\r\n
\r\n \r\n \r\n--===============2693564830936871874==--\r\n"}]} \ No newline at end of file diff --git a/notebooks/scenarios/bigquery/upgradability/0.9.1_notebooks/jobs.json b/notebooks/scenarios/bigquery/upgradability/0.9.1_notebooks/jobs.json index f74979265a4..d6e74b0092d 100644 --- a/notebooks/scenarios/bigquery/upgradability/0.9.1_notebooks/jobs.json +++ b/notebooks/scenarios/bigquery/upgradability/0.9.1_notebooks/jobs.json @@ -1 +1 @@ -{"crystal-smith-fake@openmined.org": [{"user_email": "crystal-smith-fake@openmined.org", "func_name": "simple_query_81c2df", "query": "SELECT table_id, AVG(colname) AS average_score\n FROM dataset_2.table_1\n GROUP BY table_id\n LIMIT 888526", "job_type": "simple_query", "settings": {"dataset": "dataset_2", "table": "table_1", "groupby_col": "table_id", "score_col": "colname", "limit": 888526}, "should_succeed": true, "should_submit": true, "code_path": "simple_query_81c2df", "admin_reviewed": true, "result_as_expected": true}, {"user_email": "crystal-smith-fake@openmined.org", "func_name": "simple_query_d504a4", "query": "SELECT table_id, AVG(colname) AS average_score\n FROM dataset_1.table_1\n GROUP BY table_id\n LIMIT 412907", "job_type": "simple_query", "settings": {"dataset": "dataset_1", "table": "table_1", "groupby_col": "table_id", "score_col": "colname", "limit": 412907}, "should_succeed": true, "should_submit": true, "code_path": "simple_query_d504a4", "admin_reviewed": true, "result_as_expected": true}, {"user_email": "crystal-smith-fake@openmined.org", "func_name": "job_long_name_82766aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", "query": "SELECT table_id, AVG(colname) AS average_score\n FROM dataset_1.table_1\n GROUP BY table_id\n LIMIT 222806", "job_type": "job_long_name", "settings": {"dataset": "dataset_1", "table": "table_1", "groupby_col": "table_id", "score_col": "colname", "limit": 222806}, "should_succeed": true, "should_submit": true, "code_path": "job_long_name_82766aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", "admin_reviewed": true, "result_as_expected": true}], "john-gray-fake@openmined.org": [{"user_email": "john-gray-fake@openmined.org", "func_name": "simple_query_71c8bc", "query": "SELECT table_id, AVG(colname) AS average_score\n FROM dataset_2.table_2\n GROUP BY table_id\n LIMIT 90263", "job_type": "simple_query", "settings": {"dataset": "dataset_2", "table": "table_2", "groupby_col": "table_id", "score_col": "colname", "limit": 90263}, "should_succeed": true, "should_submit": true, "code_path": "simple_query_71c8bc", "admin_reviewed": true, "result_as_expected": true}, {"user_email": "john-gray-fake@openmined.org", "func_name": "simple_query_f4ffab", "query": "SELECT table_id, AVG(colname) AS average_score\n FROM dataset_2.table_1\n GROUP BY table_id\n LIMIT 343303", "job_type": "simple_query", "settings": {"dataset": "dataset_2", "table": "table_1", "groupby_col": "table_id", "score_col": "colname", "limit": 343303}, "should_succeed": true, "should_submit": true, "code_path": "simple_query_f4ffab", "admin_reviewed": true, "result_as_expected": true}, {"user_email": "john-gray-fake@openmined.org", "func_name": "job_funcname_xss_6370db", "query": "SELECT table_id, AVG(colname) AS average_score\n FROM dataset_2.table_1\n GROUP BY table_id\n LIMIT 542819", "job_type": "job_funcname_xss", "settings": {"dataset": "dataset_2", "table": "table_1", "groupby_col": "table_id", "score_col": "colname", "limit": 542819}, "should_succeed": true, "should_submit": false, "code_path": null, "admin_reviewed": false, "result_as_expected": null}], "jimmy-copeland-fake@openmined.org": [{"user_email": "jimmy-copeland-fake@openmined.org", "func_name": "simple_query_949aaf", "query": "SELECT table_id, AVG(colname) AS average_score\n FROM dataset_2.table_2\n GROUP BY table_id\n LIMIT 845473", "job_type": "simple_query", "settings": {"dataset": "dataset_2", "table": "table_2", "groupby_col": "table_id", "score_col": "colname", "limit": 845473}, "should_succeed": true, "should_submit": true, "code_path": "simple_query_949aaf", "admin_reviewed": true, "result_as_expected": true}, {"user_email": "jimmy-copeland-fake@openmined.org", "func_name": "wrong_syntax_query_e1ea75", "query": "SELECT * FROM table INCORRECT SYNTAX", "job_type": "wrong_syntax_query", "settings": {}, "should_succeed": false, "should_submit": true, "code_path": "wrong_syntax_query_e1ea75", "admin_reviewed": true, "result_as_expected": true}], "ryan-thomas-fake@openmined.org": [{"user_email": "ryan-thomas-fake@openmined.org", "func_name": "simple_query_c64422", "query": "SELECT table_id, AVG(colname) AS average_score\n FROM dataset_2.table_1\n GROUP BY table_id\n LIMIT 78176", "job_type": "simple_query", "settings": {"dataset": "dataset_2", "table": "table_1", "groupby_col": "table_id", "score_col": "colname", "limit": 78176}, "should_succeed": true, "should_submit": true, "code_path": "simple_query_c64422", "admin_reviewed": true, "result_as_expected": true}, {"user_email": "ryan-thomas-fake@openmined.org", "func_name": "job_too_much_text_e252cf", "query": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", "job_type": "job_too_much_text", "settings": {}, "should_succeed": false, "should_submit": true, "code_path": "job_too_much_text_e252cf", "admin_reviewed": true, "result_as_expected": true}]} \ No newline at end of file +{"peggy-white-fake@openmined.org": [{"user_email": "peggy-white-fake@openmined.org", "func_name": "simple_query_e738f3", "query": "SELECT table_id, AVG(colname) AS average_score\n FROM dataset_1.table_2\n GROUP BY table_id\n LIMIT 358370", "job_type": "simple_query", "settings": {"dataset": "dataset_1", "table": "table_2", "groupby_col": "table_id", "score_col": "colname", "limit": 358370}, "should_succeed": true, "should_submit": true, "code_path": "simple_query_e738f3", "admin_reviewed": true, "result_as_expected": true}, {"user_email": "peggy-white-fake@openmined.org", "func_name": "simple_query_bb83e9", "query": "SELECT table_id, AVG(colname) AS average_score\n FROM dataset_1.table_1\n GROUP BY table_id\n LIMIT 210808", "job_type": "simple_query", "settings": {"dataset": "dataset_1", "table": "table_1", "groupby_col": "table_id", "score_col": "colname", "limit": 210808}, "should_succeed": true, "should_submit": true, "code_path": "simple_query_bb83e9", "admin_reviewed": true, "result_as_expected": true}], "mark-dominguez-fake@openmined.org": [{"user_email": "mark-dominguez-fake@openmined.org", "func_name": "simple_query_a5793a", "query": "SELECT table_id, AVG(colname) AS average_score\n FROM dataset_1.table_2\n GROUP BY table_id\n LIMIT 189060", "job_type": "simple_query", "settings": {"dataset": "dataset_1", "table": "table_2", "groupby_col": "table_id", "score_col": "colname", "limit": 189060}, "should_succeed": true, "should_submit": true, "code_path": "simple_query_a5793a", "admin_reviewed": true, "result_as_expected": true}, {"user_email": "mark-dominguez-fake@openmined.org", "func_name": "wrong_syntax_query_82dc3c", "query": "SELECT * FROM table INCORRECT SYNTAX", "job_type": "wrong_syntax_query", "settings": {}, "should_succeed": false, "should_submit": true, "code_path": "wrong_syntax_query_82dc3c", "admin_reviewed": true, "result_as_expected": true}], "maxwell-soto-fake@openmined.org": [{"user_email": "maxwell-soto-fake@openmined.org", "func_name": "simple_query_8ab78b", "query": "SELECT table_id, AVG(colname) AS average_score\n FROM dataset_2.table_1\n GROUP BY table_id\n LIMIT 473772", "job_type": "simple_query", "settings": {"dataset": "dataset_2", "table": "table_1", "groupby_col": "table_id", "score_col": "colname", "limit": 473772}, "should_succeed": true, "should_submit": true, "code_path": "simple_query_8ab78b", "admin_reviewed": true, "result_as_expected": true}, {"user_email": "maxwell-soto-fake@openmined.org", "func_name": "job_too_much_text_9f7556", "query": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", "job_type": "job_too_much_text", "settings": {}, "should_succeed": false, "should_submit": true, "code_path": "job_too_much_text_9f7556", "admin_reviewed": true, "result_as_expected": true}], "crystal-adams-fake@openmined.org": [{"user_email": "crystal-adams-fake@openmined.org", "func_name": "simple_query_8b4b58", "query": "SELECT table_id, AVG(colname) AS average_score\n FROM dataset_1.table_1\n GROUP BY table_id\n LIMIT 79072", "job_type": "simple_query", "settings": {"dataset": "dataset_1", "table": "table_1", "groupby_col": "table_id", "score_col": "colname", "limit": 79072}, "should_succeed": true, "should_submit": true, "code_path": "simple_query_8b4b58", "admin_reviewed": true, "result_as_expected": true}, {"user_email": "crystal-adams-fake@openmined.org", "func_name": "job_long_name_39906aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", "query": "SELECT table_id, AVG(colname) AS average_score\n FROM dataset_2.table_1\n GROUP BY table_id\n LIMIT 670932", "job_type": "job_long_name", "settings": {"dataset": "dataset_2", "table": "table_1", "groupby_col": "table_id", "score_col": "colname", "limit": 670932}, "should_succeed": true, "should_submit": true, "code_path": "job_long_name_39906aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", "admin_reviewed": true, "result_as_expected": true}], "evelyn-wilson-fake@openmined.org": [{"user_email": "evelyn-wilson-fake@openmined.org", "func_name": "simple_query_29ec28", "query": "SELECT table_id, AVG(colname) AS average_score\n FROM dataset_1.table_2\n GROUP BY table_id\n LIMIT 195119", "job_type": "simple_query", "settings": {"dataset": "dataset_1", "table": "table_2", "groupby_col": "table_id", "score_col": "colname", "limit": 195119}, "should_succeed": true, "should_submit": true, "code_path": "simple_query_29ec28", "admin_reviewed": true, "result_as_expected": true}, {"user_email": "evelyn-wilson-fake@openmined.org", "func_name": "job_funcname_xss_d33f44", "query": "SELECT table_id, AVG(colname) AS average_score\n FROM dataset_1.table_2\n GROUP BY table_id\n LIMIT 631086", "job_type": "job_funcname_xss", "settings": {"dataset": "dataset_1", "table": "table_2", "groupby_col": "table_id", "score_col": "colname", "limit": 631086}, "should_succeed": true, "should_submit": false, "code_path": null, "admin_reviewed": false, "result_as_expected": null}]} \ No newline at end of file diff --git a/notebooks/scenarios/bigquery/upgradability/0.9.1_notebooks/users.json b/notebooks/scenarios/bigquery/upgradability/0.9.1_notebooks/users.json index b68e0beaadd..6a4adb3fdac 100644 --- a/notebooks/scenarios/bigquery/upgradability/0.9.1_notebooks/users.json +++ b/notebooks/scenarios/bigquery/upgradability/0.9.1_notebooks/users.json @@ -1 +1 @@ -[{"name": "Denise Porter", "email": "denise-porter-fake@openmined.org", "password": "tX@g7CBt2)", "role": "ServiceRole.DATA_SCIENTIST", "new_password": null, "email_disabled": true, "reset_password": false, "reset_token": null}, {"name": "Kimberly Willis", "email": "kimberly-willis-fake@openmined.org", "password": "N22Oh%Er$o", "role": "ServiceRole.DATA_SCIENTIST", "new_password": null, "email_disabled": false, "reset_password": true, "reset_token": "ow7LCNe7AJJA"}, {"name": "Charles Carlson", "email": "charles-carlson-fake@openmined.org", "password": "fAmCalfW_0", "role": "ServiceRole.DATA_SCIENTIST", "new_password": null, "email_disabled": false, "reset_password": false, "reset_token": null}, {"name": "Samuel Clark", "email": "samuel-clark-fake@openmined.org", "password": "g!9YLtNaX1", "role": "ServiceRole.DATA_SCIENTIST", "new_password": null, "email_disabled": false, "reset_password": false, "reset_token": null}, {"name": "Amanda Gomez", "email": "amanda-gomez-fake@openmined.org", "password": "(4xB6Lneh1", "role": "ServiceRole.DATA_SCIENTIST", "new_password": null, "email_disabled": false, "reset_password": false, "reset_token": null}] \ No newline at end of file +[{"name": "Peggy White", "email": "peggy-white-fake@openmined.org", "password": "*K5sBuIz)K", "role": "ServiceRole.DATA_SCIENTIST", "new_password": null, "email_disabled": true, "reset_password": false, "reset_token": null}, {"name": "Mark Dominguez", "email": "mark-dominguez-fake@openmined.org", "password": ")WNFXLM8e6", "role": "ServiceRole.DATA_SCIENTIST", "new_password": null, "email_disabled": false, "reset_password": true, "reset_token": "3tPlwW5cznSU"}, {"name": "Maxwell Soto", "email": "maxwell-soto-fake@openmined.org", "password": "^qO5Tp$id!", "role": "ServiceRole.DATA_SCIENTIST", "new_password": null, "email_disabled": false, "reset_password": false, "reset_token": null}, {"name": "Crystal Adams", "email": "crystal-adams-fake@openmined.org", "password": "#_SKHqnuk0", "role": "ServiceRole.DATA_SCIENTIST", "new_password": null, "email_disabled": false, "reset_password": false, "reset_token": null}, {"name": "Evelyn Wilson", "email": "evelyn-wilson-fake@openmined.org", "password": "CyLYwRFJ)9", "role": "ServiceRole.DATA_SCIENTIST", "new_password": null, "email_disabled": false, "reset_password": false, "reset_token": null}] \ No newline at end of file diff --git a/notebooks/scenarios/bigquery/upgradability/2-migrate-for-scenarios.ipynb b/notebooks/scenarios/bigquery/upgradability/2-migrate-for-scenarios.ipynb index fb7c7150523..1602bd9106b 100644 --- a/notebooks/scenarios/bigquery/upgradability/2-migrate-for-scenarios.ipynb +++ b/notebooks/scenarios/bigquery/upgradability/2-migrate-for-scenarios.ipynb @@ -14,7 +14,18 @@ "# syft absolute\n", "import syft as sy\n", "from syft.service.code.user_code import UserCode\n", - "from syft.service.user.user import User" + "from syft.service.user.user import User\n", + "from syft.service.user.user_roles import ServiceRole\n", + "from syft.service.action.action_object import AnyActionObject\n", + "from syft.util.test_helpers.email_helpers import get_email_server\n", + "from syft.util.test_helpers.email_helpers import load_users\n", + "from syft.util.test_helpers.job_helpers import load_jobs\n", + "from syft.util.test_helpers.job_helpers import save_jobs\n", + "from syft.util.test_helpers.job_helpers import create_simple_query_job\n", + "from syft.util.util import find_base_dir_with_tox_ini, get_caller_file_path, is_interpreter_jupyter\n", + "\n", + "import os\n", + "import sys\n" ] }, { @@ -23,10 +34,6 @@ "metadata": {}, "outputs": [], "source": [ - "from syft.util.util import find_base_dir_with_tox_ini, get_caller_file_path, is_interpreter_jupyter\n", - "\n", - "import os\n", - "import sys\n", "\n", "def add_helper_path_to_python_path() -> None:\n", " current_path = \".\"\n", @@ -39,24 +46,13 @@ " current_path = import_path\n", "\n", " base_dir = find_base_dir_with_tox_ini(current_path)\n", - " notebook_helper_path = os.path.join(base_dir, \"notebooks/notebook_helpers\")\n", + " notebook_helper_path = os.path.join(base_dir, \"test_helpers\")\n", " sys.path.append(notebook_helper_path)\n", "\n", + "\n", "add_helper_path_to_python_path()" ] }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [], - "source": [ - "from email_helpers import get_email_server\n", - "from email_helpers import load_users\n", - "from job_helpers import load_jobs\n", - "from job_helpers import save_jobs" - ] - }, { "cell_type": "code", "execution_count": 4, @@ -106,24 +102,37 @@ "text": [ "INFO: Will watch for changes in these directories: ['/home/teo/OpenMined/PySyft/packages/syft/src/syft']\n", "INFO: Uvicorn running on http://0.0.0.0:8080 (Press CTRL+C to quit)\n", - "INFO: Started reloader process [77028] using WatchFiles\n" + "INFO: Started reloader process [430723] using WatchFiles\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Waiting for server to start.." + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "INFO: Starting server with settings: {'name': 'bigquery-high', 'server_type': , 'server_side_type': , 'deployment_type': , 'processes': 1, 'reset': False, 'dev_mode': True, 'enable_warnings': False, 'in_memory_workers': True, 'queue_port': None, 'create_producer': True, 'n_consumers': 1, 'association_request_auto_approval': False, 'background_tasks': False, 'db_config': None, 'db_url': None} and worker class: \n" ] }, { "name": "stdout", "output_type": "stream", "text": [ - "Waiting for server to start...WARN: private key is based on server name: bigquery-high in dev_mode. Don't run this in production.\n", - "Document Store's SQLite DB path: /tmp/syft/fbdf5a287e58454cbbd3fac4ad744d37/db/fbdf5a287e58454cbbd3fac4ad744d37.sqlite\n", - "Action Store's SQLite DB path: /tmp/syft/fbdf5a287e58454cbbd3fac4ad744d37/db/fbdf5a287e58454cbbd3fac4ad744d37.sqlite\n", - "Adding producer for queue: api_call on: tcp://localhost:60195\n" + "WARN: private key is based on server name: bigquery-high in dev_mode. Don't run this in production.\n", + "Using SQLiteDBConfig and sqlite:////tmp/syft/fbdf5a287e58454cbbd3fac4ad744d37/db/fbdf5a287e58454cbbd3fac4ad744d37_json.db\n", + ".Adding producer for queue: api_call on: tcp://localhost:54941\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ - "INFO: Started server process [77042]\n", + "INFO: Started server process [430738]\n", "INFO: Waiting for application startup.\n", "INFO: Application startup complete.\n" ] @@ -967,10 +976,10 @@ " vertical-align: bottom;\n", "}\n", "\n", - "
SyftInfo:
You have launched a development server at http://0.0.0.0:8080.It is intended only for local use.

" + "
SyftInfo:
You have launched a development server at http://0.0.0.0:8080. It is intended only for local use.

" ], "text/plain": [ - "SyftInfo: You have launched a development server at http://0.0.0.0:8080.It is intended only for local use." + "SyftInfo: You have launched a development server at http://0.0.0.0:8080. It is intended only for local use." ] }, "metadata": {}, @@ -1864,10 +1873,10 @@ "text/markdown": [ "```python\n", "class MigrationData:\n", - " id: str = 1938503d138246d1b577d5b2624e48cc\n", + " id: str = 3aa75dcefab84be0aa88bc8f42a42060\n", " server_uid: str = fbdf5a287e58454cbbd3fac4ad744d37\n", " root_verify_key: str = 1e5ec44a179d21e0a0721ea7a670b9875d3946c8604f4623903fcafafe03c8e7\n", - " num_objects: str = 16\n", + " num_objects: str = 17\n", " num_action_objects: str = 0\n", " includes_blobs: str = True\n", "\n", @@ -2783,8 +2792,8 @@ "output_type": "stream", "text": [ "Migrating data for: User table to version 2\n", - "Migrating data for: APIEndpointQueueItem table to version 1\n", - "Migrating data for: ActionQueueItem table to version 1\n", + "Migrating data for: APIEndpointQueueItem table to version 2\n", + "Migrating data for: ActionQueueItem table to version 2\n", "Migrating data for: ServerSettings table to version 4\n", "Migrating data for: UserCode table to version 1\n", "Migrating data for: SyftLog table to version 1\n", @@ -2792,24 +2801,24 @@ "Migrating data for: JobItem table to version 2\n", "Migrating data for: TwinAPIEndpoint table to version 1\n", "Migrating data for: NotifierSettings table to version 2\n", - "Migrating data for: Notification table to version 1\n", + "Migrating data for: Notification table to version 2\n", "Migrating data for: CodeHistory table to version 1\n", "Migrating data for: SyftObjectMigrationState table to version 1\n", "Migrating data for: SyftImageRegistry table to version 1\n", "Migrating data for: ExecutionOutput table to version 1\n", "Migrating data for: UserCodeStatusCollection table to version 1\n", - " #aaa0b11ff8dd4bfb8eb703c2d3ab72b9 already exists\n", + " #6fe1e5123817486fb4664fe88ef676a6 already exists\n", " #fbdf5a287e58454cbbd3fac4ad744d37 already exists\n", - " #8b5525d5424b4acc8eeff1445c5d72d9 already exists\n", - " #7b14bf4173564d6e854bea0c2de5b58b already exists\n", - " #8bb36d60ff1e48dbb40e5178a4fd8a5b already exists\n", - " #27932d43cd394219a4a03e68664aa829 already exists\n", - " #f6ed0b04ed24406a92e125f731f6aacf already exists\n", - " #fa99e4e7133d4126992c96607caf2252 already exists\n", - " #bd9260dd18b240d5879d5c6f1d4f61c1 already exists\n", - " #a5a5cdaa910d4c39905f1b391ba343d2 already exists\n", - " #1207ab0c71e2475594d80de244a4b2fd already exists\n", - " #5cc449f50c6945f3a8b7ebfedb1ed665 already exists\n", + " #e85e379cdb5a4581ad180fd1c7ec0899 already exists\n", + " #52d85a18cea64eee8280e1e1473bafb2 already exists\n", + " #e1e8ad31bf4347e88032c93587295959 already exists\n", + " #7bdff308f4e74bcc9221ef490c886faa already exists\n", + " #7d4cda173464471c9b30b5934a1f805f already exists\n", + " #f0b822372c6542f4b38414147b074048 already exists\n", + " #700e9177f3574dc0a2b49c3dae88bf89 already exists\n", + " #c1996fdca82d4e7fba8f17e3578cc880 already exists\n", + " #bfab1b0991a743d0a0dbd903de5ba87d already exists\n", + " #9fee2d6ef02049c587ecbd826e6a8529 already exists\n", "Migrating data for: AnyActionObject table to version 1\n", "Migrating data for: PandasDataframeObject table to version 1\n", "Updating store metadata\n" @@ -4524,10 +4533,10 @@ " vertical-align: bottom;\n", "}\n", "\n", - "
SyftSuccess:
Dockerfile ID: 2555bdfadb6a45d596fdcc73fd0e5c22 successfully submitted.

" + "
SyftSuccess:
Dockerfile ID: 94ce7da1bb1c4c6491530852c798a96c successfully submitted.

" ], "text/plain": [ - "SyftSuccess: Dockerfile ID: 2555bdfadb6a45d596fdcc73fd0e5c22 successfully submitted." + "SyftSuccess: Dockerfile ID: 94ce7da1bb1c4c6491530852c798a96c successfully submitted." ] }, "metadata": {}, @@ -6212,7 +6221,7 @@ "/*# sourceMappingURL=tabulator_pysyft.min.css.map */\n", "\n", "\n", - "
\n", + "
\n", "\n", "
\n", "
\n", @@ -6225,16 +6234,16 @@ "
\n", "
\n", " \n", "
\n", "
\n", - "

Total: 0

\n", + "

Total: 0

\n", "
\n", "
\n", - "
\n", + "
\n", "\n", "\n", + "text/markdown": [ "\n", - "\n", + "**Pointer**\n", "\n", - "\n", - "\n", - "
\n", - "\n", - "
\n", - "
\n", - " \n", - "
\n", - "

UserView List

\n", - "
\n", - "
\n", - "
\n", - " \n", - "
\n", - "
\n", - "

Total: 0

\n", - "
\n", - "
\n", - "
\n", - "\n", - "\n", "\n", + "\n", "" + "\n", + "\n", + "\n", + "\n", + "
SyftSuccess:
Request 33fb47a296164483bdb314bbf1473f56 changes applied

" ], "text/plain": [ - "" - ] - }, - "execution_count": 26, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "client.users" - ] - }, - { - "cell_type": "code", - "execution_count": 25, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "[TestUser(name='Crystal Smith', email='crystal-smith-fake@openmined.org', password=')w&1iXSggD', role='ServiceRole.DATA_SCIENTIST', new_password=None, email_disabled=True, reset_password=False, reset_token=None, _email_server=None),\n", - " TestUser(name='John Gray', email='john-gray-fake@openmined.org', password='qu8eC6nU@!', role='ServiceRole.DATA_SCIENTIST', new_password=None, email_disabled=False, reset_password=False, reset_token=None, _email_server=None),\n", - " TestUser(name='Jimmy Copeland', email='jimmy-copeland-fake@openmined.org', password='4w3WA8J@%3', role='ServiceRole.DATA_SCIENTIST', new_password=None, email_disabled=False, reset_password=False, reset_token=None, _email_server=None),\n", - " TestUser(name='Ryan Thomas', email='ryan-thomas-fake@openmined.org', password='#72NWweU$8', role='ServiceRole.DATA_SCIENTIST', new_password=None, email_disabled=False, reset_password=False, reset_token=None, _email_server=None)]" + "SyftSuccess: Request 33fb47a296164483bdb314bbf1473f56 changes applied" ] }, - "execution_count": 25, + "execution_count": 29, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "users" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Old jobs" - ] - }, - { - "cell_type": "code", - "execution_count": 21, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "len(reviewed_jobs)=9, len(reviewed_jobs_should_succeed)=7, len(reviewed_jobs_should_fail)=2\n" - ] - } - ], - "source": [ - "# submitted_jobs = [job for job in jobs if job.is_submitted]\n", - "reviewed_jobs = [job for job in jobs if job.admin_reviewed]\n", - "reviewed_jobs_should_succeed = [j for j in reviewed_jobs if j.should_succeed]\n", - "reviewed_jobs_should_fail = [j for j in reviewed_jobs if not j.should_succeed]\n", - "\n", - "print(\n", - " f\"{len(reviewed_jobs)=}, {len(reviewed_jobs_should_succeed)=}, {len(reviewed_jobs_should_fail)=}\"\n", - ")" - ] - }, - { - "cell_type": "code", - "execution_count": 22, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "> Checking job: simple_query simple_query_81c2df for user crystal-smith-fake@openmined.org\n", - "> Checking job: simple_query simple_query_d504a4 for user crystal-smith-fake@openmined.org\n", - "> Checking job: job_long_name job_long_name_82766aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa for user crystal-smith-fake@openmined.org\n", - "> Checking job: simple_query simple_query_71c8bc for user john-gray-fake@openmined.org\n", - "> Checking job: simple_query simple_query_f4ffab for user john-gray-fake@openmined.org\n", - "> Checking job: simple_query simple_query_949aaf for user jimmy-copeland-fake@openmined.org\n", - "> Checking job: simple_query simple_query_c64422 for user ryan-thomas-fake@openmined.org\n" - ] - } - ], - "source": [ - "for job in reviewed_jobs_should_succeed:\n", - " print(f\"> Checking job: {job.job_type} {job.func_name} for user {job.user_email}\")\n", - " api_method = job.code_method\n", - " j = api_method(blocking=False)\n", - " res = j.wait()\n", - "\n", - " if isinstance(res, sy.SyftError):\n", - " raise sy.SyftException(public_message=\"Expected success, got error\")\n", - "\n", - " result = res.get()\n", - " job.result_as_expected = True" - ] - }, - { - "cell_type": "code", - "execution_count": 23, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "> Checking job: wrong_syntax_query wrong_syntax_query_e1ea75 for user jimmy-copeland-fake@openmined.org\n", - "> Checking job: job_too_much_text job_too_much_text_e252cf for user ryan-thomas-fake@openmined.org\n" - ] - } - ], - "source": [ - "for job in reviewed_jobs_should_fail:\n", - " print(f\"> Checking job: {job.job_type} {job.func_name} for user {job.user_email}\")\n", - " api_method = job.code_method\n", - "\n", - " j = api_method(blocking=False)\n", - " res = j.wait()\n", - " if isinstance(res, sy.SyftError):\n", - " job.result_as_expected = True\n", - " else:\n", - " raise sy.SyftException(public_message=f\"failed, job didnt raise {type(j)}\")" + "client.requests[-1].approve()" ] }, { "cell_type": "code", - "execution_count": 24, + "execution_count": 30, "metadata": {}, "outputs": [ { - "name": "stdout", - "output_type": "stream", - "text": [ - "got expected_jobs: 9 == reviewed_jobs: 9\n" + "ename": "NameError", + "evalue": "name 'job' is not defined", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mNameError\u001b[0m Traceback (most recent call last)", + "Cell \u001b[0;32mIn[30], line 1\u001b[0m\n\u001b[0;32m----> 1\u001b[0m \u001b[43mjob\u001b[49m\u001b[38;5;241m.\u001b[39mcode_path\n", + "\u001b[0;31mNameError\u001b[0m: name 'job' is not defined" ] } ], "source": [ - "expected_jobs = [job for job in jobs if job.result_as_expected]\n", - "print(f\"got expected_jobs: {len(expected_jobs)} == reviewed_jobs: {len(reviewed_jobs)}\")\n", - "assert len(reviewed_jobs) == len(expected_jobs)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Use old DS to go through the flow again" - ] - }, - { - "cell_type": "code", - "execution_count": 29, - "metadata": {}, - "outputs": [], - "source": [ - "ds_client = users[0].client" + "job.code_path" ] }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - }, { "cell_type": "markdown", "metadata": {}, diff --git a/packages/syft/src/syft/service/worker/worker_image.py b/packages/syft/src/syft/service/worker/worker_image.py index 99ca3ad6040..77876c43c8c 100644 --- a/packages/syft/src/syft/service/worker/worker_image.py +++ b/packages/syft/src/syft/service/worker/worker_image.py @@ -36,6 +36,10 @@ class SyftWorkerImageV1(SyftObject): image_identifier: SyftWorkerImageIdentifier | None = None image_hash: str | None = None built_at: DateTime | None = None + @property + def is_prebuilt(self) -> bool: + return isinstance(self.config, PrebuiltWorkerConfig) + @serializable() diff --git a/tox.ini b/tox.ini index b10400e3d06..c1cdd64c3bf 100644 --- a/tox.ini +++ b/tox.ini @@ -1600,7 +1600,7 @@ commands = pytest -s -x --nbmake --nbmake-timeout=1000 "$subfolder" --ignore=notebooks/scenarios/bigquery/sync -p no:randomly -vvvv --log-cli-level=DEBUG --capture=no;\ done" - pytest -x --nbmake --nbmake-timeout=1000 notebooks/tutorials/version-upgrades/11-dump-database-to-file.ipynb -vvvv + pytest -x --nbmake --nbmake-timeout=1000 notebooks/scenarios/bigquery/upgradability/1-dump-database-to-file.ipynb -vvvv bash -c 'ls -l ${MIGRATION_DATA_DIR}/migration.blob' bash -c 'ls -l ${MIGRATION_DATA_DIR}/migration.yaml' bash -c "echo 'Migration data prepared in ${MIGRATION_DATA_DIR}'" From b757d0cf0bd4aaba2d54fa582a5046cdeaf0a572 Mon Sep 17 00:00:00 2001 From: teo Date: Fri, 20 Sep 2024 17:18:04 +0300 Subject: [PATCH 05/17] added migration L2 state --- .../bigquery/upgradability/migration.blob | Bin 0 -> 5619704 bytes .../bigquery/upgradability/migration.yaml | 6 ++++++ 2 files changed, 6 insertions(+) create mode 100644 notebooks/scenarios/bigquery/upgradability/migration.blob create mode 100644 notebooks/scenarios/bigquery/upgradability/migration.yaml diff --git a/notebooks/scenarios/bigquery/upgradability/migration.blob b/notebooks/scenarios/bigquery/upgradability/migration.blob new file mode 100644 index 0000000000000000000000000000000000000000..c41cc8e98471ad485d71f7e3d44c0255ac6217c4 GIT binary patch literal 5619704 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
|@vQ#kC+===Z~Nru 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
@R}sE)Q?tKoW5uI#LmR!`lqNul5(0z(AwUQa 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%0AU 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 --Q#w1ziL<-cdv7L7f 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%0A>5*(6gh>*{6 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�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 U*B%a$|IEq<^#tmnit?ZT3wGdZSpWb4 literal 0 HcmV?d00001 diff --git a/notebooks/scenarios/bigquery/upgradability/migration.yaml b/notebooks/scenarios/bigquery/upgradability/migration.yaml new file mode 100644 index 00000000000..2f5c2ff282c --- /dev/null +++ b/notebooks/scenarios/bigquery/upgradability/migration.yaml @@ -0,0 +1,6 @@ +server: + env: + - name: SERVER_UID + value: fbdf5a287e58454cbbd3fac4ad744d37 + - name: SERVER_PRIVATE_KEY + value: fcfd09deed32e3574558b6719fed46e0b8fd957d59608e9d8b42ef07c6080d3e From 269916db39e3671da7c77ea6747522c3d8ab5145 Mon Sep 17 00:00:00 2001 From: teo Date: Fri, 20 Sep 2024 18:44:57 +0300 Subject: [PATCH 06/17] fix lint --- packages/syft/src/syft/client/registry.py | 12 +++++++++--- packages/syft/src/syft/protocol/data_protocol.py | 6 +++--- .../syft/src/syft/service/action/action_endpoint.py | 4 +++- .../syft/src/syft/service/action/action_service.py | 12 +++++++++--- packages/syft/src/syft/service/project/project.py | 4 +--- .../syft/src/syft/service/worker/worker_image.py | 2 +- packages/syft/src/syft/store/db/stash.py | 8 ++++++-- packages/syft/src/syft/store/kv_document_store.py | 4 ++-- .../syft/src/syft/store/sqlite_document_store.py | 8 ++++++-- packages/syft/src/syft/types/errors.py | 4 +++- packages/syft/src/syft/types/syft_object.py | 12 ++++++------ packages/syft/src/syft/types/syft_object_registry.py | 6 +++--- .../notebook_ui/components/tabulator_template.py | 4 +++- 13 files changed, 55 insertions(+), 31 deletions(-) diff --git a/packages/syft/src/syft/client/registry.py b/packages/syft/src/syft/client/registry.py index e793f57be11..f4086b8809e 100644 --- a/packages/syft/src/syft/client/registry.py +++ b/packages/syft/src/syft/client/registry.py @@ -103,7 +103,9 @@ def check_network(network: dict) -> dict[Any, Any] | None: # If not defined, try to ask in /syft/version endpoint (supported by 0.7.0) try: version_url = url + "api/v2/metadata" - res = requests.get(version_url, timeout=DEFAULT_TIMEOUT) # nosec + res = requests.get( + version_url, timeout=DEFAULT_TIMEOUT + ) # nosec if res.status_code == 200: network["version"] = res.json()["syft_version"] else: @@ -270,7 +272,9 @@ def check_datasite(datasite: dict) -> dict[Any, Any] | None: # If not defined, try to ask in /syft/version endpoint (supported by 0.7.0) try: version_url = url + "api/v2/metadata" - res = requests.get(version_url, timeout=DEFAULT_TIMEOUT) # nosec + res = requests.get( + version_url, timeout=DEFAULT_TIMEOUT + ) # nosec if res.status_code == 200: datasite["version"] = res.json()["syft_version"] else: @@ -536,7 +540,9 @@ def check_enclave(enclave: dict) -> dict[Any, Any] | None: # If not defined, try to ask in /syft/version endpoint (supported by 0.7.0) try: version_url = url + "api/v2/metadata" - res = requests.get(version_url, timeout=DEFAULT_TIMEOUT) # nosec + res = requests.get( + version_url, timeout=DEFAULT_TIMEOUT + ) # nosec if res.status_code == 200: enclave["version"] = res.json()["syft_version"] else: diff --git a/packages/syft/src/syft/protocol/data_protocol.py b/packages/syft/src/syft/protocol/data_protocol.py index 0c848585119..2429991cb86 100644 --- a/packages/syft/src/syft/protocol/data_protocol.py +++ b/packages/syft/src/syft/protocol/data_protocol.py @@ -431,9 +431,9 @@ def validate_release(self) -> None: # Update older file path to newer file path latest_protocol_fp.rename(new_protocol_file_path) - protocol_history[latest_protocol]["release_name"] = ( - f"{current_syft_version}.json" - ) + protocol_history[latest_protocol][ + "release_name" + ] = f"{current_syft_version}.json" # Save history self.file_path.write_text(json.dumps(protocol_history, indent=2) + "\n") diff --git a/packages/syft/src/syft/service/action/action_endpoint.py b/packages/syft/src/syft/service/action/action_endpoint.py index 2237b3963a6..68292c2e308 100644 --- a/packages/syft/src/syft/service/action/action_endpoint.py +++ b/packages/syft/src/syft/service/action/action_endpoint.py @@ -80,7 +80,9 @@ def __call_function( self.context.server.services.api.execute_server_side_endpoint_mock_by_id ) elif call_mode == EXECUTION_MODE.PRIVATE: - __endpoint_mode = self.context.server.services.api.execute_service_side_endpoint_private_by_id + __endpoint_mode = ( + self.context.server.services.api.execute_service_side_endpoint_private_by_id + ) else: __endpoint_mode = ( self.context.server.services.api.execute_server_side_endpoint_by_id diff --git a/packages/syft/src/syft/service/action/action_service.py b/packages/syft/src/syft/service/action/action_service.py index bd871a18164..c8dd7193739 100644 --- a/packages/syft/src/syft/service/action/action_service.py +++ b/packages/syft/src/syft/service/action/action_service.py @@ -715,7 +715,9 @@ def call_method( mock_obj_id=action.result_id, ) else: - return execute_object(self, context, resolved_self, action).unwrap() # type:ignore[unreachable] + return execute_object( + self, context, resolved_self, action + ).unwrap() # type:ignore[unreachable] as_result(SyftException) @@ -1118,13 +1120,17 @@ def execute_object( ) elif twin_mode == twin_mode.PRIVATE: # type:ignore # twin private path - private_args = filter_twin_args(args, twin_mode=twin_mode).unwrap() # type:ignore[unreachable] + private_args = filter_twin_args( + args, twin_mode=twin_mode + ).unwrap() # type:ignore[unreachable] private_kwargs = filter_twin_kwargs(kwargs, twin_mode=twin_mode).unwrap() result = target_method(*private_args, **private_kwargs) result_action_object = wrap_result(action.result_id, result) elif twin_mode == twin_mode.MOCK: # type:ignore # twin mock path - mock_args = filter_twin_args(args, twin_mode=twin_mode).unwrap() # type:ignore[unreachable] + mock_args = filter_twin_args( + args, twin_mode=twin_mode + ).unwrap() # type:ignore[unreachable] mock_kwargs = filter_twin_kwargs(kwargs, twin_mode=twin_mode).unwrap() target_method = getattr(unboxed_resolved_self, action.op, None) result = target_method(*mock_args, **mock_kwargs) diff --git a/packages/syft/src/syft/service/project/project.py b/packages/syft/src/syft/service/project/project.py index 5ed21f5007d..4587c5a4b39 100644 --- a/packages/syft/src/syft/service/project/project.py +++ b/packages/syft/src/syft/service/project/project.py @@ -1075,9 +1075,7 @@ def sync(self, verbose: bool | None = True) -> SyftSuccess: while not progress.finished: event = unsynced_events[curr_val] curr_val += 1 - progress.tasks[ - task1 - ].description = ( + progress.tasks[task1].description = ( f"[bold white]Syncing... {curr_val}/{len(unsynced_events)}" ) progress.update(task1, advance=1) diff --git a/packages/syft/src/syft/service/worker/worker_image.py b/packages/syft/src/syft/service/worker/worker_image.py index 77876c43c8c..fe9b9663a04 100644 --- a/packages/syft/src/syft/service/worker/worker_image.py +++ b/packages/syft/src/syft/service/worker/worker_image.py @@ -36,12 +36,12 @@ class SyftWorkerImageV1(SyftObject): image_identifier: SyftWorkerImageIdentifier | None = None image_hash: str | None = None built_at: DateTime | None = None + @property def is_prebuilt(self) -> bool: return isinstance(self.config, PrebuiltWorkerConfig) - @serializable() class SyftWorkerImage(SyftObject): __canonical_name__ = "SyftWorkerImage" diff --git a/packages/syft/src/syft/store/db/stash.py b/packages/syft/src/syft/store/db/stash.py index aec2a2ed9c5..7a956128f82 100644 --- a/packages/syft/src/syft/store/db/stash.py +++ b/packages/syft/src/syft/store/db/stash.py @@ -712,7 +712,9 @@ def has_permissions( @as_result(StashException) @with_session - def _get_permissions_for_uid(self, uid: UID, session: Session = None) -> Set[str]: # noqa: UP006 + def _get_permissions_for_uid( + self, uid: UID, session: Session = None + ) -> Set[str]: # noqa: UP006 stmt = select(self.table.c.permissions).where(self.table.c.id == uid) result = session.execute(stmt).scalar_one_or_none() if result is None: @@ -721,7 +723,9 @@ def _get_permissions_for_uid(self, uid: UID, session: Session = None) -> Set[str @as_result(StashException) @with_session - def get_all_permissions(self, session: Session = None) -> dict[UID, Set[str]]: # noqa: UP006 + def get_all_permissions( + self, session: Session = None + ) -> dict[UID, Set[str]]: # noqa: UP006 stmt = select(self.table.c.id, self.table.c.permissions) results = session.execute(stmt).all() return {UID(row.id): set(row.permissions) for row in results} diff --git a/packages/syft/src/syft/store/kv_document_store.py b/packages/syft/src/syft/store/kv_document_store.py index 77bfbbb3297..1999f0d8177 100644 --- a/packages/syft/src/syft/store/kv_document_store.py +++ b/packages/syft/src/syft/store/kv_document_store.py @@ -705,9 +705,9 @@ def _set_data_and_keys( ck_col[pk_value] = store_query_key.value self.unique_keys[pk_key] = ck_col - self.unique_keys[store_query_key.key][store_query_key.value] = ( + self.unique_keys[store_query_key.key][ store_query_key.value - ) + ] = store_query_key.value sqks = searchable_query_keys.all for qk in sqks: diff --git a/packages/syft/src/syft/store/sqlite_document_store.py b/packages/syft/src/syft/store/sqlite_document_store.py index 82d75d68e6b..311779e611e 100644 --- a/packages/syft/src/syft/store/sqlite_document_store.py +++ b/packages/syft/src/syft/store/sqlite_document_store.py @@ -269,7 +269,9 @@ def _get(self, key: UID) -> Any: return _deserialize(data, from_bytes=True) def _exists(self, key: UID) -> bool: - select_sql = f"select uid from {self.table_name} where uid = {self.subs_char}" # nosec + select_sql = ( + f"select uid from {self.table_name} where uid = {self.subs_char}" # nosec + ) cursor = self._execute( self.lock, self.cur, self.db, self.table_name, select_sql, [str(key)] ).unwrap() @@ -310,7 +312,9 @@ def _get_all_keys(self) -> Any: return keys def _delete(self, key: UID) -> None: - select_sql = f"delete from {self.table_name} where uid = {self.subs_char}" # nosec + select_sql = ( + f"delete from {self.table_name} where uid = {self.subs_char}" # nosec + ) self._execute( self.lock, self.cur, self.db, self.table_name, select_sql, [str(key)] ).unwrap() diff --git a/packages/syft/src/syft/types/errors.py b/packages/syft/src/syft/types/errors.py index d1255921a01..d7296d952dc 100644 --- a/packages/syft/src/syft/types/errors.py +++ b/packages/syft/src/syft/types/errors.py @@ -352,6 +352,8 @@ def syft_exception_handler( # not pick up exceptions if they have a custom exception handler (fail silently) if not runs_in_pytest: try: - get_ipython().set_custom_exc((SyftException,), syft_exception_handler) # noqa: F821 + get_ipython().set_custom_exc( + (SyftException,), syft_exception_handler + ) # noqa: F821 except Exception: pass # nosec diff --git a/packages/syft/src/syft/types/syft_object.py b/packages/syft/src/syft/types/syft_object.py index f6a4d3233cb..cf07f71f6e6 100644 --- a/packages/syft/src/syft/types/syft_object.py +++ b/packages/syft/src/syft/types/syft_object.py @@ -411,14 +411,14 @@ def make_id(cls, values: Any) -> Any: return values __order_by__: ClassVar[tuple[str, str]] = ("_created_at", "asc") - __attr_searchable__: ClassVar[ - list[str] - ] = [] # keys which can be searched in the ORM + __attr_searchable__: ClassVar[list[str]] = ( + [] + ) # keys which can be searched in the ORM __attr_unique__: ClassVar[list[str]] = [] # the unique keys for the particular Collection the objects will be stored in - __serde_overrides__: dict[ - str, Sequence[Callable] - ] = {} # List of attributes names which require a serde override. + __serde_overrides__: dict[str, Sequence[Callable]] = ( + {} + ) # List of attributes names which require a serde override. __owner__: str __repr_attrs__: ClassVar[list[str]] = [] # show these in html repr collections diff --git a/packages/syft/src/syft/types/syft_object_registry.py b/packages/syft/src/syft/types/syft_object_registry.py index 9487ae6ece6..0949a655cbf 100644 --- a/packages/syft/src/syft/types/syft_object_registry.py +++ b/packages/syft/src/syft/types/syft_object_registry.py @@ -24,9 +24,9 @@ def register_cls( ) -> None: if canonical_name not in cls.__object_serialization_registry__: cls.__object_serialization_registry__[canonical_name] = {} - cls.__object_serialization_registry__[canonical_name][version] = ( - serde_attributes - ) + cls.__object_serialization_registry__[canonical_name][ + version + ] = serde_attributes cls.__type_to_canonical_name__[serde_attributes[7]] = (canonical_name, version) diff --git a/packages/syft/src/syft/util/notebook_ui/components/tabulator_template.py b/packages/syft/src/syft/util/notebook_ui/components/tabulator_template.py index 538614b4cb8..136d16ed78f 100644 --- a/packages/syft/src/syft/util/notebook_ui/components/tabulator_template.py +++ b/packages/syft/src/syft/util/notebook_ui/components/tabulator_template.py @@ -28,7 +28,9 @@ def make_links(text: str) -> str: DEFAULT_ID_WIDTH = 110 -jinja_env = jinja2.Environment(loader=jinja2.PackageLoader("syft", "assets/jinja")) # nosec +jinja_env = jinja2.Environment( + loader=jinja2.PackageLoader("syft", "assets/jinja") +) # nosec jinja_env.filters["make_links"] = make_links From bded1f44658b80642490dbc9bef97808dfa554cd Mon Sep 17 00:00:00 2001 From: teo Date: Fri, 20 Sep 2024 18:45:18 +0300 Subject: [PATCH 07/17] fix tox tasks --- tox.ini | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/tox.ini b/tox.ini index c1cdd64c3bf..a5edaed5d13 100644 --- a/tox.ini +++ b/tox.ini @@ -1569,7 +1569,7 @@ commands_post = description = Prepare Migration Data pip_pre = True setenv = - MIGRATION_DATA_DIR = {env:MIGRATION_DATA_DIR:{temp_dir}/migration} + MIGRATION_DATA_DIR = {env:MIGRATION_DATA_DIR:notebooks/scenarios/bigquery/upgradability} ORCHESTRA_DEPLOYMENT_TYPE = {env:ORCHESTRA_DEPLOYMENT_TYPE:python} DEV_MODE = {env:DEV_MODE:True} TEST_NOTEBOOK_PATHS = {env:TEST_NOTEBOOK_PATHS:notebooks/scenarios/bigquery/upgradability/0.9.1_notebooks} @@ -1594,7 +1594,7 @@ commands = bash -c 'pwd' bash -c 'python -c "import syft as sy; print(\"Migrating from syft version:\", sy.__version__)"' bash -c "echo Running with ORCHESTRA_DEPLOYMENT_TYPE=$ORCHESTRA_DEPLOYMENT_TYPE DEV_MODE=$DEV_MODE TEST_NOTEBOOK_PATHS=$TEST_NOTEBOOK_PATHS; date" - + bash -c "for subfolder in $(echo ${TEST_NOTEBOOK_PATHS} | tr ',' ' ');\ do \ pytest -s -x --nbmake --nbmake-timeout=1000 "$subfolder" --ignore=notebooks/scenarios/bigquery/sync -p no:randomly -vvvv --log-cli-level=DEBUG --capture=no;\ @@ -1618,9 +1618,9 @@ allowlist_externals = tox pytest commands = - tox -e migration.prepare + ; tox -e migration.prepare bash -c 'python -c "import syft as sy; print(\"Migrating to syft version:\", sy.__version__)"' - pytest -x --nbmake --nbmake-timeout=1000 notebooks/tutorials/version-upgrades/3-migrate-from-file.ipynb -vvvv + pytest -x --nbmake --nbmake-timeout=1000 notebooks/scenarios/bigquery/upgradability/2-migrate-for-scenarios.ipynb -vvvv commands_post = bash -c 'rm -f ${MIGRATION_DATA_DIR}/migration.blob' bash -c 'rm -f ${MIGRATION_DATA_DIR}/migration.yaml' \ No newline at end of file From 8daddba07da8cb4f50865ae553ce356d19352d92 Mon Sep 17 00:00:00 2001 From: teo Date: Fri, 20 Sep 2024 18:45:30 +0300 Subject: [PATCH 08/17] added new CI test --- .github/workflows/pr-tests-stack.yml | 62 ++++++++++++++++++++++++++++ 1 file changed, 62 insertions(+) diff --git a/.github/workflows/pr-tests-stack.yml b/.github/workflows/pr-tests-stack.yml index 02eff919dea..b60e72d6256 100644 --- a/.github/workflows/pr-tests-stack.yml +++ b/.github/workflows/pr-tests-stack.yml @@ -621,6 +621,68 @@ jobs: run: | tox -e migration.test + pr-tests-scenarios-migrations: + strategy: + max-parallel: 99 + matrix: + os: [ubuntu-latest] + python-version: ["3.12"] + + runs-on: ${{ matrix.os }} + steps: + - name: "clean .git/config" + if: matrix.os == 'windows-latest' + continue-on-error: true + shell: bash + run: | + echo "deleting ${GITHUB_WORKSPACE}/.git/config" + rm ${GITHUB_WORKSPACE}/.git/config + + - uses: actions/checkout@v4 + + - name: Check for file changes + uses: dorny/paths-filter@v3 + id: changes + with: + base: ${{ github.ref }} + token: ${{ github.token }} + filters: .github/file-filters.yml + + - name: Set up Python ${{ matrix.python-version }} + uses: actions/setup-python@v5 + if: steps.changes.outputs.syft == 'true' + with: + python-version: ${{ matrix.python-version }} + + - name: Install pip packages + if: steps.changes.outputs.syft == 'true' + run: | + python -m pip install --upgrade pip + pip install uv==0.4.1 tox==4.18.0 tox-uv==1.11.2 + uv --version + + - name: Get uv cache dir + id: pip-cache + if: steps.changes.outputs.syft == 'true' + shell: bash + run: | + echo "dir=$(uv cache dir)" >> $GITHUB_OUTPUT + + - name: Load github cache + uses: actions/cache@v4 + if: steps.changes.outputs.syft == 'true' + with: + path: ${{ steps.pip-cache.outputs.dir }} + key: ${{ runner.os }}-uv-py${{ matrix.python-version }}-${{ hashFiles('setup.cfg') }} + restore-keys: | + ${{ runner.os }}-uv-py${{ matrix.python-version }}- + + - name: Run migration tests + if: steps.changes.outputs.syft == 'true' + run: | + tox -e migration.scenarios.test + + pr-tests-notebook-scenario-k8s-sync: strategy: max-parallel: 99 From 410f75d00e964e2b37b16ed7a3cd7df2aa9e8e56 Mon Sep 17 00:00:00 2001 From: teo Date: Fri, 20 Sep 2024 18:45:50 +0300 Subject: [PATCH 09/17] fix lint --- notebooks/api/0.8/00-load-data.ipynb | 7 +- .../0.9.1_helpers/apis/__init__.py | 4 +- .../0.9.1_helpers/apis/live/schema.py | 2 - .../0.9.1_helpers/apis/live/test_query.py | 2 - .../0.9.1_helpers/email_helpers.py | 2 +- .../0.9.1_helpers/job_helpers.py | 6 +- .../0.9.1_helpers/sync_helpers.py | 2 - ...tart-and-configure-server-and-admins.ipynb | 1132 +-------------- .../001-scale-delete-worker-pools.ipynb | 10 +- .../010-setup-bigquery-pool.ipynb | 12 +- .../011-users-emails-passwords.ipynb | 14 +- .../0.9.1_notebooks/020-configure-api.ipynb | 19 +- .../0.9.1_notebooks/021-create-jobs.ipynb | 74 +- .../040-do-review-requests.ipynb | 11 +- .../0.9.1_notebooks/050-ds-get-results.ipynb | 10 +- .../upgradability/0.9.1_notebooks/emails.json | 2 +- .../upgradability/0.9.1_notebooks/jobs.json | 2 +- .../upgradability/0.9.1_notebooks/users.json | 2 +- .../1-dump-database-to-file.ipynb | 30 +- .../2-migrate-for-scenarios.ipynb | 1218 ++++------------- .../bigquery/upgradability/migration.blob | Bin 5619704 -> 4227752 bytes 21 files changed, 436 insertions(+), 2125 deletions(-) diff --git a/notebooks/api/0.8/00-load-data.ipynb b/notebooks/api/0.8/00-load-data.ipynb index 8c3bb05b93b..372746f368a 100644 --- a/notebooks/api/0.8/00-load-data.ipynb +++ b/notebooks/api/0.8/00-load-data.ipynb @@ -711,6 +711,11 @@ } ], "metadata": { + "kernelspec": { + "display_name": "syft_3.12", + "language": "python", + "name": "python3" + }, "language_info": { "codemirror_mode": { "name": "ipython", @@ -721,7 +726,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.12.5" + "version": "3.12.4" }, "toc": { "base_numbering": 1, diff --git a/notebooks/scenarios/bigquery/upgradability/0.9.1_helpers/apis/__init__.py b/notebooks/scenarios/bigquery/upgradability/0.9.1_helpers/apis/__init__.py index 8da4d561c36..7231b580696 100644 --- a/notebooks/scenarios/bigquery/upgradability/0.9.1_helpers/apis/__init__.py +++ b/notebooks/scenarios/bigquery/upgradability/0.9.1_helpers/apis/__init__.py @@ -1,8 +1,10 @@ # stdlib import os -# relative +# syft absolute from syft.util.util import str_to_bool + +# relative from .submit_query import make_submit_query env_var = "TEST_BIGQUERY_APIS_LIVE" diff --git a/notebooks/scenarios/bigquery/upgradability/0.9.1_helpers/apis/live/schema.py b/notebooks/scenarios/bigquery/upgradability/0.9.1_helpers/apis/live/schema.py index 9eb715485db..03012c7d0cf 100644 --- a/notebooks/scenarios/bigquery/upgradability/0.9.1_helpers/apis/live/schema.py +++ b/notebooks/scenarios/bigquery/upgradability/0.9.1_helpers/apis/live/schema.py @@ -3,8 +3,6 @@ # syft absolute import syft as sy - -# relative from syft import test_settings from syft.rate_limiter import is_within_rate_limit diff --git a/notebooks/scenarios/bigquery/upgradability/0.9.1_helpers/apis/live/test_query.py b/notebooks/scenarios/bigquery/upgradability/0.9.1_helpers/apis/live/test_query.py index a1e0fbcb718..ccd3c75b599 100644 --- a/notebooks/scenarios/bigquery/upgradability/0.9.1_helpers/apis/live/test_query.py +++ b/notebooks/scenarios/bigquery/upgradability/0.9.1_helpers/apis/live/test_query.py @@ -3,8 +3,6 @@ # syft absolute import syft as sy - -# relative from syft import test_settings from syft.rate_limiter import is_within_rate_limit diff --git a/notebooks/scenarios/bigquery/upgradability/0.9.1_helpers/email_helpers.py b/notebooks/scenarios/bigquery/upgradability/0.9.1_helpers/email_helpers.py index e862d392089..dda08c21866 100644 --- a/notebooks/scenarios/bigquery/upgradability/0.9.1_helpers/email_helpers.py +++ b/notebooks/scenarios/bigquery/upgradability/0.9.1_helpers/email_helpers.py @@ -11,7 +11,7 @@ from aiosmtpd.controller import Controller from faker import Faker -# relative +# syft absolute from syft.service.user.user_roles import ServiceRole fake = Faker() diff --git a/notebooks/scenarios/bigquery/upgradability/0.9.1_helpers/job_helpers.py b/notebooks/scenarios/bigquery/upgradability/0.9.1_helpers/job_helpers.py index d3fd523a3af..e34a2eb10c7 100644 --- a/notebooks/scenarios/bigquery/upgradability/0.9.1_helpers/job_helpers.py +++ b/notebooks/scenarios/bigquery/upgradability/0.9.1_helpers/job_helpers.py @@ -10,10 +10,12 @@ import textwrap from typing import Any -# relative -from syft import test_settings +# third party from email_helpers import TestUser +# syft absolute +from syft import test_settings + from syft.client.client import SyftClient # noqa dataset_1 = test_settings.get("dataset_1", default="dataset_1") diff --git a/notebooks/scenarios/bigquery/upgradability/0.9.1_helpers/sync_helpers.py b/notebooks/scenarios/bigquery/upgradability/0.9.1_helpers/sync_helpers.py index 069eacdc47b..e1d558016ba 100644 --- a/notebooks/scenarios/bigquery/upgradability/0.9.1_helpers/sync_helpers.py +++ b/notebooks/scenarios/bigquery/upgradability/0.9.1_helpers/sync_helpers.py @@ -3,8 +3,6 @@ # syft absolute import syft as sy - -# relative from syft.client.datasite_client import DatasiteClient from syft.client.syncing import compare_clients from syft.service.code.user_code import UserCode diff --git a/notebooks/scenarios/bigquery/upgradability/0.9.1_notebooks/000-start-and-configure-server-and-admins.ipynb b/notebooks/scenarios/bigquery/upgradability/0.9.1_notebooks/000-start-and-configure-server-and-admins.ipynb index d3aa5308f43..054df0d72d5 100644 --- a/notebooks/scenarios/bigquery/upgradability/0.9.1_notebooks/000-start-and-configure-server-and-admins.ipynb +++ b/notebooks/scenarios/bigquery/upgradability/0.9.1_notebooks/000-start-and-configure-server-and-admins.ipynb @@ -2,7 +2,7 @@ "cells": [ { "cell_type": "code", - "execution_count": 1, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -16,17 +16,9 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "/home/teo/OpenMined/PySyft\n" - ] - } - ], + "outputs": [], "source": [ "# isort: off\n", "# stdlib\n", @@ -36,8 +28,13 @@ "\n", "# syft absolute\n", "import syft as sy\n", + "\n", "# from syft import get_helpers # noqa: F401\n", - "from syft.util.util import find_base_dir_with_tox_ini, get_caller_file_path, is_interpreter_jupyter\n", + "from syft.util.util import (\n", + " find_base_dir_with_tox_ini,\n", + " get_caller_file_path,\n", + " is_interpreter_jupyter,\n", + ")\n", "\n", "\n", "def add_helper_path_to_python_path() -> None:\n", @@ -51,7 +48,9 @@ " current_path = import_path\n", "\n", " base_dir = find_base_dir_with_tox_ini(current_path)\n", - " notebook_helper_path = os.path.join(base_dir, \"notebooks/scenarios/bigquery/upgradability/0.9.1_helpers\")\n", + " notebook_helper_path = os.path.join(\n", + " base_dir, \"notebooks/scenarios/bigquery/upgradability/0.9.1_helpers\"\n", + " )\n", " sys.path.append(notebook_helper_path)\n", "\n", "\n", @@ -71,7 +70,7 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -82,7 +81,7 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -93,106 +92,9 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Autoreload enabled\n", - "Starting bigquery-high server on 0.0.0.0:8080\n", - "Found `reset=True` in the launch configuration. Resetting the server...\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "INFO: Will watch for changes in these directories: ['/home/teo/OpenMined/PySyft/packages/syft/src/syft']\n", - "INFO: Uvicorn running on http://0.0.0.0:8080 (Press CTRL+C to quit)\n", - "INFO: Started reloader process [64107] using WatchFiles\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Waiting for server to start...WARN: private key is based on server name: bigquery-high in dev_mode. Don't run this in production.\n", - "Using SQLiteDBConfig and sqlite:////tmp/syft/fbdf5a287e58454cbbd3fac4ad744d37/db/fbdf5a287e58454cbbd3fac4ad744d37_json.db\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "INFO: Starting server with settings: {'name': 'bigquery-high', 'server_type': , 'server_side_type': , 'deployment_type': , 'processes': 1, 'reset': False, 'dev_mode': True, 'enable_warnings': False, 'in_memory_workers': True, 'queue_port': None, 'create_producer': True, 'n_consumers': 1, 'association_request_auto_approval': False, 'background_tasks': False, 'db_config': None, 'db_url': None} and worker class: \n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Adding producer for queue: api_call on: tcp://localhost:53903\n" - ] - }, - { - "ename": "KeyboardInterrupt", - "evalue": "", - "output_type": "error", - "traceback": [ - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[0;31mConnectionRefusedError\u001b[0m Traceback (most recent call last)", - "File \u001b[0;32m~/anaconda3/envs/syft_3.12/lib/python3.12/site-packages/urllib3/connection.py:196\u001b[0m, in \u001b[0;36mHTTPConnection._new_conn\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 195\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[0;32m--> 196\u001b[0m sock \u001b[38;5;241m=\u001b[39m \u001b[43mconnection\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mcreate_connection\u001b[49m\u001b[43m(\u001b[49m\n\u001b[1;32m 197\u001b[0m \u001b[43m \u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_dns_host\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mport\u001b[49m\u001b[43m)\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 198\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mtimeout\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 199\u001b[0m \u001b[43m \u001b[49m\u001b[43msource_address\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43msource_address\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 200\u001b[0m \u001b[43m \u001b[49m\u001b[43msocket_options\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43msocket_options\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 201\u001b[0m \u001b[43m \u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 202\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m socket\u001b[38;5;241m.\u001b[39mgaierror \u001b[38;5;28;01mas\u001b[39;00m e:\n", - "File \u001b[0;32m~/anaconda3/envs/syft_3.12/lib/python3.12/site-packages/urllib3/util/connection.py:85\u001b[0m, in \u001b[0;36mcreate_connection\u001b[0;34m(address, timeout, source_address, socket_options)\u001b[0m\n\u001b[1;32m 84\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[0;32m---> 85\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m err\n\u001b[1;32m 86\u001b[0m \u001b[38;5;28;01mfinally\u001b[39;00m:\n\u001b[1;32m 87\u001b[0m \u001b[38;5;66;03m# Break explicitly a reference cycle\u001b[39;00m\n", - "File \u001b[0;32m~/anaconda3/envs/syft_3.12/lib/python3.12/site-packages/urllib3/util/connection.py:73\u001b[0m, in \u001b[0;36mcreate_connection\u001b[0;34m(address, timeout, source_address, socket_options)\u001b[0m\n\u001b[1;32m 72\u001b[0m sock\u001b[38;5;241m.\u001b[39mbind(source_address)\n\u001b[0;32m---> 73\u001b[0m \u001b[43msock\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mconnect\u001b[49m\u001b[43m(\u001b[49m\u001b[43msa\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 74\u001b[0m \u001b[38;5;66;03m# Break explicitly a reference cycle\u001b[39;00m\n", - "\u001b[0;31mConnectionRefusedError\u001b[0m: [Errno 111] Connection refused", - "\nThe above exception was the direct cause of the following exception:\n", - "\u001b[0;31mNewConnectionError\u001b[0m Traceback (most recent call last)", - "File \u001b[0;32m~/anaconda3/envs/syft_3.12/lib/python3.12/site-packages/urllib3/connectionpool.py:789\u001b[0m, in \u001b[0;36mHTTPConnectionPool.urlopen\u001b[0;34m(self, method, url, body, headers, retries, redirect, assert_same_host, timeout, pool_timeout, release_conn, chunked, body_pos, preload_content, decode_content, **response_kw)\u001b[0m\n\u001b[1;32m 788\u001b[0m \u001b[38;5;66;03m# Make the request on the HTTPConnection object\u001b[39;00m\n\u001b[0;32m--> 789\u001b[0m response \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_make_request\u001b[49m\u001b[43m(\u001b[49m\n\u001b[1;32m 790\u001b[0m \u001b[43m \u001b[49m\u001b[43mconn\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 791\u001b[0m \u001b[43m \u001b[49m\u001b[43mmethod\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 792\u001b[0m \u001b[43m \u001b[49m\u001b[43murl\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 793\u001b[0m \u001b[43m \u001b[49m\u001b[43mtimeout\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mtimeout_obj\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 794\u001b[0m \u001b[43m \u001b[49m\u001b[43mbody\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mbody\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 795\u001b[0m \u001b[43m \u001b[49m\u001b[43mheaders\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mheaders\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 796\u001b[0m \u001b[43m \u001b[49m\u001b[43mchunked\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mchunked\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 797\u001b[0m \u001b[43m \u001b[49m\u001b[43mretries\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mretries\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 798\u001b[0m \u001b[43m \u001b[49m\u001b[43mresponse_conn\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mresponse_conn\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 799\u001b[0m \u001b[43m \u001b[49m\u001b[43mpreload_content\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mpreload_content\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 800\u001b[0m \u001b[43m \u001b[49m\u001b[43mdecode_content\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mdecode_content\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 801\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mresponse_kw\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 802\u001b[0m \u001b[43m\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 804\u001b[0m \u001b[38;5;66;03m# Everything went great!\u001b[39;00m\n", - "File \u001b[0;32m~/anaconda3/envs/syft_3.12/lib/python3.12/site-packages/urllib3/connectionpool.py:495\u001b[0m, in \u001b[0;36mHTTPConnectionPool._make_request\u001b[0;34m(self, conn, method, url, body, headers, retries, timeout, chunked, response_conn, preload_content, decode_content, enforce_content_length)\u001b[0m\n\u001b[1;32m 494\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[0;32m--> 495\u001b[0m \u001b[43mconn\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mrequest\u001b[49m\u001b[43m(\u001b[49m\n\u001b[1;32m 496\u001b[0m \u001b[43m \u001b[49m\u001b[43mmethod\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 497\u001b[0m \u001b[43m \u001b[49m\u001b[43murl\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 498\u001b[0m \u001b[43m \u001b[49m\u001b[43mbody\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mbody\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 499\u001b[0m \u001b[43m \u001b[49m\u001b[43mheaders\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mheaders\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 500\u001b[0m \u001b[43m \u001b[49m\u001b[43mchunked\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mchunked\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 501\u001b[0m \u001b[43m \u001b[49m\u001b[43mpreload_content\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mpreload_content\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 502\u001b[0m \u001b[43m \u001b[49m\u001b[43mdecode_content\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mdecode_content\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 503\u001b[0m \u001b[43m \u001b[49m\u001b[43menforce_content_length\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43menforce_content_length\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 504\u001b[0m \u001b[43m \u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 506\u001b[0m \u001b[38;5;66;03m# We are swallowing BrokenPipeError (errno.EPIPE) since the server is\u001b[39;00m\n\u001b[1;32m 507\u001b[0m \u001b[38;5;66;03m# legitimately able to close the connection after sending a valid response.\u001b[39;00m\n\u001b[1;32m 508\u001b[0m \u001b[38;5;66;03m# With this behaviour, the received response is still readable.\u001b[39;00m\n", - "File \u001b[0;32m~/anaconda3/envs/syft_3.12/lib/python3.12/site-packages/urllib3/connection.py:398\u001b[0m, in \u001b[0;36mHTTPConnection.request\u001b[0;34m(self, method, url, body, headers, chunked, preload_content, decode_content, enforce_content_length)\u001b[0m\n\u001b[1;32m 397\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mputheader(header, value)\n\u001b[0;32m--> 398\u001b[0m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mendheaders\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 400\u001b[0m \u001b[38;5;66;03m# If we're given a body we start sending that in chunks.\u001b[39;00m\n", - "File \u001b[0;32m~/anaconda3/envs/syft_3.12/lib/python3.12/http/client.py:1331\u001b[0m, in \u001b[0;36mHTTPConnection.endheaders\u001b[0;34m(self, message_body, encode_chunked)\u001b[0m\n\u001b[1;32m 1330\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m CannotSendHeader()\n\u001b[0;32m-> 1331\u001b[0m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_send_output\u001b[49m\u001b[43m(\u001b[49m\u001b[43mmessage_body\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mencode_chunked\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mencode_chunked\u001b[49m\u001b[43m)\u001b[49m\n", - "File \u001b[0;32m~/anaconda3/envs/syft_3.12/lib/python3.12/http/client.py:1091\u001b[0m, in \u001b[0;36mHTTPConnection._send_output\u001b[0;34m(self, message_body, encode_chunked)\u001b[0m\n\u001b[1;32m 1090\u001b[0m \u001b[38;5;28;01mdel\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_buffer[:]\n\u001b[0;32m-> 1091\u001b[0m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43msend\u001b[49m\u001b[43m(\u001b[49m\u001b[43mmsg\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 1093\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m message_body \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m:\n\u001b[1;32m 1094\u001b[0m \n\u001b[1;32m 1095\u001b[0m \u001b[38;5;66;03m# create a consistent interface to message_body\u001b[39;00m\n", - "File \u001b[0;32m~/anaconda3/envs/syft_3.12/lib/python3.12/http/client.py:1035\u001b[0m, in \u001b[0;36mHTTPConnection.send\u001b[0;34m(self, data)\u001b[0m\n\u001b[1;32m 1034\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mauto_open:\n\u001b[0;32m-> 1035\u001b[0m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mconnect\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 1036\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n", - "File \u001b[0;32m~/anaconda3/envs/syft_3.12/lib/python3.12/site-packages/urllib3/connection.py:236\u001b[0m, in \u001b[0;36mHTTPConnection.connect\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 235\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21mconnect\u001b[39m(\u001b[38;5;28mself\u001b[39m) \u001b[38;5;241m-\u001b[39m\u001b[38;5;241m>\u001b[39m \u001b[38;5;28;01mNone\u001b[39;00m:\n\u001b[0;32m--> 236\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39msock \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_new_conn\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 237\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_tunnel_host:\n\u001b[1;32m 238\u001b[0m \u001b[38;5;66;03m# If we're tunneling it means we're connected to our proxy.\u001b[39;00m\n", - "File \u001b[0;32m~/anaconda3/envs/syft_3.12/lib/python3.12/site-packages/urllib3/connection.py:211\u001b[0m, in \u001b[0;36mHTTPConnection._new_conn\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 210\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m \u001b[38;5;167;01mOSError\u001b[39;00m \u001b[38;5;28;01mas\u001b[39;00m e:\n\u001b[0;32m--> 211\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m NewConnectionError(\n\u001b[1;32m 212\u001b[0m \u001b[38;5;28mself\u001b[39m, \u001b[38;5;124mf\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mFailed to establish a new connection: \u001b[39m\u001b[38;5;132;01m{\u001b[39;00me\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m\"\u001b[39m\n\u001b[1;32m 213\u001b[0m ) \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;21;01me\u001b[39;00m\n\u001b[1;32m 215\u001b[0m \u001b[38;5;66;03m# Audit hooks are only available in Python 3.8+\u001b[39;00m\n", - "\u001b[0;31mNewConnectionError\u001b[0m: : Failed to establish a new connection: [Errno 111] Connection refused", - "\nThe above exception was the direct cause of the following exception:\n", - "\u001b[0;31mMaxRetryError\u001b[0m Traceback (most recent call last)", - "File \u001b[0;32m~/anaconda3/envs/syft_3.12/lib/python3.12/site-packages/requests/adapters.py:667\u001b[0m, in \u001b[0;36mHTTPAdapter.send\u001b[0;34m(self, request, stream, timeout, verify, cert, proxies)\u001b[0m\n\u001b[1;32m 666\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[0;32m--> 667\u001b[0m resp \u001b[38;5;241m=\u001b[39m \u001b[43mconn\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43murlopen\u001b[49m\u001b[43m(\u001b[49m\n\u001b[1;32m 668\u001b[0m \u001b[43m \u001b[49m\u001b[43mmethod\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mrequest\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mmethod\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 669\u001b[0m \u001b[43m \u001b[49m\u001b[43murl\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43murl\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 670\u001b[0m \u001b[43m \u001b[49m\u001b[43mbody\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mrequest\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mbody\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 671\u001b[0m \u001b[43m \u001b[49m\u001b[43mheaders\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mrequest\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mheaders\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 672\u001b[0m \u001b[43m \u001b[49m\u001b[43mredirect\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;28;43;01mFalse\u001b[39;49;00m\u001b[43m,\u001b[49m\n\u001b[1;32m 673\u001b[0m \u001b[43m \u001b[49m\u001b[43massert_same_host\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;28;43;01mFalse\u001b[39;49;00m\u001b[43m,\u001b[49m\n\u001b[1;32m 674\u001b[0m \u001b[43m \u001b[49m\u001b[43mpreload_content\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;28;43;01mFalse\u001b[39;49;00m\u001b[43m,\u001b[49m\n\u001b[1;32m 675\u001b[0m \u001b[43m \u001b[49m\u001b[43mdecode_content\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;28;43;01mFalse\u001b[39;49;00m\u001b[43m,\u001b[49m\n\u001b[1;32m 676\u001b[0m \u001b[43m \u001b[49m\u001b[43mretries\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mmax_retries\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 677\u001b[0m \u001b[43m \u001b[49m\u001b[43mtimeout\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mtimeout\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 678\u001b[0m \u001b[43m \u001b[49m\u001b[43mchunked\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mchunked\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 679\u001b[0m \u001b[43m \u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 681\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m (ProtocolError, \u001b[38;5;167;01mOSError\u001b[39;00m) \u001b[38;5;28;01mas\u001b[39;00m err:\n", - "File \u001b[0;32m~/anaconda3/envs/syft_3.12/lib/python3.12/site-packages/urllib3/connectionpool.py:843\u001b[0m, in \u001b[0;36mHTTPConnectionPool.urlopen\u001b[0;34m(self, method, url, body, headers, retries, redirect, assert_same_host, timeout, pool_timeout, release_conn, chunked, body_pos, preload_content, decode_content, **response_kw)\u001b[0m\n\u001b[1;32m 841\u001b[0m new_e \u001b[38;5;241m=\u001b[39m ProtocolError(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mConnection aborted.\u001b[39m\u001b[38;5;124m\"\u001b[39m, new_e)\n\u001b[0;32m--> 843\u001b[0m retries \u001b[38;5;241m=\u001b[39m \u001b[43mretries\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mincrement\u001b[49m\u001b[43m(\u001b[49m\n\u001b[1;32m 844\u001b[0m \u001b[43m \u001b[49m\u001b[43mmethod\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43murl\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43merror\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mnew_e\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43m_pool\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43m_stacktrace\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43msys\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mexc_info\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\u001b[43m[\u001b[49m\u001b[38;5;241;43m2\u001b[39;49m\u001b[43m]\u001b[49m\n\u001b[1;32m 845\u001b[0m \u001b[43m\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 846\u001b[0m retries\u001b[38;5;241m.\u001b[39msleep()\n", - "File \u001b[0;32m~/anaconda3/envs/syft_3.12/lib/python3.12/site-packages/urllib3/util/retry.py:519\u001b[0m, in \u001b[0;36mRetry.increment\u001b[0;34m(self, method, url, response, error, _pool, _stacktrace)\u001b[0m\n\u001b[1;32m 518\u001b[0m reason \u001b[38;5;241m=\u001b[39m error \u001b[38;5;129;01mor\u001b[39;00m ResponseError(cause)\n\u001b[0;32m--> 519\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m MaxRetryError(_pool, url, reason) \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;21;01mreason\u001b[39;00m \u001b[38;5;66;03m# type: ignore[arg-type]\u001b[39;00m\n\u001b[1;32m 521\u001b[0m log\u001b[38;5;241m.\u001b[39mdebug(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mIncremented Retry for (url=\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;132;01m%s\u001b[39;00m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m): \u001b[39m\u001b[38;5;132;01m%r\u001b[39;00m\u001b[38;5;124m\"\u001b[39m, url, new_retry)\n", - "\u001b[0;31mMaxRetryError\u001b[0m: HTTPConnectionPool(host='0.0.0.0', port=8080): Max retries exceeded with url: /api/v2/metadata (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 111] Connection refused'))", - "\nDuring handling of the above exception, another exception occurred:\n", - "\u001b[0;31mConnectionError\u001b[0m Traceback (most recent call last)", - "File \u001b[0;32m~/OpenMined/PySyft/packages/syft/src/syft/server/uvicorn.py:299\u001b[0m, in \u001b[0;36mserve_server..start\u001b[0;34m()\u001b[0m\n\u001b[1;32m 298\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[0;32m--> 299\u001b[0m req \u001b[38;5;241m=\u001b[39m \u001b[43mrequests\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mget\u001b[49m\u001b[43m(\u001b[49m\n\u001b[1;32m 300\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;124;43mf\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43mhttp://\u001b[39;49m\u001b[38;5;132;43;01m{\u001b[39;49;00m\u001b[43mhost\u001b[49m\u001b[38;5;132;43;01m}\u001b[39;49;00m\u001b[38;5;124;43m:\u001b[39;49m\u001b[38;5;132;43;01m{\u001b[39;49;00m\u001b[43mport\u001b[49m\u001b[38;5;132;43;01m}\u001b[39;49;00m\u001b[38;5;132;43;01m{\u001b[39;49;00m\u001b[43mAPI_PATH\u001b[49m\u001b[38;5;132;43;01m}\u001b[39;49;00m\u001b[38;5;124;43m/metadata\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m,\u001b[49m\n\u001b[1;32m 301\u001b[0m \u001b[43m \u001b[49m\u001b[43mtimeout\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mDEFAULT_TIMEOUT\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 302\u001b[0m \u001b[43m \u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 303\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m req\u001b[38;5;241m.\u001b[39mstatus_code \u001b[38;5;241m==\u001b[39m \u001b[38;5;241m200\u001b[39m:\n", - "File \u001b[0;32m~/anaconda3/envs/syft_3.12/lib/python3.12/site-packages/requests/api.py:73\u001b[0m, in \u001b[0;36mget\u001b[0;34m(url, params, **kwargs)\u001b[0m\n\u001b[1;32m 63\u001b[0m \u001b[38;5;250m\u001b[39m\u001b[38;5;124mr\u001b[39m\u001b[38;5;124;03m\"\"\"Sends a GET request.\u001b[39;00m\n\u001b[1;32m 64\u001b[0m \n\u001b[1;32m 65\u001b[0m \u001b[38;5;124;03m:param url: URL for the new :class:`Request` object.\u001b[39;00m\n\u001b[0;32m (...)\u001b[0m\n\u001b[1;32m 70\u001b[0m \u001b[38;5;124;03m:rtype: requests.Response\u001b[39;00m\n\u001b[1;32m 71\u001b[0m \u001b[38;5;124;03m\"\"\"\u001b[39;00m\n\u001b[0;32m---> 73\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43mrequest\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43mget\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43murl\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mparams\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mparams\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n", - "File \u001b[0;32m~/anaconda3/envs/syft_3.12/lib/python3.12/site-packages/requests/api.py:59\u001b[0m, in \u001b[0;36mrequest\u001b[0;34m(method, url, **kwargs)\u001b[0m\n\u001b[1;32m 58\u001b[0m \u001b[38;5;28;01mwith\u001b[39;00m sessions\u001b[38;5;241m.\u001b[39mSession() \u001b[38;5;28;01mas\u001b[39;00m session:\n\u001b[0;32m---> 59\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43msession\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mrequest\u001b[49m\u001b[43m(\u001b[49m\u001b[43mmethod\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mmethod\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43murl\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43murl\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n", - "File \u001b[0;32m~/anaconda3/envs/syft_3.12/lib/python3.12/site-packages/requests/sessions.py:589\u001b[0m, in \u001b[0;36mSession.request\u001b[0;34m(self, method, url, params, data, headers, cookies, files, auth, timeout, allow_redirects, proxies, hooks, stream, verify, cert, json)\u001b[0m\n\u001b[1;32m 588\u001b[0m send_kwargs\u001b[38;5;241m.\u001b[39mupdate(settings)\n\u001b[0;32m--> 589\u001b[0m resp \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43msend\u001b[49m\u001b[43m(\u001b[49m\u001b[43mprep\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43msend_kwargs\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 591\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m resp\n", - "File \u001b[0;32m~/anaconda3/envs/syft_3.12/lib/python3.12/site-packages/requests/sessions.py:703\u001b[0m, in \u001b[0;36mSession.send\u001b[0;34m(self, request, **kwargs)\u001b[0m\n\u001b[1;32m 702\u001b[0m \u001b[38;5;66;03m# Send the request\u001b[39;00m\n\u001b[0;32m--> 703\u001b[0m r \u001b[38;5;241m=\u001b[39m \u001b[43madapter\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43msend\u001b[49m\u001b[43m(\u001b[49m\u001b[43mrequest\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 705\u001b[0m \u001b[38;5;66;03m# Total elapsed time of the request (approximately)\u001b[39;00m\n", - "File \u001b[0;32m~/anaconda3/envs/syft_3.12/lib/python3.12/site-packages/requests/adapters.py:700\u001b[0m, in \u001b[0;36mHTTPAdapter.send\u001b[0;34m(self, request, stream, timeout, verify, cert, proxies)\u001b[0m\n\u001b[1;32m 698\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m SSLError(e, request\u001b[38;5;241m=\u001b[39mrequest)\n\u001b[0;32m--> 700\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mConnectionError\u001b[39;00m(e, request\u001b[38;5;241m=\u001b[39mrequest)\n\u001b[1;32m 702\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m ClosedPoolError \u001b[38;5;28;01mas\u001b[39;00m e:\n", - "\u001b[0;31mConnectionError\u001b[0m: HTTPConnectionPool(host='0.0.0.0', port=8080): Max retries exceeded with url: /api/v2/metadata (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 111] Connection refused'))", - "\nDuring handling of the above exception, another exception occurred:\n", - "\u001b[0;31mKeyboardInterrupt\u001b[0m Traceback (most recent call last)", - "Cell \u001b[0;32mIn[5], line 1\u001b[0m\n\u001b[0;32m----> 1\u001b[0m server \u001b[38;5;241m=\u001b[39m \u001b[43msy\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43morchestra\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mlaunch\u001b[49m\u001b[43m(\u001b[49m\n\u001b[1;32m 2\u001b[0m \u001b[43m \u001b[49m\u001b[43mname\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43mbigquery-high\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m,\u001b[49m\n\u001b[1;32m 3\u001b[0m \u001b[43m \u001b[49m\u001b[43mdev_mode\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;28;43;01mTrue\u001b[39;49;00m\u001b[43m,\u001b[49m\n\u001b[1;32m 4\u001b[0m \u001b[43m \u001b[49m\u001b[43mserver_side_type\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43mhigh\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m,\u001b[49m\n\u001b[1;32m 5\u001b[0m \u001b[43m \u001b[49m\u001b[43mreset\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;28;43;01mTrue\u001b[39;49;00m\u001b[43m,\u001b[49m\n\u001b[1;32m 6\u001b[0m \u001b[43m \u001b[49m\u001b[43mport\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43m8080\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m,\u001b[49m\n\u001b[1;32m 7\u001b[0m \u001b[43m \u001b[49m\u001b[43mn_consumers\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;241;43m1\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;66;43;03m# How many workers to be spawned\u001b[39;49;00m\n\u001b[1;32m 8\u001b[0m \u001b[43m \u001b[49m\u001b[43mcreate_producer\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;28;43;01mTrue\u001b[39;49;00m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;66;43;03m# Can produce more workers\u001b[39;49;00m\n\u001b[1;32m 9\u001b[0m \u001b[43m)\u001b[49m\n", - "File \u001b[0;32m~/OpenMined/PySyft/packages/syft/src/syft/orchestra.py:361\u001b[0m, in \u001b[0;36mOrchestra.launch\u001b[0;34m(name, server_type, deploy_to, server_side_type, port, processes, local_db, dev_mode, reset, log_level, tail, host, enable_warnings, n_consumers, thread_workers, create_producer, queue_port, association_request_auto_approval, background_tasks, debug, migrate, from_state_folder, consumer_type, db_url)\u001b[0m\n\u001b[1;32m 356\u001b[0m deployment_type_enum: DeploymentType \u001b[38;5;241m|\u001b[39m \u001b[38;5;28;01mNone\u001b[39;00m \u001b[38;5;241m=\u001b[39m get_deployment_type(\n\u001b[1;32m 357\u001b[0m deployment_type\u001b[38;5;241m=\u001b[39mdeploy_to\n\u001b[1;32m 358\u001b[0m )\n\u001b[1;32m 360\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m deployment_type_enum \u001b[38;5;241m==\u001b[39m DeploymentType\u001b[38;5;241m.\u001b[39mPYTHON:\n\u001b[0;32m--> 361\u001b[0m server_handle \u001b[38;5;241m=\u001b[39m \u001b[43mdeploy_to_python\u001b[49m\u001b[43m(\u001b[49m\n\u001b[1;32m 362\u001b[0m \u001b[43m \u001b[49m\u001b[43mserver_type_enum\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mserver_type_enum\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 363\u001b[0m \u001b[43m \u001b[49m\u001b[43mdeployment_type_enum\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mdeployment_type_enum\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 364\u001b[0m \u001b[43m \u001b[49m\u001b[43mport\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mport\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 365\u001b[0m \u001b[43m \u001b[49m\u001b[43mname\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mname\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 366\u001b[0m \u001b[43m \u001b[49m\u001b[43mhost\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mhost\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 367\u001b[0m \u001b[43m \u001b[49m\u001b[43mreset\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mreset\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 368\u001b[0m \u001b[43m \u001b[49m\u001b[43mtail\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mtail\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 369\u001b[0m \u001b[43m \u001b[49m\u001b[43mdev_mode\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mdev_mode\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 370\u001b[0m \u001b[43m \u001b[49m\u001b[43mprocesses\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mprocesses\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 371\u001b[0m \u001b[43m \u001b[49m\u001b[43mlocal_db\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mlocal_db\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 372\u001b[0m \u001b[43m \u001b[49m\u001b[43mserver_side_type\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mserver_side_type_enum\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 373\u001b[0m \u001b[43m \u001b[49m\u001b[43menable_warnings\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43menable_warnings\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 374\u001b[0m \u001b[43m \u001b[49m\u001b[43mlog_level\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mlog_level\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 375\u001b[0m \u001b[43m \u001b[49m\u001b[43mn_consumers\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mn_consumers\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 376\u001b[0m \u001b[43m \u001b[49m\u001b[43mthread_workers\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mthread_workers\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 377\u001b[0m \u001b[43m \u001b[49m\u001b[43mcreate_producer\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mcreate_producer\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 378\u001b[0m \u001b[43m \u001b[49m\u001b[43mqueue_port\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mqueue_port\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 379\u001b[0m \u001b[43m \u001b[49m\u001b[43massociation_request_auto_approval\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43massociation_request_auto_approval\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 380\u001b[0m \u001b[43m \u001b[49m\u001b[43mbackground_tasks\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mbackground_tasks\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 381\u001b[0m \u001b[43m \u001b[49m\u001b[43mdebug\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mdebug\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 382\u001b[0m \u001b[43m \u001b[49m\u001b[43mmigrate\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mmigrate\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 383\u001b[0m \u001b[43m \u001b[49m\u001b[43mconsumer_type\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mconsumer_type\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 384\u001b[0m \u001b[43m \u001b[49m\u001b[43mdb_url\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mdb_url\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 385\u001b[0m \u001b[43m \u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 386\u001b[0m display(\n\u001b[1;32m 387\u001b[0m SyftInfo(\n\u001b[1;32m 388\u001b[0m message\u001b[38;5;241m=\u001b[39m\u001b[38;5;124mf\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mYou have launched a development server at http://\u001b[39m\u001b[38;5;132;01m{\u001b[39;00mhost\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m:\u001b[39m\u001b[38;5;132;01m{\u001b[39;00mserver_handle\u001b[38;5;241m.\u001b[39mport\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m.\u001b[39m\u001b[38;5;124m\"\u001b[39m\n\u001b[1;32m 389\u001b[0m \u001b[38;5;241m+\u001b[39m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m It is intended only for local use.\u001b[39m\u001b[38;5;124m\"\u001b[39m\n\u001b[1;32m 390\u001b[0m )\n\u001b[1;32m 391\u001b[0m )\n\u001b[1;32m 392\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m server_handle\n", - "File \u001b[0;32m~/OpenMined/PySyft/packages/syft/src/syft/orchestra.py:240\u001b[0m, in \u001b[0;36mdeploy_to_python\u001b[0;34m(server_type_enum, deployment_type_enum, port, name, host, reset, tail, dev_mode, processes, local_db, server_side_type, enable_warnings, n_consumers, thread_workers, create_producer, queue_port, association_request_auto_approval, background_tasks, log_level, debug, migrate, consumer_type, db_url)\u001b[0m\n\u001b[1;32m 237\u001b[0m supported_kwargs \u001b[38;5;241m=\u001b[39m {k: v \u001b[38;5;28;01mfor\u001b[39;00m k, v \u001b[38;5;129;01min\u001b[39;00m kwargs\u001b[38;5;241m.\u001b[39mitems() \u001b[38;5;28;01mif\u001b[39;00m k \u001b[38;5;129;01min\u001b[39;00m sig\u001b[38;5;241m.\u001b[39mparameters}\n\u001b[1;32m 239\u001b[0m start, stop \u001b[38;5;241m=\u001b[39m serve_server(\u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39msupported_kwargs)\n\u001b[0;32m--> 240\u001b[0m \u001b[43mstart\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 241\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m ServerHandle(\n\u001b[1;32m 242\u001b[0m server_type\u001b[38;5;241m=\u001b[39mserver_type_enum,\n\u001b[1;32m 243\u001b[0m deployment_type\u001b[38;5;241m=\u001b[39mdeployment_type_enum,\n\u001b[0;32m (...)\u001b[0m\n\u001b[1;32m 248\u001b[0m server_side_type\u001b[38;5;241m=\u001b[39mserver_side_type,\n\u001b[1;32m 249\u001b[0m )\n\u001b[1;32m 250\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n", - "File \u001b[0;32m~/OpenMined/PySyft/packages/syft/src/syft/server/uvicorn.py:307\u001b[0m, in \u001b[0;36mserve_server..start\u001b[0;34m()\u001b[0m\n\u001b[1;32m 305\u001b[0m \u001b[38;5;28;01mbreak\u001b[39;00m\n\u001b[1;32m 306\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m \u001b[38;5;167;01mException\u001b[39;00m:\n\u001b[0;32m--> 307\u001b[0m \u001b[43mtime\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43msleep\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;241;43m1\u001b[39;49m\u001b[43m)\u001b[49m\n\u001b[1;32m 308\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m i \u001b[38;5;241m==\u001b[39m \u001b[38;5;241m0\u001b[39m:\n\u001b[1;32m 309\u001b[0m \u001b[38;5;28mprint\u001b[39m(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mWaiting for server to start\u001b[39m\u001b[38;5;124m\"\u001b[39m, end\u001b[38;5;241m=\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m\"\u001b[39m)\n", - "\u001b[0;31mKeyboardInterrupt\u001b[0m: " - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "INFO: Started server process [64121]\n", - "INFO: Waiting for application startup.\n", - "INFO: Application startup complete.\n", - "INFO: Stopping reloader process [64107]\n" - ] - } - ], + "outputs": [], "source": [ "server = sy.orchestra.launch(\n", " name=\"bigquery-high\",\n", @@ -207,882 +109,18 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "> Starting SMTPTestServer on: 0.0.0.0:9025\n" - ] - } - ], + "outputs": [], "source": [ "email_server, smtp_server = get_email_server(reset=True)" ] }, { "cell_type": "code", - "execution_count": 7, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "> Starting SMTPTestServer on: 0.0.0.0:9025\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Logged into as \n" - ] - }, - { - "data": { - "text/html": [ - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "
SyftWarning:
You are using a default password. Please change the password using `[your_client].account.set_password([new_password])`.

" - ], - "text/plain": [ - "SyftWarning: You are using a default password. Please change the password using `[your_client].account.set_password([new_password])`." - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "outputs": [], "source": [ "root_client = sy.login(\n", " url=\"http://localhost:8080\", email=ROOT_EMAIL, password=ROOT_PASSWORD\n", @@ -1098,7 +136,7 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -1107,33 +145,9 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "data": { - "text/markdown": [ - "```python\n", - "class UserView:\n", - " id: str = 57df96fef9fb423998953a43699d54ae\n", - " name: str = \"second admin\"\n", - " email: str = \"admin2@bigquery.org\"\n", - " institution: str = None\n", - " website: str = None\n", - " role: str = ServiceRole.ADMIN\n", - " notifications_enabled: str = {: True, : False, : False, : False}\n", - "\n", - "```" - ], - "text/plain": [ - "syft.service.user.user.UserView" - ] - }, - "execution_count": 9, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "# create\n", "root_client.register(\n", @@ -1153,17 +167,9 @@ }, { "cell_type": "code", - "execution_count": 10, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Logged into as \n" - ] - } - ], + "outputs": [], "source": [ "high_client = sy.login(\n", " url=\"http://localhost:8080\", email=ADMIN_EMAIL, password=ADMIN_PW\n", @@ -1172,7 +178,7 @@ }, { "cell_type": "code", - "execution_count": 11, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -1181,7 +187,7 @@ }, { "cell_type": "code", - "execution_count": 12, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -1198,33 +204,9 @@ }, { "cell_type": "code", - "execution_count": 13, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "data": { - "text/markdown": [ - "```python\n", - "class UserView:\n", - " id: str = 57df96fef9fb423998953a43699d54ae\n", - " name: str = \"second admin\"\n", - " email: str = \"admin2@bigquery.org\"\n", - " institution: str = None\n", - " website: str = None\n", - " role: str = ServiceRole.ADMIN\n", - " notifications_enabled: str = {: True, : False, : False, : False}\n", - "\n", - "```" - ], - "text/plain": [ - "syft.service.user.user.UserView" - ] - }, - "execution_count": 13, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "# register 2nd new admin (to delete)\n", "user_email, user_pw = \"admin3@bigquery.org\", \"bqpw3\"\n", @@ -1239,20 +221,9 @@ }, { "cell_type": "code", - "execution_count": 14, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "" - ] - }, - "execution_count": 14, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "root_client.users.delete(new_user_id2)" ] @@ -1266,51 +237,18 @@ }, { "cell_type": "code", - "execution_count": 15, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "> Stopping SMTPTestServer\n" - ] - } - ], + "outputs": [], "source": [ "smtp_server.stop()" ] }, { "cell_type": "code", - "execution_count": 16, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Stopping bigquery-high\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "INFO: Shutting down\n", - "INFO: Waiting for application shutdown.\n", - "INFO: Application shutdown complete.\n", - "INFO: Finished server process [362383]\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "INFO: Stopping reloader process [362369]\n" - ] - } - ], + "outputs": [], "source": [ "server.land()" ] diff --git a/notebooks/scenarios/bigquery/upgradability/0.9.1_notebooks/001-scale-delete-worker-pools.ipynb b/notebooks/scenarios/bigquery/upgradability/0.9.1_notebooks/001-scale-delete-worker-pools.ipynb index 3fadb438a69..832b08874bc 100644 --- a/notebooks/scenarios/bigquery/upgradability/0.9.1_notebooks/001-scale-delete-worker-pools.ipynb +++ b/notebooks/scenarios/bigquery/upgradability/0.9.1_notebooks/001-scale-delete-worker-pools.ipynb @@ -27,7 +27,11 @@ "\n", "# syft absolute\n", "import syft as sy\n", - "from syft.util.util import find_base_dir_with_tox_ini, get_caller_file_path, is_interpreter_jupyter\n", + "from syft.util.util import (\n", + " find_base_dir_with_tox_ini,\n", + " get_caller_file_path,\n", + " is_interpreter_jupyter,\n", + ")\n", "\n", "\n", "def add_helper_path_to_python_path() -> None:\n", @@ -41,7 +45,9 @@ " current_path = import_path\n", "\n", " base_dir = find_base_dir_with_tox_ini(current_path)\n", - " notebook_helper_path = os.path.join(base_dir, \"notebooks/scenarios/bigquery/upgradability/0.9.1_helpers\")\n", + " notebook_helper_path = os.path.join(\n", + " base_dir, \"notebooks/scenarios/bigquery/upgradability/0.9.1_helpers\"\n", + " )\n", " sys.path.append(notebook_helper_path)\n", "\n", "\n", diff --git a/notebooks/scenarios/bigquery/upgradability/0.9.1_notebooks/010-setup-bigquery-pool.ipynb b/notebooks/scenarios/bigquery/upgradability/0.9.1_notebooks/010-setup-bigquery-pool.ipynb index 756ac8a574b..3ac9330f823 100644 --- a/notebooks/scenarios/bigquery/upgradability/0.9.1_notebooks/010-setup-bigquery-pool.ipynb +++ b/notebooks/scenarios/bigquery/upgradability/0.9.1_notebooks/010-setup-bigquery-pool.ipynb @@ -25,8 +25,11 @@ "\n", "# syft absolute\n", "import syft as sy\n", - "from syft.util.util import find_base_dir_with_tox_ini, get_caller_file_path, is_interpreter_jupyter\n", - "\n", + "from syft.util.util import (\n", + " find_base_dir_with_tox_ini,\n", + " get_caller_file_path,\n", + " is_interpreter_jupyter,\n", + ")\n", "\n", "\n", "def add_helper_path_to_python_path() -> None:\n", @@ -40,9 +43,12 @@ " current_path = import_path\n", "\n", " base_dir = find_base_dir_with_tox_ini(current_path)\n", - " notebook_helper_path = os.path.join(base_dir, \"notebooks/scenarios/bigquery/upgradability/0.9.1_helpers\")\n", + " notebook_helper_path = os.path.join(\n", + " base_dir, \"notebooks/scenarios/bigquery/upgradability/0.9.1_helpers\"\n", + " )\n", " sys.path.append(notebook_helper_path)\n", "\n", + "\n", "add_helper_path_to_python_path()\n", "from syft import test_settings\n", "\n", diff --git a/notebooks/scenarios/bigquery/upgradability/0.9.1_notebooks/011-users-emails-passwords.ipynb b/notebooks/scenarios/bigquery/upgradability/0.9.1_notebooks/011-users-emails-passwords.ipynb index d4e25d192da..fc2b104152d 100644 --- a/notebooks/scenarios/bigquery/upgradability/0.9.1_notebooks/011-users-emails-passwords.ipynb +++ b/notebooks/scenarios/bigquery/upgradability/0.9.1_notebooks/011-users-emails-passwords.ipynb @@ -27,9 +27,14 @@ "import os\n", "\n", "import sys\n", + "\n", "# syft absolute\n", "import syft as sy\n", - "from syft.util.util import find_base_dir_with_tox_ini, get_caller_file_path, is_interpreter_jupyter\n", + "from syft.util.util import (\n", + " find_base_dir_with_tox_ini,\n", + " get_caller_file_path,\n", + " is_interpreter_jupyter,\n", + ")\n", "\n", "\n", "def add_helper_path_to_python_path() -> None:\n", @@ -43,9 +48,12 @@ " current_path = import_path\n", "\n", " base_dir = find_base_dir_with_tox_ini(current_path)\n", - " notebook_helper_path = os.path.join(base_dir, \"notebooks/scenarios/bigquery/upgradability/0.9.1_helpers\")\n", + " notebook_helper_path = os.path.join(\n", + " base_dir, \"notebooks/scenarios/bigquery/upgradability/0.9.1_helpers\"\n", + " )\n", " sys.path.append(notebook_helper_path)\n", "\n", + "\n", "add_helper_path_to_python_path()\n", "# third party\n", "from email_helpers import SENDER\n", @@ -363,7 +371,7 @@ "metadata": {}, "outputs": [], "source": [ - "#This is necessary as it sets the new password value in user.new_password\n", + "# This is necessary as it sets the new password value in user.new_password\n", "passw = reset_password_user.make_new_password()\n", "passw" ] diff --git a/notebooks/scenarios/bigquery/upgradability/0.9.1_notebooks/020-configure-api.ipynb b/notebooks/scenarios/bigquery/upgradability/0.9.1_notebooks/020-configure-api.ipynb index a4cac74fedc..85faea8fbbc 100644 --- a/notebooks/scenarios/bigquery/upgradability/0.9.1_notebooks/020-configure-api.ipynb +++ b/notebooks/scenarios/bigquery/upgradability/0.9.1_notebooks/020-configure-api.ipynb @@ -2,7 +2,7 @@ "cells": [ { "cell_type": "code", - "execution_count": 1, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -14,7 +14,7 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -24,7 +24,7 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -35,7 +35,11 @@ "\n", "# syft absolute\n", "import syft as sy\n", - "from syft.util.util import find_base_dir_with_tox_ini, get_caller_file_path, is_interpreter_jupyter\n", + "from syft.util.util import (\n", + " find_base_dir_with_tox_ini,\n", + " get_caller_file_path,\n", + " is_interpreter_jupyter,\n", + ")\n", "\n", "\n", "def add_helper_path_to_python_path() -> None:\n", @@ -49,12 +53,15 @@ " current_path = import_path\n", "\n", " base_dir = find_base_dir_with_tox_ini(current_path)\n", - " notebook_helper_path = os.path.join(base_dir, \"notebooks/scenarios/bigquery/upgradability/0.9.1_helpers\")\n", + " notebook_helper_path = os.path.join(\n", + " base_dir, \"notebooks/scenarios/bigquery/upgradability/0.9.1_helpers\"\n", + " )\n", " sys.path.append(notebook_helper_path)\n", "\n", "\n", "add_helper_path_to_python_path()\n", "from syft import test_settings\n", + "\n", "# third party\n", "from apis import make_schema\n", "from apis import make_submit_query\n", @@ -62,7 +69,7 @@ "\n", "# run email server\n", "from email_helpers import get_email_server\n", - "# isort: on\n" + "# isort: on" ] }, { diff --git a/notebooks/scenarios/bigquery/upgradability/0.9.1_notebooks/021-create-jobs.ipynb b/notebooks/scenarios/bigquery/upgradability/0.9.1_notebooks/021-create-jobs.ipynb index 35556a11624..323bb616adb 100644 --- a/notebooks/scenarios/bigquery/upgradability/0.9.1_notebooks/021-create-jobs.ipynb +++ b/notebooks/scenarios/bigquery/upgradability/0.9.1_notebooks/021-create-jobs.ipynb @@ -39,9 +39,14 @@ "\n", "import os\n", "import sys\n", + "\n", "# syft absolute\n", "import syft as sy\n", - "from syft.util.util import find_base_dir_with_tox_ini, get_caller_file_path, is_interpreter_jupyter\n", + "from syft.util.util import (\n", + " find_base_dir_with_tox_ini,\n", + " get_caller_file_path,\n", + " is_interpreter_jupyter,\n", + ")\n", "\n", "\n", "def add_helper_path_to_python_path() -> None:\n", @@ -55,7 +60,9 @@ " current_path = import_path\n", "\n", " base_dir = find_base_dir_with_tox_ini(current_path)\n", - " notebook_helper_path = os.path.join(base_dir, \"notebooks/scenarios/bigquery/upgradability/0.9.1_helpers\")\n", + " notebook_helper_path = os.path.join(\n", + " base_dir, \"notebooks/scenarios/bigquery/upgradability/0.9.1_helpers\"\n", + " )\n", " sys.path.append(notebook_helper_path)\n", "\n", "\n", @@ -64,6 +71,7 @@ "\n", "# third party\n", "from email_helpers import get_email_server\n", + "\n", "# isort: on\n", "# third party\n", "from job_helpers import TestJob\n", @@ -156,7 +164,7 @@ { "cell_type": "code", "execution_count": null, - "id": "0f7e1ce3", + "id": "10", "metadata": {}, "outputs": [], "source": [ @@ -166,7 +174,7 @@ { "cell_type": "code", "execution_count": null, - "id": "10", + "id": "11", "metadata": {}, "outputs": [], "source": [ @@ -175,7 +183,7 @@ }, { "cell_type": "markdown", - "id": "11", + "id": "12", "metadata": {}, "source": [ "# Create jobs" @@ -184,14 +192,14 @@ { "cell_type": "code", "execution_count": null, - "id": "12", + "id": "13", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", - "id": "13", + "id": "14", "metadata": {}, "source": [ "# Inspect job data (requests for these jobs to be created)" @@ -200,7 +208,7 @@ { "cell_type": "code", "execution_count": null, - "id": "14", + "id": "15", "metadata": {}, "outputs": [], "source": [ @@ -212,7 +220,7 @@ { "cell_type": "code", "execution_count": null, - "id": "15", + "id": "16", "metadata": {}, "outputs": [], "source": [ @@ -224,7 +232,7 @@ { "cell_type": "code", "execution_count": null, - "id": "16", + "id": "17", "metadata": {}, "outputs": [], "source": [] @@ -232,7 +240,7 @@ { "cell_type": "code", "execution_count": null, - "id": "17", + "id": "18", "metadata": {}, "outputs": [], "source": [ @@ -245,7 +253,7 @@ { "cell_type": "code", "execution_count": null, - "id": "18", + "id": "19", "metadata": {}, "outputs": [], "source": [ @@ -257,7 +265,7 @@ { "cell_type": "code", "execution_count": null, - "id": "19", + "id": "20", "metadata": {}, "outputs": [], "source": [ @@ -266,7 +274,7 @@ }, { "cell_type": "markdown", - "id": "20", + "id": "21", "metadata": {}, "source": [ "# Submit jobs\n" @@ -275,7 +283,7 @@ { "cell_type": "code", "execution_count": null, - "id": "21", + "id": "22", "metadata": {}, "outputs": [], "source": [ @@ -285,7 +293,7 @@ }, { "cell_type": "markdown", - "id": "22", + "id": "23", "metadata": {}, "source": [ "## Test Succesful jobs" @@ -294,7 +302,7 @@ { "cell_type": "code", "execution_count": null, - "id": "23", + "id": "24", "metadata": {}, "outputs": [], "source": [ @@ -304,7 +312,7 @@ { "cell_type": "code", "execution_count": null, - "id": "24", + "id": "25", "metadata": {}, "outputs": [], "source": [ @@ -318,7 +326,7 @@ }, { "cell_type": "markdown", - "id": "25", + "id": "26", "metadata": {}, "source": [ "## Test failures" @@ -327,7 +335,7 @@ { "cell_type": "code", "execution_count": null, - "id": "26", + "id": "27", "metadata": {}, "outputs": [], "source": [ @@ -337,7 +345,7 @@ { "cell_type": "code", "execution_count": null, - "id": "27", + "id": "28", "metadata": {}, "outputs": [], "source": [ @@ -353,7 +361,7 @@ { "cell_type": "code", "execution_count": null, - "id": "28", + "id": "29", "metadata": {}, "outputs": [], "source": [ @@ -366,7 +374,7 @@ { "cell_type": "code", "execution_count": null, - "id": "29", + "id": "30", "metadata": {}, "outputs": [], "source": [ @@ -375,7 +383,7 @@ }, { "cell_type": "markdown", - "id": "30", + "id": "31", "metadata": {}, "source": [ "## Test: cannot execute submitted jobs yet" @@ -384,7 +392,7 @@ { "cell_type": "code", "execution_count": null, - "id": "31", + "id": "32", "metadata": {}, "outputs": [], "source": [ @@ -396,7 +404,7 @@ { "cell_type": "code", "execution_count": null, - "id": "32", + "id": "33", "metadata": {}, "outputs": [], "source": [ @@ -411,7 +419,7 @@ { "cell_type": "code", "execution_count": null, - "id": "33", + "id": "34", "metadata": {}, "outputs": [], "source": [ @@ -425,7 +433,7 @@ }, { "cell_type": "markdown", - "id": "34", + "id": "35", "metadata": {}, "source": [ "# Verify that admin has emails for submitted requests" @@ -434,7 +442,7 @@ { "cell_type": "code", "execution_count": null, - "id": "35", + "id": "36", "metadata": {}, "outputs": [], "source": [ @@ -448,7 +456,7 @@ }, { "cell_type": "markdown", - "id": "36", + "id": "37", "metadata": {}, "source": [ "# Cleanup" @@ -457,7 +465,7 @@ { "cell_type": "code", "execution_count": null, - "id": "37", + "id": "38", "metadata": {}, "outputs": [], "source": [ @@ -467,7 +475,7 @@ { "cell_type": "code", "execution_count": null, - "id": "38", + "id": "39", "metadata": {}, "outputs": [], "source": [ @@ -477,7 +485,7 @@ { "cell_type": "code", "execution_count": null, - "id": "39", + "id": "40", "metadata": {}, "outputs": [], "source": [] diff --git a/notebooks/scenarios/bigquery/upgradability/0.9.1_notebooks/040-do-review-requests.ipynb b/notebooks/scenarios/bigquery/upgradability/0.9.1_notebooks/040-do-review-requests.ipynb index 1263bb83ded..f2636cfa6a4 100644 --- a/notebooks/scenarios/bigquery/upgradability/0.9.1_notebooks/040-do-review-requests.ipynb +++ b/notebooks/scenarios/bigquery/upgradability/0.9.1_notebooks/040-do-review-requests.ipynb @@ -26,8 +26,11 @@ "\n", "# syft absolute\n", "import syft as sy\n", - "from syft.util.util import find_base_dir_with_tox_ini, get_caller_file_path, is_interpreter_jupyter\n", - "\n", + "from syft.util.util import (\n", + " find_base_dir_with_tox_ini,\n", + " get_caller_file_path,\n", + " is_interpreter_jupyter,\n", + ")\n", "\n", "\n", "def add_helper_path_to_python_path() -> None:\n", @@ -41,7 +44,9 @@ " current_path = import_path\n", "\n", " base_dir = find_base_dir_with_tox_ini(current_path)\n", - " notebook_helper_path = os.path.join(base_dir, \"notebooks/scenarios/bigquery/upgradability/0.9.1_helpers\")\n", + " notebook_helper_path = os.path.join(\n", + " base_dir, \"notebooks/scenarios/bigquery/upgradability/0.9.1_helpers\"\n", + " )\n", " sys.path.append(notebook_helper_path)\n", "\n", "\n", diff --git a/notebooks/scenarios/bigquery/upgradability/0.9.1_notebooks/050-ds-get-results.ipynb b/notebooks/scenarios/bigquery/upgradability/0.9.1_notebooks/050-ds-get-results.ipynb index 0e855ca4355..1b4aec43f98 100644 --- a/notebooks/scenarios/bigquery/upgradability/0.9.1_notebooks/050-ds-get-results.ipynb +++ b/notebooks/scenarios/bigquery/upgradability/0.9.1_notebooks/050-ds-get-results.ipynb @@ -21,7 +21,11 @@ "# isort: off\n", "# syft absolute\n", "import syft as sy\n", - "from syft.util.util import find_base_dir_with_tox_ini, get_caller_file_path, is_interpreter_jupyter\n", + "from syft.util.util import (\n", + " find_base_dir_with_tox_ini,\n", + " get_caller_file_path,\n", + " is_interpreter_jupyter,\n", + ")\n", "\n", "import os\n", "import sys\n", @@ -38,7 +42,9 @@ " current_path = import_path\n", "\n", " base_dir = find_base_dir_with_tox_ini(current_path)\n", - " notebook_helper_path = os.path.join(base_dir, \"notebooks/scenarios/bigquery/upgradability/0.9.1_helpers\")\n", + " notebook_helper_path = os.path.join(\n", + " base_dir, \"notebooks/scenarios/bigquery/upgradability/0.9.1_helpers\"\n", + " )\n", " sys.path.append(notebook_helper_path)\n", "\n", "\n", diff --git a/notebooks/scenarios/bigquery/upgradability/0.9.1_notebooks/emails.json b/notebooks/scenarios/bigquery/upgradability/0.9.1_notebooks/emails.json index 6a2956c88e5..076a8851a19 100644 --- a/notebooks/scenarios/bigquery/upgradability/0.9.1_notebooks/emails.json +++ b/notebooks/scenarios/bigquery/upgradability/0.9.1_notebooks/emails.json @@ -1 +1 @@ -{"admin@bigquery.org": [{"email_from": "noreply@openmined.org", "email_to": ["admin@bigquery.org"], "email_content": "Content-Type: multipart/alternative; boundary=\"===============1437349050515117628==\"\r\nMIME-Version: 1.0\r\nFrom: noreply@openmined.org\r\nTo: admin@bigquery.org\r\nSubject: Datasite bigquery-high: A New Request (40c2) has been received!\r\n\r\n--===============1437349050515117628==\r\nContent-Type: text/html; charset=\"us-ascii\"\r\nMIME-Version: 1.0\r\nContent-Transfer-Encoding: 7bit\r\n\r\n\r\n \r\n Access Request Notification\r\n \r\n \r\n \r\n
\r\n
\r\n Request Notification\r\n
\r\n
\r\n

Hello,

\r\n

A new request has been submitted and requires your attention.\r\n Please review the details below:

\r\n\r\n
\r\n
Request Details
\r\n
\r\n\r\n

ID: 40c2f7b149fe43e7b85ac1045d9059e4

\r\n

\r\n Submitted By:\r\n Peggy White\r\n

\r\n

Date: 2024-09-20 08:37:07

\r\n

Status:

\r\n PENDING\r\n
\r\n

Changes:\r\n UserCodeStatusChange\r\n

\r\n\r\n

Use:
\r\n \r\n request = client.api.services.request.get_by_uid(uid=sy.UID(\"40c2f7b149fe43e7b85ac1045d9059e4\"))\r\n
\r\n to get this specific request.\r\n

\r\n\r\n

Or you can view all requests with:
\r\n \r\n client.requests\r\n \r\n

\r\n\r\n
\r\n
\r\n

If you did not expect this request or have concerns about it,\r\n please contact our support team immediately.

\r\n
\r\n
\r\n This is an automated message, please do not reply directly to this email.
\r\n For assistance, please contact our support team.\r\n
\r\n
\r\n \r\n \r\n--===============1437349050515117628==--\r\n"}, {"email_from": "noreply@openmined.org", "email_to": ["admin@bigquery.org"], "email_content": "Content-Type: multipart/alternative; boundary=\"===============9033066230013415358==\"\r\nMIME-Version: 1.0\r\nFrom: noreply@openmined.org\r\nTo: admin@bigquery.org\r\nSubject: Datasite bigquery-high: A New Request (85c9) has been received!\r\n\r\n--===============9033066230013415358==\r\nContent-Type: text/html; charset=\"us-ascii\"\r\nMIME-Version: 1.0\r\nContent-Transfer-Encoding: 7bit\r\n\r\n\r\n \r\n Access Request Notification\r\n \r\n \r\n \r\n
\r\n
\r\n Request Notification\r\n
\r\n
\r\n

Hello,

\r\n

A new request has been submitted and requires your attention.\r\n Please review the details below:

\r\n\r\n
\r\n
Request Details
\r\n
\r\n\r\n

ID: 85c9d7c12a94422caeba2a543c3b6ccb

\r\n

\r\n Submitted By:\r\n Mark Dominguez\r\n

\r\n

Date: 2024-09-20 08:37:17

\r\n

Status:

\r\n PENDING\r\n
\r\n

Changes:\r\n UserCodeStatusChange\r\n

\r\n\r\n

Use:
\r\n \r\n request = client.api.services.request.get_by_uid(uid=sy.UID(\"85c9d7c12a94422caeba2a543c3b6ccb\"))\r\n
\r\n to get this specific request.\r\n

\r\n\r\n

Or you can view all requests with:
\r\n \r\n client.requests\r\n \r\n

\r\n\r\n
\r\n
\r\n

If you did not expect this request or have concerns about it,\r\n please contact our support team immediately.

\r\n
\r\n
\r\n This is an automated message, please do not reply directly to this email.
\r\n For assistance, please contact our support team.\r\n
\r\n
\r\n \r\n \r\n--===============9033066230013415358==--\r\n"}, {"email_from": "noreply@openmined.org", "email_to": ["admin@bigquery.org"], "email_content": "Content-Type: multipart/alternative; boundary=\"===============1346764797696267534==\"\r\nMIME-Version: 1.0\r\nFrom: noreply@openmined.org\r\nTo: admin@bigquery.org\r\nSubject: Datasite bigquery-high: A New Request (5e9b) has been received!\r\n\r\n--===============1346764797696267534==\r\nContent-Type: text/html; charset=\"us-ascii\"\r\nMIME-Version: 1.0\r\nContent-Transfer-Encoding: 7bit\r\n\r\n\r\n \r\n Access Request Notification\r\n \r\n \r\n \r\n
\r\n
\r\n Request Notification\r\n
\r\n
\r\n

Hello,

\r\n

A new request has been submitted and requires your attention.\r\n Please review the details below:

\r\n\r\n
\r\n
Request Details
\r\n
\r\n\r\n

ID: 5e9bb71343ac40bbb31211f885c16209

\r\n

\r\n Submitted By:\r\n Maxwell Soto\r\n

\r\n

Date: 2024-09-20 08:37:26

\r\n

Status:

\r\n PENDING\r\n
\r\n

Changes:\r\n UserCodeStatusChange\r\n

\r\n\r\n

Use:
\r\n \r\n request = client.api.services.request.get_by_uid(uid=sy.UID(\"5e9bb71343ac40bbb31211f885c16209\"))\r\n
\r\n to get this specific request.\r\n

\r\n\r\n

Or you can view all requests with:
\r\n \r\n client.requests\r\n \r\n

\r\n\r\n
\r\n
\r\n

If you did not expect this request or have concerns about it,\r\n please contact our support team immediately.

\r\n
\r\n
\r\n This is an automated message, please do not reply directly to this email.
\r\n For assistance, please contact our support team.\r\n
\r\n
\r\n \r\n \r\n--===============1346764797696267534==--\r\n"}, {"email_from": "noreply@openmined.org", "email_to": ["admin@bigquery.org"], "email_content": "Content-Type: multipart/alternative; boundary=\"===============4587598443381678696==\"\r\nMIME-Version: 1.0\r\nFrom: noreply@openmined.org\r\nTo: admin@bigquery.org\r\nSubject: Datasite bigquery-high: A New Request (57fb) has been received!\r\n\r\n--===============4587598443381678696==\r\nContent-Type: text/html; charset=\"us-ascii\"\r\nMIME-Version: 1.0\r\nContent-Transfer-Encoding: 7bit\r\n\r\n\r\n \r\n Access Request Notification\r\n \r\n \r\n \r\n
\r\n
\r\n Request Notification\r\n
\r\n
\r\n

Hello,

\r\n

A new request has been submitted and requires your attention.\r\n Please review the details below:

\r\n\r\n
\r\n
Request Details
\r\n
\r\n\r\n

ID: 57fb8d2b65044a8a91209ddbee6f1b0d

\r\n

\r\n Submitted By:\r\n Crystal Adams\r\n

\r\n

Date: 2024-09-20 08:37:36

\r\n

Status:

\r\n PENDING\r\n
\r\n

Changes:\r\n UserCodeStatusChange\r\n

\r\n\r\n

Use:
\r\n \r\n request = client.api.services.request.get_by_uid(uid=sy.UID(\"57fb8d2b65044a8a91209ddbee6f1b0d\"))\r\n
\r\n to get this specific request.\r\n

\r\n\r\n

Or you can view all requests with:
\r\n \r\n client.requests\r\n \r\n

\r\n\r\n
\r\n
\r\n

If you did not expect this request or have concerns about it,\r\n please contact our support team immediately.

\r\n
\r\n
\r\n This is an automated message, please do not reply directly to this email.
\r\n For assistance, please contact our support team.\r\n
\r\n
\r\n \r\n \r\n--===============4587598443381678696==--\r\n"}, {"email_from": "noreply@openmined.org", "email_to": ["admin@bigquery.org"], "email_content": "Content-Type: multipart/alternative; boundary=\"===============6115027196608862267==\"\r\nMIME-Version: 1.0\r\nFrom: noreply@openmined.org\r\nTo: admin@bigquery.org\r\nSubject: Datasite bigquery-high: A New Request (a44b) has been received!\r\n\r\n--===============6115027196608862267==\r\nContent-Type: text/html; charset=\"us-ascii\"\r\nMIME-Version: 1.0\r\nContent-Transfer-Encoding: 7bit\r\n\r\n\r\n \r\n Access Request Notification\r\n \r\n \r\n \r\n
\r\n
\r\n Request Notification\r\n
\r\n
\r\n

Hello,

\r\n

A new request has been submitted and requires your attention.\r\n Please review the details below:

\r\n\r\n
\r\n
Request Details
\r\n
\r\n\r\n

ID: a44b3a7a3b184ec58d7ae1eb79bd4719

\r\n

\r\n Submitted By:\r\n Evelyn Wilson\r\n

\r\n

Date: 2024-09-20 08:37:46

\r\n

Status:

\r\n PENDING\r\n
\r\n

Changes:\r\n UserCodeStatusChange\r\n

\r\n\r\n

Use:
\r\n \r\n request = client.api.services.request.get_by_uid(uid=sy.UID(\"a44b3a7a3b184ec58d7ae1eb79bd4719\"))\r\n
\r\n to get this specific request.\r\n

\r\n\r\n

Or you can view all requests with:
\r\n \r\n client.requests\r\n \r\n

\r\n\r\n
\r\n
\r\n

If you did not expect this request or have concerns about it,\r\n please contact our support team immediately.

\r\n
\r\n
\r\n This is an automated message, please do not reply directly to this email.
\r\n For assistance, please contact our support team.\r\n
\r\n
\r\n \r\n \r\n--===============6115027196608862267==--\r\n"}, {"email_from": "noreply@openmined.org", "email_to": ["admin@bigquery.org"], "email_content": "Content-Type: multipart/alternative; boundary=\"===============1343434348682324515==\"\r\nMIME-Version: 1.0\r\nFrom: noreply@openmined.org\r\nTo: admin@bigquery.org\r\nSubject: Datasite bigquery-high: A New Request (f67f) has been received!\r\n\r\n--===============1343434348682324515==\r\nContent-Type: text/html; charset=\"us-ascii\"\r\nMIME-Version: 1.0\r\nContent-Transfer-Encoding: 7bit\r\n\r\n\r\n \r\n Access Request Notification\r\n \r\n \r\n \r\n
\r\n
\r\n Request Notification\r\n
\r\n
\r\n

Hello,

\r\n

A new request has been submitted and requires your attention.\r\n Please review the details below:

\r\n\r\n
\r\n
Request Details
\r\n
\r\n\r\n

ID: f67fa2b87510462da7eedd2c01d7a9af

\r\n

\r\n Submitted By:\r\n Peggy White\r\n

\r\n

Date: 2024-09-20 08:37:55

\r\n

Status:

\r\n PENDING\r\n
\r\n

Changes:\r\n UserCodeStatusChange\r\n

\r\n\r\n

Use:
\r\n \r\n request = client.api.services.request.get_by_uid(uid=sy.UID(\"f67fa2b87510462da7eedd2c01d7a9af\"))\r\n
\r\n to get this specific request.\r\n

\r\n\r\n

Or you can view all requests with:
\r\n \r\n client.requests\r\n \r\n

\r\n\r\n
\r\n
\r\n

If you did not expect this request or have concerns about it,\r\n please contact our support team immediately.

\r\n
\r\n
\r\n This is an automated message, please do not reply directly to this email.
\r\n For assistance, please contact our support team.\r\n
\r\n
\r\n \r\n \r\n--===============1343434348682324515==--\r\n"}, {"email_from": "noreply@openmined.org", "email_to": ["admin@bigquery.org"], "email_content": "Content-Type: multipart/alternative; boundary=\"===============3287505056065109202==\"\r\nMIME-Version: 1.0\r\nFrom: noreply@openmined.org\r\nTo: admin@bigquery.org\r\nSubject: Datasite bigquery-high: A New Request (87e1) has been received!\r\n\r\n--===============3287505056065109202==\r\nContent-Type: text/html; charset=\"us-ascii\"\r\nMIME-Version: 1.0\r\nContent-Transfer-Encoding: 7bit\r\n\r\n\r\n \r\n Access Request Notification\r\n \r\n \r\n \r\n
\r\n
\r\n Request Notification\r\n
\r\n
\r\n

Hello,

\r\n

A new request has been submitted and requires your attention.\r\n Please review the details below:

\r\n\r\n
\r\n
Request Details
\r\n
\r\n\r\n

ID: 87e1f98a3c014f64a231b075694a158b

\r\n

\r\n Submitted By:\r\n Mark Dominguez\r\n

\r\n

Date: 2024-09-20 08:38:05

\r\n

Status:

\r\n PENDING\r\n
\r\n

Changes:\r\n UserCodeStatusChange\r\n

\r\n\r\n

Use:
\r\n \r\n request = client.api.services.request.get_by_uid(uid=sy.UID(\"87e1f98a3c014f64a231b075694a158b\"))\r\n
\r\n to get this specific request.\r\n

\r\n\r\n

Or you can view all requests with:
\r\n \r\n client.requests\r\n \r\n

\r\n\r\n
\r\n
\r\n

If you did not expect this request or have concerns about it,\r\n please contact our support team immediately.

\r\n
\r\n
\r\n This is an automated message, please do not reply directly to this email.
\r\n For assistance, please contact our support team.\r\n
\r\n
\r\n \r\n \r\n--===============3287505056065109202==--\r\n"}, {"email_from": "noreply@openmined.org", "email_to": ["admin@bigquery.org"], "email_content": "Content-Type: multipart/alternative; boundary=\"===============6010573810991308557==\"\r\nMIME-Version: 1.0\r\nFrom: noreply@openmined.org\r\nTo: admin@bigquery.org\r\nSubject: Datasite bigquery-high: A New Request (e2ee) has been received!\r\n\r\n--===============6010573810991308557==\r\nContent-Type: text/html; charset=\"us-ascii\"\r\nMIME-Version: 1.0\r\nContent-Transfer-Encoding: 7bit\r\n\r\n\r\n \r\n Access Request Notification\r\n \r\n \r\n \r\n
\r\n
\r\n Request Notification\r\n
\r\n
\r\n

Hello,

\r\n

A new request has been submitted and requires your attention.\r\n Please review the details below:

\r\n\r\n
\r\n
Request Details
\r\n
\r\n\r\n

ID: e2ee012298104ac8ac589555c2d1d878

\r\n

\r\n Submitted By:\r\n Maxwell Soto\r\n

\r\n

Date: 2024-09-20 08:38:15

\r\n

Status:

\r\n PENDING\r\n
\r\n

Changes:\r\n UserCodeStatusChange\r\n

\r\n\r\n

Use:
\r\n \r\n request = client.api.services.request.get_by_uid(uid=sy.UID(\"e2ee012298104ac8ac589555c2d1d878\"))\r\n
\r\n to get this specific request.\r\n

\r\n\r\n

Or you can view all requests with:
\r\n \r\n client.requests\r\n \r\n

\r\n\r\n
\r\n
\r\n

If you did not expect this request or have concerns about it,\r\n please contact our support team immediately.

\r\n
\r\n
\r\n This is an automated message, please do not reply directly to this email.
\r\n For assistance, please contact our support team.\r\n
\r\n
\r\n \r\n \r\n--===============6010573810991308557==--\r\n"}, {"email_from": "noreply@openmined.org", "email_to": ["admin@bigquery.org"], "email_content": "Content-Type: multipart/alternative; boundary=\"===============5133109870808782914==\"\r\nMIME-Version: 1.0\r\nFrom: noreply@openmined.org\r\nTo: admin@bigquery.org\r\nSubject: Datasite bigquery-high: A New Request (6c48) has been received!\r\n\r\n--===============5133109870808782914==\r\nContent-Type: text/html; charset=\"us-ascii\"\r\nMIME-Version: 1.0\r\nContent-Transfer-Encoding: 7bit\r\n\r\n\r\n \r\n Access Request Notification\r\n \r\n \r\n \r\n
\r\n
\r\n Request Notification\r\n
\r\n
\r\n

Hello,

\r\n

A new request has been submitted and requires your attention.\r\n Please review the details below:

\r\n\r\n
\r\n
Request Details
\r\n
\r\n\r\n

ID: 6c4888f4292b48d6a0cf95ccf677141c

\r\n

\r\n Submitted By:\r\n Crystal Adams\r\n

\r\n

Date: 2024-09-20 08:38:24

\r\n

Status:

\r\n PENDING\r\n
\r\n

Changes:\r\n UserCodeStatusChange\r\n

\r\n\r\n

Use:
\r\n \r\n request = client.api.services.request.get_by_uid(uid=sy.UID(\"6c4888f4292b48d6a0cf95ccf677141c\"))\r\n
\r\n to get this specific request.\r\n

\r\n\r\n

Or you can view all requests with:
\r\n \r\n client.requests\r\n \r\n

\r\n\r\n
\r\n
\r\n

If you did not expect this request or have concerns about it,\r\n please contact our support team immediately.

\r\n
\r\n
\r\n This is an automated message, please do not reply directly to this email.
\r\n For assistance, please contact our support team.\r\n
\r\n
\r\n \r\n \r\n--===============5133109870808782914==--\r\n"}], "mark-dominguez-fake@openmined.org": [{"email_from": "noreply@openmined.org", "email_to": ["mark-dominguez-fake@openmined.org"], "email_content": "Content-Type: multipart/alternative; boundary=\"===============0874085896837516854==\"\r\nMIME-Version: 1.0\r\nFrom: noreply@openmined.org\r\nTo: mark-dominguez-fake@openmined.org\r\nSubject: Datasite bigquery-high: Your request (85c9) has been approved. \r\n\r\n--===============0874085896837516854==\r\nContent-Type: text/html; charset=\"us-ascii\"\r\nMIME-Version: 1.0\r\nContent-Transfer-Encoding: 7bit\r\n\r\n\r\n \r\n Access Request Notification\r\n \r\n \r\n \r\n
\r\n
\r\n Request Notification\r\n
\r\n
\r\n

Hello,

\r\n

The status of your recent request has been updated.\r\n Below is the latest information regarding it:

\r\n\r\n
\r\n
Request Details
\r\n
\r\n\r\n

ID: 85c9d7c12a94422caeba2a543c3b6ccb

\r\n

\r\n Submitted By:\r\n Mark Dominguez mark-dominguez-fake@openmined.org\r\n

\r\n

Date: 2024-09-20 08:37:17

\r\n

Status:

\r\n APPROVED\r\n
\r\n

\r\n Changes:\r\n UserCodeStatusChange\r\n

\r\n\r\n

Use:
\r\n \r\n request = client.api.services.request.get_by_uid(uid=sy.UID(\"85c9d7c12a94422caeba2a543c3b6ccb\"))\r\n
\r\n to get this specific request.\r\n

\r\n\r\n

Or you can view all requests with:
\r\n \r\n client.requests\r\n \r\n

\r\n
\r\n
\r\n

If you did not expect this request or have concerns about it,\r\n please contact our support team immediately.

\r\n
\r\n
\r\n This is an automated message, please do not reply directly to this email.
\r\n For assistance, please contact our support team.\r\n
\r\n
\r\n \r\n \r\n--===============0874085896837516854==--\r\n"}, {"email_from": "noreply@openmined.org", "email_to": ["mark-dominguez-fake@openmined.org"], "email_content": "Content-Type: multipart/alternative; boundary=\"===============8912610805077554961==\"\r\nMIME-Version: 1.0\r\nFrom: noreply@openmined.org\r\nTo: mark-dominguez-fake@openmined.org\r\nSubject: Datasite bigquery-high: Your request (87e1) has been denied. \r\n\r\n--===============8912610805077554961==\r\nContent-Type: text/html; charset=\"us-ascii\"\r\nMIME-Version: 1.0\r\nContent-Transfer-Encoding: 7bit\r\n\r\n\r\n \r\n Access Request Notification\r\n \r\n \r\n \r\n
\r\n
\r\n Request Notification\r\n
\r\n
\r\n

Hello,

\r\n

The status of your recent request has been updated.\r\n Below is the latest information regarding it:

\r\n\r\n
\r\n
Request Details
\r\n
\r\n\r\n

ID: 87e1f98a3c014f64a231b075694a158b

\r\n

\r\n Submitted By:\r\n Mark Dominguez mark-dominguez-fake@openmined.org\r\n

\r\n

Date: 2024-09-20 08:38:05

\r\n

Status:

\r\n REJECTED\r\n
\r\n

\r\n Changes:\r\n UserCodeStatusChange\r\n

\r\n\r\n

Use:
\r\n \r\n request = client.api.services.request.get_by_uid(uid=sy.UID(\"87e1f98a3c014f64a231b075694a158b\"))\r\n
\r\n to get this specific request.\r\n

\r\n\r\n

Or you can view all requests with:
\r\n \r\n client.requests\r\n \r\n

\r\n
\r\n
\r\n

If you did not expect this request or have concerns about it,\r\n please contact our support team immediately.

\r\n
\r\n
\r\n This is an automated message, please do not reply directly to this email.
\r\n For assistance, please contact our support team.\r\n
\r\n
\r\n \r\n \r\n--===============8912610805077554961==--\r\n"}], "maxwell-soto-fake@openmined.org": [{"email_from": "noreply@openmined.org", "email_to": ["maxwell-soto-fake@openmined.org"], "email_content": "Content-Type: multipart/alternative; boundary=\"===============0737207050435537083==\"\r\nMIME-Version: 1.0\r\nFrom: noreply@openmined.org\r\nTo: maxwell-soto-fake@openmined.org\r\nSubject: Datasite bigquery-high: Your request (5e9b) has been approved. \r\n\r\n--===============0737207050435537083==\r\nContent-Type: text/html; charset=\"us-ascii\"\r\nMIME-Version: 1.0\r\nContent-Transfer-Encoding: 7bit\r\n\r\n\r\n \r\n Access Request Notification\r\n \r\n \r\n \r\n
\r\n
\r\n Request Notification\r\n
\r\n
\r\n

Hello,

\r\n

The status of your recent request has been updated.\r\n Below is the latest information regarding it:

\r\n\r\n
\r\n
Request Details
\r\n
\r\n\r\n

ID: 5e9bb71343ac40bbb31211f885c16209

\r\n

\r\n Submitted By:\r\n Maxwell Soto maxwell-soto-fake@openmined.org\r\n

\r\n

Date: 2024-09-20 08:37:26

\r\n

Status:

\r\n APPROVED\r\n
\r\n

\r\n Changes:\r\n UserCodeStatusChange\r\n

\r\n\r\n

Use:
\r\n \r\n request = client.api.services.request.get_by_uid(uid=sy.UID(\"5e9bb71343ac40bbb31211f885c16209\"))\r\n
\r\n to get this specific request.\r\n

\r\n\r\n

Or you can view all requests with:
\r\n \r\n client.requests\r\n \r\n

\r\n
\r\n
\r\n

If you did not expect this request or have concerns about it,\r\n please contact our support team immediately.

\r\n
\r\n
\r\n This is an automated message, please do not reply directly to this email.
\r\n For assistance, please contact our support team.\r\n
\r\n
\r\n \r\n \r\n--===============0737207050435537083==--\r\n"}, {"email_from": "noreply@openmined.org", "email_to": ["maxwell-soto-fake@openmined.org"], "email_content": "Content-Type: multipart/alternative; boundary=\"===============2137841192891787234==\"\r\nMIME-Version: 1.0\r\nFrom: noreply@openmined.org\r\nTo: maxwell-soto-fake@openmined.org\r\nSubject: Datasite bigquery-high: Your request (5e9b) has been approved. \r\n\r\n--===============2137841192891787234==\r\nContent-Type: text/html; charset=\"us-ascii\"\r\nMIME-Version: 1.0\r\nContent-Transfer-Encoding: 7bit\r\n\r\n\r\n \r\n Access Request Notification\r\n \r\n \r\n \r\n
\r\n
\r\n Request Notification\r\n
\r\n
\r\n

Hello,

\r\n

The status of your recent request has been updated.\r\n Below is the latest information regarding it:

\r\n\r\n
\r\n
Request Details
\r\n
\r\n\r\n

ID: 5e9bb71343ac40bbb31211f885c16209

\r\n

\r\n Submitted By:\r\n Maxwell Soto maxwell-soto-fake@openmined.org\r\n

\r\n

Date: 2024-09-20 08:37:26

\r\n

Status:

\r\n APPROVED\r\n
\r\n

\r\n Changes:\r\n UserCodeStatusChange,ActionStoreChange\r\n

\r\n\r\n

Use:
\r\n \r\n request = client.api.services.request.get_by_uid(uid=sy.UID(\"5e9bb71343ac40bbb31211f885c16209\"))\r\n
\r\n to get this specific request.\r\n

\r\n\r\n

Or you can view all requests with:
\r\n \r\n client.requests\r\n \r\n

\r\n
\r\n
\r\n

If you did not expect this request or have concerns about it,\r\n please contact our support team immediately.

\r\n
\r\n
\r\n This is an automated message, please do not reply directly to this email.
\r\n For assistance, please contact our support team.\r\n
\r\n
\r\n \r\n \r\n--===============2137841192891787234==--\r\n"}, {"email_from": "noreply@openmined.org", "email_to": ["maxwell-soto-fake@openmined.org"], "email_content": "Content-Type: multipart/alternative; boundary=\"===============8943585470920819351==\"\r\nMIME-Version: 1.0\r\nFrom: noreply@openmined.org\r\nTo: maxwell-soto-fake@openmined.org\r\nSubject: Datasite bigquery-high: Your request (e2ee) has been denied. \r\n\r\n--===============8943585470920819351==\r\nContent-Type: text/html; charset=\"us-ascii\"\r\nMIME-Version: 1.0\r\nContent-Transfer-Encoding: 7bit\r\n\r\n\r\n \r\n Access Request Notification\r\n \r\n \r\n \r\n
\r\n
\r\n Request Notification\r\n
\r\n
\r\n

Hello,

\r\n

The status of your recent request has been updated.\r\n Below is the latest information regarding it:

\r\n\r\n
\r\n
Request Details
\r\n
\r\n\r\n

ID: e2ee012298104ac8ac589555c2d1d878

\r\n

\r\n Submitted By:\r\n Maxwell Soto maxwell-soto-fake@openmined.org\r\n

\r\n

Date: 2024-09-20 08:38:15

\r\n

Status:

\r\n REJECTED\r\n
\r\n

\r\n Changes:\r\n UserCodeStatusChange\r\n

\r\n\r\n

Use:
\r\n \r\n request = client.api.services.request.get_by_uid(uid=sy.UID(\"e2ee012298104ac8ac589555c2d1d878\"))\r\n
\r\n to get this specific request.\r\n

\r\n\r\n

Or you can view all requests with:
\r\n \r\n client.requests\r\n \r\n

\r\n
\r\n
\r\n

If you did not expect this request or have concerns about it,\r\n please contact our support team immediately.

\r\n
\r\n
\r\n This is an automated message, please do not reply directly to this email.
\r\n For assistance, please contact our support team.\r\n
\r\n
\r\n \r\n \r\n--===============8943585470920819351==--\r\n"}], "crystal-adams-fake@openmined.org": [{"email_from": "noreply@openmined.org", "email_to": ["crystal-adams-fake@openmined.org"], "email_content": "Content-Type: multipart/alternative; boundary=\"===============2737575438189797344==\"\r\nMIME-Version: 1.0\r\nFrom: noreply@openmined.org\r\nTo: crystal-adams-fake@openmined.org\r\nSubject: Datasite bigquery-high: Your request (57fb) has been approved. \r\n\r\n--===============2737575438189797344==\r\nContent-Type: text/html; charset=\"us-ascii\"\r\nMIME-Version: 1.0\r\nContent-Transfer-Encoding: 7bit\r\n\r\n\r\n \r\n Access Request Notification\r\n \r\n \r\n \r\n
\r\n
\r\n Request Notification\r\n
\r\n
\r\n

Hello,

\r\n

The status of your recent request has been updated.\r\n Below is the latest information regarding it:

\r\n\r\n
\r\n
Request Details
\r\n
\r\n\r\n

ID: 57fb8d2b65044a8a91209ddbee6f1b0d

\r\n

\r\n Submitted By:\r\n Crystal Adams crystal-adams-fake@openmined.org\r\n

\r\n

Date: 2024-09-20 08:37:36

\r\n

Status:

\r\n APPROVED\r\n
\r\n

\r\n Changes:\r\n UserCodeStatusChange\r\n

\r\n\r\n

Use:
\r\n \r\n request = client.api.services.request.get_by_uid(uid=sy.UID(\"57fb8d2b65044a8a91209ddbee6f1b0d\"))\r\n
\r\n to get this specific request.\r\n

\r\n\r\n

Or you can view all requests with:
\r\n \r\n client.requests\r\n \r\n

\r\n
\r\n
\r\n

If you did not expect this request or have concerns about it,\r\n please contact our support team immediately.

\r\n
\r\n
\r\n This is an automated message, please do not reply directly to this email.
\r\n For assistance, please contact our support team.\r\n
\r\n
\r\n \r\n \r\n--===============2737575438189797344==--\r\n"}, {"email_from": "noreply@openmined.org", "email_to": ["crystal-adams-fake@openmined.org"], "email_content": "Content-Type: multipart/alternative; boundary=\"===============2048189725991433282==\"\r\nMIME-Version: 1.0\r\nFrom: noreply@openmined.org\r\nTo: crystal-adams-fake@openmined.org\r\nSubject: Datasite bigquery-high: Your request (6c48) has been approved. \r\n\r\n--===============2048189725991433282==\r\nContent-Type: text/html; charset=\"us-ascii\"\r\nMIME-Version: 1.0\r\nContent-Transfer-Encoding: 7bit\r\n\r\n\r\n \r\n Access Request Notification\r\n \r\n \r\n \r\n
\r\n
\r\n Request Notification\r\n
\r\n
\r\n

Hello,

\r\n

The status of your recent request has been updated.\r\n Below is the latest information regarding it:

\r\n\r\n
\r\n
Request Details
\r\n
\r\n\r\n

ID: 6c4888f4292b48d6a0cf95ccf677141c

\r\n

\r\n Submitted By:\r\n Crystal Adams crystal-adams-fake@openmined.org\r\n

\r\n

Date: 2024-09-20 08:38:24

\r\n

Status:

\r\n APPROVED\r\n
\r\n

\r\n Changes:\r\n UserCodeStatusChange\r\n

\r\n\r\n

Use:
\r\n \r\n request = client.api.services.request.get_by_uid(uid=sy.UID(\"6c4888f4292b48d6a0cf95ccf677141c\"))\r\n
\r\n to get this specific request.\r\n

\r\n\r\n

Or you can view all requests with:
\r\n \r\n client.requests\r\n \r\n

\r\n
\r\n
\r\n

If you did not expect this request or have concerns about it,\r\n please contact our support team immediately.

\r\n
\r\n
\r\n This is an automated message, please do not reply directly to this email.
\r\n For assistance, please contact our support team.\r\n
\r\n
\r\n \r\n \r\n--===============2048189725991433282==--\r\n"}, {"email_from": "noreply@openmined.org", "email_to": ["crystal-adams-fake@openmined.org"], "email_content": "Content-Type: multipart/alternative; boundary=\"===============2829723894016643685==\"\r\nMIME-Version: 1.0\r\nFrom: noreply@openmined.org\r\nTo: crystal-adams-fake@openmined.org\r\nSubject: Datasite bigquery-high: Your request (6c48) has been approved. \r\n\r\n--===============2829723894016643685==\r\nContent-Type: text/html; charset=\"us-ascii\"\r\nMIME-Version: 1.0\r\nContent-Transfer-Encoding: 7bit\r\n\r\n\r\n \r\n Access Request Notification\r\n \r\n \r\n \r\n
\r\n
\r\n Request Notification\r\n
\r\n
\r\n

Hello,

\r\n

The status of your recent request has been updated.\r\n Below is the latest information regarding it:

\r\n\r\n
\r\n
Request Details
\r\n
\r\n\r\n

ID: 6c4888f4292b48d6a0cf95ccf677141c

\r\n

\r\n Submitted By:\r\n Crystal Adams crystal-adams-fake@openmined.org\r\n

\r\n

Date: 2024-09-20 08:38:24

\r\n

Status:

\r\n APPROVED\r\n
\r\n

\r\n Changes:\r\n UserCodeStatusChange,ActionStoreChange\r\n

\r\n\r\n

Use:
\r\n \r\n request = client.api.services.request.get_by_uid(uid=sy.UID(\"6c4888f4292b48d6a0cf95ccf677141c\"))\r\n
\r\n to get this specific request.\r\n

\r\n\r\n

Or you can view all requests with:
\r\n \r\n client.requests\r\n \r\n

\r\n
\r\n
\r\n

If you did not expect this request or have concerns about it,\r\n please contact our support team immediately.

\r\n
\r\n
\r\n This is an automated message, please do not reply directly to this email.
\r\n For assistance, please contact our support team.\r\n
\r\n
\r\n \r\n \r\n--===============2829723894016643685==--\r\n"}], "evelyn-wilson-fake@openmined.org": [{"email_from": "noreply@openmined.org", "email_to": ["evelyn-wilson-fake@openmined.org"], "email_content": "Content-Type: multipart/alternative; boundary=\"===============2693564830936871874==\"\r\nMIME-Version: 1.0\r\nFrom: noreply@openmined.org\r\nTo: evelyn-wilson-fake@openmined.org\r\nSubject: Datasite bigquery-high: Your request (a44b) has been approved. \r\n\r\n--===============2693564830936871874==\r\nContent-Type: text/html; charset=\"us-ascii\"\r\nMIME-Version: 1.0\r\nContent-Transfer-Encoding: 7bit\r\n\r\n\r\n \r\n Access Request Notification\r\n \r\n \r\n \r\n
\r\n
\r\n Request Notification\r\n
\r\n
\r\n

Hello,

\r\n

The status of your recent request has been updated.\r\n Below is the latest information regarding it:

\r\n\r\n
\r\n
Request Details
\r\n
\r\n\r\n

ID: a44b3a7a3b184ec58d7ae1eb79bd4719

\r\n

\r\n Submitted By:\r\n Evelyn Wilson evelyn-wilson-fake@openmined.org\r\n

\r\n

Date: 2024-09-20 08:37:46

\r\n

Status:

\r\n APPROVED\r\n
\r\n

\r\n Changes:\r\n UserCodeStatusChange\r\n

\r\n\r\n

Use:
\r\n \r\n request = client.api.services.request.get_by_uid(uid=sy.UID(\"a44b3a7a3b184ec58d7ae1eb79bd4719\"))\r\n
\r\n to get this specific request.\r\n

\r\n\r\n

Or you can view all requests with:
\r\n \r\n client.requests\r\n \r\n

\r\n
\r\n
\r\n

If you did not expect this request or have concerns about it,\r\n please contact our support team immediately.

\r\n
\r\n
\r\n This is an automated message, please do not reply directly to this email.
\r\n For assistance, please contact our support team.\r\n
\r\n
\r\n \r\n \r\n--===============2693564830936871874==--\r\n"}]} \ No newline at end of file +{"admin@bigquery.org": [{"email_from": "noreply@openmined.org", "email_to": ["admin@bigquery.org"], "email_content": "Content-Type: multipart/alternative; boundary=\"===============2897981303933629670==\"\r\nMIME-Version: 1.0\r\nFrom: noreply@openmined.org\r\nTo: admin@bigquery.org\r\nSubject: Datasite bigquery-high: A New Request (4c74) has been received!\r\n\r\n--===============2897981303933629670==\r\nContent-Type: text/html; charset=\"us-ascii\"\r\nMIME-Version: 1.0\r\nContent-Transfer-Encoding: 7bit\r\n\r\n\r\n \r\n Access Request Notification\r\n \r\n \r\n \r\n
\r\n
\r\n Request Notification\r\n
\r\n
\r\n

Hello,

\r\n

A new request has been submitted and requires your attention.\r\n Please review the details below:

\r\n\r\n
\r\n
Request Details
\r\n
\r\n\r\n

ID: 4c742cb18cb54e1ea9f33fae70612052

\r\n

\r\n Submitted By:\r\n Michelle Smith\r\n

\r\n

Date: 2024-09-20 15:33:58

\r\n

Status:

\r\n PENDING\r\n
\r\n

Changes:\r\n UserCodeStatusChange\r\n

\r\n\r\n

Use:
\r\n \r\n request = client.api.services.request.get_by_uid(uid=sy.UID(\"4c742cb18cb54e1ea9f33fae70612052\"))\r\n
\r\n to get this specific request.\r\n

\r\n\r\n

Or you can view all requests with:
\r\n \r\n client.requests\r\n \r\n

\r\n\r\n
\r\n
\r\n

If you did not expect this request or have concerns about it,\r\n please contact our support team immediately.

\r\n
\r\n
\r\n This is an automated message, please do not reply directly to this email.
\r\n For assistance, please contact our support team.\r\n
\r\n
\r\n \r\n \r\n--===============2897981303933629670==--\r\n"}, {"email_from": "noreply@openmined.org", "email_to": ["admin@bigquery.org"], "email_content": "Content-Type: multipart/alternative; boundary=\"===============8234444820410941303==\"\r\nMIME-Version: 1.0\r\nFrom: noreply@openmined.org\r\nTo: admin@bigquery.org\r\nSubject: Datasite bigquery-high: A New Request (6f62) has been received!\r\n\r\n--===============8234444820410941303==\r\nContent-Type: text/html; charset=\"us-ascii\"\r\nMIME-Version: 1.0\r\nContent-Transfer-Encoding: 7bit\r\n\r\n\r\n \r\n Access Request Notification\r\n \r\n \r\n \r\n
\r\n
\r\n Request Notification\r\n
\r\n
\r\n

Hello,

\r\n

A new request has been submitted and requires your attention.\r\n Please review the details below:

\r\n\r\n
\r\n
Request Details
\r\n
\r\n\r\n

ID: 6f62938282724236bf12f9f5998892c2

\r\n

\r\n Submitted By:\r\n James Hardin\r\n

\r\n

Date: 2024-09-20 15:34:08

\r\n

Status:

\r\n PENDING\r\n
\r\n

Changes:\r\n UserCodeStatusChange\r\n

\r\n\r\n

Use:
\r\n \r\n request = client.api.services.request.get_by_uid(uid=sy.UID(\"6f62938282724236bf12f9f5998892c2\"))\r\n
\r\n to get this specific request.\r\n

\r\n\r\n

Or you can view all requests with:
\r\n \r\n client.requests\r\n \r\n

\r\n\r\n
\r\n
\r\n

If you did not expect this request or have concerns about it,\r\n please contact our support team immediately.

\r\n
\r\n
\r\n This is an automated message, please do not reply directly to this email.
\r\n For assistance, please contact our support team.\r\n
\r\n
\r\n \r\n \r\n--===============8234444820410941303==--\r\n"}, {"email_from": "noreply@openmined.org", "email_to": ["admin@bigquery.org"], "email_content": "Content-Type: multipart/alternative; boundary=\"===============8889498753876106590==\"\r\nMIME-Version: 1.0\r\nFrom: noreply@openmined.org\r\nTo: admin@bigquery.org\r\nSubject: Datasite bigquery-high: A New Request (1325) has been received!\r\n\r\n--===============8889498753876106590==\r\nContent-Type: text/html; charset=\"us-ascii\"\r\nMIME-Version: 1.0\r\nContent-Transfer-Encoding: 7bit\r\n\r\n\r\n \r\n Access Request Notification\r\n \r\n \r\n \r\n
\r\n
\r\n Request Notification\r\n
\r\n
\r\n

Hello,

\r\n

A new request has been submitted and requires your attention.\r\n Please review the details below:

\r\n\r\n
\r\n
Request Details
\r\n
\r\n\r\n

ID: 13254f15bcf54317a7f45cb3b0ce1bd2

\r\n

\r\n Submitted By:\r\n Kirsten Jordan\r\n

\r\n

Date: 2024-09-20 15:34:17

\r\n

Status:

\r\n PENDING\r\n
\r\n

Changes:\r\n UserCodeStatusChange\r\n

\r\n\r\n

Use:
\r\n \r\n request = client.api.services.request.get_by_uid(uid=sy.UID(\"13254f15bcf54317a7f45cb3b0ce1bd2\"))\r\n
\r\n to get this specific request.\r\n

\r\n\r\n

Or you can view all requests with:
\r\n \r\n client.requests\r\n \r\n

\r\n\r\n
\r\n
\r\n

If you did not expect this request or have concerns about it,\r\n please contact our support team immediately.

\r\n
\r\n
\r\n This is an automated message, please do not reply directly to this email.
\r\n For assistance, please contact our support team.\r\n
\r\n
\r\n \r\n \r\n--===============8889498753876106590==--\r\n"}, {"email_from": "noreply@openmined.org", "email_to": ["admin@bigquery.org"], "email_content": "Content-Type: multipart/alternative; boundary=\"===============0814139577128064027==\"\r\nMIME-Version: 1.0\r\nFrom: noreply@openmined.org\r\nTo: admin@bigquery.org\r\nSubject: Datasite bigquery-high: A New Request (d91a) has been received!\r\n\r\n--===============0814139577128064027==\r\nContent-Type: text/html; charset=\"us-ascii\"\r\nMIME-Version: 1.0\r\nContent-Transfer-Encoding: 7bit\r\n\r\n\r\n \r\n Access Request Notification\r\n \r\n \r\n \r\n
\r\n
\r\n Request Notification\r\n
\r\n
\r\n

Hello,

\r\n

A new request has been submitted and requires your attention.\r\n Please review the details below:

\r\n\r\n
\r\n
Request Details
\r\n
\r\n\r\n

ID: d91ac738b6954dfebfde3a36629bfed0

\r\n

\r\n Submitted By:\r\n Lisa Horton\r\n

\r\n

Date: 2024-09-20 15:34:27

\r\n

Status:

\r\n PENDING\r\n
\r\n

Changes:\r\n UserCodeStatusChange\r\n

\r\n\r\n

Use:
\r\n \r\n request = client.api.services.request.get_by_uid(uid=sy.UID(\"d91ac738b6954dfebfde3a36629bfed0\"))\r\n
\r\n to get this specific request.\r\n

\r\n\r\n

Or you can view all requests with:
\r\n \r\n client.requests\r\n \r\n

\r\n\r\n
\r\n
\r\n

If you did not expect this request or have concerns about it,\r\n please contact our support team immediately.

\r\n
\r\n
\r\n This is an automated message, please do not reply directly to this email.
\r\n For assistance, please contact our support team.\r\n
\r\n
\r\n \r\n \r\n--===============0814139577128064027==--\r\n"}, {"email_from": "noreply@openmined.org", "email_to": ["admin@bigquery.org"], "email_content": "Content-Type: multipart/alternative; boundary=\"===============0968885670573095905==\"\r\nMIME-Version: 1.0\r\nFrom: noreply@openmined.org\r\nTo: admin@bigquery.org\r\nSubject: Datasite bigquery-high: A New Request (ae8f) has been received!\r\n\r\n--===============0968885670573095905==\r\nContent-Type: text/html; charset=\"us-ascii\"\r\nMIME-Version: 1.0\r\nContent-Transfer-Encoding: 7bit\r\n\r\n\r\n \r\n Access Request Notification\r\n \r\n \r\n \r\n
\r\n
\r\n Request Notification\r\n
\r\n
\r\n

Hello,

\r\n

A new request has been submitted and requires your attention.\r\n Please review the details below:

\r\n\r\n
\r\n
Request Details
\r\n
\r\n\r\n

ID: ae8f1ac719d541719af0d55aaec09753

\r\n

\r\n Submitted By:\r\n Bethany Salazar\r\n

\r\n

Date: 2024-09-20 15:34:37

\r\n

Status:

\r\n PENDING\r\n
\r\n

Changes:\r\n UserCodeStatusChange\r\n

\r\n\r\n

Use:
\r\n \r\n request = client.api.services.request.get_by_uid(uid=sy.UID(\"ae8f1ac719d541719af0d55aaec09753\"))\r\n
\r\n to get this specific request.\r\n

\r\n\r\n

Or you can view all requests with:
\r\n \r\n client.requests\r\n \r\n

\r\n\r\n
\r\n
\r\n

If you did not expect this request or have concerns about it,\r\n please contact our support team immediately.

\r\n
\r\n
\r\n This is an automated message, please do not reply directly to this email.
\r\n For assistance, please contact our support team.\r\n
\r\n
\r\n \r\n \r\n--===============0968885670573095905==--\r\n"}, {"email_from": "noreply@openmined.org", "email_to": ["admin@bigquery.org"], "email_content": "Content-Type: multipart/alternative; boundary=\"===============1351720497827175795==\"\r\nMIME-Version: 1.0\r\nFrom: noreply@openmined.org\r\nTo: admin@bigquery.org\r\nSubject: Datasite bigquery-high: A New Request (b590) has been received!\r\n\r\n--===============1351720497827175795==\r\nContent-Type: text/html; charset=\"us-ascii\"\r\nMIME-Version: 1.0\r\nContent-Transfer-Encoding: 7bit\r\n\r\n\r\n \r\n Access Request Notification\r\n \r\n \r\n \r\n
\r\n
\r\n Request Notification\r\n
\r\n
\r\n

Hello,

\r\n

A new request has been submitted and requires your attention.\r\n Please review the details below:

\r\n\r\n
\r\n
Request Details
\r\n
\r\n\r\n

ID: b590f502c7c94fc1bf0eea7f4a9725ef

\r\n

\r\n Submitted By:\r\n Michelle Smith\r\n

\r\n

Date: 2024-09-20 15:34:47

\r\n

Status:

\r\n PENDING\r\n
\r\n

Changes:\r\n UserCodeStatusChange\r\n

\r\n\r\n

Use:
\r\n \r\n request = client.api.services.request.get_by_uid(uid=sy.UID(\"b590f502c7c94fc1bf0eea7f4a9725ef\"))\r\n
\r\n to get this specific request.\r\n

\r\n\r\n

Or you can view all requests with:
\r\n \r\n client.requests\r\n \r\n

\r\n\r\n
\r\n
\r\n

If you did not expect this request or have concerns about it,\r\n please contact our support team immediately.

\r\n
\r\n
\r\n This is an automated message, please do not reply directly to this email.
\r\n For assistance, please contact our support team.\r\n
\r\n
\r\n \r\n \r\n--===============1351720497827175795==--\r\n"}, {"email_from": "noreply@openmined.org", "email_to": ["admin@bigquery.org"], "email_content": "Content-Type: multipart/alternative; boundary=\"===============9115313114542567663==\"\r\nMIME-Version: 1.0\r\nFrom: noreply@openmined.org\r\nTo: admin@bigquery.org\r\nSubject: Datasite bigquery-high: A New Request (dbed) has been received!\r\n\r\n--===============9115313114542567663==\r\nContent-Type: text/html; charset=\"us-ascii\"\r\nMIME-Version: 1.0\r\nContent-Transfer-Encoding: 7bit\r\n\r\n\r\n \r\n Access Request Notification\r\n \r\n \r\n \r\n
\r\n
\r\n Request Notification\r\n
\r\n
\r\n

Hello,

\r\n

A new request has been submitted and requires your attention.\r\n Please review the details below:

\r\n\r\n
\r\n
Request Details
\r\n
\r\n\r\n

ID: dbed86c80a524044ab9b40f8b1b9d0d6

\r\n

\r\n Submitted By:\r\n James Hardin\r\n

\r\n

Date: 2024-09-20 15:34:56

\r\n

Status:

\r\n PENDING\r\n
\r\n

Changes:\r\n UserCodeStatusChange\r\n

\r\n\r\n

Use:
\r\n \r\n request = client.api.services.request.get_by_uid(uid=sy.UID(\"dbed86c80a524044ab9b40f8b1b9d0d6\"))\r\n
\r\n to get this specific request.\r\n

\r\n\r\n

Or you can view all requests with:
\r\n \r\n client.requests\r\n \r\n

\r\n\r\n
\r\n
\r\n

If you did not expect this request or have concerns about it,\r\n please contact our support team immediately.

\r\n
\r\n
\r\n This is an automated message, please do not reply directly to this email.
\r\n For assistance, please contact our support team.\r\n
\r\n
\r\n \r\n \r\n--===============9115313114542567663==--\r\n"}, {"email_from": "noreply@openmined.org", "email_to": ["admin@bigquery.org"], "email_content": "Content-Type: multipart/alternative; boundary=\"===============4585067225846437681==\"\r\nMIME-Version: 1.0\r\nFrom: noreply@openmined.org\r\nTo: admin@bigquery.org\r\nSubject: Datasite bigquery-high: A New Request (43c8) has been received!\r\n\r\n--===============4585067225846437681==\r\nContent-Type: text/html; charset=\"us-ascii\"\r\nMIME-Version: 1.0\r\nContent-Transfer-Encoding: 7bit\r\n\r\n\r\n \r\n Access Request Notification\r\n \r\n \r\n \r\n
\r\n
\r\n Request Notification\r\n
\r\n
\r\n

Hello,

\r\n

A new request has been submitted and requires your attention.\r\n Please review the details below:

\r\n\r\n
\r\n
Request Details
\r\n
\r\n\r\n

ID: 43c8d0e85b10412380d104e899a17e83

\r\n

\r\n Submitted By:\r\n Kirsten Jordan\r\n

\r\n

Date: 2024-09-20 15:35:06

\r\n

Status:

\r\n PENDING\r\n
\r\n

Changes:\r\n UserCodeStatusChange\r\n

\r\n\r\n

Use:
\r\n \r\n request = client.api.services.request.get_by_uid(uid=sy.UID(\"43c8d0e85b10412380d104e899a17e83\"))\r\n
\r\n to get this specific request.\r\n

\r\n\r\n

Or you can view all requests with:
\r\n \r\n client.requests\r\n \r\n

\r\n\r\n
\r\n
\r\n

If you did not expect this request or have concerns about it,\r\n please contact our support team immediately.

\r\n
\r\n
\r\n This is an automated message, please do not reply directly to this email.
\r\n For assistance, please contact our support team.\r\n
\r\n
\r\n \r\n \r\n--===============4585067225846437681==--\r\n"}, {"email_from": "noreply@openmined.org", "email_to": ["admin@bigquery.org"], "email_content": "Content-Type: multipart/alternative; boundary=\"===============3778287079789045265==\"\r\nMIME-Version: 1.0\r\nFrom: noreply@openmined.org\r\nTo: admin@bigquery.org\r\nSubject: Datasite bigquery-high: A New Request (47e3) has been received!\r\n\r\n--===============3778287079789045265==\r\nContent-Type: text/html; charset=\"us-ascii\"\r\nMIME-Version: 1.0\r\nContent-Transfer-Encoding: 7bit\r\n\r\n\r\n \r\n Access Request Notification\r\n \r\n \r\n \r\n
\r\n
\r\n Request Notification\r\n
\r\n
\r\n

Hello,

\r\n

A new request has been submitted and requires your attention.\r\n Please review the details below:

\r\n\r\n
\r\n
Request Details
\r\n
\r\n\r\n

ID: 47e37c4469e7494d8beae0e7b9c357e4

\r\n

\r\n Submitted By:\r\n Lisa Horton\r\n

\r\n

Date: 2024-09-20 15:35:16

\r\n

Status:

\r\n PENDING\r\n
\r\n

Changes:\r\n UserCodeStatusChange\r\n

\r\n\r\n

Use:
\r\n \r\n request = client.api.services.request.get_by_uid(uid=sy.UID(\"47e37c4469e7494d8beae0e7b9c357e4\"))\r\n
\r\n to get this specific request.\r\n

\r\n\r\n

Or you can view all requests with:
\r\n \r\n client.requests\r\n \r\n

\r\n\r\n
\r\n
\r\n

If you did not expect this request or have concerns about it,\r\n please contact our support team immediately.

\r\n
\r\n
\r\n This is an automated message, please do not reply directly to this email.
\r\n For assistance, please contact our support team.\r\n
\r\n
\r\n \r\n \r\n--===============3778287079789045265==--\r\n"}], "james-hardin-fake@openmined.org": [{"email_from": "noreply@openmined.org", "email_to": ["james-hardin-fake@openmined.org"], "email_content": "Content-Type: multipart/alternative; boundary=\"===============4817706016290243410==\"\r\nMIME-Version: 1.0\r\nFrom: noreply@openmined.org\r\nTo: james-hardin-fake@openmined.org\r\nSubject: Datasite bigquery-high: Your request (6f62) has been approved. \r\n\r\n--===============4817706016290243410==\r\nContent-Type: text/html; charset=\"us-ascii\"\r\nMIME-Version: 1.0\r\nContent-Transfer-Encoding: 7bit\r\n\r\n\r\n \r\n Access Request Notification\r\n \r\n \r\n \r\n
\r\n
\r\n Request Notification\r\n
\r\n
\r\n

Hello,

\r\n

The status of your recent request has been updated.\r\n Below is the latest information regarding it:

\r\n\r\n
\r\n
Request Details
\r\n
\r\n\r\n

ID: 6f62938282724236bf12f9f5998892c2

\r\n

\r\n Submitted By:\r\n James Hardin james-hardin-fake@openmined.org\r\n

\r\n

Date: 2024-09-20 15:34:08

\r\n

Status:

\r\n APPROVED\r\n
\r\n

\r\n Changes:\r\n UserCodeStatusChange\r\n

\r\n\r\n

Use:
\r\n \r\n request = client.api.services.request.get_by_uid(uid=sy.UID(\"6f62938282724236bf12f9f5998892c2\"))\r\n
\r\n to get this specific request.\r\n

\r\n\r\n

Or you can view all requests with:
\r\n \r\n client.requests\r\n \r\n

\r\n
\r\n
\r\n

If you did not expect this request or have concerns about it,\r\n please contact our support team immediately.

\r\n
\r\n
\r\n This is an automated message, please do not reply directly to this email.
\r\n For assistance, please contact our support team.\r\n
\r\n
\r\n \r\n \r\n--===============4817706016290243410==--\r\n"}, {"email_from": "noreply@openmined.org", "email_to": ["james-hardin-fake@openmined.org"], "email_content": "Content-Type: multipart/alternative; boundary=\"===============4352839069066191452==\"\r\nMIME-Version: 1.0\r\nFrom: noreply@openmined.org\r\nTo: james-hardin-fake@openmined.org\r\nSubject: Datasite bigquery-high: Your request (dbed) has been denied. \r\n\r\n--===============4352839069066191452==\r\nContent-Type: text/html; charset=\"us-ascii\"\r\nMIME-Version: 1.0\r\nContent-Transfer-Encoding: 7bit\r\n\r\n\r\n \r\n Access Request Notification\r\n \r\n \r\n \r\n
\r\n
\r\n Request Notification\r\n
\r\n
\r\n

Hello,

\r\n

The status of your recent request has been updated.\r\n Below is the latest information regarding it:

\r\n\r\n
\r\n
Request Details
\r\n
\r\n\r\n

ID: dbed86c80a524044ab9b40f8b1b9d0d6

\r\n

\r\n Submitted By:\r\n James Hardin james-hardin-fake@openmined.org\r\n

\r\n

Date: 2024-09-20 15:34:56

\r\n

Status:

\r\n REJECTED\r\n
\r\n

\r\n Changes:\r\n UserCodeStatusChange\r\n

\r\n\r\n

Use:
\r\n \r\n request = client.api.services.request.get_by_uid(uid=sy.UID(\"dbed86c80a524044ab9b40f8b1b9d0d6\"))\r\n
\r\n to get this specific request.\r\n

\r\n\r\n

Or you can view all requests with:
\r\n \r\n client.requests\r\n \r\n

\r\n
\r\n
\r\n

If you did not expect this request or have concerns about it,\r\n please contact our support team immediately.

\r\n
\r\n
\r\n This is an automated message, please do not reply directly to this email.
\r\n For assistance, please contact our support team.\r\n
\r\n
\r\n \r\n \r\n--===============4352839069066191452==--\r\n"}], "kirsten-jordan-fake@openmined.org": [{"email_from": "noreply@openmined.org", "email_to": ["kirsten-jordan-fake@openmined.org"], "email_content": "Content-Type: multipart/alternative; boundary=\"===============8911884848016766745==\"\r\nMIME-Version: 1.0\r\nFrom: noreply@openmined.org\r\nTo: kirsten-jordan-fake@openmined.org\r\nSubject: Datasite bigquery-high: Your request (1325) has been approved. \r\n\r\n--===============8911884848016766745==\r\nContent-Type: text/html; charset=\"us-ascii\"\r\nMIME-Version: 1.0\r\nContent-Transfer-Encoding: 7bit\r\n\r\n\r\n \r\n Access Request Notification\r\n \r\n \r\n \r\n
\r\n
\r\n Request Notification\r\n
\r\n
\r\n

Hello,

\r\n

The status of your recent request has been updated.\r\n Below is the latest information regarding it:

\r\n\r\n
\r\n
Request Details
\r\n
\r\n\r\n

ID: 13254f15bcf54317a7f45cb3b0ce1bd2

\r\n

\r\n Submitted By:\r\n Kirsten Jordan kirsten-jordan-fake@openmined.org\r\n

\r\n

Date: 2024-09-20 15:34:17

\r\n

Status:

\r\n APPROVED\r\n
\r\n

\r\n Changes:\r\n UserCodeStatusChange\r\n

\r\n\r\n

Use:
\r\n \r\n request = client.api.services.request.get_by_uid(uid=sy.UID(\"13254f15bcf54317a7f45cb3b0ce1bd2\"))\r\n
\r\n to get this specific request.\r\n

\r\n\r\n

Or you can view all requests with:
\r\n \r\n client.requests\r\n \r\n

\r\n
\r\n
\r\n

If you did not expect this request or have concerns about it,\r\n please contact our support team immediately.

\r\n
\r\n
\r\n This is an automated message, please do not reply directly to this email.
\r\n For assistance, please contact our support team.\r\n
\r\n
\r\n \r\n \r\n--===============8911884848016766745==--\r\n"}, {"email_from": "noreply@openmined.org", "email_to": ["kirsten-jordan-fake@openmined.org"], "email_content": "Content-Type: multipart/alternative; boundary=\"===============8793043834092402494==\"\r\nMIME-Version: 1.0\r\nFrom: noreply@openmined.org\r\nTo: kirsten-jordan-fake@openmined.org\r\nSubject: Datasite bigquery-high: Your request (1325) has been approved. \r\n\r\n--===============8793043834092402494==\r\nContent-Type: text/html; charset=\"us-ascii\"\r\nMIME-Version: 1.0\r\nContent-Transfer-Encoding: 7bit\r\n\r\n\r\n \r\n Access Request Notification\r\n \r\n \r\n \r\n
\r\n
\r\n Request Notification\r\n
\r\n
\r\n

Hello,

\r\n

The status of your recent request has been updated.\r\n Below is the latest information regarding it:

\r\n\r\n
\r\n
Request Details
\r\n
\r\n\r\n

ID: 13254f15bcf54317a7f45cb3b0ce1bd2

\r\n

\r\n Submitted By:\r\n Kirsten Jordan kirsten-jordan-fake@openmined.org\r\n

\r\n

Date: 2024-09-20 15:34:17

\r\n

Status:

\r\n APPROVED\r\n
\r\n

\r\n Changes:\r\n UserCodeStatusChange,ActionStoreChange\r\n

\r\n\r\n

Use:
\r\n \r\n request = client.api.services.request.get_by_uid(uid=sy.UID(\"13254f15bcf54317a7f45cb3b0ce1bd2\"))\r\n
\r\n to get this specific request.\r\n

\r\n\r\n

Or you can view all requests with:
\r\n \r\n client.requests\r\n \r\n

\r\n
\r\n
\r\n

If you did not expect this request or have concerns about it,\r\n please contact our support team immediately.

\r\n
\r\n
\r\n This is an automated message, please do not reply directly to this email.
\r\n For assistance, please contact our support team.\r\n
\r\n
\r\n \r\n \r\n--===============8793043834092402494==--\r\n"}, {"email_from": "noreply@openmined.org", "email_to": ["kirsten-jordan-fake@openmined.org"], "email_content": "Content-Type: multipart/alternative; boundary=\"===============7229152125479613071==\"\r\nMIME-Version: 1.0\r\nFrom: noreply@openmined.org\r\nTo: kirsten-jordan-fake@openmined.org\r\nSubject: Datasite bigquery-high: Your request (43c8) has been denied. \r\n\r\n--===============7229152125479613071==\r\nContent-Type: text/html; charset=\"us-ascii\"\r\nMIME-Version: 1.0\r\nContent-Transfer-Encoding: 7bit\r\n\r\n\r\n \r\n Access Request Notification\r\n \r\n \r\n \r\n
\r\n
\r\n Request Notification\r\n
\r\n
\r\n

Hello,

\r\n

The status of your recent request has been updated.\r\n Below is the latest information regarding it:

\r\n\r\n
\r\n
Request Details
\r\n
\r\n\r\n

ID: 43c8d0e85b10412380d104e899a17e83

\r\n

\r\n Submitted By:\r\n Kirsten Jordan kirsten-jordan-fake@openmined.org\r\n

\r\n

Date: 2024-09-20 15:35:06

\r\n

Status:

\r\n REJECTED\r\n
\r\n

\r\n Changes:\r\n UserCodeStatusChange\r\n

\r\n\r\n

Use:
\r\n \r\n request = client.api.services.request.get_by_uid(uid=sy.UID(\"43c8d0e85b10412380d104e899a17e83\"))\r\n
\r\n to get this specific request.\r\n

\r\n\r\n

Or you can view all requests with:
\r\n \r\n client.requests\r\n \r\n

\r\n
\r\n
\r\n

If you did not expect this request or have concerns about it,\r\n please contact our support team immediately.

\r\n
\r\n
\r\n This is an automated message, please do not reply directly to this email.
\r\n For assistance, please contact our support team.\r\n
\r\n
\r\n \r\n \r\n--===============7229152125479613071==--\r\n"}], "lisa-horton-fake@openmined.org": [{"email_from": "noreply@openmined.org", "email_to": ["lisa-horton-fake@openmined.org"], "email_content": "Content-Type: multipart/alternative; boundary=\"===============5796074451455367110==\"\r\nMIME-Version: 1.0\r\nFrom: noreply@openmined.org\r\nTo: lisa-horton-fake@openmined.org\r\nSubject: Datasite bigquery-high: Your request (d91a) has been approved. \r\n\r\n--===============5796074451455367110==\r\nContent-Type: text/html; charset=\"us-ascii\"\r\nMIME-Version: 1.0\r\nContent-Transfer-Encoding: 7bit\r\n\r\n\r\n \r\n Access Request Notification\r\n \r\n \r\n \r\n
\r\n
\r\n Request Notification\r\n
\r\n
\r\n

Hello,

\r\n

The status of your recent request has been updated.\r\n Below is the latest information regarding it:

\r\n\r\n
\r\n
Request Details
\r\n
\r\n\r\n

ID: d91ac738b6954dfebfde3a36629bfed0

\r\n

\r\n Submitted By:\r\n Lisa Horton lisa-horton-fake@openmined.org\r\n

\r\n

Date: 2024-09-20 15:34:27

\r\n

Status:

\r\n APPROVED\r\n
\r\n

\r\n Changes:\r\n UserCodeStatusChange\r\n

\r\n\r\n

Use:
\r\n \r\n request = client.api.services.request.get_by_uid(uid=sy.UID(\"d91ac738b6954dfebfde3a36629bfed0\"))\r\n
\r\n to get this specific request.\r\n

\r\n\r\n

Or you can view all requests with:
\r\n \r\n client.requests\r\n \r\n

\r\n
\r\n
\r\n

If you did not expect this request or have concerns about it,\r\n please contact our support team immediately.

\r\n
\r\n
\r\n This is an automated message, please do not reply directly to this email.
\r\n For assistance, please contact our support team.\r\n
\r\n
\r\n \r\n \r\n--===============5796074451455367110==--\r\n"}, {"email_from": "noreply@openmined.org", "email_to": ["lisa-horton-fake@openmined.org"], "email_content": "Content-Type: multipart/alternative; boundary=\"===============9008858769509539818==\"\r\nMIME-Version: 1.0\r\nFrom: noreply@openmined.org\r\nTo: lisa-horton-fake@openmined.org\r\nSubject: Datasite bigquery-high: Your request (d91a) has been approved. \r\n\r\n--===============9008858769509539818==\r\nContent-Type: text/html; charset=\"us-ascii\"\r\nMIME-Version: 1.0\r\nContent-Transfer-Encoding: 7bit\r\n\r\n\r\n \r\n Access Request Notification\r\n \r\n \r\n \r\n
\r\n
\r\n Request Notification\r\n
\r\n
\r\n

Hello,

\r\n

The status of your recent request has been updated.\r\n Below is the latest information regarding it:

\r\n\r\n
\r\n
Request Details
\r\n
\r\n\r\n

ID: d91ac738b6954dfebfde3a36629bfed0

\r\n

\r\n Submitted By:\r\n Lisa Horton lisa-horton-fake@openmined.org\r\n

\r\n

Date: 2024-09-20 15:34:27

\r\n

Status:

\r\n APPROVED\r\n
\r\n

\r\n Changes:\r\n UserCodeStatusChange,ActionStoreChange\r\n

\r\n\r\n

Use:
\r\n \r\n request = client.api.services.request.get_by_uid(uid=sy.UID(\"d91ac738b6954dfebfde3a36629bfed0\"))\r\n
\r\n to get this specific request.\r\n

\r\n\r\n

Or you can view all requests with:
\r\n \r\n client.requests\r\n \r\n

\r\n
\r\n
\r\n

If you did not expect this request or have concerns about it,\r\n please contact our support team immediately.

\r\n
\r\n
\r\n This is an automated message, please do not reply directly to this email.
\r\n For assistance, please contact our support team.\r\n
\r\n
\r\n \r\n \r\n--===============9008858769509539818==--\r\n"}, {"email_from": "noreply@openmined.org", "email_to": ["lisa-horton-fake@openmined.org"], "email_content": "Content-Type: multipart/alternative; boundary=\"===============3733526060461528606==\"\r\nMIME-Version: 1.0\r\nFrom: noreply@openmined.org\r\nTo: lisa-horton-fake@openmined.org\r\nSubject: Datasite bigquery-high: Your request (47e3) has been approved. \r\n\r\n--===============3733526060461528606==\r\nContent-Type: text/html; charset=\"us-ascii\"\r\nMIME-Version: 1.0\r\nContent-Transfer-Encoding: 7bit\r\n\r\n\r\n \r\n Access Request Notification\r\n \r\n \r\n \r\n
\r\n
\r\n Request Notification\r\n
\r\n
\r\n

Hello,

\r\n

The status of your recent request has been updated.\r\n Below is the latest information regarding it:

\r\n\r\n
\r\n
Request Details
\r\n
\r\n\r\n

ID: 47e37c4469e7494d8beae0e7b9c357e4

\r\n

\r\n Submitted By:\r\n Lisa Horton lisa-horton-fake@openmined.org\r\n

\r\n

Date: 2024-09-20 15:35:16

\r\n

Status:

\r\n APPROVED\r\n
\r\n

\r\n Changes:\r\n UserCodeStatusChange\r\n

\r\n\r\n

Use:
\r\n \r\n request = client.api.services.request.get_by_uid(uid=sy.UID(\"47e37c4469e7494d8beae0e7b9c357e4\"))\r\n
\r\n to get this specific request.\r\n

\r\n\r\n

Or you can view all requests with:
\r\n \r\n client.requests\r\n \r\n

\r\n
\r\n
\r\n

If you did not expect this request or have concerns about it,\r\n please contact our support team immediately.

\r\n
\r\n
\r\n This is an automated message, please do not reply directly to this email.
\r\n For assistance, please contact our support team.\r\n
\r\n
\r\n \r\n \r\n--===============3733526060461528606==--\r\n"}], "bethany-salazar-fake@openmined.org": [{"email_from": "noreply@openmined.org", "email_to": ["bethany-salazar-fake@openmined.org"], "email_content": "Content-Type: multipart/alternative; boundary=\"===============1439183957657070463==\"\r\nMIME-Version: 1.0\r\nFrom: noreply@openmined.org\r\nTo: bethany-salazar-fake@openmined.org\r\nSubject: Datasite bigquery-high: Your request (ae8f) has been approved. \r\n\r\n--===============1439183957657070463==\r\nContent-Type: text/html; charset=\"us-ascii\"\r\nMIME-Version: 1.0\r\nContent-Transfer-Encoding: 7bit\r\n\r\n\r\n \r\n Access Request Notification\r\n \r\n \r\n \r\n
\r\n
\r\n Request Notification\r\n
\r\n
\r\n

Hello,

\r\n

The status of your recent request has been updated.\r\n Below is the latest information regarding it:

\r\n\r\n
\r\n
Request Details
\r\n
\r\n\r\n

ID: ae8f1ac719d541719af0d55aaec09753

\r\n

\r\n Submitted By:\r\n Bethany Salazar bethany-salazar-fake@openmined.org\r\n

\r\n

Date: 2024-09-20 15:34:37

\r\n

Status:

\r\n APPROVED\r\n
\r\n

\r\n Changes:\r\n UserCodeStatusChange\r\n

\r\n\r\n

Use:
\r\n \r\n request = client.api.services.request.get_by_uid(uid=sy.UID(\"ae8f1ac719d541719af0d55aaec09753\"))\r\n
\r\n to get this specific request.\r\n

\r\n\r\n

Or you can view all requests with:
\r\n \r\n client.requests\r\n \r\n

\r\n
\r\n
\r\n

If you did not expect this request or have concerns about it,\r\n please contact our support team immediately.

\r\n
\r\n
\r\n This is an automated message, please do not reply directly to this email.
\r\n For assistance, please contact our support team.\r\n
\r\n
\r\n \r\n \r\n--===============1439183957657070463==--\r\n"}, {"email_from": "noreply@openmined.org", "email_to": ["bethany-salazar-fake@openmined.org"], "email_content": "Content-Type: multipart/alternative; boundary=\"===============7962373147229424675==\"\r\nMIME-Version: 1.0\r\nFrom: noreply@openmined.org\r\nTo: bethany-salazar-fake@openmined.org\r\nSubject: Datasite bigquery-high: Your request (ae8f) has been approved. \r\n\r\n--===============7962373147229424675==\r\nContent-Type: text/html; charset=\"us-ascii\"\r\nMIME-Version: 1.0\r\nContent-Transfer-Encoding: 7bit\r\n\r\n\r\n \r\n Access Request Notification\r\n \r\n \r\n \r\n
\r\n
\r\n Request Notification\r\n
\r\n
\r\n

Hello,

\r\n

The status of your recent request has been updated.\r\n Below is the latest information regarding it:

\r\n\r\n
\r\n
Request Details
\r\n
\r\n\r\n

ID: ae8f1ac719d541719af0d55aaec09753

\r\n

\r\n Submitted By:\r\n Bethany Salazar bethany-salazar-fake@openmined.org\r\n

\r\n

Date: 2024-09-20 15:34:37

\r\n

Status:

\r\n APPROVED\r\n
\r\n

\r\n Changes:\r\n UserCodeStatusChange,ActionStoreChange\r\n

\r\n\r\n

Use:
\r\n \r\n request = client.api.services.request.get_by_uid(uid=sy.UID(\"ae8f1ac719d541719af0d55aaec09753\"))\r\n
\r\n to get this specific request.\r\n

\r\n\r\n

Or you can view all requests with:
\r\n \r\n client.requests\r\n \r\n

\r\n
\r\n
\r\n

If you did not expect this request or have concerns about it,\r\n please contact our support team immediately.

\r\n
\r\n
\r\n This is an automated message, please do not reply directly to this email.
\r\n For assistance, please contact our support team.\r\n
\r\n
\r\n \r\n \r\n--===============7962373147229424675==--\r\n"}]} \ No newline at end of file diff --git a/notebooks/scenarios/bigquery/upgradability/0.9.1_notebooks/jobs.json b/notebooks/scenarios/bigquery/upgradability/0.9.1_notebooks/jobs.json index d6e74b0092d..cf81e4a302d 100644 --- a/notebooks/scenarios/bigquery/upgradability/0.9.1_notebooks/jobs.json +++ b/notebooks/scenarios/bigquery/upgradability/0.9.1_notebooks/jobs.json @@ -1 +1 @@ -{"peggy-white-fake@openmined.org": [{"user_email": "peggy-white-fake@openmined.org", "func_name": "simple_query_e738f3", "query": "SELECT table_id, AVG(colname) AS average_score\n FROM dataset_1.table_2\n GROUP BY table_id\n LIMIT 358370", "job_type": "simple_query", "settings": {"dataset": "dataset_1", "table": "table_2", "groupby_col": "table_id", "score_col": "colname", "limit": 358370}, "should_succeed": true, "should_submit": true, "code_path": "simple_query_e738f3", "admin_reviewed": true, "result_as_expected": true}, {"user_email": "peggy-white-fake@openmined.org", "func_name": "simple_query_bb83e9", "query": "SELECT table_id, AVG(colname) AS average_score\n FROM dataset_1.table_1\n GROUP BY table_id\n LIMIT 210808", "job_type": "simple_query", "settings": {"dataset": "dataset_1", "table": "table_1", "groupby_col": "table_id", "score_col": "colname", "limit": 210808}, "should_succeed": true, "should_submit": true, "code_path": "simple_query_bb83e9", "admin_reviewed": true, "result_as_expected": true}], "mark-dominguez-fake@openmined.org": [{"user_email": "mark-dominguez-fake@openmined.org", "func_name": "simple_query_a5793a", "query": "SELECT table_id, AVG(colname) AS average_score\n FROM dataset_1.table_2\n GROUP BY table_id\n LIMIT 189060", "job_type": "simple_query", "settings": {"dataset": "dataset_1", "table": "table_2", "groupby_col": "table_id", "score_col": "colname", "limit": 189060}, "should_succeed": true, "should_submit": true, "code_path": "simple_query_a5793a", "admin_reviewed": true, "result_as_expected": true}, {"user_email": "mark-dominguez-fake@openmined.org", "func_name": "wrong_syntax_query_82dc3c", "query": "SELECT * FROM table INCORRECT SYNTAX", "job_type": "wrong_syntax_query", "settings": {}, "should_succeed": false, "should_submit": true, "code_path": "wrong_syntax_query_82dc3c", "admin_reviewed": true, "result_as_expected": true}], "maxwell-soto-fake@openmined.org": [{"user_email": "maxwell-soto-fake@openmined.org", "func_name": "simple_query_8ab78b", "query": "SELECT table_id, AVG(colname) AS average_score\n FROM dataset_2.table_1\n GROUP BY table_id\n LIMIT 473772", "job_type": "simple_query", "settings": {"dataset": "dataset_2", "table": "table_1", "groupby_col": "table_id", "score_col": "colname", "limit": 473772}, "should_succeed": true, "should_submit": true, "code_path": "simple_query_8ab78b", "admin_reviewed": true, "result_as_expected": true}, {"user_email": "maxwell-soto-fake@openmined.org", "func_name": "job_too_much_text_9f7556", "query": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", "job_type": "job_too_much_text", "settings": {}, "should_succeed": false, "should_submit": true, "code_path": "job_too_much_text_9f7556", "admin_reviewed": true, "result_as_expected": true}], "crystal-adams-fake@openmined.org": [{"user_email": "crystal-adams-fake@openmined.org", "func_name": "simple_query_8b4b58", "query": "SELECT table_id, AVG(colname) AS average_score\n FROM dataset_1.table_1\n GROUP BY table_id\n LIMIT 79072", "job_type": "simple_query", "settings": {"dataset": "dataset_1", "table": "table_1", "groupby_col": "table_id", "score_col": "colname", "limit": 79072}, "should_succeed": true, "should_submit": true, "code_path": "simple_query_8b4b58", "admin_reviewed": true, "result_as_expected": true}, {"user_email": "crystal-adams-fake@openmined.org", "func_name": "job_long_name_39906aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", "query": "SELECT table_id, AVG(colname) AS average_score\n FROM dataset_2.table_1\n GROUP BY table_id\n LIMIT 670932", "job_type": "job_long_name", "settings": {"dataset": "dataset_2", "table": "table_1", "groupby_col": "table_id", "score_col": "colname", "limit": 670932}, "should_succeed": true, "should_submit": true, "code_path": "job_long_name_39906aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", "admin_reviewed": true, "result_as_expected": true}], "evelyn-wilson-fake@openmined.org": [{"user_email": "evelyn-wilson-fake@openmined.org", "func_name": "simple_query_29ec28", "query": "SELECT table_id, AVG(colname) AS average_score\n FROM dataset_1.table_2\n GROUP BY table_id\n LIMIT 195119", "job_type": "simple_query", "settings": {"dataset": "dataset_1", "table": "table_2", "groupby_col": "table_id", "score_col": "colname", "limit": 195119}, "should_succeed": true, "should_submit": true, "code_path": "simple_query_29ec28", "admin_reviewed": true, "result_as_expected": true}, {"user_email": "evelyn-wilson-fake@openmined.org", "func_name": "job_funcname_xss_d33f44", "query": "SELECT table_id, AVG(colname) AS average_score\n FROM dataset_1.table_2\n GROUP BY table_id\n LIMIT 631086", "job_type": "job_funcname_xss", "settings": {"dataset": "dataset_1", "table": "table_2", "groupby_col": "table_id", "score_col": "colname", "limit": 631086}, "should_succeed": true, "should_submit": false, "code_path": null, "admin_reviewed": false, "result_as_expected": null}]} \ No newline at end of file +{"michelle-smith-fake@openmined.org": [{"user_email": "michelle-smith-fake@openmined.org", "func_name": "simple_query_5299ff", "query": "SELECT table_id, AVG(colname) AS average_score\n FROM dataset_2.table_1\n GROUP BY table_id\n LIMIT 746375", "job_type": "simple_query", "settings": {"dataset": "dataset_2", "table": "table_1", "groupby_col": "table_id", "score_col": "colname", "limit": 746375}, "should_succeed": true, "should_submit": true, "code_path": "simple_query_5299ff", "admin_reviewed": true, "result_as_expected": true}, {"user_email": "michelle-smith-fake@openmined.org", "func_name": "simple_query_2adbbc", "query": "SELECT table_id, AVG(colname) AS average_score\n FROM dataset_1.table_1\n GROUP BY table_id\n LIMIT 389119", "job_type": "simple_query", "settings": {"dataset": "dataset_1", "table": "table_1", "groupby_col": "table_id", "score_col": "colname", "limit": 389119}, "should_succeed": true, "should_submit": true, "code_path": "simple_query_2adbbc", "admin_reviewed": true, "result_as_expected": true}], "james-hardin-fake@openmined.org": [{"user_email": "james-hardin-fake@openmined.org", "func_name": "simple_query_3e4e37", "query": "SELECT table_id, AVG(colname) AS average_score\n FROM dataset_2.table_2\n GROUP BY table_id\n LIMIT 880480", "job_type": "simple_query", "settings": {"dataset": "dataset_2", "table": "table_2", "groupby_col": "table_id", "score_col": "colname", "limit": 880480}, "should_succeed": true, "should_submit": true, "code_path": "simple_query_3e4e37", "admin_reviewed": true, "result_as_expected": true}, {"user_email": "james-hardin-fake@openmined.org", "func_name": "wrong_syntax_query_153304", "query": "SELECT * FROM table INCORRECT SYNTAX", "job_type": "wrong_syntax_query", "settings": {}, "should_succeed": false, "should_submit": true, "code_path": "wrong_syntax_query_153304", "admin_reviewed": true, "result_as_expected": true}], "kirsten-jordan-fake@openmined.org": [{"user_email": "kirsten-jordan-fake@openmined.org", "func_name": "simple_query_c59b4f", "query": "SELECT table_id, AVG(colname) AS average_score\n FROM dataset_2.table_1\n GROUP BY table_id\n LIMIT 90068", "job_type": "simple_query", "settings": {"dataset": "dataset_2", "table": "table_1", "groupby_col": "table_id", "score_col": "colname", "limit": 90068}, "should_succeed": true, "should_submit": true, "code_path": "simple_query_c59b4f", "admin_reviewed": true, "result_as_expected": true}, {"user_email": "kirsten-jordan-fake@openmined.org", "func_name": "job_too_much_text_73d768", "query": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", "job_type": "job_too_much_text", "settings": {}, "should_succeed": false, "should_submit": true, "code_path": "job_too_much_text_73d768", "admin_reviewed": true, "result_as_expected": true}], "lisa-horton-fake@openmined.org": [{"user_email": "lisa-horton-fake@openmined.org", "func_name": "simple_query_b3e060", "query": "SELECT table_id, AVG(colname) AS average_score\n FROM dataset_1.table_2\n GROUP BY table_id\n LIMIT 440517", "job_type": "simple_query", "settings": {"dataset": "dataset_1", "table": "table_2", "groupby_col": "table_id", "score_col": "colname", "limit": 440517}, "should_succeed": true, "should_submit": true, "code_path": "simple_query_b3e060", "admin_reviewed": true, "result_as_expected": true}, {"user_email": "lisa-horton-fake@openmined.org", "func_name": "job_long_name_3779f7aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", "query": "SELECT table_id, AVG(colname) AS average_score\n FROM dataset_2.table_1\n GROUP BY table_id\n LIMIT 975362", "job_type": "job_long_name", "settings": {"dataset": "dataset_2", "table": "table_1", "groupby_col": "table_id", "score_col": "colname", "limit": 975362}, "should_succeed": true, "should_submit": true, "code_path": "job_long_name_3779f7aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", "admin_reviewed": true, "result_as_expected": true}], "bethany-salazar-fake@openmined.org": [{"user_email": "bethany-salazar-fake@openmined.org", "func_name": "simple_query_ea72bf", "query": "SELECT table_id, AVG(colname) AS average_score\n FROM dataset_1.table_2\n GROUP BY table_id\n LIMIT 30639", "job_type": "simple_query", "settings": {"dataset": "dataset_1", "table": "table_2", "groupby_col": "table_id", "score_col": "colname", "limit": 30639}, "should_succeed": true, "should_submit": true, "code_path": "simple_query_ea72bf", "admin_reviewed": true, "result_as_expected": true}, {"user_email": "bethany-salazar-fake@openmined.org", "func_name": "job_funcname_xss_3ca54f", "query": "SELECT table_id, AVG(colname) AS average_score\n FROM dataset_1.table_1\n GROUP BY table_id\n LIMIT 473825", "job_type": "job_funcname_xss", "settings": {"dataset": "dataset_1", "table": "table_1", "groupby_col": "table_id", "score_col": "colname", "limit": 473825}, "should_succeed": true, "should_submit": false, "code_path": null, "admin_reviewed": false, "result_as_expected": null}]} \ No newline at end of file diff --git a/notebooks/scenarios/bigquery/upgradability/0.9.1_notebooks/users.json b/notebooks/scenarios/bigquery/upgradability/0.9.1_notebooks/users.json index 6a4adb3fdac..be11a92ff9c 100644 --- a/notebooks/scenarios/bigquery/upgradability/0.9.1_notebooks/users.json +++ b/notebooks/scenarios/bigquery/upgradability/0.9.1_notebooks/users.json @@ -1 +1 @@ -[{"name": "Peggy White", "email": "peggy-white-fake@openmined.org", "password": "*K5sBuIz)K", "role": "ServiceRole.DATA_SCIENTIST", "new_password": null, "email_disabled": true, "reset_password": false, "reset_token": null}, {"name": "Mark Dominguez", "email": "mark-dominguez-fake@openmined.org", "password": ")WNFXLM8e6", "role": "ServiceRole.DATA_SCIENTIST", "new_password": null, "email_disabled": false, "reset_password": true, "reset_token": "3tPlwW5cznSU"}, {"name": "Maxwell Soto", "email": "maxwell-soto-fake@openmined.org", "password": "^qO5Tp$id!", "role": "ServiceRole.DATA_SCIENTIST", "new_password": null, "email_disabled": false, "reset_password": false, "reset_token": null}, {"name": "Crystal Adams", "email": "crystal-adams-fake@openmined.org", "password": "#_SKHqnuk0", "role": "ServiceRole.DATA_SCIENTIST", "new_password": null, "email_disabled": false, "reset_password": false, "reset_token": null}, {"name": "Evelyn Wilson", "email": "evelyn-wilson-fake@openmined.org", "password": "CyLYwRFJ)9", "role": "ServiceRole.DATA_SCIENTIST", "new_password": null, "email_disabled": false, "reset_password": false, "reset_token": null}] \ No newline at end of file +[{"name": "Michelle Smith", "email": "michelle-smith-fake@openmined.org", "password": "+4a0WFehH@", "role": "ServiceRole.DATA_SCIENTIST", "new_password": null, "email_disabled": true, "reset_password": false, "reset_token": null}, {"name": "James Hardin", "email": "james-hardin-fake@openmined.org", "password": "JRZupKig+5", "role": "ServiceRole.DATA_SCIENTIST", "new_password": null, "email_disabled": false, "reset_password": true, "reset_token": "LJvUBHAso6JS"}, {"name": "Kirsten Jordan", "email": "kirsten-jordan-fake@openmined.org", "password": "k@L5^JGsV%", "role": "ServiceRole.DATA_SCIENTIST", "new_password": null, "email_disabled": false, "reset_password": false, "reset_token": null}, {"name": "Lisa Horton", "email": "lisa-horton-fake@openmined.org", "password": "yUJB4Zud)N", "role": "ServiceRole.DATA_SCIENTIST", "new_password": null, "email_disabled": false, "reset_password": false, "reset_token": null}, {"name": "Bethany Salazar", "email": "bethany-salazar-fake@openmined.org", "password": "2^q5NaWpz4", "role": "ServiceRole.DATA_SCIENTIST", "new_password": null, "email_disabled": false, "reset_password": false, "reset_token": null}] \ No newline at end of file diff --git a/notebooks/scenarios/bigquery/upgradability/1-dump-database-to-file.ipynb b/notebooks/scenarios/bigquery/upgradability/1-dump-database-to-file.ipynb index cba53cb324f..f465d0cf342 100644 --- a/notebooks/scenarios/bigquery/upgradability/1-dump-database-to-file.ipynb +++ b/notebooks/scenarios/bigquery/upgradability/1-dump-database-to-file.ipynb @@ -2,7 +2,7 @@ "cells": [ { "cell_type": "code", - "execution_count": 1, + "execution_count": null, "id": "0", "metadata": {}, "outputs": [], @@ -18,7 +18,7 @@ { "cell_type": "code", "execution_count": null, - "id": "0802eec0", + "id": "1", "metadata": {}, "outputs": [], "source": [ @@ -28,7 +28,7 @@ { "cell_type": "code", "execution_count": null, - "id": "1", + "id": "2", "metadata": {}, "outputs": [], "source": [ @@ -40,15 +40,13 @@ " n_consumers=1, # How many workers to be spawned\n", " create_producer=True, # Can produce more workers\n", ")\n", - "client = sy.login(\n", - " url=\"http://localhost:8080\", email=ADMIN_EMAIL, password=ADMIN_PW\n", - ")" + "client = sy.login(url=\"http://localhost:8080\", email=ADMIN_EMAIL, password=ADMIN_PW)" ] }, { "cell_type": "code", "execution_count": null, - "id": "2", + "id": "3", "metadata": {}, "outputs": [], "source": [ @@ -58,7 +56,7 @@ { "cell_type": "code", "execution_count": null, - "id": "3", + "id": "4", "metadata": {}, "outputs": [], "source": [ @@ -69,7 +67,7 @@ { "cell_type": "code", "execution_count": null, - "id": "4", + "id": "5", "metadata": {}, "outputs": [], "source": [ @@ -80,7 +78,7 @@ { "cell_type": "code", "execution_count": null, - "id": "5", + "id": "6", "metadata": {}, "outputs": [], "source": [ @@ -91,11 +89,13 @@ { "cell_type": "code", "execution_count": null, - "id": "6", + "id": "7", "metadata": {}, "outputs": [], "source": [ - "migration_data_dir = Path(os.getenv(\"MIGRATION_DATA_DIR\", \".\"))\n", + "# migration_data_dir = Path(os.getenv(\"MIGRATION_DATA_DIR\", \".\"))\n", + "migration_data_dir = Path('/home/teo/OpenMined/PySyft/notebooks/scenarios/bigquery/upgradability/')\n", + "\n", "migration_data_dir.mkdir(exist_ok=True)\n", "\n", "blob_path = migration_data_dir / \"migration.blob\"\n", @@ -108,7 +108,7 @@ { "cell_type": "code", "execution_count": null, - "id": "7", + "id": "8", "metadata": {}, "outputs": [], "source": [ @@ -123,7 +123,7 @@ { "cell_type": "code", "execution_count": null, - "id": "8", + "id": "9", "metadata": {}, "outputs": [], "source": [ @@ -134,7 +134,7 @@ { "cell_type": "code", "execution_count": null, - "id": "9", + "id": "10", "metadata": {}, "outputs": [], "source": [] diff --git a/notebooks/scenarios/bigquery/upgradability/2-migrate-for-scenarios.ipynb b/notebooks/scenarios/bigquery/upgradability/2-migrate-for-scenarios.ipynb index 1602bd9106b..9e6531d45e0 100644 --- a/notebooks/scenarios/bigquery/upgradability/2-migrate-for-scenarios.ipynb +++ b/notebooks/scenarios/bigquery/upgradability/2-migrate-for-scenarios.ipynb @@ -34,7 +34,6 @@ "metadata": {}, "outputs": [], "source": [ - "\n", "def add_helper_path_to_python_path() -> None:\n", " current_path = \".\"\n", "\n", @@ -55,7 +54,7 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": 3, "metadata": {}, "outputs": [], "source": [ @@ -66,7 +65,7 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": 4, "metadata": {}, "outputs": [], "source": [ @@ -84,7 +83,7 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 5, "metadata": {}, "outputs": [ { @@ -102,14 +101,14 @@ "text": [ "INFO: Will watch for changes in these directories: ['/home/teo/OpenMined/PySyft/packages/syft/src/syft']\n", "INFO: Uvicorn running on http://0.0.0.0:8080 (Press CTRL+C to quit)\n", - "INFO: Started reloader process [430723] using WatchFiles\n" + "INFO: Started reloader process [510073] using WatchFiles\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ - "Waiting for server to start.." + "Waiting for server to start..." ] }, { @@ -125,14 +124,14 @@ "text": [ "WARN: private key is based on server name: bigquery-high in dev_mode. Don't run this in production.\n", "Using SQLiteDBConfig and sqlite:////tmp/syft/fbdf5a287e58454cbbd3fac4ad744d37/db/fbdf5a287e58454cbbd3fac4ad744d37_json.db\n", - ".Adding producer for queue: api_call on: tcp://localhost:54941\n" + ".Adding producer for queue: api_call on: tcp://localhost:43423\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ - "INFO: Started server process [430738]\n", + "INFO: Started server process [510097]\n", "INFO: Waiting for application startup.\n", "INFO: Application startup complete.\n" ] @@ -1832,6 +1831,19 @@ }, "metadata": {}, "output_type": "display_data" + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "WARNING: WatchFiles detected changes in '/home/teo/OpenMined/PySyft/packages/syft/src/syft/store/sqlite_document_store.py', '/home/teo/OpenMined/PySyft/packages/syft/src/syft/util/notebook_ui/components/tabulator_template.py', '/home/teo/OpenMined/PySyft/packages/syft/src/syft/types/errors.py', '/home/teo/OpenMined/PySyft/packages/syft/src/syft/service/action/action_endpoint.py', '/home/teo/OpenMined/PySyft/packages/syft/src/syft/types/syft_object_registry.py'. Reloading...\n", + "WARNING: WatchFiles detected changes in '/home/teo/OpenMined/PySyft/packages/syft/src/syft/service/action/action_service.py', '/home/teo/OpenMined/PySyft/packages/syft/src/syft/protocol/data_protocol.py', '/home/teo/OpenMined/PySyft/packages/syft/src/syft/service/project/project.py', '/home/teo/OpenMined/PySyft/packages/syft/src/syft/client/registry.py', '/home/teo/OpenMined/PySyft/packages/syft/src/syft/types/syft_object.py', '/home/teo/OpenMined/PySyft/packages/syft/src/syft/store/kv_document_store.py', '/home/teo/OpenMined/PySyft/packages/syft/src/syft/store/db/stash.py'. Reloading...\n", + "WARNING: WatchFiles detected changes in '0.9.1_notebooks/010-setup-bigquery-pool7o29u_sq.py', 'sync/0.9.1_notebooks/03-ds-submit-request1hii6fj6.py', 'sync/0.9.1_notebooks/04-do-review-requestsmhu15iw2.py', 'sync/0.9.1_notebooks/02-configure-api-and-sync8xcxyi36.py', '0.9.1_notebooks/001-scale-delete-worker-poolsnb3gjot_.py', '2-migrate-for-scenarios58wcs16u.py', '0.9.1_notebooks/011-users-emails-passwordsc_t7o9i5.py', '0.9.1_notebooks/040-do-review-requests60u4fisw.py', '0.9.1_notebooks/000-start-and-configure-server-and-adminsjuu2kknp.py', '1-dump-database-to-filers27ez1t.py', 'sync/2-migrate-for-scenarios3k55tjwb.py', '0.9.1_notebooks/020-configure-api6veqcqhp.py', 'sync/1-dump-database-to-fileo3ka_8a4.py', 'sync/0.9.1_notebooks/01-setup-high-low-datasitesj96x0ujy.py', '0.9.1_notebooks/050-ds-get-results5g3e5sqr.py', 'sync/0.9.1_notebooks/05-ds-get-resultsvpyx_9fb.py', '0.9.1_notebooks/021-create-jobsfdihce8j.py'. Reloading...\n", + "WARNING: WatchFiles detected changes in '/home/teo/OpenMined/PySyft/packages/syft/src/syft/util/notebook_ui/components/tabulator_template.py', '/home/teo/OpenMined/PySyft/packages/syft/src/syft/types/errors.py', '/home/teo/OpenMined/PySyft/packages/syft/src/syft/protocol/data_protocol.py', '/home/teo/OpenMined/PySyft/packages/syft/src/syft/service/action/action_endpoint.py', '/home/teo/OpenMined/PySyft/packages/syft/src/syft/client/registry.py', '/home/teo/OpenMined/PySyft/packages/syft/src/syft/service/project/project.py', '/home/teo/OpenMined/PySyft/packages/syft/src/syft/service/action/action_service.py', '/home/teo/OpenMined/PySyft/packages/syft/src/syft/store/kv_document_store.py', '/home/teo/OpenMined/PySyft/packages/syft/src/syft/types/syft_object_registry.py', '/home/teo/OpenMined/PySyft/packages/syft/src/syft/types/syft_object.py', '/home/teo/OpenMined/PySyft/packages/syft/src/syft/store/sqlite_document_store.py', '/home/teo/OpenMined/PySyft/packages/syft/src/syft/store/db/stash.py'. Reloading...\n", + "WARNING: WatchFiles detected changes in '/home/teo/OpenMined/PySyft/packages/syft/src/syft/client/registry.py', '/home/teo/OpenMined/PySyft/packages/syft/src/syft/types/syft_object.py', '/home/teo/OpenMined/PySyft/packages/syft/src/syft/store/kv_document_store.py', '/home/teo/OpenMined/PySyft/packages/syft/src/syft/store/sqlite_document_store.py', '/home/teo/OpenMined/PySyft/packages/syft/src/syft/util/notebook_ui/components/tabulator_template.py', '/home/teo/OpenMined/PySyft/packages/syft/src/syft/types/errors.py', '/home/teo/OpenMined/PySyft/packages/syft/src/syft/protocol/data_protocol.py', '/home/teo/OpenMined/PySyft/packages/syft/src/syft/store/db/stash.py', '/home/teo/OpenMined/PySyft/packages/syft/src/syft/service/action/action_endpoint.py', '/home/teo/OpenMined/PySyft/packages/syft/src/syft/types/syft_object_registry.py'. Reloading...\n", + "WARNING: WatchFiles detected changes in '/home/teo/OpenMined/PySyft/packages/syft/src/syft/service/project/project.py', '/home/teo/OpenMined/PySyft/packages/syft/src/syft/service/action/action_service.py'. Reloading...\n", + "INFO: Stopping reloader process [510073]\n" + ] } ], "source": [ @@ -1852,7 +1864,7 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 6, "metadata": {}, "outputs": [], "source": [ @@ -1865,7 +1877,7 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": 7, "metadata": {}, "outputs": [ { @@ -1873,7 +1885,7 @@ "text/markdown": [ "```python\n", "class MigrationData:\n", - " id: str = 3aa75dcefab84be0aa88bc8f42a42060\n", + " id: str = 8681f30edbf645469ae962fc233a270e\n", " server_uid: str = fbdf5a287e58454cbbd3fac4ad744d37\n", " root_verify_key: str = 1e5ec44a179d21e0a0721ea7a670b9875d3946c8604f4623903fcafafe03c8e7\n", " num_objects: str = 17\n", @@ -1886,7 +1898,7 @@ "syft.service.migration.object_migration_state.MigrationData" ] }, - "execution_count": 8, + "execution_count": 7, "metadata": {}, "output_type": "execute_result" } @@ -1904,7 +1916,7 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": 8, "metadata": {}, "outputs": [ { @@ -1921,7 +1933,7 @@ }, { "cell_type": "code", - "execution_count": 10, + "execution_count": 9, "metadata": {}, "outputs": [ { @@ -1934,7 +1946,7 @@ ], "source": [ "# migration_data_dir = Path(os.getenv(\"MIGRATION_DATA_DIR\", \".\"))\n", - "migration_data_dir = Path('/home/teo/OpenMined/PySyft/.tox/.tmp/migration')\n", + "migration_data_dir = Path('/home/teo/OpenMined/PySyft/notebooks/scenarios/bigquery/upgradability/')\n", "blob_path = migration_data_dir / \"migration.blob\"\n", "yaml_path = migration_data_dir / \"migration.yaml\"\n", "\n", @@ -1943,7 +1955,7 @@ }, { "cell_type": "code", - "execution_count": 11, + "execution_count": 10, "metadata": {}, "outputs": [ { @@ -2807,18 +2819,18 @@ "Migrating data for: SyftImageRegistry table to version 1\n", "Migrating data for: ExecutionOutput table to version 1\n", "Migrating data for: UserCodeStatusCollection table to version 1\n", - " #6fe1e5123817486fb4664fe88ef676a6 already exists\n", + " #075b8b09a30f4d0e86eab5f942d931e7 already exists\n", " #fbdf5a287e58454cbbd3fac4ad744d37 already exists\n", - " #e85e379cdb5a4581ad180fd1c7ec0899 already exists\n", - " #52d85a18cea64eee8280e1e1473bafb2 already exists\n", - " #e1e8ad31bf4347e88032c93587295959 already exists\n", - " #7bdff308f4e74bcc9221ef490c886faa already exists\n", - " #7d4cda173464471c9b30b5934a1f805f already exists\n", - " #f0b822372c6542f4b38414147b074048 already exists\n", - " #700e9177f3574dc0a2b49c3dae88bf89 already exists\n", - " #c1996fdca82d4e7fba8f17e3578cc880 already exists\n", - " #bfab1b0991a743d0a0dbd903de5ba87d already exists\n", - " #9fee2d6ef02049c587ecbd826e6a8529 already exists\n", + " #e10182112aa44797ac8e848a36002f5e already exists\n", + " #71cce32533a84fe4ac7b2e55abbb1c57 already exists\n", + " #51fd98058777462083c9c7890dc244c1 already exists\n", + " #132fc0bcc67048278e1058a84ff8b4fd already exists\n", + " #916c1be78ba4477fb34ceff4d5aeba31 already exists\n", + " #d413b86849c845fd88512fbd6a4d5a91 already exists\n", + " #af4c17c76895448cbb39bac2162ad18d already exists\n", + " #05b78f27dbda4ceab16c9e84f9f5950d already exists\n", + " #44dbe5b4b51240c0a4637f8bbe9428f3 already exists\n", + " #1fdd0c5601a1432299c0995aba846a1d already exists\n", "Migrating data for: AnyActionObject table to version 1\n", "Migrating data for: PandasDataframeObject table to version 1\n", "Updating store metadata\n" @@ -2832,7 +2844,7 @@ }, { "cell_type": "code", - "execution_count": 12, + "execution_count": 11, "metadata": {}, "outputs": [ { @@ -3673,7 +3685,7 @@ "SyftSuccess: Migration completed successfully" ] }, - "execution_count": 12, + "execution_count": 11, "metadata": {}, "output_type": "execute_result" } @@ -3684,7 +3696,7 @@ }, { "cell_type": "code", - "execution_count": 13, + "execution_count": 12, "metadata": {}, "outputs": [ { @@ -4533,10 +4545,10 @@ " vertical-align: bottom;\n", "}\n", "\n", - "
SyftSuccess:
Dockerfile ID: 94ce7da1bb1c4c6491530852c798a96c successfully submitted.

" + "
SyftSuccess:
Dockerfile ID: 1e24a7c32d35460cbc44842f98f04781 successfully submitted.

" ], "text/plain": [ - "SyftSuccess: Dockerfile ID: 94ce7da1bb1c4c6491530852c798a96c successfully submitted." + "SyftSuccess: Dockerfile ID: 1e24a7c32d35460cbc44842f98f04781 successfully submitted." ] }, "metadata": {}, @@ -6221,7 +6233,7 @@ "/*# sourceMappingURL=tabulator_pysyft.min.css.map */\n", "\n", "\n", - "
\n", + "
\n", "\n", "
\n", "
\n", @@ -6234,16 +6246,16 @@ "
\n", "
\n", " \n", "
\n", "
\n", - "

Total: 0

\n", + "

Total: 0

\n", "
\n", "
\n", - "
\n", + "
\n", "\n", "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "
SyftSuccess:
Request 33fb47a296164483bdb314bbf1473f56 changes applied

" + "None\n" ], "text/plain": [ - "SyftSuccess: Request 33fb47a296164483bdb314bbf1473f56 changes applied" + "Pointer:\n", + "None" ] }, - "execution_count": 29, + "execution_count": 31, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "client.requests[-1].approve()" + "job_res.wait()" ] }, { "cell_type": "code", - "execution_count": 30, + "execution_count": 35, "metadata": {}, "outputs": [ { - "ename": "NameError", - "evalue": "name 'job' is not defined", - "output_type": "error", - "traceback": [ - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[0;31mNameError\u001b[0m Traceback (most recent call last)", - "Cell \u001b[0;32mIn[30], line 1\u001b[0m\n\u001b[0;32m----> 1\u001b[0m \u001b[43mjob\u001b[49m\u001b[38;5;241m.\u001b[39mcode_path\n", - "\u001b[0;31mNameError\u001b[0m: name 'job' is not defined" + "name": "stderr", + "output_type": "stream", + "text": [ + "INFO: Shutting down\n", + "INFO: Waiting for application shutdown.\n", + "INFO: Application shutdown complete.\n", + "INFO: Finished server process [510097]\n", + "INFO: Starting server with settings: {'name': 'bigquery-high', 'server_type': , 'server_side_type': , 'deployment_type': , 'processes': 1, 'reset': False, 'dev_mode': True, 'enable_warnings': False, 'in_memory_workers': True, 'queue_port': None, 'create_producer': True, 'n_consumers': 1, 'association_request_auto_approval': False, 'background_tasks': False, 'db_config': None, 'db_url': None} and worker class: \n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "WARN: private key is based on server name: bigquery-high in dev_mode. Don't run this in production.\n", + "Using SQLiteDBConfig and sqlite:////tmp/syft/fbdf5a287e58454cbbd3fac4ad744d37/db/fbdf5a287e58454cbbd3fac4ad744d37_json.db\n", + "Adding producer for queue: api_call on: tcp://localhost:45345\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "INFO: Started server process [576414]\n", + "INFO: Waiting for application startup.\n", + "INFO: Application startup complete.\n", + "INFO: Starting server with settings: {'name': 'bigquery-high', 'server_type': , 'server_side_type': , 'deployment_type': , 'processes': 1, 'reset': False, 'dev_mode': True, 'enable_warnings': False, 'in_memory_workers': True, 'queue_port': None, 'create_producer': True, 'n_consumers': 1, 'association_request_auto_approval': False, 'background_tasks': False, 'db_config': None, 'db_url': None} and worker class: \n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "WARN: private key is based on server name: bigquery-high in dev_mode. Don't run this in production.\n", + "Using SQLiteDBConfig and sqlite:////tmp/syft/fbdf5a287e58454cbbd3fac4ad744d37/db/fbdf5a287e58454cbbd3fac4ad744d37_json.db\n", + "Adding producer for queue: api_call on: tcp://localhost:57541\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "INFO: Started server process [576959]\n", + "INFO: Waiting for application startup.\n", + "INFO: Application startup complete.\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "WARN: private key is based on server name: bigquery-high in dev_mode. Don't run this in production.\n", + "Using SQLiteDBConfig and sqlite:////tmp/syft/fbdf5a287e58454cbbd3fac4ad744d37/db/fbdf5a287e58454cbbd3fac4ad744d37_json.db\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "INFO: Starting server with settings: {'name': 'bigquery-high', 'server_type': , 'server_side_type': , 'deployment_type': , 'processes': 1, 'reset': False, 'dev_mode': True, 'enable_warnings': False, 'in_memory_workers': True, 'queue_port': None, 'create_producer': True, 'n_consumers': 1, 'association_request_auto_approval': False, 'background_tasks': False, 'db_config': None, 'db_url': None} and worker class: \n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Adding producer for queue: api_call on: tcp://localhost:39313\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "INFO: Started server process [577131]\n", + "INFO: Waiting for application startup.\n", + "INFO: Application startup complete.\n", + "INFO: Starting server with settings: {'name': 'bigquery-high', 'server_type': , 'server_side_type': , 'deployment_type': , 'processes': 1, 'reset': False, 'dev_mode': True, 'enable_warnings': False, 'in_memory_workers': True, 'queue_port': None, 'create_producer': True, 'n_consumers': 1, 'association_request_auto_approval': False, 'background_tasks': False, 'db_config': None, 'db_url': None} and worker class: \n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "WARN: private key is based on server name: bigquery-high in dev_mode. Don't run this in production.\n", + "Using SQLiteDBConfig and sqlite:////tmp/syft/fbdf5a287e58454cbbd3fac4ad744d37/db/fbdf5a287e58454cbbd3fac4ad744d37_json.db\n", + "Adding producer for queue: api_call on: tcp://localhost:49231\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "INFO: Started server process [577755]\n", + "INFO: Waiting for application startup.\n", + "INFO: Application startup complete.\n", + "INFO: Shutting down\n", + "INFO: Waiting for application shutdown.\n", + "INFO: Application shutdown complete.\n", + "INFO: Finished server process [577755]\n", + "INFO: Starting server with settings: {'name': 'bigquery-high', 'server_type': , 'server_side_type': , 'deployment_type': , 'processes': 1, 'reset': False, 'dev_mode': True, 'enable_warnings': False, 'in_memory_workers': True, 'queue_port': None, 'create_producer': True, 'n_consumers': 1, 'association_request_auto_approval': False, 'background_tasks': False, 'db_config': None, 'db_url': None} and worker class: \n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "WARN: private key is based on server name: bigquery-high in dev_mode. Don't run this in production.\n", + "Using SQLiteDBConfig and sqlite:////tmp/syft/fbdf5a287e58454cbbd3fac4ad744d37/db/fbdf5a287e58454cbbd3fac4ad744d37_json.db\n", + "Adding producer for queue: api_call on: tcp://localhost:54589\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "INFO: Started server process [578722]\n", + "INFO: Waiting for application startup.\n", + "INFO: Application startup complete.\n", + "INFO: Starting server with settings: {'name': 'bigquery-high', 'server_type': , 'server_side_type': , 'deployment_type': , 'processes': 1, 'reset': False, 'dev_mode': True, 'enable_warnings': False, 'in_memory_workers': True, 'queue_port': None, 'create_producer': True, 'n_consumers': 1, 'association_request_auto_approval': False, 'background_tasks': False, 'db_config': None, 'db_url': None} and worker class: \n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "WARN: private key is based on server name: bigquery-high in dev_mode. Don't run this in production.\n", + "Using SQLiteDBConfig and sqlite:////tmp/syft/fbdf5a287e58454cbbd3fac4ad744d37/db/fbdf5a287e58454cbbd3fac4ad744d37_json.db\n", + "Adding producer for queue: api_call on: tcp://localhost:36717\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "INFO: Started server process [578795]\n", + "INFO: Waiting for application startup.\n", + "INFO: Application startup complete.\n", + "INFO: Shutting down\n", + "INFO: Waiting for application shutdown.\n", + "INFO: Application shutdown complete.\n", + "INFO: Finished server process [578795]\n" ] } ], "source": [ - "job.code_path" + "from pandas import DataFrame\n", + "\n", + "\n", + "assert isinstance(job_res.result.get(), DataFrame)" ] }, { - "cell_type": "markdown", + "cell_type": "code", + "execution_count": null, "metadata": {}, - "source": [ - "### Check on emails now?" - ] + "outputs": [], + "source": [] } ], "metadata": { diff --git a/notebooks/scenarios/bigquery/upgradability/migration.blob b/notebooks/scenarios/bigquery/upgradability/migration.blob index c41cc8e98471ad485d71f7e3d44c0255ac6217c4..17f49a789718454a20d27189d9a5a234fd50dcee 100644 GIT binary patch delta 282629 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 delta 297897 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 From 351cd06997ca5dcb0bf32e79bd866fd75ff8333f Mon Sep 17 00:00:00 2001 From: teo Date: Mon, 23 Sep 2024 11:20:16 +0300 Subject: [PATCH 10/17] fix tox task --- tox.ini | 22 +++++++++++++++++----- 1 file changed, 17 insertions(+), 5 deletions(-) diff --git a/tox.ini b/tox.ini index a5edaed5d13..6e1d7e29321 100644 --- a/tox.ini +++ b/tox.ini @@ -1608,10 +1608,21 @@ commands = [testenv:migration.scenarios.test] description = Migration Test setenv = - MIGRATION_DATA_DIR = {env:MIGRATION_DATA_DIR:{temp_dir}/migration} + MIGRATION_DATA_DIR = {env:MIGRATION_DATA_DIR:notebooks/scenarios/bigquery/upgradability} + ORCHESTRA_DEPLOYMENT_TYPE = {env:ORCHESTRA_DEPLOYMENT_TYPE:python} + DEV_MODE = {env:DEV_MODE:True} + TEST_NOTEBOOK_PATHS = {env:TEST_NOTEBOOK_PATHS:notebooks/scenarios/bigquery/upgradability/0.9.1_notebooks} + TEST_query_limit_size={env:test_query_limit_size:500000} + SERVER_URL = {env:SERVER_URL:http://localhost} + SERVER_PORT = {env:SERVER_PORT:8080} + NUM_TEST_USERS = {env:NUM_TEST_USERS:5} + NUM_TEST_JOBS = {env:NUM_TEST_JOBS:10} deps = -e{toxinidir}/packages/syft[dev] nbmake + db-dtypes + google-cloud-bigquery + aiosmtpd ; changedir = {toxinidir}/packages/syft allowlist_externals = bash @@ -1619,8 +1630,9 @@ allowlist_externals = pytest commands = ; tox -e migration.prepare + ; basc -c 'echo ${MIGRATION_DATA_DIR}' bash -c 'python -c "import syft as sy; print(\"Migrating to syft version:\", sy.__version__)"' - pytest -x --nbmake --nbmake-timeout=1000 notebooks/scenarios/bigquery/upgradability/2-migrate-for-scenarios.ipynb -vvvv -commands_post = - bash -c 'rm -f ${MIGRATION_DATA_DIR}/migration.blob' - bash -c 'rm -f ${MIGRATION_DATA_DIR}/migration.yaml' \ No newline at end of file + pytest -x --nbmake --nbmake-timeout=1000 notebooks/scenarios/bigquery/upgradability/2-migrate-for-scenarios.ipynb -vvvv --log-cli-level=DEBUG +; commands_post = +; bash -c 'rm -f ${MIGRATION_DATA_DIR}/migration.blob' +; bash -c 'rm -f ${MIGRATION_DATA_DIR}/migration.yaml' \ No newline at end of file From 5953e7e681d1460af80bf77538d9406f0e00fcb9 Mon Sep 17 00:00:00 2001 From: teo Date: Mon, 23 Sep 2024 11:21:18 +0300 Subject: [PATCH 11/17] added new state --- .../upgradability/0.9.1_notebooks/emails.json | 2 +- .../upgradability/0.9.1_notebooks/jobs.json | 2 +- .../upgradability/0.9.1_notebooks/users.json | 2 +- .../2-migrate-for-scenarios.ipynb | 237 ++++-------------- .../bigquery/upgradability/migration.blob | Bin 4227752 -> 5222000 bytes 5 files changed, 51 insertions(+), 192 deletions(-) diff --git a/notebooks/scenarios/bigquery/upgradability/0.9.1_notebooks/emails.json b/notebooks/scenarios/bigquery/upgradability/0.9.1_notebooks/emails.json index 076a8851a19..c820cbd7d40 100644 --- a/notebooks/scenarios/bigquery/upgradability/0.9.1_notebooks/emails.json +++ b/notebooks/scenarios/bigquery/upgradability/0.9.1_notebooks/emails.json @@ -1 +1 @@ -{"admin@bigquery.org": [{"email_from": "noreply@openmined.org", "email_to": ["admin@bigquery.org"], "email_content": "Content-Type: multipart/alternative; boundary=\"===============2897981303933629670==\"\r\nMIME-Version: 1.0\r\nFrom: noreply@openmined.org\r\nTo: admin@bigquery.org\r\nSubject: Datasite bigquery-high: A New Request (4c74) has been received!\r\n\r\n--===============2897981303933629670==\r\nContent-Type: text/html; charset=\"us-ascii\"\r\nMIME-Version: 1.0\r\nContent-Transfer-Encoding: 7bit\r\n\r\n\r\n \r\n Access Request Notification\r\n \r\n \r\n \r\n
\r\n
\r\n Request Notification\r\n
\r\n
\r\n

Hello,

\r\n

A new request has been submitted and requires your attention.\r\n Please review the details below:

\r\n\r\n
\r\n
Request Details
\r\n
\r\n\r\n

ID: 4c742cb18cb54e1ea9f33fae70612052

\r\n

\r\n Submitted By:\r\n Michelle Smith\r\n

\r\n

Date: 2024-09-20 15:33:58

\r\n

Status:

\r\n PENDING\r\n
\r\n

Changes:\r\n UserCodeStatusChange\r\n

\r\n\r\n

Use:
\r\n \r\n request = client.api.services.request.get_by_uid(uid=sy.UID(\"4c742cb18cb54e1ea9f33fae70612052\"))\r\n
\r\n to get this specific request.\r\n

\r\n\r\n

Or you can view all requests with:
\r\n \r\n client.requests\r\n \r\n

\r\n\r\n
\r\n
\r\n

If you did not expect this request or have concerns about it,\r\n please contact our support team immediately.

\r\n
\r\n
\r\n This is an automated message, please do not reply directly to this email.
\r\n For assistance, please contact our support team.\r\n
\r\n
\r\n \r\n \r\n--===============2897981303933629670==--\r\n"}, {"email_from": "noreply@openmined.org", "email_to": ["admin@bigquery.org"], "email_content": "Content-Type: multipart/alternative; boundary=\"===============8234444820410941303==\"\r\nMIME-Version: 1.0\r\nFrom: noreply@openmined.org\r\nTo: admin@bigquery.org\r\nSubject: Datasite bigquery-high: A New Request (6f62) has been received!\r\n\r\n--===============8234444820410941303==\r\nContent-Type: text/html; charset=\"us-ascii\"\r\nMIME-Version: 1.0\r\nContent-Transfer-Encoding: 7bit\r\n\r\n\r\n \r\n Access Request Notification\r\n \r\n \r\n \r\n
\r\n
\r\n Request Notification\r\n
\r\n
\r\n

Hello,

\r\n

A new request has been submitted and requires your attention.\r\n Please review the details below:

\r\n\r\n
\r\n
Request Details
\r\n
\r\n\r\n

ID: 6f62938282724236bf12f9f5998892c2

\r\n

\r\n Submitted By:\r\n James Hardin\r\n

\r\n

Date: 2024-09-20 15:34:08

\r\n

Status:

\r\n PENDING\r\n
\r\n

Changes:\r\n UserCodeStatusChange\r\n

\r\n\r\n

Use:
\r\n \r\n request = client.api.services.request.get_by_uid(uid=sy.UID(\"6f62938282724236bf12f9f5998892c2\"))\r\n
\r\n to get this specific request.\r\n

\r\n\r\n

Or you can view all requests with:
\r\n \r\n client.requests\r\n \r\n

\r\n\r\n
\r\n
\r\n

If you did not expect this request or have concerns about it,\r\n please contact our support team immediately.

\r\n
\r\n
\r\n This is an automated message, please do not reply directly to this email.
\r\n For assistance, please contact our support team.\r\n
\r\n
\r\n \r\n \r\n--===============8234444820410941303==--\r\n"}, {"email_from": "noreply@openmined.org", "email_to": ["admin@bigquery.org"], "email_content": "Content-Type: multipart/alternative; boundary=\"===============8889498753876106590==\"\r\nMIME-Version: 1.0\r\nFrom: noreply@openmined.org\r\nTo: admin@bigquery.org\r\nSubject: Datasite bigquery-high: A New Request (1325) has been received!\r\n\r\n--===============8889498753876106590==\r\nContent-Type: text/html; charset=\"us-ascii\"\r\nMIME-Version: 1.0\r\nContent-Transfer-Encoding: 7bit\r\n\r\n\r\n \r\n Access Request Notification\r\n \r\n \r\n \r\n
\r\n
\r\n Request Notification\r\n
\r\n
\r\n

Hello,

\r\n

A new request has been submitted and requires your attention.\r\n Please review the details below:

\r\n\r\n
\r\n
Request Details
\r\n
\r\n\r\n

ID: 13254f15bcf54317a7f45cb3b0ce1bd2

\r\n

\r\n Submitted By:\r\n Kirsten Jordan\r\n

\r\n

Date: 2024-09-20 15:34:17

\r\n

Status:

\r\n PENDING\r\n
\r\n

Changes:\r\n UserCodeStatusChange\r\n

\r\n\r\n

Use:
\r\n \r\n request = client.api.services.request.get_by_uid(uid=sy.UID(\"13254f15bcf54317a7f45cb3b0ce1bd2\"))\r\n
\r\n to get this specific request.\r\n

\r\n\r\n

Or you can view all requests with:
\r\n \r\n client.requests\r\n \r\n

\r\n\r\n
\r\n
\r\n

If you did not expect this request or have concerns about it,\r\n please contact our support team immediately.

\r\n
\r\n
\r\n This is an automated message, please do not reply directly to this email.
\r\n For assistance, please contact our support team.\r\n
\r\n
\r\n \r\n \r\n--===============8889498753876106590==--\r\n"}, {"email_from": "noreply@openmined.org", "email_to": ["admin@bigquery.org"], "email_content": "Content-Type: multipart/alternative; boundary=\"===============0814139577128064027==\"\r\nMIME-Version: 1.0\r\nFrom: noreply@openmined.org\r\nTo: admin@bigquery.org\r\nSubject: Datasite bigquery-high: A New Request (d91a) has been received!\r\n\r\n--===============0814139577128064027==\r\nContent-Type: text/html; charset=\"us-ascii\"\r\nMIME-Version: 1.0\r\nContent-Transfer-Encoding: 7bit\r\n\r\n\r\n \r\n Access Request Notification\r\n \r\n \r\n \r\n
\r\n
\r\n Request Notification\r\n
\r\n
\r\n

Hello,

\r\n

A new request has been submitted and requires your attention.\r\n Please review the details below:

\r\n\r\n
\r\n
Request Details
\r\n
\r\n\r\n

ID: d91ac738b6954dfebfde3a36629bfed0

\r\n

\r\n Submitted By:\r\n Lisa Horton\r\n

\r\n

Date: 2024-09-20 15:34:27

\r\n

Status:

\r\n PENDING\r\n
\r\n

Changes:\r\n UserCodeStatusChange\r\n

\r\n\r\n

Use:
\r\n \r\n request = client.api.services.request.get_by_uid(uid=sy.UID(\"d91ac738b6954dfebfde3a36629bfed0\"))\r\n
\r\n to get this specific request.\r\n

\r\n\r\n

Or you can view all requests with:
\r\n \r\n client.requests\r\n \r\n

\r\n\r\n
\r\n
\r\n

If you did not expect this request or have concerns about it,\r\n please contact our support team immediately.

\r\n
\r\n
\r\n This is an automated message, please do not reply directly to this email.
\r\n For assistance, please contact our support team.\r\n
\r\n
\r\n \r\n \r\n--===============0814139577128064027==--\r\n"}, {"email_from": "noreply@openmined.org", "email_to": ["admin@bigquery.org"], "email_content": "Content-Type: multipart/alternative; boundary=\"===============0968885670573095905==\"\r\nMIME-Version: 1.0\r\nFrom: noreply@openmined.org\r\nTo: admin@bigquery.org\r\nSubject: Datasite bigquery-high: A New Request (ae8f) has been received!\r\n\r\n--===============0968885670573095905==\r\nContent-Type: text/html; charset=\"us-ascii\"\r\nMIME-Version: 1.0\r\nContent-Transfer-Encoding: 7bit\r\n\r\n\r\n \r\n Access Request Notification\r\n \r\n \r\n \r\n
\r\n
\r\n Request Notification\r\n
\r\n
\r\n

Hello,

\r\n

A new request has been submitted and requires your attention.\r\n Please review the details below:

\r\n\r\n
\r\n
Request Details
\r\n
\r\n\r\n

ID: ae8f1ac719d541719af0d55aaec09753

\r\n

\r\n Submitted By:\r\n Bethany Salazar\r\n

\r\n

Date: 2024-09-20 15:34:37

\r\n

Status:

\r\n PENDING\r\n
\r\n

Changes:\r\n UserCodeStatusChange\r\n

\r\n\r\n

Use:
\r\n \r\n request = client.api.services.request.get_by_uid(uid=sy.UID(\"ae8f1ac719d541719af0d55aaec09753\"))\r\n
\r\n to get this specific request.\r\n

\r\n\r\n

Or you can view all requests with:
\r\n \r\n client.requests\r\n \r\n

\r\n\r\n
\r\n
\r\n

If you did not expect this request or have concerns about it,\r\n please contact our support team immediately.

\r\n
\r\n
\r\n This is an automated message, please do not reply directly to this email.
\r\n For assistance, please contact our support team.\r\n
\r\n
\r\n \r\n \r\n--===============0968885670573095905==--\r\n"}, {"email_from": "noreply@openmined.org", "email_to": ["admin@bigquery.org"], "email_content": "Content-Type: multipart/alternative; boundary=\"===============1351720497827175795==\"\r\nMIME-Version: 1.0\r\nFrom: noreply@openmined.org\r\nTo: admin@bigquery.org\r\nSubject: Datasite bigquery-high: A New Request (b590) has been received!\r\n\r\n--===============1351720497827175795==\r\nContent-Type: text/html; charset=\"us-ascii\"\r\nMIME-Version: 1.0\r\nContent-Transfer-Encoding: 7bit\r\n\r\n\r\n \r\n Access Request Notification\r\n \r\n \r\n \r\n
\r\n
\r\n Request Notification\r\n
\r\n
\r\n

Hello,

\r\n

A new request has been submitted and requires your attention.\r\n Please review the details below:

\r\n\r\n
\r\n
Request Details
\r\n
\r\n\r\n

ID: b590f502c7c94fc1bf0eea7f4a9725ef

\r\n

\r\n Submitted By:\r\n Michelle Smith\r\n

\r\n

Date: 2024-09-20 15:34:47

\r\n

Status:

\r\n PENDING\r\n
\r\n

Changes:\r\n UserCodeStatusChange\r\n

\r\n\r\n

Use:
\r\n \r\n request = client.api.services.request.get_by_uid(uid=sy.UID(\"b590f502c7c94fc1bf0eea7f4a9725ef\"))\r\n
\r\n to get this specific request.\r\n

\r\n\r\n

Or you can view all requests with:
\r\n \r\n client.requests\r\n \r\n

\r\n\r\n
\r\n
\r\n

If you did not expect this request or have concerns about it,\r\n please contact our support team immediately.

\r\n
\r\n
\r\n This is an automated message, please do not reply directly to this email.
\r\n For assistance, please contact our support team.\r\n
\r\n
\r\n \r\n \r\n--===============1351720497827175795==--\r\n"}, {"email_from": "noreply@openmined.org", "email_to": ["admin@bigquery.org"], "email_content": "Content-Type: multipart/alternative; boundary=\"===============9115313114542567663==\"\r\nMIME-Version: 1.0\r\nFrom: noreply@openmined.org\r\nTo: admin@bigquery.org\r\nSubject: Datasite bigquery-high: A New Request (dbed) has been received!\r\n\r\n--===============9115313114542567663==\r\nContent-Type: text/html; charset=\"us-ascii\"\r\nMIME-Version: 1.0\r\nContent-Transfer-Encoding: 7bit\r\n\r\n\r\n \r\n Access Request Notification\r\n \r\n \r\n \r\n
\r\n
\r\n Request Notification\r\n
\r\n
\r\n

Hello,

\r\n

A new request has been submitted and requires your attention.\r\n Please review the details below:

\r\n\r\n
\r\n
Request Details
\r\n
\r\n\r\n

ID: dbed86c80a524044ab9b40f8b1b9d0d6

\r\n

\r\n Submitted By:\r\n James Hardin\r\n

\r\n

Date: 2024-09-20 15:34:56

\r\n

Status:

\r\n PENDING\r\n
\r\n

Changes:\r\n UserCodeStatusChange\r\n

\r\n\r\n

Use:
\r\n \r\n request = client.api.services.request.get_by_uid(uid=sy.UID(\"dbed86c80a524044ab9b40f8b1b9d0d6\"))\r\n
\r\n to get this specific request.\r\n

\r\n\r\n

Or you can view all requests with:
\r\n \r\n client.requests\r\n \r\n

\r\n\r\n
\r\n
\r\n

If you did not expect this request or have concerns about it,\r\n please contact our support team immediately.

\r\n
\r\n
\r\n This is an automated message, please do not reply directly to this email.
\r\n For assistance, please contact our support team.\r\n
\r\n
\r\n \r\n \r\n--===============9115313114542567663==--\r\n"}, {"email_from": "noreply@openmined.org", "email_to": ["admin@bigquery.org"], "email_content": "Content-Type: multipart/alternative; boundary=\"===============4585067225846437681==\"\r\nMIME-Version: 1.0\r\nFrom: noreply@openmined.org\r\nTo: admin@bigquery.org\r\nSubject: Datasite bigquery-high: A New Request (43c8) has been received!\r\n\r\n--===============4585067225846437681==\r\nContent-Type: text/html; charset=\"us-ascii\"\r\nMIME-Version: 1.0\r\nContent-Transfer-Encoding: 7bit\r\n\r\n\r\n \r\n Access Request Notification\r\n \r\n \r\n \r\n
\r\n
\r\n Request Notification\r\n
\r\n
\r\n

Hello,

\r\n

A new request has been submitted and requires your attention.\r\n Please review the details below:

\r\n\r\n
\r\n
Request Details
\r\n
\r\n\r\n

ID: 43c8d0e85b10412380d104e899a17e83

\r\n

\r\n Submitted By:\r\n Kirsten Jordan\r\n

\r\n

Date: 2024-09-20 15:35:06

\r\n

Status:

\r\n PENDING\r\n
\r\n

Changes:\r\n UserCodeStatusChange\r\n

\r\n\r\n

Use:
\r\n \r\n request = client.api.services.request.get_by_uid(uid=sy.UID(\"43c8d0e85b10412380d104e899a17e83\"))\r\n
\r\n to get this specific request.\r\n

\r\n\r\n

Or you can view all requests with:
\r\n \r\n client.requests\r\n \r\n

\r\n\r\n
\r\n
\r\n

If you did not expect this request or have concerns about it,\r\n please contact our support team immediately.

\r\n
\r\n
\r\n This is an automated message, please do not reply directly to this email.
\r\n For assistance, please contact our support team.\r\n
\r\n
\r\n \r\n \r\n--===============4585067225846437681==--\r\n"}, {"email_from": "noreply@openmined.org", "email_to": ["admin@bigquery.org"], "email_content": "Content-Type: multipart/alternative; boundary=\"===============3778287079789045265==\"\r\nMIME-Version: 1.0\r\nFrom: noreply@openmined.org\r\nTo: admin@bigquery.org\r\nSubject: Datasite bigquery-high: A New Request (47e3) has been received!\r\n\r\n--===============3778287079789045265==\r\nContent-Type: text/html; charset=\"us-ascii\"\r\nMIME-Version: 1.0\r\nContent-Transfer-Encoding: 7bit\r\n\r\n\r\n \r\n Access Request Notification\r\n \r\n \r\n \r\n
\r\n
\r\n Request Notification\r\n
\r\n
\r\n

Hello,

\r\n

A new request has been submitted and requires your attention.\r\n Please review the details below:

\r\n\r\n
\r\n
Request Details
\r\n
\r\n\r\n

ID: 47e37c4469e7494d8beae0e7b9c357e4

\r\n

\r\n Submitted By:\r\n Lisa Horton\r\n

\r\n

Date: 2024-09-20 15:35:16

\r\n

Status:

\r\n PENDING\r\n
\r\n

Changes:\r\n UserCodeStatusChange\r\n

\r\n\r\n

Use:
\r\n \r\n request = client.api.services.request.get_by_uid(uid=sy.UID(\"47e37c4469e7494d8beae0e7b9c357e4\"))\r\n
\r\n to get this specific request.\r\n

\r\n\r\n

Or you can view all requests with:
\r\n \r\n client.requests\r\n \r\n

\r\n\r\n
\r\n
\r\n

If you did not expect this request or have concerns about it,\r\n please contact our support team immediately.

\r\n
\r\n
\r\n This is an automated message, please do not reply directly to this email.
\r\n For assistance, please contact our support team.\r\n
\r\n
\r\n \r\n \r\n--===============3778287079789045265==--\r\n"}], "james-hardin-fake@openmined.org": [{"email_from": "noreply@openmined.org", "email_to": ["james-hardin-fake@openmined.org"], "email_content": "Content-Type: multipart/alternative; boundary=\"===============4817706016290243410==\"\r\nMIME-Version: 1.0\r\nFrom: noreply@openmined.org\r\nTo: james-hardin-fake@openmined.org\r\nSubject: Datasite bigquery-high: Your request (6f62) has been approved. \r\n\r\n--===============4817706016290243410==\r\nContent-Type: text/html; charset=\"us-ascii\"\r\nMIME-Version: 1.0\r\nContent-Transfer-Encoding: 7bit\r\n\r\n\r\n \r\n Access Request Notification\r\n \r\n \r\n \r\n
\r\n
\r\n Request Notification\r\n
\r\n
\r\n

Hello,

\r\n

The status of your recent request has been updated.\r\n Below is the latest information regarding it:

\r\n\r\n
\r\n
Request Details
\r\n
\r\n\r\n

ID: 6f62938282724236bf12f9f5998892c2

\r\n

\r\n Submitted By:\r\n James Hardin james-hardin-fake@openmined.org\r\n

\r\n

Date: 2024-09-20 15:34:08

\r\n

Status:

\r\n APPROVED\r\n
\r\n

\r\n Changes:\r\n UserCodeStatusChange\r\n

\r\n\r\n

Use:
\r\n \r\n request = client.api.services.request.get_by_uid(uid=sy.UID(\"6f62938282724236bf12f9f5998892c2\"))\r\n
\r\n to get this specific request.\r\n

\r\n\r\n

Or you can view all requests with:
\r\n \r\n client.requests\r\n \r\n

\r\n
\r\n
\r\n

If you did not expect this request or have concerns about it,\r\n please contact our support team immediately.

\r\n
\r\n
\r\n This is an automated message, please do not reply directly to this email.
\r\n For assistance, please contact our support team.\r\n
\r\n
\r\n \r\n \r\n--===============4817706016290243410==--\r\n"}, {"email_from": "noreply@openmined.org", "email_to": ["james-hardin-fake@openmined.org"], "email_content": "Content-Type: multipart/alternative; boundary=\"===============4352839069066191452==\"\r\nMIME-Version: 1.0\r\nFrom: noreply@openmined.org\r\nTo: james-hardin-fake@openmined.org\r\nSubject: Datasite bigquery-high: Your request (dbed) has been denied. \r\n\r\n--===============4352839069066191452==\r\nContent-Type: text/html; charset=\"us-ascii\"\r\nMIME-Version: 1.0\r\nContent-Transfer-Encoding: 7bit\r\n\r\n\r\n \r\n Access Request Notification\r\n \r\n \r\n \r\n
\r\n
\r\n Request Notification\r\n
\r\n
\r\n

Hello,

\r\n

The status of your recent request has been updated.\r\n Below is the latest information regarding it:

\r\n\r\n
\r\n
Request Details
\r\n
\r\n\r\n

ID: dbed86c80a524044ab9b40f8b1b9d0d6

\r\n

\r\n Submitted By:\r\n James Hardin james-hardin-fake@openmined.org\r\n

\r\n

Date: 2024-09-20 15:34:56

\r\n

Status:

\r\n REJECTED\r\n
\r\n

\r\n Changes:\r\n UserCodeStatusChange\r\n

\r\n\r\n

Use:
\r\n \r\n request = client.api.services.request.get_by_uid(uid=sy.UID(\"dbed86c80a524044ab9b40f8b1b9d0d6\"))\r\n
\r\n to get this specific request.\r\n

\r\n\r\n

Or you can view all requests with:
\r\n \r\n client.requests\r\n \r\n

\r\n
\r\n
\r\n

If you did not expect this request or have concerns about it,\r\n please contact our support team immediately.

\r\n
\r\n
\r\n This is an automated message, please do not reply directly to this email.
\r\n For assistance, please contact our support team.\r\n
\r\n
\r\n \r\n \r\n--===============4352839069066191452==--\r\n"}], "kirsten-jordan-fake@openmined.org": [{"email_from": "noreply@openmined.org", "email_to": ["kirsten-jordan-fake@openmined.org"], "email_content": "Content-Type: multipart/alternative; boundary=\"===============8911884848016766745==\"\r\nMIME-Version: 1.0\r\nFrom: noreply@openmined.org\r\nTo: kirsten-jordan-fake@openmined.org\r\nSubject: Datasite bigquery-high: Your request (1325) has been approved. \r\n\r\n--===============8911884848016766745==\r\nContent-Type: text/html; charset=\"us-ascii\"\r\nMIME-Version: 1.0\r\nContent-Transfer-Encoding: 7bit\r\n\r\n\r\n \r\n Access Request Notification\r\n \r\n \r\n \r\n
\r\n
\r\n Request Notification\r\n
\r\n
\r\n

Hello,

\r\n

The status of your recent request has been updated.\r\n Below is the latest information regarding it:

\r\n\r\n
\r\n
Request Details
\r\n
\r\n\r\n

ID: 13254f15bcf54317a7f45cb3b0ce1bd2

\r\n

\r\n Submitted By:\r\n Kirsten Jordan kirsten-jordan-fake@openmined.org\r\n

\r\n

Date: 2024-09-20 15:34:17

\r\n

Status:

\r\n APPROVED\r\n
\r\n

\r\n Changes:\r\n UserCodeStatusChange\r\n

\r\n\r\n

Use:
\r\n \r\n request = client.api.services.request.get_by_uid(uid=sy.UID(\"13254f15bcf54317a7f45cb3b0ce1bd2\"))\r\n
\r\n to get this specific request.\r\n

\r\n\r\n

Or you can view all requests with:
\r\n \r\n client.requests\r\n \r\n

\r\n
\r\n
\r\n

If you did not expect this request or have concerns about it,\r\n please contact our support team immediately.

\r\n
\r\n
\r\n This is an automated message, please do not reply directly to this email.
\r\n For assistance, please contact our support team.\r\n
\r\n
\r\n \r\n \r\n--===============8911884848016766745==--\r\n"}, {"email_from": "noreply@openmined.org", "email_to": ["kirsten-jordan-fake@openmined.org"], "email_content": "Content-Type: multipart/alternative; boundary=\"===============8793043834092402494==\"\r\nMIME-Version: 1.0\r\nFrom: noreply@openmined.org\r\nTo: kirsten-jordan-fake@openmined.org\r\nSubject: Datasite bigquery-high: Your request (1325) has been approved. \r\n\r\n--===============8793043834092402494==\r\nContent-Type: text/html; charset=\"us-ascii\"\r\nMIME-Version: 1.0\r\nContent-Transfer-Encoding: 7bit\r\n\r\n\r\n \r\n Access Request Notification\r\n \r\n \r\n \r\n
\r\n
\r\n Request Notification\r\n
\r\n
\r\n

Hello,

\r\n

The status of your recent request has been updated.\r\n Below is the latest information regarding it:

\r\n\r\n
\r\n
Request Details
\r\n
\r\n\r\n

ID: 13254f15bcf54317a7f45cb3b0ce1bd2

\r\n

\r\n Submitted By:\r\n Kirsten Jordan kirsten-jordan-fake@openmined.org\r\n

\r\n

Date: 2024-09-20 15:34:17

\r\n

Status:

\r\n APPROVED\r\n
\r\n

\r\n Changes:\r\n UserCodeStatusChange,ActionStoreChange\r\n

\r\n\r\n

Use:
\r\n \r\n request = client.api.services.request.get_by_uid(uid=sy.UID(\"13254f15bcf54317a7f45cb3b0ce1bd2\"))\r\n
\r\n to get this specific request.\r\n

\r\n\r\n

Or you can view all requests with:
\r\n \r\n client.requests\r\n \r\n

\r\n
\r\n
\r\n

If you did not expect this request or have concerns about it,\r\n please contact our support team immediately.

\r\n
\r\n
\r\n This is an automated message, please do not reply directly to this email.
\r\n For assistance, please contact our support team.\r\n
\r\n
\r\n \r\n \r\n--===============8793043834092402494==--\r\n"}, {"email_from": "noreply@openmined.org", "email_to": ["kirsten-jordan-fake@openmined.org"], "email_content": "Content-Type: multipart/alternative; boundary=\"===============7229152125479613071==\"\r\nMIME-Version: 1.0\r\nFrom: noreply@openmined.org\r\nTo: kirsten-jordan-fake@openmined.org\r\nSubject: Datasite bigquery-high: Your request (43c8) has been denied. \r\n\r\n--===============7229152125479613071==\r\nContent-Type: text/html; charset=\"us-ascii\"\r\nMIME-Version: 1.0\r\nContent-Transfer-Encoding: 7bit\r\n\r\n\r\n \r\n Access Request Notification\r\n \r\n \r\n \r\n
\r\n
\r\n Request Notification\r\n
\r\n
\r\n

Hello,

\r\n

The status of your recent request has been updated.\r\n Below is the latest information regarding it:

\r\n\r\n
\r\n
Request Details
\r\n
\r\n\r\n

ID: 43c8d0e85b10412380d104e899a17e83

\r\n

\r\n Submitted By:\r\n Kirsten Jordan kirsten-jordan-fake@openmined.org\r\n

\r\n

Date: 2024-09-20 15:35:06

\r\n

Status:

\r\n REJECTED\r\n
\r\n

\r\n Changes:\r\n UserCodeStatusChange\r\n

\r\n\r\n

Use:
\r\n \r\n request = client.api.services.request.get_by_uid(uid=sy.UID(\"43c8d0e85b10412380d104e899a17e83\"))\r\n
\r\n to get this specific request.\r\n

\r\n\r\n

Or you can view all requests with:
\r\n \r\n client.requests\r\n \r\n

\r\n
\r\n
\r\n

If you did not expect this request or have concerns about it,\r\n please contact our support team immediately.

\r\n
\r\n
\r\n This is an automated message, please do not reply directly to this email.
\r\n For assistance, please contact our support team.\r\n
\r\n
\r\n \r\n \r\n--===============7229152125479613071==--\r\n"}], "lisa-horton-fake@openmined.org": [{"email_from": "noreply@openmined.org", "email_to": ["lisa-horton-fake@openmined.org"], "email_content": "Content-Type: multipart/alternative; boundary=\"===============5796074451455367110==\"\r\nMIME-Version: 1.0\r\nFrom: noreply@openmined.org\r\nTo: lisa-horton-fake@openmined.org\r\nSubject: Datasite bigquery-high: Your request (d91a) has been approved. \r\n\r\n--===============5796074451455367110==\r\nContent-Type: text/html; charset=\"us-ascii\"\r\nMIME-Version: 1.0\r\nContent-Transfer-Encoding: 7bit\r\n\r\n\r\n \r\n Access Request Notification\r\n \r\n \r\n \r\n
\r\n
\r\n Request Notification\r\n
\r\n
\r\n

Hello,

\r\n

The status of your recent request has been updated.\r\n Below is the latest information regarding it:

\r\n\r\n
\r\n
Request Details
\r\n
\r\n\r\n

ID: d91ac738b6954dfebfde3a36629bfed0

\r\n

\r\n Submitted By:\r\n Lisa Horton lisa-horton-fake@openmined.org\r\n

\r\n

Date: 2024-09-20 15:34:27

\r\n

Status:

\r\n APPROVED\r\n
\r\n

\r\n Changes:\r\n UserCodeStatusChange\r\n

\r\n\r\n

Use:
\r\n \r\n request = client.api.services.request.get_by_uid(uid=sy.UID(\"d91ac738b6954dfebfde3a36629bfed0\"))\r\n
\r\n to get this specific request.\r\n

\r\n\r\n

Or you can view all requests with:
\r\n \r\n client.requests\r\n \r\n

\r\n
\r\n
\r\n

If you did not expect this request or have concerns about it,\r\n please contact our support team immediately.

\r\n
\r\n
\r\n This is an automated message, please do not reply directly to this email.
\r\n For assistance, please contact our support team.\r\n
\r\n
\r\n \r\n \r\n--===============5796074451455367110==--\r\n"}, {"email_from": "noreply@openmined.org", "email_to": ["lisa-horton-fake@openmined.org"], "email_content": "Content-Type: multipart/alternative; boundary=\"===============9008858769509539818==\"\r\nMIME-Version: 1.0\r\nFrom: noreply@openmined.org\r\nTo: lisa-horton-fake@openmined.org\r\nSubject: Datasite bigquery-high: Your request (d91a) has been approved. \r\n\r\n--===============9008858769509539818==\r\nContent-Type: text/html; charset=\"us-ascii\"\r\nMIME-Version: 1.0\r\nContent-Transfer-Encoding: 7bit\r\n\r\n\r\n \r\n Access Request Notification\r\n \r\n \r\n \r\n
\r\n
\r\n Request Notification\r\n
\r\n
\r\n

Hello,

\r\n

The status of your recent request has been updated.\r\n Below is the latest information regarding it:

\r\n\r\n
\r\n
Request Details
\r\n
\r\n\r\n

ID: d91ac738b6954dfebfde3a36629bfed0

\r\n

\r\n Submitted By:\r\n Lisa Horton lisa-horton-fake@openmined.org\r\n

\r\n

Date: 2024-09-20 15:34:27

\r\n

Status:

\r\n APPROVED\r\n
\r\n

\r\n Changes:\r\n UserCodeStatusChange,ActionStoreChange\r\n

\r\n\r\n

Use:
\r\n \r\n request = client.api.services.request.get_by_uid(uid=sy.UID(\"d91ac738b6954dfebfde3a36629bfed0\"))\r\n
\r\n to get this specific request.\r\n

\r\n\r\n

Or you can view all requests with:
\r\n \r\n client.requests\r\n \r\n

\r\n
\r\n
\r\n

If you did not expect this request or have concerns about it,\r\n please contact our support team immediately.

\r\n
\r\n
\r\n This is an automated message, please do not reply directly to this email.
\r\n For assistance, please contact our support team.\r\n
\r\n
\r\n \r\n \r\n--===============9008858769509539818==--\r\n"}, {"email_from": "noreply@openmined.org", "email_to": ["lisa-horton-fake@openmined.org"], "email_content": "Content-Type: multipart/alternative; boundary=\"===============3733526060461528606==\"\r\nMIME-Version: 1.0\r\nFrom: noreply@openmined.org\r\nTo: lisa-horton-fake@openmined.org\r\nSubject: Datasite bigquery-high: Your request (47e3) has been approved. \r\n\r\n--===============3733526060461528606==\r\nContent-Type: text/html; charset=\"us-ascii\"\r\nMIME-Version: 1.0\r\nContent-Transfer-Encoding: 7bit\r\n\r\n\r\n \r\n Access Request Notification\r\n \r\n \r\n \r\n
\r\n
\r\n Request Notification\r\n
\r\n
\r\n

Hello,

\r\n

The status of your recent request has been updated.\r\n Below is the latest information regarding it:

\r\n\r\n
\r\n
Request Details
\r\n
\r\n\r\n

ID: 47e37c4469e7494d8beae0e7b9c357e4

\r\n

\r\n Submitted By:\r\n Lisa Horton lisa-horton-fake@openmined.org\r\n

\r\n

Date: 2024-09-20 15:35:16

\r\n

Status:

\r\n APPROVED\r\n
\r\n

\r\n Changes:\r\n UserCodeStatusChange\r\n

\r\n\r\n

Use:
\r\n \r\n request = client.api.services.request.get_by_uid(uid=sy.UID(\"47e37c4469e7494d8beae0e7b9c357e4\"))\r\n
\r\n to get this specific request.\r\n

\r\n\r\n

Or you can view all requests with:
\r\n \r\n client.requests\r\n \r\n

\r\n
\r\n
\r\n

If you did not expect this request or have concerns about it,\r\n please contact our support team immediately.

\r\n
\r\n
\r\n This is an automated message, please do not reply directly to this email.
\r\n For assistance, please contact our support team.\r\n
\r\n
\r\n \r\n \r\n--===============3733526060461528606==--\r\n"}], "bethany-salazar-fake@openmined.org": [{"email_from": "noreply@openmined.org", "email_to": ["bethany-salazar-fake@openmined.org"], "email_content": "Content-Type: multipart/alternative; boundary=\"===============1439183957657070463==\"\r\nMIME-Version: 1.0\r\nFrom: noreply@openmined.org\r\nTo: bethany-salazar-fake@openmined.org\r\nSubject: Datasite bigquery-high: Your request (ae8f) has been approved. \r\n\r\n--===============1439183957657070463==\r\nContent-Type: text/html; charset=\"us-ascii\"\r\nMIME-Version: 1.0\r\nContent-Transfer-Encoding: 7bit\r\n\r\n\r\n \r\n Access Request Notification\r\n \r\n \r\n \r\n
\r\n
\r\n Request Notification\r\n
\r\n
\r\n

Hello,

\r\n

The status of your recent request has been updated.\r\n Below is the latest information regarding it:

\r\n\r\n
\r\n
Request Details
\r\n
\r\n\r\n

ID: ae8f1ac719d541719af0d55aaec09753

\r\n

\r\n Submitted By:\r\n Bethany Salazar bethany-salazar-fake@openmined.org\r\n

\r\n

Date: 2024-09-20 15:34:37

\r\n

Status:

\r\n APPROVED\r\n
\r\n

\r\n Changes:\r\n UserCodeStatusChange\r\n

\r\n\r\n

Use:
\r\n \r\n request = client.api.services.request.get_by_uid(uid=sy.UID(\"ae8f1ac719d541719af0d55aaec09753\"))\r\n
\r\n to get this specific request.\r\n

\r\n\r\n

Or you can view all requests with:
\r\n \r\n client.requests\r\n \r\n

\r\n
\r\n
\r\n

If you did not expect this request or have concerns about it,\r\n please contact our support team immediately.

\r\n
\r\n
\r\n This is an automated message, please do not reply directly to this email.
\r\n For assistance, please contact our support team.\r\n
\r\n
\r\n \r\n \r\n--===============1439183957657070463==--\r\n"}, {"email_from": "noreply@openmined.org", "email_to": ["bethany-salazar-fake@openmined.org"], "email_content": "Content-Type: multipart/alternative; boundary=\"===============7962373147229424675==\"\r\nMIME-Version: 1.0\r\nFrom: noreply@openmined.org\r\nTo: bethany-salazar-fake@openmined.org\r\nSubject: Datasite bigquery-high: Your request (ae8f) has been approved. \r\n\r\n--===============7962373147229424675==\r\nContent-Type: text/html; charset=\"us-ascii\"\r\nMIME-Version: 1.0\r\nContent-Transfer-Encoding: 7bit\r\n\r\n\r\n \r\n Access Request Notification\r\n \r\n \r\n \r\n
\r\n
\r\n Request Notification\r\n
\r\n
\r\n

Hello,

\r\n

The status of your recent request has been updated.\r\n Below is the latest information regarding it:

\r\n\r\n
\r\n
Request Details
\r\n
\r\n\r\n

ID: ae8f1ac719d541719af0d55aaec09753

\r\n

\r\n Submitted By:\r\n Bethany Salazar bethany-salazar-fake@openmined.org\r\n

\r\n

Date: 2024-09-20 15:34:37

\r\n

Status:

\r\n APPROVED\r\n
\r\n

\r\n Changes:\r\n UserCodeStatusChange,ActionStoreChange\r\n

\r\n\r\n

Use:
\r\n \r\n request = client.api.services.request.get_by_uid(uid=sy.UID(\"ae8f1ac719d541719af0d55aaec09753\"))\r\n
\r\n to get this specific request.\r\n

\r\n\r\n

Or you can view all requests with:
\r\n \r\n client.requests\r\n \r\n

\r\n
\r\n
\r\n

If you did not expect this request or have concerns about it,\r\n please contact our support team immediately.

\r\n
\r\n
\r\n This is an automated message, please do not reply directly to this email.
\r\n For assistance, please contact our support team.\r\n
\r\n
\r\n \r\n \r\n--===============7962373147229424675==--\r\n"}]} \ No newline at end of file +{"admin@bigquery.org": [{"email_from": "noreply@openmined.org", "email_to": ["admin@bigquery.org"], "email_content": "Content-Type: multipart/alternative; boundary=\"===============1727108626636976704==\"\r\nMIME-Version: 1.0\r\nFrom: noreply@openmined.org\r\nTo: admin@bigquery.org\r\nSubject: Datasite bigquery-high: A New Request (f145) has been received!\r\n\r\n--===============1727108626636976704==\r\nContent-Type: text/html; charset=\"us-ascii\"\r\nMIME-Version: 1.0\r\nContent-Transfer-Encoding: 7bit\r\n\r\n\r\n \r\n Access Request Notification\r\n \r\n \r\n \r\n
\r\n
\r\n Request Notification\r\n
\r\n
\r\n

Hello,

\r\n

A new request has been submitted and requires your attention.\r\n Please review the details below:

\r\n\r\n
\r\n
Request Details
\r\n
\r\n\r\n

ID: f145c5b5be1e4b30b4b70d72c97a6d10

\r\n

\r\n Submitted By:\r\n Arthur Smith\r\n

\r\n

Date: 2024-09-23 07:32:45

\r\n

Status:

\r\n PENDING\r\n
\r\n

Changes:\r\n UserCodeStatusChange\r\n

\r\n\r\n

Use:
\r\n \r\n request = client.api.services.request.get_by_uid(uid=sy.UID(\"f145c5b5be1e4b30b4b70d72c97a6d10\"))\r\n
\r\n to get this specific request.\r\n

\r\n\r\n

Or you can view all requests with:
\r\n \r\n client.requests\r\n \r\n

\r\n\r\n
\r\n
\r\n

If you did not expect this request or have concerns about it,\r\n please contact our support team immediately.

\r\n
\r\n
\r\n This is an automated message, please do not reply directly to this email.
\r\n For assistance, please contact our support team.\r\n
\r\n
\r\n \r\n \r\n--===============1727108626636976704==--\r\n"}, {"email_from": "noreply@openmined.org", "email_to": ["admin@bigquery.org"], "email_content": "Content-Type: multipart/alternative; boundary=\"===============8150226390710453256==\"\r\nMIME-Version: 1.0\r\nFrom: noreply@openmined.org\r\nTo: admin@bigquery.org\r\nSubject: Datasite bigquery-high: A New Request (5dca) has been received!\r\n\r\n--===============8150226390710453256==\r\nContent-Type: text/html; charset=\"us-ascii\"\r\nMIME-Version: 1.0\r\nContent-Transfer-Encoding: 7bit\r\n\r\n\r\n \r\n Access Request Notification\r\n \r\n \r\n \r\n
\r\n
\r\n Request Notification\r\n
\r\n
\r\n

Hello,

\r\n

A new request has been submitted and requires your attention.\r\n Please review the details below:

\r\n\r\n
\r\n
Request Details
\r\n
\r\n\r\n

ID: 5dcabc08b92d40729cccf97c6f91dc58

\r\n

\r\n Submitted By:\r\n Noah Hinton\r\n

\r\n

Date: 2024-09-23 07:32:56

\r\n

Status:

\r\n PENDING\r\n
\r\n

Changes:\r\n UserCodeStatusChange\r\n

\r\n\r\n

Use:
\r\n \r\n request = client.api.services.request.get_by_uid(uid=sy.UID(\"5dcabc08b92d40729cccf97c6f91dc58\"))\r\n
\r\n to get this specific request.\r\n

\r\n\r\n

Or you can view all requests with:
\r\n \r\n client.requests\r\n \r\n

\r\n\r\n
\r\n
\r\n

If you did not expect this request or have concerns about it,\r\n please contact our support team immediately.

\r\n
\r\n
\r\n This is an automated message, please do not reply directly to this email.
\r\n For assistance, please contact our support team.\r\n
\r\n
\r\n \r\n \r\n--===============8150226390710453256==--\r\n"}, {"email_from": "noreply@openmined.org", "email_to": ["admin@bigquery.org"], "email_content": "Content-Type: multipart/alternative; boundary=\"===============7091869554779523847==\"\r\nMIME-Version: 1.0\r\nFrom: noreply@openmined.org\r\nTo: admin@bigquery.org\r\nSubject: Datasite bigquery-high: A New Request (3bb3) has been received!\r\n\r\n--===============7091869554779523847==\r\nContent-Type: text/html; charset=\"us-ascii\"\r\nMIME-Version: 1.0\r\nContent-Transfer-Encoding: 7bit\r\n\r\n\r\n \r\n Access Request Notification\r\n \r\n \r\n \r\n
\r\n
\r\n Request Notification\r\n
\r\n
\r\n

Hello,

\r\n

A new request has been submitted and requires your attention.\r\n Please review the details below:

\r\n\r\n
\r\n
Request Details
\r\n
\r\n\r\n

ID: 3bb36547478f4ca7b6d081cda33473b7

\r\n

\r\n Submitted By:\r\n Samantha Heath\r\n

\r\n

Date: 2024-09-23 07:33:05

\r\n

Status:

\r\n PENDING\r\n
\r\n

Changes:\r\n UserCodeStatusChange\r\n

\r\n\r\n

Use:
\r\n \r\n request = client.api.services.request.get_by_uid(uid=sy.UID(\"3bb36547478f4ca7b6d081cda33473b7\"))\r\n
\r\n to get this specific request.\r\n

\r\n\r\n

Or you can view all requests with:
\r\n \r\n client.requests\r\n \r\n

\r\n\r\n
\r\n
\r\n

If you did not expect this request or have concerns about it,\r\n please contact our support team immediately.

\r\n
\r\n
\r\n This is an automated message, please do not reply directly to this email.
\r\n For assistance, please contact our support team.\r\n
\r\n
\r\n \r\n \r\n--===============7091869554779523847==--\r\n"}, {"email_from": "noreply@openmined.org", "email_to": ["admin@bigquery.org"], "email_content": "Content-Type: multipart/alternative; boundary=\"===============9222421578986331565==\"\r\nMIME-Version: 1.0\r\nFrom: noreply@openmined.org\r\nTo: admin@bigquery.org\r\nSubject: Datasite bigquery-high: A New Request (34e2) has been received!\r\n\r\n--===============9222421578986331565==\r\nContent-Type: text/html; charset=\"us-ascii\"\r\nMIME-Version: 1.0\r\nContent-Transfer-Encoding: 7bit\r\n\r\n\r\n \r\n Access Request Notification\r\n \r\n \r\n \r\n
\r\n
\r\n Request Notification\r\n
\r\n
\r\n

Hello,

\r\n

A new request has been submitted and requires your attention.\r\n Please review the details below:

\r\n\r\n
\r\n
Request Details
\r\n
\r\n\r\n

ID: 34e25431aeab460cb53c94f4b31411e3

\r\n

\r\n Submitted By:\r\n Eric Morales\r\n

\r\n

Date: 2024-09-23 07:33:15

\r\n

Status:

\r\n PENDING\r\n
\r\n

Changes:\r\n UserCodeStatusChange\r\n

\r\n\r\n

Use:
\r\n \r\n request = client.api.services.request.get_by_uid(uid=sy.UID(\"34e25431aeab460cb53c94f4b31411e3\"))\r\n
\r\n to get this specific request.\r\n

\r\n\r\n

Or you can view all requests with:
\r\n \r\n client.requests\r\n \r\n

\r\n\r\n
\r\n
\r\n

If you did not expect this request or have concerns about it,\r\n please contact our support team immediately.

\r\n
\r\n
\r\n This is an automated message, please do not reply directly to this email.
\r\n For assistance, please contact our support team.\r\n
\r\n
\r\n \r\n \r\n--===============9222421578986331565==--\r\n"}, {"email_from": "noreply@openmined.org", "email_to": ["admin@bigquery.org"], "email_content": "Content-Type: multipart/alternative; boundary=\"===============4255237758205268447==\"\r\nMIME-Version: 1.0\r\nFrom: noreply@openmined.org\r\nTo: admin@bigquery.org\r\nSubject: Datasite bigquery-high: A New Request (b9d5) has been received!\r\n\r\n--===============4255237758205268447==\r\nContent-Type: text/html; charset=\"us-ascii\"\r\nMIME-Version: 1.0\r\nContent-Transfer-Encoding: 7bit\r\n\r\n\r\n \r\n Access Request Notification\r\n \r\n \r\n \r\n
\r\n
\r\n Request Notification\r\n
\r\n
\r\n

Hello,

\r\n

A new request has been submitted and requires your attention.\r\n Please review the details below:

\r\n\r\n
\r\n
Request Details
\r\n
\r\n\r\n

ID: b9d5af221e014cf8824babdb984a8f4e

\r\n

\r\n Submitted By:\r\n Lisa Guerra\r\n

\r\n

Date: 2024-09-23 07:33:25

\r\n

Status:

\r\n PENDING\r\n
\r\n

Changes:\r\n UserCodeStatusChange\r\n

\r\n\r\n

Use:
\r\n \r\n request = client.api.services.request.get_by_uid(uid=sy.UID(\"b9d5af221e014cf8824babdb984a8f4e\"))\r\n
\r\n to get this specific request.\r\n

\r\n\r\n

Or you can view all requests with:
\r\n \r\n client.requests\r\n \r\n

\r\n\r\n
\r\n
\r\n

If you did not expect this request or have concerns about it,\r\n please contact our support team immediately.

\r\n
\r\n
\r\n This is an automated message, please do not reply directly to this email.
\r\n For assistance, please contact our support team.\r\n
\r\n
\r\n \r\n \r\n--===============4255237758205268447==--\r\n"}, {"email_from": "noreply@openmined.org", "email_to": ["admin@bigquery.org"], "email_content": "Content-Type: multipart/alternative; boundary=\"===============3781529602699007377==\"\r\nMIME-Version: 1.0\r\nFrom: noreply@openmined.org\r\nTo: admin@bigquery.org\r\nSubject: Datasite bigquery-high: A New Request (a6b1) has been received!\r\n\r\n--===============3781529602699007377==\r\nContent-Type: text/html; charset=\"us-ascii\"\r\nMIME-Version: 1.0\r\nContent-Transfer-Encoding: 7bit\r\n\r\n\r\n \r\n Access Request Notification\r\n \r\n \r\n \r\n
\r\n
\r\n Request Notification\r\n
\r\n
\r\n

Hello,

\r\n

A new request has been submitted and requires your attention.\r\n Please review the details below:

\r\n\r\n
\r\n
Request Details
\r\n
\r\n\r\n

ID: a6b1b9b9723d4d67b95924b40c963226

\r\n

\r\n Submitted By:\r\n Arthur Smith\r\n

\r\n

Date: 2024-09-23 07:33:34

\r\n

Status:

\r\n PENDING\r\n
\r\n

Changes:\r\n UserCodeStatusChange\r\n

\r\n\r\n

Use:
\r\n \r\n request = client.api.services.request.get_by_uid(uid=sy.UID(\"a6b1b9b9723d4d67b95924b40c963226\"))\r\n
\r\n to get this specific request.\r\n

\r\n\r\n

Or you can view all requests with:
\r\n \r\n client.requests\r\n \r\n

\r\n\r\n
\r\n
\r\n

If you did not expect this request or have concerns about it,\r\n please contact our support team immediately.

\r\n
\r\n
\r\n This is an automated message, please do not reply directly to this email.
\r\n For assistance, please contact our support team.\r\n
\r\n
\r\n \r\n \r\n--===============3781529602699007377==--\r\n"}, {"email_from": "noreply@openmined.org", "email_to": ["admin@bigquery.org"], "email_content": "Content-Type: multipart/alternative; boundary=\"===============7329781531780921231==\"\r\nMIME-Version: 1.0\r\nFrom: noreply@openmined.org\r\nTo: admin@bigquery.org\r\nSubject: Datasite bigquery-high: A New Request (bd99) has been received!\r\n\r\n--===============7329781531780921231==\r\nContent-Type: text/html; charset=\"us-ascii\"\r\nMIME-Version: 1.0\r\nContent-Transfer-Encoding: 7bit\r\n\r\n\r\n \r\n Access Request Notification\r\n \r\n \r\n \r\n
\r\n
\r\n Request Notification\r\n
\r\n
\r\n

Hello,

\r\n

A new request has been submitted and requires your attention.\r\n Please review the details below:

\r\n\r\n
\r\n
Request Details
\r\n
\r\n\r\n

ID: bd992c2c84c7431c90ecb27881e159ab

\r\n

\r\n Submitted By:\r\n Noah Hinton\r\n

\r\n

Date: 2024-09-23 07:33:43

\r\n

Status:

\r\n PENDING\r\n
\r\n

Changes:\r\n UserCodeStatusChange\r\n

\r\n\r\n

Use:
\r\n \r\n request = client.api.services.request.get_by_uid(uid=sy.UID(\"bd992c2c84c7431c90ecb27881e159ab\"))\r\n
\r\n to get this specific request.\r\n

\r\n\r\n

Or you can view all requests with:
\r\n \r\n client.requests\r\n \r\n

\r\n\r\n
\r\n
\r\n

If you did not expect this request or have concerns about it,\r\n please contact our support team immediately.

\r\n
\r\n
\r\n This is an automated message, please do not reply directly to this email.
\r\n For assistance, please contact our support team.\r\n
\r\n
\r\n \r\n \r\n--===============7329781531780921231==--\r\n"}, {"email_from": "noreply@openmined.org", "email_to": ["admin@bigquery.org"], "email_content": "Content-Type: multipart/alternative; boundary=\"===============5392983222642902852==\"\r\nMIME-Version: 1.0\r\nFrom: noreply@openmined.org\r\nTo: admin@bigquery.org\r\nSubject: Datasite bigquery-high: A New Request (27cc) has been received!\r\n\r\n--===============5392983222642902852==\r\nContent-Type: text/html; charset=\"us-ascii\"\r\nMIME-Version: 1.0\r\nContent-Transfer-Encoding: 7bit\r\n\r\n\r\n \r\n Access Request Notification\r\n \r\n \r\n \r\n
\r\n
\r\n Request Notification\r\n
\r\n
\r\n

Hello,

\r\n

A new request has been submitted and requires your attention.\r\n Please review the details below:

\r\n\r\n
\r\n
Request Details
\r\n
\r\n\r\n

ID: 27ccfb2a92964c169e32f0e2e1fb2b3f

\r\n

\r\n Submitted By:\r\n Samantha Heath\r\n

\r\n

Date: 2024-09-23 07:33:53

\r\n

Status:

\r\n PENDING\r\n
\r\n

Changes:\r\n UserCodeStatusChange\r\n

\r\n\r\n

Use:
\r\n \r\n request = client.api.services.request.get_by_uid(uid=sy.UID(\"27ccfb2a92964c169e32f0e2e1fb2b3f\"))\r\n
\r\n to get this specific request.\r\n

\r\n\r\n

Or you can view all requests with:
\r\n \r\n client.requests\r\n \r\n

\r\n\r\n
\r\n
\r\n

If you did not expect this request or have concerns about it,\r\n please contact our support team immediately.

\r\n
\r\n
\r\n This is an automated message, please do not reply directly to this email.
\r\n For assistance, please contact our support team.\r\n
\r\n
\r\n \r\n \r\n--===============5392983222642902852==--\r\n"}, {"email_from": "noreply@openmined.org", "email_to": ["admin@bigquery.org"], "email_content": "Content-Type: multipart/alternative; boundary=\"===============0608366424911457624==\"\r\nMIME-Version: 1.0\r\nFrom: noreply@openmined.org\r\nTo: admin@bigquery.org\r\nSubject: Datasite bigquery-high: A New Request (69fd) has been received!\r\n\r\n--===============0608366424911457624==\r\nContent-Type: text/html; charset=\"us-ascii\"\r\nMIME-Version: 1.0\r\nContent-Transfer-Encoding: 7bit\r\n\r\n\r\n \r\n Access Request Notification\r\n \r\n \r\n \r\n
\r\n
\r\n Request Notification\r\n
\r\n
\r\n

Hello,

\r\n

A new request has been submitted and requires your attention.\r\n Please review the details below:

\r\n\r\n
\r\n
Request Details
\r\n
\r\n\r\n

ID: 69fdb8cca5ed412c944dae63d58fac74

\r\n

\r\n Submitted By:\r\n Eric Morales\r\n

\r\n

Date: 2024-09-23 07:34:02

\r\n

Status:

\r\n PENDING\r\n
\r\n

Changes:\r\n UserCodeStatusChange\r\n

\r\n\r\n

Use:
\r\n \r\n request = client.api.services.request.get_by_uid(uid=sy.UID(\"69fdb8cca5ed412c944dae63d58fac74\"))\r\n
\r\n to get this specific request.\r\n

\r\n\r\n

Or you can view all requests with:
\r\n \r\n client.requests\r\n \r\n

\r\n\r\n
\r\n
\r\n

If you did not expect this request or have concerns about it,\r\n please contact our support team immediately.

\r\n
\r\n
\r\n This is an automated message, please do not reply directly to this email.
\r\n For assistance, please contact our support team.\r\n
\r\n
\r\n \r\n \r\n--===============0608366424911457624==--\r\n"}], "noah-hinton-fake@openmined.org": [{"email_from": "noreply@openmined.org", "email_to": ["noah-hinton-fake@openmined.org"], "email_content": "Content-Type: multipart/alternative; boundary=\"===============4668612500231942150==\"\r\nMIME-Version: 1.0\r\nFrom: noreply@openmined.org\r\nTo: noah-hinton-fake@openmined.org\r\nSubject: Datasite bigquery-high: Your request (5dca) has been approved. \r\n\r\n--===============4668612500231942150==\r\nContent-Type: text/html; charset=\"us-ascii\"\r\nMIME-Version: 1.0\r\nContent-Transfer-Encoding: 7bit\r\n\r\n\r\n \r\n Access Request Notification\r\n \r\n \r\n \r\n
\r\n
\r\n Request Notification\r\n
\r\n
\r\n

Hello,

\r\n

The status of your recent request has been updated.\r\n Below is the latest information regarding it:

\r\n\r\n
\r\n
Request Details
\r\n
\r\n\r\n

ID: 5dcabc08b92d40729cccf97c6f91dc58

\r\n

\r\n Submitted By:\r\n Noah Hinton noah-hinton-fake@openmined.org\r\n

\r\n

Date: 2024-09-23 07:32:56

\r\n

Status:

\r\n APPROVED\r\n
\r\n

\r\n Changes:\r\n UserCodeStatusChange\r\n

\r\n\r\n

Use:
\r\n \r\n request = client.api.services.request.get_by_uid(uid=sy.UID(\"5dcabc08b92d40729cccf97c6f91dc58\"))\r\n
\r\n to get this specific request.\r\n

\r\n\r\n

Or you can view all requests with:
\r\n \r\n client.requests\r\n \r\n

\r\n
\r\n
\r\n

If you did not expect this request or have concerns about it,\r\n please contact our support team immediately.

\r\n
\r\n
\r\n This is an automated message, please do not reply directly to this email.
\r\n For assistance, please contact our support team.\r\n
\r\n
\r\n \r\n \r\n--===============4668612500231942150==--\r\n"}, {"email_from": "noreply@openmined.org", "email_to": ["noah-hinton-fake@openmined.org"], "email_content": "Content-Type: multipart/alternative; boundary=\"===============1664426106479672062==\"\r\nMIME-Version: 1.0\r\nFrom: noreply@openmined.org\r\nTo: noah-hinton-fake@openmined.org\r\nSubject: Datasite bigquery-high: Your request (5dca) has been approved. \r\n\r\n--===============1664426106479672062==\r\nContent-Type: text/html; charset=\"us-ascii\"\r\nMIME-Version: 1.0\r\nContent-Transfer-Encoding: 7bit\r\n\r\n\r\n \r\n Access Request Notification\r\n \r\n \r\n \r\n
\r\n
\r\n Request Notification\r\n
\r\n
\r\n

Hello,

\r\n

The status of your recent request has been updated.\r\n Below is the latest information regarding it:

\r\n\r\n
\r\n
Request Details
\r\n
\r\n\r\n

ID: 5dcabc08b92d40729cccf97c6f91dc58

\r\n

\r\n Submitted By:\r\n Noah Hinton noah-hinton-fake@openmined.org\r\n

\r\n

Date: 2024-09-23 07:32:56

\r\n

Status:

\r\n APPROVED\r\n
\r\n

\r\n Changes:\r\n UserCodeStatusChange,ActionStoreChange\r\n

\r\n\r\n

Use:
\r\n \r\n request = client.api.services.request.get_by_uid(uid=sy.UID(\"5dcabc08b92d40729cccf97c6f91dc58\"))\r\n
\r\n to get this specific request.\r\n

\r\n\r\n

Or you can view all requests with:
\r\n \r\n client.requests\r\n \r\n

\r\n
\r\n
\r\n

If you did not expect this request or have concerns about it,\r\n please contact our support team immediately.

\r\n
\r\n
\r\n This is an automated message, please do not reply directly to this email.
\r\n For assistance, please contact our support team.\r\n
\r\n
\r\n \r\n \r\n--===============1664426106479672062==--\r\n"}, {"email_from": "noreply@openmined.org", "email_to": ["noah-hinton-fake@openmined.org"], "email_content": "Content-Type: multipart/alternative; boundary=\"===============7140248350771488465==\"\r\nMIME-Version: 1.0\r\nFrom: noreply@openmined.org\r\nTo: noah-hinton-fake@openmined.org\r\nSubject: Datasite bigquery-high: Your request (bd99) has been denied. \r\n\r\n--===============7140248350771488465==\r\nContent-Type: text/html; charset=\"us-ascii\"\r\nMIME-Version: 1.0\r\nContent-Transfer-Encoding: 7bit\r\n\r\n\r\n \r\n Access Request Notification\r\n \r\n \r\n \r\n
\r\n
\r\n Request Notification\r\n
\r\n
\r\n

Hello,

\r\n

The status of your recent request has been updated.\r\n Below is the latest information regarding it:

\r\n\r\n
\r\n
Request Details
\r\n
\r\n\r\n

ID: bd992c2c84c7431c90ecb27881e159ab

\r\n

\r\n Submitted By:\r\n Noah Hinton noah-hinton-fake@openmined.org\r\n

\r\n

Date: 2024-09-23 07:33:43

\r\n

Status:

\r\n REJECTED\r\n
\r\n

\r\n Changes:\r\n UserCodeStatusChange\r\n

\r\n\r\n

Use:
\r\n \r\n request = client.api.services.request.get_by_uid(uid=sy.UID(\"bd992c2c84c7431c90ecb27881e159ab\"))\r\n
\r\n to get this specific request.\r\n

\r\n\r\n

Or you can view all requests with:
\r\n \r\n client.requests\r\n \r\n

\r\n
\r\n
\r\n

If you did not expect this request or have concerns about it,\r\n please contact our support team immediately.

\r\n
\r\n
\r\n This is an automated message, please do not reply directly to this email.
\r\n For assistance, please contact our support team.\r\n
\r\n
\r\n \r\n \r\n--===============7140248350771488465==--\r\n"}], "samantha-heath-fake@openmined.org": [{"email_from": "noreply@openmined.org", "email_to": ["samantha-heath-fake@openmined.org"], "email_content": "Content-Type: multipart/alternative; boundary=\"===============7097352730176798952==\"\r\nMIME-Version: 1.0\r\nFrom: noreply@openmined.org\r\nTo: samantha-heath-fake@openmined.org\r\nSubject: Datasite bigquery-high: Your request (3bb3) has been approved. \r\n\r\n--===============7097352730176798952==\r\nContent-Type: text/html; charset=\"us-ascii\"\r\nMIME-Version: 1.0\r\nContent-Transfer-Encoding: 7bit\r\n\r\n\r\n \r\n Access Request Notification\r\n \r\n \r\n \r\n
\r\n
\r\n Request Notification\r\n
\r\n
\r\n

Hello,

\r\n

The status of your recent request has been updated.\r\n Below is the latest information regarding it:

\r\n\r\n
\r\n
Request Details
\r\n
\r\n\r\n

ID: 3bb36547478f4ca7b6d081cda33473b7

\r\n

\r\n Submitted By:\r\n Samantha Heath samantha-heath-fake@openmined.org\r\n

\r\n

Date: 2024-09-23 07:33:05

\r\n

Status:

\r\n APPROVED\r\n
\r\n

\r\n Changes:\r\n UserCodeStatusChange\r\n

\r\n\r\n

Use:
\r\n \r\n request = client.api.services.request.get_by_uid(uid=sy.UID(\"3bb36547478f4ca7b6d081cda33473b7\"))\r\n
\r\n to get this specific request.\r\n

\r\n\r\n

Or you can view all requests with:
\r\n \r\n client.requests\r\n \r\n

\r\n
\r\n
\r\n

If you did not expect this request or have concerns about it,\r\n please contact our support team immediately.

\r\n
\r\n
\r\n This is an automated message, please do not reply directly to this email.
\r\n For assistance, please contact our support team.\r\n
\r\n
\r\n \r\n \r\n--===============7097352730176798952==--\r\n"}, {"email_from": "noreply@openmined.org", "email_to": ["samantha-heath-fake@openmined.org"], "email_content": "Content-Type: multipart/alternative; boundary=\"===============5440376299438389997==\"\r\nMIME-Version: 1.0\r\nFrom: noreply@openmined.org\r\nTo: samantha-heath-fake@openmined.org\r\nSubject: Datasite bigquery-high: Your request (3bb3) has been approved. \r\n\r\n--===============5440376299438389997==\r\nContent-Type: text/html; charset=\"us-ascii\"\r\nMIME-Version: 1.0\r\nContent-Transfer-Encoding: 7bit\r\n\r\n\r\n \r\n Access Request Notification\r\n \r\n \r\n \r\n
\r\n
\r\n Request Notification\r\n
\r\n
\r\n

Hello,

\r\n

The status of your recent request has been updated.\r\n Below is the latest information regarding it:

\r\n\r\n
\r\n
Request Details
\r\n
\r\n\r\n

ID: 3bb36547478f4ca7b6d081cda33473b7

\r\n

\r\n Submitted By:\r\n Samantha Heath samantha-heath-fake@openmined.org\r\n

\r\n

Date: 2024-09-23 07:33:05

\r\n

Status:

\r\n APPROVED\r\n
\r\n

\r\n Changes:\r\n UserCodeStatusChange,ActionStoreChange\r\n

\r\n\r\n

Use:
\r\n \r\n request = client.api.services.request.get_by_uid(uid=sy.UID(\"3bb36547478f4ca7b6d081cda33473b7\"))\r\n
\r\n to get this specific request.\r\n

\r\n\r\n

Or you can view all requests with:
\r\n \r\n client.requests\r\n \r\n

\r\n
\r\n
\r\n

If you did not expect this request or have concerns about it,\r\n please contact our support team immediately.

\r\n
\r\n
\r\n This is an automated message, please do not reply directly to this email.
\r\n For assistance, please contact our support team.\r\n
\r\n
\r\n \r\n \r\n--===============5440376299438389997==--\r\n"}, {"email_from": "noreply@openmined.org", "email_to": ["samantha-heath-fake@openmined.org"], "email_content": "Content-Type: multipart/alternative; boundary=\"===============3256986251927753339==\"\r\nMIME-Version: 1.0\r\nFrom: noreply@openmined.org\r\nTo: samantha-heath-fake@openmined.org\r\nSubject: Datasite bigquery-high: Your request (27cc) has been denied. \r\n\r\n--===============3256986251927753339==\r\nContent-Type: text/html; charset=\"us-ascii\"\r\nMIME-Version: 1.0\r\nContent-Transfer-Encoding: 7bit\r\n\r\n\r\n \r\n Access Request Notification\r\n \r\n \r\n \r\n
\r\n
\r\n Request Notification\r\n
\r\n
\r\n

Hello,

\r\n

The status of your recent request has been updated.\r\n Below is the latest information regarding it:

\r\n\r\n
\r\n
Request Details
\r\n
\r\n\r\n

ID: 27ccfb2a92964c169e32f0e2e1fb2b3f

\r\n

\r\n Submitted By:\r\n Samantha Heath samantha-heath-fake@openmined.org\r\n

\r\n

Date: 2024-09-23 07:33:53

\r\n

Status:

\r\n REJECTED\r\n
\r\n

\r\n Changes:\r\n UserCodeStatusChange\r\n

\r\n\r\n

Use:
\r\n \r\n request = client.api.services.request.get_by_uid(uid=sy.UID(\"27ccfb2a92964c169e32f0e2e1fb2b3f\"))\r\n
\r\n to get this specific request.\r\n

\r\n\r\n

Or you can view all requests with:
\r\n \r\n client.requests\r\n \r\n

\r\n
\r\n
\r\n

If you did not expect this request or have concerns about it,\r\n please contact our support team immediately.

\r\n
\r\n
\r\n This is an automated message, please do not reply directly to this email.
\r\n For assistance, please contact our support team.\r\n
\r\n
\r\n \r\n \r\n--===============3256986251927753339==--\r\n"}], "eric-morales-fake@openmined.org": [{"email_from": "noreply@openmined.org", "email_to": ["eric-morales-fake@openmined.org"], "email_content": "Content-Type: multipart/alternative; boundary=\"===============3614199994398570752==\"\r\nMIME-Version: 1.0\r\nFrom: noreply@openmined.org\r\nTo: eric-morales-fake@openmined.org\r\nSubject: Datasite bigquery-high: Your request (34e2) has been approved. \r\n\r\n--===============3614199994398570752==\r\nContent-Type: text/html; charset=\"us-ascii\"\r\nMIME-Version: 1.0\r\nContent-Transfer-Encoding: 7bit\r\n\r\n\r\n \r\n Access Request Notification\r\n \r\n \r\n \r\n
\r\n
\r\n Request Notification\r\n
\r\n
\r\n

Hello,

\r\n

The status of your recent request has been updated.\r\n Below is the latest information regarding it:

\r\n\r\n
\r\n
Request Details
\r\n
\r\n\r\n

ID: 34e25431aeab460cb53c94f4b31411e3

\r\n

\r\n Submitted By:\r\n Eric Morales eric-morales-fake@openmined.org\r\n

\r\n

Date: 2024-09-23 07:33:15

\r\n

Status:

\r\n APPROVED\r\n
\r\n

\r\n Changes:\r\n UserCodeStatusChange\r\n

\r\n\r\n

Use:
\r\n \r\n request = client.api.services.request.get_by_uid(uid=sy.UID(\"34e25431aeab460cb53c94f4b31411e3\"))\r\n
\r\n to get this specific request.\r\n

\r\n\r\n

Or you can view all requests with:
\r\n \r\n client.requests\r\n \r\n

\r\n
\r\n
\r\n

If you did not expect this request or have concerns about it,\r\n please contact our support team immediately.

\r\n
\r\n
\r\n This is an automated message, please do not reply directly to this email.
\r\n For assistance, please contact our support team.\r\n
\r\n
\r\n \r\n \r\n--===============3614199994398570752==--\r\n"}, {"email_from": "noreply@openmined.org", "email_to": ["eric-morales-fake@openmined.org"], "email_content": "Content-Type: multipart/alternative; boundary=\"===============6923180737459966315==\"\r\nMIME-Version: 1.0\r\nFrom: noreply@openmined.org\r\nTo: eric-morales-fake@openmined.org\r\nSubject: Datasite bigquery-high: Your request (69fd) has been approved. \r\n\r\n--===============6923180737459966315==\r\nContent-Type: text/html; charset=\"us-ascii\"\r\nMIME-Version: 1.0\r\nContent-Transfer-Encoding: 7bit\r\n\r\n\r\n \r\n Access Request Notification\r\n \r\n \r\n \r\n
\r\n
\r\n Request Notification\r\n
\r\n
\r\n

Hello,

\r\n

The status of your recent request has been updated.\r\n Below is the latest information regarding it:

\r\n\r\n
\r\n
Request Details
\r\n
\r\n\r\n

ID: 69fdb8cca5ed412c944dae63d58fac74

\r\n

\r\n Submitted By:\r\n Eric Morales eric-morales-fake@openmined.org\r\n

\r\n

Date: 2024-09-23 07:34:02

\r\n

Status:

\r\n APPROVED\r\n
\r\n

\r\n Changes:\r\n UserCodeStatusChange\r\n

\r\n\r\n

Use:
\r\n \r\n request = client.api.services.request.get_by_uid(uid=sy.UID(\"69fdb8cca5ed412c944dae63d58fac74\"))\r\n
\r\n to get this specific request.\r\n

\r\n\r\n

Or you can view all requests with:
\r\n \r\n client.requests\r\n \r\n

\r\n
\r\n
\r\n

If you did not expect this request or have concerns about it,\r\n please contact our support team immediately.

\r\n
\r\n
\r\n This is an automated message, please do not reply directly to this email.
\r\n For assistance, please contact our support team.\r\n
\r\n
\r\n \r\n \r\n--===============6923180737459966315==--\r\n"}], "lisa-guerra-fake@openmined.org": [{"email_from": "noreply@openmined.org", "email_to": ["lisa-guerra-fake@openmined.org"], "email_content": "Content-Type: multipart/alternative; boundary=\"===============2846955048916211996==\"\r\nMIME-Version: 1.0\r\nFrom: noreply@openmined.org\r\nTo: lisa-guerra-fake@openmined.org\r\nSubject: Datasite bigquery-high: Your request (b9d5) has been approved. \r\n\r\n--===============2846955048916211996==\r\nContent-Type: text/html; charset=\"us-ascii\"\r\nMIME-Version: 1.0\r\nContent-Transfer-Encoding: 7bit\r\n\r\n\r\n \r\n Access Request Notification\r\n \r\n \r\n \r\n
\r\n
\r\n Request Notification\r\n
\r\n
\r\n

Hello,

\r\n

The status of your recent request has been updated.\r\n Below is the latest information regarding it:

\r\n\r\n
\r\n
Request Details
\r\n
\r\n\r\n

ID: b9d5af221e014cf8824babdb984a8f4e

\r\n

\r\n Submitted By:\r\n Lisa Guerra lisa-guerra-fake@openmined.org\r\n

\r\n

Date: 2024-09-23 07:33:25

\r\n

Status:

\r\n APPROVED\r\n
\r\n

\r\n Changes:\r\n UserCodeStatusChange\r\n

\r\n\r\n

Use:
\r\n \r\n request = client.api.services.request.get_by_uid(uid=sy.UID(\"b9d5af221e014cf8824babdb984a8f4e\"))\r\n
\r\n to get this specific request.\r\n

\r\n\r\n

Or you can view all requests with:
\r\n \r\n client.requests\r\n \r\n

\r\n
\r\n
\r\n

If you did not expect this request or have concerns about it,\r\n please contact our support team immediately.

\r\n
\r\n
\r\n This is an automated message, please do not reply directly to this email.
\r\n For assistance, please contact our support team.\r\n
\r\n
\r\n \r\n \r\n--===============2846955048916211996==--\r\n"}, {"email_from": "noreply@openmined.org", "email_to": ["lisa-guerra-fake@openmined.org"], "email_content": "Content-Type: multipart/alternative; boundary=\"===============9198847279829977146==\"\r\nMIME-Version: 1.0\r\nFrom: noreply@openmined.org\r\nTo: lisa-guerra-fake@openmined.org\r\nSubject: Datasite bigquery-high: Your request (b9d5) has been approved. \r\n\r\n--===============9198847279829977146==\r\nContent-Type: text/html; charset=\"us-ascii\"\r\nMIME-Version: 1.0\r\nContent-Transfer-Encoding: 7bit\r\n\r\n\r\n \r\n Access Request Notification\r\n \r\n \r\n \r\n
\r\n
\r\n Request Notification\r\n
\r\n
\r\n

Hello,

\r\n

The status of your recent request has been updated.\r\n Below is the latest information regarding it:

\r\n\r\n
\r\n
Request Details
\r\n
\r\n\r\n

ID: b9d5af221e014cf8824babdb984a8f4e

\r\n

\r\n Submitted By:\r\n Lisa Guerra lisa-guerra-fake@openmined.org\r\n

\r\n

Date: 2024-09-23 07:33:25

\r\n

Status:

\r\n APPROVED\r\n
\r\n

\r\n Changes:\r\n UserCodeStatusChange,ActionStoreChange\r\n

\r\n\r\n

Use:
\r\n \r\n request = client.api.services.request.get_by_uid(uid=sy.UID(\"b9d5af221e014cf8824babdb984a8f4e\"))\r\n
\r\n to get this specific request.\r\n

\r\n\r\n

Or you can view all requests with:
\r\n \r\n client.requests\r\n \r\n

\r\n
\r\n
\r\n

If you did not expect this request or have concerns about it,\r\n please contact our support team immediately.

\r\n
\r\n
\r\n This is an automated message, please do not reply directly to this email.
\r\n For assistance, please contact our support team.\r\n
\r\n
\r\n \r\n \r\n--===============9198847279829977146==--\r\n"}]} \ No newline at end of file diff --git a/notebooks/scenarios/bigquery/upgradability/0.9.1_notebooks/jobs.json b/notebooks/scenarios/bigquery/upgradability/0.9.1_notebooks/jobs.json index cf81e4a302d..b5e11c28c12 100644 --- a/notebooks/scenarios/bigquery/upgradability/0.9.1_notebooks/jobs.json +++ b/notebooks/scenarios/bigquery/upgradability/0.9.1_notebooks/jobs.json @@ -1 +1 @@ -{"michelle-smith-fake@openmined.org": [{"user_email": "michelle-smith-fake@openmined.org", "func_name": "simple_query_5299ff", "query": "SELECT table_id, AVG(colname) AS average_score\n FROM dataset_2.table_1\n GROUP BY table_id\n LIMIT 746375", "job_type": "simple_query", "settings": {"dataset": "dataset_2", "table": "table_1", "groupby_col": "table_id", "score_col": "colname", "limit": 746375}, "should_succeed": true, "should_submit": true, "code_path": "simple_query_5299ff", "admin_reviewed": true, "result_as_expected": true}, {"user_email": "michelle-smith-fake@openmined.org", "func_name": "simple_query_2adbbc", "query": "SELECT table_id, AVG(colname) AS average_score\n FROM dataset_1.table_1\n GROUP BY table_id\n LIMIT 389119", "job_type": "simple_query", "settings": {"dataset": "dataset_1", "table": "table_1", "groupby_col": "table_id", "score_col": "colname", "limit": 389119}, "should_succeed": true, "should_submit": true, "code_path": "simple_query_2adbbc", "admin_reviewed": true, "result_as_expected": true}], "james-hardin-fake@openmined.org": [{"user_email": "james-hardin-fake@openmined.org", "func_name": "simple_query_3e4e37", "query": "SELECT table_id, AVG(colname) AS average_score\n FROM dataset_2.table_2\n GROUP BY table_id\n LIMIT 880480", "job_type": "simple_query", "settings": {"dataset": "dataset_2", "table": "table_2", "groupby_col": "table_id", "score_col": "colname", "limit": 880480}, "should_succeed": true, "should_submit": true, "code_path": "simple_query_3e4e37", "admin_reviewed": true, "result_as_expected": true}, {"user_email": "james-hardin-fake@openmined.org", "func_name": "wrong_syntax_query_153304", "query": "SELECT * FROM table INCORRECT SYNTAX", "job_type": "wrong_syntax_query", "settings": {}, "should_succeed": false, "should_submit": true, "code_path": "wrong_syntax_query_153304", "admin_reviewed": true, "result_as_expected": true}], "kirsten-jordan-fake@openmined.org": [{"user_email": "kirsten-jordan-fake@openmined.org", "func_name": "simple_query_c59b4f", "query": "SELECT table_id, AVG(colname) AS average_score\n FROM dataset_2.table_1\n GROUP BY table_id\n LIMIT 90068", "job_type": "simple_query", "settings": {"dataset": "dataset_2", "table": "table_1", "groupby_col": "table_id", "score_col": "colname", "limit": 90068}, "should_succeed": true, "should_submit": true, "code_path": "simple_query_c59b4f", "admin_reviewed": true, "result_as_expected": true}, {"user_email": "kirsten-jordan-fake@openmined.org", "func_name": "job_too_much_text_73d768", "query": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", "job_type": "job_too_much_text", "settings": {}, "should_succeed": false, "should_submit": true, "code_path": "job_too_much_text_73d768", "admin_reviewed": true, "result_as_expected": true}], "lisa-horton-fake@openmined.org": [{"user_email": "lisa-horton-fake@openmined.org", "func_name": "simple_query_b3e060", "query": "SELECT table_id, AVG(colname) AS average_score\n FROM dataset_1.table_2\n GROUP BY table_id\n LIMIT 440517", "job_type": "simple_query", "settings": {"dataset": "dataset_1", "table": "table_2", "groupby_col": "table_id", "score_col": "colname", "limit": 440517}, "should_succeed": true, "should_submit": true, "code_path": "simple_query_b3e060", "admin_reviewed": true, "result_as_expected": true}, {"user_email": "lisa-horton-fake@openmined.org", "func_name": "job_long_name_3779f7aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", "query": "SELECT table_id, AVG(colname) AS average_score\n FROM dataset_2.table_1\n GROUP BY table_id\n LIMIT 975362", "job_type": "job_long_name", "settings": {"dataset": "dataset_2", "table": "table_1", "groupby_col": "table_id", "score_col": "colname", "limit": 975362}, "should_succeed": true, "should_submit": true, "code_path": "job_long_name_3779f7aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", "admin_reviewed": true, "result_as_expected": true}], "bethany-salazar-fake@openmined.org": [{"user_email": "bethany-salazar-fake@openmined.org", "func_name": "simple_query_ea72bf", "query": "SELECT table_id, AVG(colname) AS average_score\n FROM dataset_1.table_2\n GROUP BY table_id\n LIMIT 30639", "job_type": "simple_query", "settings": {"dataset": "dataset_1", "table": "table_2", "groupby_col": "table_id", "score_col": "colname", "limit": 30639}, "should_succeed": true, "should_submit": true, "code_path": "simple_query_ea72bf", "admin_reviewed": true, "result_as_expected": true}, {"user_email": "bethany-salazar-fake@openmined.org", "func_name": "job_funcname_xss_3ca54f", "query": "SELECT table_id, AVG(colname) AS average_score\n FROM dataset_1.table_1\n GROUP BY table_id\n LIMIT 473825", "job_type": "job_funcname_xss", "settings": {"dataset": "dataset_1", "table": "table_1", "groupby_col": "table_id", "score_col": "colname", "limit": 473825}, "should_succeed": true, "should_submit": false, "code_path": null, "admin_reviewed": false, "result_as_expected": null}]} \ No newline at end of file +{"arthur-smith-fake@openmined.org": [{"user_email": "arthur-smith-fake@openmined.org", "func_name": "simple_query_d1e040", "query": "SELECT table_id, AVG(colname) AS average_score\n FROM dataset_1.table_2\n GROUP BY table_id\n LIMIT 670428", "job_type": "simple_query", "settings": {"dataset": "dataset_1", "table": "table_2", "groupby_col": "table_id", "score_col": "colname", "limit": 670428}, "should_succeed": true, "should_submit": true, "code_path": "simple_query_d1e040", "admin_reviewed": true, "result_as_expected": true}, {"user_email": "arthur-smith-fake@openmined.org", "func_name": "simple_query_6aa50c", "query": "SELECT table_id, AVG(colname) AS average_score\n FROM dataset_2.table_1\n GROUP BY table_id\n LIMIT 75871", "job_type": "simple_query", "settings": {"dataset": "dataset_2", "table": "table_1", "groupby_col": "table_id", "score_col": "colname", "limit": 75871}, "should_succeed": true, "should_submit": true, "code_path": "simple_query_6aa50c", "admin_reviewed": true, "result_as_expected": true}], "noah-hinton-fake@openmined.org": [{"user_email": "noah-hinton-fake@openmined.org", "func_name": "simple_query_912a15", "query": "SELECT table_id, AVG(colname) AS average_score\n FROM dataset_2.table_2\n GROUP BY table_id\n LIMIT 953272", "job_type": "simple_query", "settings": {"dataset": "dataset_2", "table": "table_2", "groupby_col": "table_id", "score_col": "colname", "limit": 953272}, "should_succeed": true, "should_submit": true, "code_path": "simple_query_912a15", "admin_reviewed": true, "result_as_expected": true}, {"user_email": "noah-hinton-fake@openmined.org", "func_name": "wrong_syntax_query_293ad3", "query": "SELECT * FROM table INCORRECT SYNTAX", "job_type": "wrong_syntax_query", "settings": {}, "should_succeed": false, "should_submit": true, "code_path": "wrong_syntax_query_293ad3", "admin_reviewed": true, "result_as_expected": true}], "samantha-heath-fake@openmined.org": [{"user_email": "samantha-heath-fake@openmined.org", "func_name": "simple_query_b82bd0", "query": "SELECT table_id, AVG(colname) AS average_score\n FROM dataset_1.table_1\n GROUP BY table_id\n LIMIT 620965", "job_type": "simple_query", "settings": {"dataset": "dataset_1", "table": "table_1", "groupby_col": "table_id", "score_col": "colname", "limit": 620965}, "should_succeed": true, "should_submit": true, "code_path": "simple_query_b82bd0", "admin_reviewed": true, "result_as_expected": true}, {"user_email": "samantha-heath-fake@openmined.org", "func_name": "job_too_much_text_9b550a", "query": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", "job_type": "job_too_much_text", "settings": {}, "should_succeed": false, "should_submit": true, "code_path": "job_too_much_text_9b550a", "admin_reviewed": true, "result_as_expected": true}], "eric-morales-fake@openmined.org": [{"user_email": "eric-morales-fake@openmined.org", "func_name": "simple_query_b81b03", "query": "SELECT table_id, AVG(colname) AS average_score\n FROM dataset_2.table_1\n GROUP BY table_id\n LIMIT 171829", "job_type": "simple_query", "settings": {"dataset": "dataset_2", "table": "table_1", "groupby_col": "table_id", "score_col": "colname", "limit": 171829}, "should_succeed": true, "should_submit": true, "code_path": "simple_query_b81b03", "admin_reviewed": true, "result_as_expected": true}, {"user_email": "eric-morales-fake@openmined.org", "func_name": "job_long_name_19baf0aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", "query": "SELECT table_id, AVG(colname) AS average_score\n FROM dataset_1.table_1\n GROUP BY table_id\n LIMIT 639608", "job_type": "job_long_name", "settings": {"dataset": "dataset_1", "table": "table_1", "groupby_col": "table_id", "score_col": "colname", "limit": 639608}, "should_succeed": true, "should_submit": true, "code_path": "job_long_name_19baf0aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", "admin_reviewed": true, "result_as_expected": true}], "lisa-guerra-fake@openmined.org": [{"user_email": "lisa-guerra-fake@openmined.org", "func_name": "simple_query_3ba857", "query": "SELECT table_id, AVG(colname) AS average_score\n FROM dataset_2.table_2\n GROUP BY table_id\n LIMIT 843394", "job_type": "simple_query", "settings": {"dataset": "dataset_2", "table": "table_2", "groupby_col": "table_id", "score_col": "colname", "limit": 843394}, "should_succeed": true, "should_submit": true, "code_path": "simple_query_3ba857", "admin_reviewed": true, "result_as_expected": true}, {"user_email": "lisa-guerra-fake@openmined.org", "func_name": "job_funcname_xss_2bf4e1", "query": "SELECT table_id, AVG(colname) AS average_score\n FROM dataset_1.table_1\n GROUP BY table_id\n LIMIT 778951", "job_type": "job_funcname_xss", "settings": {"dataset": "dataset_1", "table": "table_1", "groupby_col": "table_id", "score_col": "colname", "limit": 778951}, "should_succeed": true, "should_submit": false, "code_path": null, "admin_reviewed": false, "result_as_expected": null}]} \ No newline at end of file diff --git a/notebooks/scenarios/bigquery/upgradability/0.9.1_notebooks/users.json b/notebooks/scenarios/bigquery/upgradability/0.9.1_notebooks/users.json index be11a92ff9c..831deff3e90 100644 --- a/notebooks/scenarios/bigquery/upgradability/0.9.1_notebooks/users.json +++ b/notebooks/scenarios/bigquery/upgradability/0.9.1_notebooks/users.json @@ -1 +1 @@ -[{"name": "Michelle Smith", "email": "michelle-smith-fake@openmined.org", "password": "+4a0WFehH@", "role": "ServiceRole.DATA_SCIENTIST", "new_password": null, "email_disabled": true, "reset_password": false, "reset_token": null}, {"name": "James Hardin", "email": "james-hardin-fake@openmined.org", "password": "JRZupKig+5", "role": "ServiceRole.DATA_SCIENTIST", "new_password": null, "email_disabled": false, "reset_password": true, "reset_token": "LJvUBHAso6JS"}, {"name": "Kirsten Jordan", "email": "kirsten-jordan-fake@openmined.org", "password": "k@L5^JGsV%", "role": "ServiceRole.DATA_SCIENTIST", "new_password": null, "email_disabled": false, "reset_password": false, "reset_token": null}, {"name": "Lisa Horton", "email": "lisa-horton-fake@openmined.org", "password": "yUJB4Zud)N", "role": "ServiceRole.DATA_SCIENTIST", "new_password": null, "email_disabled": false, "reset_password": false, "reset_token": null}, {"name": "Bethany Salazar", "email": "bethany-salazar-fake@openmined.org", "password": "2^q5NaWpz4", "role": "ServiceRole.DATA_SCIENTIST", "new_password": null, "email_disabled": false, "reset_password": false, "reset_token": null}] \ No newline at end of file +[{"name": "Arthur Smith", "email": "arthur-smith-fake@openmined.org", "password": "@DP8JSytU^", "role": "ServiceRole.DATA_SCIENTIST", "new_password": null, "email_disabled": true, "reset_password": false, "reset_token": null}, {"name": "Noah Hinton", "email": "noah-hinton-fake@openmined.org", "password": "j)5S!RJvsl", "role": "ServiceRole.DATA_SCIENTIST", "new_password": null, "email_disabled": false, "reset_password": true, "reset_token": "ugpbqHrAwOQ7"}, {"name": "Samantha Heath", "email": "samantha-heath-fake@openmined.org", "password": "hI6OKBkfw%", "role": "ServiceRole.DATA_SCIENTIST", "new_password": null, "email_disabled": false, "reset_password": false, "reset_token": null}, {"name": "Eric Morales", "email": "eric-morales-fake@openmined.org", "password": "$+L*Z74f)2", "role": "ServiceRole.DATA_SCIENTIST", "new_password": null, "email_disabled": false, "reset_password": false, "reset_token": null}, {"name": "Lisa Guerra", "email": "lisa-guerra-fake@openmined.org", "password": "^DW28G^jW+", "role": "ServiceRole.DATA_SCIENTIST", "new_password": null, "email_disabled": false, "reset_password": false, "reset_token": null}] \ No newline at end of file diff --git a/notebooks/scenarios/bigquery/upgradability/2-migrate-for-scenarios.ipynb b/notebooks/scenarios/bigquery/upgradability/2-migrate-for-scenarios.ipynb index 9e6531d45e0..865921fc0b9 100644 --- a/notebooks/scenarios/bigquery/upgradability/2-migrate-for-scenarios.ipynb +++ b/notebooks/scenarios/bigquery/upgradability/2-migrate-for-scenarios.ipynb @@ -101,14 +101,15 @@ "text": [ "INFO: Will watch for changes in these directories: ['/home/teo/OpenMined/PySyft/packages/syft/src/syft']\n", "INFO: Uvicorn running on http://0.0.0.0:8080 (Press CTRL+C to quit)\n", - "INFO: Started reloader process [510073] using WatchFiles\n" + "INFO: Started reloader process [185565] using WatchFiles\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ - "Waiting for server to start..." + "Waiting for server to start...WARN: private key is based on server name: bigquery-high in dev_mode. Don't run this in production.\n", + "Using SQLiteDBConfig and sqlite:////tmp/syft/fbdf5a287e58454cbbd3fac4ad744d37/db/fbdf5a287e58454cbbd3fac4ad744d37_json.db\n" ] }, { @@ -122,16 +123,14 @@ "name": "stdout", "output_type": "stream", "text": [ - "WARN: private key is based on server name: bigquery-high in dev_mode. Don't run this in production.\n", - "Using SQLiteDBConfig and sqlite:////tmp/syft/fbdf5a287e58454cbbd3fac4ad744d37/db/fbdf5a287e58454cbbd3fac4ad744d37_json.db\n", - ".Adding producer for queue: api_call on: tcp://localhost:43423\n" + "Adding producer for queue: api_call on: tcp://localhost:57149\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ - "INFO: Started server process [510097]\n", + "INFO: Started server process [185617]\n", "INFO: Waiting for application startup.\n", "INFO: Application startup complete.\n" ] @@ -1836,13 +1835,7 @@ "name": "stderr", "output_type": "stream", "text": [ - "WARNING: WatchFiles detected changes in '/home/teo/OpenMined/PySyft/packages/syft/src/syft/store/sqlite_document_store.py', '/home/teo/OpenMined/PySyft/packages/syft/src/syft/util/notebook_ui/components/tabulator_template.py', '/home/teo/OpenMined/PySyft/packages/syft/src/syft/types/errors.py', '/home/teo/OpenMined/PySyft/packages/syft/src/syft/service/action/action_endpoint.py', '/home/teo/OpenMined/PySyft/packages/syft/src/syft/types/syft_object_registry.py'. Reloading...\n", - "WARNING: WatchFiles detected changes in '/home/teo/OpenMined/PySyft/packages/syft/src/syft/service/action/action_service.py', '/home/teo/OpenMined/PySyft/packages/syft/src/syft/protocol/data_protocol.py', '/home/teo/OpenMined/PySyft/packages/syft/src/syft/service/project/project.py', '/home/teo/OpenMined/PySyft/packages/syft/src/syft/client/registry.py', '/home/teo/OpenMined/PySyft/packages/syft/src/syft/types/syft_object.py', '/home/teo/OpenMined/PySyft/packages/syft/src/syft/store/kv_document_store.py', '/home/teo/OpenMined/PySyft/packages/syft/src/syft/store/db/stash.py'. Reloading...\n", - "WARNING: WatchFiles detected changes in '0.9.1_notebooks/010-setup-bigquery-pool7o29u_sq.py', 'sync/0.9.1_notebooks/03-ds-submit-request1hii6fj6.py', 'sync/0.9.1_notebooks/04-do-review-requestsmhu15iw2.py', 'sync/0.9.1_notebooks/02-configure-api-and-sync8xcxyi36.py', '0.9.1_notebooks/001-scale-delete-worker-poolsnb3gjot_.py', '2-migrate-for-scenarios58wcs16u.py', '0.9.1_notebooks/011-users-emails-passwordsc_t7o9i5.py', '0.9.1_notebooks/040-do-review-requests60u4fisw.py', '0.9.1_notebooks/000-start-and-configure-server-and-adminsjuu2kknp.py', '1-dump-database-to-filers27ez1t.py', 'sync/2-migrate-for-scenarios3k55tjwb.py', '0.9.1_notebooks/020-configure-api6veqcqhp.py', 'sync/1-dump-database-to-fileo3ka_8a4.py', 'sync/0.9.1_notebooks/01-setup-high-low-datasitesj96x0ujy.py', '0.9.1_notebooks/050-ds-get-results5g3e5sqr.py', 'sync/0.9.1_notebooks/05-ds-get-resultsvpyx_9fb.py', '0.9.1_notebooks/021-create-jobsfdihce8j.py'. Reloading...\n", - "WARNING: WatchFiles detected changes in '/home/teo/OpenMined/PySyft/packages/syft/src/syft/util/notebook_ui/components/tabulator_template.py', '/home/teo/OpenMined/PySyft/packages/syft/src/syft/types/errors.py', '/home/teo/OpenMined/PySyft/packages/syft/src/syft/protocol/data_protocol.py', '/home/teo/OpenMined/PySyft/packages/syft/src/syft/service/action/action_endpoint.py', '/home/teo/OpenMined/PySyft/packages/syft/src/syft/client/registry.py', '/home/teo/OpenMined/PySyft/packages/syft/src/syft/service/project/project.py', '/home/teo/OpenMined/PySyft/packages/syft/src/syft/service/action/action_service.py', '/home/teo/OpenMined/PySyft/packages/syft/src/syft/store/kv_document_store.py', '/home/teo/OpenMined/PySyft/packages/syft/src/syft/types/syft_object_registry.py', '/home/teo/OpenMined/PySyft/packages/syft/src/syft/types/syft_object.py', '/home/teo/OpenMined/PySyft/packages/syft/src/syft/store/sqlite_document_store.py', '/home/teo/OpenMined/PySyft/packages/syft/src/syft/store/db/stash.py'. Reloading...\n", - "WARNING: WatchFiles detected changes in '/home/teo/OpenMined/PySyft/packages/syft/src/syft/client/registry.py', '/home/teo/OpenMined/PySyft/packages/syft/src/syft/types/syft_object.py', '/home/teo/OpenMined/PySyft/packages/syft/src/syft/store/kv_document_store.py', '/home/teo/OpenMined/PySyft/packages/syft/src/syft/store/sqlite_document_store.py', '/home/teo/OpenMined/PySyft/packages/syft/src/syft/util/notebook_ui/components/tabulator_template.py', '/home/teo/OpenMined/PySyft/packages/syft/src/syft/types/errors.py', '/home/teo/OpenMined/PySyft/packages/syft/src/syft/protocol/data_protocol.py', '/home/teo/OpenMined/PySyft/packages/syft/src/syft/store/db/stash.py', '/home/teo/OpenMined/PySyft/packages/syft/src/syft/service/action/action_endpoint.py', '/home/teo/OpenMined/PySyft/packages/syft/src/syft/types/syft_object_registry.py'. Reloading...\n", - "WARNING: WatchFiles detected changes in '/home/teo/OpenMined/PySyft/packages/syft/src/syft/service/project/project.py', '/home/teo/OpenMined/PySyft/packages/syft/src/syft/service/action/action_service.py'. Reloading...\n", - "INFO: Stopping reloader process [510073]\n" + "INFO: Stopping reloader process [185565]\n" ] } ], @@ -1885,7 +1878,7 @@ "text/markdown": [ "```python\n", "class MigrationData:\n", - " id: str = 8681f30edbf645469ae962fc233a270e\n", + " id: str = 073e01d52b164605b4fd563142b74d9a\n", " server_uid: str = fbdf5a287e58454cbbd3fac4ad744d37\n", " root_verify_key: str = 1e5ec44a179d21e0a0721ea7a670b9875d3946c8604f4623903fcafafe03c8e7\n", " num_objects: str = 17\n", @@ -1940,7 +1933,7 @@ "name": "stdout", "output_type": "stream", "text": [ - "Loading migration data from /home/teo/OpenMined/PySyft/.tox/.tmp/migration/migration.blob\n" + "Loading migration data from /home/teo/OpenMined/PySyft/notebooks/scenarios/bigquery/upgradability/migration.blob\n" ] } ], @@ -2819,18 +2812,18 @@ "Migrating data for: SyftImageRegistry table to version 1\n", "Migrating data for: ExecutionOutput table to version 1\n", "Migrating data for: UserCodeStatusCollection table to version 1\n", - " #075b8b09a30f4d0e86eab5f942d931e7 already exists\n", + " #e0a9432112f448a7bcba97668f653b7a already exists\n", " #fbdf5a287e58454cbbd3fac4ad744d37 already exists\n", - " #e10182112aa44797ac8e848a36002f5e already exists\n", - " #71cce32533a84fe4ac7b2e55abbb1c57 already exists\n", - " #51fd98058777462083c9c7890dc244c1 already exists\n", - " #132fc0bcc67048278e1058a84ff8b4fd already exists\n", - " #916c1be78ba4477fb34ceff4d5aeba31 already exists\n", - " #d413b86849c845fd88512fbd6a4d5a91 already exists\n", - " #af4c17c76895448cbb39bac2162ad18d already exists\n", - " #05b78f27dbda4ceab16c9e84f9f5950d already exists\n", - " #44dbe5b4b51240c0a4637f8bbe9428f3 already exists\n", - " #1fdd0c5601a1432299c0995aba846a1d already exists\n", + " #75fa06708c1c45a2b395bb8c0da0d565 already exists\n", + " #d6303fdddb2a462c936a7a63dbbbe036 already exists\n", + " #16a926460dfb4e7ab9330abfccbf3cd8 already exists\n", + " #b68881d3c39c46bea9454a2f61d67444 already exists\n", + " #ae80caf01b83493ba13f1f9f0c834384 already exists\n", + " #625d9f0693d44b02a68f4f8e05294637 already exists\n", + " #d3569d8f10e14669b41576b18990b20f already exists\n", + " #600301f1a95b4e4586efefc9f5e108bf already exists\n", + " #6e10684e83f6442ba114c60f395f690e already exists\n", + " #3e71410324714497be75762283a8063a already exists\n", "Migrating data for: AnyActionObject table to version 1\n", "Migrating data for: PandasDataframeObject table to version 1\n", "Updating store metadata\n" @@ -4545,10 +4538,10 @@ " vertical-align: bottom;\n", "}\n", "\n", - "
SyftSuccess:
Dockerfile ID: 1e24a7c32d35460cbc44842f98f04781 successfully submitted.

" + "
SyftSuccess:
Dockerfile ID: 3aecb04de0d84dc2baf1cb8623919fca successfully submitted.

" ], "text/plain": [ - "SyftSuccess: Dockerfile ID: 1e24a7c32d35460cbc44842f98f04781 successfully submitted." + "SyftSuccess: Dockerfile ID: 3aecb04de0d84dc2baf1cb8623919fca successfully submitted." ] }, "metadata": {}, @@ -6233,7 +6226,7 @@ "/*# sourceMappingURL=tabulator_pysyft.min.css.map */\n", "\n", "\n", - "
\n", + "
\n", "\n", "
\n", "
\n", @@ -6246,16 +6239,16 @@ "
\n", "
\n", " \n", "
\n", "
\n", - "

Total: 0

\n", + "

Total: 0

\n", "
\n", "
\n", - "
\n", + "
\n", "\n", "", "query": "SELECT table_id, AVG(colname) AS average_score\n FROM dataset_1.table_1\n GROUP BY table_id\n LIMIT 778951", "job_type": "job_funcname_xss", "settings": {"dataset": "dataset_1", "table": "table_1", "groupby_col": "table_id", "score_col": "colname", "limit": 778951}, "should_succeed": true, "should_submit": false, "code_path": null, "admin_reviewed": false, "result_as_expected": null}]} \ No newline at end of file +{ + "arthur-smith-fake@openmined.org": [ + { + "user_email": "arthur-smith-fake@openmined.org", + "func_name": "simple_query_d1e040", + "query": "SELECT table_id, AVG(colname) AS average_score\n FROM dataset_1.table_2\n GROUP BY table_id\n LIMIT 670428", + "job_type": "simple_query", + "settings": { + "dataset": "dataset_1", + "table": "table_2", + "groupby_col": "table_id", + "score_col": "colname", + "limit": 670428 + }, + "should_succeed": true, + "should_submit": true, + "code_path": "simple_query_d1e040", + "admin_reviewed": true, + "result_as_expected": true + }, + { + "user_email": "arthur-smith-fake@openmined.org", + "func_name": "simple_query_6aa50c", + "query": "SELECT table_id, AVG(colname) AS average_score\n FROM dataset_2.table_1\n GROUP BY table_id\n LIMIT 75871", + "job_type": "simple_query", + "settings": { + "dataset": "dataset_2", + "table": "table_1", + "groupby_col": "table_id", + "score_col": "colname", + "limit": 75871 + }, + "should_succeed": true, + "should_submit": true, + "code_path": "simple_query_6aa50c", + "admin_reviewed": true, + "result_as_expected": true + } + ], + "noah-hinton-fake@openmined.org": [ + { + "user_email": "noah-hinton-fake@openmined.org", + "func_name": "simple_query_912a15", + "query": "SELECT table_id, AVG(colname) AS average_score\n FROM dataset_2.table_2\n GROUP BY table_id\n LIMIT 953272", + "job_type": "simple_query", + "settings": { + "dataset": "dataset_2", + "table": "table_2", + "groupby_col": "table_id", + "score_col": "colname", + "limit": 953272 + }, + "should_succeed": true, + "should_submit": true, + "code_path": "simple_query_912a15", + "admin_reviewed": true, + "result_as_expected": true + }, + { + "user_email": "noah-hinton-fake@openmined.org", + "func_name": "wrong_syntax_query_293ad3", + "query": "SELECT * FROM table INCORRECT SYNTAX", + "job_type": "wrong_syntax_query", + "settings": {}, + "should_succeed": false, + "should_submit": true, + "code_path": "wrong_syntax_query_293ad3", + "admin_reviewed": true, + "result_as_expected": true + } + ], + "samantha-heath-fake@openmined.org": [ + { + "user_email": "samantha-heath-fake@openmined.org", + "func_name": "simple_query_b82bd0", + "query": "SELECT table_id, AVG(colname) AS average_score\n FROM dataset_1.table_1\n GROUP BY table_id\n LIMIT 620965", + "job_type": "simple_query", + "settings": { + "dataset": "dataset_1", + "table": "table_1", + "groupby_col": "table_id", + "score_col": "colname", + "limit": 620965 + }, + "should_succeed": true, + "should_submit": true, + "code_path": "simple_query_b82bd0", + "admin_reviewed": true, + "result_as_expected": true + }, + { + "user_email": "samantha-heath-fake@openmined.org", + "func_name": "job_too_much_text_9b550a", + "query": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", + "job_type": "job_too_much_text", + "settings": {}, + "should_succeed": false, + "should_submit": true, + "code_path": "job_too_much_text_9b550a", + "admin_reviewed": true, + "result_as_expected": true + } + ], + "eric-morales-fake@openmined.org": [ + { + "user_email": "eric-morales-fake@openmined.org", + "func_name": "simple_query_b81b03", + "query": "SELECT table_id, AVG(colname) AS average_score\n FROM dataset_2.table_1\n GROUP BY table_id\n LIMIT 171829", + "job_type": "simple_query", + "settings": { + "dataset": "dataset_2", + "table": "table_1", + "groupby_col": "table_id", + "score_col": "colname", + "limit": 171829 + }, + "should_succeed": true, + "should_submit": true, + "code_path": "simple_query_b81b03", + "admin_reviewed": true, + "result_as_expected": true + }, + { + "user_email": "eric-morales-fake@openmined.org", + "func_name": "job_long_name_19baf0aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", + "query": "SELECT table_id, AVG(colname) AS average_score\n FROM dataset_1.table_1\n GROUP BY table_id\n LIMIT 639608", + "job_type": "job_long_name", + "settings": { + "dataset": "dataset_1", + "table": "table_1", + "groupby_col": "table_id", + "score_col": "colname", + "limit": 639608 + }, + "should_succeed": true, + "should_submit": true, + "code_path": "job_long_name_19baf0aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", + "admin_reviewed": true, + "result_as_expected": true + } + ], + "lisa-guerra-fake@openmined.org": [ + { + "user_email": "lisa-guerra-fake@openmined.org", + "func_name": "simple_query_3ba857", + "query": "SELECT table_id, AVG(colname) AS average_score\n FROM dataset_2.table_2\n GROUP BY table_id\n LIMIT 843394", + "job_type": "simple_query", + "settings": { + "dataset": "dataset_2", + "table": "table_2", + "groupby_col": "table_id", + "score_col": "colname", + "limit": 843394 + }, + "should_succeed": true, + "should_submit": true, + "code_path": "simple_query_3ba857", + "admin_reviewed": true, + "result_as_expected": true + }, + { + "user_email": "lisa-guerra-fake@openmined.org", + "func_name": "job_funcname_xss_2bf4e1", + "query": "SELECT table_id, AVG(colname) AS average_score\n FROM dataset_1.table_1\n GROUP BY table_id\n LIMIT 778951", + "job_type": "job_funcname_xss", + "settings": { + "dataset": "dataset_1", + "table": "table_1", + "groupby_col": "table_id", + "score_col": "colname", + "limit": 778951 + }, + "should_succeed": true, + "should_submit": false, + "code_path": null, + "admin_reviewed": false, + "result_as_expected": null + } + ] +} diff --git a/notebooks/scenarios/bigquery/upgradability/0.9.1_notebooks/users.json b/notebooks/scenarios/bigquery/upgradability/0.9.1_notebooks/users.json index 831deff3e90..13e7908e069 100644 --- a/notebooks/scenarios/bigquery/upgradability/0.9.1_notebooks/users.json +++ b/notebooks/scenarios/bigquery/upgradability/0.9.1_notebooks/users.json @@ -1 +1,52 @@ -[{"name": "Arthur Smith", "email": "arthur-smith-fake@openmined.org", "password": "@DP8JSytU^", "role": "ServiceRole.DATA_SCIENTIST", "new_password": null, "email_disabled": true, "reset_password": false, "reset_token": null}, {"name": "Noah Hinton", "email": "noah-hinton-fake@openmined.org", "password": "j)5S!RJvsl", "role": "ServiceRole.DATA_SCIENTIST", "new_password": null, "email_disabled": false, "reset_password": true, "reset_token": "ugpbqHrAwOQ7"}, {"name": "Samantha Heath", "email": "samantha-heath-fake@openmined.org", "password": "hI6OKBkfw%", "role": "ServiceRole.DATA_SCIENTIST", "new_password": null, "email_disabled": false, "reset_password": false, "reset_token": null}, {"name": "Eric Morales", "email": "eric-morales-fake@openmined.org", "password": "$+L*Z74f)2", "role": "ServiceRole.DATA_SCIENTIST", "new_password": null, "email_disabled": false, "reset_password": false, "reset_token": null}, {"name": "Lisa Guerra", "email": "lisa-guerra-fake@openmined.org", "password": "^DW28G^jW+", "role": "ServiceRole.DATA_SCIENTIST", "new_password": null, "email_disabled": false, "reset_password": false, "reset_token": null}] \ No newline at end of file +[ + { + "name": "Arthur Smith", + "email": "arthur-smith-fake@openmined.org", + "password": "@DP8JSytU^", + "role": "ServiceRole.DATA_SCIENTIST", + "new_password": null, + "email_disabled": true, + "reset_password": false, + "reset_token": null + }, + { + "name": "Noah Hinton", + "email": "noah-hinton-fake@openmined.org", + "password": "j)5S!RJvsl", + "role": "ServiceRole.DATA_SCIENTIST", + "new_password": null, + "email_disabled": false, + "reset_password": true, + "reset_token": "ugpbqHrAwOQ7" + }, + { + "name": "Samantha Heath", + "email": "samantha-heath-fake@openmined.org", + "password": "hI6OKBkfw%", + "role": "ServiceRole.DATA_SCIENTIST", + "new_password": null, + "email_disabled": false, + "reset_password": false, + "reset_token": null + }, + { + "name": "Eric Morales", + "email": "eric-morales-fake@openmined.org", + "password": "$+L*Z74f)2", + "role": "ServiceRole.DATA_SCIENTIST", + "new_password": null, + "email_disabled": false, + "reset_password": false, + "reset_token": null + }, + { + "name": "Lisa Guerra", + "email": "lisa-guerra-fake@openmined.org", + "password": "^DW28G^jW+", + "role": "ServiceRole.DATA_SCIENTIST", + "new_password": null, + "email_disabled": false, + "reset_password": false, + "reset_token": null + } +] diff --git a/notebooks/scenarios/bigquery/upgradability/1-dump-database-to-file.ipynb b/notebooks/scenarios/bigquery/upgradability/1-dump-database-to-file.ipynb index f465d0cf342..1832d969223 100644 --- a/notebooks/scenarios/bigquery/upgradability/1-dump-database-to-file.ipynb +++ b/notebooks/scenarios/bigquery/upgradability/1-dump-database-to-file.ipynb @@ -8,7 +8,6 @@ "outputs": [], "source": [ "# stdlib\n", - "import os\n", "from pathlib import Path\n", "\n", "# syft absolute\n", @@ -94,7 +93,9 @@ "outputs": [], "source": [ "# migration_data_dir = Path(os.getenv(\"MIGRATION_DATA_DIR\", \".\"))\n", - "migration_data_dir = Path('/home/teo/OpenMined/PySyft/notebooks/scenarios/bigquery/upgradability/')\n", + "migration_data_dir = Path(\n", + " \"/home/teo/OpenMined/PySyft/notebooks/scenarios/bigquery/upgradability/\"\n", + ")\n", "\n", "migration_data_dir.mkdir(exist_ok=True)\n", "\n", diff --git a/notebooks/scenarios/bigquery/upgradability/2-migrate-for-scenarios.ipynb b/notebooks/scenarios/bigquery/upgradability/2-migrate-for-scenarios.ipynb index 865921fc0b9..a8c55917a04 100644 --- a/notebooks/scenarios/bigquery/upgradability/2-migrate-for-scenarios.ipynb +++ b/notebooks/scenarios/bigquery/upgradability/2-migrate-for-scenarios.ipynb @@ -2,35 +2,31 @@ "cells": [ { "cell_type": "code", - "execution_count": 1, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# stdlib\n", "import os\n", - "from pathlib import Path\n", "from os import environ as env\n", + "from pathlib import Path\n", + "import sys\n", "\n", "# syft absolute\n", "import syft as sy\n", - "from syft.service.code.user_code import UserCode\n", - "from syft.service.user.user import User\n", - "from syft.service.user.user_roles import ServiceRole\n", "from syft.service.action.action_object import AnyActionObject\n", - "from syft.util.test_helpers.email_helpers import get_email_server\n", - "from syft.util.test_helpers.email_helpers import load_users\n", - "from syft.util.test_helpers.job_helpers import load_jobs\n", - "from syft.util.test_helpers.job_helpers import save_jobs\n", + "from syft.service.user.user_roles import ServiceRole\n", + "from syft.util.test_helpers.email_helpers import load_users\n", "from syft.util.test_helpers.job_helpers import create_simple_query_job\n", - "from syft.util.util import find_base_dir_with_tox_ini, get_caller_file_path, is_interpreter_jupyter\n", - "\n", - "import os\n", - "import sys\n" + "from syft.util.test_helpers.job_helpers import load_jobs\n", + "from syft.util.util import find_base_dir_with_tox_ini\n", + "from syft.util.util import get_caller_file_path\n", + "from syft.util.util import is_interpreter_jupyter" ] }, { "cell_type": "code", - "execution_count": 2, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -54,7 +50,7 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -65,7 +61,7 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -83,1762 +79,9 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Autoreload enabled\n", - "Starting bigquery-high server on 0.0.0.0:8080\n", - "Found `reset=True` in the launch configuration. Resetting the server...\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "INFO: Will watch for changes in these directories: ['/home/teo/OpenMined/PySyft/packages/syft/src/syft']\n", - "INFO: Uvicorn running on http://0.0.0.0:8080 (Press CTRL+C to quit)\n", - "INFO: Started reloader process [185565] using WatchFiles\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Waiting for server to start...WARN: private key is based on server name: bigquery-high in dev_mode. Don't run this in production.\n", - "Using SQLiteDBConfig and sqlite:////tmp/syft/fbdf5a287e58454cbbd3fac4ad744d37/db/fbdf5a287e58454cbbd3fac4ad744d37_json.db\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "INFO: Starting server with settings: {'name': 'bigquery-high', 'server_type': , 'server_side_type': , 'deployment_type': , 'processes': 1, 'reset': False, 'dev_mode': True, 'enable_warnings': False, 'in_memory_workers': True, 'queue_port': None, 'create_producer': True, 'n_consumers': 1, 'association_request_auto_approval': False, 'background_tasks': False, 'db_config': None, 'db_url': None} and worker class: \n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Adding producer for queue: api_call on: tcp://localhost:57149\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "INFO: Started server process [185617]\n", - "INFO: Waiting for application startup.\n", - "INFO: Application startup complete.\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - ". Done.\n" - ] - }, - { - "data": { - "text/html": [ - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "
SyftInfo:
You have launched a development server at http://0.0.0.0:8080. It is intended only for local use.

" - ], - "text/plain": [ - "SyftInfo: You have launched a development server at http://0.0.0.0:8080. It is intended only for local use." - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Logged into as \n" - ] - }, - { - "data": { - "text/html": [ - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "
SyftWarning:
You are using a default password. Please change the password using `[your_client].account.set_password([new_password])`.

" - ], - "text/plain": [ - "SyftWarning: You are using a default password. Please change the password using `[your_client].account.set_password([new_password])`." - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "INFO: Stopping reloader process [185565]\n" - ] - } - ], + "outputs": [], "source": [ "server = sy.orchestra.launch(\n", " name=\"bigquery-high\",\n", @@ -1850,14 +93,12 @@ " create_producer=True, # Can produce more workers\n", ")\n", "\n", - "client = sy.login(\n", - " url=\"http://localhost:8080\", email=ROOT_EMAIL, password=ROOT_PASSWORD\n", - ")" + "client = sy.login(url=\"http://localhost:8080\", email=ROOT_EMAIL, password=ROOT_PASSWORD)" ] }, { "cell_type": "code", - "execution_count": 6, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -1870,32 +111,9 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "data": { - "text/markdown": [ - "```python\n", - "class MigrationData:\n", - " id: str = 073e01d52b164605b4fd563142b74d9a\n", - " server_uid: str = fbdf5a287e58454cbbd3fac4ad744d37\n", - " root_verify_key: str = 1e5ec44a179d21e0a0721ea7a670b9875d3946c8604f4623903fcafafe03c8e7\n", - " num_objects: str = 17\n", - " num_action_objects: str = 0\n", - " includes_blobs: str = True\n", - "\n", - "```" - ], - "text/plain": [ - "syft.service.migration.object_migration_state.MigrationData" - ] - }, - "execution_count": 7, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "migration_data" ] @@ -1909,37 +127,23 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "/home/teo/OpenMined/PySyft/notebooks/scenarios/bigquery/upgradability\n" - ] - } - ], + "outputs": [], "source": [ "!pwd" ] }, { "cell_type": "code", - "execution_count": 9, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Loading migration data from /home/teo/OpenMined/PySyft/notebooks/scenarios/bigquery/upgradability/migration.blob\n" - ] - } - ], + "outputs": [], "source": [ "# migration_data_dir = Path(os.getenv(\"MIGRATION_DATA_DIR\", \".\"))\n", - "migration_data_dir = Path('/home/teo/OpenMined/PySyft/notebooks/scenarios/bigquery/upgradability/')\n", + "migration_data_dir = Path(\n", + " \"/home/teo/OpenMined/PySyft/notebooks/scenarios/bigquery/upgradability/\"\n", + ")\n", "blob_path = migration_data_dir / \"migration.blob\"\n", "yaml_path = migration_data_dir / \"migration.yaml\"\n", "\n", @@ -1948,888 +152,9 @@ }, { "cell_type": "code", - "execution_count": 10, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "
SyftWarning:
This migration data includes custom workers, which need to be migrated separately with `sy.upgrade_custom_workerpools` after finishing the migration.

" - ], - "text/plain": [ - "SyftWarning: This migration data includes custom workers, which need to be migrated separately with `sy.upgrade_custom_workerpools` after finishing the migration." - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Migrating data for: User table to version 2\n", - "Migrating data for: APIEndpointQueueItem table to version 2\n", - "Migrating data for: ActionQueueItem table to version 2\n", - "Migrating data for: ServerSettings table to version 4\n", - "Migrating data for: UserCode table to version 1\n", - "Migrating data for: SyftLog table to version 1\n", - "Migrating data for: Request table to version 1\n", - "Migrating data for: JobItem table to version 2\n", - "Migrating data for: TwinAPIEndpoint table to version 1\n", - "Migrating data for: NotifierSettings table to version 2\n", - "Migrating data for: Notification table to version 2\n", - "Migrating data for: CodeHistory table to version 1\n", - "Migrating data for: SyftObjectMigrationState table to version 1\n", - "Migrating data for: SyftImageRegistry table to version 1\n", - "Migrating data for: ExecutionOutput table to version 1\n", - "Migrating data for: UserCodeStatusCollection table to version 1\n", - " #e0a9432112f448a7bcba97668f653b7a already exists\n", - " #fbdf5a287e58454cbbd3fac4ad744d37 already exists\n", - " #75fa06708c1c45a2b395bb8c0da0d565 already exists\n", - " #d6303fdddb2a462c936a7a63dbbbe036 already exists\n", - " #16a926460dfb4e7ab9330abfccbf3cd8 already exists\n", - " #b68881d3c39c46bea9454a2f61d67444 already exists\n", - " #ae80caf01b83493ba13f1f9f0c834384 already exists\n", - " #625d9f0693d44b02a68f4f8e05294637 already exists\n", - " #d3569d8f10e14669b41576b18990b20f already exists\n", - " #600301f1a95b4e4586efefc9f5e108bf already exists\n", - " #6e10684e83f6442ba114c60f395f690e already exists\n", - " #3e71410324714497be75762283a8063a already exists\n", - "Migrating data for: AnyActionObject table to version 1\n", - "Migrating data for: PandasDataframeObject table to version 1\n", - "Updating store metadata\n" - ] - } - ], + "outputs": [], "source": [ "res = client.load_migration_data(blob_path)\n", "assert isinstance(res, sy.SyftSuccess), res.message" @@ -2837,4340 +162,18 @@ }, { "cell_type": "code", - "execution_count": 11, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "
SyftSuccess:
Migration completed successfully

" - ], - "text/plain": [ - "SyftSuccess: Migration completed successfully" - ] - }, - "execution_count": 11, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "res" ] }, { "cell_type": "code", - "execution_count": 12, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "This is a utility to upgrade workerpools to the new syft version\n", - "If an upgrade fails, it is always possible to start the workerpool manually\n", - "loading migration data...\n", - "Skipping default pool, this pool has already been upgraded\n", - "\n", - "Upgrading workerpool bigquery-pool\n", - "Found outdated prebuilt worker image `docker.io/openmined/syft-worker-bigquery:local-dev`\n", - "submitting new prebuilt image...\n" - ] - }, - { - "data": { - "text/html": [ - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "
SyftSuccess:
Dockerfile ID: 3aecb04de0d84dc2baf1cb8623919fca successfully submitted.

" - ], - "text/plain": [ - "SyftSuccess: Dockerfile ID: 3aecb04de0d84dc2baf1cb8623919fca successfully submitted." - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "starting new pool `bigquery-pool` with 1 workers\n" - ] - }, - { - "data": { - "text/html": [ - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "
\n", - "\n", - "
\n", - "
\n", - " \n", - "
\n", - "

ContainerSpawnStatus List

\n", - "
\n", - "
\n", - "
\n", - " \n", - "
\n", - "
\n", - "

Total: 0

\n", - "
\n", - "
\n", - "
\n", - "\n", - "\n", - "\n", - "" - ], - "text/plain": [ - "[ContainerSpawnStatus(worker_name='bigquery-pool-1', worker=syft.service.worker.worker_pool.SyftWorker, error=None)]" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\n", - "Upgraded 1 workerpools to the new syft version\n", - "Please verify your upgraded pools with `client.worker_pools`\n" - ] - } - ], + "outputs": [], "source": [ "sy.upgrade_custom_workerpools(client, blob_path, mode=\"auto\")" ] @@ -7184,20 +187,9 @@ }, { "cell_type": "code", - "execution_count": 13, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "'\\nTODO:\\n * verify users\\n * login\\n * check every role\\n * mostly check on lengths\\n * can a DS see the results of their old jobs/logs\\n * still use the api schema both mock \\n * still submit a new query via submit_query\\n * can admin still approve and approve_by_running, deny\\n * check on old broken queries\\n * create a new broken query\\n * can ds get the results of the new queries\\n * emails should work now\\n * test in k8s (both L2 and L0)\\n * test in L0 (migrate both nodes?)\\n'" - ] - }, - "execution_count": 13, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "\"\"\"\n", "TODO:\n", @@ -7215,26 +207,14 @@ " * emails should work now\n", " * test in k8s (both L2 and L0)\n", " * test in L0 (migrate both nodes?)\n", - "\"\"\" " + "\"\"\"" ] }, { "cell_type": "code", - "execution_count": 14, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Logged into as \n", - "Logged into as \n", - "Logged into as \n", - "Logged into as \n", - "Logged into as \n" - ] - } - ], + "outputs": [], "source": [ "users = load_users(client, path=\"0.9.1_notebooks/users.json\")\n", "jobs = load_jobs(users, client, filepath=\"0.9.1_notebooks/jobs.json\")" @@ -7249,7 +229,7 @@ }, { "cell_type": "code", - "execution_count": 15, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -7258,49 +238,27 @@ }, { "cell_type": "code", - "execution_count": 16, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "data": { - "text/markdown": [ - "```python\n", - "class UserView:\n", - " id: str = 19bf8ff08bd9496889ddb4006a078a78\n", - " name: str = \"Jane Doe\"\n", - " email: str = \"admin@bigquery.org\"\n", - " institution: str = \"\"\n", - " website: str = \"\"\n", - " role: str = ServiceRole.ADMIN\n", - " notifications_enabled: str = {: True, : False, : False, : False}\n", - "\n", - "```" - ], - "text/plain": [ - "syft.service.user.user.UserView" - ] - }, - "execution_count": 16, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "server_users[0]" ] }, { "cell_type": "code", - "execution_count": 17, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ - "server_user_names = [user.name for user in server_users if user.role == ServiceRole.DATA_SCIENTIST]" + "server_user_names = [\n", + " user.name for user in server_users if user.role == ServiceRole.DATA_SCIENTIST\n", + "]" ] }, { "cell_type": "code", - "execution_count": 18, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -7309,7 +267,7 @@ }, { "cell_type": "code", - "execution_count": 19, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -7325,17 +283,9 @@ }, { "cell_type": "code", - "execution_count": 20, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "len(reviewed_jobs)=9, len(reviewed_jobs_should_succeed)=7, len(reviewed_jobs_should_fail)=2\n" - ] - } - ], + "outputs": [], "source": [ "# submitted_jobs = [job for job in jobs if job.is_submitted]\n", "reviewed_jobs = [job for job in jobs if job.admin_reviewed]\n", @@ -7349,37 +299,9 @@ }, { "cell_type": "code", - "execution_count": 21, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "> Checking job: simple_query simple_query_d1e040 for user arthur-smith-fake@openmined.org\n", - "Using SQLiteDBConfig and sqlite:////tmp/syft/fbdf5a287e58454cbbd3fac4ad744d37/db/fbdf5a287e58454cbbd3fac4ad744d37_json.db\n", - "Using SQLiteDBConfig and sqlite:////tmp/syft/fbdf5a287e58454cbbd3fac4ad744d37/db/fbdf5a287e58454cbbd3fac4ad744d37_json.db\n", - "> Checking job: simple_query simple_query_6aa50c for user arthur-smith-fake@openmined.org\n", - "Using SQLiteDBConfig and sqlite:////tmp/syft/fbdf5a287e58454cbbd3fac4ad744d37/db/fbdf5a287e58454cbbd3fac4ad744d37_json.db\n", - "Using SQLiteDBConfig and sqlite:////tmp/syft/fbdf5a287e58454cbbd3fac4ad744d37/db/fbdf5a287e58454cbbd3fac4ad744d37_json.db\n", - "> Checking job: simple_query simple_query_912a15 for user noah-hinton-fake@openmined.org\n", - "Using SQLiteDBConfig and sqlite:////tmp/syft/fbdf5a287e58454cbbd3fac4ad744d37/db/fbdf5a287e58454cbbd3fac4ad744d37_json.db\n", - "Using SQLiteDBConfig and sqlite:////tmp/syft/fbdf5a287e58454cbbd3fac4ad744d37/db/fbdf5a287e58454cbbd3fac4ad744d37_json.db\n", - "> Checking job: simple_query simple_query_b82bd0 for user samantha-heath-fake@openmined.org\n", - "Using SQLiteDBConfig and sqlite:////tmp/syft/fbdf5a287e58454cbbd3fac4ad744d37/db/fbdf5a287e58454cbbd3fac4ad744d37_json.db\n", - "Using SQLiteDBConfig and sqlite:////tmp/syft/fbdf5a287e58454cbbd3fac4ad744d37/db/fbdf5a287e58454cbbd3fac4ad744d37_json.db\n", - "> Checking job: simple_query simple_query_b81b03 for user eric-morales-fake@openmined.org\n", - "Using SQLiteDBConfig and sqlite:////tmp/syft/fbdf5a287e58454cbbd3fac4ad744d37/db/fbdf5a287e58454cbbd3fac4ad744d37_json.db\n", - "Using SQLiteDBConfig and sqlite:////tmp/syft/fbdf5a287e58454cbbd3fac4ad744d37/db/fbdf5a287e58454cbbd3fac4ad744d37_json.db\n", - "> Checking job: job_long_name job_long_name_19baf0aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa for user eric-morales-fake@openmined.org\n", - "Using SQLiteDBConfig and sqlite:////tmp/syft/fbdf5a287e58454cbbd3fac4ad744d37/db/fbdf5a287e58454cbbd3fac4ad744d37_json.db\n", - "Using SQLiteDBConfig and sqlite:////tmp/syft/fbdf5a287e58454cbbd3fac4ad744d37/db/fbdf5a287e58454cbbd3fac4ad744d37_json.db\n", - "> Checking job: simple_query simple_query_3ba857 for user lisa-guerra-fake@openmined.org\n", - "Using SQLiteDBConfig and sqlite:////tmp/syft/fbdf5a287e58454cbbd3fac4ad744d37/db/fbdf5a287e58454cbbd3fac4ad744d37_json.db\n", - "Using SQLiteDBConfig and sqlite:////tmp/syft/fbdf5a287e58454cbbd3fac4ad744d37/db/fbdf5a287e58454cbbd3fac4ad744d37_json.db\n" - ] - } - ], + "outputs": [], "source": [ "for job in reviewed_jobs_should_succeed:\n", " print(f\"> Checking job: {job.job_type} {job.func_name} for user {job.user_email}\")\n", @@ -7396,22 +318,9 @@ }, { "cell_type": "code", - "execution_count": 22, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "> Checking job: wrong_syntax_query wrong_syntax_query_293ad3 for user noah-hinton-fake@openmined.org\n", - "Using SQLiteDBConfig and sqlite:////tmp/syft/fbdf5a287e58454cbbd3fac4ad744d37/db/fbdf5a287e58454cbbd3fac4ad744d37_json.db\n", - "Using SQLiteDBConfig and sqlite:////tmp/syft/fbdf5a287e58454cbbd3fac4ad744d37/db/fbdf5a287e58454cbbd3fac4ad744d37_json.db\n", - "> Checking job: job_too_much_text job_too_much_text_9b550a for user samantha-heath-fake@openmined.org\n", - "Using SQLiteDBConfig and sqlite:////tmp/syft/fbdf5a287e58454cbbd3fac4ad744d37/db/fbdf5a287e58454cbbd3fac4ad744d37_json.db\n", - "Using SQLiteDBConfig and sqlite:////tmp/syft/fbdf5a287e58454cbbd3fac4ad744d37/db/fbdf5a287e58454cbbd3fac4ad744d37_json.db\n" - ] - } - ], + "outputs": [], "source": [ "for job in reviewed_jobs_should_fail:\n", " print(f\"> Checking job: {job.job_type} {job.func_name} for user {job.user_email}\")\n", @@ -7427,17 +336,9 @@ }, { "cell_type": "code", - "execution_count": 23, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "got expected_jobs: 9 == reviewed_jobs: 9\n" - ] - } - ], + "outputs": [], "source": [ "expected_jobs = [job for job in jobs if job.result_as_expected]\n", "print(f\"got expected_jobs: {len(expected_jobs)} == reviewed_jobs: {len(reviewed_jobs)}\")\n", @@ -7453,7 +354,7 @@ }, { "cell_type": "code", - "execution_count": 24, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -7462,7 +363,7 @@ }, { "cell_type": "code", - "execution_count": 25, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -7471,7 +372,7 @@ }, { "cell_type": "code", - "execution_count": 26, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -7480,44 +381,19 @@ }, { "cell_type": "code", - "execution_count": 27, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Using SQLiteDBConfig and sqlite:////tmp/syft/fbdf5a287e58454cbbd3fac4ad744d37/db/fbdf5a287e58454cbbd3fac4ad744d37_json.db\n", - "Using SQLiteDBConfig and sqlite:////tmp/syft/fbdf5a287e58454cbbd3fac4ad744d37/db/fbdf5a287e58454cbbd3fac4ad744d37_json.db\n", - "SyftSuccess: Syft function 'execute_query' successfully created. To add a code request, please create a project using `project = syft.Project(...)`, then use command `project.create_code_request`.\n" - ] - }, - { - "data": { - "text/markdown": [ - "\n", - "**Pointer**\n", - "\n", - "'Query submitted syft.service.request.request.Request. Use `client.code.simple_query_f40ce1()` to run your query'\n" - ], - "text/plain": [ - "Pointer:\n", - "'Query submitted syft.service.request.request.Request. Use `client.code.simple_query_f40ce1()` to run your query'" - ] - }, - "execution_count": 27, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ - "response = ds_client.api.services.bigquery.submit_query(func_name=job.func_name, query=job.query)\n", + "response = ds_client.api.services.bigquery.submit_query(\n", + " func_name=job.func_name, query=job.query\n", + ")\n", "response" ] }, { "cell_type": "code", - "execution_count": 28, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -7526,17 +402,9 @@ }, { "cell_type": "code", - "execution_count": 29, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Approving request on change simple_query_f40ce1 for datasite bigquery-high\n" - ] - } - ], + "outputs": [], "source": [ "for request in client.requests:\n", " if request.code.service_func_name == job.func_name:\n", @@ -7545,7 +413,7 @@ }, { "cell_type": "code", - "execution_count": 30, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -7554,59 +422,22 @@ }, { "cell_type": "code", - "execution_count": 31, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Using SQLiteDBConfig and sqlite:////tmp/syft/fbdf5a287e58454cbbd3fac4ad744d37/db/fbdf5a287e58454cbbd3fac4ad744d37_json.db\n", - "Using SQLiteDBConfig and sqlite:////tmp/syft/fbdf5a287e58454cbbd3fac4ad744d37/db/fbdf5a287e58454cbbd3fac4ad744d37_json.db\n" - ] - }, - { - "data": { - "text/markdown": [ - "\n", - "**Pointer**\n", - "\n", - "None\n" - ], - "text/plain": [ - "Pointer:\n", - "None" - ] - }, - "execution_count": 31, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "job_res.wait()" ] }, { "cell_type": "code", - "execution_count": 32, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "INFO: Shutting down\n", - "INFO: Waiting for application shutdown.\n", - "INFO: Application shutdown complete.\n", - "INFO: Finished server process [185617]\n" - ] - } - ], + "outputs": [], "source": [ + "# third party\n", "from pandas import DataFrame\n", "\n", - "\n", "assert isinstance(job_res.result.get(), DataFrame)" ] }, diff --git a/notebooks/scenarios/bigquery/upgradability/migration.yaml b/notebooks/scenarios/bigquery/upgradability/migration.yaml index 2f5c2ff282c..c3819a0c46a 100644 --- a/notebooks/scenarios/bigquery/upgradability/migration.yaml +++ b/notebooks/scenarios/bigquery/upgradability/migration.yaml @@ -1,6 +1,6 @@ server: env: - - name: SERVER_UID - value: fbdf5a287e58454cbbd3fac4ad744d37 - - name: SERVER_PRIVATE_KEY - value: fcfd09deed32e3574558b6719fed46e0b8fd957d59608e9d8b42ef07c6080d3e + - name: SERVER_UID + value: fbdf5a287e58454cbbd3fac4ad744d37 + - name: SERVER_PRIVATE_KEY + value: fcfd09deed32e3574558b6719fed46e0b8fd957d59608e9d8b42ef07c6080d3e diff --git a/packages/syft/src/syft/client/registry.py b/packages/syft/src/syft/client/registry.py index f4086b8809e..e793f57be11 100644 --- a/packages/syft/src/syft/client/registry.py +++ b/packages/syft/src/syft/client/registry.py @@ -103,9 +103,7 @@ def check_network(network: dict) -> dict[Any, Any] | None: # If not defined, try to ask in /syft/version endpoint (supported by 0.7.0) try: version_url = url + "api/v2/metadata" - res = requests.get( - version_url, timeout=DEFAULT_TIMEOUT - ) # nosec + res = requests.get(version_url, timeout=DEFAULT_TIMEOUT) # nosec if res.status_code == 200: network["version"] = res.json()["syft_version"] else: @@ -272,9 +270,7 @@ def check_datasite(datasite: dict) -> dict[Any, Any] | None: # If not defined, try to ask in /syft/version endpoint (supported by 0.7.0) try: version_url = url + "api/v2/metadata" - res = requests.get( - version_url, timeout=DEFAULT_TIMEOUT - ) # nosec + res = requests.get(version_url, timeout=DEFAULT_TIMEOUT) # nosec if res.status_code == 200: datasite["version"] = res.json()["syft_version"] else: @@ -540,9 +536,7 @@ def check_enclave(enclave: dict) -> dict[Any, Any] | None: # If not defined, try to ask in /syft/version endpoint (supported by 0.7.0) try: version_url = url + "api/v2/metadata" - res = requests.get( - version_url, timeout=DEFAULT_TIMEOUT - ) # nosec + res = requests.get(version_url, timeout=DEFAULT_TIMEOUT) # nosec if res.status_code == 200: enclave["version"] = res.json()["syft_version"] else: diff --git a/packages/syft/src/syft/protocol/data_protocol.py b/packages/syft/src/syft/protocol/data_protocol.py index 2429991cb86..0c848585119 100644 --- a/packages/syft/src/syft/protocol/data_protocol.py +++ b/packages/syft/src/syft/protocol/data_protocol.py @@ -431,9 +431,9 @@ def validate_release(self) -> None: # Update older file path to newer file path latest_protocol_fp.rename(new_protocol_file_path) - protocol_history[latest_protocol][ - "release_name" - ] = f"{current_syft_version}.json" + protocol_history[latest_protocol]["release_name"] = ( + f"{current_syft_version}.json" + ) # Save history self.file_path.write_text(json.dumps(protocol_history, indent=2) + "\n") diff --git a/packages/syft/src/syft/service/action/action_endpoint.py b/packages/syft/src/syft/service/action/action_endpoint.py index 68292c2e308..2237b3963a6 100644 --- a/packages/syft/src/syft/service/action/action_endpoint.py +++ b/packages/syft/src/syft/service/action/action_endpoint.py @@ -80,9 +80,7 @@ def __call_function( self.context.server.services.api.execute_server_side_endpoint_mock_by_id ) elif call_mode == EXECUTION_MODE.PRIVATE: - __endpoint_mode = ( - self.context.server.services.api.execute_service_side_endpoint_private_by_id - ) + __endpoint_mode = self.context.server.services.api.execute_service_side_endpoint_private_by_id else: __endpoint_mode = ( self.context.server.services.api.execute_server_side_endpoint_by_id diff --git a/packages/syft/src/syft/service/action/action_service.py b/packages/syft/src/syft/service/action/action_service.py index c8dd7193739..bd871a18164 100644 --- a/packages/syft/src/syft/service/action/action_service.py +++ b/packages/syft/src/syft/service/action/action_service.py @@ -715,9 +715,7 @@ def call_method( mock_obj_id=action.result_id, ) else: - return execute_object( - self, context, resolved_self, action - ).unwrap() # type:ignore[unreachable] + return execute_object(self, context, resolved_self, action).unwrap() # type:ignore[unreachable] as_result(SyftException) @@ -1120,17 +1118,13 @@ def execute_object( ) elif twin_mode == twin_mode.PRIVATE: # type:ignore # twin private path - private_args = filter_twin_args( - args, twin_mode=twin_mode - ).unwrap() # type:ignore[unreachable] + private_args = filter_twin_args(args, twin_mode=twin_mode).unwrap() # type:ignore[unreachable] private_kwargs = filter_twin_kwargs(kwargs, twin_mode=twin_mode).unwrap() result = target_method(*private_args, **private_kwargs) result_action_object = wrap_result(action.result_id, result) elif twin_mode == twin_mode.MOCK: # type:ignore # twin mock path - mock_args = filter_twin_args( - args, twin_mode=twin_mode - ).unwrap() # type:ignore[unreachable] + mock_args = filter_twin_args(args, twin_mode=twin_mode).unwrap() # type:ignore[unreachable] mock_kwargs = filter_twin_kwargs(kwargs, twin_mode=twin_mode).unwrap() target_method = getattr(unboxed_resolved_self, action.op, None) result = target_method(*mock_args, **mock_kwargs) diff --git a/packages/syft/src/syft/service/project/project.py b/packages/syft/src/syft/service/project/project.py index 4587c5a4b39..5ed21f5007d 100644 --- a/packages/syft/src/syft/service/project/project.py +++ b/packages/syft/src/syft/service/project/project.py @@ -1075,7 +1075,9 @@ def sync(self, verbose: bool | None = True) -> SyftSuccess: while not progress.finished: event = unsynced_events[curr_val] curr_val += 1 - progress.tasks[task1].description = ( + progress.tasks[ + task1 + ].description = ( f"[bold white]Syncing... {curr_val}/{len(unsynced_events)}" ) progress.update(task1, advance=1) diff --git a/packages/syft/src/syft/store/db/stash.py b/packages/syft/src/syft/store/db/stash.py index 7a956128f82..aec2a2ed9c5 100644 --- a/packages/syft/src/syft/store/db/stash.py +++ b/packages/syft/src/syft/store/db/stash.py @@ -712,9 +712,7 @@ def has_permissions( @as_result(StashException) @with_session - def _get_permissions_for_uid( - self, uid: UID, session: Session = None - ) -> Set[str]: # noqa: UP006 + def _get_permissions_for_uid(self, uid: UID, session: Session = None) -> Set[str]: # noqa: UP006 stmt = select(self.table.c.permissions).where(self.table.c.id == uid) result = session.execute(stmt).scalar_one_or_none() if result is None: @@ -723,9 +721,7 @@ def _get_permissions_for_uid( @as_result(StashException) @with_session - def get_all_permissions( - self, session: Session = None - ) -> dict[UID, Set[str]]: # noqa: UP006 + def get_all_permissions(self, session: Session = None) -> dict[UID, Set[str]]: # noqa: UP006 stmt = select(self.table.c.id, self.table.c.permissions) results = session.execute(stmt).all() return {UID(row.id): set(row.permissions) for row in results} diff --git a/packages/syft/src/syft/store/kv_document_store.py b/packages/syft/src/syft/store/kv_document_store.py index 1999f0d8177..77bfbbb3297 100644 --- a/packages/syft/src/syft/store/kv_document_store.py +++ b/packages/syft/src/syft/store/kv_document_store.py @@ -705,9 +705,9 @@ def _set_data_and_keys( ck_col[pk_value] = store_query_key.value self.unique_keys[pk_key] = ck_col - self.unique_keys[store_query_key.key][ + self.unique_keys[store_query_key.key][store_query_key.value] = ( store_query_key.value - ] = store_query_key.value + ) sqks = searchable_query_keys.all for qk in sqks: diff --git a/packages/syft/src/syft/store/sqlite_document_store.py b/packages/syft/src/syft/store/sqlite_document_store.py index 311779e611e..82d75d68e6b 100644 --- a/packages/syft/src/syft/store/sqlite_document_store.py +++ b/packages/syft/src/syft/store/sqlite_document_store.py @@ -269,9 +269,7 @@ def _get(self, key: UID) -> Any: return _deserialize(data, from_bytes=True) def _exists(self, key: UID) -> bool: - select_sql = ( - f"select uid from {self.table_name} where uid = {self.subs_char}" # nosec - ) + select_sql = f"select uid from {self.table_name} where uid = {self.subs_char}" # nosec cursor = self._execute( self.lock, self.cur, self.db, self.table_name, select_sql, [str(key)] ).unwrap() @@ -312,9 +310,7 @@ def _get_all_keys(self) -> Any: return keys def _delete(self, key: UID) -> None: - select_sql = ( - f"delete from {self.table_name} where uid = {self.subs_char}" # nosec - ) + select_sql = f"delete from {self.table_name} where uid = {self.subs_char}" # nosec self._execute( self.lock, self.cur, self.db, self.table_name, select_sql, [str(key)] ).unwrap() diff --git a/packages/syft/src/syft/types/errors.py b/packages/syft/src/syft/types/errors.py index d7296d952dc..d1255921a01 100644 --- a/packages/syft/src/syft/types/errors.py +++ b/packages/syft/src/syft/types/errors.py @@ -352,8 +352,6 @@ def syft_exception_handler( # not pick up exceptions if they have a custom exception handler (fail silently) if not runs_in_pytest: try: - get_ipython().set_custom_exc( - (SyftException,), syft_exception_handler - ) # noqa: F821 + get_ipython().set_custom_exc((SyftException,), syft_exception_handler) # noqa: F821 except Exception: pass # nosec diff --git a/packages/syft/src/syft/types/syft_object.py b/packages/syft/src/syft/types/syft_object.py index cf07f71f6e6..f6a4d3233cb 100644 --- a/packages/syft/src/syft/types/syft_object.py +++ b/packages/syft/src/syft/types/syft_object.py @@ -411,14 +411,14 @@ def make_id(cls, values: Any) -> Any: return values __order_by__: ClassVar[tuple[str, str]] = ("_created_at", "asc") - __attr_searchable__: ClassVar[list[str]] = ( - [] - ) # keys which can be searched in the ORM + __attr_searchable__: ClassVar[ + list[str] + ] = [] # keys which can be searched in the ORM __attr_unique__: ClassVar[list[str]] = [] # the unique keys for the particular Collection the objects will be stored in - __serde_overrides__: dict[str, Sequence[Callable]] = ( - {} - ) # List of attributes names which require a serde override. + __serde_overrides__: dict[ + str, Sequence[Callable] + ] = {} # List of attributes names which require a serde override. __owner__: str __repr_attrs__: ClassVar[list[str]] = [] # show these in html repr collections diff --git a/packages/syft/src/syft/types/syft_object_registry.py b/packages/syft/src/syft/types/syft_object_registry.py index 0949a655cbf..9487ae6ece6 100644 --- a/packages/syft/src/syft/types/syft_object_registry.py +++ b/packages/syft/src/syft/types/syft_object_registry.py @@ -24,9 +24,9 @@ def register_cls( ) -> None: if canonical_name not in cls.__object_serialization_registry__: cls.__object_serialization_registry__[canonical_name] = {} - cls.__object_serialization_registry__[canonical_name][ - version - ] = serde_attributes + cls.__object_serialization_registry__[canonical_name][version] = ( + serde_attributes + ) cls.__type_to_canonical_name__[serde_attributes[7]] = (canonical_name, version) diff --git a/packages/syft/src/syft/util/notebook_ui/components/tabulator_template.py b/packages/syft/src/syft/util/notebook_ui/components/tabulator_template.py index 136d16ed78f..538614b4cb8 100644 --- a/packages/syft/src/syft/util/notebook_ui/components/tabulator_template.py +++ b/packages/syft/src/syft/util/notebook_ui/components/tabulator_template.py @@ -28,9 +28,7 @@ def make_links(text: str) -> str: DEFAULT_ID_WIDTH = 110 -jinja_env = jinja2.Environment( - loader=jinja2.PackageLoader("syft", "assets/jinja") -) # nosec +jinja_env = jinja2.Environment(loader=jinja2.PackageLoader("syft", "assets/jinja")) # nosec jinja_env.filters["make_links"] = make_links From 8c6654953625ce874559701cc90833d2ca10d604 Mon Sep 17 00:00:00 2001 From: teo Date: Mon, 23 Sep 2024 12:07:18 +0300 Subject: [PATCH 13/17] added wrong syntax post test --- .../2-migrate-for-scenarios.ipynb | 65 ++++++++++++++++++- 1 file changed, 64 insertions(+), 1 deletion(-) diff --git a/notebooks/scenarios/bigquery/upgradability/2-migrate-for-scenarios.ipynb b/notebooks/scenarios/bigquery/upgradability/2-migrate-for-scenarios.ipynb index a8c55917a04..9352ec3369e 100644 --- a/notebooks/scenarios/bigquery/upgradability/2-migrate-for-scenarios.ipynb +++ b/notebooks/scenarios/bigquery/upgradability/2-migrate-for-scenarios.ipynb @@ -18,6 +18,7 @@ "from syft.service.user.user_roles import ServiceRole\n", "from syft.util.test_helpers.email_helpers import load_users\n", "from syft.util.test_helpers.job_helpers import create_simple_query_job\n", + "from syft.util.test_helpers.job_helpers import create_wrong_syntax_query\n", "from syft.util.test_helpers.job_helpers import load_jobs\n", "from syft.util.util import find_base_dir_with_tox_ini\n", "from syft.util.util import get_caller_file_path\n", @@ -446,7 +447,69 @@ "execution_count": null, "metadata": {}, "outputs": [], - "source": [] + "source": [ + "wrong_syntax_job = create_wrong_syntax_query(users[0])" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "response = ds_client.api.services.bigquery.submit_query(\n", + " func_name=wrong_syntax_job.func_name, query=wrong_syntax_job.query\n", + ")\n", + "response" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "assert isinstance(response, AnyActionObject)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "for request in client.requests:\n", + " if request.code.service_func_name == wrong_syntax_job.func_name:\n", + " request.approve()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "job_res = getattr(ds_client.code, wrong_syntax_job.func_name)(blocking=False)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "assert isinstance(job_res.wait(), sy.SyftError)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "if server.server_type.value == \"python\":\n", + " server.land()" + ] } ], "metadata": { From 6cc5ad933296d8f7bd1f1b41f9bcd58ec801d532 Mon Sep 17 00:00:00 2001 From: teo Date: Mon, 23 Sep 2024 12:18:38 +0300 Subject: [PATCH 14/17] skipping over upgradability tests --- .github/workflows/pr-tests-stack.yml | 1 - tox.ini | 4 ++-- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/.github/workflows/pr-tests-stack.yml b/.github/workflows/pr-tests-stack.yml index a4b0a91851d..5dfb315b565 100644 --- a/.github/workflows/pr-tests-stack.yml +++ b/.github/workflows/pr-tests-stack.yml @@ -681,7 +681,6 @@ jobs: run: | tox -e migration.scenarios.test - pr-tests-migrations-k8s: if: false # skipping this job for now strategy: diff --git a/tox.ini b/tox.ini index 206ba1f286e..4845074018f 100644 --- a/tox.ini +++ b/tox.ini @@ -371,7 +371,7 @@ commands = bash -c "echo Running with ORCHESTRA_DEPLOYMENT_TYPE=$ORCHESTRA_DEPLOYMENT_TYPE DEV_MODE=$DEV_MODE TEST_NOTEBOOK_PATHS=$TEST_NOTEBOOK_PATHS; date" bash -c "for subfolder in $(echo ${TEST_NOTEBOOK_PATHS} | tr ',' ' ');\ do \ - pytest -s -x --nbmake --nbmake-timeout=1000 "$subfolder" --ignore=scenarios/bigquery/sync -p no:randomly -vvvv --log-cli-level=DEBUG --capture=no;\ + pytest -s -x --nbmake --nbmake-timeout=1000 "$subfolder" --ignore=scenarios/bigquery/sync --ignore=scenarios/bigquery/upgradability -p no:randomly -vvvv --log-cli-level=DEBUG --capture=no;\ done" # This is testing BQ with syncing and with in-memory python @@ -481,7 +481,7 @@ commands = # Checking logs generated & startup of bigquery-high bash -c '(kubectl logs service/backend --context k3d-${DATASITE_CLUSTER_NAME} --namespace syft -f &) | grep -q "Application startup complete" || true' - bash -c "pytest -s -x --nbmake notebooks/scenarios/bigquery -p no:randomly --ignore=notebooks/scenarios/bigquery/sync -vvvv --nbmake-timeout=1000 --log-cli-level=DEBUG --capture=no;" + bash -c "pytest -s -x --nbmake notebooks/scenarios/bigquery -p no:randomly --ignore=notebooks/scenarios/bigquery/sync --ignore=notebooks/scenarios/bigquery/upgradability -vvvv --nbmake-timeout=1000 --log-cli-level=DEBUG --capture=no;" # deleting clusters created bash -c "CLUSTER_NAME=${DATASITE_CLUSTER_NAME} tox -e dev.k8s.destroy || true" From 1e0920d2c750b00d7fc1b821a1db1cfae58ec683 Mon Sep 17 00:00:00 2001 From: teo Date: Mon, 23 Sep 2024 12:37:05 +0300 Subject: [PATCH 15/17] changed server name --- ...tart-and-configure-server-and-admins.ipynb | 2 +- .../001-scale-delete-worker-pools.ipynb | 2 +- .../010-setup-bigquery-pool.ipynb | 2 +- .../011-users-emails-passwords.ipynb | 2 +- .../0.9.1_notebooks/020-configure-api.ipynb | 2 +- .../0.9.1_notebooks/021-create-jobs.ipynb | 2 +- .../040-do-review-requests.ipynb | 2 +- .../0.9.1_notebooks/050-ds-get-results.ipynb | 2 +- .../upgradability/0.9.1_notebooks/emails.json | 108 +- .../upgradability/0.9.1_notebooks/jobs.json | 181 +- .../upgradability/0.9.1_notebooks/users.json | 53 +- .../2-migrate-for-scenarios.ipynb | 7710 ++++++++++++++++- 12 files changed, 7638 insertions(+), 430 deletions(-) diff --git a/notebooks/scenarios/bigquery/upgradability/0.9.1_notebooks/000-start-and-configure-server-and-admins.ipynb b/notebooks/scenarios/bigquery/upgradability/0.9.1_notebooks/000-start-and-configure-server-and-admins.ipynb index 054df0d72d5..f1e17f0f7cb 100644 --- a/notebooks/scenarios/bigquery/upgradability/0.9.1_notebooks/000-start-and-configure-server-and-admins.ipynb +++ b/notebooks/scenarios/bigquery/upgradability/0.9.1_notebooks/000-start-and-configure-server-and-admins.ipynb @@ -97,7 +97,7 @@ "outputs": [], "source": [ "server = sy.orchestra.launch(\n", - " name=\"bigquery-high\",\n", + " name=\"bigquery-high-migrations\",\n", " dev_mode=True,\n", " server_side_type=\"high\",\n", " reset=True,\n", diff --git a/notebooks/scenarios/bigquery/upgradability/0.9.1_notebooks/001-scale-delete-worker-pools.ipynb b/notebooks/scenarios/bigquery/upgradability/0.9.1_notebooks/001-scale-delete-worker-pools.ipynb index 832b08874bc..0caab490376 100644 --- a/notebooks/scenarios/bigquery/upgradability/0.9.1_notebooks/001-scale-delete-worker-pools.ipynb +++ b/notebooks/scenarios/bigquery/upgradability/0.9.1_notebooks/001-scale-delete-worker-pools.ipynb @@ -99,7 +99,7 @@ "outputs": [], "source": [ "server = sy.orchestra.launch(\n", - " name=\"bigquery-high\",\n", + " name=\"bigquery-high-migrations\",\n", " dev_mode=True,\n", " server_side_type=\"high\",\n", " port=\"8080\",\n", diff --git a/notebooks/scenarios/bigquery/upgradability/0.9.1_notebooks/010-setup-bigquery-pool.ipynb b/notebooks/scenarios/bigquery/upgradability/0.9.1_notebooks/010-setup-bigquery-pool.ipynb index 3ac9330f823..d40acbcb36d 100644 --- a/notebooks/scenarios/bigquery/upgradability/0.9.1_notebooks/010-setup-bigquery-pool.ipynb +++ b/notebooks/scenarios/bigquery/upgradability/0.9.1_notebooks/010-setup-bigquery-pool.ipynb @@ -81,7 +81,7 @@ "outputs": [], "source": [ "server = sy.orchestra.launch(\n", - " name=\"bigquery-high\",\n", + " name=\"bigquery-high-migrations\",\n", " dev_mode=True,\n", " server_side_type=\"high\",\n", " port=\"8080\",\n", diff --git a/notebooks/scenarios/bigquery/upgradability/0.9.1_notebooks/011-users-emails-passwords.ipynb b/notebooks/scenarios/bigquery/upgradability/0.9.1_notebooks/011-users-emails-passwords.ipynb index fc2b104152d..4206222a490 100644 --- a/notebooks/scenarios/bigquery/upgradability/0.9.1_notebooks/011-users-emails-passwords.ipynb +++ b/notebooks/scenarios/bigquery/upgradability/0.9.1_notebooks/011-users-emails-passwords.ipynb @@ -93,7 +93,7 @@ "outputs": [], "source": [ "server = sy.orchestra.launch(\n", - " name=\"bigquery-high\",\n", + " name=\"bigquery-high-migrations\",\n", " dev_mode=True,\n", " server_side_type=\"high\",\n", " port=\"8080\",\n", diff --git a/notebooks/scenarios/bigquery/upgradability/0.9.1_notebooks/020-configure-api.ipynb b/notebooks/scenarios/bigquery/upgradability/0.9.1_notebooks/020-configure-api.ipynb index 85faea8fbbc..4a7954cf5e7 100644 --- a/notebooks/scenarios/bigquery/upgradability/0.9.1_notebooks/020-configure-api.ipynb +++ b/notebooks/scenarios/bigquery/upgradability/0.9.1_notebooks/020-configure-api.ipynb @@ -95,7 +95,7 @@ "outputs": [], "source": [ "server = sy.orchestra.launch(\n", - " name=\"bigquery-high\",\n", + " name=\"bigquery-high-migrations\",\n", " dev_mode=True,\n", " server_side_type=\"high\",\n", " port=\"8080\",\n", diff --git a/notebooks/scenarios/bigquery/upgradability/0.9.1_notebooks/021-create-jobs.ipynb b/notebooks/scenarios/bigquery/upgradability/0.9.1_notebooks/021-create-jobs.ipynb index 323bb616adb..87a3033d9d8 100644 --- a/notebooks/scenarios/bigquery/upgradability/0.9.1_notebooks/021-create-jobs.ipynb +++ b/notebooks/scenarios/bigquery/upgradability/0.9.1_notebooks/021-create-jobs.ipynb @@ -119,7 +119,7 @@ "outputs": [], "source": [ "server = sy.orchestra.launch(\n", - " name=\"bigquery-high\",\n", + " name=\"bigquery-high-migrations\",\n", " dev_mode=True,\n", " server_side_type=\"high\",\n", " port=SERVER_PORT,\n", diff --git a/notebooks/scenarios/bigquery/upgradability/0.9.1_notebooks/040-do-review-requests.ipynb b/notebooks/scenarios/bigquery/upgradability/0.9.1_notebooks/040-do-review-requests.ipynb index f2636cfa6a4..da95c7e5431 100644 --- a/notebooks/scenarios/bigquery/upgradability/0.9.1_notebooks/040-do-review-requests.ipynb +++ b/notebooks/scenarios/bigquery/upgradability/0.9.1_notebooks/040-do-review-requests.ipynb @@ -84,7 +84,7 @@ "outputs": [], "source": [ "server = sy.orchestra.launch(\n", - " name=\"bigquery-high\",\n", + " name=\"bigquery-high-migrations\",\n", " dev_mode=True,\n", " server_side_type=\"high\",\n", " port=\"8080\",\n", diff --git a/notebooks/scenarios/bigquery/upgradability/0.9.1_notebooks/050-ds-get-results.ipynb b/notebooks/scenarios/bigquery/upgradability/0.9.1_notebooks/050-ds-get-results.ipynb index 1b4aec43f98..81e0e288a43 100644 --- a/notebooks/scenarios/bigquery/upgradability/0.9.1_notebooks/050-ds-get-results.ipynb +++ b/notebooks/scenarios/bigquery/upgradability/0.9.1_notebooks/050-ds-get-results.ipynb @@ -80,7 +80,7 @@ "outputs": [], "source": [ "server = sy.orchestra.launch(\n", - " name=\"bigquery-high\",\n", + " name=\"bigquery-high-migrations\",\n", " dev_mode=True,\n", " server_side_type=\"high\",\n", " port=\"8080\",\n", diff --git a/notebooks/scenarios/bigquery/upgradability/0.9.1_notebooks/emails.json b/notebooks/scenarios/bigquery/upgradability/0.9.1_notebooks/emails.json index 0c40cb90d11..7484c139838 100644 --- a/notebooks/scenarios/bigquery/upgradability/0.9.1_notebooks/emails.json +++ b/notebooks/scenarios/bigquery/upgradability/0.9.1_notebooks/emails.json @@ -1,107 +1 @@ -{ - "admin@bigquery.org": [ - { - "email_from": "noreply@openmined.org", - "email_to": ["admin@bigquery.org"], - "email_content": "Content-Type: multipart/alternative; boundary=\"===============1727108626636976704==\"\r\nMIME-Version: 1.0\r\nFrom: noreply@openmined.org\r\nTo: admin@bigquery.org\r\nSubject: Datasite bigquery-high: A New Request (f145) has been received!\r\n\r\n--===============1727108626636976704==\r\nContent-Type: text/html; charset=\"us-ascii\"\r\nMIME-Version: 1.0\r\nContent-Transfer-Encoding: 7bit\r\n\r\n\r\n \r\n Access Request Notification\r\n \r\n \r\n \r\n
\r\n
\r\n Request Notification\r\n
\r\n
\r\n

Hello,

\r\n

A new request has been submitted and requires your attention.\r\n Please review the details below:

\r\n\r\n
\r\n
Request Details
\r\n
\r\n\r\n

ID: f145c5b5be1e4b30b4b70d72c97a6d10

\r\n

\r\n Submitted By:\r\n Arthur Smith\r\n

\r\n

Date: 2024-09-23 07:32:45

\r\n

Status:

\r\n PENDING\r\n
\r\n

Changes:\r\n UserCodeStatusChange\r\n

\r\n\r\n

Use:
\r\n \r\n request = client.api.services.request.get_by_uid(uid=sy.UID(\"f145c5b5be1e4b30b4b70d72c97a6d10\"))\r\n
\r\n to get this specific request.\r\n

\r\n\r\n

Or you can view all requests with:
\r\n \r\n client.requests\r\n \r\n

\r\n\r\n
\r\n
\r\n

If you did not expect this request or have concerns about it,\r\n please contact our support team immediately.

\r\n
\r\n
\r\n This is an automated message, please do not reply directly to this email.
\r\n For assistance, please contact our support team.\r\n
\r\n
\r\n \r\n \r\n--===============1727108626636976704==--\r\n" - }, - { - "email_from": "noreply@openmined.org", - "email_to": ["admin@bigquery.org"], - "email_content": "Content-Type: multipart/alternative; boundary=\"===============8150226390710453256==\"\r\nMIME-Version: 1.0\r\nFrom: noreply@openmined.org\r\nTo: admin@bigquery.org\r\nSubject: Datasite bigquery-high: A New Request (5dca) has been received!\r\n\r\n--===============8150226390710453256==\r\nContent-Type: text/html; charset=\"us-ascii\"\r\nMIME-Version: 1.0\r\nContent-Transfer-Encoding: 7bit\r\n\r\n\r\n \r\n Access Request Notification\r\n \r\n \r\n \r\n
\r\n
\r\n Request Notification\r\n
\r\n
\r\n

Hello,

\r\n

A new request has been submitted and requires your attention.\r\n Please review the details below:

\r\n\r\n
\r\n
Request Details
\r\n
\r\n\r\n

ID: 5dcabc08b92d40729cccf97c6f91dc58

\r\n

\r\n Submitted By:\r\n Noah Hinton\r\n

\r\n

Date: 2024-09-23 07:32:56

\r\n

Status:

\r\n PENDING\r\n
\r\n

Changes:\r\n UserCodeStatusChange\r\n

\r\n\r\n

Use:
\r\n \r\n request = client.api.services.request.get_by_uid(uid=sy.UID(\"5dcabc08b92d40729cccf97c6f91dc58\"))\r\n
\r\n to get this specific request.\r\n

\r\n\r\n

Or you can view all requests with:
\r\n \r\n client.requests\r\n \r\n

\r\n\r\n
\r\n
\r\n

If you did not expect this request or have concerns about it,\r\n please contact our support team immediately.

\r\n
\r\n
\r\n This is an automated message, please do not reply directly to this email.
\r\n For assistance, please contact our support team.\r\n
\r\n
\r\n \r\n \r\n--===============8150226390710453256==--\r\n" - }, - { - "email_from": "noreply@openmined.org", - "email_to": ["admin@bigquery.org"], - "email_content": "Content-Type: multipart/alternative; boundary=\"===============7091869554779523847==\"\r\nMIME-Version: 1.0\r\nFrom: noreply@openmined.org\r\nTo: admin@bigquery.org\r\nSubject: Datasite bigquery-high: A New Request (3bb3) has been received!\r\n\r\n--===============7091869554779523847==\r\nContent-Type: text/html; charset=\"us-ascii\"\r\nMIME-Version: 1.0\r\nContent-Transfer-Encoding: 7bit\r\n\r\n\r\n \r\n Access Request Notification\r\n \r\n \r\n \r\n
\r\n
\r\n Request Notification\r\n
\r\n
\r\n

Hello,

\r\n

A new request has been submitted and requires your attention.\r\n Please review the details below:

\r\n\r\n
\r\n
Request Details
\r\n
\r\n\r\n

ID: 3bb36547478f4ca7b6d081cda33473b7

\r\n

\r\n Submitted By:\r\n Samantha Heath\r\n

\r\n

Date: 2024-09-23 07:33:05

\r\n

Status:

\r\n PENDING\r\n
\r\n

Changes:\r\n UserCodeStatusChange\r\n

\r\n\r\n

Use:
\r\n \r\n request = client.api.services.request.get_by_uid(uid=sy.UID(\"3bb36547478f4ca7b6d081cda33473b7\"))\r\n
\r\n to get this specific request.\r\n

\r\n\r\n

Or you can view all requests with:
\r\n \r\n client.requests\r\n \r\n

\r\n\r\n
\r\n
\r\n

If you did not expect this request or have concerns about it,\r\n please contact our support team immediately.

\r\n
\r\n
\r\n This is an automated message, please do not reply directly to this email.
\r\n For assistance, please contact our support team.\r\n
\r\n
\r\n \r\n \r\n--===============7091869554779523847==--\r\n" - }, - { - "email_from": "noreply@openmined.org", - "email_to": ["admin@bigquery.org"], - "email_content": "Content-Type: multipart/alternative; boundary=\"===============9222421578986331565==\"\r\nMIME-Version: 1.0\r\nFrom: noreply@openmined.org\r\nTo: admin@bigquery.org\r\nSubject: Datasite bigquery-high: A New Request (34e2) has been received!\r\n\r\n--===============9222421578986331565==\r\nContent-Type: text/html; charset=\"us-ascii\"\r\nMIME-Version: 1.0\r\nContent-Transfer-Encoding: 7bit\r\n\r\n\r\n \r\n Access Request Notification\r\n \r\n \r\n \r\n
\r\n
\r\n Request Notification\r\n
\r\n
\r\n

Hello,

\r\n

A new request has been submitted and requires your attention.\r\n Please review the details below:

\r\n\r\n
\r\n
Request Details
\r\n
\r\n\r\n

ID: 34e25431aeab460cb53c94f4b31411e3

\r\n

\r\n Submitted By:\r\n Eric Morales\r\n

\r\n

Date: 2024-09-23 07:33:15

\r\n

Status:

\r\n PENDING\r\n
\r\n

Changes:\r\n UserCodeStatusChange\r\n

\r\n\r\n

Use:
\r\n \r\n request = client.api.services.request.get_by_uid(uid=sy.UID(\"34e25431aeab460cb53c94f4b31411e3\"))\r\n
\r\n to get this specific request.\r\n

\r\n\r\n

Or you can view all requests with:
\r\n \r\n client.requests\r\n \r\n

\r\n\r\n
\r\n
\r\n

If you did not expect this request or have concerns about it,\r\n please contact our support team immediately.

\r\n
\r\n
\r\n This is an automated message, please do not reply directly to this email.
\r\n For assistance, please contact our support team.\r\n
\r\n
\r\n \r\n \r\n--===============9222421578986331565==--\r\n" - }, - { - "email_from": "noreply@openmined.org", - "email_to": ["admin@bigquery.org"], - "email_content": "Content-Type: multipart/alternative; boundary=\"===============4255237758205268447==\"\r\nMIME-Version: 1.0\r\nFrom: noreply@openmined.org\r\nTo: admin@bigquery.org\r\nSubject: Datasite bigquery-high: A New Request (b9d5) has been received!\r\n\r\n--===============4255237758205268447==\r\nContent-Type: text/html; charset=\"us-ascii\"\r\nMIME-Version: 1.0\r\nContent-Transfer-Encoding: 7bit\r\n\r\n\r\n \r\n Access Request Notification\r\n \r\n \r\n \r\n
\r\n
\r\n Request Notification\r\n
\r\n
\r\n

Hello,

\r\n

A new request has been submitted and requires your attention.\r\n Please review the details below:

\r\n\r\n
\r\n
Request Details
\r\n
\r\n\r\n

ID: b9d5af221e014cf8824babdb984a8f4e

\r\n

\r\n Submitted By:\r\n Lisa Guerra\r\n

\r\n

Date: 2024-09-23 07:33:25

\r\n

Status:

\r\n PENDING\r\n
\r\n

Changes:\r\n UserCodeStatusChange\r\n

\r\n\r\n

Use:
\r\n \r\n request = client.api.services.request.get_by_uid(uid=sy.UID(\"b9d5af221e014cf8824babdb984a8f4e\"))\r\n
\r\n to get this specific request.\r\n

\r\n\r\n

Or you can view all requests with:
\r\n \r\n client.requests\r\n \r\n

\r\n\r\n
\r\n
\r\n

If you did not expect this request or have concerns about it,\r\n please contact our support team immediately.

\r\n
\r\n
\r\n This is an automated message, please do not reply directly to this email.
\r\n For assistance, please contact our support team.\r\n
\r\n
\r\n \r\n \r\n--===============4255237758205268447==--\r\n" - }, - { - "email_from": "noreply@openmined.org", - "email_to": ["admin@bigquery.org"], - "email_content": "Content-Type: multipart/alternative; boundary=\"===============3781529602699007377==\"\r\nMIME-Version: 1.0\r\nFrom: noreply@openmined.org\r\nTo: admin@bigquery.org\r\nSubject: Datasite bigquery-high: A New Request (a6b1) has been received!\r\n\r\n--===============3781529602699007377==\r\nContent-Type: text/html; charset=\"us-ascii\"\r\nMIME-Version: 1.0\r\nContent-Transfer-Encoding: 7bit\r\n\r\n\r\n \r\n Access Request Notification\r\n \r\n \r\n \r\n
\r\n
\r\n Request Notification\r\n
\r\n
\r\n

Hello,

\r\n

A new request has been submitted and requires your attention.\r\n Please review the details below:

\r\n\r\n
\r\n
Request Details
\r\n
\r\n\r\n

ID: a6b1b9b9723d4d67b95924b40c963226

\r\n

\r\n Submitted By:\r\n Arthur Smith\r\n

\r\n

Date: 2024-09-23 07:33:34

\r\n

Status:

\r\n PENDING\r\n
\r\n

Changes:\r\n UserCodeStatusChange\r\n

\r\n\r\n

Use:
\r\n \r\n request = client.api.services.request.get_by_uid(uid=sy.UID(\"a6b1b9b9723d4d67b95924b40c963226\"))\r\n
\r\n to get this specific request.\r\n

\r\n\r\n

Or you can view all requests with:
\r\n \r\n client.requests\r\n \r\n

\r\n\r\n
\r\n
\r\n

If you did not expect this request or have concerns about it,\r\n please contact our support team immediately.

\r\n
\r\n
\r\n This is an automated message, please do not reply directly to this email.
\r\n For assistance, please contact our support team.\r\n
\r\n
\r\n \r\n \r\n--===============3781529602699007377==--\r\n" - }, - { - "email_from": "noreply@openmined.org", - "email_to": ["admin@bigquery.org"], - "email_content": "Content-Type: multipart/alternative; boundary=\"===============7329781531780921231==\"\r\nMIME-Version: 1.0\r\nFrom: noreply@openmined.org\r\nTo: admin@bigquery.org\r\nSubject: Datasite bigquery-high: A New Request (bd99) has been received!\r\n\r\n--===============7329781531780921231==\r\nContent-Type: text/html; charset=\"us-ascii\"\r\nMIME-Version: 1.0\r\nContent-Transfer-Encoding: 7bit\r\n\r\n\r\n \r\n Access Request Notification\r\n \r\n \r\n \r\n
\r\n
\r\n Request Notification\r\n
\r\n
\r\n

Hello,

\r\n

A new request has been submitted and requires your attention.\r\n Please review the details below:

\r\n\r\n
\r\n
Request Details
\r\n
\r\n\r\n

ID: bd992c2c84c7431c90ecb27881e159ab

\r\n

\r\n Submitted By:\r\n Noah Hinton\r\n

\r\n

Date: 2024-09-23 07:33:43

\r\n

Status:

\r\n PENDING\r\n
\r\n

Changes:\r\n UserCodeStatusChange\r\n

\r\n\r\n

Use:
\r\n \r\n request = client.api.services.request.get_by_uid(uid=sy.UID(\"bd992c2c84c7431c90ecb27881e159ab\"))\r\n
\r\n to get this specific request.\r\n

\r\n\r\n

Or you can view all requests with:
\r\n \r\n client.requests\r\n \r\n

\r\n\r\n
\r\n
\r\n

If you did not expect this request or have concerns about it,\r\n please contact our support team immediately.

\r\n
\r\n
\r\n This is an automated message, please do not reply directly to this email.
\r\n For assistance, please contact our support team.\r\n
\r\n
\r\n \r\n \r\n--===============7329781531780921231==--\r\n" - }, - { - "email_from": "noreply@openmined.org", - "email_to": ["admin@bigquery.org"], - "email_content": "Content-Type: multipart/alternative; boundary=\"===============5392983222642902852==\"\r\nMIME-Version: 1.0\r\nFrom: noreply@openmined.org\r\nTo: admin@bigquery.org\r\nSubject: Datasite bigquery-high: A New Request (27cc) has been received!\r\n\r\n--===============5392983222642902852==\r\nContent-Type: text/html; charset=\"us-ascii\"\r\nMIME-Version: 1.0\r\nContent-Transfer-Encoding: 7bit\r\n\r\n\r\n \r\n Access Request Notification\r\n \r\n \r\n \r\n
\r\n
\r\n Request Notification\r\n
\r\n
\r\n

Hello,

\r\n

A new request has been submitted and requires your attention.\r\n Please review the details below:

\r\n\r\n
\r\n
Request Details
\r\n
\r\n\r\n

ID: 27ccfb2a92964c169e32f0e2e1fb2b3f

\r\n

\r\n Submitted By:\r\n Samantha Heath\r\n

\r\n

Date: 2024-09-23 07:33:53

\r\n

Status:

\r\n PENDING\r\n
\r\n

Changes:\r\n UserCodeStatusChange\r\n

\r\n\r\n

Use:
\r\n \r\n request = client.api.services.request.get_by_uid(uid=sy.UID(\"27ccfb2a92964c169e32f0e2e1fb2b3f\"))\r\n
\r\n to get this specific request.\r\n

\r\n\r\n

Or you can view all requests with:
\r\n \r\n client.requests\r\n \r\n

\r\n\r\n
\r\n
\r\n

If you did not expect this request or have concerns about it,\r\n please contact our support team immediately.

\r\n
\r\n
\r\n This is an automated message, please do not reply directly to this email.
\r\n For assistance, please contact our support team.\r\n
\r\n
\r\n \r\n \r\n--===============5392983222642902852==--\r\n" - }, - { - "email_from": "noreply@openmined.org", - "email_to": ["admin@bigquery.org"], - "email_content": "Content-Type: multipart/alternative; boundary=\"===============0608366424911457624==\"\r\nMIME-Version: 1.0\r\nFrom: noreply@openmined.org\r\nTo: admin@bigquery.org\r\nSubject: Datasite bigquery-high: A New Request (69fd) has been received!\r\n\r\n--===============0608366424911457624==\r\nContent-Type: text/html; charset=\"us-ascii\"\r\nMIME-Version: 1.0\r\nContent-Transfer-Encoding: 7bit\r\n\r\n\r\n \r\n Access Request Notification\r\n \r\n \r\n \r\n
\r\n
\r\n Request Notification\r\n
\r\n
\r\n

Hello,

\r\n

A new request has been submitted and requires your attention.\r\n Please review the details below:

\r\n\r\n
\r\n
Request Details
\r\n
\r\n\r\n

ID: 69fdb8cca5ed412c944dae63d58fac74

\r\n

\r\n Submitted By:\r\n Eric Morales\r\n

\r\n

Date: 2024-09-23 07:34:02

\r\n

Status:

\r\n PENDING\r\n
\r\n

Changes:\r\n UserCodeStatusChange\r\n

\r\n\r\n

Use:
\r\n \r\n request = client.api.services.request.get_by_uid(uid=sy.UID(\"69fdb8cca5ed412c944dae63d58fac74\"))\r\n
\r\n to get this specific request.\r\n

\r\n\r\n

Or you can view all requests with:
\r\n \r\n client.requests\r\n \r\n

\r\n\r\n
\r\n
\r\n

If you did not expect this request or have concerns about it,\r\n please contact our support team immediately.

\r\n
\r\n
\r\n This is an automated message, please do not reply directly to this email.
\r\n For assistance, please contact our support team.\r\n
\r\n
\r\n \r\n \r\n--===============0608366424911457624==--\r\n" - } - ], - "noah-hinton-fake@openmined.org": [ - { - "email_from": "noreply@openmined.org", - "email_to": ["noah-hinton-fake@openmined.org"], - "email_content": "Content-Type: multipart/alternative; boundary=\"===============4668612500231942150==\"\r\nMIME-Version: 1.0\r\nFrom: noreply@openmined.org\r\nTo: noah-hinton-fake@openmined.org\r\nSubject: Datasite bigquery-high: Your request (5dca) has been approved. \r\n\r\n--===============4668612500231942150==\r\nContent-Type: text/html; charset=\"us-ascii\"\r\nMIME-Version: 1.0\r\nContent-Transfer-Encoding: 7bit\r\n\r\n\r\n \r\n Access Request Notification\r\n \r\n \r\n \r\n
\r\n
\r\n Request Notification\r\n
\r\n
\r\n

Hello,

\r\n

The status of your recent request has been updated.\r\n Below is the latest information regarding it:

\r\n\r\n
\r\n
Request Details
\r\n
\r\n\r\n

ID: 5dcabc08b92d40729cccf97c6f91dc58

\r\n

\r\n Submitted By:\r\n Noah Hinton noah-hinton-fake@openmined.org\r\n

\r\n

Date: 2024-09-23 07:32:56

\r\n

Status:

\r\n APPROVED\r\n
\r\n

\r\n Changes:\r\n UserCodeStatusChange\r\n

\r\n\r\n

Use:
\r\n \r\n request = client.api.services.request.get_by_uid(uid=sy.UID(\"5dcabc08b92d40729cccf97c6f91dc58\"))\r\n
\r\n to get this specific request.\r\n

\r\n\r\n

Or you can view all requests with:
\r\n \r\n client.requests\r\n \r\n

\r\n
\r\n
\r\n

If you did not expect this request or have concerns about it,\r\n please contact our support team immediately.

\r\n
\r\n
\r\n This is an automated message, please do not reply directly to this email.
\r\n For assistance, please contact our support team.\r\n
\r\n
\r\n \r\n \r\n--===============4668612500231942150==--\r\n" - }, - { - "email_from": "noreply@openmined.org", - "email_to": ["noah-hinton-fake@openmined.org"], - "email_content": "Content-Type: multipart/alternative; boundary=\"===============1664426106479672062==\"\r\nMIME-Version: 1.0\r\nFrom: noreply@openmined.org\r\nTo: noah-hinton-fake@openmined.org\r\nSubject: Datasite bigquery-high: Your request (5dca) has been approved. \r\n\r\n--===============1664426106479672062==\r\nContent-Type: text/html; charset=\"us-ascii\"\r\nMIME-Version: 1.0\r\nContent-Transfer-Encoding: 7bit\r\n\r\n\r\n \r\n Access Request Notification\r\n \r\n \r\n \r\n
\r\n
\r\n Request Notification\r\n
\r\n
\r\n

Hello,

\r\n

The status of your recent request has been updated.\r\n Below is the latest information regarding it:

\r\n\r\n
\r\n
Request Details
\r\n
\r\n\r\n

ID: 5dcabc08b92d40729cccf97c6f91dc58

\r\n

\r\n Submitted By:\r\n Noah Hinton noah-hinton-fake@openmined.org\r\n

\r\n

Date: 2024-09-23 07:32:56

\r\n

Status:

\r\n APPROVED\r\n
\r\n

\r\n Changes:\r\n UserCodeStatusChange,ActionStoreChange\r\n

\r\n\r\n

Use:
\r\n \r\n request = client.api.services.request.get_by_uid(uid=sy.UID(\"5dcabc08b92d40729cccf97c6f91dc58\"))\r\n
\r\n to get this specific request.\r\n

\r\n\r\n

Or you can view all requests with:
\r\n \r\n client.requests\r\n \r\n

\r\n
\r\n
\r\n

If you did not expect this request or have concerns about it,\r\n please contact our support team immediately.

\r\n
\r\n
\r\n This is an automated message, please do not reply directly to this email.
\r\n For assistance, please contact our support team.\r\n
\r\n
\r\n \r\n \r\n--===============1664426106479672062==--\r\n" - }, - { - "email_from": "noreply@openmined.org", - "email_to": ["noah-hinton-fake@openmined.org"], - "email_content": "Content-Type: multipart/alternative; boundary=\"===============7140248350771488465==\"\r\nMIME-Version: 1.0\r\nFrom: noreply@openmined.org\r\nTo: noah-hinton-fake@openmined.org\r\nSubject: Datasite bigquery-high: Your request (bd99) has been denied. \r\n\r\n--===============7140248350771488465==\r\nContent-Type: text/html; charset=\"us-ascii\"\r\nMIME-Version: 1.0\r\nContent-Transfer-Encoding: 7bit\r\n\r\n\r\n \r\n Access Request Notification\r\n \r\n \r\n \r\n
\r\n
\r\n Request Notification\r\n
\r\n
\r\n

Hello,

\r\n

The status of your recent request has been updated.\r\n Below is the latest information regarding it:

\r\n\r\n
\r\n
Request Details
\r\n
\r\n\r\n

ID: bd992c2c84c7431c90ecb27881e159ab

\r\n

\r\n Submitted By:\r\n Noah Hinton noah-hinton-fake@openmined.org\r\n

\r\n

Date: 2024-09-23 07:33:43

\r\n

Status:

\r\n REJECTED\r\n
\r\n

\r\n Changes:\r\n UserCodeStatusChange\r\n

\r\n\r\n

Use:
\r\n \r\n request = client.api.services.request.get_by_uid(uid=sy.UID(\"bd992c2c84c7431c90ecb27881e159ab\"))\r\n
\r\n to get this specific request.\r\n

\r\n\r\n

Or you can view all requests with:
\r\n \r\n client.requests\r\n \r\n

\r\n
\r\n
\r\n

If you did not expect this request or have concerns about it,\r\n please contact our support team immediately.

\r\n
\r\n
\r\n This is an automated message, please do not reply directly to this email.
\r\n For assistance, please contact our support team.\r\n
\r\n
\r\n \r\n \r\n--===============7140248350771488465==--\r\n" - } - ], - "samantha-heath-fake@openmined.org": [ - { - "email_from": "noreply@openmined.org", - "email_to": ["samantha-heath-fake@openmined.org"], - "email_content": "Content-Type: multipart/alternative; boundary=\"===============7097352730176798952==\"\r\nMIME-Version: 1.0\r\nFrom: noreply@openmined.org\r\nTo: samantha-heath-fake@openmined.org\r\nSubject: Datasite bigquery-high: Your request (3bb3) has been approved. \r\n\r\n--===============7097352730176798952==\r\nContent-Type: text/html; charset=\"us-ascii\"\r\nMIME-Version: 1.0\r\nContent-Transfer-Encoding: 7bit\r\n\r\n\r\n \r\n Access Request Notification\r\n \r\n \r\n \r\n
\r\n
\r\n Request Notification\r\n
\r\n
\r\n

Hello,

\r\n

The status of your recent request has been updated.\r\n Below is the latest information regarding it:

\r\n\r\n
\r\n
Request Details
\r\n
\r\n\r\n

ID: 3bb36547478f4ca7b6d081cda33473b7

\r\n

\r\n Submitted By:\r\n Samantha Heath samantha-heath-fake@openmined.org\r\n

\r\n

Date: 2024-09-23 07:33:05

\r\n

Status:

\r\n APPROVED\r\n
\r\n

\r\n Changes:\r\n UserCodeStatusChange\r\n

\r\n\r\n

Use:
\r\n \r\n request = client.api.services.request.get_by_uid(uid=sy.UID(\"3bb36547478f4ca7b6d081cda33473b7\"))\r\n
\r\n to get this specific request.\r\n

\r\n\r\n

Or you can view all requests with:
\r\n \r\n client.requests\r\n \r\n

\r\n
\r\n
\r\n

If you did not expect this request or have concerns about it,\r\n please contact our support team immediately.

\r\n
\r\n
\r\n This is an automated message, please do not reply directly to this email.
\r\n For assistance, please contact our support team.\r\n
\r\n
\r\n \r\n \r\n--===============7097352730176798952==--\r\n" - }, - { - "email_from": "noreply@openmined.org", - "email_to": ["samantha-heath-fake@openmined.org"], - "email_content": "Content-Type: multipart/alternative; boundary=\"===============5440376299438389997==\"\r\nMIME-Version: 1.0\r\nFrom: noreply@openmined.org\r\nTo: samantha-heath-fake@openmined.org\r\nSubject: Datasite bigquery-high: Your request (3bb3) has been approved. \r\n\r\n--===============5440376299438389997==\r\nContent-Type: text/html; charset=\"us-ascii\"\r\nMIME-Version: 1.0\r\nContent-Transfer-Encoding: 7bit\r\n\r\n\r\n \r\n Access Request Notification\r\n \r\n \r\n \r\n
\r\n
\r\n Request Notification\r\n
\r\n
\r\n

Hello,

\r\n

The status of your recent request has been updated.\r\n Below is the latest information regarding it:

\r\n\r\n
\r\n
Request Details
\r\n
\r\n\r\n

ID: 3bb36547478f4ca7b6d081cda33473b7

\r\n

\r\n Submitted By:\r\n Samantha Heath samantha-heath-fake@openmined.org\r\n

\r\n

Date: 2024-09-23 07:33:05

\r\n

Status:

\r\n APPROVED\r\n
\r\n

\r\n Changes:\r\n UserCodeStatusChange,ActionStoreChange\r\n

\r\n\r\n

Use:
\r\n \r\n request = client.api.services.request.get_by_uid(uid=sy.UID(\"3bb36547478f4ca7b6d081cda33473b7\"))\r\n
\r\n to get this specific request.\r\n

\r\n\r\n

Or you can view all requests with:
\r\n \r\n client.requests\r\n \r\n

\r\n
\r\n
\r\n

If you did not expect this request or have concerns about it,\r\n please contact our support team immediately.

\r\n
\r\n
\r\n This is an automated message, please do not reply directly to this email.
\r\n For assistance, please contact our support team.\r\n
\r\n
\r\n \r\n \r\n--===============5440376299438389997==--\r\n" - }, - { - "email_from": "noreply@openmined.org", - "email_to": ["samantha-heath-fake@openmined.org"], - "email_content": "Content-Type: multipart/alternative; boundary=\"===============3256986251927753339==\"\r\nMIME-Version: 1.0\r\nFrom: noreply@openmined.org\r\nTo: samantha-heath-fake@openmined.org\r\nSubject: Datasite bigquery-high: Your request (27cc) has been denied. \r\n\r\n--===============3256986251927753339==\r\nContent-Type: text/html; charset=\"us-ascii\"\r\nMIME-Version: 1.0\r\nContent-Transfer-Encoding: 7bit\r\n\r\n\r\n \r\n Access Request Notification\r\n \r\n \r\n \r\n
\r\n
\r\n Request Notification\r\n
\r\n
\r\n

Hello,

\r\n

The status of your recent request has been updated.\r\n Below is the latest information regarding it:

\r\n\r\n
\r\n
Request Details
\r\n
\r\n\r\n

ID: 27ccfb2a92964c169e32f0e2e1fb2b3f

\r\n

\r\n Submitted By:\r\n Samantha Heath samantha-heath-fake@openmined.org\r\n

\r\n

Date: 2024-09-23 07:33:53

\r\n

Status:

\r\n REJECTED\r\n
\r\n

\r\n Changes:\r\n UserCodeStatusChange\r\n

\r\n\r\n

Use:
\r\n \r\n request = client.api.services.request.get_by_uid(uid=sy.UID(\"27ccfb2a92964c169e32f0e2e1fb2b3f\"))\r\n
\r\n to get this specific request.\r\n

\r\n\r\n

Or you can view all requests with:
\r\n \r\n client.requests\r\n \r\n

\r\n
\r\n
\r\n

If you did not expect this request or have concerns about it,\r\n please contact our support team immediately.

\r\n
\r\n
\r\n This is an automated message, please do not reply directly to this email.
\r\n For assistance, please contact our support team.\r\n
\r\n
\r\n \r\n \r\n--===============3256986251927753339==--\r\n" - } - ], - "eric-morales-fake@openmined.org": [ - { - "email_from": "noreply@openmined.org", - "email_to": ["eric-morales-fake@openmined.org"], - "email_content": "Content-Type: multipart/alternative; boundary=\"===============3614199994398570752==\"\r\nMIME-Version: 1.0\r\nFrom: noreply@openmined.org\r\nTo: eric-morales-fake@openmined.org\r\nSubject: Datasite bigquery-high: Your request (34e2) has been approved. \r\n\r\n--===============3614199994398570752==\r\nContent-Type: text/html; charset=\"us-ascii\"\r\nMIME-Version: 1.0\r\nContent-Transfer-Encoding: 7bit\r\n\r\n\r\n \r\n Access Request Notification\r\n \r\n \r\n \r\n
\r\n
\r\n Request Notification\r\n
\r\n
\r\n

Hello,

\r\n

The status of your recent request has been updated.\r\n Below is the latest information regarding it:

\r\n\r\n
\r\n
Request Details
\r\n
\r\n\r\n

ID: 34e25431aeab460cb53c94f4b31411e3

\r\n

\r\n Submitted By:\r\n Eric Morales eric-morales-fake@openmined.org\r\n

\r\n

Date: 2024-09-23 07:33:15

\r\n

Status:

\r\n APPROVED\r\n
\r\n

\r\n Changes:\r\n UserCodeStatusChange\r\n

\r\n\r\n

Use:
\r\n \r\n request = client.api.services.request.get_by_uid(uid=sy.UID(\"34e25431aeab460cb53c94f4b31411e3\"))\r\n
\r\n to get this specific request.\r\n

\r\n\r\n

Or you can view all requests with:
\r\n \r\n client.requests\r\n \r\n

\r\n
\r\n
\r\n

If you did not expect this request or have concerns about it,\r\n please contact our support team immediately.

\r\n
\r\n
\r\n This is an automated message, please do not reply directly to this email.
\r\n For assistance, please contact our support team.\r\n
\r\n
\r\n \r\n \r\n--===============3614199994398570752==--\r\n" - }, - { - "email_from": "noreply@openmined.org", - "email_to": ["eric-morales-fake@openmined.org"], - "email_content": "Content-Type: multipart/alternative; boundary=\"===============6923180737459966315==\"\r\nMIME-Version: 1.0\r\nFrom: noreply@openmined.org\r\nTo: eric-morales-fake@openmined.org\r\nSubject: Datasite bigquery-high: Your request (69fd) has been approved. \r\n\r\n--===============6923180737459966315==\r\nContent-Type: text/html; charset=\"us-ascii\"\r\nMIME-Version: 1.0\r\nContent-Transfer-Encoding: 7bit\r\n\r\n\r\n \r\n Access Request Notification\r\n \r\n \r\n \r\n
\r\n
\r\n Request Notification\r\n
\r\n
\r\n

Hello,

\r\n

The status of your recent request has been updated.\r\n Below is the latest information regarding it:

\r\n\r\n
\r\n
Request Details
\r\n
\r\n\r\n

ID: 69fdb8cca5ed412c944dae63d58fac74

\r\n

\r\n Submitted By:\r\n Eric Morales eric-morales-fake@openmined.org\r\n

\r\n

Date: 2024-09-23 07:34:02

\r\n

Status:

\r\n APPROVED\r\n
\r\n

\r\n Changes:\r\n UserCodeStatusChange\r\n

\r\n\r\n

Use:
\r\n \r\n request = client.api.services.request.get_by_uid(uid=sy.UID(\"69fdb8cca5ed412c944dae63d58fac74\"))\r\n
\r\n to get this specific request.\r\n

\r\n\r\n

Or you can view all requests with:
\r\n \r\n client.requests\r\n \r\n

\r\n
\r\n
\r\n

If you did not expect this request or have concerns about it,\r\n please contact our support team immediately.

\r\n
\r\n
\r\n This is an automated message, please do not reply directly to this email.
\r\n For assistance, please contact our support team.\r\n
\r\n
\r\n \r\n \r\n--===============6923180737459966315==--\r\n" - } - ], - "lisa-guerra-fake@openmined.org": [ - { - "email_from": "noreply@openmined.org", - "email_to": ["lisa-guerra-fake@openmined.org"], - "email_content": "Content-Type: multipart/alternative; boundary=\"===============2846955048916211996==\"\r\nMIME-Version: 1.0\r\nFrom: noreply@openmined.org\r\nTo: lisa-guerra-fake@openmined.org\r\nSubject: Datasite bigquery-high: Your request (b9d5) has been approved. \r\n\r\n--===============2846955048916211996==\r\nContent-Type: text/html; charset=\"us-ascii\"\r\nMIME-Version: 1.0\r\nContent-Transfer-Encoding: 7bit\r\n\r\n\r\n \r\n Access Request Notification\r\n \r\n \r\n \r\n
\r\n
\r\n Request Notification\r\n
\r\n
\r\n

Hello,

\r\n

The status of your recent request has been updated.\r\n Below is the latest information regarding it:

\r\n\r\n
\r\n
Request Details
\r\n
\r\n\r\n

ID: b9d5af221e014cf8824babdb984a8f4e

\r\n

\r\n Submitted By:\r\n Lisa Guerra lisa-guerra-fake@openmined.org\r\n

\r\n

Date: 2024-09-23 07:33:25

\r\n

Status:

\r\n APPROVED\r\n
\r\n

\r\n Changes:\r\n UserCodeStatusChange\r\n

\r\n\r\n

Use:
\r\n \r\n request = client.api.services.request.get_by_uid(uid=sy.UID(\"b9d5af221e014cf8824babdb984a8f4e\"))\r\n
\r\n to get this specific request.\r\n

\r\n\r\n

Or you can view all requests with:
\r\n \r\n client.requests\r\n \r\n

\r\n
\r\n
\r\n

If you did not expect this request or have concerns about it,\r\n please contact our support team immediately.

\r\n
\r\n
\r\n This is an automated message, please do not reply directly to this email.
\r\n For assistance, please contact our support team.\r\n
\r\n
\r\n \r\n \r\n--===============2846955048916211996==--\r\n" - }, - { - "email_from": "noreply@openmined.org", - "email_to": ["lisa-guerra-fake@openmined.org"], - "email_content": "Content-Type: multipart/alternative; boundary=\"===============9198847279829977146==\"\r\nMIME-Version: 1.0\r\nFrom: noreply@openmined.org\r\nTo: lisa-guerra-fake@openmined.org\r\nSubject: Datasite bigquery-high: Your request (b9d5) has been approved. \r\n\r\n--===============9198847279829977146==\r\nContent-Type: text/html; charset=\"us-ascii\"\r\nMIME-Version: 1.0\r\nContent-Transfer-Encoding: 7bit\r\n\r\n\r\n \r\n Access Request Notification\r\n \r\n \r\n \r\n
\r\n
\r\n Request Notification\r\n
\r\n
\r\n

Hello,

\r\n

The status of your recent request has been updated.\r\n Below is the latest information regarding it:

\r\n\r\n
\r\n
Request Details
\r\n
\r\n\r\n

ID: b9d5af221e014cf8824babdb984a8f4e

\r\n

\r\n Submitted By:\r\n Lisa Guerra lisa-guerra-fake@openmined.org\r\n

\r\n

Date: 2024-09-23 07:33:25

\r\n

Status:

\r\n APPROVED\r\n
\r\n

\r\n Changes:\r\n UserCodeStatusChange,ActionStoreChange\r\n

\r\n\r\n

Use:
\r\n \r\n request = client.api.services.request.get_by_uid(uid=sy.UID(\"b9d5af221e014cf8824babdb984a8f4e\"))\r\n
\r\n to get this specific request.\r\n

\r\n\r\n

Or you can view all requests with:
\r\n \r\n client.requests\r\n \r\n

\r\n
\r\n
\r\n

If you did not expect this request or have concerns about it,\r\n please contact our support team immediately.

\r\n
\r\n
\r\n This is an automated message, please do not reply directly to this email.
\r\n For assistance, please contact our support team.\r\n
\r\n
\r\n \r\n \r\n--===============9198847279829977146==--\r\n" - } - ] -} +{"admin@bigquery.org": [{"email_from": "noreply@openmined.org", "email_to": ["admin@bigquery.org"], "email_content": "Content-Type: multipart/alternative; boundary=\"===============7117641952261823257==\"\r\nMIME-Version: 1.0\r\nFrom: noreply@openmined.org\r\nTo: admin@bigquery.org\r\nSubject: Datasite bigquery-high-migrations: A New Request (8e12) has been received!\r\n\r\n--===============7117641952261823257==\r\nContent-Type: text/html; charset=\"us-ascii\"\r\nMIME-Version: 1.0\r\nContent-Transfer-Encoding: 7bit\r\n\r\n\r\n \r\n Access Request Notification\r\n \r\n \r\n \r\n
\r\n
\r\n Request Notification\r\n
\r\n
\r\n

Hello,

\r\n

A new request has been submitted and requires your attention.\r\n Please review the details below:

\r\n\r\n
\r\n
Request Details
\r\n
\r\n\r\n

ID: 8e12c9ac5c5547b1afe5b5a1d5e24900

\r\n

\r\n Submitted By:\r\n William Thompson\r\n

\r\n

Date: 2024-09-23 09:30:38

\r\n

Status:

\r\n PENDING\r\n
\r\n

Changes:\r\n UserCodeStatusChange\r\n

\r\n\r\n

Use:
\r\n \r\n request = client.api.services.request.get_by_uid(uid=sy.UID(\"8e12c9ac5c5547b1afe5b5a1d5e24900\"))\r\n
\r\n to get this specific request.\r\n

\r\n\r\n

Or you can view all requests with:
\r\n \r\n client.requests\r\n \r\n

\r\n\r\n
\r\n
\r\n

If you did not expect this request or have concerns about it,\r\n please contact our support team immediately.

\r\n
\r\n
\r\n This is an automated message, please do not reply directly to this email.
\r\n For assistance, please contact our support team.\r\n
\r\n
\r\n \r\n \r\n--===============7117641952261823257==--\r\n"}, {"email_from": "noreply@openmined.org", "email_to": ["admin@bigquery.org"], "email_content": "Content-Type: multipart/alternative; boundary=\"===============3685701994337601608==\"\r\nMIME-Version: 1.0\r\nFrom: noreply@openmined.org\r\nTo: admin@bigquery.org\r\nSubject: Datasite bigquery-high-migrations: A New Request (1eb3) has been received!\r\n\r\n--===============3685701994337601608==\r\nContent-Type: text/html; charset=\"us-ascii\"\r\nMIME-Version: 1.0\r\nContent-Transfer-Encoding: 7bit\r\n\r\n\r\n \r\n Access Request Notification\r\n \r\n \r\n \r\n
\r\n
\r\n Request Notification\r\n
\r\n
\r\n

Hello,

\r\n

A new request has been submitted and requires your attention.\r\n Please review the details below:

\r\n\r\n
\r\n
Request Details
\r\n
\r\n\r\n

ID: 1eb3b8a2579a4b8db00b2de5e10de974

\r\n

\r\n Submitted By:\r\n Eric Hahn\r\n

\r\n

Date: 2024-09-23 09:30:48

\r\n

Status:

\r\n PENDING\r\n
\r\n

Changes:\r\n UserCodeStatusChange\r\n

\r\n\r\n

Use:
\r\n \r\n request = client.api.services.request.get_by_uid(uid=sy.UID(\"1eb3b8a2579a4b8db00b2de5e10de974\"))\r\n
\r\n to get this specific request.\r\n

\r\n\r\n

Or you can view all requests with:
\r\n \r\n client.requests\r\n \r\n

\r\n\r\n
\r\n
\r\n

If you did not expect this request or have concerns about it,\r\n please contact our support team immediately.

\r\n
\r\n
\r\n This is an automated message, please do not reply directly to this email.
\r\n For assistance, please contact our support team.\r\n
\r\n
\r\n \r\n \r\n--===============3685701994337601608==--\r\n"}, {"email_from": "noreply@openmined.org", "email_to": ["admin@bigquery.org"], "email_content": "Content-Type: multipart/alternative; boundary=\"===============6536215668630059171==\"\r\nMIME-Version: 1.0\r\nFrom: noreply@openmined.org\r\nTo: admin@bigquery.org\r\nSubject: Datasite bigquery-high-migrations: A New Request (bcb3) has been received!\r\n\r\n--===============6536215668630059171==\r\nContent-Type: text/html; charset=\"us-ascii\"\r\nMIME-Version: 1.0\r\nContent-Transfer-Encoding: 7bit\r\n\r\n\r\n \r\n Access Request Notification\r\n \r\n \r\n \r\n
\r\n
\r\n Request Notification\r\n
\r\n
\r\n

Hello,

\r\n

A new request has been submitted and requires your attention.\r\n Please review the details below:

\r\n\r\n
\r\n
Request Details
\r\n
\r\n\r\n

ID: bcb34404327a41fa8592ff5aefbc72f1

\r\n

\r\n Submitted By:\r\n Paul Lloyd\r\n

\r\n

Date: 2024-09-23 09:30:57

\r\n

Status:

\r\n PENDING\r\n
\r\n

Changes:\r\n UserCodeStatusChange\r\n

\r\n\r\n

Use:
\r\n \r\n request = client.api.services.request.get_by_uid(uid=sy.UID(\"bcb34404327a41fa8592ff5aefbc72f1\"))\r\n
\r\n to get this specific request.\r\n

\r\n\r\n

Or you can view all requests with:
\r\n \r\n client.requests\r\n \r\n

\r\n\r\n
\r\n
\r\n

If you did not expect this request or have concerns about it,\r\n please contact our support team immediately.

\r\n
\r\n
\r\n This is an automated message, please do not reply directly to this email.
\r\n For assistance, please contact our support team.\r\n
\r\n
\r\n \r\n \r\n--===============6536215668630059171==--\r\n"}, {"email_from": "noreply@openmined.org", "email_to": ["admin@bigquery.org"], "email_content": "Content-Type: multipart/alternative; boundary=\"===============0725079058935243976==\"\r\nMIME-Version: 1.0\r\nFrom: noreply@openmined.org\r\nTo: admin@bigquery.org\r\nSubject: Datasite bigquery-high-migrations: A New Request (df0f) has been received!\r\n\r\n--===============0725079058935243976==\r\nContent-Type: text/html; charset=\"us-ascii\"\r\nMIME-Version: 1.0\r\nContent-Transfer-Encoding: 7bit\r\n\r\n\r\n \r\n Access Request Notification\r\n \r\n \r\n \r\n
\r\n
\r\n Request Notification\r\n
\r\n
\r\n

Hello,

\r\n

A new request has been submitted and requires your attention.\r\n Please review the details below:

\r\n\r\n
\r\n
Request Details
\r\n
\r\n\r\n

ID: df0f392826c04242bbb07c9be6a0db05

\r\n

\r\n Submitted By:\r\n John Garrett\r\n

\r\n

Date: 2024-09-23 09:31:06

\r\n

Status:

\r\n PENDING\r\n
\r\n

Changes:\r\n UserCodeStatusChange\r\n

\r\n\r\n

Use:
\r\n \r\n request = client.api.services.request.get_by_uid(uid=sy.UID(\"df0f392826c04242bbb07c9be6a0db05\"))\r\n
\r\n to get this specific request.\r\n

\r\n\r\n

Or you can view all requests with:
\r\n \r\n client.requests\r\n \r\n

\r\n\r\n
\r\n
\r\n

If you did not expect this request or have concerns about it,\r\n please contact our support team immediately.

\r\n
\r\n
\r\n This is an automated message, please do not reply directly to this email.
\r\n For assistance, please contact our support team.\r\n
\r\n
\r\n \r\n \r\n--===============0725079058935243976==--\r\n"}, {"email_from": "noreply@openmined.org", "email_to": ["admin@bigquery.org"], "email_content": "Content-Type: multipart/alternative; boundary=\"===============1992657613805266198==\"\r\nMIME-Version: 1.0\r\nFrom: noreply@openmined.org\r\nTo: admin@bigquery.org\r\nSubject: Datasite bigquery-high-migrations: A New Request (5614) has been received!\r\n\r\n--===============1992657613805266198==\r\nContent-Type: text/html; charset=\"us-ascii\"\r\nMIME-Version: 1.0\r\nContent-Transfer-Encoding: 7bit\r\n\r\n\r\n \r\n Access Request Notification\r\n \r\n \r\n \r\n
\r\n
\r\n Request Notification\r\n
\r\n
\r\n

Hello,

\r\n

A new request has been submitted and requires your attention.\r\n Please review the details below:

\r\n\r\n
\r\n
Request Details
\r\n
\r\n\r\n

ID: 5614eb0d753942cc8205bb7d784e8896

\r\n

\r\n Submitted By:\r\n Anthony Escobar\r\n

\r\n

Date: 2024-09-23 09:31:16

\r\n

Status:

\r\n PENDING\r\n
\r\n

Changes:\r\n UserCodeStatusChange\r\n

\r\n\r\n

Use:
\r\n \r\n request = client.api.services.request.get_by_uid(uid=sy.UID(\"5614eb0d753942cc8205bb7d784e8896\"))\r\n
\r\n to get this specific request.\r\n

\r\n\r\n

Or you can view all requests with:
\r\n \r\n client.requests\r\n \r\n

\r\n\r\n
\r\n
\r\n

If you did not expect this request or have concerns about it,\r\n please contact our support team immediately.

\r\n
\r\n
\r\n This is an automated message, please do not reply directly to this email.
\r\n For assistance, please contact our support team.\r\n
\r\n
\r\n \r\n \r\n--===============1992657613805266198==--\r\n"}, {"email_from": "noreply@openmined.org", "email_to": ["admin@bigquery.org"], "email_content": "Content-Type: multipart/alternative; boundary=\"===============9005484778227806339==\"\r\nMIME-Version: 1.0\r\nFrom: noreply@openmined.org\r\nTo: admin@bigquery.org\r\nSubject: Datasite bigquery-high-migrations: A New Request (e4c6) has been received!\r\n\r\n--===============9005484778227806339==\r\nContent-Type: text/html; charset=\"us-ascii\"\r\nMIME-Version: 1.0\r\nContent-Transfer-Encoding: 7bit\r\n\r\n\r\n \r\n Access Request Notification\r\n \r\n \r\n \r\n
\r\n
\r\n Request Notification\r\n
\r\n
\r\n

Hello,

\r\n

A new request has been submitted and requires your attention.\r\n Please review the details below:

\r\n\r\n
\r\n
Request Details
\r\n
\r\n\r\n

ID: e4c6e9b1009b42a0b65c86738c4c2e09

\r\n

\r\n Submitted By:\r\n William Thompson\r\n

\r\n

Date: 2024-09-23 09:31:25

\r\n

Status:

\r\n PENDING\r\n
\r\n

Changes:\r\n UserCodeStatusChange\r\n

\r\n\r\n

Use:
\r\n \r\n request = client.api.services.request.get_by_uid(uid=sy.UID(\"e4c6e9b1009b42a0b65c86738c4c2e09\"))\r\n
\r\n to get this specific request.\r\n

\r\n\r\n

Or you can view all requests with:
\r\n \r\n client.requests\r\n \r\n

\r\n\r\n
\r\n
\r\n

If you did not expect this request or have concerns about it,\r\n please contact our support team immediately.

\r\n
\r\n
\r\n This is an automated message, please do not reply directly to this email.
\r\n For assistance, please contact our support team.\r\n
\r\n
\r\n \r\n \r\n--===============9005484778227806339==--\r\n"}, {"email_from": "noreply@openmined.org", "email_to": ["admin@bigquery.org"], "email_content": "Content-Type: multipart/alternative; boundary=\"===============5503698571725917494==\"\r\nMIME-Version: 1.0\r\nFrom: noreply@openmined.org\r\nTo: admin@bigquery.org\r\nSubject: Datasite bigquery-high-migrations: A New Request (ea2b) has been received!\r\n\r\n--===============5503698571725917494==\r\nContent-Type: text/html; charset=\"us-ascii\"\r\nMIME-Version: 1.0\r\nContent-Transfer-Encoding: 7bit\r\n\r\n\r\n \r\n Access Request Notification\r\n \r\n \r\n \r\n
\r\n
\r\n Request Notification\r\n
\r\n
\r\n

Hello,

\r\n

A new request has been submitted and requires your attention.\r\n Please review the details below:

\r\n\r\n
\r\n
Request Details
\r\n
\r\n\r\n

ID: ea2b120ac5fc44b496fad22448813338

\r\n

\r\n Submitted By:\r\n Eric Hahn\r\n

\r\n

Date: 2024-09-23 09:31:35

\r\n

Status:

\r\n PENDING\r\n
\r\n

Changes:\r\n UserCodeStatusChange\r\n

\r\n\r\n

Use:
\r\n \r\n request = client.api.services.request.get_by_uid(uid=sy.UID(\"ea2b120ac5fc44b496fad22448813338\"))\r\n
\r\n to get this specific request.\r\n

\r\n\r\n

Or you can view all requests with:
\r\n \r\n client.requests\r\n \r\n

\r\n\r\n
\r\n
\r\n

If you did not expect this request or have concerns about it,\r\n please contact our support team immediately.

\r\n
\r\n
\r\n This is an automated message, please do not reply directly to this email.
\r\n For assistance, please contact our support team.\r\n
\r\n
\r\n \r\n \r\n--===============5503698571725917494==--\r\n"}, {"email_from": "noreply@openmined.org", "email_to": ["admin@bigquery.org"], "email_content": "Content-Type: multipart/alternative; boundary=\"===============3095197698625258186==\"\r\nMIME-Version: 1.0\r\nFrom: noreply@openmined.org\r\nTo: admin@bigquery.org\r\nSubject: Datasite bigquery-high-migrations: A New Request (ee9c) has been received!\r\n\r\n--===============3095197698625258186==\r\nContent-Type: text/html; charset=\"us-ascii\"\r\nMIME-Version: 1.0\r\nContent-Transfer-Encoding: 7bit\r\n\r\n\r\n \r\n Access Request Notification\r\n \r\n \r\n \r\n
\r\n
\r\n Request Notification\r\n
\r\n
\r\n

Hello,

\r\n

A new request has been submitted and requires your attention.\r\n Please review the details below:

\r\n\r\n
\r\n
Request Details
\r\n
\r\n\r\n

ID: ee9c2f4e3a7d401caedaa9bb216ce272

\r\n

\r\n Submitted By:\r\n Paul Lloyd\r\n

\r\n

Date: 2024-09-23 09:31:44

\r\n

Status:

\r\n PENDING\r\n
\r\n

Changes:\r\n UserCodeStatusChange\r\n

\r\n\r\n

Use:
\r\n \r\n request = client.api.services.request.get_by_uid(uid=sy.UID(\"ee9c2f4e3a7d401caedaa9bb216ce272\"))\r\n
\r\n to get this specific request.\r\n

\r\n\r\n

Or you can view all requests with:
\r\n \r\n client.requests\r\n \r\n

\r\n\r\n
\r\n
\r\n

If you did not expect this request or have concerns about it,\r\n please contact our support team immediately.

\r\n
\r\n
\r\n This is an automated message, please do not reply directly to this email.
\r\n For assistance, please contact our support team.\r\n
\r\n
\r\n \r\n \r\n--===============3095197698625258186==--\r\n"}, {"email_from": "noreply@openmined.org", "email_to": ["admin@bigquery.org"], "email_content": "Content-Type: multipart/alternative; boundary=\"===============3085645257172386883==\"\r\nMIME-Version: 1.0\r\nFrom: noreply@openmined.org\r\nTo: admin@bigquery.org\r\nSubject: Datasite bigquery-high-migrations: A New Request (7400) has been received!\r\n\r\n--===============3085645257172386883==\r\nContent-Type: text/html; charset=\"us-ascii\"\r\nMIME-Version: 1.0\r\nContent-Transfer-Encoding: 7bit\r\n\r\n\r\n \r\n Access Request Notification\r\n \r\n \r\n \r\n
\r\n
\r\n Request Notification\r\n
\r\n
\r\n

Hello,

\r\n

A new request has been submitted and requires your attention.\r\n Please review the details below:

\r\n\r\n
\r\n
Request Details
\r\n
\r\n\r\n

ID: 74006c5a15c54d6d96c7a5fa4adce03e

\r\n

\r\n Submitted By:\r\n John Garrett\r\n

\r\n

Date: 2024-09-23 09:31:53

\r\n

Status:

\r\n PENDING\r\n
\r\n

Changes:\r\n UserCodeStatusChange\r\n

\r\n\r\n

Use:
\r\n \r\n request = client.api.services.request.get_by_uid(uid=sy.UID(\"74006c5a15c54d6d96c7a5fa4adce03e\"))\r\n
\r\n to get this specific request.\r\n

\r\n\r\n

Or you can view all requests with:
\r\n \r\n client.requests\r\n \r\n

\r\n\r\n
\r\n
\r\n

If you did not expect this request or have concerns about it,\r\n please contact our support team immediately.

\r\n
\r\n
\r\n This is an automated message, please do not reply directly to this email.
\r\n For assistance, please contact our support team.\r\n
\r\n
\r\n \r\n \r\n--===============3085645257172386883==--\r\n"}], "eric-hahn-fake@openmined.org": [{"email_from": "noreply@openmined.org", "email_to": ["eric-hahn-fake@openmined.org"], "email_content": "Content-Type: multipart/alternative; boundary=\"===============0087264072714649521==\"\r\nMIME-Version: 1.0\r\nFrom: noreply@openmined.org\r\nTo: eric-hahn-fake@openmined.org\r\nSubject: Datasite bigquery-high-migrations: Your request (1eb3) has been approved. \r\n\r\n--===============0087264072714649521==\r\nContent-Type: text/html; charset=\"us-ascii\"\r\nMIME-Version: 1.0\r\nContent-Transfer-Encoding: 7bit\r\n\r\n\r\n \r\n Access Request Notification\r\n \r\n \r\n \r\n
\r\n
\r\n Request Notification\r\n
\r\n
\r\n

Hello,

\r\n

The status of your recent request has been updated.\r\n Below is the latest information regarding it:

\r\n\r\n
\r\n
Request Details
\r\n
\r\n\r\n

ID: 1eb3b8a2579a4b8db00b2de5e10de974

\r\n

\r\n Submitted By:\r\n Eric Hahn eric-hahn-fake@openmined.org\r\n

\r\n

Date: 2024-09-23 09:30:48

\r\n

Status:

\r\n APPROVED\r\n
\r\n

\r\n Changes:\r\n UserCodeStatusChange\r\n

\r\n\r\n

Use:
\r\n \r\n request = client.api.services.request.get_by_uid(uid=sy.UID(\"1eb3b8a2579a4b8db00b2de5e10de974\"))\r\n
\r\n to get this specific request.\r\n

\r\n\r\n

Or you can view all requests with:
\r\n \r\n client.requests\r\n \r\n

\r\n
\r\n
\r\n

If you did not expect this request or have concerns about it,\r\n please contact our support team immediately.

\r\n
\r\n
\r\n This is an automated message, please do not reply directly to this email.
\r\n For assistance, please contact our support team.\r\n
\r\n
\r\n \r\n \r\n--===============0087264072714649521==--\r\n"}, {"email_from": "noreply@openmined.org", "email_to": ["eric-hahn-fake@openmined.org"], "email_content": "Content-Type: multipart/alternative; boundary=\"===============4616762255463387364==\"\r\nMIME-Version: 1.0\r\nFrom: noreply@openmined.org\r\nTo: eric-hahn-fake@openmined.org\r\nSubject: Datasite bigquery-high-migrations: Your request (ea2b) has been denied. \r\n\r\n--===============4616762255463387364==\r\nContent-Type: text/html; charset=\"us-ascii\"\r\nMIME-Version: 1.0\r\nContent-Transfer-Encoding: 7bit\r\n\r\n\r\n \r\n Access Request Notification\r\n \r\n \r\n \r\n
\r\n
\r\n Request Notification\r\n
\r\n
\r\n

Hello,

\r\n

The status of your recent request has been updated.\r\n Below is the latest information regarding it:

\r\n\r\n
\r\n
Request Details
\r\n
\r\n\r\n

ID: ea2b120ac5fc44b496fad22448813338

\r\n

\r\n Submitted By:\r\n Eric Hahn eric-hahn-fake@openmined.org\r\n

\r\n

Date: 2024-09-23 09:31:35

\r\n

Status:

\r\n REJECTED\r\n
\r\n

\r\n Changes:\r\n UserCodeStatusChange\r\n

\r\n\r\n

Use:
\r\n \r\n request = client.api.services.request.get_by_uid(uid=sy.UID(\"ea2b120ac5fc44b496fad22448813338\"))\r\n
\r\n to get this specific request.\r\n

\r\n\r\n

Or you can view all requests with:
\r\n \r\n client.requests\r\n \r\n

\r\n
\r\n
\r\n

If you did not expect this request or have concerns about it,\r\n please contact our support team immediately.

\r\n
\r\n
\r\n This is an automated message, please do not reply directly to this email.
\r\n For assistance, please contact our support team.\r\n
\r\n
\r\n \r\n \r\n--===============4616762255463387364==--\r\n"}], "paul-lloyd-fake@openmined.org": [{"email_from": "noreply@openmined.org", "email_to": ["paul-lloyd-fake@openmined.org"], "email_content": "Content-Type: multipart/alternative; boundary=\"===============7536925844563160043==\"\r\nMIME-Version: 1.0\r\nFrom: noreply@openmined.org\r\nTo: paul-lloyd-fake@openmined.org\r\nSubject: Datasite bigquery-high-migrations: Your request (bcb3) has been approved. \r\n\r\n--===============7536925844563160043==\r\nContent-Type: text/html; charset=\"us-ascii\"\r\nMIME-Version: 1.0\r\nContent-Transfer-Encoding: 7bit\r\n\r\n\r\n \r\n Access Request Notification\r\n \r\n \r\n \r\n
\r\n
\r\n Request Notification\r\n
\r\n
\r\n

Hello,

\r\n

The status of your recent request has been updated.\r\n Below is the latest information regarding it:

\r\n\r\n
\r\n
Request Details
\r\n
\r\n\r\n

ID: bcb34404327a41fa8592ff5aefbc72f1

\r\n

\r\n Submitted By:\r\n Paul Lloyd paul-lloyd-fake@openmined.org\r\n

\r\n

Date: 2024-09-23 09:30:57

\r\n

Status:

\r\n APPROVED\r\n
\r\n

\r\n Changes:\r\n UserCodeStatusChange\r\n

\r\n\r\n

Use:
\r\n \r\n request = client.api.services.request.get_by_uid(uid=sy.UID(\"bcb34404327a41fa8592ff5aefbc72f1\"))\r\n
\r\n to get this specific request.\r\n

\r\n\r\n

Or you can view all requests with:
\r\n \r\n client.requests\r\n \r\n

\r\n
\r\n
\r\n

If you did not expect this request or have concerns about it,\r\n please contact our support team immediately.

\r\n
\r\n
\r\n This is an automated message, please do not reply directly to this email.
\r\n For assistance, please contact our support team.\r\n
\r\n
\r\n \r\n \r\n--===============7536925844563160043==--\r\n"}, {"email_from": "noreply@openmined.org", "email_to": ["paul-lloyd-fake@openmined.org"], "email_content": "Content-Type: multipart/alternative; boundary=\"===============0033828269783680003==\"\r\nMIME-Version: 1.0\r\nFrom: noreply@openmined.org\r\nTo: paul-lloyd-fake@openmined.org\r\nSubject: Datasite bigquery-high-migrations: Your request (ee9c) has been denied. \r\n\r\n--===============0033828269783680003==\r\nContent-Type: text/html; charset=\"us-ascii\"\r\nMIME-Version: 1.0\r\nContent-Transfer-Encoding: 7bit\r\n\r\n\r\n \r\n Access Request Notification\r\n \r\n \r\n \r\n
\r\n
\r\n Request Notification\r\n
\r\n
\r\n

Hello,

\r\n

The status of your recent request has been updated.\r\n Below is the latest information regarding it:

\r\n\r\n
\r\n
Request Details
\r\n
\r\n\r\n

ID: ee9c2f4e3a7d401caedaa9bb216ce272

\r\n

\r\n Submitted By:\r\n Paul Lloyd paul-lloyd-fake@openmined.org\r\n

\r\n

Date: 2024-09-23 09:31:44

\r\n

Status:

\r\n REJECTED\r\n
\r\n

\r\n Changes:\r\n UserCodeStatusChange\r\n

\r\n\r\n

Use:
\r\n \r\n request = client.api.services.request.get_by_uid(uid=sy.UID(\"ee9c2f4e3a7d401caedaa9bb216ce272\"))\r\n
\r\n to get this specific request.\r\n

\r\n\r\n

Or you can view all requests with:
\r\n \r\n client.requests\r\n \r\n

\r\n
\r\n
\r\n

If you did not expect this request or have concerns about it,\r\n please contact our support team immediately.

\r\n
\r\n
\r\n This is an automated message, please do not reply directly to this email.
\r\n For assistance, please contact our support team.\r\n
\r\n
\r\n \r\n \r\n--===============0033828269783680003==--\r\n"}], "john-garrett-fake@openmined.org": [{"email_from": "noreply@openmined.org", "email_to": ["john-garrett-fake@openmined.org"], "email_content": "Content-Type: multipart/alternative; boundary=\"===============2667553230066125737==\"\r\nMIME-Version: 1.0\r\nFrom: noreply@openmined.org\r\nTo: john-garrett-fake@openmined.org\r\nSubject: Datasite bigquery-high-migrations: Your request (df0f) has been approved. \r\n\r\n--===============2667553230066125737==\r\nContent-Type: text/html; charset=\"us-ascii\"\r\nMIME-Version: 1.0\r\nContent-Transfer-Encoding: 7bit\r\n\r\n\r\n \r\n Access Request Notification\r\n \r\n \r\n \r\n
\r\n
\r\n Request Notification\r\n
\r\n
\r\n

Hello,

\r\n

The status of your recent request has been updated.\r\n Below is the latest information regarding it:

\r\n\r\n
\r\n
Request Details
\r\n
\r\n\r\n

ID: df0f392826c04242bbb07c9be6a0db05

\r\n

\r\n Submitted By:\r\n John Garrett john-garrett-fake@openmined.org\r\n

\r\n

Date: 2024-09-23 09:31:06

\r\n

Status:

\r\n APPROVED\r\n
\r\n

\r\n Changes:\r\n UserCodeStatusChange\r\n

\r\n\r\n

Use:
\r\n \r\n request = client.api.services.request.get_by_uid(uid=sy.UID(\"df0f392826c04242bbb07c9be6a0db05\"))\r\n
\r\n to get this specific request.\r\n

\r\n\r\n

Or you can view all requests with:
\r\n \r\n client.requests\r\n \r\n

\r\n
\r\n
\r\n

If you did not expect this request or have concerns about it,\r\n please contact our support team immediately.

\r\n
\r\n
\r\n This is an automated message, please do not reply directly to this email.
\r\n For assistance, please contact our support team.\r\n
\r\n
\r\n \r\n \r\n--===============2667553230066125737==--\r\n"}, {"email_from": "noreply@openmined.org", "email_to": ["john-garrett-fake@openmined.org"], "email_content": "Content-Type: multipart/alternative; boundary=\"===============6802697036125412429==\"\r\nMIME-Version: 1.0\r\nFrom: noreply@openmined.org\r\nTo: john-garrett-fake@openmined.org\r\nSubject: Datasite bigquery-high-migrations: Your request (df0f) has been approved. \r\n\r\n--===============6802697036125412429==\r\nContent-Type: text/html; charset=\"us-ascii\"\r\nMIME-Version: 1.0\r\nContent-Transfer-Encoding: 7bit\r\n\r\n\r\n \r\n Access Request Notification\r\n \r\n \r\n \r\n
\r\n
\r\n Request Notification\r\n
\r\n
\r\n

Hello,

\r\n

The status of your recent request has been updated.\r\n Below is the latest information regarding it:

\r\n\r\n
\r\n
Request Details
\r\n
\r\n\r\n

ID: df0f392826c04242bbb07c9be6a0db05

\r\n

\r\n Submitted By:\r\n John Garrett john-garrett-fake@openmined.org\r\n

\r\n

Date: 2024-09-23 09:31:06

\r\n

Status:

\r\n APPROVED\r\n
\r\n

\r\n Changes:\r\n UserCodeStatusChange,ActionStoreChange\r\n

\r\n\r\n

Use:
\r\n \r\n request = client.api.services.request.get_by_uid(uid=sy.UID(\"df0f392826c04242bbb07c9be6a0db05\"))\r\n
\r\n to get this specific request.\r\n

\r\n\r\n

Or you can view all requests with:
\r\n \r\n client.requests\r\n \r\n

\r\n
\r\n
\r\n

If you did not expect this request or have concerns about it,\r\n please contact our support team immediately.

\r\n
\r\n
\r\n This is an automated message, please do not reply directly to this email.
\r\n For assistance, please contact our support team.\r\n
\r\n
\r\n \r\n \r\n--===============6802697036125412429==--\r\n"}, {"email_from": "noreply@openmined.org", "email_to": ["john-garrett-fake@openmined.org"], "email_content": "Content-Type: multipart/alternative; boundary=\"===============6669303170158844316==\"\r\nMIME-Version: 1.0\r\nFrom: noreply@openmined.org\r\nTo: john-garrett-fake@openmined.org\r\nSubject: Datasite bigquery-high-migrations: Your request (7400) has been approved. \r\n\r\n--===============6669303170158844316==\r\nContent-Type: text/html; charset=\"us-ascii\"\r\nMIME-Version: 1.0\r\nContent-Transfer-Encoding: 7bit\r\n\r\n\r\n \r\n Access Request Notification\r\n \r\n \r\n \r\n
\r\n
\r\n Request Notification\r\n
\r\n
\r\n

Hello,

\r\n

The status of your recent request has been updated.\r\n Below is the latest information regarding it:

\r\n\r\n
\r\n
Request Details
\r\n
\r\n\r\n

ID: 74006c5a15c54d6d96c7a5fa4adce03e

\r\n

\r\n Submitted By:\r\n John Garrett john-garrett-fake@openmined.org\r\n

\r\n

Date: 2024-09-23 09:31:53

\r\n

Status:

\r\n APPROVED\r\n
\r\n

\r\n Changes:\r\n UserCodeStatusChange\r\n

\r\n\r\n

Use:
\r\n \r\n request = client.api.services.request.get_by_uid(uid=sy.UID(\"74006c5a15c54d6d96c7a5fa4adce03e\"))\r\n
\r\n to get this specific request.\r\n

\r\n\r\n

Or you can view all requests with:
\r\n \r\n client.requests\r\n \r\n

\r\n
\r\n
\r\n

If you did not expect this request or have concerns about it,\r\n please contact our support team immediately.

\r\n
\r\n
\r\n This is an automated message, please do not reply directly to this email.
\r\n For assistance, please contact our support team.\r\n
\r\n
\r\n \r\n \r\n--===============6669303170158844316==--\r\n"}], "anthony-escobar-fake@openmined.org": [{"email_from": "noreply@openmined.org", "email_to": ["anthony-escobar-fake@openmined.org"], "email_content": "Content-Type: multipart/alternative; boundary=\"===============1253022428436437486==\"\r\nMIME-Version: 1.0\r\nFrom: noreply@openmined.org\r\nTo: anthony-escobar-fake@openmined.org\r\nSubject: Datasite bigquery-high-migrations: Your request (5614) has been approved. \r\n\r\n--===============1253022428436437486==\r\nContent-Type: text/html; charset=\"us-ascii\"\r\nMIME-Version: 1.0\r\nContent-Transfer-Encoding: 7bit\r\n\r\n\r\n \r\n Access Request Notification\r\n \r\n \r\n \r\n
\r\n
\r\n Request Notification\r\n
\r\n
\r\n

Hello,

\r\n

The status of your recent request has been updated.\r\n Below is the latest information regarding it:

\r\n\r\n
\r\n
Request Details
\r\n
\r\n\r\n

ID: 5614eb0d753942cc8205bb7d784e8896

\r\n

\r\n Submitted By:\r\n Anthony Escobar anthony-escobar-fake@openmined.org\r\n

\r\n

Date: 2024-09-23 09:31:16

\r\n

Status:

\r\n APPROVED\r\n
\r\n

\r\n Changes:\r\n UserCodeStatusChange\r\n

\r\n\r\n

Use:
\r\n \r\n request = client.api.services.request.get_by_uid(uid=sy.UID(\"5614eb0d753942cc8205bb7d784e8896\"))\r\n
\r\n to get this specific request.\r\n

\r\n\r\n

Or you can view all requests with:
\r\n \r\n client.requests\r\n \r\n

\r\n
\r\n
\r\n

If you did not expect this request or have concerns about it,\r\n please contact our support team immediately.

\r\n
\r\n
\r\n This is an automated message, please do not reply directly to this email.
\r\n For assistance, please contact our support team.\r\n
\r\n
\r\n \r\n \r\n--===============1253022428436437486==--\r\n"}]} \ No newline at end of file diff --git a/notebooks/scenarios/bigquery/upgradability/0.9.1_notebooks/jobs.json b/notebooks/scenarios/bigquery/upgradability/0.9.1_notebooks/jobs.json index e4b011a1690..dba12bf316d 100644 --- a/notebooks/scenarios/bigquery/upgradability/0.9.1_notebooks/jobs.json +++ b/notebooks/scenarios/bigquery/upgradability/0.9.1_notebooks/jobs.json @@ -1,180 +1 @@ -{ - "arthur-smith-fake@openmined.org": [ - { - "user_email": "arthur-smith-fake@openmined.org", - "func_name": "simple_query_d1e040", - "query": "SELECT table_id, AVG(colname) AS average_score\n FROM dataset_1.table_2\n GROUP BY table_id\n LIMIT 670428", - "job_type": "simple_query", - "settings": { - "dataset": "dataset_1", - "table": "table_2", - "groupby_col": "table_id", - "score_col": "colname", - "limit": 670428 - }, - "should_succeed": true, - "should_submit": true, - "code_path": "simple_query_d1e040", - "admin_reviewed": true, - "result_as_expected": true - }, - { - "user_email": "arthur-smith-fake@openmined.org", - "func_name": "simple_query_6aa50c", - "query": "SELECT table_id, AVG(colname) AS average_score\n FROM dataset_2.table_1\n GROUP BY table_id\n LIMIT 75871", - "job_type": "simple_query", - "settings": { - "dataset": "dataset_2", - "table": "table_1", - "groupby_col": "table_id", - "score_col": "colname", - "limit": 75871 - }, - "should_succeed": true, - "should_submit": true, - "code_path": "simple_query_6aa50c", - "admin_reviewed": true, - "result_as_expected": true - } - ], - "noah-hinton-fake@openmined.org": [ - { - "user_email": "noah-hinton-fake@openmined.org", - "func_name": "simple_query_912a15", - "query": "SELECT table_id, AVG(colname) AS average_score\n FROM dataset_2.table_2\n GROUP BY table_id\n LIMIT 953272", - "job_type": "simple_query", - "settings": { - "dataset": "dataset_2", - "table": "table_2", - "groupby_col": "table_id", - "score_col": "colname", - "limit": 953272 - }, - "should_succeed": true, - "should_submit": true, - "code_path": "simple_query_912a15", - "admin_reviewed": true, - "result_as_expected": true - }, - { - "user_email": "noah-hinton-fake@openmined.org", - "func_name": "wrong_syntax_query_293ad3", - "query": "SELECT * FROM table INCORRECT SYNTAX", - "job_type": "wrong_syntax_query", - "settings": {}, - "should_succeed": false, - "should_submit": true, - "code_path": "wrong_syntax_query_293ad3", - "admin_reviewed": true, - "result_as_expected": true - } - ], - "samantha-heath-fake@openmined.org": [ - { - "user_email": "samantha-heath-fake@openmined.org", - "func_name": "simple_query_b82bd0", - "query": "SELECT table_id, AVG(colname) AS average_score\n FROM dataset_1.table_1\n GROUP BY table_id\n LIMIT 620965", - "job_type": "simple_query", - "settings": { - "dataset": "dataset_1", - "table": "table_1", - "groupby_col": "table_id", - "score_col": "colname", - "limit": 620965 - }, - "should_succeed": true, - "should_submit": true, - "code_path": "simple_query_b82bd0", - "admin_reviewed": true, - "result_as_expected": true - }, - { - "user_email": "samantha-heath-fake@openmined.org", - "func_name": "job_too_much_text_9b550a", - "query": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", - "job_type": "job_too_much_text", - "settings": {}, - "should_succeed": false, - "should_submit": true, - "code_path": "job_too_much_text_9b550a", - "admin_reviewed": true, - "result_as_expected": true - } - ], - "eric-morales-fake@openmined.org": [ - { - "user_email": "eric-morales-fake@openmined.org", - "func_name": "simple_query_b81b03", - "query": "SELECT table_id, AVG(colname) AS average_score\n FROM dataset_2.table_1\n GROUP BY table_id\n LIMIT 171829", - "job_type": "simple_query", - "settings": { - "dataset": "dataset_2", - "table": "table_1", - "groupby_col": "table_id", - "score_col": "colname", - "limit": 171829 - }, - "should_succeed": true, - "should_submit": true, - "code_path": "simple_query_b81b03", - "admin_reviewed": true, - "result_as_expected": true - }, - { - "user_email": "eric-morales-fake@openmined.org", - "func_name": "job_long_name_19baf0aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", - "query": "SELECT table_id, AVG(colname) AS average_score\n FROM dataset_1.table_1\n GROUP BY table_id\n LIMIT 639608", - "job_type": "job_long_name", - "settings": { - "dataset": "dataset_1", - "table": "table_1", - "groupby_col": "table_id", - "score_col": "colname", - "limit": 639608 - }, - "should_succeed": true, - "should_submit": true, - "code_path": "job_long_name_19baf0aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", - "admin_reviewed": true, - "result_as_expected": true - } - ], - "lisa-guerra-fake@openmined.org": [ - { - "user_email": "lisa-guerra-fake@openmined.org", - "func_name": "simple_query_3ba857", - "query": "SELECT table_id, AVG(colname) AS average_score\n FROM dataset_2.table_2\n GROUP BY table_id\n LIMIT 843394", - "job_type": "simple_query", - "settings": { - "dataset": "dataset_2", - "table": "table_2", - "groupby_col": "table_id", - "score_col": "colname", - "limit": 843394 - }, - "should_succeed": true, - "should_submit": true, - "code_path": "simple_query_3ba857", - "admin_reviewed": true, - "result_as_expected": true - }, - { - "user_email": "lisa-guerra-fake@openmined.org", - "func_name": "job_funcname_xss_2bf4e1", - "query": "SELECT table_id, AVG(colname) AS average_score\n FROM dataset_1.table_1\n GROUP BY table_id\n LIMIT 778951", - "job_type": "job_funcname_xss", - "settings": { - "dataset": "dataset_1", - "table": "table_1", - "groupby_col": "table_id", - "score_col": "colname", - "limit": 778951 - }, - "should_succeed": true, - "should_submit": false, - "code_path": null, - "admin_reviewed": false, - "result_as_expected": null - } - ] -} +{"william-thompson-fake@openmined.org": [{"user_email": "william-thompson-fake@openmined.org", "func_name": "simple_query_5aeaf1", "query": "SELECT table_id, AVG(colname) AS average_score\n FROM dataset_1.table_1\n GROUP BY table_id\n LIMIT 108441", "job_type": "simple_query", "settings": {"dataset": "dataset_1", "table": "table_1", "groupby_col": "table_id", "score_col": "colname", "limit": 108441}, "should_succeed": true, "should_submit": true, "code_path": "simple_query_5aeaf1", "admin_reviewed": true, "result_as_expected": true}, {"user_email": "william-thompson-fake@openmined.org", "func_name": "simple_query_e283cd", "query": "SELECT table_id, AVG(colname) AS average_score\n FROM dataset_2.table_2\n GROUP BY table_id\n LIMIT 919780", "job_type": "simple_query", "settings": {"dataset": "dataset_2", "table": "table_2", "groupby_col": "table_id", "score_col": "colname", "limit": 919780}, "should_succeed": true, "should_submit": true, "code_path": "simple_query_e283cd", "admin_reviewed": true, "result_as_expected": true}], "eric-hahn-fake@openmined.org": [{"user_email": "eric-hahn-fake@openmined.org", "func_name": "simple_query_ae1579", "query": "SELECT table_id, AVG(colname) AS average_score\n FROM dataset_2.table_1\n GROUP BY table_id\n LIMIT 429598", "job_type": "simple_query", "settings": {"dataset": "dataset_2", "table": "table_1", "groupby_col": "table_id", "score_col": "colname", "limit": 429598}, "should_succeed": true, "should_submit": true, "code_path": "simple_query_ae1579", "admin_reviewed": true, "result_as_expected": true}, {"user_email": "eric-hahn-fake@openmined.org", "func_name": "wrong_syntax_query_7e9ca8", "query": "SELECT * FROM table INCORRECT SYNTAX", "job_type": "wrong_syntax_query", "settings": {}, "should_succeed": false, "should_submit": true, "code_path": "wrong_syntax_query_7e9ca8", "admin_reviewed": true, "result_as_expected": true}], "paul-lloyd-fake@openmined.org": [{"user_email": "paul-lloyd-fake@openmined.org", "func_name": "simple_query_56749f", "query": "SELECT table_id, AVG(colname) AS average_score\n FROM dataset_1.table_2\n GROUP BY table_id\n LIMIT 117335", "job_type": "simple_query", "settings": {"dataset": "dataset_1", "table": "table_2", "groupby_col": "table_id", "score_col": "colname", "limit": 117335}, "should_succeed": true, "should_submit": true, "code_path": "simple_query_56749f", "admin_reviewed": true, "result_as_expected": true}, {"user_email": "paul-lloyd-fake@openmined.org", "func_name": "job_too_much_text_c8e01e", "query": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", "job_type": "job_too_much_text", "settings": {}, "should_succeed": false, "should_submit": true, "code_path": "job_too_much_text_c8e01e", "admin_reviewed": true, "result_as_expected": true}], "john-garrett-fake@openmined.org": [{"user_email": "john-garrett-fake@openmined.org", "func_name": "simple_query_89f22a", "query": "SELECT table_id, AVG(colname) AS average_score\n FROM dataset_2.table_2\n GROUP BY table_id\n LIMIT 443373", "job_type": "simple_query", "settings": {"dataset": "dataset_2", "table": "table_2", "groupby_col": "table_id", "score_col": "colname", "limit": 443373}, "should_succeed": true, "should_submit": true, "code_path": "simple_query_89f22a", "admin_reviewed": true, "result_as_expected": true}, {"user_email": "john-garrett-fake@openmined.org", "func_name": "job_long_name_c7c6acaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", "query": "SELECT table_id, AVG(colname) AS average_score\n FROM dataset_2.table_1\n GROUP BY table_id\n LIMIT 66724", "job_type": "job_long_name", "settings": {"dataset": "dataset_2", "table": "table_1", "groupby_col": "table_id", "score_col": "colname", "limit": 66724}, "should_succeed": true, "should_submit": true, "code_path": "job_long_name_c7c6acaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", "admin_reviewed": true, "result_as_expected": true}], "anthony-escobar-fake@openmined.org": [{"user_email": "anthony-escobar-fake@openmined.org", "func_name": "simple_query_953d04", "query": "SELECT table_id, AVG(colname) AS average_score\n FROM dataset_2.table_2\n GROUP BY table_id\n LIMIT 442633", "job_type": "simple_query", "settings": {"dataset": "dataset_2", "table": "table_2", "groupby_col": "table_id", "score_col": "colname", "limit": 442633}, "should_succeed": true, "should_submit": true, "code_path": "simple_query_953d04", "admin_reviewed": true, "result_as_expected": true}, {"user_email": "anthony-escobar-fake@openmined.org", "func_name": "job_funcname_xss_2a6679", "query": "SELECT table_id, AVG(colname) AS average_score\n FROM dataset_1.table_2\n GROUP BY table_id\n LIMIT 455945", "job_type": "job_funcname_xss", "settings": {"dataset": "dataset_1", "table": "table_2", "groupby_col": "table_id", "score_col": "colname", "limit": 455945}, "should_succeed": true, "should_submit": false, "code_path": null, "admin_reviewed": false, "result_as_expected": null}]} \ No newline at end of file diff --git a/notebooks/scenarios/bigquery/upgradability/0.9.1_notebooks/users.json b/notebooks/scenarios/bigquery/upgradability/0.9.1_notebooks/users.json index 13e7908e069..6df5380c49f 100644 --- a/notebooks/scenarios/bigquery/upgradability/0.9.1_notebooks/users.json +++ b/notebooks/scenarios/bigquery/upgradability/0.9.1_notebooks/users.json @@ -1,52 +1 @@ -[ - { - "name": "Arthur Smith", - "email": "arthur-smith-fake@openmined.org", - "password": "@DP8JSytU^", - "role": "ServiceRole.DATA_SCIENTIST", - "new_password": null, - "email_disabled": true, - "reset_password": false, - "reset_token": null - }, - { - "name": "Noah Hinton", - "email": "noah-hinton-fake@openmined.org", - "password": "j)5S!RJvsl", - "role": "ServiceRole.DATA_SCIENTIST", - "new_password": null, - "email_disabled": false, - "reset_password": true, - "reset_token": "ugpbqHrAwOQ7" - }, - { - "name": "Samantha Heath", - "email": "samantha-heath-fake@openmined.org", - "password": "hI6OKBkfw%", - "role": "ServiceRole.DATA_SCIENTIST", - "new_password": null, - "email_disabled": false, - "reset_password": false, - "reset_token": null - }, - { - "name": "Eric Morales", - "email": "eric-morales-fake@openmined.org", - "password": "$+L*Z74f)2", - "role": "ServiceRole.DATA_SCIENTIST", - "new_password": null, - "email_disabled": false, - "reset_password": false, - "reset_token": null - }, - { - "name": "Lisa Guerra", - "email": "lisa-guerra-fake@openmined.org", - "password": "^DW28G^jW+", - "role": "ServiceRole.DATA_SCIENTIST", - "new_password": null, - "email_disabled": false, - "reset_password": false, - "reset_token": null - } -] +[{"name": "William Thompson", "email": "william-thompson-fake@openmined.org", "password": "H&4TFK4nd1", "role": "ServiceRole.DATA_SCIENTIST", "new_password": null, "email_disabled": true, "reset_password": false, "reset_token": null}, {"name": "Eric Hahn", "email": "eric-hahn-fake@openmined.org", "password": "iqeU$Fme@4", "role": "ServiceRole.DATA_SCIENTIST", "new_password": null, "email_disabled": false, "reset_password": true, "reset_token": "2o2tvKn3HVYt"}, {"name": "Paul Lloyd", "email": "paul-lloyd-fake@openmined.org", "password": "O7c9DBMh!b", "role": "ServiceRole.DATA_SCIENTIST", "new_password": null, "email_disabled": false, "reset_password": false, "reset_token": null}, {"name": "John Garrett", "email": "john-garrett-fake@openmined.org", "password": ")pDQ4r%PX8", "role": "ServiceRole.DATA_SCIENTIST", "new_password": null, "email_disabled": false, "reset_password": false, "reset_token": null}, {"name": "Anthony Escobar", "email": "anthony-escobar-fake@openmined.org", "password": "3J6uWe25a%", "role": "ServiceRole.DATA_SCIENTIST", "new_password": null, "email_disabled": false, "reset_password": false, "reset_token": null}] \ No newline at end of file diff --git a/notebooks/scenarios/bigquery/upgradability/2-migrate-for-scenarios.ipynb b/notebooks/scenarios/bigquery/upgradability/2-migrate-for-scenarios.ipynb index 9352ec3369e..a51643ab6af 100644 --- a/notebooks/scenarios/bigquery/upgradability/2-migrate-for-scenarios.ipynb +++ b/notebooks/scenarios/bigquery/upgradability/2-migrate-for-scenarios.ipynb @@ -2,7 +2,7 @@ "cells": [ { "cell_type": "code", - "execution_count": null, + "execution_count": 34, "metadata": {}, "outputs": [], "source": [ @@ -27,7 +27,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 2, "metadata": {}, "outputs": [], "source": [ @@ -51,7 +51,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 3, "metadata": {}, "outputs": [], "source": [ @@ -62,7 +62,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 4, "metadata": {}, "outputs": [], "source": [ @@ -80,12 +80,1767 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 5, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Autoreload enabled\n", + "Starting bigquery-high server on 0.0.0.0:8080\n", + "Found `reset=True` in the launch configuration. Resetting the server...\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "INFO: Will watch for changes in these directories: ['/home/teo/OpenMined/PySyft/packages/syft/src/syft']\n", + "INFO: Uvicorn running on http://0.0.0.0:8080 (Press CTRL+C to quit)\n", + "INFO: Started reloader process [287748] using WatchFiles\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Waiting for server to start..." + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "INFO: Starting server with settings: {'name': 'bigquery-high', 'server_type': , 'server_side_type': , 'deployment_type': , 'processes': 1, 'reset': False, 'dev_mode': True, 'enable_warnings': False, 'in_memory_workers': True, 'queue_port': None, 'create_producer': True, 'n_consumers': 1, 'association_request_auto_approval': False, 'background_tasks': False, 'db_config': None, 'db_url': None} and worker class: \n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "WARN: private key is based on server name: bigquery-high in dev_mode. Don't run this in production.\n", + "Using SQLiteDBConfig and sqlite:////tmp/syft/fbdf5a287e58454cbbd3fac4ad744d37/db/fbdf5a287e58454cbbd3fac4ad744d37_json.db\n", + "Adding producer for queue: api_call on: tcp://localhost:38393\n", + ". Done.\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "INFO: Started server process [287771]\n", + "INFO: Waiting for application startup.\n", + "INFO: Application startup complete.\n" + ] + }, + { + "data": { + "text/html": [ + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "
SyftInfo:
You have launched a development server at http://0.0.0.0:8080. It is intended only for local use.

" + ], + "text/plain": [ + "SyftInfo: You have launched a development server at http://0.0.0.0:8080. It is intended only for local use." + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Logged into as \n" + ] + }, + { + "data": { + "text/html": [ + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "
SyftWarning:
You are using a default password. Please change the password using `[your_client].account.set_password([new_password])`.

" + ], + "text/plain": [ + "SyftWarning: You are using a default password. Please change the password using `[your_client].account.set_password([new_password])`." + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "WARNING: WatchFiles detected changes in '/home/teo/OpenMined/PySyft/packages/syft/src/syft/types/errors.py', '/home/teo/OpenMined/PySyft/packages/syft/src/syft/service/action/action_endpoint.py', '/home/teo/OpenMined/PySyft/packages/syft/src/syft/types/syft_object_registry.py', '/home/teo/OpenMined/PySyft/packages/syft/src/syft/util/notebook_ui/components/tabulator_template.py'. Reloading...\n", + "WARNING: WatchFiles detected changes in '/home/teo/OpenMined/PySyft/packages/syft/src/syft/client/registry.py', '/home/teo/OpenMined/PySyft/packages/syft/src/syft/store/kv_document_store.py', '/home/teo/OpenMined/PySyft/packages/syft/src/syft/service/project/project.py', '/home/teo/OpenMined/PySyft/packages/syft/src/syft/protocol/data_protocol.py', '/home/teo/OpenMined/PySyft/packages/syft/src/syft/service/action/action_service.py', '/home/teo/OpenMined/PySyft/packages/syft/src/syft/store/db/stash.py', '/home/teo/OpenMined/PySyft/packages/syft/src/syft/store/sqlite_document_store.py', '/home/teo/OpenMined/PySyft/packages/syft/src/syft/types/syft_object.py'. Reloading...\n", + "WARNING: WatchFiles detected changes in '/home/teo/OpenMined/PySyft/packages/syft/src/syft/client/registry.py', '0.9.1_notebooks/040-do-review-requestsx29c9d3e.py', '0.9.1_notebooks/050-ds-get-resultsk9vzizb2.py', '2-migrate-for-scenariose7fhqasr.py', '/home/teo/OpenMined/PySyft/packages/syft/src/syft/types/errors.py', '0.9.1_notebooks/020-configure-apim_bn3nb6.py', 'sync/0.9.1_notebooks/02-configure-api-and-syncqwzpf82k.py', '0.9.1_notebooks/021-create-jobsnzkres4r.py', '/home/teo/OpenMined/PySyft/packages/syft/src/syft/store/kv_document_store.py', '/home/teo/OpenMined/PySyft/packages/syft/src/syft/util/notebook_ui/components/tabulator_template.py', 'sync/0.9.1_notebooks/01-setup-high-low-datasites5562yyox.py', '0.9.1_notebooks/010-setup-bigquery-poolrz64jhho.py', 'sync/0.9.1_notebooks/05-ds-get-resultsw317kj_l.py', '/home/teo/OpenMined/PySyft/packages/syft/src/syft/service/project/project.py', 'sync/0.9.1_notebooks/04-do-review-requeststqnp75y8.py', '/home/teo/OpenMined/PySyft/packages/syft/src/syft/protocol/data_protocol.py', '/home/teo/OpenMined/PySyft/packages/syft/src/syft/types/syft_object_registry.py', '0.9.1_notebooks/001-scale-delete-worker-poolst38q2kt1.py', '/home/teo/OpenMined/PySyft/packages/syft/src/syft/service/action/action_service.py', 'sync/0.9.1_notebooks/03-ds-submit-requestb20puuas.py', '0.9.1_notebooks/011-users-emails-passwordsiov_gb82.py', 'sync/1-dump-database-to-fileuet1qpjl.py', '/home/teo/OpenMined/PySyft/packages/syft/src/syft/store/db/stash.py', '/home/teo/OpenMined/PySyft/packages/syft/src/syft/service/action/action_endpoint.py', '1-dump-database-to-filefrg_l5d9.py', 'sync/2-migrate-for-scenarios5y1yq4_e.py', '/home/teo/OpenMined/PySyft/packages/syft/src/syft/store/sqlite_document_store.py', '0.9.1_notebooks/000-start-and-configure-server-and-adminsyx3g3jx7.py', '/home/teo/OpenMined/PySyft/packages/syft/src/syft/types/syft_object.py'. Reloading...\n", + "WARNING: WatchFiles detected changes in '/home/teo/OpenMined/PySyft/packages/syft/src/syft/util/notebook_ui/components/sync.py', '/home/teo/OpenMined/PySyft/packages/syft/src/syft/service/sync/sync_service.py', '/home/teo/OpenMined/PySyft/packages/syft/src/syft/store/mongo_document_store.py', '/home/teo/OpenMined/PySyft/packages/syft/src/syft/service/worker/worker_pool_stash.py', '/home/teo/OpenMined/PySyft/packages/syft/src/syft/store/mongo_client.py', '/home/teo/OpenMined/PySyft/packages/syft/src/syft/service/code/status_service.py', '/home/teo/OpenMined/PySyft/packages/syft/src/syft/service/sync/diff_state.py', '/home/teo/OpenMined/PySyft/packages/syft/src/syft/service/sync/resolve_widget.py', '/home/teo/OpenMined/PySyft/packages/syft/src/syft/__init__.py', '/home/teo/OpenMined/PySyft/packages/syft/src/syft/store/linked_obj.py', '/home/teo/OpenMined/PySyft/packages/syft/src/syft/store/sqlite_document_store.py', '/home/teo/OpenMined/PySyft/packages/syft/src/syft/service/code/user_code.py', '/home/teo/OpenMined/PySyft/packages/syft/src/syft/service/migration/migration_service.py', '/home/teo/OpenMined/PySyft/packages/syft/src/syft/orchestra.py', '/home/teo/OpenMined/PySyft/packages/syft/src/syft/store/db/stash.py', '/home/teo/OpenMined/PySyft/packages/syft/src/syft/store/kv_document_store.py', '/home/teo/OpenMined/PySyft/packages/syft/src/syft/service/worker/worker_pool.py', '/home/teo/OpenMined/PySyft/packages/syft/src/syft/store/document_store_errors.py', '/home/teo/OpenMined/PySyft/packages/syft/src/syft/service/settings/settings_service.py', '/home/teo/OpenMined/PySyft/packages/syft/src/syft/service/worker/worker_image_stash.py', '/home/teo/OpenMined/PySyft/packages/syft/src/syft/server/server.py', '/home/teo/OpenMined/PySyft/packages/syft/src/syft/service/code/user_code_service.py', '/home/teo/OpenMined/PySyft/packages/syft/src/syft/service/request/request.py', '/home/teo/OpenMined/PySyft/packages/syft/src/syft/server/run.py', '/home/teo/OpenMined/PySyft/packages/syft/src/syft/service/context.py', '/home/teo/OpenMined/PySyft/packages/syft/src/syft/service/worker/worker_image.py', '/home/teo/OpenMined/PySyft/packages/syft/src/syft/protocol/data_protocol.py', '/home/teo/OpenMined/PySyft/packages/syft/src/syft/service/worker/worker_stash.py'. Reloading...\n", + "WARNING: WatchFiles detected changes in '/home/teo/OpenMined/PySyft/packages/syft/src/syft/service/action/action_endpoint.py'. Reloading...\n", + "WARNING: WatchFiles detected changes in '/home/teo/OpenMined/PySyft/packages/syft/src/syft/service/worker/worker_image.py', '/home/teo/OpenMined/PySyft/packages/syft/src/syft/types/errors.py', '/home/teo/OpenMined/PySyft/packages/syft/src/syft/protocol/data_protocol.py', '/home/teo/OpenMined/PySyft/packages/syft/src/syft/types/syft_object_registry.py', '/home/teo/OpenMined/PySyft/packages/syft/src/syft/client/registry.py'. Reloading...\n", + "WARNING: WatchFiles detected changes in '0.9.1_notebooks/000-start-and-configure-server-and-admins280hbmp0.py', '0.9.1_notebooks/011-users-emails-passwordse1tregmc.py', '0.9.1_notebooks/021-create-jobsbdmqwdat.py', '0.9.1_notebooks/040-do-review-requestsdcrbzenu.py', '0.9.1_notebooks/020-configure-apijui3250i.py', '2-migrate-for-scenariosqu6z4j1e.py', '0.9.1_notebooks/001-scale-delete-worker-poolswd9pkkpa.py', '/home/teo/OpenMined/PySyft/packages/syft/src/syft/util/notebook_ui/components/tabulator_template.py', '0.9.1_notebooks/050-ds-get-resultspvbmb58c.py', 'sync/1-dump-database-to-fileekyy4odq.py', '/home/teo/OpenMined/PySyft/packages/syft/src/syft/service/project/project.py', '1-dump-database-to-filec6xcv6rl.py', '/home/teo/OpenMined/PySyft/packages/syft/src/syft/service/action/action_service.py', 'sync/0.9.1_notebooks/02-configure-api-and-syncwjgj05wm.py', 'sync/0.9.1_notebooks/03-ds-submit-request14564nt6.py', 'sync/0.9.1_notebooks/05-ds-get-resultsd0nvbcji.py', '/home/teo/OpenMined/PySyft/packages/syft/src/syft/store/db/stash.py', 'sync/2-migrate-for-scenariosictucd15.py', 'sync/0.9.1_notebooks/04-do-review-requests8ba4smzs.py', 'sync/0.9.1_notebooks/01-setup-high-low-datasites90ezli90.py', '/home/teo/OpenMined/PySyft/packages/syft/src/syft/types/syft_object.py', '0.9.1_notebooks/010-setup-bigquery-poolb5v07_83.py'. Reloading...\n", + "WARNING: WatchFiles detected changes in 'sync/0.9.1_notebooks/03-ds-submit-request14564nt6.py', '0.9.1_notebooks/040-do-review-requestsdcrbzenu.py', 'sync/0.9.1_notebooks/02-configure-api-and-syncwjgj05wm.py', '2-migrate-for-scenariosqu6z4j1e.py', '0.9.1_notebooks/000-start-and-configure-server-and-admins280hbmp0.py', 'sync/0.9.1_notebooks/05-ds-get-resultsd0nvbcji.py', '0.9.1_notebooks/001-scale-delete-worker-poolswd9pkkpa.py', '/home/teo/OpenMined/PySyft/packages/syft/src/syft/types/syft_object_registry.py', '/home/teo/OpenMined/PySyft/packages/syft/src/syft/util/notebook_ui/components/tabulator_template.py', '/home/teo/OpenMined/PySyft/packages/syft/src/syft/store/db/stash.py', 'sync/0.9.1_notebooks/01-setup-high-low-datasites90ezli90.py', '0.9.1_notebooks/021-create-jobsbdmqwdat.py', '0.9.1_notebooks/050-ds-get-resultspvbmb58c.py', '/home/teo/OpenMined/PySyft/packages/syft/src/syft/types/syft_object.py', '/home/teo/OpenMined/PySyft/packages/syft/src/syft/service/action/action_service.py', 'sync/1-dump-database-to-fileekyy4odq.py', '0.9.1_notebooks/011-users-emails-passwordse1tregmc.py', '0.9.1_notebooks/010-setup-bigquery-poolb5v07_83.py', '/home/teo/OpenMined/PySyft/packages/syft/src/syft/client/registry.py', '1-dump-database-to-filec6xcv6rl.py', '/home/teo/OpenMined/PySyft/packages/syft/src/syft/service/project/project.py', '/home/teo/OpenMined/PySyft/packages/syft/src/syft/service/action/action_endpoint.py', 'sync/2-migrate-for-scenariosictucd15.py', 'sync/0.9.1_notebooks/04-do-review-requests8ba4smzs.py', '/home/teo/OpenMined/PySyft/packages/syft/src/syft/service/worker/worker_image.py', '/home/teo/OpenMined/PySyft/packages/syft/src/syft/types/errors.py', '/home/teo/OpenMined/PySyft/packages/syft/src/syft/protocol/data_protocol.py', '0.9.1_notebooks/020-configure-apijui3250i.py'. Reloading...\n" + ] + } + ], "source": [ "server = sy.orchestra.launch(\n", - " name=\"bigquery-high\",\n", + " name=\"bigquery-high-migrations\",\n", " dev_mode=True,\n", " server_side_type=\"high\",\n", " reset=True,\n", @@ -99,7 +1854,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 6, "metadata": {}, "outputs": [], "source": [ @@ -112,9 +1867,32 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 7, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/markdown": [ + "```python\n", + "class MigrationData:\n", + " id: str = d89ce61345274d72bedd294a5615e9c4\n", + " server_uid: str = fbdf5a287e58454cbbd3fac4ad744d37\n", + " root_verify_key: str = 1e5ec44a179d21e0a0721ea7a670b9875d3946c8604f4623903fcafafe03c8e7\n", + " num_objects: str = 17\n", + " num_action_objects: str = 0\n", + " includes_blobs: str = True\n", + "\n", + "```" + ], + "text/plain": [ + "syft.service.migration.object_migration_state.MigrationData" + ] + }, + "execution_count": 7, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "migration_data" ] @@ -128,18 +1906,34 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 8, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "/home/teo/OpenMined/PySyft/notebooks/scenarios/bigquery/upgradability\n" + ] + } + ], "source": [ "!pwd" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 9, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Loading migration data from /home/teo/OpenMined/PySyft/notebooks/scenarios/bigquery/upgradability/migration.blob\n" + ] + } + ], "source": [ "# migration_data_dir = Path(os.getenv(\"MIGRATION_DATA_DIR\", \".\"))\n", "migration_data_dir = Path(\n", @@ -153,9 +1947,888 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 10, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/html": [ + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "
SyftWarning:
This migration data includes custom workers, which need to be migrated separately with `sy.upgrade_custom_workerpools` after finishing the migration.

" + ], + "text/plain": [ + "SyftWarning: This migration data includes custom workers, which need to be migrated separately with `sy.upgrade_custom_workerpools` after finishing the migration." + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Migrating data for: User table to version 2\n", + "Migrating data for: APIEndpointQueueItem table to version 2\n", + "Migrating data for: ActionQueueItem table to version 2\n", + "Migrating data for: ServerSettings table to version 4\n", + "Migrating data for: UserCode table to version 1\n", + "Migrating data for: SyftLog table to version 1\n", + "Migrating data for: Request table to version 1\n", + "Migrating data for: JobItem table to version 2\n", + "Migrating data for: TwinAPIEndpoint table to version 1\n", + "Migrating data for: NotifierSettings table to version 2\n", + "Migrating data for: Notification table to version 2\n", + "Migrating data for: CodeHistory table to version 1\n", + "Migrating data for: SyftObjectMigrationState table to version 1\n", + "Migrating data for: SyftImageRegistry table to version 1\n", + "Migrating data for: ExecutionOutput table to version 1\n", + "Migrating data for: UserCodeStatusCollection table to version 1\n", + " #e0a9432112f448a7bcba97668f653b7a already exists\n", + " #fbdf5a287e58454cbbd3fac4ad744d37 already exists\n", + " #75fa06708c1c45a2b395bb8c0da0d565 already exists\n", + " #d6303fdddb2a462c936a7a63dbbbe036 already exists\n", + " #16a926460dfb4e7ab9330abfccbf3cd8 already exists\n", + " #b68881d3c39c46bea9454a2f61d67444 already exists\n", + " #ae80caf01b83493ba13f1f9f0c834384 already exists\n", + " #625d9f0693d44b02a68f4f8e05294637 already exists\n", + " #d3569d8f10e14669b41576b18990b20f already exists\n", + " #600301f1a95b4e4586efefc9f5e108bf already exists\n", + " #6e10684e83f6442ba114c60f395f690e already exists\n", + " #3e71410324714497be75762283a8063a already exists\n", + "Migrating data for: AnyActionObject table to version 1\n", + "Migrating data for: PandasDataframeObject table to version 1\n", + "Updating store metadata\n" + ] + } + ], "source": [ "res = client.load_migration_data(blob_path)\n", "assert isinstance(res, sy.SyftSuccess), res.message" @@ -163,18 +2836,4340 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 11, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/html": [ + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "
SyftSuccess:
Migration completed successfully

" + ], + "text/plain": [ + "SyftSuccess: Migration completed successfully" + ] + }, + "execution_count": 11, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "res" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 12, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "This is a utility to upgrade workerpools to the new syft version\n", + "If an upgrade fails, it is always possible to start the workerpool manually\n", + "loading migration data...\n", + "Skipping default pool, this pool has already been upgraded\n", + "\n", + "Upgrading workerpool bigquery-pool\n", + "Found outdated prebuilt worker image `docker.io/openmined/syft-worker-bigquery:local-dev`\n", + "submitting new prebuilt image...\n" + ] + }, + { + "data": { + "text/html": [ + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "
SyftSuccess:
Dockerfile ID: 73e73580a220474185159adbe485d58b successfully submitted.

" + ], + "text/plain": [ + "SyftSuccess: Dockerfile ID: 73e73580a220474185159adbe485d58b successfully submitted." + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "starting new pool `bigquery-pool` with 1 workers\n" + ] + }, + { + "data": { + "text/html": [ + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "
\n", + "\n", + "
\n", + "
\n", + " \n", + "
\n", + "

ContainerSpawnStatus List

\n", + "
\n", + "
\n", + "
\n", + " \n", + "
\n", + "
\n", + "

Total: 0

\n", + "
\n", + "
\n", + "
\n", + "\n", + "\n", + "\n", + "" + ], + "text/plain": [ + "[ContainerSpawnStatus(worker_name='bigquery-pool-1', worker=syft.service.worker.worker_pool.SyftWorker, error=None)]" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "Upgraded 1 workerpools to the new syft version\n", + "Please verify your upgraded pools with `client.worker_pools`\n" + ] + } + ], "source": [ "sy.upgrade_custom_workerpools(client, blob_path, mode=\"auto\")" ] @@ -188,34 +7183,21 @@ }, { "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "\"\"\"\n", - "TODO:\n", - " * verify users\n", - " * login\n", - " * check every role\n", - " * mostly check on lengths\n", - " * can a DS see the results of their old jobs/logs\n", - " * still use the api schema both mock \n", - " * still submit a new query via submit_query\n", - " * can admin still approve and approve_by_running, deny\n", - " * check on old broken queries\n", - " * create a new broken query\n", - " * can ds get the results of the new queries\n", - " * emails should work now\n", - " * test in k8s (both L2 and L0)\n", - " * test in L0 (migrate both nodes?)\n", - "\"\"\"" - ] - }, - { - "cell_type": "code", - "execution_count": null, + "execution_count": 14, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Logged into as \n", + "Logged into as \n", + "Logged into as \n", + "Logged into as \n", + "Logged into as \n" + ] + } + ], "source": [ "users = load_users(client, path=\"0.9.1_notebooks/users.json\")\n", "jobs = load_jobs(users, client, filepath=\"0.9.1_notebooks/jobs.json\")" @@ -230,7 +7212,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 15, "metadata": {}, "outputs": [], "source": [ @@ -239,16 +7221,40 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 16, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/markdown": [ + "```python\n", + "class UserView:\n", + " id: str = 647c05a75507467a96ccf6237196fb40\n", + " name: str = \"Jane Doe\"\n", + " email: str = \"admin@bigquery.org\"\n", + " institution: str = \"\"\n", + " website: str = \"\"\n", + " role: str = ServiceRole.ADMIN\n", + " notifications_enabled: str = {: True, : False, : False, : False}\n", + "\n", + "```" + ], + "text/plain": [ + "syft.service.user.user.UserView" + ] + }, + "execution_count": 16, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "server_users[0]" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 17, "metadata": {}, "outputs": [], "source": [ @@ -259,7 +7265,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 18, "metadata": {}, "outputs": [], "source": [ @@ -268,7 +7274,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 19, "metadata": {}, "outputs": [], "source": [ @@ -284,9 +7290,17 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 20, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "len(reviewed_jobs)=9, len(reviewed_jobs_should_succeed)=7, len(reviewed_jobs_should_fail)=2\n" + ] + } + ], "source": [ "# submitted_jobs = [job for job in jobs if job.is_submitted]\n", "reviewed_jobs = [job for job in jobs if job.admin_reviewed]\n", @@ -300,9 +7314,37 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 21, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "> Checking job: simple_query simple_query_d1e040 for user arthur-smith-fake@openmined.org\n", + "Using SQLiteDBConfig and sqlite:////tmp/syft/fbdf5a287e58454cbbd3fac4ad744d37/db/fbdf5a287e58454cbbd3fac4ad744d37_json.db\n", + "Using SQLiteDBConfig and sqlite:////tmp/syft/fbdf5a287e58454cbbd3fac4ad744d37/db/fbdf5a287e58454cbbd3fac4ad744d37_json.db\n", + "> Checking job: simple_query simple_query_6aa50c for user arthur-smith-fake@openmined.org\n", + "Using SQLiteDBConfig and sqlite:////tmp/syft/fbdf5a287e58454cbbd3fac4ad744d37/db/fbdf5a287e58454cbbd3fac4ad744d37_json.db\n", + "Using SQLiteDBConfig and sqlite:////tmp/syft/fbdf5a287e58454cbbd3fac4ad744d37/db/fbdf5a287e58454cbbd3fac4ad744d37_json.db\n", + "> Checking job: simple_query simple_query_912a15 for user noah-hinton-fake@openmined.org\n", + "Using SQLiteDBConfig and sqlite:////tmp/syft/fbdf5a287e58454cbbd3fac4ad744d37/db/fbdf5a287e58454cbbd3fac4ad744d37_json.db\n", + "Using SQLiteDBConfig and sqlite:////tmp/syft/fbdf5a287e58454cbbd3fac4ad744d37/db/fbdf5a287e58454cbbd3fac4ad744d37_json.db\n", + "> Checking job: simple_query simple_query_b82bd0 for user samantha-heath-fake@openmined.org\n", + "Using SQLiteDBConfig and sqlite:////tmp/syft/fbdf5a287e58454cbbd3fac4ad744d37/db/fbdf5a287e58454cbbd3fac4ad744d37_json.db\n", + "Using SQLiteDBConfig and sqlite:////tmp/syft/fbdf5a287e58454cbbd3fac4ad744d37/db/fbdf5a287e58454cbbd3fac4ad744d37_json.db\n", + "> Checking job: simple_query simple_query_b81b03 for user eric-morales-fake@openmined.org\n", + "Using SQLiteDBConfig and sqlite:////tmp/syft/fbdf5a287e58454cbbd3fac4ad744d37/db/fbdf5a287e58454cbbd3fac4ad744d37_json.db\n", + "Using SQLiteDBConfig and sqlite:////tmp/syft/fbdf5a287e58454cbbd3fac4ad744d37/db/fbdf5a287e58454cbbd3fac4ad744d37_json.db\n", + "> Checking job: job_long_name job_long_name_19baf0aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa for user eric-morales-fake@openmined.org\n", + "Using SQLiteDBConfig and sqlite:////tmp/syft/fbdf5a287e58454cbbd3fac4ad744d37/db/fbdf5a287e58454cbbd3fac4ad744d37_json.db\n", + "Using SQLiteDBConfig and sqlite:////tmp/syft/fbdf5a287e58454cbbd3fac4ad744d37/db/fbdf5a287e58454cbbd3fac4ad744d37_json.db\n", + "> Checking job: simple_query simple_query_3ba857 for user lisa-guerra-fake@openmined.org\n", + "Using SQLiteDBConfig and sqlite:////tmp/syft/fbdf5a287e58454cbbd3fac4ad744d37/db/fbdf5a287e58454cbbd3fac4ad744d37_json.db\n", + "Using SQLiteDBConfig and sqlite:////tmp/syft/fbdf5a287e58454cbbd3fac4ad744d37/db/fbdf5a287e58454cbbd3fac4ad744d37_json.db\n" + ] + } + ], "source": [ "for job in reviewed_jobs_should_succeed:\n", " print(f\"> Checking job: {job.job_type} {job.func_name} for user {job.user_email}\")\n", @@ -319,9 +7361,22 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 22, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "> Checking job: wrong_syntax_query wrong_syntax_query_293ad3 for user noah-hinton-fake@openmined.org\n", + "Using SQLiteDBConfig and sqlite:////tmp/syft/fbdf5a287e58454cbbd3fac4ad744d37/db/fbdf5a287e58454cbbd3fac4ad744d37_json.db\n", + "Using SQLiteDBConfig and sqlite:////tmp/syft/fbdf5a287e58454cbbd3fac4ad744d37/db/fbdf5a287e58454cbbd3fac4ad744d37_json.db\n", + "> Checking job: job_too_much_text job_too_much_text_9b550a for user samantha-heath-fake@openmined.org\n", + "Using SQLiteDBConfig and sqlite:////tmp/syft/fbdf5a287e58454cbbd3fac4ad744d37/db/fbdf5a287e58454cbbd3fac4ad744d37_json.db\n", + "Using SQLiteDBConfig and sqlite:////tmp/syft/fbdf5a287e58454cbbd3fac4ad744d37/db/fbdf5a287e58454cbbd3fac4ad744d37_json.db\n" + ] + } + ], "source": [ "for job in reviewed_jobs_should_fail:\n", " print(f\"> Checking job: {job.job_type} {job.func_name} for user {job.user_email}\")\n", @@ -337,9 +7392,17 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 23, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "got expected_jobs: 9 == reviewed_jobs: 9\n" + ] + } + ], "source": [ "expected_jobs = [job for job in jobs if job.result_as_expected]\n", "print(f\"got expected_jobs: {len(expected_jobs)} == reviewed_jobs: {len(reviewed_jobs)}\")\n", @@ -355,7 +7418,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 24, "metadata": {}, "outputs": [], "source": [ @@ -364,7 +7427,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 25, "metadata": {}, "outputs": [], "source": [ @@ -373,7 +7436,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 26, "metadata": {}, "outputs": [], "source": [ @@ -382,9 +7445,36 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 27, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Using SQLiteDBConfig and sqlite:////tmp/syft/fbdf5a287e58454cbbd3fac4ad744d37/db/fbdf5a287e58454cbbd3fac4ad744d37_json.db\n", + "Using SQLiteDBConfig and sqlite:////tmp/syft/fbdf5a287e58454cbbd3fac4ad744d37/db/fbdf5a287e58454cbbd3fac4ad744d37_json.db\n", + "SyftSuccess: Syft function 'execute_query' successfully created. To add a code request, please create a project using `project = syft.Project(...)`, then use command `project.create_code_request`.\n" + ] + }, + { + "data": { + "text/markdown": [ + "\n", + "**Pointer**\n", + "\n", + "'Query submitted syft.service.request.request.Request. Use `client.code.simple_query_b0bd25()` to run your query'\n" + ], + "text/plain": [ + "Pointer:\n", + "'Query submitted syft.service.request.request.Request. Use `client.code.simple_query_b0bd25()` to run your query'" + ] + }, + "execution_count": 27, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "response = ds_client.api.services.bigquery.submit_query(\n", " func_name=job.func_name, query=job.query\n", @@ -394,7 +7484,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 28, "metadata": {}, "outputs": [], "source": [ @@ -403,9 +7493,17 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 29, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Approving request on change simple_query_b0bd25 for datasite bigquery-high\n" + ] + } + ], "source": [ "for request in client.requests:\n", " if request.code.service_func_name == job.func_name:\n", @@ -414,7 +7512,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 30, "metadata": {}, "outputs": [], "source": [ @@ -423,16 +7521,42 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 31, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Using SQLiteDBConfig and sqlite:////tmp/syft/fbdf5a287e58454cbbd3fac4ad744d37/db/fbdf5a287e58454cbbd3fac4ad744d37_json.db\n", + "Using SQLiteDBConfig and sqlite:////tmp/syft/fbdf5a287e58454cbbd3fac4ad744d37/db/fbdf5a287e58454cbbd3fac4ad744d37_json.db\n" + ] + }, + { + "data": { + "text/markdown": [ + "\n", + "**Pointer**\n", + "\n", + "None\n" + ], + "text/plain": [ + "Pointer:\n", + "None" + ] + }, + "execution_count": 31, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "job_res.wait()" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 32, "metadata": {}, "outputs": [], "source": [ @@ -444,7 +7568,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 35, "metadata": {}, "outputs": [], "source": [ @@ -453,9 +7577,36 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 36, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Using SQLiteDBConfig and sqlite:////tmp/syft/fbdf5a287e58454cbbd3fac4ad744d37/db/fbdf5a287e58454cbbd3fac4ad744d37_json.db\n", + "Using SQLiteDBConfig and sqlite:////tmp/syft/fbdf5a287e58454cbbd3fac4ad744d37/db/fbdf5a287e58454cbbd3fac4ad744d37_json.db\n", + "SyftSuccess: Syft function 'execute_query' successfully created. To add a code request, please create a project using `project = syft.Project(...)`, then use command `project.create_code_request`.\n" + ] + }, + { + "data": { + "text/markdown": [ + "\n", + "**Pointer**\n", + "\n", + "'Query submitted syft.service.request.request.Request. Use `client.code.wrong_syntax_query_9c9dcc()` to run your query'\n" + ], + "text/plain": [ + "Pointer:\n", + "'Query submitted syft.service.request.request.Request. Use `client.code.wrong_syntax_query_9c9dcc()` to run your query'" + ] + }, + "execution_count": 36, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "response = ds_client.api.services.bigquery.submit_query(\n", " func_name=wrong_syntax_job.func_name, query=wrong_syntax_job.query\n", @@ -465,7 +7616,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 37, "metadata": {}, "outputs": [], "source": [ @@ -474,9 +7625,17 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 38, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Approving request on change wrong_syntax_query_9c9dcc for datasite bigquery-high\n" + ] + } + ], "source": [ "for request in client.requests:\n", " if request.code.service_func_name == wrong_syntax_job.func_name:\n", @@ -485,18 +7644,403 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 43, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Using SQLiteDBConfig and sqlite:////tmp/syft/fbdf5a287e58454cbbd3fac4ad744d37/db/fbdf5a287e58454cbbd3fac4ad744d37_json.db\n" + ] + } + ], "source": [ "job_res = getattr(ds_client.code, wrong_syntax_job.func_name)(blocking=False)" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 46, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "INFO: Shutting down\n", + "INFO: Waiting for application shutdown.\n", + "INFO: Application shutdown complete.\n", + "INFO: Finished server process [287771]\n", + "INFO: Starting server with settings: {'name': 'bigquery-high', 'server_type': , 'server_side_type': , 'deployment_type': , 'processes': 1, 'reset': False, 'dev_mode': True, 'enable_warnings': False, 'in_memory_workers': True, 'queue_port': None, 'create_producer': True, 'n_consumers': 1, 'association_request_auto_approval': False, 'background_tasks': False, 'db_config': None, 'db_url': None} and worker class: \n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "WARN: private key is based on server name: bigquery-high in dev_mode. Don't run this in production.\n", + "Using SQLiteDBConfig and sqlite:////tmp/syft/fbdf5a287e58454cbbd3fac4ad744d37/db/fbdf5a287e58454cbbd3fac4ad744d37_json.db\n", + "Adding producer for queue: api_call on: tcp://localhost:48405\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "INFO: Started server process [325237]\n", + "INFO: Waiting for application startup.\n", + "INFO: Application startup complete.\n", + "INFO: Starting server with settings: {'name': 'bigquery-high', 'server_type': , 'server_side_type': , 'deployment_type': , 'processes': 1, 'reset': False, 'dev_mode': True, 'enable_warnings': False, 'in_memory_workers': True, 'queue_port': None, 'create_producer': True, 'n_consumers': 1, 'association_request_auto_approval': False, 'background_tasks': False, 'db_config': None, 'db_url': None} and worker class: \n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "WARN: private key is based on server name: bigquery-high in dev_mode. Don't run this in production.\n", + "Using SQLiteDBConfig and sqlite:////tmp/syft/fbdf5a287e58454cbbd3fac4ad744d37/db/fbdf5a287e58454cbbd3fac4ad744d37_json.db\n", + "Adding producer for queue: api_call on: tcp://localhost:39827\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "INFO: Started server process [326064]\n", + "INFO: Waiting for application startup.\n", + "INFO: Application startup complete.\n", + "INFO: Starting server with settings: {'name': 'bigquery-high', 'server_type': , 'server_side_type': , 'deployment_type': , 'processes': 1, 'reset': False, 'dev_mode': True, 'enable_warnings': False, 'in_memory_workers': True, 'queue_port': None, 'create_producer': True, 'n_consumers': 1, 'association_request_auto_approval': False, 'background_tasks': False, 'db_config': None, 'db_url': None} and worker class: \n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "WARN: private key is based on server name: bigquery-high in dev_mode. Don't run this in production.\n", + "Using SQLiteDBConfig and sqlite:////tmp/syft/fbdf5a287e58454cbbd3fac4ad744d37/db/fbdf5a287e58454cbbd3fac4ad744d37_json.db\n", + "Adding producer for queue: api_call on: tcp://localhost:50343\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "INFO: Started server process [326193]\n", + "INFO: Waiting for application startup.\n", + "INFO: Application startup complete.\n", + "INFO: Shutting down\n", + "INFO: Waiting for application shutdown.\n", + "INFO: Application shutdown complete.\n", + "INFO: Finished server process [326193]\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "WARN: private key is based on server name: bigquery-high in dev_mode. Don't run this in production.\n", + "Using SQLiteDBConfig and sqlite:////tmp/syft/fbdf5a287e58454cbbd3fac4ad744d37/db/fbdf5a287e58454cbbd3fac4ad744d37_json.db\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "INFO: Starting server with settings: {'name': 'bigquery-high', 'server_type': , 'server_side_type': , 'deployment_type': , 'processes': 1, 'reset': False, 'dev_mode': True, 'enable_warnings': False, 'in_memory_workers': True, 'queue_port': None, 'create_producer': True, 'n_consumers': 1, 'association_request_auto_approval': False, 'background_tasks': False, 'db_config': None, 'db_url': None} and worker class: \n", + "Process SpawnProcess-1:5:\n", + "Traceback (most recent call last):\n", + " File \"/home/teo/anaconda3/envs/syft_3.12/lib/python3.12/multiprocessing/process.py\", line 314, in _bootstrap\n", + " self.run()\n", + " File \"/home/teo/anaconda3/envs/syft_3.12/lib/python3.12/multiprocessing/process.py\", line 108, in run\n", + " self._target(*self._args, **self._kwargs)\n", + " File \"/home/teo/anaconda3/envs/syft_3.12/lib/python3.12/site-packages/uvicorn/_subprocess.py\", line 80, in subprocess_started\n", + " target(sockets=sockets)\n", + " File \"/home/teo/anaconda3/envs/syft_3.12/lib/python3.12/site-packages/uvicorn/server.py\", line 65, in run\n", + " return asyncio.run(self.serve(sockets=sockets))\n", + " ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n", + " File \"/home/teo/anaconda3/envs/syft_3.12/lib/python3.12/asyncio/runners.py\", line 194, in run\n", + " return runner.run(main)\n", + " ^^^^^^^^^^^^^^^^\n", + " File \"/home/teo/anaconda3/envs/syft_3.12/lib/python3.12/asyncio/runners.py\", line 118, in run\n", + " return self._loop.run_until_complete(task)\n", + " ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n", + " File \"uvloop/loop.pyx\", line 1517, in uvloop.loop.Loop.run_until_complete\n", + " File \"/home/teo/anaconda3/envs/syft_3.12/lib/python3.12/site-packages/uvicorn/server.py\", line 69, in serve\n", + " await self._serve(sockets)\n", + " File \"/home/teo/anaconda3/envs/syft_3.12/lib/python3.12/site-packages/uvicorn/server.py\", line 76, in _serve\n", + " config.load()\n", + " File \"/home/teo/anaconda3/envs/syft_3.12/lib/python3.12/site-packages/uvicorn/config.py\", line 440, in load\n", + " self.loaded_app = self.loaded_app()\n", + " ^^^^^^^^^^^^^^^^^\n", + " File \"/home/teo/OpenMined/PySyft/packages/syft/src/syft/server/uvicorn.py\", line 111, in app_factory\n", + " worker = worker_class.named(**kwargs)\n", + " ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n", + " File \"/home/teo/OpenMined/PySyft/packages/syft/src/syft/server/server.py\", line 728, in named\n", + " return cls(\n", + " ^^^^\n", + " File \"/home/teo/OpenMined/PySyft/packages/syft/src/syft/server/server.py\", line 431, in __init__\n", + " self.post_init()\n", + " File \"/home/teo/OpenMined/PySyft/packages/syft/src/syft/server/server.py\", line 863, in post_init\n", + " self.services.user_code.load_user_code(context=context)\n", + " File \"/home/teo/OpenMined/PySyft/packages/syft/src/syft/types/result.py\", line 113, in wrapper\n", + " output = func(*args, **kwargs)\n", + " ^^^^^^^^^^^^^^^^^^^^^\n", + " File \"/home/teo/OpenMined/PySyft/packages/syft/src/syft/service/code/user_code_service.py\", line 338, in load_user_code\n", + " load_approved_policy_code(user_code_items=user_code_items, context=context)\n", + " File \"/home/teo/OpenMined/PySyft/packages/syft/src/syft/service/code/user_code.py\", line 2085, in load_approved_policy_code\n", + " status = user_code.get_status(context).unwrap()\n", + " ^^^^^^^^^^^^^^^^^^^^\n", + " File \"/home/teo/OpenMined/PySyft/packages/syft/src/syft/types/syft_object.py\", line 757, in __getattr__\n", + " raise AttributeError(\n", + "AttributeError: 'UserCodeV1' object has no attribute 'get_status'\n", + "INFO: Starting server with settings: {'name': 'bigquery-high', 'server_type': , 'server_side_type': , 'deployment_type': , 'processes': 1, 'reset': False, 'dev_mode': True, 'enable_warnings': False, 'in_memory_workers': True, 'queue_port': None, 'create_producer': True, 'n_consumers': 1, 'association_request_auto_approval': False, 'background_tasks': False, 'db_config': None, 'db_url': None} and worker class: \n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "WARN: private key is based on server name: bigquery-high in dev_mode. Don't run this in production.\n", + "Using SQLiteDBConfig and sqlite:////tmp/syft/fbdf5a287e58454cbbd3fac4ad744d37/db/fbdf5a287e58454cbbd3fac4ad744d37_json.db\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Process SpawnProcess-1:6:\n", + "Traceback (most recent call last):\n", + " File \"/home/teo/anaconda3/envs/syft_3.12/lib/python3.12/multiprocessing/process.py\", line 314, in _bootstrap\n", + " self.run()\n", + " File \"/home/teo/anaconda3/envs/syft_3.12/lib/python3.12/multiprocessing/process.py\", line 108, in run\n", + " self._target(*self._args, **self._kwargs)\n", + " File \"/home/teo/anaconda3/envs/syft_3.12/lib/python3.12/site-packages/uvicorn/_subprocess.py\", line 80, in subprocess_started\n", + " target(sockets=sockets)\n", + " File \"/home/teo/anaconda3/envs/syft_3.12/lib/python3.12/site-packages/uvicorn/server.py\", line 65, in run\n", + " return asyncio.run(self.serve(sockets=sockets))\n", + " ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n", + " File \"/home/teo/anaconda3/envs/syft_3.12/lib/python3.12/asyncio/runners.py\", line 194, in run\n", + " return runner.run(main)\n", + " ^^^^^^^^^^^^^^^^\n", + " File \"/home/teo/anaconda3/envs/syft_3.12/lib/python3.12/asyncio/runners.py\", line 118, in run\n", + " return self._loop.run_until_complete(task)\n", + " ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n", + " File \"uvloop/loop.pyx\", line 1517, in uvloop.loop.Loop.run_until_complete\n", + " File \"/home/teo/anaconda3/envs/syft_3.12/lib/python3.12/site-packages/uvicorn/server.py\", line 69, in serve\n", + " await self._serve(sockets)\n", + " File \"/home/teo/anaconda3/envs/syft_3.12/lib/python3.12/site-packages/uvicorn/server.py\", line 76, in _serve\n", + " config.load()\n", + " File \"/home/teo/anaconda3/envs/syft_3.12/lib/python3.12/site-packages/uvicorn/config.py\", line 440, in load\n", + " self.loaded_app = self.loaded_app()\n", + " ^^^^^^^^^^^^^^^^^\n", + " File \"/home/teo/OpenMined/PySyft/packages/syft/src/syft/server/uvicorn.py\", line 111, in app_factory\n", + " worker = worker_class.named(**kwargs)\n", + " ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n", + " File \"/home/teo/OpenMined/PySyft/packages/syft/src/syft/server/server.py\", line 728, in named\n", + " return cls(\n", + " ^^^^\n", + " File \"/home/teo/OpenMined/PySyft/packages/syft/src/syft/server/server.py\", line 431, in __init__\n", + " self.post_init()\n", + " File \"/home/teo/OpenMined/PySyft/packages/syft/src/syft/server/server.py\", line 863, in post_init\n", + " self.services.user_code.load_user_code(context=context)\n", + " File \"/home/teo/OpenMined/PySyft/packages/syft/src/syft/types/result.py\", line 113, in wrapper\n", + " output = func(*args, **kwargs)\n", + " ^^^^^^^^^^^^^^^^^^^^^\n", + " File \"/home/teo/OpenMined/PySyft/packages/syft/src/syft/service/code/user_code_service.py\", line 338, in load_user_code\n", + " load_approved_policy_code(user_code_items=user_code_items, context=context)\n", + " File \"/home/teo/OpenMined/PySyft/packages/syft/src/syft/service/code/user_code.py\", line 2085, in load_approved_policy_code\n", + " status = user_code.get_status(context).unwrap()\n", + " ^^^^^^^^^^^^^^^^^^^^\n", + " File \"/home/teo/OpenMined/PySyft/packages/syft/src/syft/types/syft_object.py\", line 757, in __getattr__\n", + " raise AttributeError(\n", + "AttributeError: 'UserCodeV1' object has no attribute 'get_status'\n", + "INFO: Starting server with settings: {'name': 'bigquery-high', 'server_type': , 'server_side_type': , 'deployment_type': , 'processes': 1, 'reset': False, 'dev_mode': True, 'enable_warnings': False, 'in_memory_workers': True, 'queue_port': None, 'create_producer': True, 'n_consumers': 1, 'association_request_auto_approval': False, 'background_tasks': False, 'db_config': None, 'db_url': None} and worker class: \n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "WARN: private key is based on server name: bigquery-high in dev_mode. Don't run this in production.\n", + "Using SQLiteDBConfig and sqlite:////tmp/syft/fbdf5a287e58454cbbd3fac4ad744d37/db/fbdf5a287e58454cbbd3fac4ad744d37_json.db\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Process SpawnProcess-1:7:\n", + "Traceback (most recent call last):\n", + " File \"/home/teo/anaconda3/envs/syft_3.12/lib/python3.12/multiprocessing/process.py\", line 314, in _bootstrap\n", + " self.run()\n", + " File \"/home/teo/anaconda3/envs/syft_3.12/lib/python3.12/multiprocessing/process.py\", line 108, in run\n", + " self._target(*self._args, **self._kwargs)\n", + " File \"/home/teo/anaconda3/envs/syft_3.12/lib/python3.12/site-packages/uvicorn/_subprocess.py\", line 80, in subprocess_started\n", + " target(sockets=sockets)\n", + " File \"/home/teo/anaconda3/envs/syft_3.12/lib/python3.12/site-packages/uvicorn/server.py\", line 65, in run\n", + " return asyncio.run(self.serve(sockets=sockets))\n", + " ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n", + " File \"/home/teo/anaconda3/envs/syft_3.12/lib/python3.12/asyncio/runners.py\", line 194, in run\n", + " return runner.run(main)\n", + " ^^^^^^^^^^^^^^^^\n", + " File \"/home/teo/anaconda3/envs/syft_3.12/lib/python3.12/asyncio/runners.py\", line 118, in run\n", + " return self._loop.run_until_complete(task)\n", + " ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n", + " File \"uvloop/loop.pyx\", line 1517, in uvloop.loop.Loop.run_until_complete\n", + " File \"/home/teo/anaconda3/envs/syft_3.12/lib/python3.12/site-packages/uvicorn/server.py\", line 69, in serve\n", + " await self._serve(sockets)\n", + " File \"/home/teo/anaconda3/envs/syft_3.12/lib/python3.12/site-packages/uvicorn/server.py\", line 76, in _serve\n", + " config.load()\n", + " File \"/home/teo/anaconda3/envs/syft_3.12/lib/python3.12/site-packages/uvicorn/config.py\", line 440, in load\n", + " self.loaded_app = self.loaded_app()\n", + " ^^^^^^^^^^^^^^^^^\n", + " File \"/home/teo/OpenMined/PySyft/packages/syft/src/syft/server/uvicorn.py\", line 111, in app_factory\n", + " worker = worker_class.named(**kwargs)\n", + " ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n", + " File \"/home/teo/OpenMined/PySyft/packages/syft/src/syft/server/server.py\", line 728, in named\n", + " return cls(\n", + " ^^^^\n", + " File \"/home/teo/OpenMined/PySyft/packages/syft/src/syft/server/server.py\", line 431, in __init__\n", + " self.post_init()\n", + " File \"/home/teo/OpenMined/PySyft/packages/syft/src/syft/server/server.py\", line 863, in post_init\n", + " self.services.user_code.load_user_code(context=context)\n", + " File \"/home/teo/OpenMined/PySyft/packages/syft/src/syft/types/result.py\", line 113, in wrapper\n", + " output = func(*args, **kwargs)\n", + " ^^^^^^^^^^^^^^^^^^^^^\n", + " File \"/home/teo/OpenMined/PySyft/packages/syft/src/syft/service/code/user_code_service.py\", line 338, in load_user_code\n", + " load_approved_policy_code(user_code_items=user_code_items, context=context)\n", + " File \"/home/teo/OpenMined/PySyft/packages/syft/src/syft/service/code/user_code.py\", line 2085, in load_approved_policy_code\n", + " status = user_code.get_status(context).unwrap()\n", + " ^^^^^^^^^^^^^^^^^^^^\n", + " File \"/home/teo/OpenMined/PySyft/packages/syft/src/syft/types/syft_object.py\", line 757, in __getattr__\n", + " raise AttributeError(\n", + "AttributeError: 'UserCodeV1' object has no attribute 'get_status'\n", + "INFO: Starting server with settings: {'name': 'bigquery-high', 'server_type': , 'server_side_type': , 'deployment_type': , 'processes': 1, 'reset': False, 'dev_mode': True, 'enable_warnings': False, 'in_memory_workers': True, 'queue_port': None, 'create_producer': True, 'n_consumers': 1, 'association_request_auto_approval': False, 'background_tasks': False, 'db_config': None, 'db_url': None} and worker class: \n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "WARN: private key is based on server name: bigquery-high in dev_mode. Don't run this in production.\n", + "Using SQLiteDBConfig and sqlite:////tmp/syft/fbdf5a287e58454cbbd3fac4ad744d37/db/fbdf5a287e58454cbbd3fac4ad744d37_json.db\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Process SpawnProcess-1:8:\n", + "Traceback (most recent call last):\n", + " File \"/home/teo/anaconda3/envs/syft_3.12/lib/python3.12/multiprocessing/process.py\", line 314, in _bootstrap\n", + " self.run()\n", + " File \"/home/teo/anaconda3/envs/syft_3.12/lib/python3.12/multiprocessing/process.py\", line 108, in run\n", + " self._target(*self._args, **self._kwargs)\n", + " File \"/home/teo/anaconda3/envs/syft_3.12/lib/python3.12/site-packages/uvicorn/_subprocess.py\", line 80, in subprocess_started\n", + " target(sockets=sockets)\n", + " File \"/home/teo/anaconda3/envs/syft_3.12/lib/python3.12/site-packages/uvicorn/server.py\", line 65, in run\n", + " return asyncio.run(self.serve(sockets=sockets))\n", + " ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n", + " File \"/home/teo/anaconda3/envs/syft_3.12/lib/python3.12/asyncio/runners.py\", line 194, in run\n", + " return runner.run(main)\n", + " ^^^^^^^^^^^^^^^^\n", + " File \"/home/teo/anaconda3/envs/syft_3.12/lib/python3.12/asyncio/runners.py\", line 118, in run\n", + " return self._loop.run_until_complete(task)\n", + " ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n", + " File \"uvloop/loop.pyx\", line 1517, in uvloop.loop.Loop.run_until_complete\n", + " File \"/home/teo/anaconda3/envs/syft_3.12/lib/python3.12/site-packages/uvicorn/server.py\", line 69, in serve\n", + " await self._serve(sockets)\n", + " File \"/home/teo/anaconda3/envs/syft_3.12/lib/python3.12/site-packages/uvicorn/server.py\", line 76, in _serve\n", + " config.load()\n", + " File \"/home/teo/anaconda3/envs/syft_3.12/lib/python3.12/site-packages/uvicorn/config.py\", line 440, in load\n", + " self.loaded_app = self.loaded_app()\n", + " ^^^^^^^^^^^^^^^^^\n", + " File \"/home/teo/OpenMined/PySyft/packages/syft/src/syft/server/uvicorn.py\", line 111, in app_factory\n", + " worker = worker_class.named(**kwargs)\n", + " ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n", + " File \"/home/teo/OpenMined/PySyft/packages/syft/src/syft/server/server.py\", line 728, in named\n", + " return cls(\n", + " ^^^^\n", + " File \"/home/teo/OpenMined/PySyft/packages/syft/src/syft/server/server.py\", line 431, in __init__\n", + " self.post_init()\n", + " File \"/home/teo/OpenMined/PySyft/packages/syft/src/syft/server/server.py\", line 863, in post_init\n", + " self.services.user_code.load_user_code(context=context)\n", + " File \"/home/teo/OpenMined/PySyft/packages/syft/src/syft/types/result.py\", line 113, in wrapper\n", + " output = func(*args, **kwargs)\n", + " ^^^^^^^^^^^^^^^^^^^^^\n", + " File \"/home/teo/OpenMined/PySyft/packages/syft/src/syft/service/code/user_code_service.py\", line 338, in load_user_code\n", + " load_approved_policy_code(user_code_items=user_code_items, context=context)\n", + " File \"/home/teo/OpenMined/PySyft/packages/syft/src/syft/service/code/user_code.py\", line 2085, in load_approved_policy_code\n", + " status = user_code.get_status(context).unwrap()\n", + " ^^^^^^^^^^^^^^^^^^^^\n", + " File \"/home/teo/OpenMined/PySyft/packages/syft/src/syft/types/syft_object.py\", line 757, in __getattr__\n", + " raise AttributeError(\n", + "AttributeError: 'UserCodeV1' object has no attribute 'get_status'\n", + "INFO: Starting server with settings: {'name': 'bigquery-high', 'server_type': , 'server_side_type': , 'deployment_type': , 'processes': 1, 'reset': False, 'dev_mode': True, 'enable_warnings': False, 'in_memory_workers': True, 'queue_port': None, 'create_producer': True, 'n_consumers': 1, 'association_request_auto_approval': False, 'background_tasks': False, 'db_config': None, 'db_url': None} and worker class: \n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "WARN: private key is based on server name: bigquery-high in dev_mode. Don't run this in production.\n", + "Using SQLiteDBConfig and sqlite:////tmp/syft/fbdf5a287e58454cbbd3fac4ad744d37/db/fbdf5a287e58454cbbd3fac4ad744d37_json.db\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Process SpawnProcess-1:9:\n", + "Traceback (most recent call last):\n", + " File \"/home/teo/anaconda3/envs/syft_3.12/lib/python3.12/multiprocessing/process.py\", line 314, in _bootstrap\n", + " self.run()\n", + " File \"/home/teo/anaconda3/envs/syft_3.12/lib/python3.12/multiprocessing/process.py\", line 108, in run\n", + " self._target(*self._args, **self._kwargs)\n", + " File \"/home/teo/anaconda3/envs/syft_3.12/lib/python3.12/site-packages/uvicorn/_subprocess.py\", line 80, in subprocess_started\n", + " target(sockets=sockets)\n", + " File \"/home/teo/anaconda3/envs/syft_3.12/lib/python3.12/site-packages/uvicorn/server.py\", line 65, in run\n", + " return asyncio.run(self.serve(sockets=sockets))\n", + " ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n", + " File \"/home/teo/anaconda3/envs/syft_3.12/lib/python3.12/asyncio/runners.py\", line 194, in run\n", + " return runner.run(main)\n", + " ^^^^^^^^^^^^^^^^\n", + " File \"/home/teo/anaconda3/envs/syft_3.12/lib/python3.12/asyncio/runners.py\", line 118, in run\n", + " return self._loop.run_until_complete(task)\n", + " ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n", + " File \"uvloop/loop.pyx\", line 1517, in uvloop.loop.Loop.run_until_complete\n", + " File \"/home/teo/anaconda3/envs/syft_3.12/lib/python3.12/site-packages/uvicorn/server.py\", line 69, in serve\n", + " await self._serve(sockets)\n", + " File \"/home/teo/anaconda3/envs/syft_3.12/lib/python3.12/site-packages/uvicorn/server.py\", line 76, in _serve\n", + " config.load()\n", + " File \"/home/teo/anaconda3/envs/syft_3.12/lib/python3.12/site-packages/uvicorn/config.py\", line 440, in load\n", + " self.loaded_app = self.loaded_app()\n", + " ^^^^^^^^^^^^^^^^^\n", + " File \"/home/teo/OpenMined/PySyft/packages/syft/src/syft/server/uvicorn.py\", line 111, in app_factory\n", + " worker = worker_class.named(**kwargs)\n", + " ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n", + " File \"/home/teo/OpenMined/PySyft/packages/syft/src/syft/server/server.py\", line 728, in named\n", + " return cls(\n", + " ^^^^\n", + " File \"/home/teo/OpenMined/PySyft/packages/syft/src/syft/server/server.py\", line 431, in __init__\n", + " self.post_init()\n", + " File \"/home/teo/OpenMined/PySyft/packages/syft/src/syft/server/server.py\", line 863, in post_init\n", + " self.services.user_code.load_user_code(context=context)\n", + " File \"/home/teo/OpenMined/PySyft/packages/syft/src/syft/types/result.py\", line 113, in wrapper\n", + " output = func(*args, **kwargs)\n", + " ^^^^^^^^^^^^^^^^^^^^^\n", + " File \"/home/teo/OpenMined/PySyft/packages/syft/src/syft/service/code/user_code_service.py\", line 338, in load_user_code\n", + " load_approved_policy_code(user_code_items=user_code_items, context=context)\n", + " File \"/home/teo/OpenMined/PySyft/packages/syft/src/syft/service/code/user_code.py\", line 2085, in load_approved_policy_code\n", + " status = user_code.get_status(context).unwrap()\n", + " ^^^^^^^^^^^^^^^^^^^^\n", + " File \"/home/teo/OpenMined/PySyft/packages/syft/src/syft/types/syft_object.py\", line 757, in __getattr__\n", + " raise AttributeError(\n", + "AttributeError: 'UserCodeV1' object has no attribute 'get_status'\n" + ] + } + ], "source": [ "assert isinstance(job_res.wait(), sy.SyftError)" ] From 9627de856c6c14dd1c5a52fcc146acf97d79b620 Mon Sep 17 00:00:00 2001 From: teo Date: Mon, 23 Sep 2024 12:44:06 +0300 Subject: [PATCH 16/17] fix path --- .../upgradability/0.9.1_notebooks/emails.json | 98 +- .../upgradability/0.9.1_notebooks/jobs.json | 181 +- .../upgradability/0.9.1_notebooks/users.json | 53 +- .../1-dump-database-to-file.ipynb | 5 +- .../2-migrate-for-scenarios.ipynb | 7687 +---------------- 5 files changed, 388 insertions(+), 7636 deletions(-) diff --git a/notebooks/scenarios/bigquery/upgradability/0.9.1_notebooks/emails.json b/notebooks/scenarios/bigquery/upgradability/0.9.1_notebooks/emails.json index 7484c139838..978c920b55d 100644 --- a/notebooks/scenarios/bigquery/upgradability/0.9.1_notebooks/emails.json +++ b/notebooks/scenarios/bigquery/upgradability/0.9.1_notebooks/emails.json @@ -1 +1,97 @@ -{"admin@bigquery.org": [{"email_from": "noreply@openmined.org", "email_to": ["admin@bigquery.org"], "email_content": "Content-Type: multipart/alternative; boundary=\"===============7117641952261823257==\"\r\nMIME-Version: 1.0\r\nFrom: noreply@openmined.org\r\nTo: admin@bigquery.org\r\nSubject: Datasite bigquery-high-migrations: A New Request (8e12) has been received!\r\n\r\n--===============7117641952261823257==\r\nContent-Type: text/html; charset=\"us-ascii\"\r\nMIME-Version: 1.0\r\nContent-Transfer-Encoding: 7bit\r\n\r\n\r\n \r\n Access Request Notification\r\n \r\n \r\n \r\n
\r\n
\r\n Request Notification\r\n
\r\n
\r\n

Hello,

\r\n

A new request has been submitted and requires your attention.\r\n Please review the details below:

\r\n\r\n
\r\n
Request Details
\r\n
\r\n\r\n

ID: 8e12c9ac5c5547b1afe5b5a1d5e24900

\r\n

\r\n Submitted By:\r\n William Thompson\r\n

\r\n

Date: 2024-09-23 09:30:38

\r\n

Status:

\r\n PENDING\r\n
\r\n

Changes:\r\n UserCodeStatusChange\r\n

\r\n\r\n

Use:
\r\n \r\n request = client.api.services.request.get_by_uid(uid=sy.UID(\"8e12c9ac5c5547b1afe5b5a1d5e24900\"))\r\n
\r\n to get this specific request.\r\n

\r\n\r\n

Or you can view all requests with:
\r\n \r\n client.requests\r\n \r\n

\r\n\r\n
\r\n
\r\n

If you did not expect this request or have concerns about it,\r\n please contact our support team immediately.

\r\n
\r\n
\r\n This is an automated message, please do not reply directly to this email.
\r\n For assistance, please contact our support team.\r\n
\r\n
\r\n \r\n \r\n--===============7117641952261823257==--\r\n"}, {"email_from": "noreply@openmined.org", "email_to": ["admin@bigquery.org"], "email_content": "Content-Type: multipart/alternative; boundary=\"===============3685701994337601608==\"\r\nMIME-Version: 1.0\r\nFrom: noreply@openmined.org\r\nTo: admin@bigquery.org\r\nSubject: Datasite bigquery-high-migrations: A New Request (1eb3) has been received!\r\n\r\n--===============3685701994337601608==\r\nContent-Type: text/html; charset=\"us-ascii\"\r\nMIME-Version: 1.0\r\nContent-Transfer-Encoding: 7bit\r\n\r\n\r\n \r\n Access Request Notification\r\n \r\n \r\n \r\n
\r\n
\r\n Request Notification\r\n
\r\n
\r\n

Hello,

\r\n

A new request has been submitted and requires your attention.\r\n Please review the details below:

\r\n\r\n
\r\n
Request Details
\r\n
\r\n\r\n

ID: 1eb3b8a2579a4b8db00b2de5e10de974

\r\n

\r\n Submitted By:\r\n Eric Hahn\r\n

\r\n

Date: 2024-09-23 09:30:48

\r\n

Status:

\r\n PENDING\r\n
\r\n

Changes:\r\n UserCodeStatusChange\r\n

\r\n\r\n

Use:
\r\n \r\n request = client.api.services.request.get_by_uid(uid=sy.UID(\"1eb3b8a2579a4b8db00b2de5e10de974\"))\r\n
\r\n to get this specific request.\r\n

\r\n\r\n

Or you can view all requests with:
\r\n \r\n client.requests\r\n \r\n

\r\n\r\n
\r\n
\r\n

If you did not expect this request or have concerns about it,\r\n please contact our support team immediately.

\r\n
\r\n
\r\n This is an automated message, please do not reply directly to this email.
\r\n For assistance, please contact our support team.\r\n
\r\n
\r\n \r\n \r\n--===============3685701994337601608==--\r\n"}, {"email_from": "noreply@openmined.org", "email_to": ["admin@bigquery.org"], "email_content": "Content-Type: multipart/alternative; boundary=\"===============6536215668630059171==\"\r\nMIME-Version: 1.0\r\nFrom: noreply@openmined.org\r\nTo: admin@bigquery.org\r\nSubject: Datasite bigquery-high-migrations: A New Request (bcb3) has been received!\r\n\r\n--===============6536215668630059171==\r\nContent-Type: text/html; charset=\"us-ascii\"\r\nMIME-Version: 1.0\r\nContent-Transfer-Encoding: 7bit\r\n\r\n\r\n \r\n Access Request Notification\r\n \r\n \r\n \r\n
\r\n
\r\n Request Notification\r\n
\r\n
\r\n

Hello,

\r\n

A new request has been submitted and requires your attention.\r\n Please review the details below:

\r\n\r\n
\r\n
Request Details
\r\n
\r\n\r\n

ID: bcb34404327a41fa8592ff5aefbc72f1

\r\n

\r\n Submitted By:\r\n Paul Lloyd\r\n

\r\n

Date: 2024-09-23 09:30:57

\r\n

Status:

\r\n PENDING\r\n
\r\n

Changes:\r\n UserCodeStatusChange\r\n

\r\n\r\n

Use:
\r\n \r\n request = client.api.services.request.get_by_uid(uid=sy.UID(\"bcb34404327a41fa8592ff5aefbc72f1\"))\r\n
\r\n to get this specific request.\r\n

\r\n\r\n

Or you can view all requests with:
\r\n \r\n client.requests\r\n \r\n

\r\n\r\n
\r\n
\r\n

If you did not expect this request or have concerns about it,\r\n please contact our support team immediately.

\r\n
\r\n
\r\n This is an automated message, please do not reply directly to this email.
\r\n For assistance, please contact our support team.\r\n
\r\n
\r\n \r\n \r\n--===============6536215668630059171==--\r\n"}, {"email_from": "noreply@openmined.org", "email_to": ["admin@bigquery.org"], "email_content": "Content-Type: multipart/alternative; boundary=\"===============0725079058935243976==\"\r\nMIME-Version: 1.0\r\nFrom: noreply@openmined.org\r\nTo: admin@bigquery.org\r\nSubject: Datasite bigquery-high-migrations: A New Request (df0f) has been received!\r\n\r\n--===============0725079058935243976==\r\nContent-Type: text/html; charset=\"us-ascii\"\r\nMIME-Version: 1.0\r\nContent-Transfer-Encoding: 7bit\r\n\r\n\r\n \r\n Access Request Notification\r\n \r\n \r\n \r\n
\r\n
\r\n Request Notification\r\n
\r\n
\r\n

Hello,

\r\n

A new request has been submitted and requires your attention.\r\n Please review the details below:

\r\n\r\n
\r\n
Request Details
\r\n
\r\n\r\n

ID: df0f392826c04242bbb07c9be6a0db05

\r\n

\r\n Submitted By:\r\n John Garrett\r\n

\r\n

Date: 2024-09-23 09:31:06

\r\n

Status:

\r\n PENDING\r\n
\r\n

Changes:\r\n UserCodeStatusChange\r\n

\r\n\r\n

Use:
\r\n \r\n request = client.api.services.request.get_by_uid(uid=sy.UID(\"df0f392826c04242bbb07c9be6a0db05\"))\r\n
\r\n to get this specific request.\r\n

\r\n\r\n

Or you can view all requests with:
\r\n \r\n client.requests\r\n \r\n

\r\n\r\n
\r\n
\r\n

If you did not expect this request or have concerns about it,\r\n please contact our support team immediately.

\r\n
\r\n
\r\n This is an automated message, please do not reply directly to this email.
\r\n For assistance, please contact our support team.\r\n
\r\n
\r\n \r\n \r\n--===============0725079058935243976==--\r\n"}, {"email_from": "noreply@openmined.org", "email_to": ["admin@bigquery.org"], "email_content": "Content-Type: multipart/alternative; boundary=\"===============1992657613805266198==\"\r\nMIME-Version: 1.0\r\nFrom: noreply@openmined.org\r\nTo: admin@bigquery.org\r\nSubject: Datasite bigquery-high-migrations: A New Request (5614) has been received!\r\n\r\n--===============1992657613805266198==\r\nContent-Type: text/html; charset=\"us-ascii\"\r\nMIME-Version: 1.0\r\nContent-Transfer-Encoding: 7bit\r\n\r\n\r\n \r\n Access Request Notification\r\n \r\n \r\n \r\n
\r\n
\r\n Request Notification\r\n
\r\n
\r\n

Hello,

\r\n

A new request has been submitted and requires your attention.\r\n Please review the details below:

\r\n\r\n
\r\n
Request Details
\r\n
\r\n\r\n

ID: 5614eb0d753942cc8205bb7d784e8896

\r\n

\r\n Submitted By:\r\n Anthony Escobar\r\n

\r\n

Date: 2024-09-23 09:31:16

\r\n

Status:

\r\n PENDING\r\n
\r\n

Changes:\r\n UserCodeStatusChange\r\n

\r\n\r\n

Use:
\r\n \r\n request = client.api.services.request.get_by_uid(uid=sy.UID(\"5614eb0d753942cc8205bb7d784e8896\"))\r\n
\r\n to get this specific request.\r\n

\r\n\r\n

Or you can view all requests with:
\r\n \r\n client.requests\r\n \r\n

\r\n\r\n
\r\n
\r\n

If you did not expect this request or have concerns about it,\r\n please contact our support team immediately.

\r\n
\r\n
\r\n This is an automated message, please do not reply directly to this email.
\r\n For assistance, please contact our support team.\r\n
\r\n
\r\n \r\n \r\n--===============1992657613805266198==--\r\n"}, {"email_from": "noreply@openmined.org", "email_to": ["admin@bigquery.org"], "email_content": "Content-Type: multipart/alternative; boundary=\"===============9005484778227806339==\"\r\nMIME-Version: 1.0\r\nFrom: noreply@openmined.org\r\nTo: admin@bigquery.org\r\nSubject: Datasite bigquery-high-migrations: A New Request (e4c6) has been received!\r\n\r\n--===============9005484778227806339==\r\nContent-Type: text/html; charset=\"us-ascii\"\r\nMIME-Version: 1.0\r\nContent-Transfer-Encoding: 7bit\r\n\r\n\r\n \r\n Access Request Notification\r\n \r\n \r\n \r\n
\r\n
\r\n Request Notification\r\n
\r\n
\r\n

Hello,

\r\n

A new request has been submitted and requires your attention.\r\n Please review the details below:

\r\n\r\n
\r\n
Request Details
\r\n
\r\n\r\n

ID: e4c6e9b1009b42a0b65c86738c4c2e09

\r\n

\r\n Submitted By:\r\n William Thompson\r\n

\r\n

Date: 2024-09-23 09:31:25

\r\n

Status:

\r\n PENDING\r\n
\r\n

Changes:\r\n UserCodeStatusChange\r\n

\r\n\r\n

Use:
\r\n \r\n request = client.api.services.request.get_by_uid(uid=sy.UID(\"e4c6e9b1009b42a0b65c86738c4c2e09\"))\r\n
\r\n to get this specific request.\r\n

\r\n\r\n

Or you can view all requests with:
\r\n \r\n client.requests\r\n \r\n

\r\n\r\n
\r\n
\r\n

If you did not expect this request or have concerns about it,\r\n please contact our support team immediately.

\r\n
\r\n
\r\n This is an automated message, please do not reply directly to this email.
\r\n For assistance, please contact our support team.\r\n
\r\n
\r\n \r\n \r\n--===============9005484778227806339==--\r\n"}, {"email_from": "noreply@openmined.org", "email_to": ["admin@bigquery.org"], "email_content": "Content-Type: multipart/alternative; boundary=\"===============5503698571725917494==\"\r\nMIME-Version: 1.0\r\nFrom: noreply@openmined.org\r\nTo: admin@bigquery.org\r\nSubject: Datasite bigquery-high-migrations: A New Request (ea2b) has been received!\r\n\r\n--===============5503698571725917494==\r\nContent-Type: text/html; charset=\"us-ascii\"\r\nMIME-Version: 1.0\r\nContent-Transfer-Encoding: 7bit\r\n\r\n\r\n \r\n Access Request Notification\r\n \r\n \r\n \r\n
\r\n
\r\n Request Notification\r\n
\r\n
\r\n

Hello,

\r\n

A new request has been submitted and requires your attention.\r\n Please review the details below:

\r\n\r\n
\r\n
Request Details
\r\n
\r\n\r\n

ID: ea2b120ac5fc44b496fad22448813338

\r\n

\r\n Submitted By:\r\n Eric Hahn\r\n

\r\n

Date: 2024-09-23 09:31:35

\r\n

Status:

\r\n PENDING\r\n
\r\n

Changes:\r\n UserCodeStatusChange\r\n

\r\n\r\n

Use:
\r\n \r\n request = client.api.services.request.get_by_uid(uid=sy.UID(\"ea2b120ac5fc44b496fad22448813338\"))\r\n
\r\n to get this specific request.\r\n

\r\n\r\n

Or you can view all requests with:
\r\n \r\n client.requests\r\n \r\n

\r\n\r\n
\r\n
\r\n

If you did not expect this request or have concerns about it,\r\n please contact our support team immediately.

\r\n
\r\n
\r\n This is an automated message, please do not reply directly to this email.
\r\n For assistance, please contact our support team.\r\n
\r\n
\r\n \r\n \r\n--===============5503698571725917494==--\r\n"}, {"email_from": "noreply@openmined.org", "email_to": ["admin@bigquery.org"], "email_content": "Content-Type: multipart/alternative; boundary=\"===============3095197698625258186==\"\r\nMIME-Version: 1.0\r\nFrom: noreply@openmined.org\r\nTo: admin@bigquery.org\r\nSubject: Datasite bigquery-high-migrations: A New Request (ee9c) has been received!\r\n\r\n--===============3095197698625258186==\r\nContent-Type: text/html; charset=\"us-ascii\"\r\nMIME-Version: 1.0\r\nContent-Transfer-Encoding: 7bit\r\n\r\n\r\n \r\n Access Request Notification\r\n \r\n \r\n \r\n
\r\n
\r\n Request Notification\r\n
\r\n
\r\n

Hello,

\r\n

A new request has been submitted and requires your attention.\r\n Please review the details below:

\r\n\r\n
\r\n
Request Details
\r\n
\r\n\r\n

ID: ee9c2f4e3a7d401caedaa9bb216ce272

\r\n

\r\n Submitted By:\r\n Paul Lloyd\r\n

\r\n

Date: 2024-09-23 09:31:44

\r\n

Status:

\r\n PENDING\r\n
\r\n

Changes:\r\n UserCodeStatusChange\r\n

\r\n\r\n

Use:
\r\n \r\n request = client.api.services.request.get_by_uid(uid=sy.UID(\"ee9c2f4e3a7d401caedaa9bb216ce272\"))\r\n
\r\n to get this specific request.\r\n

\r\n\r\n

Or you can view all requests with:
\r\n \r\n client.requests\r\n \r\n

\r\n\r\n
\r\n
\r\n

If you did not expect this request or have concerns about it,\r\n please contact our support team immediately.

\r\n
\r\n
\r\n This is an automated message, please do not reply directly to this email.
\r\n For assistance, please contact our support team.\r\n
\r\n
\r\n \r\n \r\n--===============3095197698625258186==--\r\n"}, {"email_from": "noreply@openmined.org", "email_to": ["admin@bigquery.org"], "email_content": "Content-Type: multipart/alternative; boundary=\"===============3085645257172386883==\"\r\nMIME-Version: 1.0\r\nFrom: noreply@openmined.org\r\nTo: admin@bigquery.org\r\nSubject: Datasite bigquery-high-migrations: A New Request (7400) has been received!\r\n\r\n--===============3085645257172386883==\r\nContent-Type: text/html; charset=\"us-ascii\"\r\nMIME-Version: 1.0\r\nContent-Transfer-Encoding: 7bit\r\n\r\n\r\n \r\n Access Request Notification\r\n \r\n \r\n \r\n
\r\n
\r\n Request Notification\r\n
\r\n
\r\n

Hello,

\r\n

A new request has been submitted and requires your attention.\r\n Please review the details below:

\r\n\r\n
\r\n
Request Details
\r\n
\r\n\r\n

ID: 74006c5a15c54d6d96c7a5fa4adce03e

\r\n

\r\n Submitted By:\r\n John Garrett\r\n

\r\n

Date: 2024-09-23 09:31:53

\r\n

Status:

\r\n PENDING\r\n
\r\n

Changes:\r\n UserCodeStatusChange\r\n

\r\n\r\n

Use:
\r\n \r\n request = client.api.services.request.get_by_uid(uid=sy.UID(\"74006c5a15c54d6d96c7a5fa4adce03e\"))\r\n
\r\n to get this specific request.\r\n

\r\n\r\n

Or you can view all requests with:
\r\n \r\n client.requests\r\n \r\n

\r\n\r\n
\r\n
\r\n

If you did not expect this request or have concerns about it,\r\n please contact our support team immediately.

\r\n
\r\n
\r\n This is an automated message, please do not reply directly to this email.
\r\n For assistance, please contact our support team.\r\n
\r\n
\r\n \r\n \r\n--===============3085645257172386883==--\r\n"}], "eric-hahn-fake@openmined.org": [{"email_from": "noreply@openmined.org", "email_to": ["eric-hahn-fake@openmined.org"], "email_content": "Content-Type: multipart/alternative; boundary=\"===============0087264072714649521==\"\r\nMIME-Version: 1.0\r\nFrom: noreply@openmined.org\r\nTo: eric-hahn-fake@openmined.org\r\nSubject: Datasite bigquery-high-migrations: Your request (1eb3) has been approved. \r\n\r\n--===============0087264072714649521==\r\nContent-Type: text/html; charset=\"us-ascii\"\r\nMIME-Version: 1.0\r\nContent-Transfer-Encoding: 7bit\r\n\r\n\r\n \r\n Access Request Notification\r\n \r\n \r\n \r\n
\r\n
\r\n Request Notification\r\n
\r\n
\r\n

Hello,

\r\n

The status of your recent request has been updated.\r\n Below is the latest information regarding it:

\r\n\r\n
\r\n
Request Details
\r\n
\r\n\r\n

ID: 1eb3b8a2579a4b8db00b2de5e10de974

\r\n

\r\n Submitted By:\r\n Eric Hahn eric-hahn-fake@openmined.org\r\n

\r\n

Date: 2024-09-23 09:30:48

\r\n

Status:

\r\n APPROVED\r\n
\r\n

\r\n Changes:\r\n UserCodeStatusChange\r\n

\r\n\r\n

Use:
\r\n \r\n request = client.api.services.request.get_by_uid(uid=sy.UID(\"1eb3b8a2579a4b8db00b2de5e10de974\"))\r\n
\r\n to get this specific request.\r\n

\r\n\r\n

Or you can view all requests with:
\r\n \r\n client.requests\r\n \r\n

\r\n
\r\n
\r\n

If you did not expect this request or have concerns about it,\r\n please contact our support team immediately.

\r\n
\r\n
\r\n This is an automated message, please do not reply directly to this email.
\r\n For assistance, please contact our support team.\r\n
\r\n
\r\n \r\n \r\n--===============0087264072714649521==--\r\n"}, {"email_from": "noreply@openmined.org", "email_to": ["eric-hahn-fake@openmined.org"], "email_content": "Content-Type: multipart/alternative; boundary=\"===============4616762255463387364==\"\r\nMIME-Version: 1.0\r\nFrom: noreply@openmined.org\r\nTo: eric-hahn-fake@openmined.org\r\nSubject: Datasite bigquery-high-migrations: Your request (ea2b) has been denied. \r\n\r\n--===============4616762255463387364==\r\nContent-Type: text/html; charset=\"us-ascii\"\r\nMIME-Version: 1.0\r\nContent-Transfer-Encoding: 7bit\r\n\r\n\r\n \r\n Access Request Notification\r\n \r\n \r\n \r\n
\r\n
\r\n Request Notification\r\n
\r\n
\r\n

Hello,

\r\n

The status of your recent request has been updated.\r\n Below is the latest information regarding it:

\r\n\r\n
\r\n
Request Details
\r\n
\r\n\r\n

ID: ea2b120ac5fc44b496fad22448813338

\r\n

\r\n Submitted By:\r\n Eric Hahn eric-hahn-fake@openmined.org\r\n

\r\n

Date: 2024-09-23 09:31:35

\r\n

Status:

\r\n REJECTED\r\n
\r\n

\r\n Changes:\r\n UserCodeStatusChange\r\n

\r\n\r\n

Use:
\r\n \r\n request = client.api.services.request.get_by_uid(uid=sy.UID(\"ea2b120ac5fc44b496fad22448813338\"))\r\n
\r\n to get this specific request.\r\n

\r\n\r\n

Or you can view all requests with:
\r\n \r\n client.requests\r\n \r\n

\r\n
\r\n
\r\n

If you did not expect this request or have concerns about it,\r\n please contact our support team immediately.

\r\n
\r\n
\r\n This is an automated message, please do not reply directly to this email.
\r\n For assistance, please contact our support team.\r\n
\r\n
\r\n \r\n \r\n--===============4616762255463387364==--\r\n"}], "paul-lloyd-fake@openmined.org": [{"email_from": "noreply@openmined.org", "email_to": ["paul-lloyd-fake@openmined.org"], "email_content": "Content-Type: multipart/alternative; boundary=\"===============7536925844563160043==\"\r\nMIME-Version: 1.0\r\nFrom: noreply@openmined.org\r\nTo: paul-lloyd-fake@openmined.org\r\nSubject: Datasite bigquery-high-migrations: Your request (bcb3) has been approved. \r\n\r\n--===============7536925844563160043==\r\nContent-Type: text/html; charset=\"us-ascii\"\r\nMIME-Version: 1.0\r\nContent-Transfer-Encoding: 7bit\r\n\r\n\r\n \r\n Access Request Notification\r\n \r\n \r\n \r\n
\r\n
\r\n Request Notification\r\n
\r\n
\r\n

Hello,

\r\n

The status of your recent request has been updated.\r\n Below is the latest information regarding it:

\r\n\r\n
\r\n
Request Details
\r\n
\r\n\r\n

ID: bcb34404327a41fa8592ff5aefbc72f1

\r\n

\r\n Submitted By:\r\n Paul Lloyd paul-lloyd-fake@openmined.org\r\n

\r\n

Date: 2024-09-23 09:30:57

\r\n

Status:

\r\n APPROVED\r\n
\r\n

\r\n Changes:\r\n UserCodeStatusChange\r\n

\r\n\r\n

Use:
\r\n \r\n request = client.api.services.request.get_by_uid(uid=sy.UID(\"bcb34404327a41fa8592ff5aefbc72f1\"))\r\n
\r\n to get this specific request.\r\n

\r\n\r\n

Or you can view all requests with:
\r\n \r\n client.requests\r\n \r\n

\r\n
\r\n
\r\n

If you did not expect this request or have concerns about it,\r\n please contact our support team immediately.

\r\n
\r\n
\r\n This is an automated message, please do not reply directly to this email.
\r\n For assistance, please contact our support team.\r\n
\r\n
\r\n \r\n \r\n--===============7536925844563160043==--\r\n"}, {"email_from": "noreply@openmined.org", "email_to": ["paul-lloyd-fake@openmined.org"], "email_content": "Content-Type: multipart/alternative; boundary=\"===============0033828269783680003==\"\r\nMIME-Version: 1.0\r\nFrom: noreply@openmined.org\r\nTo: paul-lloyd-fake@openmined.org\r\nSubject: Datasite bigquery-high-migrations: Your request (ee9c) has been denied. \r\n\r\n--===============0033828269783680003==\r\nContent-Type: text/html; charset=\"us-ascii\"\r\nMIME-Version: 1.0\r\nContent-Transfer-Encoding: 7bit\r\n\r\n\r\n \r\n Access Request Notification\r\n \r\n \r\n \r\n
\r\n
\r\n Request Notification\r\n
\r\n
\r\n

Hello,

\r\n

The status of your recent request has been updated.\r\n Below is the latest information regarding it:

\r\n\r\n
\r\n
Request Details
\r\n
\r\n\r\n

ID: ee9c2f4e3a7d401caedaa9bb216ce272

\r\n

\r\n Submitted By:\r\n Paul Lloyd paul-lloyd-fake@openmined.org\r\n

\r\n

Date: 2024-09-23 09:31:44

\r\n

Status:

\r\n REJECTED\r\n
\r\n

\r\n Changes:\r\n UserCodeStatusChange\r\n

\r\n\r\n

Use:
\r\n \r\n request = client.api.services.request.get_by_uid(uid=sy.UID(\"ee9c2f4e3a7d401caedaa9bb216ce272\"))\r\n
\r\n to get this specific request.\r\n

\r\n\r\n

Or you can view all requests with:
\r\n \r\n client.requests\r\n \r\n

\r\n
\r\n
\r\n

If you did not expect this request or have concerns about it,\r\n please contact our support team immediately.

\r\n
\r\n
\r\n This is an automated message, please do not reply directly to this email.
\r\n For assistance, please contact our support team.\r\n
\r\n
\r\n \r\n \r\n--===============0033828269783680003==--\r\n"}], "john-garrett-fake@openmined.org": [{"email_from": "noreply@openmined.org", "email_to": ["john-garrett-fake@openmined.org"], "email_content": "Content-Type: multipart/alternative; boundary=\"===============2667553230066125737==\"\r\nMIME-Version: 1.0\r\nFrom: noreply@openmined.org\r\nTo: john-garrett-fake@openmined.org\r\nSubject: Datasite bigquery-high-migrations: Your request (df0f) has been approved. \r\n\r\n--===============2667553230066125737==\r\nContent-Type: text/html; charset=\"us-ascii\"\r\nMIME-Version: 1.0\r\nContent-Transfer-Encoding: 7bit\r\n\r\n\r\n \r\n Access Request Notification\r\n \r\n \r\n \r\n
\r\n
\r\n Request Notification\r\n
\r\n
\r\n

Hello,

\r\n

The status of your recent request has been updated.\r\n Below is the latest information regarding it:

\r\n\r\n
\r\n
Request Details
\r\n
\r\n\r\n

ID: df0f392826c04242bbb07c9be6a0db05

\r\n

\r\n Submitted By:\r\n John Garrett john-garrett-fake@openmined.org\r\n

\r\n

Date: 2024-09-23 09:31:06

\r\n

Status:

\r\n APPROVED\r\n
\r\n

\r\n Changes:\r\n UserCodeStatusChange\r\n

\r\n\r\n

Use:
\r\n \r\n request = client.api.services.request.get_by_uid(uid=sy.UID(\"df0f392826c04242bbb07c9be6a0db05\"))\r\n
\r\n to get this specific request.\r\n

\r\n\r\n

Or you can view all requests with:
\r\n \r\n client.requests\r\n \r\n

\r\n
\r\n
\r\n

If you did not expect this request or have concerns about it,\r\n please contact our support team immediately.

\r\n
\r\n
\r\n This is an automated message, please do not reply directly to this email.
\r\n For assistance, please contact our support team.\r\n
\r\n
\r\n \r\n \r\n--===============2667553230066125737==--\r\n"}, {"email_from": "noreply@openmined.org", "email_to": ["john-garrett-fake@openmined.org"], "email_content": "Content-Type: multipart/alternative; boundary=\"===============6802697036125412429==\"\r\nMIME-Version: 1.0\r\nFrom: noreply@openmined.org\r\nTo: john-garrett-fake@openmined.org\r\nSubject: Datasite bigquery-high-migrations: Your request (df0f) has been approved. \r\n\r\n--===============6802697036125412429==\r\nContent-Type: text/html; charset=\"us-ascii\"\r\nMIME-Version: 1.0\r\nContent-Transfer-Encoding: 7bit\r\n\r\n\r\n \r\n Access Request Notification\r\n \r\n \r\n \r\n
\r\n
\r\n Request Notification\r\n
\r\n
\r\n

Hello,

\r\n

The status of your recent request has been updated.\r\n Below is the latest information regarding it:

\r\n\r\n
\r\n
Request Details
\r\n
\r\n\r\n

ID: df0f392826c04242bbb07c9be6a0db05

\r\n

\r\n Submitted By:\r\n John Garrett john-garrett-fake@openmined.org\r\n

\r\n

Date: 2024-09-23 09:31:06

\r\n

Status:

\r\n APPROVED\r\n
\r\n

\r\n Changes:\r\n UserCodeStatusChange,ActionStoreChange\r\n

\r\n\r\n

Use:
\r\n \r\n request = client.api.services.request.get_by_uid(uid=sy.UID(\"df0f392826c04242bbb07c9be6a0db05\"))\r\n
\r\n to get this specific request.\r\n

\r\n\r\n

Or you can view all requests with:
\r\n \r\n client.requests\r\n \r\n

\r\n
\r\n
\r\n

If you did not expect this request or have concerns about it,\r\n please contact our support team immediately.

\r\n
\r\n
\r\n This is an automated message, please do not reply directly to this email.
\r\n For assistance, please contact our support team.\r\n
\r\n
\r\n \r\n \r\n--===============6802697036125412429==--\r\n"}, {"email_from": "noreply@openmined.org", "email_to": ["john-garrett-fake@openmined.org"], "email_content": "Content-Type: multipart/alternative; boundary=\"===============6669303170158844316==\"\r\nMIME-Version: 1.0\r\nFrom: noreply@openmined.org\r\nTo: john-garrett-fake@openmined.org\r\nSubject: Datasite bigquery-high-migrations: Your request (7400) has been approved. \r\n\r\n--===============6669303170158844316==\r\nContent-Type: text/html; charset=\"us-ascii\"\r\nMIME-Version: 1.0\r\nContent-Transfer-Encoding: 7bit\r\n\r\n\r\n \r\n Access Request Notification\r\n \r\n \r\n \r\n
\r\n
\r\n Request Notification\r\n
\r\n
\r\n

Hello,

\r\n

The status of your recent request has been updated.\r\n Below is the latest information regarding it:

\r\n\r\n
\r\n
Request Details
\r\n
\r\n\r\n

ID: 74006c5a15c54d6d96c7a5fa4adce03e

\r\n

\r\n Submitted By:\r\n John Garrett john-garrett-fake@openmined.org\r\n

\r\n

Date: 2024-09-23 09:31:53

\r\n

Status:

\r\n APPROVED\r\n
\r\n

\r\n Changes:\r\n UserCodeStatusChange\r\n

\r\n\r\n

Use:
\r\n \r\n request = client.api.services.request.get_by_uid(uid=sy.UID(\"74006c5a15c54d6d96c7a5fa4adce03e\"))\r\n
\r\n to get this specific request.\r\n

\r\n\r\n

Or you can view all requests with:
\r\n \r\n client.requests\r\n \r\n

\r\n
\r\n
\r\n

If you did not expect this request or have concerns about it,\r\n please contact our support team immediately.

\r\n
\r\n
\r\n This is an automated message, please do not reply directly to this email.
\r\n For assistance, please contact our support team.\r\n
\r\n
\r\n \r\n \r\n--===============6669303170158844316==--\r\n"}], "anthony-escobar-fake@openmined.org": [{"email_from": "noreply@openmined.org", "email_to": ["anthony-escobar-fake@openmined.org"], "email_content": "Content-Type: multipart/alternative; boundary=\"===============1253022428436437486==\"\r\nMIME-Version: 1.0\r\nFrom: noreply@openmined.org\r\nTo: anthony-escobar-fake@openmined.org\r\nSubject: Datasite bigquery-high-migrations: Your request (5614) has been approved. \r\n\r\n--===============1253022428436437486==\r\nContent-Type: text/html; charset=\"us-ascii\"\r\nMIME-Version: 1.0\r\nContent-Transfer-Encoding: 7bit\r\n\r\n\r\n \r\n Access Request Notification\r\n \r\n \r\n \r\n
\r\n
\r\n Request Notification\r\n
\r\n
\r\n

Hello,

\r\n

The status of your recent request has been updated.\r\n Below is the latest information regarding it:

\r\n\r\n
\r\n
Request Details
\r\n
\r\n\r\n

ID: 5614eb0d753942cc8205bb7d784e8896

\r\n

\r\n Submitted By:\r\n Anthony Escobar anthony-escobar-fake@openmined.org\r\n

\r\n

Date: 2024-09-23 09:31:16

\r\n

Status:

\r\n APPROVED\r\n
\r\n

\r\n Changes:\r\n UserCodeStatusChange\r\n

\r\n\r\n

Use:
\r\n \r\n request = client.api.services.request.get_by_uid(uid=sy.UID(\"5614eb0d753942cc8205bb7d784e8896\"))\r\n
\r\n to get this specific request.\r\n

\r\n\r\n

Or you can view all requests with:
\r\n \r\n client.requests\r\n \r\n

\r\n
\r\n
\r\n

If you did not expect this request or have concerns about it,\r\n please contact our support team immediately.

\r\n
\r\n
\r\n This is an automated message, please do not reply directly to this email.
\r\n For assistance, please contact our support team.\r\n
\r\n
\r\n \r\n \r\n--===============1253022428436437486==--\r\n"}]} \ No newline at end of file +{ + "admin@bigquery.org": [ + { + "email_from": "noreply@openmined.org", + "email_to": ["admin@bigquery.org"], + "email_content": "Content-Type: multipart/alternative; boundary=\"===============7117641952261823257==\"\r\nMIME-Version: 1.0\r\nFrom: noreply@openmined.org\r\nTo: admin@bigquery.org\r\nSubject: Datasite bigquery-high-migrations: A New Request (8e12) has been received!\r\n\r\n--===============7117641952261823257==\r\nContent-Type: text/html; charset=\"us-ascii\"\r\nMIME-Version: 1.0\r\nContent-Transfer-Encoding: 7bit\r\n\r\n\r\n \r\n Access Request Notification\r\n \r\n \r\n \r\n
\r\n
\r\n Request Notification\r\n
\r\n
\r\n

Hello,

\r\n

A new request has been submitted and requires your attention.\r\n Please review the details below:

\r\n\r\n
\r\n
Request Details
\r\n
\r\n\r\n

ID: 8e12c9ac5c5547b1afe5b5a1d5e24900

\r\n

\r\n Submitted By:\r\n William Thompson\r\n

\r\n

Date: 2024-09-23 09:30:38

\r\n

Status:

\r\n PENDING\r\n
\r\n

Changes:\r\n UserCodeStatusChange\r\n

\r\n\r\n

Use:
\r\n \r\n request = client.api.services.request.get_by_uid(uid=sy.UID(\"8e12c9ac5c5547b1afe5b5a1d5e24900\"))\r\n
\r\n to get this specific request.\r\n

\r\n\r\n

Or you can view all requests with:
\r\n \r\n client.requests\r\n \r\n

\r\n\r\n
\r\n
\r\n

If you did not expect this request or have concerns about it,\r\n please contact our support team immediately.

\r\n
\r\n
\r\n This is an automated message, please do not reply directly to this email.
\r\n For assistance, please contact our support team.\r\n
\r\n
\r\n \r\n \r\n--===============7117641952261823257==--\r\n" + }, + { + "email_from": "noreply@openmined.org", + "email_to": ["admin@bigquery.org"], + "email_content": "Content-Type: multipart/alternative; boundary=\"===============3685701994337601608==\"\r\nMIME-Version: 1.0\r\nFrom: noreply@openmined.org\r\nTo: admin@bigquery.org\r\nSubject: Datasite bigquery-high-migrations: A New Request (1eb3) has been received!\r\n\r\n--===============3685701994337601608==\r\nContent-Type: text/html; charset=\"us-ascii\"\r\nMIME-Version: 1.0\r\nContent-Transfer-Encoding: 7bit\r\n\r\n\r\n \r\n Access Request Notification\r\n \r\n \r\n \r\n
\r\n
\r\n Request Notification\r\n
\r\n
\r\n

Hello,

\r\n

A new request has been submitted and requires your attention.\r\n Please review the details below:

\r\n\r\n
\r\n
Request Details
\r\n
\r\n\r\n

ID: 1eb3b8a2579a4b8db00b2de5e10de974

\r\n

\r\n Submitted By:\r\n Eric Hahn\r\n

\r\n

Date: 2024-09-23 09:30:48

\r\n

Status:

\r\n PENDING\r\n
\r\n

Changes:\r\n UserCodeStatusChange\r\n

\r\n\r\n

Use:
\r\n \r\n request = client.api.services.request.get_by_uid(uid=sy.UID(\"1eb3b8a2579a4b8db00b2de5e10de974\"))\r\n
\r\n to get this specific request.\r\n

\r\n\r\n

Or you can view all requests with:
\r\n \r\n client.requests\r\n \r\n

\r\n\r\n
\r\n
\r\n

If you did not expect this request or have concerns about it,\r\n please contact our support team immediately.

\r\n
\r\n
\r\n This is an automated message, please do not reply directly to this email.
\r\n For assistance, please contact our support team.\r\n
\r\n
\r\n \r\n \r\n--===============3685701994337601608==--\r\n" + }, + { + "email_from": "noreply@openmined.org", + "email_to": ["admin@bigquery.org"], + "email_content": "Content-Type: multipart/alternative; boundary=\"===============6536215668630059171==\"\r\nMIME-Version: 1.0\r\nFrom: noreply@openmined.org\r\nTo: admin@bigquery.org\r\nSubject: Datasite bigquery-high-migrations: A New Request (bcb3) has been received!\r\n\r\n--===============6536215668630059171==\r\nContent-Type: text/html; charset=\"us-ascii\"\r\nMIME-Version: 1.0\r\nContent-Transfer-Encoding: 7bit\r\n\r\n\r\n \r\n Access Request Notification\r\n \r\n \r\n \r\n
\r\n
\r\n Request Notification\r\n
\r\n
\r\n

Hello,

\r\n

A new request has been submitted and requires your attention.\r\n Please review the details below:

\r\n\r\n
\r\n
Request Details
\r\n
\r\n\r\n

ID: bcb34404327a41fa8592ff5aefbc72f1

\r\n

\r\n Submitted By:\r\n Paul Lloyd\r\n

\r\n

Date: 2024-09-23 09:30:57

\r\n

Status:

\r\n PENDING\r\n
\r\n

Changes:\r\n UserCodeStatusChange\r\n

\r\n\r\n

Use:
\r\n \r\n request = client.api.services.request.get_by_uid(uid=sy.UID(\"bcb34404327a41fa8592ff5aefbc72f1\"))\r\n
\r\n to get this specific request.\r\n

\r\n\r\n

Or you can view all requests with:
\r\n \r\n client.requests\r\n \r\n

\r\n\r\n
\r\n
\r\n

If you did not expect this request or have concerns about it,\r\n please contact our support team immediately.

\r\n
\r\n
\r\n This is an automated message, please do not reply directly to this email.
\r\n For assistance, please contact our support team.\r\n
\r\n
\r\n \r\n \r\n--===============6536215668630059171==--\r\n" + }, + { + "email_from": "noreply@openmined.org", + "email_to": ["admin@bigquery.org"], + "email_content": "Content-Type: multipart/alternative; boundary=\"===============0725079058935243976==\"\r\nMIME-Version: 1.0\r\nFrom: noreply@openmined.org\r\nTo: admin@bigquery.org\r\nSubject: Datasite bigquery-high-migrations: A New Request (df0f) has been received!\r\n\r\n--===============0725079058935243976==\r\nContent-Type: text/html; charset=\"us-ascii\"\r\nMIME-Version: 1.0\r\nContent-Transfer-Encoding: 7bit\r\n\r\n\r\n \r\n Access Request Notification\r\n \r\n \r\n \r\n
\r\n
\r\n Request Notification\r\n
\r\n
\r\n

Hello,

\r\n

A new request has been submitted and requires your attention.\r\n Please review the details below:

\r\n\r\n
\r\n
Request Details
\r\n
\r\n\r\n

ID: df0f392826c04242bbb07c9be6a0db05

\r\n

\r\n Submitted By:\r\n John Garrett\r\n

\r\n

Date: 2024-09-23 09:31:06

\r\n

Status:

\r\n PENDING\r\n
\r\n

Changes:\r\n UserCodeStatusChange\r\n

\r\n\r\n

Use:
\r\n \r\n request = client.api.services.request.get_by_uid(uid=sy.UID(\"df0f392826c04242bbb07c9be6a0db05\"))\r\n
\r\n to get this specific request.\r\n

\r\n\r\n

Or you can view all requests with:
\r\n \r\n client.requests\r\n \r\n

\r\n\r\n
\r\n
\r\n

If you did not expect this request or have concerns about it,\r\n please contact our support team immediately.

\r\n
\r\n
\r\n This is an automated message, please do not reply directly to this email.
\r\n For assistance, please contact our support team.\r\n
\r\n
\r\n \r\n \r\n--===============0725079058935243976==--\r\n" + }, + { + "email_from": "noreply@openmined.org", + "email_to": ["admin@bigquery.org"], + "email_content": "Content-Type: multipart/alternative; boundary=\"===============1992657613805266198==\"\r\nMIME-Version: 1.0\r\nFrom: noreply@openmined.org\r\nTo: admin@bigquery.org\r\nSubject: Datasite bigquery-high-migrations: A New Request (5614) has been received!\r\n\r\n--===============1992657613805266198==\r\nContent-Type: text/html; charset=\"us-ascii\"\r\nMIME-Version: 1.0\r\nContent-Transfer-Encoding: 7bit\r\n\r\n\r\n \r\n Access Request Notification\r\n \r\n \r\n \r\n
\r\n
\r\n Request Notification\r\n
\r\n
\r\n

Hello,

\r\n

A new request has been submitted and requires your attention.\r\n Please review the details below:

\r\n\r\n
\r\n
Request Details
\r\n
\r\n\r\n

ID: 5614eb0d753942cc8205bb7d784e8896

\r\n

\r\n Submitted By:\r\n Anthony Escobar\r\n

\r\n

Date: 2024-09-23 09:31:16

\r\n

Status:

\r\n PENDING\r\n
\r\n

Changes:\r\n UserCodeStatusChange\r\n

\r\n\r\n

Use:
\r\n \r\n request = client.api.services.request.get_by_uid(uid=sy.UID(\"5614eb0d753942cc8205bb7d784e8896\"))\r\n
\r\n to get this specific request.\r\n

\r\n\r\n

Or you can view all requests with:
\r\n \r\n client.requests\r\n \r\n

\r\n\r\n
\r\n
\r\n

If you did not expect this request or have concerns about it,\r\n please contact our support team immediately.

\r\n
\r\n
\r\n This is an automated message, please do not reply directly to this email.
\r\n For assistance, please contact our support team.\r\n
\r\n
\r\n \r\n \r\n--===============1992657613805266198==--\r\n" + }, + { + "email_from": "noreply@openmined.org", + "email_to": ["admin@bigquery.org"], + "email_content": "Content-Type: multipart/alternative; boundary=\"===============9005484778227806339==\"\r\nMIME-Version: 1.0\r\nFrom: noreply@openmined.org\r\nTo: admin@bigquery.org\r\nSubject: Datasite bigquery-high-migrations: A New Request (e4c6) has been received!\r\n\r\n--===============9005484778227806339==\r\nContent-Type: text/html; charset=\"us-ascii\"\r\nMIME-Version: 1.0\r\nContent-Transfer-Encoding: 7bit\r\n\r\n\r\n \r\n Access Request Notification\r\n \r\n \r\n \r\n
\r\n
\r\n Request Notification\r\n
\r\n
\r\n

Hello,

\r\n

A new request has been submitted and requires your attention.\r\n Please review the details below:

\r\n\r\n
\r\n
Request Details
\r\n
\r\n\r\n

ID: e4c6e9b1009b42a0b65c86738c4c2e09

\r\n

\r\n Submitted By:\r\n William Thompson\r\n

\r\n

Date: 2024-09-23 09:31:25

\r\n

Status:

\r\n PENDING\r\n
\r\n

Changes:\r\n UserCodeStatusChange\r\n

\r\n\r\n

Use:
\r\n \r\n request = client.api.services.request.get_by_uid(uid=sy.UID(\"e4c6e9b1009b42a0b65c86738c4c2e09\"))\r\n
\r\n to get this specific request.\r\n

\r\n\r\n

Or you can view all requests with:
\r\n \r\n client.requests\r\n \r\n

\r\n\r\n
\r\n
\r\n

If you did not expect this request or have concerns about it,\r\n please contact our support team immediately.

\r\n
\r\n
\r\n This is an automated message, please do not reply directly to this email.
\r\n For assistance, please contact our support team.\r\n
\r\n
\r\n \r\n \r\n--===============9005484778227806339==--\r\n" + }, + { + "email_from": "noreply@openmined.org", + "email_to": ["admin@bigquery.org"], + "email_content": "Content-Type: multipart/alternative; boundary=\"===============5503698571725917494==\"\r\nMIME-Version: 1.0\r\nFrom: noreply@openmined.org\r\nTo: admin@bigquery.org\r\nSubject: Datasite bigquery-high-migrations: A New Request (ea2b) has been received!\r\n\r\n--===============5503698571725917494==\r\nContent-Type: text/html; charset=\"us-ascii\"\r\nMIME-Version: 1.0\r\nContent-Transfer-Encoding: 7bit\r\n\r\n\r\n \r\n Access Request Notification\r\n \r\n \r\n \r\n
\r\n
\r\n Request Notification\r\n
\r\n
\r\n

Hello,

\r\n

A new request has been submitted and requires your attention.\r\n Please review the details below:

\r\n\r\n
\r\n
Request Details
\r\n
\r\n\r\n

ID: ea2b120ac5fc44b496fad22448813338

\r\n

\r\n Submitted By:\r\n Eric Hahn\r\n

\r\n

Date: 2024-09-23 09:31:35

\r\n

Status:

\r\n PENDING\r\n
\r\n

Changes:\r\n UserCodeStatusChange\r\n

\r\n\r\n

Use:
\r\n \r\n request = client.api.services.request.get_by_uid(uid=sy.UID(\"ea2b120ac5fc44b496fad22448813338\"))\r\n
\r\n to get this specific request.\r\n

\r\n\r\n

Or you can view all requests with:
\r\n \r\n client.requests\r\n \r\n

\r\n\r\n
\r\n
\r\n

If you did not expect this request or have concerns about it,\r\n please contact our support team immediately.

\r\n
\r\n
\r\n This is an automated message, please do not reply directly to this email.
\r\n For assistance, please contact our support team.\r\n
\r\n
\r\n \r\n \r\n--===============5503698571725917494==--\r\n" + }, + { + "email_from": "noreply@openmined.org", + "email_to": ["admin@bigquery.org"], + "email_content": "Content-Type: multipart/alternative; boundary=\"===============3095197698625258186==\"\r\nMIME-Version: 1.0\r\nFrom: noreply@openmined.org\r\nTo: admin@bigquery.org\r\nSubject: Datasite bigquery-high-migrations: A New Request (ee9c) has been received!\r\n\r\n--===============3095197698625258186==\r\nContent-Type: text/html; charset=\"us-ascii\"\r\nMIME-Version: 1.0\r\nContent-Transfer-Encoding: 7bit\r\n\r\n\r\n \r\n Access Request Notification\r\n \r\n \r\n \r\n
\r\n
\r\n Request Notification\r\n
\r\n
\r\n

Hello,

\r\n

A new request has been submitted and requires your attention.\r\n Please review the details below:

\r\n\r\n
\r\n
Request Details
\r\n
\r\n\r\n

ID: ee9c2f4e3a7d401caedaa9bb216ce272

\r\n

\r\n Submitted By:\r\n Paul Lloyd\r\n

\r\n

Date: 2024-09-23 09:31:44

\r\n

Status:

\r\n PENDING\r\n
\r\n

Changes:\r\n UserCodeStatusChange\r\n

\r\n\r\n

Use:
\r\n \r\n request = client.api.services.request.get_by_uid(uid=sy.UID(\"ee9c2f4e3a7d401caedaa9bb216ce272\"))\r\n
\r\n to get this specific request.\r\n

\r\n\r\n

Or you can view all requests with:
\r\n \r\n client.requests\r\n \r\n

\r\n\r\n
\r\n
\r\n

If you did not expect this request or have concerns about it,\r\n please contact our support team immediately.

\r\n
\r\n
\r\n This is an automated message, please do not reply directly to this email.
\r\n For assistance, please contact our support team.\r\n
\r\n
\r\n \r\n \r\n--===============3095197698625258186==--\r\n" + }, + { + "email_from": "noreply@openmined.org", + "email_to": ["admin@bigquery.org"], + "email_content": "Content-Type: multipart/alternative; boundary=\"===============3085645257172386883==\"\r\nMIME-Version: 1.0\r\nFrom: noreply@openmined.org\r\nTo: admin@bigquery.org\r\nSubject: Datasite bigquery-high-migrations: A New Request (7400) has been received!\r\n\r\n--===============3085645257172386883==\r\nContent-Type: text/html; charset=\"us-ascii\"\r\nMIME-Version: 1.0\r\nContent-Transfer-Encoding: 7bit\r\n\r\n\r\n \r\n Access Request Notification\r\n \r\n \r\n \r\n
\r\n
\r\n Request Notification\r\n
\r\n
\r\n

Hello,

\r\n

A new request has been submitted and requires your attention.\r\n Please review the details below:

\r\n\r\n
\r\n
Request Details
\r\n
\r\n\r\n

ID: 74006c5a15c54d6d96c7a5fa4adce03e

\r\n

\r\n Submitted By:\r\n John Garrett\r\n

\r\n

Date: 2024-09-23 09:31:53

\r\n

Status:

\r\n PENDING\r\n
\r\n

Changes:\r\n UserCodeStatusChange\r\n

\r\n\r\n

Use:
\r\n \r\n request = client.api.services.request.get_by_uid(uid=sy.UID(\"74006c5a15c54d6d96c7a5fa4adce03e\"))\r\n
\r\n to get this specific request.\r\n

\r\n\r\n

Or you can view all requests with:
\r\n \r\n client.requests\r\n \r\n

\r\n\r\n
\r\n
\r\n

If you did not expect this request or have concerns about it,\r\n please contact our support team immediately.

\r\n
\r\n
\r\n This is an automated message, please do not reply directly to this email.
\r\n For assistance, please contact our support team.\r\n
\r\n
\r\n \r\n \r\n--===============3085645257172386883==--\r\n" + } + ], + "eric-hahn-fake@openmined.org": [ + { + "email_from": "noreply@openmined.org", + "email_to": ["eric-hahn-fake@openmined.org"], + "email_content": "Content-Type: multipart/alternative; boundary=\"===============0087264072714649521==\"\r\nMIME-Version: 1.0\r\nFrom: noreply@openmined.org\r\nTo: eric-hahn-fake@openmined.org\r\nSubject: Datasite bigquery-high-migrations: Your request (1eb3) has been approved. \r\n\r\n--===============0087264072714649521==\r\nContent-Type: text/html; charset=\"us-ascii\"\r\nMIME-Version: 1.0\r\nContent-Transfer-Encoding: 7bit\r\n\r\n\r\n \r\n Access Request Notification\r\n \r\n \r\n \r\n
\r\n
\r\n Request Notification\r\n
\r\n
\r\n

Hello,

\r\n

The status of your recent request has been updated.\r\n Below is the latest information regarding it:

\r\n\r\n
\r\n
Request Details
\r\n
\r\n\r\n

ID: 1eb3b8a2579a4b8db00b2de5e10de974

\r\n

\r\n Submitted By:\r\n Eric Hahn eric-hahn-fake@openmined.org\r\n

\r\n

Date: 2024-09-23 09:30:48

\r\n

Status:

\r\n APPROVED\r\n
\r\n

\r\n Changes:\r\n UserCodeStatusChange\r\n

\r\n\r\n

Use:
\r\n \r\n request = client.api.services.request.get_by_uid(uid=sy.UID(\"1eb3b8a2579a4b8db00b2de5e10de974\"))\r\n
\r\n to get this specific request.\r\n

\r\n\r\n

Or you can view all requests with:
\r\n \r\n client.requests\r\n \r\n

\r\n
\r\n
\r\n

If you did not expect this request or have concerns about it,\r\n please contact our support team immediately.

\r\n
\r\n
\r\n This is an automated message, please do not reply directly to this email.
\r\n For assistance, please contact our support team.\r\n
\r\n
\r\n \r\n \r\n--===============0087264072714649521==--\r\n" + }, + { + "email_from": "noreply@openmined.org", + "email_to": ["eric-hahn-fake@openmined.org"], + "email_content": "Content-Type: multipart/alternative; boundary=\"===============4616762255463387364==\"\r\nMIME-Version: 1.0\r\nFrom: noreply@openmined.org\r\nTo: eric-hahn-fake@openmined.org\r\nSubject: Datasite bigquery-high-migrations: Your request (ea2b) has been denied. \r\n\r\n--===============4616762255463387364==\r\nContent-Type: text/html; charset=\"us-ascii\"\r\nMIME-Version: 1.0\r\nContent-Transfer-Encoding: 7bit\r\n\r\n\r\n \r\n Access Request Notification\r\n \r\n \r\n \r\n
\r\n
\r\n Request Notification\r\n
\r\n
\r\n

Hello,

\r\n

The status of your recent request has been updated.\r\n Below is the latest information regarding it:

\r\n\r\n
\r\n
Request Details
\r\n
\r\n\r\n

ID: ea2b120ac5fc44b496fad22448813338

\r\n

\r\n Submitted By:\r\n Eric Hahn eric-hahn-fake@openmined.org\r\n

\r\n

Date: 2024-09-23 09:31:35

\r\n

Status:

\r\n REJECTED\r\n
\r\n

\r\n Changes:\r\n UserCodeStatusChange\r\n

\r\n\r\n

Use:
\r\n \r\n request = client.api.services.request.get_by_uid(uid=sy.UID(\"ea2b120ac5fc44b496fad22448813338\"))\r\n
\r\n to get this specific request.\r\n

\r\n\r\n

Or you can view all requests with:
\r\n \r\n client.requests\r\n \r\n

\r\n
\r\n
\r\n

If you did not expect this request or have concerns about it,\r\n please contact our support team immediately.

\r\n
\r\n
\r\n This is an automated message, please do not reply directly to this email.
\r\n For assistance, please contact our support team.\r\n
\r\n
\r\n \r\n \r\n--===============4616762255463387364==--\r\n" + } + ], + "paul-lloyd-fake@openmined.org": [ + { + "email_from": "noreply@openmined.org", + "email_to": ["paul-lloyd-fake@openmined.org"], + "email_content": "Content-Type: multipart/alternative; boundary=\"===============7536925844563160043==\"\r\nMIME-Version: 1.0\r\nFrom: noreply@openmined.org\r\nTo: paul-lloyd-fake@openmined.org\r\nSubject: Datasite bigquery-high-migrations: Your request (bcb3) has been approved. \r\n\r\n--===============7536925844563160043==\r\nContent-Type: text/html; charset=\"us-ascii\"\r\nMIME-Version: 1.0\r\nContent-Transfer-Encoding: 7bit\r\n\r\n\r\n \r\n Access Request Notification\r\n \r\n \r\n \r\n
\r\n
\r\n Request Notification\r\n
\r\n
\r\n

Hello,

\r\n

The status of your recent request has been updated.\r\n Below is the latest information regarding it:

\r\n\r\n
\r\n
Request Details
\r\n
\r\n\r\n

ID: bcb34404327a41fa8592ff5aefbc72f1

\r\n

\r\n Submitted By:\r\n Paul Lloyd paul-lloyd-fake@openmined.org\r\n

\r\n

Date: 2024-09-23 09:30:57

\r\n

Status:

\r\n APPROVED\r\n
\r\n

\r\n Changes:\r\n UserCodeStatusChange\r\n

\r\n\r\n

Use:
\r\n \r\n request = client.api.services.request.get_by_uid(uid=sy.UID(\"bcb34404327a41fa8592ff5aefbc72f1\"))\r\n
\r\n to get this specific request.\r\n

\r\n\r\n

Or you can view all requests with:
\r\n \r\n client.requests\r\n \r\n

\r\n
\r\n
\r\n

If you did not expect this request or have concerns about it,\r\n please contact our support team immediately.

\r\n
\r\n
\r\n This is an automated message, please do not reply directly to this email.
\r\n For assistance, please contact our support team.\r\n
\r\n
\r\n \r\n \r\n--===============7536925844563160043==--\r\n" + }, + { + "email_from": "noreply@openmined.org", + "email_to": ["paul-lloyd-fake@openmined.org"], + "email_content": "Content-Type: multipart/alternative; boundary=\"===============0033828269783680003==\"\r\nMIME-Version: 1.0\r\nFrom: noreply@openmined.org\r\nTo: paul-lloyd-fake@openmined.org\r\nSubject: Datasite bigquery-high-migrations: Your request (ee9c) has been denied. \r\n\r\n--===============0033828269783680003==\r\nContent-Type: text/html; charset=\"us-ascii\"\r\nMIME-Version: 1.0\r\nContent-Transfer-Encoding: 7bit\r\n\r\n\r\n \r\n Access Request Notification\r\n \r\n \r\n \r\n
\r\n
\r\n Request Notification\r\n
\r\n
\r\n

Hello,

\r\n

The status of your recent request has been updated.\r\n Below is the latest information regarding it:

\r\n\r\n
\r\n
Request Details
\r\n
\r\n\r\n

ID: ee9c2f4e3a7d401caedaa9bb216ce272

\r\n

\r\n Submitted By:\r\n Paul Lloyd paul-lloyd-fake@openmined.org\r\n

\r\n

Date: 2024-09-23 09:31:44

\r\n

Status:

\r\n REJECTED\r\n
\r\n

\r\n Changes:\r\n UserCodeStatusChange\r\n

\r\n\r\n

Use:
\r\n \r\n request = client.api.services.request.get_by_uid(uid=sy.UID(\"ee9c2f4e3a7d401caedaa9bb216ce272\"))\r\n
\r\n to get this specific request.\r\n

\r\n\r\n

Or you can view all requests with:
\r\n \r\n client.requests\r\n \r\n

\r\n
\r\n
\r\n

If you did not expect this request or have concerns about it,\r\n please contact our support team immediately.

\r\n
\r\n
\r\n This is an automated message, please do not reply directly to this email.
\r\n For assistance, please contact our support team.\r\n
\r\n
\r\n \r\n \r\n--===============0033828269783680003==--\r\n" + } + ], + "john-garrett-fake@openmined.org": [ + { + "email_from": "noreply@openmined.org", + "email_to": ["john-garrett-fake@openmined.org"], + "email_content": "Content-Type: multipart/alternative; boundary=\"===============2667553230066125737==\"\r\nMIME-Version: 1.0\r\nFrom: noreply@openmined.org\r\nTo: john-garrett-fake@openmined.org\r\nSubject: Datasite bigquery-high-migrations: Your request (df0f) has been approved. \r\n\r\n--===============2667553230066125737==\r\nContent-Type: text/html; charset=\"us-ascii\"\r\nMIME-Version: 1.0\r\nContent-Transfer-Encoding: 7bit\r\n\r\n\r\n \r\n Access Request Notification\r\n \r\n \r\n \r\n
\r\n
\r\n Request Notification\r\n
\r\n
\r\n

Hello,

\r\n

The status of your recent request has been updated.\r\n Below is the latest information regarding it:

\r\n\r\n
\r\n
Request Details
\r\n
\r\n\r\n

ID: df0f392826c04242bbb07c9be6a0db05

\r\n

\r\n Submitted By:\r\n John Garrett john-garrett-fake@openmined.org\r\n

\r\n

Date: 2024-09-23 09:31:06

\r\n

Status:

\r\n APPROVED\r\n
\r\n

\r\n Changes:\r\n UserCodeStatusChange\r\n

\r\n\r\n

Use:
\r\n \r\n request = client.api.services.request.get_by_uid(uid=sy.UID(\"df0f392826c04242bbb07c9be6a0db05\"))\r\n
\r\n to get this specific request.\r\n

\r\n\r\n

Or you can view all requests with:
\r\n \r\n client.requests\r\n \r\n

\r\n
\r\n
\r\n

If you did not expect this request or have concerns about it,\r\n please contact our support team immediately.

\r\n
\r\n
\r\n This is an automated message, please do not reply directly to this email.
\r\n For assistance, please contact our support team.\r\n
\r\n
\r\n \r\n \r\n--===============2667553230066125737==--\r\n" + }, + { + "email_from": "noreply@openmined.org", + "email_to": ["john-garrett-fake@openmined.org"], + "email_content": "Content-Type: multipart/alternative; boundary=\"===============6802697036125412429==\"\r\nMIME-Version: 1.0\r\nFrom: noreply@openmined.org\r\nTo: john-garrett-fake@openmined.org\r\nSubject: Datasite bigquery-high-migrations: Your request (df0f) has been approved. \r\n\r\n--===============6802697036125412429==\r\nContent-Type: text/html; charset=\"us-ascii\"\r\nMIME-Version: 1.0\r\nContent-Transfer-Encoding: 7bit\r\n\r\n\r\n \r\n Access Request Notification\r\n \r\n \r\n \r\n
\r\n
\r\n Request Notification\r\n
\r\n
\r\n

Hello,

\r\n

The status of your recent request has been updated.\r\n Below is the latest information regarding it:

\r\n\r\n
\r\n
Request Details
\r\n
\r\n\r\n

ID: df0f392826c04242bbb07c9be6a0db05

\r\n

\r\n Submitted By:\r\n John Garrett john-garrett-fake@openmined.org\r\n

\r\n

Date: 2024-09-23 09:31:06

\r\n

Status:

\r\n APPROVED\r\n
\r\n

\r\n Changes:\r\n UserCodeStatusChange,ActionStoreChange\r\n

\r\n\r\n

Use:
\r\n \r\n request = client.api.services.request.get_by_uid(uid=sy.UID(\"df0f392826c04242bbb07c9be6a0db05\"))\r\n
\r\n to get this specific request.\r\n

\r\n\r\n

Or you can view all requests with:
\r\n \r\n client.requests\r\n \r\n

\r\n
\r\n
\r\n

If you did not expect this request or have concerns about it,\r\n please contact our support team immediately.

\r\n
\r\n
\r\n This is an automated message, please do not reply directly to this email.
\r\n For assistance, please contact our support team.\r\n
\r\n
\r\n \r\n \r\n--===============6802697036125412429==--\r\n" + }, + { + "email_from": "noreply@openmined.org", + "email_to": ["john-garrett-fake@openmined.org"], + "email_content": "Content-Type: multipart/alternative; boundary=\"===============6669303170158844316==\"\r\nMIME-Version: 1.0\r\nFrom: noreply@openmined.org\r\nTo: john-garrett-fake@openmined.org\r\nSubject: Datasite bigquery-high-migrations: Your request (7400) has been approved. \r\n\r\n--===============6669303170158844316==\r\nContent-Type: text/html; charset=\"us-ascii\"\r\nMIME-Version: 1.0\r\nContent-Transfer-Encoding: 7bit\r\n\r\n\r\n \r\n Access Request Notification\r\n \r\n \r\n \r\n
\r\n
\r\n Request Notification\r\n
\r\n
\r\n

Hello,

\r\n

The status of your recent request has been updated.\r\n Below is the latest information regarding it:

\r\n\r\n
\r\n
Request Details
\r\n
\r\n\r\n

ID: 74006c5a15c54d6d96c7a5fa4adce03e

\r\n

\r\n Submitted By:\r\n John Garrett john-garrett-fake@openmined.org\r\n

\r\n

Date: 2024-09-23 09:31:53

\r\n

Status:

\r\n APPROVED\r\n
\r\n

\r\n Changes:\r\n UserCodeStatusChange\r\n

\r\n\r\n

Use:
\r\n \r\n request = client.api.services.request.get_by_uid(uid=sy.UID(\"74006c5a15c54d6d96c7a5fa4adce03e\"))\r\n
\r\n to get this specific request.\r\n

\r\n\r\n

Or you can view all requests with:
\r\n \r\n client.requests\r\n \r\n

\r\n
\r\n
\r\n

If you did not expect this request or have concerns about it,\r\n please contact our support team immediately.

\r\n
\r\n
\r\n This is an automated message, please do not reply directly to this email.
\r\n For assistance, please contact our support team.\r\n
\r\n
\r\n \r\n \r\n--===============6669303170158844316==--\r\n" + } + ], + "anthony-escobar-fake@openmined.org": [ + { + "email_from": "noreply@openmined.org", + "email_to": ["anthony-escobar-fake@openmined.org"], + "email_content": "Content-Type: multipart/alternative; boundary=\"===============1253022428436437486==\"\r\nMIME-Version: 1.0\r\nFrom: noreply@openmined.org\r\nTo: anthony-escobar-fake@openmined.org\r\nSubject: Datasite bigquery-high-migrations: Your request (5614) has been approved. \r\n\r\n--===============1253022428436437486==\r\nContent-Type: text/html; charset=\"us-ascii\"\r\nMIME-Version: 1.0\r\nContent-Transfer-Encoding: 7bit\r\n\r\n\r\n \r\n Access Request Notification\r\n \r\n \r\n \r\n
\r\n
\r\n Request Notification\r\n
\r\n
\r\n

Hello,

\r\n

The status of your recent request has been updated.\r\n Below is the latest information regarding it:

\r\n\r\n
\r\n
Request Details
\r\n
\r\n\r\n

ID: 5614eb0d753942cc8205bb7d784e8896

\r\n

\r\n Submitted By:\r\n Anthony Escobar anthony-escobar-fake@openmined.org\r\n

\r\n

Date: 2024-09-23 09:31:16

\r\n

Status:

\r\n APPROVED\r\n
\r\n

\r\n Changes:\r\n UserCodeStatusChange\r\n

\r\n\r\n

Use:
\r\n \r\n request = client.api.services.request.get_by_uid(uid=sy.UID(\"5614eb0d753942cc8205bb7d784e8896\"))\r\n
\r\n to get this specific request.\r\n

\r\n\r\n

Or you can view all requests with:
\r\n \r\n client.requests\r\n \r\n

\r\n
\r\n
\r\n

If you did not expect this request or have concerns about it,\r\n please contact our support team immediately.

\r\n
\r\n
\r\n This is an automated message, please do not reply directly to this email.
\r\n For assistance, please contact our support team.\r\n
\r\n
\r\n \r\n \r\n--===============1253022428436437486==--\r\n" + } + ] +} diff --git a/notebooks/scenarios/bigquery/upgradability/0.9.1_notebooks/jobs.json b/notebooks/scenarios/bigquery/upgradability/0.9.1_notebooks/jobs.json index dba12bf316d..94c3855641d 100644 --- a/notebooks/scenarios/bigquery/upgradability/0.9.1_notebooks/jobs.json +++ b/notebooks/scenarios/bigquery/upgradability/0.9.1_notebooks/jobs.json @@ -1 +1,180 @@ -{"william-thompson-fake@openmined.org": [{"user_email": "william-thompson-fake@openmined.org", "func_name": "simple_query_5aeaf1", "query": "SELECT table_id, AVG(colname) AS average_score\n FROM dataset_1.table_1\n GROUP BY table_id\n LIMIT 108441", "job_type": "simple_query", "settings": {"dataset": "dataset_1", "table": "table_1", "groupby_col": "table_id", "score_col": "colname", "limit": 108441}, "should_succeed": true, "should_submit": true, "code_path": "simple_query_5aeaf1", "admin_reviewed": true, "result_as_expected": true}, {"user_email": "william-thompson-fake@openmined.org", "func_name": "simple_query_e283cd", "query": "SELECT table_id, AVG(colname) AS average_score\n FROM dataset_2.table_2\n GROUP BY table_id\n LIMIT 919780", "job_type": "simple_query", "settings": {"dataset": "dataset_2", "table": "table_2", "groupby_col": "table_id", "score_col": "colname", "limit": 919780}, "should_succeed": true, "should_submit": true, "code_path": "simple_query_e283cd", "admin_reviewed": true, "result_as_expected": true}], "eric-hahn-fake@openmined.org": [{"user_email": "eric-hahn-fake@openmined.org", "func_name": "simple_query_ae1579", "query": "SELECT table_id, AVG(colname) AS average_score\n FROM dataset_2.table_1\n GROUP BY table_id\n LIMIT 429598", "job_type": "simple_query", "settings": {"dataset": "dataset_2", "table": "table_1", "groupby_col": "table_id", "score_col": "colname", "limit": 429598}, "should_succeed": true, "should_submit": true, "code_path": "simple_query_ae1579", "admin_reviewed": true, "result_as_expected": true}, {"user_email": "eric-hahn-fake@openmined.org", "func_name": "wrong_syntax_query_7e9ca8", "query": "SELECT * FROM table INCORRECT SYNTAX", "job_type": "wrong_syntax_query", "settings": {}, "should_succeed": false, "should_submit": true, "code_path": "wrong_syntax_query_7e9ca8", "admin_reviewed": true, "result_as_expected": true}], "paul-lloyd-fake@openmined.org": [{"user_email": "paul-lloyd-fake@openmined.org", "func_name": "simple_query_56749f", "query": "SELECT table_id, AVG(colname) AS average_score\n FROM dataset_1.table_2\n GROUP BY table_id\n LIMIT 117335", "job_type": "simple_query", "settings": {"dataset": "dataset_1", "table": "table_2", "groupby_col": "table_id", "score_col": "colname", "limit": 117335}, "should_succeed": true, "should_submit": true, "code_path": "simple_query_56749f", "admin_reviewed": true, "result_as_expected": true}, {"user_email": "paul-lloyd-fake@openmined.org", "func_name": "job_too_much_text_c8e01e", "query": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", "job_type": "job_too_much_text", "settings": {}, "should_succeed": false, "should_submit": true, "code_path": "job_too_much_text_c8e01e", "admin_reviewed": true, "result_as_expected": true}], "john-garrett-fake@openmined.org": [{"user_email": "john-garrett-fake@openmined.org", "func_name": "simple_query_89f22a", "query": "SELECT table_id, AVG(colname) AS average_score\n FROM dataset_2.table_2\n GROUP BY table_id\n LIMIT 443373", "job_type": "simple_query", "settings": {"dataset": "dataset_2", "table": "table_2", "groupby_col": "table_id", "score_col": "colname", "limit": 443373}, "should_succeed": true, "should_submit": true, "code_path": "simple_query_89f22a", "admin_reviewed": true, "result_as_expected": true}, {"user_email": "john-garrett-fake@openmined.org", "func_name": "job_long_name_c7c6acaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", "query": "SELECT table_id, AVG(colname) AS average_score\n FROM dataset_2.table_1\n GROUP BY table_id\n LIMIT 66724", "job_type": "job_long_name", "settings": {"dataset": "dataset_2", "table": "table_1", "groupby_col": "table_id", "score_col": "colname", "limit": 66724}, "should_succeed": true, "should_submit": true, "code_path": "job_long_name_c7c6acaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", "admin_reviewed": true, "result_as_expected": true}], "anthony-escobar-fake@openmined.org": [{"user_email": "anthony-escobar-fake@openmined.org", "func_name": "simple_query_953d04", "query": "SELECT table_id, AVG(colname) AS average_score\n FROM dataset_2.table_2\n GROUP BY table_id\n LIMIT 442633", "job_type": "simple_query", "settings": {"dataset": "dataset_2", "table": "table_2", "groupby_col": "table_id", "score_col": "colname", "limit": 442633}, "should_succeed": true, "should_submit": true, "code_path": "simple_query_953d04", "admin_reviewed": true, "result_as_expected": true}, {"user_email": "anthony-escobar-fake@openmined.org", "func_name": "job_funcname_xss_2a6679", "query": "SELECT table_id, AVG(colname) AS average_score\n FROM dataset_1.table_2\n GROUP BY table_id\n LIMIT 455945", "job_type": "job_funcname_xss", "settings": {"dataset": "dataset_1", "table": "table_2", "groupby_col": "table_id", "score_col": "colname", "limit": 455945}, "should_succeed": true, "should_submit": false, "code_path": null, "admin_reviewed": false, "result_as_expected": null}]} \ No newline at end of file +{ + "william-thompson-fake@openmined.org": [ + { + "user_email": "william-thompson-fake@openmined.org", + "func_name": "simple_query_5aeaf1", + "query": "SELECT table_id, AVG(colname) AS average_score\n FROM dataset_1.table_1\n GROUP BY table_id\n LIMIT 108441", + "job_type": "simple_query", + "settings": { + "dataset": "dataset_1", + "table": "table_1", + "groupby_col": "table_id", + "score_col": "colname", + "limit": 108441 + }, + "should_succeed": true, + "should_submit": true, + "code_path": "simple_query_5aeaf1", + "admin_reviewed": true, + "result_as_expected": true + }, + { + "user_email": "william-thompson-fake@openmined.org", + "func_name": "simple_query_e283cd", + "query": "SELECT table_id, AVG(colname) AS average_score\n FROM dataset_2.table_2\n GROUP BY table_id\n LIMIT 919780", + "job_type": "simple_query", + "settings": { + "dataset": "dataset_2", + "table": "table_2", + "groupby_col": "table_id", + "score_col": "colname", + "limit": 919780 + }, + "should_succeed": true, + "should_submit": true, + "code_path": "simple_query_e283cd", + "admin_reviewed": true, + "result_as_expected": true + } + ], + "eric-hahn-fake@openmined.org": [ + { + "user_email": "eric-hahn-fake@openmined.org", + "func_name": "simple_query_ae1579", + "query": "SELECT table_id, AVG(colname) AS average_score\n FROM dataset_2.table_1\n GROUP BY table_id\n LIMIT 429598", + "job_type": "simple_query", + "settings": { + "dataset": "dataset_2", + "table": "table_1", + "groupby_col": "table_id", + "score_col": "colname", + "limit": 429598 + }, + "should_succeed": true, + "should_submit": true, + "code_path": "simple_query_ae1579", + "admin_reviewed": true, + "result_as_expected": true + }, + { + "user_email": "eric-hahn-fake@openmined.org", + "func_name": "wrong_syntax_query_7e9ca8", + "query": "SELECT * FROM table INCORRECT SYNTAX", + "job_type": "wrong_syntax_query", + "settings": {}, + "should_succeed": false, + "should_submit": true, + "code_path": "wrong_syntax_query_7e9ca8", + "admin_reviewed": true, + "result_as_expected": true + } + ], + "paul-lloyd-fake@openmined.org": [ + { + "user_email": "paul-lloyd-fake@openmined.org", + "func_name": "simple_query_56749f", + "query": "SELECT table_id, AVG(colname) AS average_score\n FROM dataset_1.table_2\n GROUP BY table_id\n LIMIT 117335", + "job_type": "simple_query", + "settings": { + "dataset": "dataset_1", + "table": "table_2", + "groupby_col": "table_id", + "score_col": "colname", + "limit": 117335 + }, + "should_succeed": true, + "should_submit": true, + "code_path": "simple_query_56749f", + "admin_reviewed": true, + "result_as_expected": true + }, + { + "user_email": "paul-lloyd-fake@openmined.org", + "func_name": "job_too_much_text_c8e01e", + "query": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", + "job_type": "job_too_much_text", + "settings": {}, + "should_succeed": false, + "should_submit": true, + "code_path": "job_too_much_text_c8e01e", + "admin_reviewed": true, + "result_as_expected": true + } + ], + "john-garrett-fake@openmined.org": [ + { + "user_email": "john-garrett-fake@openmined.org", + "func_name": "simple_query_89f22a", + "query": "SELECT table_id, AVG(colname) AS average_score\n FROM dataset_2.table_2\n GROUP BY table_id\n LIMIT 443373", + "job_type": "simple_query", + "settings": { + "dataset": "dataset_2", + "table": "table_2", + "groupby_col": "table_id", + "score_col": "colname", + "limit": 443373 + }, + "should_succeed": true, + "should_submit": true, + "code_path": "simple_query_89f22a", + "admin_reviewed": true, + "result_as_expected": true + }, + { + "user_email": "john-garrett-fake@openmined.org", + "func_name": "job_long_name_c7c6acaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", + "query": "SELECT table_id, AVG(colname) AS average_score\n FROM dataset_2.table_1\n GROUP BY table_id\n LIMIT 66724", + "job_type": "job_long_name", + "settings": { + "dataset": "dataset_2", + "table": "table_1", + "groupby_col": "table_id", + "score_col": "colname", + "limit": 66724 + }, + "should_succeed": true, + "should_submit": true, + "code_path": "job_long_name_c7c6acaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", + "admin_reviewed": true, + "result_as_expected": true + } + ], + "anthony-escobar-fake@openmined.org": [ + { + "user_email": "anthony-escobar-fake@openmined.org", + "func_name": "simple_query_953d04", + "query": "SELECT table_id, AVG(colname) AS average_score\n FROM dataset_2.table_2\n GROUP BY table_id\n LIMIT 442633", + "job_type": "simple_query", + "settings": { + "dataset": "dataset_2", + "table": "table_2", + "groupby_col": "table_id", + "score_col": "colname", + "limit": 442633 + }, + "should_succeed": true, + "should_submit": true, + "code_path": "simple_query_953d04", + "admin_reviewed": true, + "result_as_expected": true + }, + { + "user_email": "anthony-escobar-fake@openmined.org", + "func_name": "job_funcname_xss_2a6679", + "query": "SELECT table_id, AVG(colname) AS average_score\n FROM dataset_1.table_2\n GROUP BY table_id\n LIMIT 455945", + "job_type": "job_funcname_xss", + "settings": { + "dataset": "dataset_1", + "table": "table_2", + "groupby_col": "table_id", + "score_col": "colname", + "limit": 455945 + }, + "should_succeed": true, + "should_submit": false, + "code_path": null, + "admin_reviewed": false, + "result_as_expected": null + } + ] +} diff --git a/notebooks/scenarios/bigquery/upgradability/0.9.1_notebooks/users.json b/notebooks/scenarios/bigquery/upgradability/0.9.1_notebooks/users.json index 6df5380c49f..5585ce77f22 100644 --- a/notebooks/scenarios/bigquery/upgradability/0.9.1_notebooks/users.json +++ b/notebooks/scenarios/bigquery/upgradability/0.9.1_notebooks/users.json @@ -1 +1,52 @@ -[{"name": "William Thompson", "email": "william-thompson-fake@openmined.org", "password": "H&4TFK4nd1", "role": "ServiceRole.DATA_SCIENTIST", "new_password": null, "email_disabled": true, "reset_password": false, "reset_token": null}, {"name": "Eric Hahn", "email": "eric-hahn-fake@openmined.org", "password": "iqeU$Fme@4", "role": "ServiceRole.DATA_SCIENTIST", "new_password": null, "email_disabled": false, "reset_password": true, "reset_token": "2o2tvKn3HVYt"}, {"name": "Paul Lloyd", "email": "paul-lloyd-fake@openmined.org", "password": "O7c9DBMh!b", "role": "ServiceRole.DATA_SCIENTIST", "new_password": null, "email_disabled": false, "reset_password": false, "reset_token": null}, {"name": "John Garrett", "email": "john-garrett-fake@openmined.org", "password": ")pDQ4r%PX8", "role": "ServiceRole.DATA_SCIENTIST", "new_password": null, "email_disabled": false, "reset_password": false, "reset_token": null}, {"name": "Anthony Escobar", "email": "anthony-escobar-fake@openmined.org", "password": "3J6uWe25a%", "role": "ServiceRole.DATA_SCIENTIST", "new_password": null, "email_disabled": false, "reset_password": false, "reset_token": null}] \ No newline at end of file +[ + { + "name": "William Thompson", + "email": "william-thompson-fake@openmined.org", + "password": "H&4TFK4nd1", + "role": "ServiceRole.DATA_SCIENTIST", + "new_password": null, + "email_disabled": true, + "reset_password": false, + "reset_token": null + }, + { + "name": "Eric Hahn", + "email": "eric-hahn-fake@openmined.org", + "password": "iqeU$Fme@4", + "role": "ServiceRole.DATA_SCIENTIST", + "new_password": null, + "email_disabled": false, + "reset_password": true, + "reset_token": "2o2tvKn3HVYt" + }, + { + "name": "Paul Lloyd", + "email": "paul-lloyd-fake@openmined.org", + "password": "O7c9DBMh!b", + "role": "ServiceRole.DATA_SCIENTIST", + "new_password": null, + "email_disabled": false, + "reset_password": false, + "reset_token": null + }, + { + "name": "John Garrett", + "email": "john-garrett-fake@openmined.org", + "password": ")pDQ4r%PX8", + "role": "ServiceRole.DATA_SCIENTIST", + "new_password": null, + "email_disabled": false, + "reset_password": false, + "reset_token": null + }, + { + "name": "Anthony Escobar", + "email": "anthony-escobar-fake@openmined.org", + "password": "3J6uWe25a%", + "role": "ServiceRole.DATA_SCIENTIST", + "new_password": null, + "email_disabled": false, + "reset_password": false, + "reset_token": null + } +] diff --git a/notebooks/scenarios/bigquery/upgradability/1-dump-database-to-file.ipynb b/notebooks/scenarios/bigquery/upgradability/1-dump-database-to-file.ipynb index 1832d969223..53882ce2d7b 100644 --- a/notebooks/scenarios/bigquery/upgradability/1-dump-database-to-file.ipynb +++ b/notebooks/scenarios/bigquery/upgradability/1-dump-database-to-file.ipynb @@ -93,10 +93,7 @@ "outputs": [], "source": [ "# migration_data_dir = Path(os.getenv(\"MIGRATION_DATA_DIR\", \".\"))\n", - "migration_data_dir = Path(\n", - " \"/home/teo/OpenMined/PySyft/notebooks/scenarios/bigquery/upgradability/\"\n", - ")\n", - "\n", + "migration_data_dir = Path(\".\")\n", "migration_data_dir.mkdir(exist_ok=True)\n", "\n", "blob_path = migration_data_dir / \"migration.blob\"\n", diff --git a/notebooks/scenarios/bigquery/upgradability/2-migrate-for-scenarios.ipynb b/notebooks/scenarios/bigquery/upgradability/2-migrate-for-scenarios.ipynb index a51643ab6af..a2981d64b9a 100644 --- a/notebooks/scenarios/bigquery/upgradability/2-migrate-for-scenarios.ipynb +++ b/notebooks/scenarios/bigquery/upgradability/2-migrate-for-scenarios.ipynb @@ -2,7 +2,7 @@ "cells": [ { "cell_type": "code", - "execution_count": 34, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -27,7 +27,7 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -51,7 +51,7 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -62,7 +62,7 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -80,1764 +80,9 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Autoreload enabled\n", - "Starting bigquery-high server on 0.0.0.0:8080\n", - "Found `reset=True` in the launch configuration. Resetting the server...\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "INFO: Will watch for changes in these directories: ['/home/teo/OpenMined/PySyft/packages/syft/src/syft']\n", - "INFO: Uvicorn running on http://0.0.0.0:8080 (Press CTRL+C to quit)\n", - "INFO: Started reloader process [287748] using WatchFiles\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Waiting for server to start..." - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "INFO: Starting server with settings: {'name': 'bigquery-high', 'server_type': , 'server_side_type': , 'deployment_type': , 'processes': 1, 'reset': False, 'dev_mode': True, 'enable_warnings': False, 'in_memory_workers': True, 'queue_port': None, 'create_producer': True, 'n_consumers': 1, 'association_request_auto_approval': False, 'background_tasks': False, 'db_config': None, 'db_url': None} and worker class: \n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "WARN: private key is based on server name: bigquery-high in dev_mode. Don't run this in production.\n", - "Using SQLiteDBConfig and sqlite:////tmp/syft/fbdf5a287e58454cbbd3fac4ad744d37/db/fbdf5a287e58454cbbd3fac4ad744d37_json.db\n", - "Adding producer for queue: api_call on: tcp://localhost:38393\n", - ". Done.\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "INFO: Started server process [287771]\n", - "INFO: Waiting for application startup.\n", - "INFO: Application startup complete.\n" - ] - }, - { - "data": { - "text/html": [ - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "
SyftInfo:
You have launched a development server at http://0.0.0.0:8080. It is intended only for local use.

" - ], - "text/plain": [ - "SyftInfo: You have launched a development server at http://0.0.0.0:8080. It is intended only for local use." - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Logged into as \n" - ] - }, - { - "data": { - "text/html": [ - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "
SyftWarning:
You are using a default password. Please change the password using `[your_client].account.set_password([new_password])`.

" - ], - "text/plain": [ - "SyftWarning: You are using a default password. Please change the password using `[your_client].account.set_password([new_password])`." - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "WARNING: WatchFiles detected changes in '/home/teo/OpenMined/PySyft/packages/syft/src/syft/types/errors.py', '/home/teo/OpenMined/PySyft/packages/syft/src/syft/service/action/action_endpoint.py', '/home/teo/OpenMined/PySyft/packages/syft/src/syft/types/syft_object_registry.py', '/home/teo/OpenMined/PySyft/packages/syft/src/syft/util/notebook_ui/components/tabulator_template.py'. Reloading...\n", - "WARNING: WatchFiles detected changes in '/home/teo/OpenMined/PySyft/packages/syft/src/syft/client/registry.py', '/home/teo/OpenMined/PySyft/packages/syft/src/syft/store/kv_document_store.py', '/home/teo/OpenMined/PySyft/packages/syft/src/syft/service/project/project.py', '/home/teo/OpenMined/PySyft/packages/syft/src/syft/protocol/data_protocol.py', '/home/teo/OpenMined/PySyft/packages/syft/src/syft/service/action/action_service.py', '/home/teo/OpenMined/PySyft/packages/syft/src/syft/store/db/stash.py', '/home/teo/OpenMined/PySyft/packages/syft/src/syft/store/sqlite_document_store.py', '/home/teo/OpenMined/PySyft/packages/syft/src/syft/types/syft_object.py'. Reloading...\n", - "WARNING: WatchFiles detected changes in '/home/teo/OpenMined/PySyft/packages/syft/src/syft/client/registry.py', '0.9.1_notebooks/040-do-review-requestsx29c9d3e.py', '0.9.1_notebooks/050-ds-get-resultsk9vzizb2.py', '2-migrate-for-scenariose7fhqasr.py', '/home/teo/OpenMined/PySyft/packages/syft/src/syft/types/errors.py', '0.9.1_notebooks/020-configure-apim_bn3nb6.py', 'sync/0.9.1_notebooks/02-configure-api-and-syncqwzpf82k.py', '0.9.1_notebooks/021-create-jobsnzkres4r.py', '/home/teo/OpenMined/PySyft/packages/syft/src/syft/store/kv_document_store.py', '/home/teo/OpenMined/PySyft/packages/syft/src/syft/util/notebook_ui/components/tabulator_template.py', 'sync/0.9.1_notebooks/01-setup-high-low-datasites5562yyox.py', '0.9.1_notebooks/010-setup-bigquery-poolrz64jhho.py', 'sync/0.9.1_notebooks/05-ds-get-resultsw317kj_l.py', '/home/teo/OpenMined/PySyft/packages/syft/src/syft/service/project/project.py', 'sync/0.9.1_notebooks/04-do-review-requeststqnp75y8.py', '/home/teo/OpenMined/PySyft/packages/syft/src/syft/protocol/data_protocol.py', '/home/teo/OpenMined/PySyft/packages/syft/src/syft/types/syft_object_registry.py', '0.9.1_notebooks/001-scale-delete-worker-poolst38q2kt1.py', '/home/teo/OpenMined/PySyft/packages/syft/src/syft/service/action/action_service.py', 'sync/0.9.1_notebooks/03-ds-submit-requestb20puuas.py', '0.9.1_notebooks/011-users-emails-passwordsiov_gb82.py', 'sync/1-dump-database-to-fileuet1qpjl.py', '/home/teo/OpenMined/PySyft/packages/syft/src/syft/store/db/stash.py', '/home/teo/OpenMined/PySyft/packages/syft/src/syft/service/action/action_endpoint.py', '1-dump-database-to-filefrg_l5d9.py', 'sync/2-migrate-for-scenarios5y1yq4_e.py', '/home/teo/OpenMined/PySyft/packages/syft/src/syft/store/sqlite_document_store.py', '0.9.1_notebooks/000-start-and-configure-server-and-adminsyx3g3jx7.py', '/home/teo/OpenMined/PySyft/packages/syft/src/syft/types/syft_object.py'. Reloading...\n", - "WARNING: WatchFiles detected changes in '/home/teo/OpenMined/PySyft/packages/syft/src/syft/util/notebook_ui/components/sync.py', '/home/teo/OpenMined/PySyft/packages/syft/src/syft/service/sync/sync_service.py', '/home/teo/OpenMined/PySyft/packages/syft/src/syft/store/mongo_document_store.py', '/home/teo/OpenMined/PySyft/packages/syft/src/syft/service/worker/worker_pool_stash.py', '/home/teo/OpenMined/PySyft/packages/syft/src/syft/store/mongo_client.py', '/home/teo/OpenMined/PySyft/packages/syft/src/syft/service/code/status_service.py', '/home/teo/OpenMined/PySyft/packages/syft/src/syft/service/sync/diff_state.py', '/home/teo/OpenMined/PySyft/packages/syft/src/syft/service/sync/resolve_widget.py', '/home/teo/OpenMined/PySyft/packages/syft/src/syft/__init__.py', '/home/teo/OpenMined/PySyft/packages/syft/src/syft/store/linked_obj.py', '/home/teo/OpenMined/PySyft/packages/syft/src/syft/store/sqlite_document_store.py', '/home/teo/OpenMined/PySyft/packages/syft/src/syft/service/code/user_code.py', '/home/teo/OpenMined/PySyft/packages/syft/src/syft/service/migration/migration_service.py', '/home/teo/OpenMined/PySyft/packages/syft/src/syft/orchestra.py', '/home/teo/OpenMined/PySyft/packages/syft/src/syft/store/db/stash.py', '/home/teo/OpenMined/PySyft/packages/syft/src/syft/store/kv_document_store.py', '/home/teo/OpenMined/PySyft/packages/syft/src/syft/service/worker/worker_pool.py', '/home/teo/OpenMined/PySyft/packages/syft/src/syft/store/document_store_errors.py', '/home/teo/OpenMined/PySyft/packages/syft/src/syft/service/settings/settings_service.py', '/home/teo/OpenMined/PySyft/packages/syft/src/syft/service/worker/worker_image_stash.py', '/home/teo/OpenMined/PySyft/packages/syft/src/syft/server/server.py', '/home/teo/OpenMined/PySyft/packages/syft/src/syft/service/code/user_code_service.py', '/home/teo/OpenMined/PySyft/packages/syft/src/syft/service/request/request.py', '/home/teo/OpenMined/PySyft/packages/syft/src/syft/server/run.py', '/home/teo/OpenMined/PySyft/packages/syft/src/syft/service/context.py', '/home/teo/OpenMined/PySyft/packages/syft/src/syft/service/worker/worker_image.py', '/home/teo/OpenMined/PySyft/packages/syft/src/syft/protocol/data_protocol.py', '/home/teo/OpenMined/PySyft/packages/syft/src/syft/service/worker/worker_stash.py'. Reloading...\n", - "WARNING: WatchFiles detected changes in '/home/teo/OpenMined/PySyft/packages/syft/src/syft/service/action/action_endpoint.py'. Reloading...\n", - "WARNING: WatchFiles detected changes in '/home/teo/OpenMined/PySyft/packages/syft/src/syft/service/worker/worker_image.py', '/home/teo/OpenMined/PySyft/packages/syft/src/syft/types/errors.py', '/home/teo/OpenMined/PySyft/packages/syft/src/syft/protocol/data_protocol.py', '/home/teo/OpenMined/PySyft/packages/syft/src/syft/types/syft_object_registry.py', '/home/teo/OpenMined/PySyft/packages/syft/src/syft/client/registry.py'. Reloading...\n", - "WARNING: WatchFiles detected changes in '0.9.1_notebooks/000-start-and-configure-server-and-admins280hbmp0.py', '0.9.1_notebooks/011-users-emails-passwordse1tregmc.py', '0.9.1_notebooks/021-create-jobsbdmqwdat.py', '0.9.1_notebooks/040-do-review-requestsdcrbzenu.py', '0.9.1_notebooks/020-configure-apijui3250i.py', '2-migrate-for-scenariosqu6z4j1e.py', '0.9.1_notebooks/001-scale-delete-worker-poolswd9pkkpa.py', '/home/teo/OpenMined/PySyft/packages/syft/src/syft/util/notebook_ui/components/tabulator_template.py', '0.9.1_notebooks/050-ds-get-resultspvbmb58c.py', 'sync/1-dump-database-to-fileekyy4odq.py', '/home/teo/OpenMined/PySyft/packages/syft/src/syft/service/project/project.py', '1-dump-database-to-filec6xcv6rl.py', '/home/teo/OpenMined/PySyft/packages/syft/src/syft/service/action/action_service.py', 'sync/0.9.1_notebooks/02-configure-api-and-syncwjgj05wm.py', 'sync/0.9.1_notebooks/03-ds-submit-request14564nt6.py', 'sync/0.9.1_notebooks/05-ds-get-resultsd0nvbcji.py', '/home/teo/OpenMined/PySyft/packages/syft/src/syft/store/db/stash.py', 'sync/2-migrate-for-scenariosictucd15.py', 'sync/0.9.1_notebooks/04-do-review-requests8ba4smzs.py', 'sync/0.9.1_notebooks/01-setup-high-low-datasites90ezli90.py', '/home/teo/OpenMined/PySyft/packages/syft/src/syft/types/syft_object.py', '0.9.1_notebooks/010-setup-bigquery-poolb5v07_83.py'. Reloading...\n", - "WARNING: WatchFiles detected changes in 'sync/0.9.1_notebooks/03-ds-submit-request14564nt6.py', '0.9.1_notebooks/040-do-review-requestsdcrbzenu.py', 'sync/0.9.1_notebooks/02-configure-api-and-syncwjgj05wm.py', '2-migrate-for-scenariosqu6z4j1e.py', '0.9.1_notebooks/000-start-and-configure-server-and-admins280hbmp0.py', 'sync/0.9.1_notebooks/05-ds-get-resultsd0nvbcji.py', '0.9.1_notebooks/001-scale-delete-worker-poolswd9pkkpa.py', '/home/teo/OpenMined/PySyft/packages/syft/src/syft/types/syft_object_registry.py', '/home/teo/OpenMined/PySyft/packages/syft/src/syft/util/notebook_ui/components/tabulator_template.py', '/home/teo/OpenMined/PySyft/packages/syft/src/syft/store/db/stash.py', 'sync/0.9.1_notebooks/01-setup-high-low-datasites90ezli90.py', '0.9.1_notebooks/021-create-jobsbdmqwdat.py', '0.9.1_notebooks/050-ds-get-resultspvbmb58c.py', '/home/teo/OpenMined/PySyft/packages/syft/src/syft/types/syft_object.py', '/home/teo/OpenMined/PySyft/packages/syft/src/syft/service/action/action_service.py', 'sync/1-dump-database-to-fileekyy4odq.py', '0.9.1_notebooks/011-users-emails-passwordse1tregmc.py', '0.9.1_notebooks/010-setup-bigquery-poolb5v07_83.py', '/home/teo/OpenMined/PySyft/packages/syft/src/syft/client/registry.py', '1-dump-database-to-filec6xcv6rl.py', '/home/teo/OpenMined/PySyft/packages/syft/src/syft/service/project/project.py', '/home/teo/OpenMined/PySyft/packages/syft/src/syft/service/action/action_endpoint.py', 'sync/2-migrate-for-scenariosictucd15.py', 'sync/0.9.1_notebooks/04-do-review-requests8ba4smzs.py', '/home/teo/OpenMined/PySyft/packages/syft/src/syft/service/worker/worker_image.py', '/home/teo/OpenMined/PySyft/packages/syft/src/syft/types/errors.py', '/home/teo/OpenMined/PySyft/packages/syft/src/syft/protocol/data_protocol.py', '0.9.1_notebooks/020-configure-apijui3250i.py'. Reloading...\n" - ] - } - ], + "outputs": [], "source": [ "server = sy.orchestra.launch(\n", " name=\"bigquery-high-migrations\",\n", @@ -1854,7 +99,7 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -1867,32 +112,9 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "data": { - "text/markdown": [ - "```python\n", - "class MigrationData:\n", - " id: str = d89ce61345274d72bedd294a5615e9c4\n", - " server_uid: str = fbdf5a287e58454cbbd3fac4ad744d37\n", - " root_verify_key: str = 1e5ec44a179d21e0a0721ea7a670b9875d3946c8604f4623903fcafafe03c8e7\n", - " num_objects: str = 17\n", - " num_action_objects: str = 0\n", - " includes_blobs: str = True\n", - "\n", - "```" - ], - "text/plain": [ - "syft.service.migration.object_migration_state.MigrationData" - ] - }, - "execution_count": 7, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "migration_data" ] @@ -1906,39 +128,21 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "/home/teo/OpenMined/PySyft/notebooks/scenarios/bigquery/upgradability\n" - ] - } - ], + "outputs": [], "source": [ "!pwd" ] }, { "cell_type": "code", - "execution_count": 9, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Loading migration data from /home/teo/OpenMined/PySyft/notebooks/scenarios/bigquery/upgradability/migration.blob\n" - ] - } - ], + "outputs": [], "source": [ "# migration_data_dir = Path(os.getenv(\"MIGRATION_DATA_DIR\", \".\"))\n", - "migration_data_dir = Path(\n", - " \"/home/teo/OpenMined/PySyft/notebooks/scenarios/bigquery/upgradability/\"\n", - ")\n", + "migration_data_dir = Path(\".\")\n", "blob_path = migration_data_dir / \"migration.blob\"\n", "yaml_path = migration_data_dir / \"migration.yaml\"\n", "\n", @@ -1947,888 +151,9 @@ }, { "cell_type": "code", - "execution_count": 10, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "
SyftWarning:
This migration data includes custom workers, which need to be migrated separately with `sy.upgrade_custom_workerpools` after finishing the migration.

" - ], - "text/plain": [ - "SyftWarning: This migration data includes custom workers, which need to be migrated separately with `sy.upgrade_custom_workerpools` after finishing the migration." - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Migrating data for: User table to version 2\n", - "Migrating data for: APIEndpointQueueItem table to version 2\n", - "Migrating data for: ActionQueueItem table to version 2\n", - "Migrating data for: ServerSettings table to version 4\n", - "Migrating data for: UserCode table to version 1\n", - "Migrating data for: SyftLog table to version 1\n", - "Migrating data for: Request table to version 1\n", - "Migrating data for: JobItem table to version 2\n", - "Migrating data for: TwinAPIEndpoint table to version 1\n", - "Migrating data for: NotifierSettings table to version 2\n", - "Migrating data for: Notification table to version 2\n", - "Migrating data for: CodeHistory table to version 1\n", - "Migrating data for: SyftObjectMigrationState table to version 1\n", - "Migrating data for: SyftImageRegistry table to version 1\n", - "Migrating data for: ExecutionOutput table to version 1\n", - "Migrating data for: UserCodeStatusCollection table to version 1\n", - " #e0a9432112f448a7bcba97668f653b7a already exists\n", - " #fbdf5a287e58454cbbd3fac4ad744d37 already exists\n", - " #75fa06708c1c45a2b395bb8c0da0d565 already exists\n", - " #d6303fdddb2a462c936a7a63dbbbe036 already exists\n", - " #16a926460dfb4e7ab9330abfccbf3cd8 already exists\n", - " #b68881d3c39c46bea9454a2f61d67444 already exists\n", - " #ae80caf01b83493ba13f1f9f0c834384 already exists\n", - " #625d9f0693d44b02a68f4f8e05294637 already exists\n", - " #d3569d8f10e14669b41576b18990b20f already exists\n", - " #600301f1a95b4e4586efefc9f5e108bf already exists\n", - " #6e10684e83f6442ba114c60f395f690e already exists\n", - " #3e71410324714497be75762283a8063a already exists\n", - "Migrating data for: AnyActionObject table to version 1\n", - "Migrating data for: PandasDataframeObject table to version 1\n", - "Updating store metadata\n" - ] - } - ], + "outputs": [], "source": [ "res = client.load_migration_data(blob_path)\n", "assert isinstance(res, sy.SyftSuccess), res.message" @@ -2836,4340 +161,18 @@ }, { "cell_type": "code", - "execution_count": 11, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "
SyftSuccess:
Migration completed successfully

" - ], - "text/plain": [ - "SyftSuccess: Migration completed successfully" - ] - }, - "execution_count": 11, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "res" ] }, { "cell_type": "code", - "execution_count": 12, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "This is a utility to upgrade workerpools to the new syft version\n", - "If an upgrade fails, it is always possible to start the workerpool manually\n", - "loading migration data...\n", - "Skipping default pool, this pool has already been upgraded\n", - "\n", - "Upgrading workerpool bigquery-pool\n", - "Found outdated prebuilt worker image `docker.io/openmined/syft-worker-bigquery:local-dev`\n", - "submitting new prebuilt image...\n" - ] - }, - { - "data": { - "text/html": [ - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "
SyftSuccess:
Dockerfile ID: 73e73580a220474185159adbe485d58b successfully submitted.

" - ], - "text/plain": [ - "SyftSuccess: Dockerfile ID: 73e73580a220474185159adbe485d58b successfully submitted." - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "starting new pool `bigquery-pool` with 1 workers\n" - ] - }, - { - "data": { - "text/html": [ - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "
\n", - "\n", - "
\n", - "
\n", - " \n", - "
\n", - "

ContainerSpawnStatus List

\n", - "
\n", - "
\n", - "
\n", - " \n", - "
\n", - "
\n", - "

Total: 0

\n", - "
\n", - "
\n", - "
\n", - "\n", - "\n", - "\n", - "" - ], - "text/plain": [ - "[ContainerSpawnStatus(worker_name='bigquery-pool-1', worker=syft.service.worker.worker_pool.SyftWorker, error=None)]" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\n", - "Upgraded 1 workerpools to the new syft version\n", - "Please verify your upgraded pools with `client.worker_pools`\n" - ] - } - ], + "outputs": [], "source": [ "sy.upgrade_custom_workerpools(client, blob_path, mode=\"auto\")" ] @@ -7183,21 +186,9 @@ }, { "cell_type": "code", - "execution_count": 14, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Logged into as \n", - "Logged into as \n", - "Logged into as \n", - "Logged into as \n", - "Logged into as \n" - ] - } - ], + "outputs": [], "source": [ "users = load_users(client, path=\"0.9.1_notebooks/users.json\")\n", "jobs = load_jobs(users, client, filepath=\"0.9.1_notebooks/jobs.json\")" @@ -7212,7 +203,7 @@ }, { "cell_type": "code", - "execution_count": 15, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -7221,40 +212,16 @@ }, { "cell_type": "code", - "execution_count": 16, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "data": { - "text/markdown": [ - "```python\n", - "class UserView:\n", - " id: str = 647c05a75507467a96ccf6237196fb40\n", - " name: str = \"Jane Doe\"\n", - " email: str = \"admin@bigquery.org\"\n", - " institution: str = \"\"\n", - " website: str = \"\"\n", - " role: str = ServiceRole.ADMIN\n", - " notifications_enabled: str = {: True, : False, : False, : False}\n", - "\n", - "```" - ], - "text/plain": [ - "syft.service.user.user.UserView" - ] - }, - "execution_count": 16, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "server_users[0]" ] }, { "cell_type": "code", - "execution_count": 17, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -7265,7 +232,7 @@ }, { "cell_type": "code", - "execution_count": 18, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -7274,7 +241,7 @@ }, { "cell_type": "code", - "execution_count": 19, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -7290,17 +257,9 @@ }, { "cell_type": "code", - "execution_count": 20, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "len(reviewed_jobs)=9, len(reviewed_jobs_should_succeed)=7, len(reviewed_jobs_should_fail)=2\n" - ] - } - ], + "outputs": [], "source": [ "# submitted_jobs = [job for job in jobs if job.is_submitted]\n", "reviewed_jobs = [job for job in jobs if job.admin_reviewed]\n", @@ -7314,37 +273,9 @@ }, { "cell_type": "code", - "execution_count": 21, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "> Checking job: simple_query simple_query_d1e040 for user arthur-smith-fake@openmined.org\n", - "Using SQLiteDBConfig and sqlite:////tmp/syft/fbdf5a287e58454cbbd3fac4ad744d37/db/fbdf5a287e58454cbbd3fac4ad744d37_json.db\n", - "Using SQLiteDBConfig and sqlite:////tmp/syft/fbdf5a287e58454cbbd3fac4ad744d37/db/fbdf5a287e58454cbbd3fac4ad744d37_json.db\n", - "> Checking job: simple_query simple_query_6aa50c for user arthur-smith-fake@openmined.org\n", - "Using SQLiteDBConfig and sqlite:////tmp/syft/fbdf5a287e58454cbbd3fac4ad744d37/db/fbdf5a287e58454cbbd3fac4ad744d37_json.db\n", - "Using SQLiteDBConfig and sqlite:////tmp/syft/fbdf5a287e58454cbbd3fac4ad744d37/db/fbdf5a287e58454cbbd3fac4ad744d37_json.db\n", - "> Checking job: simple_query simple_query_912a15 for user noah-hinton-fake@openmined.org\n", - "Using SQLiteDBConfig and sqlite:////tmp/syft/fbdf5a287e58454cbbd3fac4ad744d37/db/fbdf5a287e58454cbbd3fac4ad744d37_json.db\n", - "Using SQLiteDBConfig and sqlite:////tmp/syft/fbdf5a287e58454cbbd3fac4ad744d37/db/fbdf5a287e58454cbbd3fac4ad744d37_json.db\n", - "> Checking job: simple_query simple_query_b82bd0 for user samantha-heath-fake@openmined.org\n", - "Using SQLiteDBConfig and sqlite:////tmp/syft/fbdf5a287e58454cbbd3fac4ad744d37/db/fbdf5a287e58454cbbd3fac4ad744d37_json.db\n", - "Using SQLiteDBConfig and sqlite:////tmp/syft/fbdf5a287e58454cbbd3fac4ad744d37/db/fbdf5a287e58454cbbd3fac4ad744d37_json.db\n", - "> Checking job: simple_query simple_query_b81b03 for user eric-morales-fake@openmined.org\n", - "Using SQLiteDBConfig and sqlite:////tmp/syft/fbdf5a287e58454cbbd3fac4ad744d37/db/fbdf5a287e58454cbbd3fac4ad744d37_json.db\n", - "Using SQLiteDBConfig and sqlite:////tmp/syft/fbdf5a287e58454cbbd3fac4ad744d37/db/fbdf5a287e58454cbbd3fac4ad744d37_json.db\n", - "> Checking job: job_long_name job_long_name_19baf0aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa for user eric-morales-fake@openmined.org\n", - "Using SQLiteDBConfig and sqlite:////tmp/syft/fbdf5a287e58454cbbd3fac4ad744d37/db/fbdf5a287e58454cbbd3fac4ad744d37_json.db\n", - "Using SQLiteDBConfig and sqlite:////tmp/syft/fbdf5a287e58454cbbd3fac4ad744d37/db/fbdf5a287e58454cbbd3fac4ad744d37_json.db\n", - "> Checking job: simple_query simple_query_3ba857 for user lisa-guerra-fake@openmined.org\n", - "Using SQLiteDBConfig and sqlite:////tmp/syft/fbdf5a287e58454cbbd3fac4ad744d37/db/fbdf5a287e58454cbbd3fac4ad744d37_json.db\n", - "Using SQLiteDBConfig and sqlite:////tmp/syft/fbdf5a287e58454cbbd3fac4ad744d37/db/fbdf5a287e58454cbbd3fac4ad744d37_json.db\n" - ] - } - ], + "outputs": [], "source": [ "for job in reviewed_jobs_should_succeed:\n", " print(f\"> Checking job: {job.job_type} {job.func_name} for user {job.user_email}\")\n", @@ -7361,22 +292,9 @@ }, { "cell_type": "code", - "execution_count": 22, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "> Checking job: wrong_syntax_query wrong_syntax_query_293ad3 for user noah-hinton-fake@openmined.org\n", - "Using SQLiteDBConfig and sqlite:////tmp/syft/fbdf5a287e58454cbbd3fac4ad744d37/db/fbdf5a287e58454cbbd3fac4ad744d37_json.db\n", - "Using SQLiteDBConfig and sqlite:////tmp/syft/fbdf5a287e58454cbbd3fac4ad744d37/db/fbdf5a287e58454cbbd3fac4ad744d37_json.db\n", - "> Checking job: job_too_much_text job_too_much_text_9b550a for user samantha-heath-fake@openmined.org\n", - "Using SQLiteDBConfig and sqlite:////tmp/syft/fbdf5a287e58454cbbd3fac4ad744d37/db/fbdf5a287e58454cbbd3fac4ad744d37_json.db\n", - "Using SQLiteDBConfig and sqlite:////tmp/syft/fbdf5a287e58454cbbd3fac4ad744d37/db/fbdf5a287e58454cbbd3fac4ad744d37_json.db\n" - ] - } - ], + "outputs": [], "source": [ "for job in reviewed_jobs_should_fail:\n", " print(f\"> Checking job: {job.job_type} {job.func_name} for user {job.user_email}\")\n", @@ -7392,17 +310,9 @@ }, { "cell_type": "code", - "execution_count": 23, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "got expected_jobs: 9 == reviewed_jobs: 9\n" - ] - } - ], + "outputs": [], "source": [ "expected_jobs = [job for job in jobs if job.result_as_expected]\n", "print(f\"got expected_jobs: {len(expected_jobs)} == reviewed_jobs: {len(reviewed_jobs)}\")\n", @@ -7418,7 +328,7 @@ }, { "cell_type": "code", - "execution_count": 24, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -7427,7 +337,7 @@ }, { "cell_type": "code", - "execution_count": 25, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -7436,7 +346,7 @@ }, { "cell_type": "code", - "execution_count": 26, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -7445,36 +355,9 @@ }, { "cell_type": "code", - "execution_count": 27, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Using SQLiteDBConfig and sqlite:////tmp/syft/fbdf5a287e58454cbbd3fac4ad744d37/db/fbdf5a287e58454cbbd3fac4ad744d37_json.db\n", - "Using SQLiteDBConfig and sqlite:////tmp/syft/fbdf5a287e58454cbbd3fac4ad744d37/db/fbdf5a287e58454cbbd3fac4ad744d37_json.db\n", - "SyftSuccess: Syft function 'execute_query' successfully created. To add a code request, please create a project using `project = syft.Project(...)`, then use command `project.create_code_request`.\n" - ] - }, - { - "data": { - "text/markdown": [ - "\n", - "**Pointer**\n", - "\n", - "'Query submitted syft.service.request.request.Request. Use `client.code.simple_query_b0bd25()` to run your query'\n" - ], - "text/plain": [ - "Pointer:\n", - "'Query submitted syft.service.request.request.Request. Use `client.code.simple_query_b0bd25()` to run your query'" - ] - }, - "execution_count": 27, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "response = ds_client.api.services.bigquery.submit_query(\n", " func_name=job.func_name, query=job.query\n", @@ -7484,7 +367,7 @@ }, { "cell_type": "code", - "execution_count": 28, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -7493,17 +376,9 @@ }, { "cell_type": "code", - "execution_count": 29, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Approving request on change simple_query_b0bd25 for datasite bigquery-high\n" - ] - } - ], + "outputs": [], "source": [ "for request in client.requests:\n", " if request.code.service_func_name == job.func_name:\n", @@ -7512,7 +387,7 @@ }, { "cell_type": "code", - "execution_count": 30, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -7521,42 +396,16 @@ }, { "cell_type": "code", - "execution_count": 31, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Using SQLiteDBConfig and sqlite:////tmp/syft/fbdf5a287e58454cbbd3fac4ad744d37/db/fbdf5a287e58454cbbd3fac4ad744d37_json.db\n", - "Using SQLiteDBConfig and sqlite:////tmp/syft/fbdf5a287e58454cbbd3fac4ad744d37/db/fbdf5a287e58454cbbd3fac4ad744d37_json.db\n" - ] - }, - { - "data": { - "text/markdown": [ - "\n", - "**Pointer**\n", - "\n", - "None\n" - ], - "text/plain": [ - "Pointer:\n", - "None" - ] - }, - "execution_count": 31, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "job_res.wait()" ] }, { "cell_type": "code", - "execution_count": 32, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -7568,7 +417,7 @@ }, { "cell_type": "code", - "execution_count": 35, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -7577,36 +426,9 @@ }, { "cell_type": "code", - "execution_count": 36, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Using SQLiteDBConfig and sqlite:////tmp/syft/fbdf5a287e58454cbbd3fac4ad744d37/db/fbdf5a287e58454cbbd3fac4ad744d37_json.db\n", - "Using SQLiteDBConfig and sqlite:////tmp/syft/fbdf5a287e58454cbbd3fac4ad744d37/db/fbdf5a287e58454cbbd3fac4ad744d37_json.db\n", - "SyftSuccess: Syft function 'execute_query' successfully created. To add a code request, please create a project using `project = syft.Project(...)`, then use command `project.create_code_request`.\n" - ] - }, - { - "data": { - "text/markdown": [ - "\n", - "**Pointer**\n", - "\n", - "'Query submitted syft.service.request.request.Request. Use `client.code.wrong_syntax_query_9c9dcc()` to run your query'\n" - ], - "text/plain": [ - "Pointer:\n", - "'Query submitted syft.service.request.request.Request. Use `client.code.wrong_syntax_query_9c9dcc()` to run your query'" - ] - }, - "execution_count": 36, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "response = ds_client.api.services.bigquery.submit_query(\n", " func_name=wrong_syntax_job.func_name, query=wrong_syntax_job.query\n", @@ -7616,7 +438,7 @@ }, { "cell_type": "code", - "execution_count": 37, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -7625,17 +447,9 @@ }, { "cell_type": "code", - "execution_count": 38, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Approving request on change wrong_syntax_query_9c9dcc for datasite bigquery-high\n" - ] - } - ], + "outputs": [], "source": [ "for request in client.requests:\n", " if request.code.service_func_name == wrong_syntax_job.func_name:\n", @@ -7644,403 +458,18 @@ }, { "cell_type": "code", - "execution_count": 43, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Using SQLiteDBConfig and sqlite:////tmp/syft/fbdf5a287e58454cbbd3fac4ad744d37/db/fbdf5a287e58454cbbd3fac4ad744d37_json.db\n" - ] - } - ], + "outputs": [], "source": [ "job_res = getattr(ds_client.code, wrong_syntax_job.func_name)(blocking=False)" ] }, { "cell_type": "code", - "execution_count": 46, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "INFO: Shutting down\n", - "INFO: Waiting for application shutdown.\n", - "INFO: Application shutdown complete.\n", - "INFO: Finished server process [287771]\n", - "INFO: Starting server with settings: {'name': 'bigquery-high', 'server_type': , 'server_side_type': , 'deployment_type': , 'processes': 1, 'reset': False, 'dev_mode': True, 'enable_warnings': False, 'in_memory_workers': True, 'queue_port': None, 'create_producer': True, 'n_consumers': 1, 'association_request_auto_approval': False, 'background_tasks': False, 'db_config': None, 'db_url': None} and worker class: \n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "WARN: private key is based on server name: bigquery-high in dev_mode. Don't run this in production.\n", - "Using SQLiteDBConfig and sqlite:////tmp/syft/fbdf5a287e58454cbbd3fac4ad744d37/db/fbdf5a287e58454cbbd3fac4ad744d37_json.db\n", - "Adding producer for queue: api_call on: tcp://localhost:48405\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "INFO: Started server process [325237]\n", - "INFO: Waiting for application startup.\n", - "INFO: Application startup complete.\n", - "INFO: Starting server with settings: {'name': 'bigquery-high', 'server_type': , 'server_side_type': , 'deployment_type': , 'processes': 1, 'reset': False, 'dev_mode': True, 'enable_warnings': False, 'in_memory_workers': True, 'queue_port': None, 'create_producer': True, 'n_consumers': 1, 'association_request_auto_approval': False, 'background_tasks': False, 'db_config': None, 'db_url': None} and worker class: \n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "WARN: private key is based on server name: bigquery-high in dev_mode. Don't run this in production.\n", - "Using SQLiteDBConfig and sqlite:////tmp/syft/fbdf5a287e58454cbbd3fac4ad744d37/db/fbdf5a287e58454cbbd3fac4ad744d37_json.db\n", - "Adding producer for queue: api_call on: tcp://localhost:39827\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "INFO: Started server process [326064]\n", - "INFO: Waiting for application startup.\n", - "INFO: Application startup complete.\n", - "INFO: Starting server with settings: {'name': 'bigquery-high', 'server_type': , 'server_side_type': , 'deployment_type': , 'processes': 1, 'reset': False, 'dev_mode': True, 'enable_warnings': False, 'in_memory_workers': True, 'queue_port': None, 'create_producer': True, 'n_consumers': 1, 'association_request_auto_approval': False, 'background_tasks': False, 'db_config': None, 'db_url': None} and worker class: \n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "WARN: private key is based on server name: bigquery-high in dev_mode. Don't run this in production.\n", - "Using SQLiteDBConfig and sqlite:////tmp/syft/fbdf5a287e58454cbbd3fac4ad744d37/db/fbdf5a287e58454cbbd3fac4ad744d37_json.db\n", - "Adding producer for queue: api_call on: tcp://localhost:50343\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "INFO: Started server process [326193]\n", - "INFO: Waiting for application startup.\n", - "INFO: Application startup complete.\n", - "INFO: Shutting down\n", - "INFO: Waiting for application shutdown.\n", - "INFO: Application shutdown complete.\n", - "INFO: Finished server process [326193]\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "WARN: private key is based on server name: bigquery-high in dev_mode. Don't run this in production.\n", - "Using SQLiteDBConfig and sqlite:////tmp/syft/fbdf5a287e58454cbbd3fac4ad744d37/db/fbdf5a287e58454cbbd3fac4ad744d37_json.db\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "INFO: Starting server with settings: {'name': 'bigquery-high', 'server_type': , 'server_side_type': , 'deployment_type': , 'processes': 1, 'reset': False, 'dev_mode': True, 'enable_warnings': False, 'in_memory_workers': True, 'queue_port': None, 'create_producer': True, 'n_consumers': 1, 'association_request_auto_approval': False, 'background_tasks': False, 'db_config': None, 'db_url': None} and worker class: \n", - "Process SpawnProcess-1:5:\n", - "Traceback (most recent call last):\n", - " File \"/home/teo/anaconda3/envs/syft_3.12/lib/python3.12/multiprocessing/process.py\", line 314, in _bootstrap\n", - " self.run()\n", - " File \"/home/teo/anaconda3/envs/syft_3.12/lib/python3.12/multiprocessing/process.py\", line 108, in run\n", - " self._target(*self._args, **self._kwargs)\n", - " File \"/home/teo/anaconda3/envs/syft_3.12/lib/python3.12/site-packages/uvicorn/_subprocess.py\", line 80, in subprocess_started\n", - " target(sockets=sockets)\n", - " File \"/home/teo/anaconda3/envs/syft_3.12/lib/python3.12/site-packages/uvicorn/server.py\", line 65, in run\n", - " return asyncio.run(self.serve(sockets=sockets))\n", - " ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n", - " File \"/home/teo/anaconda3/envs/syft_3.12/lib/python3.12/asyncio/runners.py\", line 194, in run\n", - " return runner.run(main)\n", - " ^^^^^^^^^^^^^^^^\n", - " File \"/home/teo/anaconda3/envs/syft_3.12/lib/python3.12/asyncio/runners.py\", line 118, in run\n", - " return self._loop.run_until_complete(task)\n", - " ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n", - " File \"uvloop/loop.pyx\", line 1517, in uvloop.loop.Loop.run_until_complete\n", - " File \"/home/teo/anaconda3/envs/syft_3.12/lib/python3.12/site-packages/uvicorn/server.py\", line 69, in serve\n", - " await self._serve(sockets)\n", - " File \"/home/teo/anaconda3/envs/syft_3.12/lib/python3.12/site-packages/uvicorn/server.py\", line 76, in _serve\n", - " config.load()\n", - " File \"/home/teo/anaconda3/envs/syft_3.12/lib/python3.12/site-packages/uvicorn/config.py\", line 440, in load\n", - " self.loaded_app = self.loaded_app()\n", - " ^^^^^^^^^^^^^^^^^\n", - " File \"/home/teo/OpenMined/PySyft/packages/syft/src/syft/server/uvicorn.py\", line 111, in app_factory\n", - " worker = worker_class.named(**kwargs)\n", - " ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n", - " File \"/home/teo/OpenMined/PySyft/packages/syft/src/syft/server/server.py\", line 728, in named\n", - " return cls(\n", - " ^^^^\n", - " File \"/home/teo/OpenMined/PySyft/packages/syft/src/syft/server/server.py\", line 431, in __init__\n", - " self.post_init()\n", - " File \"/home/teo/OpenMined/PySyft/packages/syft/src/syft/server/server.py\", line 863, in post_init\n", - " self.services.user_code.load_user_code(context=context)\n", - " File \"/home/teo/OpenMined/PySyft/packages/syft/src/syft/types/result.py\", line 113, in wrapper\n", - " output = func(*args, **kwargs)\n", - " ^^^^^^^^^^^^^^^^^^^^^\n", - " File \"/home/teo/OpenMined/PySyft/packages/syft/src/syft/service/code/user_code_service.py\", line 338, in load_user_code\n", - " load_approved_policy_code(user_code_items=user_code_items, context=context)\n", - " File \"/home/teo/OpenMined/PySyft/packages/syft/src/syft/service/code/user_code.py\", line 2085, in load_approved_policy_code\n", - " status = user_code.get_status(context).unwrap()\n", - " ^^^^^^^^^^^^^^^^^^^^\n", - " File \"/home/teo/OpenMined/PySyft/packages/syft/src/syft/types/syft_object.py\", line 757, in __getattr__\n", - " raise AttributeError(\n", - "AttributeError: 'UserCodeV1' object has no attribute 'get_status'\n", - "INFO: Starting server with settings: {'name': 'bigquery-high', 'server_type': , 'server_side_type': , 'deployment_type': , 'processes': 1, 'reset': False, 'dev_mode': True, 'enable_warnings': False, 'in_memory_workers': True, 'queue_port': None, 'create_producer': True, 'n_consumers': 1, 'association_request_auto_approval': False, 'background_tasks': False, 'db_config': None, 'db_url': None} and worker class: \n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "WARN: private key is based on server name: bigquery-high in dev_mode. Don't run this in production.\n", - "Using SQLiteDBConfig and sqlite:////tmp/syft/fbdf5a287e58454cbbd3fac4ad744d37/db/fbdf5a287e58454cbbd3fac4ad744d37_json.db\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "Process SpawnProcess-1:6:\n", - "Traceback (most recent call last):\n", - " File \"/home/teo/anaconda3/envs/syft_3.12/lib/python3.12/multiprocessing/process.py\", line 314, in _bootstrap\n", - " self.run()\n", - " File \"/home/teo/anaconda3/envs/syft_3.12/lib/python3.12/multiprocessing/process.py\", line 108, in run\n", - " self._target(*self._args, **self._kwargs)\n", - " File \"/home/teo/anaconda3/envs/syft_3.12/lib/python3.12/site-packages/uvicorn/_subprocess.py\", line 80, in subprocess_started\n", - " target(sockets=sockets)\n", - " File \"/home/teo/anaconda3/envs/syft_3.12/lib/python3.12/site-packages/uvicorn/server.py\", line 65, in run\n", - " return asyncio.run(self.serve(sockets=sockets))\n", - " ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n", - " File \"/home/teo/anaconda3/envs/syft_3.12/lib/python3.12/asyncio/runners.py\", line 194, in run\n", - " return runner.run(main)\n", - " ^^^^^^^^^^^^^^^^\n", - " File \"/home/teo/anaconda3/envs/syft_3.12/lib/python3.12/asyncio/runners.py\", line 118, in run\n", - " return self._loop.run_until_complete(task)\n", - " ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n", - " File \"uvloop/loop.pyx\", line 1517, in uvloop.loop.Loop.run_until_complete\n", - " File \"/home/teo/anaconda3/envs/syft_3.12/lib/python3.12/site-packages/uvicorn/server.py\", line 69, in serve\n", - " await self._serve(sockets)\n", - " File \"/home/teo/anaconda3/envs/syft_3.12/lib/python3.12/site-packages/uvicorn/server.py\", line 76, in _serve\n", - " config.load()\n", - " File \"/home/teo/anaconda3/envs/syft_3.12/lib/python3.12/site-packages/uvicorn/config.py\", line 440, in load\n", - " self.loaded_app = self.loaded_app()\n", - " ^^^^^^^^^^^^^^^^^\n", - " File \"/home/teo/OpenMined/PySyft/packages/syft/src/syft/server/uvicorn.py\", line 111, in app_factory\n", - " worker = worker_class.named(**kwargs)\n", - " ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n", - " File \"/home/teo/OpenMined/PySyft/packages/syft/src/syft/server/server.py\", line 728, in named\n", - " return cls(\n", - " ^^^^\n", - " File \"/home/teo/OpenMined/PySyft/packages/syft/src/syft/server/server.py\", line 431, in __init__\n", - " self.post_init()\n", - " File \"/home/teo/OpenMined/PySyft/packages/syft/src/syft/server/server.py\", line 863, in post_init\n", - " self.services.user_code.load_user_code(context=context)\n", - " File \"/home/teo/OpenMined/PySyft/packages/syft/src/syft/types/result.py\", line 113, in wrapper\n", - " output = func(*args, **kwargs)\n", - " ^^^^^^^^^^^^^^^^^^^^^\n", - " File \"/home/teo/OpenMined/PySyft/packages/syft/src/syft/service/code/user_code_service.py\", line 338, in load_user_code\n", - " load_approved_policy_code(user_code_items=user_code_items, context=context)\n", - " File \"/home/teo/OpenMined/PySyft/packages/syft/src/syft/service/code/user_code.py\", line 2085, in load_approved_policy_code\n", - " status = user_code.get_status(context).unwrap()\n", - " ^^^^^^^^^^^^^^^^^^^^\n", - " File \"/home/teo/OpenMined/PySyft/packages/syft/src/syft/types/syft_object.py\", line 757, in __getattr__\n", - " raise AttributeError(\n", - "AttributeError: 'UserCodeV1' object has no attribute 'get_status'\n", - "INFO: Starting server with settings: {'name': 'bigquery-high', 'server_type': , 'server_side_type': , 'deployment_type': , 'processes': 1, 'reset': False, 'dev_mode': True, 'enable_warnings': False, 'in_memory_workers': True, 'queue_port': None, 'create_producer': True, 'n_consumers': 1, 'association_request_auto_approval': False, 'background_tasks': False, 'db_config': None, 'db_url': None} and worker class: \n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "WARN: private key is based on server name: bigquery-high in dev_mode. Don't run this in production.\n", - "Using SQLiteDBConfig and sqlite:////tmp/syft/fbdf5a287e58454cbbd3fac4ad744d37/db/fbdf5a287e58454cbbd3fac4ad744d37_json.db\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "Process SpawnProcess-1:7:\n", - "Traceback (most recent call last):\n", - " File \"/home/teo/anaconda3/envs/syft_3.12/lib/python3.12/multiprocessing/process.py\", line 314, in _bootstrap\n", - " self.run()\n", - " File \"/home/teo/anaconda3/envs/syft_3.12/lib/python3.12/multiprocessing/process.py\", line 108, in run\n", - " self._target(*self._args, **self._kwargs)\n", - " File \"/home/teo/anaconda3/envs/syft_3.12/lib/python3.12/site-packages/uvicorn/_subprocess.py\", line 80, in subprocess_started\n", - " target(sockets=sockets)\n", - " File \"/home/teo/anaconda3/envs/syft_3.12/lib/python3.12/site-packages/uvicorn/server.py\", line 65, in run\n", - " return asyncio.run(self.serve(sockets=sockets))\n", - " ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n", - " File \"/home/teo/anaconda3/envs/syft_3.12/lib/python3.12/asyncio/runners.py\", line 194, in run\n", - " return runner.run(main)\n", - " ^^^^^^^^^^^^^^^^\n", - " File \"/home/teo/anaconda3/envs/syft_3.12/lib/python3.12/asyncio/runners.py\", line 118, in run\n", - " return self._loop.run_until_complete(task)\n", - " ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n", - " File \"uvloop/loop.pyx\", line 1517, in uvloop.loop.Loop.run_until_complete\n", - " File \"/home/teo/anaconda3/envs/syft_3.12/lib/python3.12/site-packages/uvicorn/server.py\", line 69, in serve\n", - " await self._serve(sockets)\n", - " File \"/home/teo/anaconda3/envs/syft_3.12/lib/python3.12/site-packages/uvicorn/server.py\", line 76, in _serve\n", - " config.load()\n", - " File \"/home/teo/anaconda3/envs/syft_3.12/lib/python3.12/site-packages/uvicorn/config.py\", line 440, in load\n", - " self.loaded_app = self.loaded_app()\n", - " ^^^^^^^^^^^^^^^^^\n", - " File \"/home/teo/OpenMined/PySyft/packages/syft/src/syft/server/uvicorn.py\", line 111, in app_factory\n", - " worker = worker_class.named(**kwargs)\n", - " ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n", - " File \"/home/teo/OpenMined/PySyft/packages/syft/src/syft/server/server.py\", line 728, in named\n", - " return cls(\n", - " ^^^^\n", - " File \"/home/teo/OpenMined/PySyft/packages/syft/src/syft/server/server.py\", line 431, in __init__\n", - " self.post_init()\n", - " File \"/home/teo/OpenMined/PySyft/packages/syft/src/syft/server/server.py\", line 863, in post_init\n", - " self.services.user_code.load_user_code(context=context)\n", - " File \"/home/teo/OpenMined/PySyft/packages/syft/src/syft/types/result.py\", line 113, in wrapper\n", - " output = func(*args, **kwargs)\n", - " ^^^^^^^^^^^^^^^^^^^^^\n", - " File \"/home/teo/OpenMined/PySyft/packages/syft/src/syft/service/code/user_code_service.py\", line 338, in load_user_code\n", - " load_approved_policy_code(user_code_items=user_code_items, context=context)\n", - " File \"/home/teo/OpenMined/PySyft/packages/syft/src/syft/service/code/user_code.py\", line 2085, in load_approved_policy_code\n", - " status = user_code.get_status(context).unwrap()\n", - " ^^^^^^^^^^^^^^^^^^^^\n", - " File \"/home/teo/OpenMined/PySyft/packages/syft/src/syft/types/syft_object.py\", line 757, in __getattr__\n", - " raise AttributeError(\n", - "AttributeError: 'UserCodeV1' object has no attribute 'get_status'\n", - "INFO: Starting server with settings: {'name': 'bigquery-high', 'server_type': , 'server_side_type': , 'deployment_type': , 'processes': 1, 'reset': False, 'dev_mode': True, 'enable_warnings': False, 'in_memory_workers': True, 'queue_port': None, 'create_producer': True, 'n_consumers': 1, 'association_request_auto_approval': False, 'background_tasks': False, 'db_config': None, 'db_url': None} and worker class: \n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "WARN: private key is based on server name: bigquery-high in dev_mode. Don't run this in production.\n", - "Using SQLiteDBConfig and sqlite:////tmp/syft/fbdf5a287e58454cbbd3fac4ad744d37/db/fbdf5a287e58454cbbd3fac4ad744d37_json.db\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "Process SpawnProcess-1:8:\n", - "Traceback (most recent call last):\n", - " File \"/home/teo/anaconda3/envs/syft_3.12/lib/python3.12/multiprocessing/process.py\", line 314, in _bootstrap\n", - " self.run()\n", - " File \"/home/teo/anaconda3/envs/syft_3.12/lib/python3.12/multiprocessing/process.py\", line 108, in run\n", - " self._target(*self._args, **self._kwargs)\n", - " File \"/home/teo/anaconda3/envs/syft_3.12/lib/python3.12/site-packages/uvicorn/_subprocess.py\", line 80, in subprocess_started\n", - " target(sockets=sockets)\n", - " File \"/home/teo/anaconda3/envs/syft_3.12/lib/python3.12/site-packages/uvicorn/server.py\", line 65, in run\n", - " return asyncio.run(self.serve(sockets=sockets))\n", - " ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n", - " File \"/home/teo/anaconda3/envs/syft_3.12/lib/python3.12/asyncio/runners.py\", line 194, in run\n", - " return runner.run(main)\n", - " ^^^^^^^^^^^^^^^^\n", - " File \"/home/teo/anaconda3/envs/syft_3.12/lib/python3.12/asyncio/runners.py\", line 118, in run\n", - " return self._loop.run_until_complete(task)\n", - " ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n", - " File \"uvloop/loop.pyx\", line 1517, in uvloop.loop.Loop.run_until_complete\n", - " File \"/home/teo/anaconda3/envs/syft_3.12/lib/python3.12/site-packages/uvicorn/server.py\", line 69, in serve\n", - " await self._serve(sockets)\n", - " File \"/home/teo/anaconda3/envs/syft_3.12/lib/python3.12/site-packages/uvicorn/server.py\", line 76, in _serve\n", - " config.load()\n", - " File \"/home/teo/anaconda3/envs/syft_3.12/lib/python3.12/site-packages/uvicorn/config.py\", line 440, in load\n", - " self.loaded_app = self.loaded_app()\n", - " ^^^^^^^^^^^^^^^^^\n", - " File \"/home/teo/OpenMined/PySyft/packages/syft/src/syft/server/uvicorn.py\", line 111, in app_factory\n", - " worker = worker_class.named(**kwargs)\n", - " ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n", - " File \"/home/teo/OpenMined/PySyft/packages/syft/src/syft/server/server.py\", line 728, in named\n", - " return cls(\n", - " ^^^^\n", - " File \"/home/teo/OpenMined/PySyft/packages/syft/src/syft/server/server.py\", line 431, in __init__\n", - " self.post_init()\n", - " File \"/home/teo/OpenMined/PySyft/packages/syft/src/syft/server/server.py\", line 863, in post_init\n", - " self.services.user_code.load_user_code(context=context)\n", - " File \"/home/teo/OpenMined/PySyft/packages/syft/src/syft/types/result.py\", line 113, in wrapper\n", - " output = func(*args, **kwargs)\n", - " ^^^^^^^^^^^^^^^^^^^^^\n", - " File \"/home/teo/OpenMined/PySyft/packages/syft/src/syft/service/code/user_code_service.py\", line 338, in load_user_code\n", - " load_approved_policy_code(user_code_items=user_code_items, context=context)\n", - " File \"/home/teo/OpenMined/PySyft/packages/syft/src/syft/service/code/user_code.py\", line 2085, in load_approved_policy_code\n", - " status = user_code.get_status(context).unwrap()\n", - " ^^^^^^^^^^^^^^^^^^^^\n", - " File \"/home/teo/OpenMined/PySyft/packages/syft/src/syft/types/syft_object.py\", line 757, in __getattr__\n", - " raise AttributeError(\n", - "AttributeError: 'UserCodeV1' object has no attribute 'get_status'\n", - "INFO: Starting server with settings: {'name': 'bigquery-high', 'server_type': , 'server_side_type': , 'deployment_type': , 'processes': 1, 'reset': False, 'dev_mode': True, 'enable_warnings': False, 'in_memory_workers': True, 'queue_port': None, 'create_producer': True, 'n_consumers': 1, 'association_request_auto_approval': False, 'background_tasks': False, 'db_config': None, 'db_url': None} and worker class: \n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "WARN: private key is based on server name: bigquery-high in dev_mode. Don't run this in production.\n", - "Using SQLiteDBConfig and sqlite:////tmp/syft/fbdf5a287e58454cbbd3fac4ad744d37/db/fbdf5a287e58454cbbd3fac4ad744d37_json.db\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "Process SpawnProcess-1:9:\n", - "Traceback (most recent call last):\n", - " File \"/home/teo/anaconda3/envs/syft_3.12/lib/python3.12/multiprocessing/process.py\", line 314, in _bootstrap\n", - " self.run()\n", - " File \"/home/teo/anaconda3/envs/syft_3.12/lib/python3.12/multiprocessing/process.py\", line 108, in run\n", - " self._target(*self._args, **self._kwargs)\n", - " File \"/home/teo/anaconda3/envs/syft_3.12/lib/python3.12/site-packages/uvicorn/_subprocess.py\", line 80, in subprocess_started\n", - " target(sockets=sockets)\n", - " File \"/home/teo/anaconda3/envs/syft_3.12/lib/python3.12/site-packages/uvicorn/server.py\", line 65, in run\n", - " return asyncio.run(self.serve(sockets=sockets))\n", - " ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n", - " File \"/home/teo/anaconda3/envs/syft_3.12/lib/python3.12/asyncio/runners.py\", line 194, in run\n", - " return runner.run(main)\n", - " ^^^^^^^^^^^^^^^^\n", - " File \"/home/teo/anaconda3/envs/syft_3.12/lib/python3.12/asyncio/runners.py\", line 118, in run\n", - " return self._loop.run_until_complete(task)\n", - " ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n", - " File \"uvloop/loop.pyx\", line 1517, in uvloop.loop.Loop.run_until_complete\n", - " File \"/home/teo/anaconda3/envs/syft_3.12/lib/python3.12/site-packages/uvicorn/server.py\", line 69, in serve\n", - " await self._serve(sockets)\n", - " File \"/home/teo/anaconda3/envs/syft_3.12/lib/python3.12/site-packages/uvicorn/server.py\", line 76, in _serve\n", - " config.load()\n", - " File \"/home/teo/anaconda3/envs/syft_3.12/lib/python3.12/site-packages/uvicorn/config.py\", line 440, in load\n", - " self.loaded_app = self.loaded_app()\n", - " ^^^^^^^^^^^^^^^^^\n", - " File \"/home/teo/OpenMined/PySyft/packages/syft/src/syft/server/uvicorn.py\", line 111, in app_factory\n", - " worker = worker_class.named(**kwargs)\n", - " ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n", - " File \"/home/teo/OpenMined/PySyft/packages/syft/src/syft/server/server.py\", line 728, in named\n", - " return cls(\n", - " ^^^^\n", - " File \"/home/teo/OpenMined/PySyft/packages/syft/src/syft/server/server.py\", line 431, in __init__\n", - " self.post_init()\n", - " File \"/home/teo/OpenMined/PySyft/packages/syft/src/syft/server/server.py\", line 863, in post_init\n", - " self.services.user_code.load_user_code(context=context)\n", - " File \"/home/teo/OpenMined/PySyft/packages/syft/src/syft/types/result.py\", line 113, in wrapper\n", - " output = func(*args, **kwargs)\n", - " ^^^^^^^^^^^^^^^^^^^^^\n", - " File \"/home/teo/OpenMined/PySyft/packages/syft/src/syft/service/code/user_code_service.py\", line 338, in load_user_code\n", - " load_approved_policy_code(user_code_items=user_code_items, context=context)\n", - " File \"/home/teo/OpenMined/PySyft/packages/syft/src/syft/service/code/user_code.py\", line 2085, in load_approved_policy_code\n", - " status = user_code.get_status(context).unwrap()\n", - " ^^^^^^^^^^^^^^^^^^^^\n", - " File \"/home/teo/OpenMined/PySyft/packages/syft/src/syft/types/syft_object.py\", line 757, in __getattr__\n", - " raise AttributeError(\n", - "AttributeError: 'UserCodeV1' object has no attribute 'get_status'\n" - ] - } - ], + "outputs": [], "source": [ "assert isinstance(job_res.wait(), sy.SyftError)" ] From 145c0dc32fd416c2f4ee1cc749a00f286ebf61b4 Mon Sep 17 00:00:00 2001 From: teo Date: Mon, 23 Sep 2024 13:33:53 +0300 Subject: [PATCH 17/17] fix path hopefully --- .../upgradability/0.9.1_notebooks/emails.json | 68 +++++----- .../upgradability/0.9.1_notebooks/jobs.json | 120 +++++++++--------- .../upgradability/0.9.1_notebooks/users.json | 32 ++--- .../1-dump-database-to-file.ipynb | 2 +- .../2-migrate-for-scenarios.ipynb | 3 +- .../bigquery/upgradability/migration.blob | Bin 5222000 -> 4363984 bytes .../bigquery/upgradability/migration.yaml | 4 +- tox.ini | 10 +- 8 files changed, 122 insertions(+), 117 deletions(-) diff --git a/notebooks/scenarios/bigquery/upgradability/0.9.1_notebooks/emails.json b/notebooks/scenarios/bigquery/upgradability/0.9.1_notebooks/emails.json index 978c920b55d..dc22a271960 100644 --- a/notebooks/scenarios/bigquery/upgradability/0.9.1_notebooks/emails.json +++ b/notebooks/scenarios/bigquery/upgradability/0.9.1_notebooks/emails.json @@ -3,95 +3,105 @@ { "email_from": "noreply@openmined.org", "email_to": ["admin@bigquery.org"], - "email_content": "Content-Type: multipart/alternative; boundary=\"===============7117641952261823257==\"\r\nMIME-Version: 1.0\r\nFrom: noreply@openmined.org\r\nTo: admin@bigquery.org\r\nSubject: Datasite bigquery-high-migrations: A New Request (8e12) has been received!\r\n\r\n--===============7117641952261823257==\r\nContent-Type: text/html; charset=\"us-ascii\"\r\nMIME-Version: 1.0\r\nContent-Transfer-Encoding: 7bit\r\n\r\n\r\n \r\n Access Request Notification\r\n \r\n \r\n \r\n
\r\n
\r\n Request Notification\r\n
\r\n
\r\n

Hello,

\r\n

A new request has been submitted and requires your attention.\r\n Please review the details below:

\r\n\r\n
\r\n
Request Details
\r\n
\r\n\r\n

ID: 8e12c9ac5c5547b1afe5b5a1d5e24900

\r\n

\r\n Submitted By:\r\n William Thompson\r\n

\r\n

Date: 2024-09-23 09:30:38

\r\n

Status:

\r\n PENDING\r\n
\r\n

Changes:\r\n UserCodeStatusChange\r\n

\r\n\r\n

Use:
\r\n \r\n request = client.api.services.request.get_by_uid(uid=sy.UID(\"8e12c9ac5c5547b1afe5b5a1d5e24900\"))\r\n
\r\n to get this specific request.\r\n

\r\n\r\n

Or you can view all requests with:
\r\n \r\n client.requests\r\n \r\n

\r\n\r\n
\r\n
\r\n

If you did not expect this request or have concerns about it,\r\n please contact our support team immediately.

\r\n
\r\n
\r\n This is an automated message, please do not reply directly to this email.
\r\n For assistance, please contact our support team.\r\n
\r\n
\r\n \r\n \r\n--===============7117641952261823257==--\r\n" + "email_content": "Content-Type: multipart/alternative; boundary=\"===============5231718646336112954==\"\r\nMIME-Version: 1.0\r\nFrom: noreply@openmined.org\r\nTo: admin@bigquery.org\r\nSubject: Datasite bigquery-high-migrations: A New Request (6091) has been received!\r\n\r\n--===============5231718646336112954==\r\nContent-Type: text/html; charset=\"us-ascii\"\r\nMIME-Version: 1.0\r\nContent-Transfer-Encoding: 7bit\r\n\r\n\r\n \r\n Access Request Notification\r\n \r\n \r\n \r\n
\r\n
\r\n Request Notification\r\n
\r\n
\r\n

Hello,

\r\n

A new request has been submitted and requires your attention.\r\n Please review the details below:

\r\n\r\n
\r\n
Request Details
\r\n
\r\n\r\n

ID: 60916f4d58504b7f91508b9e11e2fe03

\r\n

\r\n Submitted By:\r\n Michael Adams\r\n

\r\n

Date: 2024-09-23 10:22:57

\r\n

Status:

\r\n PENDING\r\n
\r\n

Changes:\r\n UserCodeStatusChange\r\n

\r\n\r\n

Use:
\r\n \r\n request = client.api.services.request.get_by_uid(uid=sy.UID(\"60916f4d58504b7f91508b9e11e2fe03\"))\r\n
\r\n to get this specific request.\r\n

\r\n\r\n

Or you can view all requests with:
\r\n \r\n client.requests\r\n \r\n

\r\n\r\n
\r\n
\r\n

If you did not expect this request or have concerns about it,\r\n please contact our support team immediately.

\r\n
\r\n
\r\n This is an automated message, please do not reply directly to this email.
\r\n For assistance, please contact our support team.\r\n
\r\n
\r\n \r\n \r\n--===============5231718646336112954==--\r\n" }, { "email_from": "noreply@openmined.org", "email_to": ["admin@bigquery.org"], - "email_content": "Content-Type: multipart/alternative; boundary=\"===============3685701994337601608==\"\r\nMIME-Version: 1.0\r\nFrom: noreply@openmined.org\r\nTo: admin@bigquery.org\r\nSubject: Datasite bigquery-high-migrations: A New Request (1eb3) has been received!\r\n\r\n--===============3685701994337601608==\r\nContent-Type: text/html; charset=\"us-ascii\"\r\nMIME-Version: 1.0\r\nContent-Transfer-Encoding: 7bit\r\n\r\n\r\n \r\n Access Request Notification\r\n \r\n \r\n \r\n
\r\n
\r\n Request Notification\r\n
\r\n
\r\n

Hello,

\r\n

A new request has been submitted and requires your attention.\r\n Please review the details below:

\r\n\r\n
\r\n
Request Details
\r\n
\r\n\r\n

ID: 1eb3b8a2579a4b8db00b2de5e10de974

\r\n

\r\n Submitted By:\r\n Eric Hahn\r\n

\r\n

Date: 2024-09-23 09:30:48

\r\n

Status:

\r\n PENDING\r\n
\r\n

Changes:\r\n UserCodeStatusChange\r\n

\r\n\r\n

Use:
\r\n \r\n request = client.api.services.request.get_by_uid(uid=sy.UID(\"1eb3b8a2579a4b8db00b2de5e10de974\"))\r\n
\r\n to get this specific request.\r\n

\r\n\r\n

Or you can view all requests with:
\r\n \r\n client.requests\r\n \r\n

\r\n\r\n
\r\n
\r\n

If you did not expect this request or have concerns about it,\r\n please contact our support team immediately.

\r\n
\r\n
\r\n This is an automated message, please do not reply directly to this email.
\r\n For assistance, please contact our support team.\r\n
\r\n
\r\n \r\n \r\n--===============3685701994337601608==--\r\n" + "email_content": "Content-Type: multipart/alternative; boundary=\"===============2108625785401698392==\"\r\nMIME-Version: 1.0\r\nFrom: noreply@openmined.org\r\nTo: admin@bigquery.org\r\nSubject: Datasite bigquery-high-migrations: A New Request (a850) has been received!\r\n\r\n--===============2108625785401698392==\r\nContent-Type: text/html; charset=\"us-ascii\"\r\nMIME-Version: 1.0\r\nContent-Transfer-Encoding: 7bit\r\n\r\n\r\n \r\n Access Request Notification\r\n \r\n \r\n \r\n
\r\n
\r\n Request Notification\r\n
\r\n
\r\n

Hello,

\r\n

A new request has been submitted and requires your attention.\r\n Please review the details below:

\r\n\r\n
\r\n
Request Details
\r\n
\r\n\r\n

ID: a850407831c64b928c4733db4393bb84

\r\n

\r\n Submitted By:\r\n Lisa Clark\r\n

\r\n

Date: 2024-09-23 10:23:08

\r\n

Status:

\r\n PENDING\r\n
\r\n

Changes:\r\n UserCodeStatusChange\r\n

\r\n\r\n

Use:
\r\n \r\n request = client.api.services.request.get_by_uid(uid=sy.UID(\"a850407831c64b928c4733db4393bb84\"))\r\n
\r\n to get this specific request.\r\n

\r\n\r\n

Or you can view all requests with:
\r\n \r\n client.requests\r\n \r\n

\r\n\r\n
\r\n
\r\n

If you did not expect this request or have concerns about it,\r\n please contact our support team immediately.

\r\n
\r\n
\r\n This is an automated message, please do not reply directly to this email.
\r\n For assistance, please contact our support team.\r\n
\r\n
\r\n \r\n \r\n--===============2108625785401698392==--\r\n" }, { "email_from": "noreply@openmined.org", "email_to": ["admin@bigquery.org"], - "email_content": "Content-Type: multipart/alternative; boundary=\"===============6536215668630059171==\"\r\nMIME-Version: 1.0\r\nFrom: noreply@openmined.org\r\nTo: admin@bigquery.org\r\nSubject: Datasite bigquery-high-migrations: A New Request (bcb3) has been received!\r\n\r\n--===============6536215668630059171==\r\nContent-Type: text/html; charset=\"us-ascii\"\r\nMIME-Version: 1.0\r\nContent-Transfer-Encoding: 7bit\r\n\r\n\r\n \r\n Access Request Notification\r\n \r\n \r\n \r\n
\r\n
\r\n Request Notification\r\n
\r\n
\r\n

Hello,

\r\n

A new request has been submitted and requires your attention.\r\n Please review the details below:

\r\n\r\n
\r\n
Request Details
\r\n
\r\n\r\n

ID: bcb34404327a41fa8592ff5aefbc72f1

\r\n

\r\n Submitted By:\r\n Paul Lloyd\r\n

\r\n

Date: 2024-09-23 09:30:57

\r\n

Status:

\r\n PENDING\r\n
\r\n

Changes:\r\n UserCodeStatusChange\r\n

\r\n\r\n

Use:
\r\n \r\n request = client.api.services.request.get_by_uid(uid=sy.UID(\"bcb34404327a41fa8592ff5aefbc72f1\"))\r\n
\r\n to get this specific request.\r\n

\r\n\r\n

Or you can view all requests with:
\r\n \r\n client.requests\r\n \r\n

\r\n\r\n
\r\n
\r\n

If you did not expect this request or have concerns about it,\r\n please contact our support team immediately.

\r\n
\r\n
\r\n This is an automated message, please do not reply directly to this email.
\r\n For assistance, please contact our support team.\r\n
\r\n
\r\n \r\n \r\n--===============6536215668630059171==--\r\n" + "email_content": "Content-Type: multipart/alternative; boundary=\"===============3190702502919456718==\"\r\nMIME-Version: 1.0\r\nFrom: noreply@openmined.org\r\nTo: admin@bigquery.org\r\nSubject: Datasite bigquery-high-migrations: A New Request (e0cf) has been received!\r\n\r\n--===============3190702502919456718==\r\nContent-Type: text/html; charset=\"us-ascii\"\r\nMIME-Version: 1.0\r\nContent-Transfer-Encoding: 7bit\r\n\r\n\r\n \r\n Access Request Notification\r\n \r\n \r\n \r\n
\r\n
\r\n Request Notification\r\n
\r\n
\r\n

Hello,

\r\n

A new request has been submitted and requires your attention.\r\n Please review the details below:

\r\n\r\n
\r\n
Request Details
\r\n
\r\n\r\n

ID: e0cf4aec1e80443fb49b54ab1ee460c3

\r\n

\r\n Submitted By:\r\n Anthony Simpson\r\n

\r\n

Date: 2024-09-23 10:23:18

\r\n

Status:

\r\n PENDING\r\n
\r\n

Changes:\r\n UserCodeStatusChange\r\n

\r\n\r\n

Use:
\r\n \r\n request = client.api.services.request.get_by_uid(uid=sy.UID(\"e0cf4aec1e80443fb49b54ab1ee460c3\"))\r\n
\r\n to get this specific request.\r\n

\r\n\r\n

Or you can view all requests with:
\r\n \r\n client.requests\r\n \r\n

\r\n\r\n
\r\n
\r\n

If you did not expect this request or have concerns about it,\r\n please contact our support team immediately.

\r\n
\r\n
\r\n This is an automated message, please do not reply directly to this email.
\r\n For assistance, please contact our support team.\r\n
\r\n
\r\n \r\n \r\n--===============3190702502919456718==--\r\n" }, { "email_from": "noreply@openmined.org", "email_to": ["admin@bigquery.org"], - "email_content": "Content-Type: multipart/alternative; boundary=\"===============0725079058935243976==\"\r\nMIME-Version: 1.0\r\nFrom: noreply@openmined.org\r\nTo: admin@bigquery.org\r\nSubject: Datasite bigquery-high-migrations: A New Request (df0f) has been received!\r\n\r\n--===============0725079058935243976==\r\nContent-Type: text/html; charset=\"us-ascii\"\r\nMIME-Version: 1.0\r\nContent-Transfer-Encoding: 7bit\r\n\r\n\r\n \r\n Access Request Notification\r\n \r\n \r\n \r\n
\r\n
\r\n Request Notification\r\n
\r\n
\r\n

Hello,

\r\n

A new request has been submitted and requires your attention.\r\n Please review the details below:

\r\n\r\n
\r\n
Request Details
\r\n
\r\n\r\n

ID: df0f392826c04242bbb07c9be6a0db05

\r\n

\r\n Submitted By:\r\n John Garrett\r\n

\r\n

Date: 2024-09-23 09:31:06

\r\n

Status:

\r\n PENDING\r\n
\r\n

Changes:\r\n UserCodeStatusChange\r\n

\r\n\r\n

Use:
\r\n \r\n request = client.api.services.request.get_by_uid(uid=sy.UID(\"df0f392826c04242bbb07c9be6a0db05\"))\r\n
\r\n to get this specific request.\r\n

\r\n\r\n

Or you can view all requests with:
\r\n \r\n client.requests\r\n \r\n

\r\n\r\n
\r\n
\r\n

If you did not expect this request or have concerns about it,\r\n please contact our support team immediately.

\r\n
\r\n
\r\n This is an automated message, please do not reply directly to this email.
\r\n For assistance, please contact our support team.\r\n
\r\n
\r\n \r\n \r\n--===============0725079058935243976==--\r\n" + "email_content": "Content-Type: multipart/alternative; boundary=\"===============6538833477960096742==\"\r\nMIME-Version: 1.0\r\nFrom: noreply@openmined.org\r\nTo: admin@bigquery.org\r\nSubject: Datasite bigquery-high-migrations: A New Request (291e) has been received!\r\n\r\n--===============6538833477960096742==\r\nContent-Type: text/html; charset=\"us-ascii\"\r\nMIME-Version: 1.0\r\nContent-Transfer-Encoding: 7bit\r\n\r\n\r\n \r\n Access Request Notification\r\n \r\n \r\n \r\n
\r\n
\r\n Request Notification\r\n
\r\n
\r\n

Hello,

\r\n

A new request has been submitted and requires your attention.\r\n Please review the details below:

\r\n\r\n
\r\n
Request Details
\r\n
\r\n\r\n

ID: 291ec8c54d594443ba5cdd39176c506d

\r\n

\r\n Submitted By:\r\n Ian Ray\r\n

\r\n

Date: 2024-09-23 10:23:28

\r\n

Status:

\r\n PENDING\r\n
\r\n

Changes:\r\n UserCodeStatusChange\r\n

\r\n\r\n

Use:
\r\n \r\n request = client.api.services.request.get_by_uid(uid=sy.UID(\"291ec8c54d594443ba5cdd39176c506d\"))\r\n
\r\n to get this specific request.\r\n

\r\n\r\n

Or you can view all requests with:
\r\n \r\n client.requests\r\n \r\n

\r\n\r\n
\r\n
\r\n

If you did not expect this request or have concerns about it,\r\n please contact our support team immediately.

\r\n
\r\n
\r\n This is an automated message, please do not reply directly to this email.
\r\n For assistance, please contact our support team.\r\n
\r\n
\r\n \r\n \r\n--===============6538833477960096742==--\r\n" }, { "email_from": "noreply@openmined.org", "email_to": ["admin@bigquery.org"], - "email_content": "Content-Type: multipart/alternative; boundary=\"===============1992657613805266198==\"\r\nMIME-Version: 1.0\r\nFrom: noreply@openmined.org\r\nTo: admin@bigquery.org\r\nSubject: Datasite bigquery-high-migrations: A New Request (5614) has been received!\r\n\r\n--===============1992657613805266198==\r\nContent-Type: text/html; charset=\"us-ascii\"\r\nMIME-Version: 1.0\r\nContent-Transfer-Encoding: 7bit\r\n\r\n\r\n \r\n Access Request Notification\r\n \r\n \r\n \r\n
\r\n
\r\n Request Notification\r\n
\r\n
\r\n

Hello,

\r\n

A new request has been submitted and requires your attention.\r\n Please review the details below:

\r\n\r\n
\r\n
Request Details
\r\n
\r\n\r\n

ID: 5614eb0d753942cc8205bb7d784e8896

\r\n

\r\n Submitted By:\r\n Anthony Escobar\r\n

\r\n

Date: 2024-09-23 09:31:16

\r\n

Status:

\r\n PENDING\r\n
\r\n

Changes:\r\n UserCodeStatusChange\r\n

\r\n\r\n

Use:
\r\n \r\n request = client.api.services.request.get_by_uid(uid=sy.UID(\"5614eb0d753942cc8205bb7d784e8896\"))\r\n
\r\n to get this specific request.\r\n

\r\n\r\n

Or you can view all requests with:
\r\n \r\n client.requests\r\n \r\n

\r\n\r\n
\r\n
\r\n

If you did not expect this request or have concerns about it,\r\n please contact our support team immediately.

\r\n
\r\n
\r\n This is an automated message, please do not reply directly to this email.
\r\n For assistance, please contact our support team.\r\n
\r\n
\r\n \r\n \r\n--===============1992657613805266198==--\r\n" + "email_content": "Content-Type: multipart/alternative; boundary=\"===============4270422105925677111==\"\r\nMIME-Version: 1.0\r\nFrom: noreply@openmined.org\r\nTo: admin@bigquery.org\r\nSubject: Datasite bigquery-high-migrations: A New Request (3573) has been received!\r\n\r\n--===============4270422105925677111==\r\nContent-Type: text/html; charset=\"us-ascii\"\r\nMIME-Version: 1.0\r\nContent-Transfer-Encoding: 7bit\r\n\r\n\r\n \r\n Access Request Notification\r\n \r\n \r\n \r\n
\r\n
\r\n Request Notification\r\n
\r\n
\r\n

Hello,

\r\n

A new request has been submitted and requires your attention.\r\n Please review the details below:

\r\n\r\n
\r\n
Request Details
\r\n
\r\n\r\n

ID: 35736f1adf34471a8d805e53d29883ed

\r\n

\r\n Submitted By:\r\n Marie Russo\r\n

\r\n

Date: 2024-09-23 10:23:39

\r\n

Status:

\r\n PENDING\r\n
\r\n

Changes:\r\n UserCodeStatusChange\r\n

\r\n\r\n

Use:
\r\n \r\n request = client.api.services.request.get_by_uid(uid=sy.UID(\"35736f1adf34471a8d805e53d29883ed\"))\r\n
\r\n to get this specific request.\r\n

\r\n\r\n

Or you can view all requests with:
\r\n \r\n client.requests\r\n \r\n

\r\n\r\n
\r\n
\r\n

If you did not expect this request or have concerns about it,\r\n please contact our support team immediately.

\r\n
\r\n
\r\n This is an automated message, please do not reply directly to this email.
\r\n For assistance, please contact our support team.\r\n
\r\n
\r\n \r\n \r\n--===============4270422105925677111==--\r\n" }, { "email_from": "noreply@openmined.org", "email_to": ["admin@bigquery.org"], - "email_content": "Content-Type: multipart/alternative; boundary=\"===============9005484778227806339==\"\r\nMIME-Version: 1.0\r\nFrom: noreply@openmined.org\r\nTo: admin@bigquery.org\r\nSubject: Datasite bigquery-high-migrations: A New Request (e4c6) has been received!\r\n\r\n--===============9005484778227806339==\r\nContent-Type: text/html; charset=\"us-ascii\"\r\nMIME-Version: 1.0\r\nContent-Transfer-Encoding: 7bit\r\n\r\n\r\n \r\n Access Request Notification\r\n \r\n \r\n \r\n
\r\n
\r\n Request Notification\r\n
\r\n
\r\n

Hello,

\r\n

A new request has been submitted and requires your attention.\r\n Please review the details below:

\r\n\r\n
\r\n
Request Details
\r\n
\r\n\r\n

ID: e4c6e9b1009b42a0b65c86738c4c2e09

\r\n

\r\n Submitted By:\r\n William Thompson\r\n

\r\n

Date: 2024-09-23 09:31:25

\r\n

Status:

\r\n PENDING\r\n
\r\n

Changes:\r\n UserCodeStatusChange\r\n

\r\n\r\n

Use:
\r\n \r\n request = client.api.services.request.get_by_uid(uid=sy.UID(\"e4c6e9b1009b42a0b65c86738c4c2e09\"))\r\n
\r\n to get this specific request.\r\n

\r\n\r\n

Or you can view all requests with:
\r\n \r\n client.requests\r\n \r\n

\r\n\r\n
\r\n
\r\n

If you did not expect this request or have concerns about it,\r\n please contact our support team immediately.

\r\n
\r\n
\r\n This is an automated message, please do not reply directly to this email.
\r\n For assistance, please contact our support team.\r\n
\r\n
\r\n \r\n \r\n--===============9005484778227806339==--\r\n" + "email_content": "Content-Type: multipart/alternative; boundary=\"===============1927382439090520103==\"\r\nMIME-Version: 1.0\r\nFrom: noreply@openmined.org\r\nTo: admin@bigquery.org\r\nSubject: Datasite bigquery-high-migrations: A New Request (14f6) has been received!\r\n\r\n--===============1927382439090520103==\r\nContent-Type: text/html; charset=\"us-ascii\"\r\nMIME-Version: 1.0\r\nContent-Transfer-Encoding: 7bit\r\n\r\n\r\n \r\n Access Request Notification\r\n \r\n \r\n \r\n
\r\n
\r\n Request Notification\r\n
\r\n
\r\n

Hello,

\r\n

A new request has been submitted and requires your attention.\r\n Please review the details below:

\r\n\r\n
\r\n
Request Details
\r\n
\r\n\r\n

ID: 14f66d6a120e4c3aadb123b2e8dd8805

\r\n

\r\n Submitted By:\r\n Michael Adams\r\n

\r\n

Date: 2024-09-23 10:23:49

\r\n

Status:

\r\n PENDING\r\n
\r\n

Changes:\r\n UserCodeStatusChange\r\n

\r\n\r\n

Use:
\r\n \r\n request = client.api.services.request.get_by_uid(uid=sy.UID(\"14f66d6a120e4c3aadb123b2e8dd8805\"))\r\n
\r\n to get this specific request.\r\n

\r\n\r\n

Or you can view all requests with:
\r\n \r\n client.requests\r\n \r\n

\r\n\r\n
\r\n
\r\n

If you did not expect this request or have concerns about it,\r\n please contact our support team immediately.

\r\n
\r\n
\r\n This is an automated message, please do not reply directly to this email.
\r\n For assistance, please contact our support team.\r\n
\r\n
\r\n \r\n \r\n--===============1927382439090520103==--\r\n" }, { "email_from": "noreply@openmined.org", "email_to": ["admin@bigquery.org"], - "email_content": "Content-Type: multipart/alternative; boundary=\"===============5503698571725917494==\"\r\nMIME-Version: 1.0\r\nFrom: noreply@openmined.org\r\nTo: admin@bigquery.org\r\nSubject: Datasite bigquery-high-migrations: A New Request (ea2b) has been received!\r\n\r\n--===============5503698571725917494==\r\nContent-Type: text/html; charset=\"us-ascii\"\r\nMIME-Version: 1.0\r\nContent-Transfer-Encoding: 7bit\r\n\r\n\r\n \r\n Access Request Notification\r\n \r\n \r\n \r\n
\r\n
\r\n Request Notification\r\n
\r\n
\r\n

Hello,

\r\n

A new request has been submitted and requires your attention.\r\n Please review the details below:

\r\n\r\n
\r\n
Request Details
\r\n
\r\n\r\n

ID: ea2b120ac5fc44b496fad22448813338

\r\n

\r\n Submitted By:\r\n Eric Hahn\r\n

\r\n

Date: 2024-09-23 09:31:35

\r\n

Status:

\r\n PENDING\r\n
\r\n

Changes:\r\n UserCodeStatusChange\r\n

\r\n\r\n

Use:
\r\n \r\n request = client.api.services.request.get_by_uid(uid=sy.UID(\"ea2b120ac5fc44b496fad22448813338\"))\r\n
\r\n to get this specific request.\r\n

\r\n\r\n

Or you can view all requests with:
\r\n \r\n client.requests\r\n \r\n

\r\n\r\n
\r\n
\r\n

If you did not expect this request or have concerns about it,\r\n please contact our support team immediately.

\r\n
\r\n
\r\n This is an automated message, please do not reply directly to this email.
\r\n For assistance, please contact our support team.\r\n
\r\n
\r\n \r\n \r\n--===============5503698571725917494==--\r\n" + "email_content": "Content-Type: multipart/alternative; boundary=\"===============1564302604072025353==\"\r\nMIME-Version: 1.0\r\nFrom: noreply@openmined.org\r\nTo: admin@bigquery.org\r\nSubject: Datasite bigquery-high-migrations: A New Request (1418) has been received!\r\n\r\n--===============1564302604072025353==\r\nContent-Type: text/html; charset=\"us-ascii\"\r\nMIME-Version: 1.0\r\nContent-Transfer-Encoding: 7bit\r\n\r\n\r\n \r\n Access Request Notification\r\n \r\n \r\n \r\n
\r\n
\r\n Request Notification\r\n
\r\n
\r\n

Hello,

\r\n

A new request has been submitted and requires your attention.\r\n Please review the details below:

\r\n\r\n
\r\n
Request Details
\r\n
\r\n\r\n

ID: 141875e5343a48c8aef17f642a8c91e7

\r\n

\r\n Submitted By:\r\n Lisa Clark\r\n

\r\n

Date: 2024-09-23 10:23:59

\r\n

Status:

\r\n PENDING\r\n
\r\n

Changes:\r\n UserCodeStatusChange\r\n

\r\n\r\n

Use:
\r\n \r\n request = client.api.services.request.get_by_uid(uid=sy.UID(\"141875e5343a48c8aef17f642a8c91e7\"))\r\n
\r\n to get this specific request.\r\n

\r\n\r\n

Or you can view all requests with:
\r\n \r\n client.requests\r\n \r\n

\r\n\r\n
\r\n
\r\n

If you did not expect this request or have concerns about it,\r\n please contact our support team immediately.

\r\n
\r\n
\r\n This is an automated message, please do not reply directly to this email.
\r\n For assistance, please contact our support team.\r\n
\r\n
\r\n \r\n \r\n--===============1564302604072025353==--\r\n" }, { "email_from": "noreply@openmined.org", "email_to": ["admin@bigquery.org"], - "email_content": "Content-Type: multipart/alternative; boundary=\"===============3095197698625258186==\"\r\nMIME-Version: 1.0\r\nFrom: noreply@openmined.org\r\nTo: admin@bigquery.org\r\nSubject: Datasite bigquery-high-migrations: A New Request (ee9c) has been received!\r\n\r\n--===============3095197698625258186==\r\nContent-Type: text/html; charset=\"us-ascii\"\r\nMIME-Version: 1.0\r\nContent-Transfer-Encoding: 7bit\r\n\r\n\r\n \r\n Access Request Notification\r\n \r\n \r\n \r\n
\r\n
\r\n Request Notification\r\n
\r\n
\r\n

Hello,

\r\n

A new request has been submitted and requires your attention.\r\n Please review the details below:

\r\n\r\n
\r\n
Request Details
\r\n
\r\n\r\n

ID: ee9c2f4e3a7d401caedaa9bb216ce272

\r\n

\r\n Submitted By:\r\n Paul Lloyd\r\n

\r\n

Date: 2024-09-23 09:31:44

\r\n

Status:

\r\n PENDING\r\n
\r\n

Changes:\r\n UserCodeStatusChange\r\n

\r\n\r\n

Use:
\r\n \r\n request = client.api.services.request.get_by_uid(uid=sy.UID(\"ee9c2f4e3a7d401caedaa9bb216ce272\"))\r\n
\r\n to get this specific request.\r\n

\r\n\r\n

Or you can view all requests with:
\r\n \r\n client.requests\r\n \r\n

\r\n\r\n
\r\n
\r\n

If you did not expect this request or have concerns about it,\r\n please contact our support team immediately.

\r\n
\r\n
\r\n This is an automated message, please do not reply directly to this email.
\r\n For assistance, please contact our support team.\r\n
\r\n
\r\n \r\n \r\n--===============3095197698625258186==--\r\n" + "email_content": "Content-Type: multipart/alternative; boundary=\"===============5221322304721055502==\"\r\nMIME-Version: 1.0\r\nFrom: noreply@openmined.org\r\nTo: admin@bigquery.org\r\nSubject: Datasite bigquery-high-migrations: A New Request (8fae) has been received!\r\n\r\n--===============5221322304721055502==\r\nContent-Type: text/html; charset=\"us-ascii\"\r\nMIME-Version: 1.0\r\nContent-Transfer-Encoding: 7bit\r\n\r\n\r\n \r\n Access Request Notification\r\n \r\n \r\n \r\n
\r\n
\r\n Request Notification\r\n
\r\n
\r\n

Hello,

\r\n

A new request has been submitted and requires your attention.\r\n Please review the details below:

\r\n\r\n
\r\n
Request Details
\r\n
\r\n\r\n

ID: 8fae4312f60742b093c89a968d2a1453

\r\n

\r\n Submitted By:\r\n Anthony Simpson\r\n

\r\n

Date: 2024-09-23 10:24:09

\r\n

Status:

\r\n PENDING\r\n
\r\n

Changes:\r\n UserCodeStatusChange\r\n

\r\n\r\n

Use:
\r\n \r\n request = client.api.services.request.get_by_uid(uid=sy.UID(\"8fae4312f60742b093c89a968d2a1453\"))\r\n
\r\n to get this specific request.\r\n

\r\n\r\n

Or you can view all requests with:
\r\n \r\n client.requests\r\n \r\n

\r\n\r\n
\r\n
\r\n

If you did not expect this request or have concerns about it,\r\n please contact our support team immediately.

\r\n
\r\n
\r\n This is an automated message, please do not reply directly to this email.
\r\n For assistance, please contact our support team.\r\n
\r\n
\r\n \r\n \r\n--===============5221322304721055502==--\r\n" }, { "email_from": "noreply@openmined.org", "email_to": ["admin@bigquery.org"], - "email_content": "Content-Type: multipart/alternative; boundary=\"===============3085645257172386883==\"\r\nMIME-Version: 1.0\r\nFrom: noreply@openmined.org\r\nTo: admin@bigquery.org\r\nSubject: Datasite bigquery-high-migrations: A New Request (7400) has been received!\r\n\r\n--===============3085645257172386883==\r\nContent-Type: text/html; charset=\"us-ascii\"\r\nMIME-Version: 1.0\r\nContent-Transfer-Encoding: 7bit\r\n\r\n\r\n \r\n Access Request Notification\r\n \r\n \r\n \r\n
\r\n
\r\n Request Notification\r\n
\r\n
\r\n

Hello,

\r\n

A new request has been submitted and requires your attention.\r\n Please review the details below:

\r\n\r\n
\r\n
Request Details
\r\n
\r\n\r\n

ID: 74006c5a15c54d6d96c7a5fa4adce03e

\r\n

\r\n Submitted By:\r\n John Garrett\r\n

\r\n

Date: 2024-09-23 09:31:53

\r\n

Status:

\r\n PENDING\r\n
\r\n

Changes:\r\n UserCodeStatusChange\r\n

\r\n\r\n

Use:
\r\n \r\n request = client.api.services.request.get_by_uid(uid=sy.UID(\"74006c5a15c54d6d96c7a5fa4adce03e\"))\r\n
\r\n to get this specific request.\r\n

\r\n\r\n

Or you can view all requests with:
\r\n \r\n client.requests\r\n \r\n

\r\n\r\n
\r\n
\r\n

If you did not expect this request or have concerns about it,\r\n please contact our support team immediately.

\r\n
\r\n
\r\n This is an automated message, please do not reply directly to this email.
\r\n For assistance, please contact our support team.\r\n
\r\n
\r\n \r\n \r\n--===============3085645257172386883==--\r\n" + "email_content": "Content-Type: multipart/alternative; boundary=\"===============7638781143527035342==\"\r\nMIME-Version: 1.0\r\nFrom: noreply@openmined.org\r\nTo: admin@bigquery.org\r\nSubject: Datasite bigquery-high-migrations: A New Request (b910) has been received!\r\n\r\n--===============7638781143527035342==\r\nContent-Type: text/html; charset=\"us-ascii\"\r\nMIME-Version: 1.0\r\nContent-Transfer-Encoding: 7bit\r\n\r\n\r\n \r\n Access Request Notification\r\n \r\n \r\n \r\n
\r\n
\r\n Request Notification\r\n
\r\n
\r\n

Hello,

\r\n

A new request has been submitted and requires your attention.\r\n Please review the details below:

\r\n\r\n
\r\n
Request Details
\r\n
\r\n\r\n

ID: b91086795fda4b2aa8978ae1d4449f78

\r\n

\r\n Submitted By:\r\n Ian Ray\r\n

\r\n

Date: 2024-09-23 10:24:20

\r\n

Status:

\r\n PENDING\r\n
\r\n

Changes:\r\n UserCodeStatusChange\r\n

\r\n\r\n

Use:
\r\n \r\n request = client.api.services.request.get_by_uid(uid=sy.UID(\"b91086795fda4b2aa8978ae1d4449f78\"))\r\n
\r\n to get this specific request.\r\n

\r\n\r\n

Or you can view all requests with:
\r\n \r\n client.requests\r\n \r\n

\r\n\r\n
\r\n
\r\n

If you did not expect this request or have concerns about it,\r\n please contact our support team immediately.

\r\n
\r\n
\r\n This is an automated message, please do not reply directly to this email.
\r\n For assistance, please contact our support team.\r\n
\r\n
\r\n \r\n \r\n--===============7638781143527035342==--\r\n" } ], - "eric-hahn-fake@openmined.org": [ + "lisa-clark-fake@openmined.org": [ { "email_from": "noreply@openmined.org", - "email_to": ["eric-hahn-fake@openmined.org"], - "email_content": "Content-Type: multipart/alternative; boundary=\"===============0087264072714649521==\"\r\nMIME-Version: 1.0\r\nFrom: noreply@openmined.org\r\nTo: eric-hahn-fake@openmined.org\r\nSubject: Datasite bigquery-high-migrations: Your request (1eb3) has been approved. \r\n\r\n--===============0087264072714649521==\r\nContent-Type: text/html; charset=\"us-ascii\"\r\nMIME-Version: 1.0\r\nContent-Transfer-Encoding: 7bit\r\n\r\n\r\n \r\n Access Request Notification\r\n \r\n \r\n \r\n
\r\n
\r\n Request Notification\r\n
\r\n
\r\n

Hello,

\r\n

The status of your recent request has been updated.\r\n Below is the latest information regarding it:

\r\n\r\n
\r\n
Request Details
\r\n
\r\n\r\n

ID: 1eb3b8a2579a4b8db00b2de5e10de974

\r\n

\r\n Submitted By:\r\n Eric Hahn eric-hahn-fake@openmined.org\r\n

\r\n

Date: 2024-09-23 09:30:48

\r\n

Status:

\r\n APPROVED\r\n
\r\n

\r\n Changes:\r\n UserCodeStatusChange\r\n

\r\n\r\n

Use:
\r\n \r\n request = client.api.services.request.get_by_uid(uid=sy.UID(\"1eb3b8a2579a4b8db00b2de5e10de974\"))\r\n
\r\n to get this specific request.\r\n

\r\n\r\n

Or you can view all requests with:
\r\n \r\n client.requests\r\n \r\n

\r\n
\r\n
\r\n

If you did not expect this request or have concerns about it,\r\n please contact our support team immediately.

\r\n
\r\n
\r\n This is an automated message, please do not reply directly to this email.
\r\n For assistance, please contact our support team.\r\n
\r\n
\r\n \r\n \r\n--===============0087264072714649521==--\r\n" + "email_to": ["lisa-clark-fake@openmined.org"], + "email_content": "Content-Type: multipart/alternative; boundary=\"===============0070695112275164508==\"\r\nMIME-Version: 1.0\r\nFrom: noreply@openmined.org\r\nTo: lisa-clark-fake@openmined.org\r\nSubject: Datasite bigquery-high-migrations: Your request (a850) has been approved. \r\n\r\n--===============0070695112275164508==\r\nContent-Type: text/html; charset=\"us-ascii\"\r\nMIME-Version: 1.0\r\nContent-Transfer-Encoding: 7bit\r\n\r\n\r\n \r\n Access Request Notification\r\n \r\n \r\n \r\n
\r\n
\r\n Request Notification\r\n
\r\n
\r\n

Hello,

\r\n

The status of your recent request has been updated.\r\n Below is the latest information regarding it:

\r\n\r\n
\r\n
Request Details
\r\n
\r\n\r\n

ID: a850407831c64b928c4733db4393bb84

\r\n

\r\n Submitted By:\r\n Lisa Clark lisa-clark-fake@openmined.org\r\n

\r\n

Date: 2024-09-23 10:23:08

\r\n

Status:

\r\n APPROVED\r\n
\r\n

\r\n Changes:\r\n UserCodeStatusChange\r\n

\r\n\r\n

Use:
\r\n \r\n request = client.api.services.request.get_by_uid(uid=sy.UID(\"a850407831c64b928c4733db4393bb84\"))\r\n
\r\n to get this specific request.\r\n

\r\n\r\n

Or you can view all requests with:
\r\n \r\n client.requests\r\n \r\n

\r\n
\r\n
\r\n

If you did not expect this request or have concerns about it,\r\n please contact our support team immediately.

\r\n
\r\n
\r\n This is an automated message, please do not reply directly to this email.
\r\n For assistance, please contact our support team.\r\n
\r\n
\r\n \r\n \r\n--===============0070695112275164508==--\r\n" }, { "email_from": "noreply@openmined.org", - "email_to": ["eric-hahn-fake@openmined.org"], - "email_content": "Content-Type: multipart/alternative; boundary=\"===============4616762255463387364==\"\r\nMIME-Version: 1.0\r\nFrom: noreply@openmined.org\r\nTo: eric-hahn-fake@openmined.org\r\nSubject: Datasite bigquery-high-migrations: Your request (ea2b) has been denied. \r\n\r\n--===============4616762255463387364==\r\nContent-Type: text/html; charset=\"us-ascii\"\r\nMIME-Version: 1.0\r\nContent-Transfer-Encoding: 7bit\r\n\r\n\r\n \r\n Access Request Notification\r\n \r\n \r\n \r\n
\r\n
\r\n Request Notification\r\n
\r\n
\r\n

Hello,

\r\n

The status of your recent request has been updated.\r\n Below is the latest information regarding it:

\r\n\r\n
\r\n
Request Details
\r\n
\r\n\r\n

ID: ea2b120ac5fc44b496fad22448813338

\r\n

\r\n Submitted By:\r\n Eric Hahn eric-hahn-fake@openmined.org\r\n

\r\n

Date: 2024-09-23 09:31:35

\r\n

Status:

\r\n REJECTED\r\n
\r\n

\r\n Changes:\r\n UserCodeStatusChange\r\n

\r\n\r\n

Use:
\r\n \r\n request = client.api.services.request.get_by_uid(uid=sy.UID(\"ea2b120ac5fc44b496fad22448813338\"))\r\n
\r\n to get this specific request.\r\n

\r\n\r\n

Or you can view all requests with:
\r\n \r\n client.requests\r\n \r\n

\r\n
\r\n
\r\n

If you did not expect this request or have concerns about it,\r\n please contact our support team immediately.

\r\n
\r\n
\r\n This is an automated message, please do not reply directly to this email.
\r\n For assistance, please contact our support team.\r\n
\r\n
\r\n \r\n \r\n--===============4616762255463387364==--\r\n" + "email_to": ["lisa-clark-fake@openmined.org"], + "email_content": "Content-Type: multipart/alternative; boundary=\"===============6956594247645420946==\"\r\nMIME-Version: 1.0\r\nFrom: noreply@openmined.org\r\nTo: lisa-clark-fake@openmined.org\r\nSubject: Datasite bigquery-high-migrations: Your request (a850) has been approved. \r\n\r\n--===============6956594247645420946==\r\nContent-Type: text/html; charset=\"us-ascii\"\r\nMIME-Version: 1.0\r\nContent-Transfer-Encoding: 7bit\r\n\r\n\r\n \r\n Access Request Notification\r\n \r\n \r\n \r\n
\r\n
\r\n Request Notification\r\n
\r\n
\r\n

Hello,

\r\n

The status of your recent request has been updated.\r\n Below is the latest information regarding it:

\r\n\r\n
\r\n
Request Details
\r\n
\r\n\r\n

ID: a850407831c64b928c4733db4393bb84

\r\n

\r\n Submitted By:\r\n Lisa Clark lisa-clark-fake@openmined.org\r\n

\r\n

Date: 2024-09-23 10:23:08

\r\n

Status:

\r\n APPROVED\r\n
\r\n

\r\n Changes:\r\n UserCodeStatusChange,ActionStoreChange\r\n

\r\n\r\n

Use:
\r\n \r\n request = client.api.services.request.get_by_uid(uid=sy.UID(\"a850407831c64b928c4733db4393bb84\"))\r\n
\r\n to get this specific request.\r\n

\r\n\r\n

Or you can view all requests with:
\r\n \r\n client.requests\r\n \r\n

\r\n
\r\n
\r\n

If you did not expect this request or have concerns about it,\r\n please contact our support team immediately.

\r\n
\r\n
\r\n This is an automated message, please do not reply directly to this email.
\r\n For assistance, please contact our support team.\r\n
\r\n
\r\n \r\n \r\n--===============6956594247645420946==--\r\n" + }, + { + "email_from": "noreply@openmined.org", + "email_to": ["lisa-clark-fake@openmined.org"], + "email_content": "Content-Type: multipart/alternative; boundary=\"===============4955025587982972474==\"\r\nMIME-Version: 1.0\r\nFrom: noreply@openmined.org\r\nTo: lisa-clark-fake@openmined.org\r\nSubject: Datasite bigquery-high-migrations: Your request (1418) has been denied. \r\n\r\n--===============4955025587982972474==\r\nContent-Type: text/html; charset=\"us-ascii\"\r\nMIME-Version: 1.0\r\nContent-Transfer-Encoding: 7bit\r\n\r\n\r\n \r\n Access Request Notification\r\n \r\n \r\n \r\n
\r\n
\r\n Request Notification\r\n
\r\n
\r\n

Hello,

\r\n

The status of your recent request has been updated.\r\n Below is the latest information regarding it:

\r\n\r\n
\r\n
Request Details
\r\n
\r\n\r\n

ID: 141875e5343a48c8aef17f642a8c91e7

\r\n

\r\n Submitted By:\r\n Lisa Clark lisa-clark-fake@openmined.org\r\n

\r\n

Date: 2024-09-23 10:23:59

\r\n

Status:

\r\n REJECTED\r\n
\r\n

\r\n Changes:\r\n UserCodeStatusChange\r\n

\r\n\r\n

Use:
\r\n \r\n request = client.api.services.request.get_by_uid(uid=sy.UID(\"141875e5343a48c8aef17f642a8c91e7\"))\r\n
\r\n to get this specific request.\r\n

\r\n\r\n

Or you can view all requests with:
\r\n \r\n client.requests\r\n \r\n

\r\n
\r\n
\r\n

If you did not expect this request or have concerns about it,\r\n please contact our support team immediately.

\r\n
\r\n
\r\n This is an automated message, please do not reply directly to this email.
\r\n For assistance, please contact our support team.\r\n
\r\n
\r\n \r\n \r\n--===============4955025587982972474==--\r\n" } ], - "paul-lloyd-fake@openmined.org": [ + "anthony-simpson-fake@openmined.org": [ { "email_from": "noreply@openmined.org", - "email_to": ["paul-lloyd-fake@openmined.org"], - "email_content": "Content-Type: multipart/alternative; boundary=\"===============7536925844563160043==\"\r\nMIME-Version: 1.0\r\nFrom: noreply@openmined.org\r\nTo: paul-lloyd-fake@openmined.org\r\nSubject: Datasite bigquery-high-migrations: Your request (bcb3) has been approved. \r\n\r\n--===============7536925844563160043==\r\nContent-Type: text/html; charset=\"us-ascii\"\r\nMIME-Version: 1.0\r\nContent-Transfer-Encoding: 7bit\r\n\r\n\r\n \r\n Access Request Notification\r\n \r\n \r\n \r\n
\r\n
\r\n Request Notification\r\n
\r\n
\r\n

Hello,

\r\n

The status of your recent request has been updated.\r\n Below is the latest information regarding it:

\r\n\r\n
\r\n
Request Details
\r\n
\r\n\r\n

ID: bcb34404327a41fa8592ff5aefbc72f1

\r\n

\r\n Submitted By:\r\n Paul Lloyd paul-lloyd-fake@openmined.org\r\n

\r\n

Date: 2024-09-23 09:30:57

\r\n

Status:

\r\n APPROVED\r\n
\r\n

\r\n Changes:\r\n UserCodeStatusChange\r\n

\r\n\r\n

Use:
\r\n \r\n request = client.api.services.request.get_by_uid(uid=sy.UID(\"bcb34404327a41fa8592ff5aefbc72f1\"))\r\n
\r\n to get this specific request.\r\n

\r\n\r\n

Or you can view all requests with:
\r\n \r\n client.requests\r\n \r\n

\r\n
\r\n
\r\n

If you did not expect this request or have concerns about it,\r\n please contact our support team immediately.

\r\n
\r\n
\r\n This is an automated message, please do not reply directly to this email.
\r\n For assistance, please contact our support team.\r\n
\r\n
\r\n \r\n \r\n--===============7536925844563160043==--\r\n" + "email_to": ["anthony-simpson-fake@openmined.org"], + "email_content": "Content-Type: multipart/alternative; boundary=\"===============4618684281710170390==\"\r\nMIME-Version: 1.0\r\nFrom: noreply@openmined.org\r\nTo: anthony-simpson-fake@openmined.org\r\nSubject: Datasite bigquery-high-migrations: Your request (e0cf) has been approved. \r\n\r\n--===============4618684281710170390==\r\nContent-Type: text/html; charset=\"us-ascii\"\r\nMIME-Version: 1.0\r\nContent-Transfer-Encoding: 7bit\r\n\r\n\r\n \r\n Access Request Notification\r\n \r\n \r\n \r\n
\r\n
\r\n Request Notification\r\n
\r\n
\r\n

Hello,

\r\n

The status of your recent request has been updated.\r\n Below is the latest information regarding it:

\r\n\r\n
\r\n
Request Details
\r\n
\r\n\r\n

ID: e0cf4aec1e80443fb49b54ab1ee460c3

\r\n

\r\n Submitted By:\r\n Anthony Simpson anthony-simpson-fake@openmined.org\r\n

\r\n

Date: 2024-09-23 10:23:18

\r\n

Status:

\r\n APPROVED\r\n
\r\n

\r\n Changes:\r\n UserCodeStatusChange\r\n

\r\n\r\n

Use:
\r\n \r\n request = client.api.services.request.get_by_uid(uid=sy.UID(\"e0cf4aec1e80443fb49b54ab1ee460c3\"))\r\n
\r\n to get this specific request.\r\n

\r\n\r\n

Or you can view all requests with:
\r\n \r\n client.requests\r\n \r\n

\r\n
\r\n
\r\n

If you did not expect this request or have concerns about it,\r\n please contact our support team immediately.

\r\n
\r\n
\r\n This is an automated message, please do not reply directly to this email.
\r\n For assistance, please contact our support team.\r\n
\r\n
\r\n \r\n \r\n--===============4618684281710170390==--\r\n" }, { "email_from": "noreply@openmined.org", - "email_to": ["paul-lloyd-fake@openmined.org"], - "email_content": "Content-Type: multipart/alternative; boundary=\"===============0033828269783680003==\"\r\nMIME-Version: 1.0\r\nFrom: noreply@openmined.org\r\nTo: paul-lloyd-fake@openmined.org\r\nSubject: Datasite bigquery-high-migrations: Your request (ee9c) has been denied. \r\n\r\n--===============0033828269783680003==\r\nContent-Type: text/html; charset=\"us-ascii\"\r\nMIME-Version: 1.0\r\nContent-Transfer-Encoding: 7bit\r\n\r\n\r\n \r\n Access Request Notification\r\n \r\n \r\n \r\n
\r\n
\r\n Request Notification\r\n
\r\n
\r\n

Hello,

\r\n

The status of your recent request has been updated.\r\n Below is the latest information regarding it:

\r\n\r\n
\r\n
Request Details
\r\n
\r\n\r\n

ID: ee9c2f4e3a7d401caedaa9bb216ce272

\r\n

\r\n Submitted By:\r\n Paul Lloyd paul-lloyd-fake@openmined.org\r\n

\r\n

Date: 2024-09-23 09:31:44

\r\n

Status:

\r\n REJECTED\r\n
\r\n

\r\n Changes:\r\n UserCodeStatusChange\r\n

\r\n\r\n

Use:
\r\n \r\n request = client.api.services.request.get_by_uid(uid=sy.UID(\"ee9c2f4e3a7d401caedaa9bb216ce272\"))\r\n
\r\n to get this specific request.\r\n

\r\n\r\n

Or you can view all requests with:
\r\n \r\n client.requests\r\n \r\n

\r\n
\r\n
\r\n

If you did not expect this request or have concerns about it,\r\n please contact our support team immediately.

\r\n
\r\n
\r\n This is an automated message, please do not reply directly to this email.
\r\n For assistance, please contact our support team.\r\n
\r\n
\r\n \r\n \r\n--===============0033828269783680003==--\r\n" + "email_to": ["anthony-simpson-fake@openmined.org"], + "email_content": "Content-Type: multipart/alternative; boundary=\"===============4796926491134373799==\"\r\nMIME-Version: 1.0\r\nFrom: noreply@openmined.org\r\nTo: anthony-simpson-fake@openmined.org\r\nSubject: Datasite bigquery-high-migrations: Your request (8fae) has been denied. \r\n\r\n--===============4796926491134373799==\r\nContent-Type: text/html; charset=\"us-ascii\"\r\nMIME-Version: 1.0\r\nContent-Transfer-Encoding: 7bit\r\n\r\n\r\n \r\n Access Request Notification\r\n \r\n \r\n \r\n
\r\n
\r\n Request Notification\r\n
\r\n
\r\n

Hello,

\r\n

The status of your recent request has been updated.\r\n Below is the latest information regarding it:

\r\n\r\n
\r\n
Request Details
\r\n
\r\n\r\n

ID: 8fae4312f60742b093c89a968d2a1453

\r\n

\r\n Submitted By:\r\n Anthony Simpson anthony-simpson-fake@openmined.org\r\n

\r\n

Date: 2024-09-23 10:24:09

\r\n

Status:

\r\n REJECTED\r\n
\r\n

\r\n Changes:\r\n UserCodeStatusChange\r\n

\r\n\r\n

Use:
\r\n \r\n request = client.api.services.request.get_by_uid(uid=sy.UID(\"8fae4312f60742b093c89a968d2a1453\"))\r\n
\r\n to get this specific request.\r\n

\r\n\r\n

Or you can view all requests with:
\r\n \r\n client.requests\r\n \r\n

\r\n
\r\n
\r\n

If you did not expect this request or have concerns about it,\r\n please contact our support team immediately.

\r\n
\r\n
\r\n This is an automated message, please do not reply directly to this email.
\r\n For assistance, please contact our support team.\r\n
\r\n
\r\n \r\n \r\n--===============4796926491134373799==--\r\n" } ], - "john-garrett-fake@openmined.org": [ + "ian-ray-fake@openmined.org": [ + { + "email_from": "noreply@openmined.org", + "email_to": ["ian-ray-fake@openmined.org"], + "email_content": "Content-Type: multipart/alternative; boundary=\"===============3263288618826687943==\"\r\nMIME-Version: 1.0\r\nFrom: noreply@openmined.org\r\nTo: ian-ray-fake@openmined.org\r\nSubject: Datasite bigquery-high-migrations: Your request (291e) has been approved. \r\n\r\n--===============3263288618826687943==\r\nContent-Type: text/html; charset=\"us-ascii\"\r\nMIME-Version: 1.0\r\nContent-Transfer-Encoding: 7bit\r\n\r\n\r\n \r\n Access Request Notification\r\n \r\n \r\n \r\n
\r\n
\r\n Request Notification\r\n
\r\n
\r\n

Hello,

\r\n

The status of your recent request has been updated.\r\n Below is the latest information regarding it:

\r\n\r\n
\r\n
Request Details
\r\n
\r\n\r\n

ID: 291ec8c54d594443ba5cdd39176c506d

\r\n

\r\n Submitted By:\r\n Ian Ray ian-ray-fake@openmined.org\r\n

\r\n

Date: 2024-09-23 10:23:28

\r\n

Status:

\r\n APPROVED\r\n
\r\n

\r\n Changes:\r\n UserCodeStatusChange\r\n

\r\n\r\n

Use:
\r\n \r\n request = client.api.services.request.get_by_uid(uid=sy.UID(\"291ec8c54d594443ba5cdd39176c506d\"))\r\n
\r\n to get this specific request.\r\n

\r\n\r\n

Or you can view all requests with:
\r\n \r\n client.requests\r\n \r\n

\r\n
\r\n
\r\n

If you did not expect this request or have concerns about it,\r\n please contact our support team immediately.

\r\n
\r\n
\r\n This is an automated message, please do not reply directly to this email.
\r\n For assistance, please contact our support team.\r\n
\r\n
\r\n \r\n \r\n--===============3263288618826687943==--\r\n" + }, { "email_from": "noreply@openmined.org", - "email_to": ["john-garrett-fake@openmined.org"], - "email_content": "Content-Type: multipart/alternative; boundary=\"===============2667553230066125737==\"\r\nMIME-Version: 1.0\r\nFrom: noreply@openmined.org\r\nTo: john-garrett-fake@openmined.org\r\nSubject: Datasite bigquery-high-migrations: Your request (df0f) has been approved. \r\n\r\n--===============2667553230066125737==\r\nContent-Type: text/html; charset=\"us-ascii\"\r\nMIME-Version: 1.0\r\nContent-Transfer-Encoding: 7bit\r\n\r\n\r\n \r\n Access Request Notification\r\n \r\n \r\n \r\n
\r\n
\r\n Request Notification\r\n
\r\n
\r\n

Hello,

\r\n

The status of your recent request has been updated.\r\n Below is the latest information regarding it:

\r\n\r\n
\r\n
Request Details
\r\n
\r\n\r\n

ID: df0f392826c04242bbb07c9be6a0db05

\r\n

\r\n Submitted By:\r\n John Garrett john-garrett-fake@openmined.org\r\n

\r\n

Date: 2024-09-23 09:31:06

\r\n

Status:

\r\n APPROVED\r\n
\r\n

\r\n Changes:\r\n UserCodeStatusChange\r\n

\r\n\r\n

Use:
\r\n \r\n request = client.api.services.request.get_by_uid(uid=sy.UID(\"df0f392826c04242bbb07c9be6a0db05\"))\r\n
\r\n to get this specific request.\r\n

\r\n\r\n

Or you can view all requests with:
\r\n \r\n client.requests\r\n \r\n

\r\n
\r\n
\r\n

If you did not expect this request or have concerns about it,\r\n please contact our support team immediately.

\r\n
\r\n
\r\n This is an automated message, please do not reply directly to this email.
\r\n For assistance, please contact our support team.\r\n
\r\n
\r\n \r\n \r\n--===============2667553230066125737==--\r\n" + "email_to": ["ian-ray-fake@openmined.org"], + "email_content": "Content-Type: multipart/alternative; boundary=\"===============9068082627312456525==\"\r\nMIME-Version: 1.0\r\nFrom: noreply@openmined.org\r\nTo: ian-ray-fake@openmined.org\r\nSubject: Datasite bigquery-high-migrations: Your request (291e) has been approved. \r\n\r\n--===============9068082627312456525==\r\nContent-Type: text/html; charset=\"us-ascii\"\r\nMIME-Version: 1.0\r\nContent-Transfer-Encoding: 7bit\r\n\r\n\r\n \r\n Access Request Notification\r\n \r\n \r\n \r\n
\r\n
\r\n Request Notification\r\n
\r\n
\r\n

Hello,

\r\n

The status of your recent request has been updated.\r\n Below is the latest information regarding it:

\r\n\r\n
\r\n
Request Details
\r\n
\r\n\r\n

ID: 291ec8c54d594443ba5cdd39176c506d

\r\n

\r\n Submitted By:\r\n Ian Ray ian-ray-fake@openmined.org\r\n

\r\n

Date: 2024-09-23 10:23:28

\r\n

Status:

\r\n APPROVED\r\n
\r\n

\r\n Changes:\r\n UserCodeStatusChange,ActionStoreChange\r\n

\r\n\r\n

Use:
\r\n \r\n request = client.api.services.request.get_by_uid(uid=sy.UID(\"291ec8c54d594443ba5cdd39176c506d\"))\r\n
\r\n to get this specific request.\r\n

\r\n\r\n

Or you can view all requests with:
\r\n \r\n client.requests\r\n \r\n

\r\n
\r\n
\r\n

If you did not expect this request or have concerns about it,\r\n please contact our support team immediately.

\r\n
\r\n
\r\n This is an automated message, please do not reply directly to this email.
\r\n For assistance, please contact our support team.\r\n
\r\n
\r\n \r\n \r\n--===============9068082627312456525==--\r\n" }, { "email_from": "noreply@openmined.org", - "email_to": ["john-garrett-fake@openmined.org"], - "email_content": "Content-Type: multipart/alternative; boundary=\"===============6802697036125412429==\"\r\nMIME-Version: 1.0\r\nFrom: noreply@openmined.org\r\nTo: john-garrett-fake@openmined.org\r\nSubject: Datasite bigquery-high-migrations: Your request (df0f) has been approved. \r\n\r\n--===============6802697036125412429==\r\nContent-Type: text/html; charset=\"us-ascii\"\r\nMIME-Version: 1.0\r\nContent-Transfer-Encoding: 7bit\r\n\r\n\r\n \r\n Access Request Notification\r\n \r\n \r\n \r\n
\r\n
\r\n Request Notification\r\n
\r\n
\r\n

Hello,

\r\n

The status of your recent request has been updated.\r\n Below is the latest information regarding it:

\r\n\r\n
\r\n
Request Details
\r\n
\r\n\r\n

ID: df0f392826c04242bbb07c9be6a0db05

\r\n

\r\n Submitted By:\r\n John Garrett john-garrett-fake@openmined.org\r\n

\r\n

Date: 2024-09-23 09:31:06

\r\n

Status:

\r\n APPROVED\r\n
\r\n

\r\n Changes:\r\n UserCodeStatusChange,ActionStoreChange\r\n

\r\n\r\n

Use:
\r\n \r\n request = client.api.services.request.get_by_uid(uid=sy.UID(\"df0f392826c04242bbb07c9be6a0db05\"))\r\n
\r\n to get this specific request.\r\n

\r\n\r\n

Or you can view all requests with:
\r\n \r\n client.requests\r\n \r\n

\r\n
\r\n
\r\n

If you did not expect this request or have concerns about it,\r\n please contact our support team immediately.

\r\n
\r\n
\r\n This is an automated message, please do not reply directly to this email.
\r\n For assistance, please contact our support team.\r\n
\r\n
\r\n \r\n \r\n--===============6802697036125412429==--\r\n" + "email_to": ["ian-ray-fake@openmined.org"], + "email_content": "Content-Type: multipart/alternative; boundary=\"===============5570947561616756360==\"\r\nMIME-Version: 1.0\r\nFrom: noreply@openmined.org\r\nTo: ian-ray-fake@openmined.org\r\nSubject: Datasite bigquery-high-migrations: Your request (b910) has been approved. \r\n\r\n--===============5570947561616756360==\r\nContent-Type: text/html; charset=\"us-ascii\"\r\nMIME-Version: 1.0\r\nContent-Transfer-Encoding: 7bit\r\n\r\n\r\n \r\n Access Request Notification\r\n \r\n \r\n \r\n
\r\n
\r\n Request Notification\r\n
\r\n
\r\n

Hello,

\r\n

The status of your recent request has been updated.\r\n Below is the latest information regarding it:

\r\n\r\n
\r\n
Request Details
\r\n
\r\n\r\n

ID: b91086795fda4b2aa8978ae1d4449f78

\r\n

\r\n Submitted By:\r\n Ian Ray ian-ray-fake@openmined.org\r\n

\r\n

Date: 2024-09-23 10:24:20

\r\n

Status:

\r\n APPROVED\r\n
\r\n

\r\n Changes:\r\n UserCodeStatusChange\r\n

\r\n\r\n

Use:
\r\n \r\n request = client.api.services.request.get_by_uid(uid=sy.UID(\"b91086795fda4b2aa8978ae1d4449f78\"))\r\n
\r\n to get this specific request.\r\n

\r\n\r\n

Or you can view all requests with:
\r\n \r\n client.requests\r\n \r\n

\r\n
\r\n
\r\n

If you did not expect this request or have concerns about it,\r\n please contact our support team immediately.

\r\n
\r\n
\r\n This is an automated message, please do not reply directly to this email.
\r\n For assistance, please contact our support team.\r\n
\r\n
\r\n \r\n \r\n--===============5570947561616756360==--\r\n" }, { "email_from": "noreply@openmined.org", - "email_to": ["john-garrett-fake@openmined.org"], - "email_content": "Content-Type: multipart/alternative; boundary=\"===============6669303170158844316==\"\r\nMIME-Version: 1.0\r\nFrom: noreply@openmined.org\r\nTo: john-garrett-fake@openmined.org\r\nSubject: Datasite bigquery-high-migrations: Your request (7400) has been approved. \r\n\r\n--===============6669303170158844316==\r\nContent-Type: text/html; charset=\"us-ascii\"\r\nMIME-Version: 1.0\r\nContent-Transfer-Encoding: 7bit\r\n\r\n\r\n \r\n Access Request Notification\r\n \r\n \r\n \r\n
\r\n
\r\n Request Notification\r\n
\r\n
\r\n

Hello,

\r\n

The status of your recent request has been updated.\r\n Below is the latest information regarding it:

\r\n\r\n
\r\n
Request Details
\r\n
\r\n\r\n

ID: 74006c5a15c54d6d96c7a5fa4adce03e

\r\n

\r\n Submitted By:\r\n John Garrett john-garrett-fake@openmined.org\r\n

\r\n

Date: 2024-09-23 09:31:53

\r\n

Status:

\r\n APPROVED\r\n
\r\n

\r\n Changes:\r\n UserCodeStatusChange\r\n

\r\n\r\n

Use:
\r\n \r\n request = client.api.services.request.get_by_uid(uid=sy.UID(\"74006c5a15c54d6d96c7a5fa4adce03e\"))\r\n
\r\n to get this specific request.\r\n

\r\n\r\n

Or you can view all requests with:
\r\n \r\n client.requests\r\n \r\n

\r\n
\r\n
\r\n

If you did not expect this request or have concerns about it,\r\n please contact our support team immediately.

\r\n
\r\n
\r\n This is an automated message, please do not reply directly to this email.
\r\n For assistance, please contact our support team.\r\n
\r\n
\r\n \r\n \r\n--===============6669303170158844316==--\r\n" + "email_to": ["ian-ray-fake@openmined.org"], + "email_content": "Content-Type: multipart/alternative; boundary=\"===============2122230739167057876==\"\r\nMIME-Version: 1.0\r\nFrom: noreply@openmined.org\r\nTo: ian-ray-fake@openmined.org\r\nSubject: Datasite bigquery-high-migrations: Your request (b910) has been approved. \r\n\r\n--===============2122230739167057876==\r\nContent-Type: text/html; charset=\"us-ascii\"\r\nMIME-Version: 1.0\r\nContent-Transfer-Encoding: 7bit\r\n\r\n\r\n \r\n Access Request Notification\r\n \r\n \r\n \r\n
\r\n
\r\n Request Notification\r\n
\r\n
\r\n

Hello,

\r\n

The status of your recent request has been updated.\r\n Below is the latest information regarding it:

\r\n\r\n
\r\n
Request Details
\r\n
\r\n\r\n

ID: b91086795fda4b2aa8978ae1d4449f78

\r\n

\r\n Submitted By:\r\n Ian Ray ian-ray-fake@openmined.org\r\n

\r\n

Date: 2024-09-23 10:24:20

\r\n

Status:

\r\n APPROVED\r\n
\r\n

\r\n Changes:\r\n UserCodeStatusChange,ActionStoreChange\r\n

\r\n\r\n

Use:
\r\n \r\n request = client.api.services.request.get_by_uid(uid=sy.UID(\"b91086795fda4b2aa8978ae1d4449f78\"))\r\n
\r\n to get this specific request.\r\n

\r\n\r\n

Or you can view all requests with:
\r\n \r\n client.requests\r\n \r\n

\r\n
\r\n
\r\n

If you did not expect this request or have concerns about it,\r\n please contact our support team immediately.

\r\n
\r\n
\r\n This is an automated message, please do not reply directly to this email.
\r\n For assistance, please contact our support team.\r\n
\r\n
\r\n \r\n \r\n--===============2122230739167057876==--\r\n" } ], - "anthony-escobar-fake@openmined.org": [ + "marie-russo-fake@openmined.org": [ { "email_from": "noreply@openmined.org", - "email_to": ["anthony-escobar-fake@openmined.org"], - "email_content": "Content-Type: multipart/alternative; boundary=\"===============1253022428436437486==\"\r\nMIME-Version: 1.0\r\nFrom: noreply@openmined.org\r\nTo: anthony-escobar-fake@openmined.org\r\nSubject: Datasite bigquery-high-migrations: Your request (5614) has been approved. \r\n\r\n--===============1253022428436437486==\r\nContent-Type: text/html; charset=\"us-ascii\"\r\nMIME-Version: 1.0\r\nContent-Transfer-Encoding: 7bit\r\n\r\n\r\n \r\n Access Request Notification\r\n \r\n \r\n \r\n
\r\n
\r\n Request Notification\r\n
\r\n
\r\n

Hello,

\r\n

The status of your recent request has been updated.\r\n Below is the latest information regarding it:

\r\n\r\n
\r\n
Request Details
\r\n
\r\n\r\n

ID: 5614eb0d753942cc8205bb7d784e8896

\r\n

\r\n Submitted By:\r\n Anthony Escobar anthony-escobar-fake@openmined.org\r\n

\r\n

Date: 2024-09-23 09:31:16

\r\n

Status:

\r\n APPROVED\r\n
\r\n

\r\n Changes:\r\n UserCodeStatusChange\r\n

\r\n\r\n

Use:
\r\n \r\n request = client.api.services.request.get_by_uid(uid=sy.UID(\"5614eb0d753942cc8205bb7d784e8896\"))\r\n
\r\n to get this specific request.\r\n

\r\n\r\n

Or you can view all requests with:
\r\n \r\n client.requests\r\n \r\n

\r\n
\r\n
\r\n

If you did not expect this request or have concerns about it,\r\n please contact our support team immediately.

\r\n
\r\n
\r\n This is an automated message, please do not reply directly to this email.
\r\n For assistance, please contact our support team.\r\n
\r\n
\r\n \r\n \r\n--===============1253022428436437486==--\r\n" + "email_to": ["marie-russo-fake@openmined.org"], + "email_content": "Content-Type: multipart/alternative; boundary=\"===============6066415345440146385==\"\r\nMIME-Version: 1.0\r\nFrom: noreply@openmined.org\r\nTo: marie-russo-fake@openmined.org\r\nSubject: Datasite bigquery-high-migrations: Your request (3573) has been approved. \r\n\r\n--===============6066415345440146385==\r\nContent-Type: text/html; charset=\"us-ascii\"\r\nMIME-Version: 1.0\r\nContent-Transfer-Encoding: 7bit\r\n\r\n\r\n \r\n Access Request Notification\r\n \r\n \r\n \r\n
\r\n
\r\n Request Notification\r\n
\r\n
\r\n

Hello,

\r\n

The status of your recent request has been updated.\r\n Below is the latest information regarding it:

\r\n\r\n
\r\n
Request Details
\r\n
\r\n\r\n

ID: 35736f1adf34471a8d805e53d29883ed

\r\n

\r\n Submitted By:\r\n Marie Russo marie-russo-fake@openmined.org\r\n

\r\n

Date: 2024-09-23 10:23:39

\r\n

Status:

\r\n APPROVED\r\n
\r\n

\r\n Changes:\r\n UserCodeStatusChange\r\n

\r\n\r\n

Use:
\r\n \r\n request = client.api.services.request.get_by_uid(uid=sy.UID(\"35736f1adf34471a8d805e53d29883ed\"))\r\n
\r\n to get this specific request.\r\n

\r\n\r\n

Or you can view all requests with:
\r\n \r\n client.requests\r\n \r\n

\r\n
\r\n
\r\n

If you did not expect this request or have concerns about it,\r\n please contact our support team immediately.

\r\n
\r\n
\r\n This is an automated message, please do not reply directly to this email.
\r\n For assistance, please contact our support team.\r\n
\r\n
\r\n \r\n \r\n--===============6066415345440146385==--\r\n" } ] } diff --git a/notebooks/scenarios/bigquery/upgradability/0.9.1_notebooks/jobs.json b/notebooks/scenarios/bigquery/upgradability/0.9.1_notebooks/jobs.json index 94c3855641d..4f9d247146a 100644 --- a/notebooks/scenarios/bigquery/upgradability/0.9.1_notebooks/jobs.json +++ b/notebooks/scenarios/bigquery/upgradability/0.9.1_notebooks/jobs.json @@ -1,174 +1,174 @@ { - "william-thompson-fake@openmined.org": [ + "michael-adams-fake@openmined.org": [ { - "user_email": "william-thompson-fake@openmined.org", - "func_name": "simple_query_5aeaf1", - "query": "SELECT table_id, AVG(colname) AS average_score\n FROM dataset_1.table_1\n GROUP BY table_id\n LIMIT 108441", + "user_email": "michael-adams-fake@openmined.org", + "func_name": "simple_query_e92e5a", + "query": "SELECT table_id, AVG(colname) AS average_score\n FROM dataset_2.table_1\n GROUP BY table_id\n LIMIT 717808", "job_type": "simple_query", "settings": { - "dataset": "dataset_1", + "dataset": "dataset_2", "table": "table_1", "groupby_col": "table_id", "score_col": "colname", - "limit": 108441 + "limit": 717808 }, "should_succeed": true, "should_submit": true, - "code_path": "simple_query_5aeaf1", + "code_path": "simple_query_e92e5a", "admin_reviewed": true, "result_as_expected": true }, { - "user_email": "william-thompson-fake@openmined.org", - "func_name": "simple_query_e283cd", - "query": "SELECT table_id, AVG(colname) AS average_score\n FROM dataset_2.table_2\n GROUP BY table_id\n LIMIT 919780", + "user_email": "michael-adams-fake@openmined.org", + "func_name": "simple_query_4e10ab", + "query": "SELECT table_id, AVG(colname) AS average_score\n FROM dataset_1.table_1\n GROUP BY table_id\n LIMIT 512806", "job_type": "simple_query", "settings": { - "dataset": "dataset_2", - "table": "table_2", + "dataset": "dataset_1", + "table": "table_1", "groupby_col": "table_id", "score_col": "colname", - "limit": 919780 + "limit": 512806 }, "should_succeed": true, "should_submit": true, - "code_path": "simple_query_e283cd", + "code_path": "simple_query_4e10ab", "admin_reviewed": true, "result_as_expected": true } ], - "eric-hahn-fake@openmined.org": [ + "lisa-clark-fake@openmined.org": [ { - "user_email": "eric-hahn-fake@openmined.org", - "func_name": "simple_query_ae1579", - "query": "SELECT table_id, AVG(colname) AS average_score\n FROM dataset_2.table_1\n GROUP BY table_id\n LIMIT 429598", + "user_email": "lisa-clark-fake@openmined.org", + "func_name": "simple_query_5374dd", + "query": "SELECT table_id, AVG(colname) AS average_score\n FROM dataset_1.table_1\n GROUP BY table_id\n LIMIT 55958", "job_type": "simple_query", "settings": { - "dataset": "dataset_2", + "dataset": "dataset_1", "table": "table_1", "groupby_col": "table_id", "score_col": "colname", - "limit": 429598 + "limit": 55958 }, "should_succeed": true, "should_submit": true, - "code_path": "simple_query_ae1579", + "code_path": "simple_query_5374dd", "admin_reviewed": true, "result_as_expected": true }, { - "user_email": "eric-hahn-fake@openmined.org", - "func_name": "wrong_syntax_query_7e9ca8", + "user_email": "lisa-clark-fake@openmined.org", + "func_name": "wrong_syntax_query_cf08ee", "query": "SELECT * FROM table INCORRECT SYNTAX", "job_type": "wrong_syntax_query", "settings": {}, "should_succeed": false, "should_submit": true, - "code_path": "wrong_syntax_query_7e9ca8", + "code_path": "wrong_syntax_query_cf08ee", "admin_reviewed": true, "result_as_expected": true } ], - "paul-lloyd-fake@openmined.org": [ + "anthony-simpson-fake@openmined.org": [ { - "user_email": "paul-lloyd-fake@openmined.org", - "func_name": "simple_query_56749f", - "query": "SELECT table_id, AVG(colname) AS average_score\n FROM dataset_1.table_2\n GROUP BY table_id\n LIMIT 117335", + "user_email": "anthony-simpson-fake@openmined.org", + "func_name": "simple_query_e46828", + "query": "SELECT table_id, AVG(colname) AS average_score\n FROM dataset_2.table_2\n GROUP BY table_id\n LIMIT 346093", "job_type": "simple_query", "settings": { - "dataset": "dataset_1", + "dataset": "dataset_2", "table": "table_2", "groupby_col": "table_id", "score_col": "colname", - "limit": 117335 + "limit": 346093 }, "should_succeed": true, "should_submit": true, - "code_path": "simple_query_56749f", + "code_path": "simple_query_e46828", "admin_reviewed": true, "result_as_expected": true }, { - "user_email": "paul-lloyd-fake@openmined.org", - "func_name": "job_too_much_text_c8e01e", + "user_email": "anthony-simpson-fake@openmined.org", + "func_name": "job_too_much_text_47c92e", "query": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", "job_type": "job_too_much_text", "settings": {}, "should_succeed": false, "should_submit": true, - "code_path": "job_too_much_text_c8e01e", + "code_path": "job_too_much_text_47c92e", "admin_reviewed": true, "result_as_expected": true } ], - "john-garrett-fake@openmined.org": [ + "ian-ray-fake@openmined.org": [ { - "user_email": "john-garrett-fake@openmined.org", - "func_name": "simple_query_89f22a", - "query": "SELECT table_id, AVG(colname) AS average_score\n FROM dataset_2.table_2\n GROUP BY table_id\n LIMIT 443373", + "user_email": "ian-ray-fake@openmined.org", + "func_name": "simple_query_57f511", + "query": "SELECT table_id, AVG(colname) AS average_score\n FROM dataset_1.table_1\n GROUP BY table_id\n LIMIT 199607", "job_type": "simple_query", "settings": { - "dataset": "dataset_2", - "table": "table_2", + "dataset": "dataset_1", + "table": "table_1", "groupby_col": "table_id", "score_col": "colname", - "limit": 443373 + "limit": 199607 }, "should_succeed": true, "should_submit": true, - "code_path": "simple_query_89f22a", + "code_path": "simple_query_57f511", "admin_reviewed": true, "result_as_expected": true }, { - "user_email": "john-garrett-fake@openmined.org", - "func_name": "job_long_name_c7c6acaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", - "query": "SELECT table_id, AVG(colname) AS average_score\n FROM dataset_2.table_1\n GROUP BY table_id\n LIMIT 66724", + "user_email": "ian-ray-fake@openmined.org", + "func_name": "job_long_name_6a5b10aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", + "query": "SELECT table_id, AVG(colname) AS average_score\n FROM dataset_2.table_1\n GROUP BY table_id\n LIMIT 138346", "job_type": "job_long_name", "settings": { "dataset": "dataset_2", "table": "table_1", "groupby_col": "table_id", "score_col": "colname", - "limit": 66724 + "limit": 138346 }, "should_succeed": true, "should_submit": true, - "code_path": "job_long_name_c7c6acaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", + "code_path": "job_long_name_6a5b10aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", "admin_reviewed": true, "result_as_expected": true } ], - "anthony-escobar-fake@openmined.org": [ + "marie-russo-fake@openmined.org": [ { - "user_email": "anthony-escobar-fake@openmined.org", - "func_name": "simple_query_953d04", - "query": "SELECT table_id, AVG(colname) AS average_score\n FROM dataset_2.table_2\n GROUP BY table_id\n LIMIT 442633", + "user_email": "marie-russo-fake@openmined.org", + "func_name": "simple_query_079c08", + "query": "SELECT table_id, AVG(colname) AS average_score\n FROM dataset_1.table_1\n GROUP BY table_id\n LIMIT 381248", "job_type": "simple_query", "settings": { - "dataset": "dataset_2", - "table": "table_2", + "dataset": "dataset_1", + "table": "table_1", "groupby_col": "table_id", "score_col": "colname", - "limit": 442633 + "limit": 381248 }, "should_succeed": true, "should_submit": true, - "code_path": "simple_query_953d04", + "code_path": "simple_query_079c08", "admin_reviewed": true, "result_as_expected": true }, { - "user_email": "anthony-escobar-fake@openmined.org", - "func_name": "job_funcname_xss_2a6679", - "query": "SELECT table_id, AVG(colname) AS average_score\n FROM dataset_1.table_2\n GROUP BY table_id\n LIMIT 455945", + "user_email": "marie-russo-fake@openmined.org", + "func_name": "job_funcname_xss_d77c1a", + "query": "SELECT table_id, AVG(colname) AS average_score\n FROM dataset_1.table_1\n GROUP BY table_id\n LIMIT 640290", "job_type": "job_funcname_xss", "settings": { "dataset": "dataset_1", - "table": "table_2", + "table": "table_1", "groupby_col": "table_id", "score_col": "colname", - "limit": 455945 + "limit": 640290 }, "should_succeed": true, "should_submit": false, diff --git a/notebooks/scenarios/bigquery/upgradability/0.9.1_notebooks/users.json b/notebooks/scenarios/bigquery/upgradability/0.9.1_notebooks/users.json index 5585ce77f22..c2ef3885a77 100644 --- a/notebooks/scenarios/bigquery/upgradability/0.9.1_notebooks/users.json +++ b/notebooks/scenarios/bigquery/upgradability/0.9.1_notebooks/users.json @@ -1,8 +1,8 @@ [ { - "name": "William Thompson", - "email": "william-thompson-fake@openmined.org", - "password": "H&4TFK4nd1", + "name": "Michael Adams", + "email": "michael-adams-fake@openmined.org", + "password": "qRPt9Ua0_6", "role": "ServiceRole.DATA_SCIENTIST", "new_password": null, "email_disabled": true, @@ -10,19 +10,19 @@ "reset_token": null }, { - "name": "Eric Hahn", - "email": "eric-hahn-fake@openmined.org", - "password": "iqeU$Fme@4", + "name": "Lisa Clark", + "email": "lisa-clark-fake@openmined.org", + "password": "tC9fZrku_o", "role": "ServiceRole.DATA_SCIENTIST", "new_password": null, "email_disabled": false, "reset_password": true, - "reset_token": "2o2tvKn3HVYt" + "reset_token": "D9893xYYM1HO" }, { - "name": "Paul Lloyd", - "email": "paul-lloyd-fake@openmined.org", - "password": "O7c9DBMh!b", + "name": "Anthony Simpson", + "email": "anthony-simpson-fake@openmined.org", + "password": ")@28JBEb4c", "role": "ServiceRole.DATA_SCIENTIST", "new_password": null, "email_disabled": false, @@ -30,9 +30,9 @@ "reset_token": null }, { - "name": "John Garrett", - "email": "john-garrett-fake@openmined.org", - "password": ")pDQ4r%PX8", + "name": "Ian Ray", + "email": "ian-ray-fake@openmined.org", + "password": "rA9miV^sX$", "role": "ServiceRole.DATA_SCIENTIST", "new_password": null, "email_disabled": false, @@ -40,9 +40,9 @@ "reset_token": null }, { - "name": "Anthony Escobar", - "email": "anthony-escobar-fake@openmined.org", - "password": "3J6uWe25a%", + "name": "Marie Russo", + "email": "marie-russo-fake@openmined.org", + "password": "$4Asq)sSVb", "role": "ServiceRole.DATA_SCIENTIST", "new_password": null, "email_disabled": false, diff --git a/notebooks/scenarios/bigquery/upgradability/1-dump-database-to-file.ipynb b/notebooks/scenarios/bigquery/upgradability/1-dump-database-to-file.ipynb index 53882ce2d7b..4ed6ee40e26 100644 --- a/notebooks/scenarios/bigquery/upgradability/1-dump-database-to-file.ipynb +++ b/notebooks/scenarios/bigquery/upgradability/1-dump-database-to-file.ipynb @@ -32,7 +32,7 @@ "outputs": [], "source": [ "server = sy.orchestra.launch(\n", - " name=\"bigquery-high\",\n", + " name=\"bigquery-high-migrations\",\n", " dev_mode=True,\n", " server_side_type=\"high\",\n", " port=\"8080\",\n", diff --git a/notebooks/scenarios/bigquery/upgradability/2-migrate-for-scenarios.ipynb b/notebooks/scenarios/bigquery/upgradability/2-migrate-for-scenarios.ipynb index a2981d64b9a..bd4f5cae2f5 100644 --- a/notebooks/scenarios/bigquery/upgradability/2-migrate-for-scenarios.ipynb +++ b/notebooks/scenarios/bigquery/upgradability/2-migrate-for-scenarios.ipynb @@ -141,8 +141,7 @@ "metadata": {}, "outputs": [], "source": [ - "# migration_data_dir = Path(os.getenv(\"MIGRATION_DATA_DIR\", \".\"))\n", - "migration_data_dir = Path(\".\")\n", + "migration_data_dir = Path(os.getenv(\"MIGRATION_DATA_DIR\", \".\"))\n", "blob_path = migration_data_dir / \"migration.blob\"\n", "yaml_path = migration_data_dir / \"migration.yaml\"\n", "\n", diff --git a/notebooks/scenarios/bigquery/upgradability/migration.blob b/notebooks/scenarios/bigquery/upgradability/migration.blob index 6a85e2651e6e502b79cb0da74a38d2eb771ed908..3e0d4bfe6b09175241434efd419e4d7a075720d5 100644 GIT binary patch delta 246347 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 Q72@r;S@GpfL{}L92LX6}od5s; delta 256187 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 RuSj~;+nlC

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 literal 0 HcmV?d00001 diff --git a/notebooks/scenarios/bigquery/upgradability/sync/migration_high.yaml b/notebooks/scenarios/bigquery/upgradability/sync/migration_high.yaml new file mode 100644 index 00000000000..c3819a0c46a --- /dev/null +++ b/notebooks/scenarios/bigquery/upgradability/sync/migration_high.yaml @@ -0,0 +1,6 @@ +server: + env: + - name: SERVER_UID + value: fbdf5a287e58454cbbd3fac4ad744d37 + - name: SERVER_PRIVATE_KEY + value: fcfd09deed32e3574558b6719fed46e0b8fd957d59608e9d8b42ef07c6080d3e diff --git a/notebooks/scenarios/bigquery/upgradability/sync/migration_low.blob b/notebooks/scenarios/bigquery/upgradability/sync/migration_low.blob new file mode 100644 index 0000000000000000000000000000000000000000..6abeef2b0579bf6aef463522896b7f2e9be0b557 GIT binary patch literal 820904 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 Ht*-gUOGw!~ z1IkHs6s{XnEOubcs(-gzii*mdC0mOwS!4OgE4xd}%1%|r@Vj^8Ri$MmgZ-<@%D#U3 zhSGIqzjI$vT6T^9u}P%BV)^)&WXCp}9u;&gTvX6k@r3-!VT)He80^M%>B6=?mhi;9 zQNIV7=<5Gu~O@kDIWZGaXp9cQ@LhcRc~a& z%X+H~Y=;q!$J@+|;Y3*|7heuf~Q|sd%Rz zviR}x)Qi-^t1{;2%F~RwiaXWa0gOt>a(_wr-&cyq4nJoGK}7BYkBM^{ zftOl0qy>A+M&#Bd6+&P`PX9;6X6tGtn@U2lktq?&!{x&@U$3aSr(!dl=Lmx0cO(6@ z$jYL~Qc=X}K_L7u+bk;t1n|{Oo2{10tt%~+6(zBVJ1G3`E$^@SW#u*a$oO3)T;fm3 zbrd?EF6a(mo(NOnsJn`xS3s9QmqM?Ez6A9dWi=IAUqZp3tolrUQ=vN*_1SD&e4e9- zedlsR5p%ixI4=9BD*%BRaMin9B2lQ*K2u!t#mzNexC}*Xw#O{dvu$&cx1{ou&6bLl zF*G28ZtFVKa$AeDYEg@I4eU^xY_;q|OHvwz5Y#RB&1_*H9j2L5cfA^}MgAiP_{gl1 z;jW*RT1)xH%FUIxELR<0Q?UB8W_fCin&p(oHRn~>EKGhZP$<+aXCW;AaYgyYnzHie z-UNYJd3D7~*$}U|ch&o=W$E{Z1BqZLR=un0-PN#C+xBU z$&UcD!V%%kN||n3*sx}`y=Esdr<1H$r0AEK;VJ9+$eL=QXf!Nn$W9r$S+un^*VWh6SEDrPlr_9;sKa0NF-yf7 zdvEXlfnBl@QSpfl+o^VrcG~UsgV0ph+U-qt$Edx-ZXdO`jS4%5Bjf!PE!$J?d#3PA zGnDW}ym#8|Q+9j@q$h3lc%~U4^ueuThcg&R40rZ74L0;ldiM6mJ)v&@e!s)x47858 z2bw2_2ggP{o&62N14l=?J6cDaf%=%Ut!v!VaMb1*Xx7~Xyh&$^vm*}wn#Vi?ee@&Y z8#o%<*Jk$*2Ll05XYYt7*byH-1b3ayHc#gi{h1m<7(;_SBfh7N>fe>Tscqj|8gx7piCf9-xxL)Vevfu4H#-WKq6cEFF`G3R)AR7-XRJi(sH;ZCHB zacb-8?{6Q9?{DjB9qG@A`!wATG{*d?c(rv!JfVXPJsqt<_dtJaxMSy(3}ZNg^iK>n z=xMY2L7V!X@!kxWYO zezbL88_QdohrFHrNzXt>4E{#vjAOQ&<)US1E zpnS|ptDvW|bu3T5pGKa<=cH33c>d6wWe_r>H738EEl-Amt&<*Erp_VX=8Z3s+y=x3WVxo_N===OKDvg$y+ zWVi2CG6vO58!h)vp<2N|>Yff(Lp`j7+9vqQ%b#{pDT(?ieqhJ;?W~>-I)!By->0fR z))&N$8__-zPZ!iDdY}6w>Q##Yj*sZsjB_JCpH=Ej>s^7g}w0lpxtqh`3*XF?R)4< zzT{IXKhb!hLHzP(4f__tTKPlO#ppxV9LQc)FgN3lRRUh9oS zYDI&qN;RmeWK*m177VfE{I`4o^EI4;k@ND#`Jbp3iMr(ckAoXHpeiI_9&qk?X^s$a z9+LAr)zHTE%Eg$8sj8|HElGVk1!kfAKK&^J+0Ut}n$_v3s(R1r`V5CvO;uI;yh&YM zUDcJgh8@jSm|2J-QD}Qsjrn~(Ep*kac`miE<3e5MlfC|JcKYJX#`L;Zu6s1*vs$>p z{3_J?j}!1qbz|7A7xRAleI&ofJBBrlAL8#7^7&%oGp2{b|Ti^GyY7VX z;Cc%YkJs^fThd`BMF(}+Ee^4wy)G|{YhZx-xCFdQ%UMp8z5}{ep>iU=?}7m z)jAJVURQ$-RK|RgHtFAd%ggJ%oQU+RI(gRp$EA|47s9@@?0R{**WWGMea_7-EsZ-` zz50Gnhy%-=&>|nX8Iu*1%N+&|AdM~?O zi$<*Qk>Pdm$r`rZ_3T^T_7Pz#>(%3U7V$s>o%>AmJ=b)??-mk|eC0_-eyDheGvCDS z@ADfEeXr(n(_aGLf(@@^IZxbQ+QV4Rp>kNeV;;}(?Ik63VBWg&1+Fd5L*@c72c-s zQH3unyb66=;jh9Q6zbNYalbuJzS`q z%=UK|{f)VJG@!`;0{e?bZD1+P##KegYM{rFFX};6_noWR|t8>oK!nb3K@S-D*isrlNjZ2 zM?v|Jbmy@W!AP9PwiK+KZ-QT=TDl!kC_Yi;oQw7fN(ai5DYsulm~>d^coF?EmdBGY zyEr(KF*bs+3fLDioCoI$M~!n9syxjweOcpdg-pktOot1r>u{xzVJHu_l3s;M$2k1c z`ChExSN<0&-%r3l7q890QlQkK(xUVhKHszR!??epQ1tR3Jy9(XcKdYS3!fh%9fm^_ z$XA7mKjm~(8-ed*%o6MumGO6=4Mvq~pO$=+{x!Bkv&;Dta5gI+a*e+iOaE3YZ_l;e zn;l*+!^6%)?9a~Jhgv}YU9Q-eyP>(owM2aD5}j8ZY2?M!kS2Qx42$_bqtZc|Q!SKE z4t%S^5$%dX=C>RdB$3cO#NA-77%nWu!u|+1_CXa=E}nvaB$q1^^-p3vREEW|2YLQe zq0;p@t;D;5z?Q0gfn9b$~V(#e_c~icO-)2f=Krh(8l^uZ==9kyk~zs-~3s~ z_!?Q+7!O}o_zR`)Hu#f0zh@lhBwvbf=NKub9 z(wEggK9}@yUXbo|#G_E8PZ#uIbh*2+{$AS7f8NqU`Lr6I8^^;}>wy6ok8$W+^B;^i zn=sULmrs4Uka9Y+MUH!Z3hminAUs_e+fAh7jnD@brrlu80u1s@i$nUc29{&6y9fFa zj6YHyIWbTM*fwuuYz?T&s zL4r@gd>`;6@L3?;JE2L(o7MQ|dW1)FyF&e*rDv6SE5Z}*6+Wc!d4(@4974Es_lUyX z2#@B3LdJt;)&CTW8PKc?jrd1lEA!LQCLS$on7L3!I`e#o7U)`q0HNrVbUbu$AFlH{ z#5EFaXaBP0Xt6cb?`Ue+*;t2z8F{Z<#yOj63+7u?DD#EC9&Sia#+!7fKiDDRIuMTe zj~-BmcdGY}QanIyl#r3%$|?o(rR(uxY-pZzN4JlJ13s*M+a3vRA89!{ab!pEXv@yV z(dO}qWW3cjdL%hLRSz{9+J1ODE1>PKMvd)0$|S0|Kd6Nhiyz-M)*Bn>v7!Oy{zW;| z3xvpb3TG&mWhx`x`Kk_jt3rTK;yXO`g!f4wRXL!$UC=BCz0fx(d>BZ1@**_L1N~+G zwJT(|mFD{uKC4hW8u4Q}m*h{-pNe@zWsIk^N&jZ&<1BhyBi)i7E<-_Jy7H+nv%@it zzful}_6Gw|QDacpl7tf_rOG!vmQ9`S>Hn*p>lW3-sx(f>;0Q=b$A!w>281W}VgVWN zd!Xx&+Ui;j${nd~g7wnzF;5kMk`<#~3oI^Ol#{woOxHN6pv@QS?>|m(>tmMtNj?$E@0-5FnJ`cRcM6?eWJZ99XbP z+G0*Z$q&kfDD*SXl!=@#r&*WxPvM#T&w7=Zt9~y=+lp$tgp7FU?G_!C6T#0f!7w{s z##&yAQOYsB+M^p5AgRh1y;uplEOeYOyL>)A zcRuOMp)Enoh)Uk|PgB-1UuKYQs)E!X^bqP|U!RF#%Ro3u87L>1ne5Z0BI!BDJ@k5A zN9j`1pXFvx%D=UJP4koGRhOm$2#b(3IRe<^vpoNTEFTxxaoy{6q<7N z6=(;vE_d7UY%C8CEAtBq&qu#%1~Q9^ZC@%QJ)}+gS8rdD9@WrBdCu_#(IP+Kj^ZFX z9Dh*Tho*5GhGXUN_idO=LW2x1aPPg@-^z#1v--(qe=D_whTKVhT+05|#j;-KsQk@<3 zZZYlTLt=f+A$Yrd?c_~}w@R*_u2hl)eM{j0D%X6cUhn8AT}m3Uoh#EL)53T3YN^}( z4urvtvM~%aU+nj_UbE^wmps<}!RcS$xZCa9eB_&>-~H(=XFqGNy6@Z5&fUMM{?6-d z+$z_+=u*mUmJdfOexQCPA)|f6a>1&U{X12q3RnD&?YH6Xg9j;M)G(N6$3Tj} z0vw0tcs_9}KI{Sx0Vzjr1~T3c16lq#pLhzm1@S%!90KyYW@x6vuka3qXA~CUJHEFm z)D-IbWgb)JBKSvl%?dHU5yQ}J6zgE+1x|QJ1?Njzf2(zQk!aYL@M04L!&~S$#x{JL zJ%6X)BX+TmJB@{7alLK_8S>7z`RaG_DUPw=X=!yfdJdJ*?g9@{t(K5cZj@CD*q0&S zF`w!0tIfxRIOHTaQ!W%+41ZK3JY#!Zk1woMdnFQ%id_XVehcNp>~L7VEw6luzjA&{ z2_Gy7_Kzf86IwF={K}V(=W9M>x$Bi&_7AF|zhq25#d<2QZii+411eDrHmH&xbu?9Tt9pM5~Oo@V6%H6kG+Ka^Dp zvg=9no@(=+YRWlJ5@Sa|@)PUv72AIMu}@FD%l|)qRrSu@5B}^gVRcUZ1S5a3yc_2; zx@dkK+*9pAI^{jpavvFt*cZ9H_f(5~+`y1!n~Z3jA7Oi;26~G^fKdFd7y1yEbGGB~ z?WnXC<2mGuK4=H@tD`;$PJZiyj*Vw=qO#vcvi!(-0gwv zbG7tgvwZ0`AAhj?%y;kkjG`CI43)85>U7dkx{&nR1;e@Ad%jTqVtyFqHN(>=1F&Ci zzJ7#x-?_}C3z7eqdz?oOxS02yW4=yQ75U1YeC4%y-?=QCMtR);tL*mfp#43G7;aXgY$b^2~=IUuRR%RFb|0;*Td`_41#amjV* z-}(6A6r8cWo#qLyBJg`Pu*St+@0$0WOCC}6V#a;vlsVMqzGKY0tMUAs6`K2wW&hgT zcPz&vI0VY^2B*Rs6q@Vf&Gqp+8_j*kSgIh($NdVQRd_zu$LBLXWo$QPk563JTMwwj7^0?gNW#+zP zN?CbsPz$gYny4%Ge@{Rg&m%gQ^PJ3m$C84i-{~y+86_^)>65+(q1m3g4VvSX=6O!$ zc}}nO^PJ3m$LWL3#5kc^-@rB~m2qBK+N6Ky>sOikj?)J{nddy6+q$oO`#qxH&czql zx`gh#TWn$%JiD~*yNvxW7ts7#_PP~w-!b@Pp8V6-qv@ziKFY~yXwI-{QFGrh>9Wvz z!hvtieaGg$W648HE4Nv0&3(t_zGHLWF-zNQm2dmY+;=>ihP27<7n%Exm$!Ys-0M*< z=6%P-f4@TPQN63!VtEPsV)ebp#`fNF?>kafw4A2Q}-1mB}`;K`YCBJ)F;TD8TvwmN!elNnq%6<#t z!S{D5EJ8eJZdUjR;zP5!?|3ARyNLWeQ1x|jUc$2NJ8rc#?`U#2n){A3`mOqY868ms zg<`*<8hW|+8BP9Gd-&J?t@Eq5U-pgv^OwK5qv=B3cYIy_Z))1M*$>`wNmTpLJN9ih z?mKpDkTl*aAtOJORSJylD$Xw%_Z=6nlg{3ma$PLWP2+wVen({ccBU9|RbefVa`t+K zfCZg*ZQSofJ~7_Ykb%$W$yozTC&aaX^k~lF#QG57Wzq zjtrlQ-<^;0QT5Gt$Bx|56~E<=FTZ);3;%LeP{X;^Djm#cD$EHS2&UA4f zE?qD8{#z!2v{ggg7wo={>~UwN2Rjoazo~p$O#(wLG@p9$?R@(s7s}UcXP(P`$wHO$ zE`;X|2O|M3jvbRyUF`ce9#1~`#SO&|*;i>VZTNEOiYwlE+S9r zZl8Ca2W@C7%6BRw|LAf`N9jVADVFQyuFtc}!E*Og&3%&^c1-$sMW-ftWogHomwO%9 zg*q>J;zvLG+<$(<`MVF_`=w)l_0dzmGWSjDl1ieneZuxy_P$ed-(;rT&!nDg1G1gZ zwiNpf#(lIL7dm9_o4n#*zW9Me;=Pf+GtcjNcF+6%tiJL1_y2C*dN+@DTfXxO=c!)I z*f*)Sy&eA{&*igV?Cv*eZ4_80qn*L=&+kHWe+*GqN5}#JsyIGodVWB7AZ^Hf#;_nsu@r7QTsww|wi=o63r;HzhfzAfaE zy7ZT8NA#QOnTIpq!VlCIRaTAt0r@8VtM?1|9eFPz%Bi@)T@+N^CEwqP!g|2oYqOSE zYpmP$S&OZf4HnCr_VQRx?I_NP3~04D$eJbFYO!vxmS1hHv#ztQw65ITV!85-Sxzdl zE#S+lDwcz~qM|xW%@akNt!pZqEi2bmR$QWcTU=gOe!8gq@uHfZnzD2Aweo7j*J3Tk z(OQTM{fD{2x>=9^nyXQSEI73-?y`+~azwmLe^-%u%8KgeOVUwYEmrbqaf~Ke8QV`3 zm4BwF=IbkJZd$?kro1qCmNSOitabYsaZuQLfE~ODPPmRSs^}W?ezh2)T5jExLE}>4 zsG>}F0@rW2Qjv7UhyF`Z&3~*+$FwZYbGGz&e!i&uuZwCvwzB3srHtn+pK?a>r4`nv zSL_2fFq&tJe)}#~bC~LFX>yJDwSdo6&%pgYR2<^w4RTv7;fZ;peh)6h#o5-0P#hA= z649bTcfcQ-DBV^T8<{F9TZ2nagGFWQJYipQRngXux}%%{@%tdwQZmXN=YVIxjhqXH zef|-D>BhYf_m)vVuG{sIW-%`gT`FxZ1I1RgRX}u-ibXv|@2+wuFisYQheZ|NQGFEb zh{yHlli|4Lin{$_)FA zZyuC+PL8-#Yg1-`8&ML8>-e zt1?oxQo63VL^*-uOPgeJiZ9vNYTf*!x7U1rT{;zOR4PRNi)1`mRQ}_lny?^@9V_DWp`!AeifVqp zzUJ}ujFZuqoY6r+)1&i-D@m{hUf5h;pCd+>s8<#GLsqIivR5V(WK{_JJE&2LBdvdM#ROYs)Of&?}%zpi7}wLSF)1 z2E7V;HS`;x*Fdj@z7+b6(CeVrLvMh76ZFQlW!LB@tmz|6+1y`IroXA6gc7P8!fv)L zUS*bs)+_IO^v?I!Kkodi(we`m+-xmTB7eOLWzMG^mA3-9>Rm2DqrWXFzjH;+EfqDN zD&L$(sJSRt`N?KW#Y)Mp)^!%^nytmDie{^29~w&1&LGi^)+zC6v^17sqkTrHFupKy zrqMpd8MAmCzDN(1MG!nkNb-j%o@jL6)`9m49V@ zd0kCe`Kfgqu~qTvij}gtS@G>v@2{4n9W`zu7>ZTzs(N?zED2D3-PKjq(uEWbnsE63 zYTo>TPeO@604`+HBhyZ`YdP!zht-LYpT~_>!!<;3Bq z5S-({RXXWA+)=x;`q;5_WHMt>ts1NJBqJ)u7mJDy(|PP_L`$WyI^E`+9cbpe!iKB2 zAZLead{fvk4Xvcv!DhW&l8{B7&KY#-ZDGSUG+<^2o%OP?A?r<)*})p$6g13S5lFR&+fW(ab`fvNn`yQHDejj$%e692Lbp;P*t`(IiWGB#kyGIMUYE z%v*q}QTX(r4KEw&@K=4zQnAL~+q-{Ymt@9@zumB%>TUK;yWM^en(A7+y~*wvwRhO< zqxQB@VdrpUyq}_FyWu_D(hMbh5$~OL`;;Bu0qMz}Aw1J;w|B?j*0IAG3?zm-`7E#D(9>l1d-rxtx`X}WzBcEQ#NQL@k9qbYo_jOmCDP|@=&v7a2u#Ry&yL%0XGc9~ z8Sr(qMuwL+e)U5GU9sW*RJcL+K!0qwqct%!U<;7W&QR~zQ1ECV75|W9%oFS#^V(YL zwLyn+)1Pn;Fz@>Or%-7kT;No=Sx+<26_QrsHUEw_J1#_687s(mm*?cMr5C=87X^ z$@EZTSH!!wH{xk%68W@TbR@qFHg-+=8oNcfv*eDE5B)ZH@jTSC1=T} zx$+kB+P7y&$-ddL5i+~JXMCRWp=6*p*pG74np83~<{s!u4h?oS%d+Zd#&gos=oNJI z1^biUhQOr9PkHJ*+HaUgr7h~FT=f-Q zBD`+ae~u~EgG%)g_tbBn+`b(T4o9!B_wrZNkHRS38~94twlF@)J*c#I!ra~=DqVO^ zgK!{zm=p)<&z^B_Ffiro1pP+seXQyaAHa`DPoGGSjFfm3U+&@W-jv*uJR{yX+WGxR z*7tkGyY%;M^gI2%kcIZWjPKjR{2p)TO)u(GKk9tYQ~DWVc&&%=Ghcec^fsfO0)3qf z4@3dALH|)ZqAKWgFiqsS=*O&Zr0QelH}b_m-`%?{6;%;;6jv$7YrT<3t!R){sRmb- zY>HLhf^nLh|CZ-4+RW(+F&Z^%z9gzeqAoe-<=~(wRD}f0gO!N6FlEdD4pwu%j`Jba z(8l$t#TcioGAPv#tV;L5s;cyUk-?dKH1u4ms@}7@9=2H%Ca{q+5p{KSRaZ7Nw=`9G z$J|j&0-=3cHRkvEw9r+v(y10sUa0e4+3Uq-r!UTI6!~#c=c8J%LB3neeJ{p!A1C0K z>Ohf2#eAQ-)={1Zspc1B?n%sm#KW%iA$x+}dO29=I^%5!f3AC2m`=|3i~LT7iyLTM zm!;JP;{rqBcJuB`L4%cI9!Jy;xos796cVdhkHCokC_xb*o6j*xZ@f5QCtHD zP#>3ocWJrG8HIO1*D6#_#P?k=?16`easQxh-;9TGXum?Pv)~Nf8EEE<6A?NInSg^ws~g*(2#OX2qwzOL3ma5@iawSU2HSW*vqQ`Ie-b)>y zzhdfnK0`5_&& z=0@qRQu)KwGQB1CuR>pz?)wzp zpzr~OPbpl5MJ#mJtkA9SW`!Wbg6~(X#<#|P@dlWU?e&Gq$!vdj(cc)>et9QE{ukI^ zG-?A&;ctA(9}@oNBPWgJA)5}pk`9qDgt%s?mkLP_-ouF{k_DxQ1Mzmb#6XOT{8lJ> zP##KegYM{rFFX};6_nm2v8V@`lj>@-LdM^dioZ|uBt|*BQE{c_FPGqLWT3-T;Zs3 z%|ex@8H6MF-LT%gko3Bf>2P5`zjwlA2m-c}UWH1>IQ-N3UaW9e{ue4gPQX7GcF?%6 zh$wX!t0=vN&-d*7Fs}bE6ul^iqFNyA#;RvGvIoY3%2DQrNQdE2fkMhr%IT;!0^i4& zC1S%7{db@ZMzz@ctDk@$v+^O=czdx3?wrO~Uag*2-e;bJP(c4(uGp9xa|^B|;#-&K zyt=fbUQBc1T5oiuV+@P=GNaN#8c>~U|DYOfjqObb%qkqwt|(-Ft8)`UBs34XeIk|& zd9f)V!i{fGg_Mh@;2+85Qa7Z_ums6OIE6~r(+nq-B_cuCO)-+r9F?v@$rYAM)$Ys4 z|3b-O*1u?nNOIv~5Dn|dLteiaA}FMM>18@Nb0Qj>FhCWOkJ;`K@c9QApSVJOmjzK~s=`ZzC0cRJ!xDAK13`Y^iO-B`IV zZRI^@4KR=;_}!#Ckl;%}=S8$9jN{>};h(PP?>Ka>{rRc%sc`l0=4;0+q*RowRg5fs~P_x}}4|M%eTV48At=3laUaciuw=_pTB%l6q zzWkF~>ZtLgi4p%O@|=qKU#u1=tD!mArPtH3zQa*IV!aztSN!fY^#0Hue{8}L2zw4; z2?^#R+NAGnXS2We473ND^W-$^>yDnnGvx&Du_UUckEytcc&UNZ?RZaRj2Dg>65r`4 z90)h^tftxVGTy3b-eYXuV~n$~$TVa$sEd7Frg@LC%xB887U)`q(pIv;2^h?Kj3L+G zEUEHdMI58tCH-okw<=UlL@{E0V5FZ>;!;kNz6YT>-f|oCHfZx6WAh$k^B!Y)UM0sj zUx9Y8TtKs3)UHq;XLwkdUr=~H`c*S(o||n@Dx-XmHtFB_=AF%ZjMF_Xv%ht5^|y@c zQWttZLN$uf`QDFV-eZjRP^pw>x#k6RIjy5E`Pi+XJU?XKW4!2lVpt!Fz0Q8@Q}&OB za9);cLQ4u#lgZD__sKk_%ti2z?wS>1KrogFYEi6zl@}Y~9TlACwXUCSRr<^Cm_8owdKicH z;ZZ2suZFfsqZ$vw3c0W^;l<_$zAxnZl=_TtF5Y`n%zKPgMrVOuzmTu0q32o`g55C* z%@qkp<@Sd~@nLp2EZ>$_zQkX-u4az&2bNOa8rLh$+Q$qTK*e%NHD5iOZ~4x(&Sojo zsYt6IlOggkpYV+QvJJG*JtF^5E~n(YI%osiB{i(Cm)BCM{gO)|zl2=;xxB~t?~q@; zIH&owaE~$fJ?;WsxbKnj{uyQF{zuZQ9SuDPFae~y9|2DR4`LtVN#Mi4ao`I;4=}M> z)~8N9vmUu#VG;zOndd_gpHa9Qw4j-HI}>*!Tw+k+9SZMOScLHT-lp≶s=5`=rAA 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