diff --git a/.bumpversion.cfg b/.bumpversion.cfg index 545b0297332..2ee6e147b50 100644 --- a/.bumpversion.cfg +++ b/.bumpversion.cfg @@ -1,5 +1,5 @@ [bumpversion] -current_version = 0.8.2-beta.33 +current_version = 0.8.2-beta.35 tag = False tag_name = {new_version} commit = True diff --git a/.github/workflows/cd-syft-dev.yml b/.github/workflows/cd-syft-dev.yml index 65fc02e9093..9d13185d616 100644 --- a/.github/workflows/cd-syft-dev.yml +++ b/.github/workflows/cd-syft-dev.yml @@ -1,19 +1,48 @@ -name: CD - Syft - Deploy `dev` to K8s +name: CD - Kubernetes - Dev on: - # TODO: Re-enable once merged & tested - # schedule: - # - cron: "0 */3 * * *" + schedule: + - cron: "0 */3 * * *" workflow_dispatch: inputs: - none: - description: "Run Tests Manually" - required: false + check-cache: + type: boolean + description: "Check workflow cache" + default: false + deploy-helm: + type: boolean + description: "Deploy Helm Charts" + default: false jobs: + check-last-run: + runs-on: om-ci-16vcpu-ubuntu2204 + + outputs: + same-commit: ${{ steps.cache.outputs.cache-hit }} + + steps: + - name: Check for new changes + if: github.event_name == 'schedule' || github.event.inputs.check-cache == 'true' + id: cache + uses: actions/cache@v3 + with: + path: scripts/k8s_dev_hash # we don't care about the file, just the key + key: k8s-dev-${{ github.sha }} + lookup-only: true + + - name: Save Commit SHA + if: github.event_name == 'schedule' || github.event.inputs.check-cache == 'true' + # only for making the cache action happy + run: echo "${{ github.sha }}" > scripts/k8s_dev_hash + deploy-syft-dev: + needs: check-last-run + if: needs.check-last-run.outputs.same-commit != 'true' + runs-on: om-ci-16vcpu-ubuntu2204 + steps: - name: Permission to home directory run: | @@ -39,7 +68,17 @@ jobs: id: buildx uses: docker/setup-buildx-action@v3 - - name: Login to Azure container registry + - name: Install Azure CLI + run: | + curl -sL https://aka.ms/InstallAzureCLIDeb | sudo bash + az version + + - name: Login to Azure CLI + uses: azure/login@v1 + with: + creds: ${{ secrets.AZURE_CREDENTIALS_GITHUB_CI }} + + - name: Login to Azure Container Registry uses: azure/docker-login@v1 with: login-server: ${{ secrets.ACR_SERVER }} @@ -51,8 +90,8 @@ jobs: shell: bash run: echo "GRID_VERSION=$(python packages/grid/VERSION)" >> $GITHUB_OUTPUT - - name: Build and push `grid-backend` image to DockerHub - uses: docker/build-push-action@v4 + - name: Build and push `grid-backend` image to registry + uses: docker/build-push-action@v5 with: context: ./packages file: ./packages/grid/backend/backend.dockerfile @@ -61,9 +100,10 @@ jobs: tags: | ${{ secrets.ACR_SERVER }}/openmined/grid-backend:dev ${{ secrets.ACR_SERVER }}/openmined/grid-backend:dev-${{ github.sha }} + ${{ secrets.ACR_SERVER }}/openmined/grid-backend:${{ steps.grid.outputs.GRID_VERSION }} - - name: Build and push `grid-frontend` image to DockerHub - uses: docker/build-push-action@v4 + - name: Build and push `grid-frontend` image to registry + uses: docker/build-push-action@v5 with: context: ./packages/grid/frontend file: ./packages/grid/frontend/frontend.dockerfile @@ -71,11 +111,12 @@ jobs: tags: | ${{ secrets.ACR_SERVER }}/openmined/grid-frontend:dev ${{ secrets.ACR_SERVER }}/openmined/grid-frontend:dev-${{ github.sha }} + ${{ secrets.ACR_SERVER }}/openmined/grid-frontend:${{ steps.grid.outputs.GRID_VERSION }} target: grid-ui-development # TODO: Re-enable once we have Enclave up and running - # - name: Build and push `grid-enclave` image to DockerHub - # uses: docker/build-push-action@v4 + # - name: Build and push `grid-enclave` image to registry + # uses: docker/build-push-action@v5 # with: # context: ./packages # file: ./packages/grid/worker/worker.dockerfile @@ -84,9 +125,10 @@ jobs: # tags: | # ${{ secrets.ACR_SERVER }}/openmined/grid-enclave:dev # ${{ secrets.ACR_SERVER }}/openmined/grid-enclave:dev-${{ github.sha }} + # ${{ secrets.ACR_SERVER }}/openmined/grid-enclave:${{ steps.grid.outputs.GRID_VERSION }} - - name: Build and push `grid-headscale` image to DockerHub - uses: docker/build-push-action@v4 + - name: Build and push `grid-headscale` image to registry + uses: docker/build-push-action@v5 with: context: ./packages/grid/vpn file: ./packages/grid/vpn/headscale.dockerfile @@ -94,9 +136,10 @@ jobs: tags: | ${{ secrets.ACR_SERVER }}/openmined/grid-headscale:dev ${{ secrets.ACR_SERVER }}/openmined/grid-headscale:dev-${{ github.sha }} + ${{ secrets.ACR_SERVER }}/openmined/grid-headscale:${{ steps.grid.outputs.GRID_VERSION }} - - name: Build and push `grid-tailscale` image to DockerHub - uses: docker/build-push-action@v4 + - name: Build and push `grid-tailscale` image to registry + uses: docker/build-push-action@v5 with: context: ./packages/grid/vpn file: ./packages/grid/vpn/tailscale.dockerfile @@ -104,9 +147,10 @@ jobs: tags: | ${{ secrets.ACR_SERVER }}/openmined/grid-tailscale:dev ${{ secrets.ACR_SERVER }}/openmined/grid-tailscale:dev-${{ github.sha }} + ${{ secrets.ACR_SERVER }}/openmined/grid-tailscale:${{ steps.grid.outputs.GRID_VERSION }} - - name: Build and push `grid-vpn-iptables` image to DockerHub - uses: docker/build-push-action@v2 + - name: Build and push `grid-vpn-iptables` image to registry + uses: docker/build-push-action@v5 with: context: ./packages/grid/vpn file: ./packages/grid/vpn/iptables.dockerfile @@ -114,8 +158,10 @@ jobs: tags: | ${{ secrets.ACR_SERVER }}/openmined/grid-vpn-iptables:dev ${{ secrets.ACR_SERVER }}/openmined/grid-vpn-iptables:dev-${{ github.sha }} + ${{ secrets.ACR_SERVER }}/openmined/grid-vpn-iptables:${{ steps.grid.outputs.GRID_VERSION }} - name: Build Helm Chart & Copy to infra + if: github.ref == 'refs/heads/dev' || github.event.inputs.deploy-helm == 'true' shell: bash run: | K3D_VERSION=v5.6.0 @@ -142,6 +188,7 @@ jobs: cp -R packages/grid/helm/syft/. packages/grid/helm/manifests.yaml infrastructure/gitops/environments/dev/ - name: Commit & push changes to Infra Repo + if: github.ref == 'refs/heads/dev' || github.event.inputs.deploy-helm == 'true' uses: EndBug/add-and-commit@v9 with: author_name: ${{ secrets.OM_BOT_NAME }} @@ -150,3 +197,29 @@ jobs: add: "." push: "origin main" cwd: "./infrastructure/" + + - name: Cleanup Azure Container Registry + run: | + ACR_REGISTRY_NAME=${{ secrets.ACR_REGISTRY_NAME }} + + echo ">> Fetching repo list.." + REPO_LIST=$(az acr repository list -n $ACR_REGISTRY_NAME -o tsv) + + KEEP_PREV_VERSIONS=5 + TAIL_FROM_LINE=$(($KEEP_PREV_VERSIONS + 1)) + + for repo in $REPO_LIST + do + echo "Cleaning up '$repo'" + az acr repository show-tags --name $ACR_REGISTRY_NAME --repository $repo --orderby time_desc --output tsv \ + | grep dev- \ + | tail -n +$TAIL_FROM_LINE \ + | xargs -r -I% az acr repository untag --name $ACR_REGISTRY_NAME --image $repo:% + done + + - name: Logout and cleanup Azure account + if: always() + run: | + az logout + az cache purge + az account clear diff --git a/.github/workflows/cd-syft.yml b/.github/workflows/cd-syft.yml index 506c7a9d351..f57a95a5f44 100644 --- a/.github/workflows/cd-syft.yml +++ b/.github/workflows/cd-syft.yml @@ -73,7 +73,8 @@ jobs: shell: bash run: | # install k3d - wget https://github.com/k3d-io/k3d/releases/download/v5.5.1/k3d-linux-amd64 + K3D_VERSION=v5.6.0 + wget https://github.com/k3d-io/k3d/releases/download/${K3D_VERSION}/k3d-linux-amd64 mv k3d-linux-amd64 k3d chmod +x k3d export PATH=`pwd`:$PATH @@ -175,6 +176,7 @@ jobs: files: | ./packages/syftcli/manifest.yml ./build/syftcli-config/* + ./packages/hagrid/hagrid/manifest_template.yml tag_name: v${{ steps.release_checks.outputs.github_release_version }} - name: Set up QEMU diff --git a/.github/workflows/pr-tests-stack.yml b/.github/workflows/pr-tests-stack.yml index a42a2cec76a..4bd93e90232 100644 --- a/.github/workflows/pr-tests-stack.yml +++ b/.github/workflows/pr-tests-stack.yml @@ -538,7 +538,7 @@ jobs: chmod 700 get_helm.sh ./get_helm.sh - - name: Run integration tests + - name: Run K8s & Helm integration tests if: steps.changes.outputs.stack == 'true' timeout-minutes: 60 env: @@ -547,7 +547,8 @@ jobs: shell: bash run: | # install k3d - wget https://github.com/k3d-io/k3d/releases/download/v5.5.1/k3d-linux-amd64 + K3D_VERSION=v5.6.0 + wget https://github.com/k3d-io/k3d/releases/download/${K3D_VERSION}/k3d-linux-amd64 mv k3d-linux-amd64 k3d chmod +x k3d export PATH=`pwd`:$PATH @@ -556,7 +557,7 @@ jobs: curl -sSL https://github.com/loft-sh/devspace/releases/download/${DEVSPACE_VERSION}/devspace-linux-amd64 -o ./devspace chmod +x devspace devspace version - # tox -e stack.test.integration.k8s + tox -e stack.test.integration.k8s tox -e syft.build.helm tox -e syft.package.helm # tox -e syft.test.helm diff --git a/.gitignore b/.gitignore index 85f294b4f27..33dc85c251c 100644 --- a/.gitignore +++ b/.gitignore @@ -73,3 +73,5 @@ nohup.out # notebook data notebooks/helm/scenario_data.jsonl +# tox syft.build.helm generated file +out.txt diff --git a/VERSION b/VERSION index eb0c9fba798..c45494e2144 100644 --- a/VERSION +++ b/VERSION @@ -1,5 +1,5 @@ # Mono Repo Global Version -__version__ = "0.8.2-beta.33" +__version__ = "0.8.2-beta.35" # elsewhere we can call this file: `python VERSION` and simply take the stdout # stdlib diff --git a/notebooks/api/0.8/06-multiple-code-requests.ipynb b/notebooks/api/0.8/06-multiple-code-requests.ipynb index c6a83ba21a5..70520280908 100644 --- a/notebooks/api/0.8/06-multiple-code-requests.ipynb +++ b/notebooks/api/0.8/06-multiple-code-requests.ipynb @@ -103,12 +103,14 @@ }, "outputs": [], "source": [ - "root_client.register(name=\"Sheldon Cooper\",\n", - " email=\"sheldon@caltech.edu\",\n", - " password=\"abc123\",\n", - " password_verify=\"abc123\",\n", - " institution=\"Caltech\",\n", - " website=\"https://www.caltech.edu/\")" + "root_client.register(\n", + " name=\"Sheldon Cooper\",\n", + " email=\"sheldon@caltech.edu\",\n", + " password=\"abc123\",\n", + " password_verify=\"abc123\",\n", + " institution=\"Caltech\",\n", + " website=\"https://www.caltech.edu/\"\n", + ")" ] }, { @@ -167,13 +169,15 @@ "outputs": [], "source": [ "# The Data Scientist does some basic statistics function on the object\n", - "@sy.syft_function(input_policy=sy.ExactMatch(data=dataset_ptr.assets[0]),\n", - " output_policy=sy.SingleExecutionExactOutput())\n", + "@sy.syft_function(\n", + " input_policy=sy.ExactMatch(data=dataset_ptr.assets[0]),\n", + " output_policy=sy.SingleExecutionExactOutput()\n", + ")\n", "def calculate_sum(data):\n", " import opendp.prelude as dp\n", " dp.enable_features(\"contrib\")\n", " from opendp.measurements import make_laplace\n", - " \n", + "\n", " #compute sum\n", " res = data.sum()\n", " base_lap = dp.m.make_base_laplace(\n", @@ -225,7 +229,7 @@ "source": [ "project = new_project.start()\n", "\n", - "project " + "project" ] }, { @@ -249,7 +253,7 @@ }, "outputs": [], "source": [ - "assert len(project.events) ==1\n", + "assert len(project.events) == 1\n", "assert isinstance(project.events[0], sy.service.project.project.ProjectRequest)" ] }, @@ -263,13 +267,15 @@ "outputs": [], "source": [ "# The Data Scientist would like to submit another code request after the start of the project\n", - "@sy.syft_function(input_policy=sy.ExactMatch(data=dataset_ptr.assets[0]),\n", - " output_policy=sy.SingleExecutionExactOutput())\n", + "@sy.syft_function(\n", + " input_policy=sy.ExactMatch(data=dataset_ptr.assets[0]),\n", + " output_policy=sy.SingleExecutionExactOutput()\n", + ")\n", "def calculate_mean(data):\n", " import opendp.prelude as dp\n", " dp.enable_features(\"contrib\")\n", " from opendp.measurements import make_laplace\n", - " \n", + "\n", " #compute mean\n", " mean = data.mean()\n", " base_lap = dp.m.make_base_laplace(\n", @@ -290,7 +296,7 @@ }, "outputs": [], "source": [ - "res = project.create_code_request(calculate_mean ,ds_client)\n", + "res = project.create_code_request(calculate_mean, ds_client)\n", "res" ] }, @@ -482,7 +488,7 @@ }, "outputs": [], "source": [ - "assert isinstance(mean_result,float)" + "assert isinstance(mean_result, float)" ] }, { @@ -515,7 +521,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.11.4" + "version": "3.11.5" }, "toc": { "base_numbering": 1, diff --git a/notebooks/helm/docker helm syft.ipynb b/notebooks/helm/docker helm syft.ipynb index 4c0bb142da9..5e40756d2a2 100644 --- a/notebooks/helm/docker helm syft.ipynb +++ b/notebooks/helm/docker helm syft.ipynb @@ -23,7 +23,7 @@ }, { "cell_type": "markdown", - "id": "7408a9e7", + "id": "732a9097", "metadata": {}, "source": [ "Start this using" @@ -31,7 +31,7 @@ }, { "cell_type": "markdown", - "id": "96297734", + "id": "e0d0a11e", "metadata": {}, "source": [ "`docker compose --profile blob-storage --file docker-compose.multinode.yml --file docker-compose.dev.yml up`" @@ -70,7 +70,31 @@ { "cell_type": "code", "execution_count": 3, - "id": "a717309a", + "id": "d84a897e", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
SyftSuccess: 3 workers added

" + ], + "text/plain": [ + "SyftSuccess: 3 workers added" + ] + }, + "execution_count": 3, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "client.worker.start_workers(n=3)" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "4cea5229", "metadata": {}, "outputs": [ { @@ -78,18 +102,20 @@ "text/html": [ "\n", "\n", + "\n", + "\n", + "
\n", + "
\n", + "
\n", + "

UserView List

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

0

\n", + "
\n", + "
\n", + " \n", + "
\n", + "
\n", + " \n", + "
\n", + "
\n", + " \n", + " \n" ], "text/plain": [ - "Pointer:\n", - "syft.types.blob_storage.BlobFile" + "" ] }, - "execution_count": 4, + "execution_count": 13, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "sy.ActionObject.from_path(path=\"scenario_data.jsonl\").send(client)" + "client.users" ] }, { "cell_type": "code", - "execution_count": 5, + "execution_count": 14, "id": "d9841e62", "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
SyftWarning: You're performing an operation on high side domain which could host datasets with private information.

" - ], - "text/plain": [ - "SyftWarning: You're performing an operation on high side domain which could host datasets with private information." - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "text/html": [ - "
\n"
-      ],
-      "text/plain": []
-     },
-     "metadata": {},
-     "output_type": "display_data"
-    },
-    {
-     "name": "stdout",
-     "output_type": "stream",
-     "text": [
-      "Would you like to proceed? [y/n]: y\n"
-     ]
-    },
-    {
-     "data": {
-      "text/html": [
-       "
SyftWarning: You're performing an operation on high side domain which could host datasets with private information.

" - ], - "text/plain": [ - "SyftWarning: You're performing an operation on high side domain which could host datasets with private information." - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "text/html": [ - "
\n"
-      ],
-      "text/plain": []
-     },
-     "metadata": {},
-     "output_type": "display_data"
-    },
-    {
-     "name": "stdout",
-     "output_type": "stream",
-     "text": [
-      "Would you like to proceed? [y/n]: y\n"
-     ]
-    },
-    {
-     "data": {
-      "text/html": [
-       "
SyftWarning: You're performing an operation on high side domain which could host datasets with private information.

" - ], - "text/plain": [ - "SyftWarning: You're performing an operation on high side domain which could host datasets with private information." - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "text/html": [ - "
\n"
-      ],
-      "text/plain": []
-     },
-     "metadata": {},
-     "output_type": "display_data"
-    },
-    {
-     "name": "stdout",
-     "output_type": "stream",
-     "text": [
-      "Would you like to proceed? [y/n]: y\n"
-     ]
-    }
-   ],
+   "outputs": [],
    "source": [
     "scenario_obj = ActionObject.from_obj([\n",
     "    sy.ActionObject.from_path(path=\"scenario_data.jsonl\").send(client).syft_action_data for i in range(2)])\n",
@@ -864,98 +1363,10 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 6,
+   "execution_count": 15,
    "id": "3fa3a20a",
    "metadata": {},
-   "outputs": [
-    {
-     "data": {
-      "text/html": [
-       "
SyftWarning: You're performing an operation on high side domain which could host datasets with private information.

" - ], - "text/plain": [ - "SyftWarning: You're performing an operation on high side domain which could host datasets with private information." - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "text/html": [ - "
\n"
-      ],
-      "text/plain": []
-     },
-     "metadata": {},
-     "output_type": "display_data"
-    },
-    {
-     "name": "stdout",
-     "output_type": "stream",
-     "text": [
-      "Would you like to proceed? [y/n]: y\n"
-     ]
-    },
-    {
-     "data": {
-      "text/html": [
-       "
SyftWarning: You're performing an operation on high side domain which could host datasets with private information.

" - ], - "text/plain": [ - "SyftWarning: You're performing an operation on high side domain which could host datasets with private information." - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "text/html": [ - "
\n"
-      ],
-      "text/plain": []
-     },
-     "metadata": {},
-     "output_type": "display_data"
-    },
-    {
-     "name": "stdout",
-     "output_type": "stream",
-     "text": [
-      "Would you like to proceed? [y/n]: y\n"
-     ]
-    },
-    {
-     "data": {
-      "text/html": [
-       "
SyftWarning: You're performing an operation on high side domain which could host datasets with private information.

" - ], - "text/plain": [ - "SyftWarning: You're performing an operation on high side domain which could host datasets with private information." - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "text/html": [ - "
\n"
-      ],
-      "text/plain": []
-     },
-     "metadata": {},
-     "output_type": "display_data"
-    },
-    {
-     "name": "stdout",
-     "output_type": "stream",
-     "text": [
-      "Would you like to proceed? [y/n]: y\n"
-     ]
-    }
-   ],
+   "outputs": [],
    "source": [
     "# TODO: fix way we send list of files\n",
     "input_obj = ActionObject.from_obj([\n",
@@ -963,17 +1374,6 @@
     "input_files_ptr = input_obj.send(client)"
    ]
   },
-  {
-   "cell_type": "code",
-   "execution_count": 7,
-   "id": "93f9acd9",
-   "metadata": {},
-   "outputs": [],
-   "source": [
-    "# for line in input_files_ptr.syft_action_data[0].iter_lines():\n",
-    "#     print(line)"
-   ]
-  },
   {
    "cell_type": "markdown",
    "id": "bd60b056",
@@ -984,7 +1384,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 8,
+   "execution_count": 16,
    "id": "aa3a5c31",
    "metadata": {},
    "outputs": [
@@ -1086,7 +1486,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 9,
+   "execution_count": 17,
    "id": "2f23c7ae",
    "metadata": {},
    "outputs": [
@@ -1099,7 +1499,7 @@
        "SyftSuccess: User Code Submitted"
       ]
      },
-     "execution_count": 9,
+     "execution_count": 17,
      "metadata": {},
      "output_type": "execute_result"
     }
@@ -1110,7 +1510,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 10,
+   "execution_count": 18,
    "id": "27be4dc4",
    "metadata": {},
    "outputs": [
@@ -1147,28 +1547,59 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 11,
-   "id": "bcb9ad4c",
+   "execution_count": 19,
+   "id": "82d92df1",
    "metadata": {},
    "outputs": [
     {
      "data": {
+      "text/html": [
+       "\n",
+       "            \n",
+       "            
\n", + "

Request

\n", + "

Id: bdcc739fa1d64c8483da9ae710b40001

\n", + "

Request time: 2023-10-16 11:10:24

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

Changes: Request to change main_function to permission RequestStatus.APPROVED.

\n", + "

Status: RequestStatus.PENDING

\n", + "

Requested on: High-side of type Domain owned by info@openmined.org

\n", + "

Requested by: Jane Doe (info@openmined.org)

\n", + "
\n", + "\n", + " " + ], + "text/markdown": [ + "```python\n", + "class Request:\n", + " id: str = bdcc739fa1d64c8483da9ae710b40001\n", + " request_time: str = 2023-10-16 11:10:24\n", + " updated_at: str = None\n", + " status: str = RequestStatus.PENDING\n", + " changes: str = ['Request to change main_function to permission RequestStatus.APPROVED']\n", + " requesting_user_verify_key: str = ca15b7c90cb70bb3ea532407ebba4011e6a4139fa79ce072647c99d84145b609\n", + "\n", + "```" + ], "text/plain": [ - "" + "syft.service.request.request.Request" ] }, - "execution_count": 11, + "execution_count": 19, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "input_files_ptr.id" + "client.code.request_code_execution(main_function)" ] }, { "cell_type": "code", - "execution_count": 12, + "execution_count": 20, "id": "29ee2790", "metadata": {}, "outputs": [ @@ -1205,25 +1636,24 @@ { "data": { "text/html": [ - "
SyftSuccess: Request 6d7314ffb67c41f58795ec56c6997b89 changes applied

" + "
SyftSuccess: Request bdcc739fa1d64c8483da9ae710b40001 changes applied

" ], "text/plain": [ - "SyftSuccess: Request 6d7314ffb67c41f58795ec56c6997b89 changes applied" + "SyftSuccess: Request bdcc739fa1d64c8483da9ae710b40001 changes applied" ] }, - "execution_count": 12, + "execution_count": 20, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "client.code.request_code_execution(main_function)\n", "client.requests[-1].approve()" ] }, { "cell_type": "code", - "execution_count": 13, + "execution_count": 21, "id": "78b084c0", "metadata": {}, "outputs": [], @@ -1241,7 +1671,7 @@ }, { "cell_type": "code", - "execution_count": 14, + "execution_count": 25, "id": "55c3bee6", "metadata": {}, "outputs": [ @@ -1250,13 +1680,14 @@ "text/markdown": [ "```python\n", "class Job:\n", - " id: UID = 179a31fe609b4dc2b0d7b69df7b7c644\n", - " status: created\n", + " id: UID = d8a2c1f48d814f81b623e85a70eacb17\n", + " status: completed\n", " has_parent: False\n", - " result: None\n", + " result: ActionDataEmpty UID: dd13e556f95543b19c121b6e45b1d92f \n", " logs:\n", "\n", "0 \n", + "JOB COMPLETED\n", " \n", "```" ], @@ -1264,7 +1695,7 @@ "syft.service.job.job_stash.Job" ] }, - "execution_count": 14, + "execution_count": 25, "metadata": {}, "output_type": "execute_result" } @@ -1275,7 +1706,7 @@ }, { "cell_type": "code", - "execution_count": 15, + "execution_count": 27, "id": "cf89cf33", "metadata": {}, "outputs": [ @@ -1284,18 +1715,20 @@ "text/html": [ "\n", "\n", + "\n", + "\n", + "
\n", + "
\n", + "
\n", + "

DockerWorker List

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

0

\n", + "
\n", + "
\n", + " \n", + "
\n", + "
\n", + " \n", + "
\n", + "
\n", + " \n", + " \n" + ], + "text/plain": [ + "[syft.service.worker.worker_service.DockerWorker,\n", + " syft.service.worker.worker_service.DockerWorker,\n", + " syft.service.worker.worker_service.DockerWorker]" + ] + }, + "execution_count": 8, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "workers" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "28c5e351", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
SyftSuccess: 2 workers stopped

" + ], + "text/plain": [ + "SyftSuccess: 2 workers stopped" + ] + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "client.worker.stop(workers)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "542ec911", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "2ac0c822", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "3f1ce246", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "210a3bbd", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "4e95077d", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "87ca6d8a", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "id": "659434fe", + "metadata": {}, + "source": [ + "## DEV" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "38d0fa4a", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "0d2cc165", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "09c2d6ac", + "metadata": {}, + "outputs": [], + "source": [ + "import docker" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "id": "6934ec8f", + "metadata": {}, + "outputs": [], + "source": [ + "image = \"openmined/grid-backend\"\n", + "client = docker.from_env()" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "id": "c7bb1389", + "metadata": {}, + "outputs": [], + "source": [ + "PYSYFT_DIR = f\"/Users/koen/workspace/pysyft\"" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "id": "a742f934", + "metadata": {}, + "outputs": [], + "source": [ + "volumes = {\n", + " f'{PYSYFT_DIR}/packages/syft': {'bind': '/app/syft', 'mode': 'rw'},\n", + " f'{PYSYFT_DIR}/packages/grid/backend/grid': {'bind': '/app/grid', 'mode': 'rw'},\n", + " \"/var/run/docker.sock\": {\"bind\": \"/var/run/docker.sock\"}\n", + "\n", + "}" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "id": "09b15930", + "metadata": {}, + "outputs": [], + "source": [ + "def get_default_env_vars():\n", + " env_path = f\"{PYSYFT_DIR}/packages/grid/.env\"\n", + "\n", + " with open(env_path, \"r\") as f:\n", + " lines = f.read().splitlines()\n", + "\n", + " default_env_vars = dict()\n", + " for l in lines:\n", + " if \"=\" in l:\n", + " try:\n", + " var_name, value = l.split(\"=\", 1)\n", + " \n", + " def remove_redundant_quotes(value):\n", + " for s in ['\"', \"'\"]:\n", + " if len(value) !=0:\n", + " if value[0] == s:\n", + " value = value[1:]\n", + " if value[-1] == s:\n", + " value = value[:-1]\n", + " \n", + " value = remove_redundant_quotes(value)\n", + " default_env_vars[var_name] = value\n", + " except Exception as e:\n", + " print(\"error parsing env file\", e)\n", + " return default_env_vars" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "id": "85a5ed92", + "metadata": {}, + "outputs": [], + "source": [ + "def get_env_vars():\n", + " default_env_vars = get_default_env_vars()\n", + " import secrets\n", + " worker_tag = \"\".join([str(secrets.choice(list(range(10)))) for i in range(10)])\n", + "\n", + " extra_env_vars = {\n", + " \"SERVICE_NAME\": \"backend\",\n", + " \"CREATE_PRODUCER\": \"false\",\n", + " \"N_CONSUMERS\": \"1\",\n", + " \"DEV_MODE\": \"True\",\n", + " \"DEFAULT_ROOT_USERNAME\": f\"worker-{worker_tag}\",\n", + " \"PORT\": \"8003\",\n", + " \"HTTP_PORT\": \"88\",\n", + " \"HTTPS_PORT\": \"446\",\n", + " \"DEFAULT_ROOT_EMAIL\": f\"{worker_tag}@openmined.org\"\n", + " \n", + " }\n", + "\n", + " return {**default_env_vars, **extra_env_vars}\n", + " " + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "id": "4a92d374", + "metadata": {}, + "outputs": [], + "source": [ + "import random" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "id": "1aa550f7", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "220" + ] + }, + "execution_count": 18, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "random.randint(0, 1000)" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "id": "a0450b60", + "metadata": {}, + "outputs": [], + "source": [ + "env_vars = get_env_vars()" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "id": "17f547d4", + "metadata": {}, + "outputs": [], + "source": [ + "from pprint import pprint" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "id": "bc445c39", + "metadata": {}, + "outputs": [ + { + "ename": "ModuleNotFoundError", + "evalue": "No module named 'grid'", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mModuleNotFoundError\u001b[0m Traceback (most recent call last)", + "Cell \u001b[0;32mIn[21], line 1\u001b[0m\n\u001b[0;32m----> 1\u001b[0m \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;21;01mgrid\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mbackend\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mcore\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mconfig\u001b[39;00m \u001b[38;5;28;01mimport\u001b[39;00m settings\n", + "\u001b[0;31mModuleNotFoundError\u001b[0m: No module named 'grid'" + ] + } + ], + "source": [ + "from grid.backend.core.config import settings" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "id": "1835d02b", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "'/Users/koen/workspace/pysyft'" + ] + }, + "execution_count": 22, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "from pathlib import Path\n", + "str(Path(\"/Users/koen/workspace/pysyft/packages/grid\").parent.parent)" + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "id": "13cc6c67", + "metadata": {}, + "outputs": [], + "source": [ + "# pprint(env_vars)" + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "id": "f58bd1eb", + "metadata": {}, + "outputs": [], + "source": [ + "# env_vars" + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "id": "4ce97360", + "metadata": {}, + "outputs": [], + "source": [ + "# client.containers" + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "id": "d7b0f47b", + "metadata": {}, + "outputs": [], + "source": [ + "# client.containers.run('alpine', 'echo hello world', )" + ] + }, + { + "cell_type": "code", + "execution_count": 31, + "id": "8eb7cb8b", + "metadata": {}, + "outputs": [], + "source": [ + "res = client.containers.run(image=image, volumes=volumes, environment=env_vars,\n", + " detach=True, network_mode=\"container:grid-proxy-1\")" + ] + }, + { + "cell_type": "code", + "execution_count": 32, + "id": "d1608704", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "'b7a8e3c2a0b8295d22bebdcd004d7a2f14b05c187c4b3cc20a37e914938aee63'" + ] + }, + "execution_count": 32, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "res.id" + ] + }, + { + "cell_type": "code", + "execution_count": 118, + "id": "b5d9e7b7", + "metadata": {}, + "outputs": [], + "source": [ + "for x in client.containers.list(filters={\"id\": res.id}):\n", + " x.stop()" + ] + }, + { + "cell_type": "code", + "execution_count": 123, + "id": "92d85752", + "metadata": {}, + "outputs": [], + "source": [ + "x = res.stop()" + ] + }, + { + "cell_type": "code", + "execution_count": 121, + "id": "9dd4e6ca", + "metadata": {}, + "outputs": [], + "source": [ + "x" + ] + }, + { + "cell_type": "code", + "execution_count": 50, + "id": "72f128d9", + "metadata": {}, + "outputs": [], + "source": [ + "# print(res.logs().decode())" + ] + }, + { + "cell_type": "code", + "execution_count": 62, + "id": "a918bd10", + "metadata": {}, + "outputs": [], + "source": [ + "# env_vars[\"BACKEND_CORS_ORIGINS\"].replace(\"\\'\", \"'\")" + ] + }, + { + "cell_type": "code", + "execution_count": 56, + "id": "197c1277", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "['http://localhost',\n", + " 'http://localhost:4200',\n", + " 'http://localhost:3000',\n", + " 'http://localhost:8080',\n", + " 'https://localhost',\n", + " 'https://localhost:4200',\n", + " 'https://localhost:3000',\n", + " 'https://localhost:8080',\n", + " 'http://dev.grid.openmined.org',\n", + " 'https://stag.grid.openmined.org',\n", + " 'https://grid.openmined.org']" + ] + }, + "execution_count": 56, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "[\"http://localhost\",\"http://localhost:4200\",\"http://localhost:3000\",\"http://localhost:8080\",\"https://localhost\",\"https://localhost:4200\",\"https://localhost:3000\",\"https://localhost:8080\",\"http://dev.grid.openmined.org\",\"https://stag.grid.openmined.org\",\"https://grid.openmined.org\"]" + ] + }, + { + "cell_type": "code", + "execution_count": 57, + "id": "ec5208ac", + "metadata": {}, + "outputs": [], + "source": [ + "# for k, v in env_vars.items():\n", + "# print(f\"{k}={v}\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "e40cd44b", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "2a4d5566", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "af7db453", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "164513fd", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "id": "2adb65af", + "metadata": {}, + "source": [ + "\n", + " \"Mounts\": [\n", + " {\n", + " \"Type\": \"bind\",\n", + " \"Source\": \"/Users/koen/workspace/pysyft/packages/grid/data/package-cache\",\n", + " \"Destination\": \"/root/.cache\",\n", + " \"Mode\": \"rw\",\n", + " \"RW\": true,\n", + " \"Propagation\": \"rprivate\"\n", + " },\n", + " {\n", + " \"Type\": \"bind\",\n", + " \"Source\": \"/Users/koen/workspace/pysyft/packages/grid/backend/grid\",\n", + " \"Destination\": \"/app/grid\",\n", + " \"Mode\": \"rw\",\n", + " \"RW\": true,\n", + " \"Propagation\": \"rprivate\"\n", + " },\n", + " {\n", + " \"Type\": \"bind\",\n", + " \"Source\": \"/Users/koen/workspace/pysyft/packages/syft\",\n", + " \"Destination\": \"/app/syft\",\n", + " \"Mode\": \"rw\",\n", + " \"RW\": true,\n", + " \"Propagation\": \"rprivate\"\n", + " },\n", + " {\n", + " \"Type\": \"volume\",\n", + " \"Name\": \"grid_credentials-data-worker\",\n", + " \"Source\": \"/var/lib/docker/volumes/grid_credentials-data-worker/_data\",\n", + " \"Destination\": \"/storage\",\n", + " \"Driver\": \"local\",\n", + " \"Mode\": \"z\",\n", + " \"RW\": true,\n", + " \"Propagation\": \"\"\n", + " }\n", + " ],\n", + " \"Config\": {\n", + " \"Hostname\": \"high-side\",\n", + " \"Domainname\": \"\",\n", + " \"User\": \"\",\n", + " \"AttachStdin\": false,\n", + " \"AttachStdout\": true,\n", + " \"AttachStderr\": true,\n", + " \"Tty\": true,\n", + " \"OpenStdin\": true,\n", + " \"StdinOnce\": false,\n", + " \"Env\": [\n", + " \"TRAEFIK_TLS_CERTS=./traefik/certs\",\n", + " \"S3_ROOT_PWD=admin\",\n", + " \"REDIS_STORE_DB_ID=0\",\n", + " \"ASSOCIATION_TIMEOUT=10\",\n", + " \"REDIS_HOST=redis\",\n", + " \"DOCKER_IMAGE_WORKER=openmined/grid-enclave\",\n", + " \"QUEUE_PORT=5556\",\n", + " \"FRONTEND_TARGET=grid-ui-production\",\n", + " \"DOCKER_IMAGE_HEADSCALE=openmined/grid-vpn-headscale\",\n", + " \"DOCKER_IMAGE_TRAEFIK=traefik\",\n", + " \"TRAEFIK_TAG=2b0a5be942b68dde2b00b8bca4514e4dde7f312d0d5cd397a9733bb1520f5b47\",\n", + " \"SMTP_TLS=True\",\n", + " \"S3_ENDPOINT=seaweedfs\",\n", + " \"HTTPS_PORT=445\",\n", + " \"OBLV_KEY_PATH=~/.oblv\",\n", + " \"ENABLE_WARNINGS=True\",\n", + " \"USE_BLOB_STORAGE=True\",\n", + " \"TRAEFIK_TLS_CONF=./traefik/dynamic-configurations\",\n", + " \"ENABLE_OBLV=false\",\n", + " \"JAEGER_HOST=localhost\",\n", + " \"DOCKER_BUILDKIT=1\",\n", + " \"S3_PRESIGNED_TIMEOUT_SECS=1800\",\n", + " \"RELEASE=production\",\n", + " \"STACK_NAME=grid-openmined-org\",\n", + " \"USERS_OPEN_REGISTRATION=False\",\n", + " \"EMAILS_FROM_EMAIL=info@openmined.org\",\n", + " \"PROJECT_NAME=grid\",\n", + " \"SERVER_HOST=https://localhost\",\n", + " \"HTTP_PORT=87\",\n", + " \"ENABLE_SIGNUP=False\",\n", + " \"TRAEFIK_PUBLIC_NETWORK_IS_EXTERNAL=False\",\n", + " \"VERSION=0.8.2-beta.6\",\n", + " \"TRAEFIK_VERSION=v2.8.1\",\n", + " \"S3_ROOT_USER=admin\",\n", + " \"VERSION_HASH=dockerhub\",\n", + " \"MONGO_HOST=mongo\",\n", + " \"DOCKER_IMAGE_BACKEND=openmined/grid-backend\",\n", + " \"IGNORE_TLS_ERRORS=False\",\n", + " \"HEADSCALE_PORT=8080\",\n", + " \"CONTAINER_HOST=docker\",\n", + " \"SMTP_USER=\",\n", + " \"VITE_PUBLIC_API_BASE_URL=/api/v2\",\n", + " \"DEV_MODE=True\",\n", + " \"CREATE_PRODUCER=false\",\n", + " \"SECRET_KEY=changethis\",\n", + " \"STACK_API_KEY=zXuYOLdamjg70sB5IoVQCM5gdxGK9R79Otu9L9ZnaDZCqyeV\",\n", + " \"TRACE=False\",\n", + " \"SERVICE_NAME=backend\",\n", + " \"MONGO_IMAGE=mongo\",\n", + " \"USE_NEW_SERVICE=False\",\n", + " \"JAX_ENABLE_X64=True\",\n", + " \"REDIS_PORT=6379\",\n", + " \"MONGO_VERSION=7.0.0\",\n", + " \"TRAEFIK_PUBLIC_NETWORK=traefik-public\",\n", + " \"DEFAULT_ROOT_PASSWORD=changethis\",\n", + " \"NETWORK_NAME=omnet\",\n", + " \"SEAWEEDFS_VERSION=3.55\",\n", + " \"COMPOSE_DOCKER_CLI_BUILD=1\",\n", + " \"TRAEFIK_PUBLIC_TAG=traefik-public\",\n", + " \"SMTP_PASSWORD=\",\n", + " \"RABBITMQ_VERSION=3\",\n", + " \"REDIS_VERSION=6.2\",\n", + " \"NETWORK_CHECK_INTERVAL=60\",\n", + " \"DOMAIN_CHECK_INTERVAL=60\",\n", + " \"DOCKER_IMAGE_SEAWEEDFS=chrislusf/seaweedfs\",\n", + " \"DEFAULT_ROOT_EMAIL=info2@openmined.org\",\n", + " \"NODE_SIDE_TYPE=high\",\n", + " \"S3_VOLUME_SIZE_MB=1024\",\n", + " \"DOCKER_IMAGE_TAILSCALE=openmined/grid-vpn-tailscale\",\n", + " \"S3_PORT=8333\",\n", + " \"NODE_TYPE=domain\",\n", + " \"DOCKER_IMAGE_FRONTEND=openmined/grid-frontend\",\n", + " \"SMTP_HOST=\",\n", + " \"SMTP_PORT=587\",\n", + " \"MONGO_USERNAME=root\",\n", + " \"SYFT_TUTORIAL_MODE=False\",\n", + " \"RELATIVE_PATH=\",\n", + " \"JAEGER_PORT=14268\",\n", + " \"BACKEND_STORAGE_PATH=credentials-data\",\n", + " \"DOMAIN_CONNECTION_PORT=3030\",\n", + " \"REDIS_LEDGER_DB_ID=1\",\n", + " \"N_CONSUMERS=1\",\n", + " \"BACKEND_CORS_ORIGINS=[\\\"http://localhost\\\",\\\"http://localhost:4200\\\",\\\"http://localhost:3000\\\",\\\"http://localhost:8080\\\",\\\"https://localhost\\\",\\\"https://localhost:4200\\\",\\\"https://localhost:3000\\\",\\\"https://localhost:8080\\\",\\\"http://dev.grid.openmined.org\\\",\\\"https://stag.grid.openmined.org\\\",\\\"https://grid.openmined.org\\\"]\",\n", + " \"DEFAULT_ROOT_USERNAME=worker1\",\n", + " \"NODE_NAME=high-side\",\n", + " \"S3_REGION=us-east-1\",\n", + " \"MONGO_PASSWORD=example\",\n", + " \"PORT=8002\",\n", + " \"DOCKER_IMAGE_VPN_IPTABLES=openmined/grid-vpn-iptables\",\n", + " \"DOMAIN=localhost\",\n", + " \"MONGO_PORT=27017\",\n", + " \"DOCKER_IMAGE_SVELTE=openmined/grid-svelte\",\n", + " \"PATH=/root/.local/bin:/usr/local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin\",\n", + " \"LANG=C.UTF-8\",\n", + " \"GPG_KEY=A035C8C19219BA821ECEA86B64E628F8D684696D\",\n", + " \"PYTHON_VERSION=3.11.4\",\n", + " \"PYTHON_PIP_VERSION=23.1.2\",\n", + " \"PYTHON_SETUPTOOLS_VERSION=65.5.1\",\n", + " \"PYTHON_GET_PIP_URL=https://github.com/pypa/get-pip/raw/0d8570dc44796f4369b652222cf176b3db6ac70e/public/get-pip.py\",\n", + " \"PYTHON_GET_PIP_SHA256=96461deced5c2a487ddc65207ec5a9cffeca0d34e7af7ea1afc470ff0d746207\",\n", + " \"PYTHONPATH=/app\"\n", + " ],\n", + " \"Cmd\": [\n", + " \"/app/grid/start.sh\"\n", + " ],\n", + " \"Image\": \"openmined/grid-backend:0.8.2-beta.6\",\n", + " \"Volumes\": null,\n", + " \"WorkingDir\": \"/app\",\n", + " \"Entrypoint\": null,\n", + " \"OnBuild\": null,\n", + " \"Labels\": {\n", + " \"com.docker.compose.config-hash\": \"c14a5d85da73c7c973ad7274199b22309e5a5e2d4ac1e6ac18e52b10457af660\",\n", + " \"com.docker.compose.container-number\": \"1\",\n", + " \"com.docker.compose.depends_on\": \"proxy:service_started:false,backend:service_started:false\",\n", + " \"com.docker.compose.image\": \"sha256:95c41545ecfa8667a2353d825420be76da65eb85c0dc1e85da65d1b1961a019c\",\n", + " \"com.docker.compose.oneoff\": \"False\",\n", + " \"com.docker.compose.project\": \"grid\",\n", + " \"com.docker.compose.project.config_files\": \"/Users/koen/workspace/pysyft/packages/grid/docker-compose.multinode.yml,/Users/koen/workspace/pysyft/packages/grid/docker-compose.dev.yml\",\n", + " \"com.docker.compose.project.working_dir\": \"/Users/koen/workspace/pysyft/packages/grid\",\n", + " \"com.docker.compose.service\": \"backendworker\",\n", + " \"com.docker.compose.version\": \"2.19.1\",\n", + " \"orgs.openmined.syft\": \"this is a syft backend container\"\n", + " }\n", + " },\n", + " \"NetworkSettings\": {\n", + " \"Bridge\": \"\",\n", + " \"SandboxID\": \"\",\n", + " \"HairpinMode\": false,\n", + " \"LinkLocalIPv6Address\": \"\",\n", + " \"LinkLocalIPv6PrefixLen\": 0,\n", + " \"Ports\": {},\n", + " \"SandboxKey\": \"\",\n", + " \"SecondaryIPAddresses\": null,\n", + " \"SecondaryIPv6Addresses\": null,\n", + " \"EndpointID\": \"\",\n", + " \"Gateway\": \"\",\n", + " \"GlobalIPv6Address\": \"\",\n", + " \"GlobalIPv6PrefixLen\": 0,\n", + " \"IPAddress\": \"\",\n", + " \"IPPrefixLen\": 0,\n", + " \"IPv6Gateway\": \"\",\n", + " \"MacAddress\": \"\",\n", + " \"Networks\": {}\n", + " }\n", + " }\n", + "]" + ] + } + ], + "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.9.16" + }, + "toc": { + "base_numbering": 1, + "nav_menu": {}, + "number_sections": true, + "sideBar": true, + "skip_h1_title": false, + "title_cell": "Table of Contents", + "title_sidebar": "Contents", + "toc_cell": false, + "toc_position": {}, + "toc_section_display": true, + "toc_window_display": true + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/notebooks/tutorials/enclaves/Enclave-single-notebook-DO-DS.ipynb b/notebooks/tutorials/enclaves/Enclave-single-notebook-DO-DS.ipynb index 5b80e61856c..1346d11086d 100644 --- a/notebooks/tutorials/enclaves/Enclave-single-notebook-DO-DS.ipynb +++ b/notebooks/tutorials/enclaves/Enclave-single-notebook-DO-DS.ipynb @@ -544,7 +544,7 @@ "metadata": {}, "outputs": [], "source": [ - "for st in status.status_dict.values():\n", + "for st, _ in status.status_dict.values():\n", " assert st == sy.service.request.request.UserCodeStatus.APPROVED" ] }, diff --git a/packages/.dockerignore b/packages/.dockerignore index 48a0a5653c1..559e945a401 100644 --- a/packages/.dockerignore +++ b/packages/.dockerignore @@ -1,3 +1,4 @@ grid/data grid/packer grid/.devspace +syftcli \ No newline at end of file diff --git a/packages/grid/VERSION b/packages/grid/VERSION index eb0c9fba798..c45494e2144 100644 --- a/packages/grid/VERSION +++ b/packages/grid/VERSION @@ -1,5 +1,5 @@ # Mono Repo Global Version -__version__ = "0.8.2-beta.33" +__version__ = "0.8.2-beta.35" # elsewhere we can call this file: `python VERSION` and simply take the stdout # stdlib diff --git a/packages/grid/backend/JAX.MD b/packages/grid/backend/JAX.MD deleted file mode 100644 index c727621c10e..00000000000 --- a/packages/grid/backend/JAX.MD +++ /dev/null @@ -1,84 +0,0 @@ -# Building jaxlib for linux Arm64 to run in Docker on Apple Silicon - -Create a high CPU linux x86 machine. I used 32 CPUs on Azure and compilation took 4.5 hours. - -Once the latest docker is setup run the following steps. - -It is recommended to build on an ARM machine to conserve on time. - -## Create a buildx builder for arm64 - -Perform this step if you are building on an `x86` machine or else skip it - -``` -$ docker buildx create --platform linux/arm64 --name arm64builder -$ docker buildx use arm64builder -``` - -## Install the QEMU arm64 emulator layers so you can run the container - -Perform this step if you are building on an `x86` machine or else skip it - -``` -$ docker run --privileged --rm tonistiigi/binfmt --install arm64 -$ docker run --rm --privileged multiarch/qemu-user-static --reset -p yes -``` - -## Build the dockerfile using arm64 - -``` -$ docker buildx build --platform linux/arm64 -f build_jax.dockerfile . --output "type=docker,name=build_jax_arm64:latest" -``` - -## Run the container to start the build - -``` -$ mkdir bazel_cache -$ docker run -it --platform linux/arm64 -v `pwd`/bazel_cache:/root/.cache build_jax_arm64 bash -``` - -## Verify you are running arm64 - -``` -$ uname -a -Linux a875c1c357a3 5.13.0-1017-azure #19~20.04.1-Ubuntu SMP Mon Mar 7 11:34:26 UTC 2022 aarch64 GNU/Linux -``` - -## Confirm your GLIBC version - -If this doesn't match the environment you will be running the jaxlib wheel it might fail. -In this case we are using the same `FROM python:3.11.4-slim as build` to build as jaxlib we do in our production container to run it. - -``` -$ ldd --version -ldd (Debian GLIBC 2.31-13+deb11u3) 2.31 -``` - -## Checkout the version you want to build - -``` -$ cd jax -$ git fetch --all --tags -$ git checkout tags/jaxlib-v0.4.10 -b jaxlib-v0.4.10 -``` - -## Start the build - -``` -$ export JAXLIB_RELEASE=True # needed to prevent dev tagging in version -$ python3 /jax/build/build.py --target_cpu_features native -``` - -## Check it worked - -``` -$ pip install dist/*.whl -``` - -## Copy out the wheel - -``` -$ pip install --user magic-wormhole -$ /root/.local/bin/wormhole send /jax/build/dist/jaxlib-0.4.10-cp311-none-manylinux2014_aarch64.whl -# run wormhole recieve on the other end -``` diff --git a/packages/grid/backend/backend.dockerfile b/packages/grid/backend/backend.dockerfile index 3c7cc34ed15..6a2208655b8 100644 --- a/packages/grid/backend/backend.dockerfile +++ b/packages/grid/backend/backend.dockerfile @@ -22,13 +22,6 @@ RUN --mount=type=cache,target=/root/.cache \ RUN --mount=type=cache,target=/root/.cache \ pip install --user jupyterlab -# copy precompiled arm64 packages -COPY grid/backend/wheels /wheels -RUN --mount=type=cache,target=/root/.cache if [ $(uname -m) != "x86_64" ]; then \ - pip install --user /wheels/jaxlib-0.4.16-cp311-cp311-manylinux2014_aarch64.whl; \ - pip install --user jax==0.4.16; \ - fi - WORKDIR /app # Backend diff --git a/packages/grid/backend/build_jax.dockerfile b/packages/grid/backend/build_jax.dockerfile deleted file mode 100644 index 411ef338183..00000000000 --- a/packages/grid/backend/build_jax.dockerfile +++ /dev/null @@ -1,20 +0,0 @@ -FROM python:3.11.3-slim as build -RUN apt-get -y update && apt-get -y upgrade && apt-get -y dist-upgrade -RUN apt-get -y install \ - g++ \ - gcc \ - git \ - libffi-dev \ - libssl-dev \ - musl-dev \ - openssl \ - python3 \ - python3-dev \ - python3-pip -RUN pip3 install --upgrade pip setuptools numpy wheel build -RUN git clone https://github.com/google/jax.git - -CMD ["bash"] - -# RUN python3 jax/build/build.py --target_cpu_features default -# RUN pip3 install dist/*.whl diff --git a/packages/grid/backend/grid/core/config.py b/packages/grid/backend/grid/core/config.py index 5e17d78f463..f8daaac0f33 100644 --- a/packages/grid/backend/grid/core/config.py +++ b/packages/grid/backend/grid/core/config.py @@ -106,6 +106,7 @@ def get_emails_enabled(cls, v: bool, values: Dict[str, Any]) -> bool: MONGO_PORT: int = int(os.getenv("MONGO_PORT", 0)) MONGO_USERNAME: str = str(os.getenv("MONGO_USERNAME", "")) MONGO_PASSWORD: str = str(os.getenv("MONGO_PASSWORD", "")) + DEV_MODE: bool = True if os.getenv("DEV_MODE", "false").lower() == "true" else False # ZMQ stuff QUEUE_PORT: int = int(os.getenv("QUEUE_PORT", 0)) diff --git a/packages/grid/backend/grid/core/node.py b/packages/grid/backend/grid/core/node.py index 1d9958544f9..8b99f6c44d9 100644 --- a/packages/grid/backend/grid/core/node.py +++ b/packages/grid/backend/grid/core/node.py @@ -75,4 +75,5 @@ document_store_config=mongo_store_config, enable_warnings=enable_warnings, blob_storage_config=blob_storage_config, + dev_mode=settings.DEV_MODE, ) diff --git a/packages/grid/backend/wheels/jaxlib-0.4.16-cp311-cp311-manylinux2014_aarch64.whl b/packages/grid/backend/wheels/jaxlib-0.4.16-cp311-cp311-manylinux2014_aarch64.whl deleted file mode 100644 index 4a8b549e28d..00000000000 Binary files a/packages/grid/backend/wheels/jaxlib-0.4.16-cp311-cp311-manylinux2014_aarch64.whl and /dev/null differ diff --git a/packages/grid/devspace.yaml b/packages/grid/devspace.yaml index da387a42c77..366e826d05f 100644 --- a/packages/grid/devspace.yaml +++ b/packages/grid/devspace.yaml @@ -15,13 +15,13 @@ pipelines: run: |- run_dependencies --all ensure_pull_secrets --all - build_images --all -t $(git rev-parse --short=6 HEAD) -t 0.8.2-beta.33 -t dev-latest + build_images --all -t $(git rev-parse --short=6 HEAD) -t 0.8.2-beta.35 -t dev-latest create_deployments --all vars: DEVSPACE_ENV_FILE: "default.env" CONTAINER_REGISTRY: "docker.io" - VERSION: "0.8.2-beta.33" + VERSION: "0.8.2-beta.35" # This is a list of `images` that DevSpace can build for this project # We recommend to skip image building during development (devspace dev) as much as possible @@ -34,14 +34,14 @@ images: tags: - dev-latest - "${VERSION}" - tailscale: - image: "${CONTAINER_REGISTRY}/${DOCKER_IMAGE_TAILSCALE}" - buildKit: {} - dockerfile: ./vpn/tailscale.dockerfile - context: ./vpn - tags: - - dev-latest - - "${VERSION}" + # tailscale: + # image: "${CONTAINER_REGISTRY}/${DOCKER_IMAGE_TAILSCALE}" + # buildKit: {} + # dockerfile: ./vpn/tailscale.dockerfile + # context: ./vpn + # tags: + # - dev-latest + # - "${VERSION}" frontend: image: "${CONTAINER_REGISTRY}/${DOCKER_IMAGE_FRONTEND}" buildKit: @@ -65,6 +65,11 @@ deployments: manifests: - "k8s/manifests/traefik-domain.yaml" + seaweedfs-config: + kubectl: + manifests: + - "k8s/manifests/seaweedfs.yaml" + proxy: helm: upgradeArgs: @@ -72,7 +77,6 @@ deployments: chart: name: component-chart repo: https://charts.devspace.sh - version: "0.9.0" values: containers: - image: "${DOCKER_IMAGE_TRAEFIK}:${TRAEFIK_VERSION}" @@ -120,7 +124,6 @@ deployments: chart: name: component-chart repo: https://charts.devspace.sh - version: "0.9.0" values: containers: - image: "${CONTAINER_REGISTRY}/${DOCKER_IMAGE_BACKEND}:${VERSION}" @@ -188,6 +191,7 @@ deployments: name: "backend" ports: - port: "${HTTP_PORT}" + mongo: helm: upgradeArgs: @@ -195,7 +199,6 @@ deployments: chart: name: component-chart repo: https://charts.devspace.sh - version: "0.9.0" values: containers: - image: "${MONGO_IMAGE}:${MONGO_VERSION}" @@ -218,6 +221,56 @@ deployments: ports: - port: "27017" + seaweedfs: + helm: + upgradeArgs: + - --dependency-update + chart: + name: component-chart + repo: https://charts.devspace.sh + values: + containers: + - image: "${DOCKER_IMAGE_SEAWEEDFS}:${SEAWEEDFS_VERSION}" + command: + - sh + - /etc/seaweedfs/start.sh + env: + - name: S3_VOLUME_SIZE_MB + value: "${S3_VOLUME_SIZE_MB}" + - name: S3_ROOT_USER + value: "${S3_ROOT_USER}" + - name: S3_ROOT_PWD + value: "${S3_ROOT_PWD}" + - name: S3_PORT + value: "${S3_PORT}" + volumeMounts: + - containerPath: /etc/seaweedfs/filer.toml + volume: + name: seaweedfs-config + subPath: /filer.toml + readOnly: false + - containerPath: /etc/seaweedfs/start.sh + volume: + name: seaweedfs-config + subPath: /start.sh + readOnly: false + - containerPath: /data/blob + volume: + name: seaweedfs-data + subPath: / + readOnly: false + volumes: + - name: seaweedfs-data + size: "5Gi" + - name: seaweedfs-config + configMap: + name: seaweedfs-config + service: + name: seaweedfs + ports: + - port: "8888" # filer + - port: "8333" # S3 + frontend: helm: upgradeArgs: @@ -225,7 +278,6 @@ deployments: chart: name: component-chart repo: https://charts.devspace.sh - version: "0.9.0" values: containers: - image: "${CONTAINER_REGISTRY}/${DOCKER_IMAGE_FRONTEND}:${VERSION}" @@ -248,6 +300,10 @@ dev: imageSelector: "${MONGO_IMAGE}:${MONGO_VERSION}" ports: - port: "27017" + seaweedfs: + imageSelector: "${DOCKER_IMAGE_SEAWEEDFS}:${SEAWEEDFS_VERSION}" + ports: + - port: "9333" # admin backend: imageSelector: "${CONTAINER_REGISTRY}/${DOCKER_IMAGE_BACKEND}" env: diff --git a/packages/grid/docker-compose.dev.yml b/packages/grid/docker-compose.dev.yml index 3faef69b269..7576b9a7427 100644 --- a/packages/grid/docker-compose.dev.yml +++ b/packages/grid/docker-compose.dev.yml @@ -46,6 +46,7 @@ services: - ${RELATIVE_PATH}./data/package-cache:/root/.cache environment: - DEV_MODE=True + - WATCHFILES_FORCE_POLLING=true stdin_open: true tty: true diff --git a/packages/grid/docker-compose.multinode.yml b/packages/grid/docker-compose.multinode.yml index 89afa75e075..8d1eeb27e8b 100644 --- a/packages/grid/docker-compose.multinode.yml +++ b/packages/grid/docker-compose.multinode.yml @@ -138,6 +138,7 @@ services: network_mode: service:proxy volumes: - ${BACKEND_STORAGE_PATH}:/storage + - /var/run/docker.sock:/var/run/docker.sock stdin_open: true tty: true labels: diff --git a/packages/grid/docker-compose.yml b/packages/grid/docker-compose.yml index 833c0fd45ff..b30843a2728 100644 --- a/packages/grid/docker-compose.yml +++ b/packages/grid/docker-compose.yml @@ -105,6 +105,7 @@ services: image: "${DOCKER_IMAGE_BACKEND?Variable not set}:${VERSION-latest}" depends_on: - proxy + - mongo env_file: - .env environment: @@ -134,10 +135,12 @@ services: - QUEUE_PORT=${QUEUE_PORT} - CREATE_PRODUCER=true - N_CONSUMERS=0 + - HOST_GRID_PATH=${PWD} command: "/app/grid/start.sh" network_mode: service:proxy volumes: - ${BACKEND_STORAGE_PATH}:/storage + - /var/run/docker.sock:/var/run/docker.sock stdin_open: true tty: true labels: diff --git a/packages/grid/frontend/package.json b/packages/grid/frontend/package.json index 4fb6d42f4ee..51acba9a3ce 100644 --- a/packages/grid/frontend/package.json +++ b/packages/grid/frontend/package.json @@ -1,6 +1,6 @@ { "name": "pygrid-ui", - "version": "0.8.2-beta.33", + "version": "0.8.2-beta.35", "private": true, "scripts": { "dev": "pnpm i && vite dev --host --port 80", @@ -25,7 +25,7 @@ "eslint": "^8.44.0", "eslint-config-prettier": "^8.8.0", "eslint-plugin-svelte3": "^4.0.0", - "postcss": "^8.4.26", + "postcss": "^8.4.31", "prettier": "^2.8.8", "prettier-plugin-svelte": "^2.10.1", "svelte": "^3.59.2", diff --git a/packages/grid/frontend/pnpm-lock.yaml b/packages/grid/frontend/pnpm-lock.yaml index 915af263ebb..4d8360635d7 100644 --- a/packages/grid/frontend/pnpm-lock.yaml +++ b/packages/grid/frontend/pnpm-lock.yaml @@ -1,9 +1,5 @@ lockfileVersion: '6.0' -settings: - autoInstallPeers: true - excludeLinksFromLockfile: false - dependencies: capnp-ts: specifier: ^0.7.0 @@ -51,7 +47,7 @@ devDependencies: version: 5.62.0(eslint@8.44.0)(typescript@4.9.5) autoprefixer: specifier: ^10.4.14 - version: 10.4.14(postcss@8.4.26) + version: 10.4.14(postcss@8.4.31) dotenv: specifier: ^16.3.1 version: 16.3.1 @@ -68,8 +64,8 @@ devDependencies: specifier: ^4.0.0 version: 4.0.0(eslint@8.44.0)(svelte@3.59.2) postcss: - specifier: ^8.4.26 - version: 8.4.26 + specifier: ^8.4.31 + version: 8.4.31 prettier: specifier: ^2.8.8 version: 2.8.8 @@ -81,19 +77,19 @@ devDependencies: version: 3.59.2 svelte-preprocess: specifier: ^4.10.7 - version: 4.10.7(postcss@8.4.26)(svelte@3.59.2)(typescript@4.9.5) + version: 4.10.7(postcss@8.4.31)(svelte@3.59.2)(typescript@4.9.5) svelte-search: specifier: ^2.0.1 version: 2.0.1 tailwindcss: specifier: 3.3.1 - version: 3.3.1(postcss@8.4.26) + version: 3.3.1(postcss@8.4.31) typescript: specifier: ^4.9.5 version: 4.9.5 vite: specifier: ^4.4.4 - version: 4.4.4(@types/node@20.2.5) + version: 4.4.4(@types/node@20.8.2) vitest: specifier: ^0.33.0 version: 0.33.0 @@ -381,28 +377,28 @@ packages: eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 dependencies: eslint: 8.44.0 - eslint-visitor-keys: 3.4.1 + eslint-visitor-keys: 3.4.3 dev: true - /@eslint-community/regexpp@4.5.1: + /@eslint-community/regexpp@4.9.1: resolution: { - integrity: sha512-Z5ba73P98O1KUYCCJTUeVpja9RcGoMdncZ6T49FCUl2lN38JtCJ+3WgIDBv0AuY4WChU5PmtJmOCTlN6FZTFKQ== + integrity: sha512-Y27x+MBLjXa+0JWDhykM3+JE+il3kHKAEqabfEWq3SDhZjLYb6/BHL/JKFnH3fe207JaXkyDo685Oc2Glt6ifA== } engines: { node: ^12.0.0 || ^14.0.0 || >=16.0.0 } dev: true - /@eslint/eslintrc@2.1.0: + /@eslint/eslintrc@2.1.2: resolution: { - integrity: sha512-Lj7DECXqIVCqnqjjHMPna4vn6GJcMgul/wuS0je9OZ9gsL0zzDpKPVtcG1HaDVc+9y+qgXneTeUMbCqXJNpH1A== + integrity: sha512-+wvgpDsrB1YqAMdEUCcnTlpfVBH7Vqn6A/NT3D8WVXFIaKMlErPIZT3oCIAVCOtarRpMtelZLqJeU3t7WY6X6g== } engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } dependencies: ajv: 6.12.6 debug: 4.3.4 espree: 9.6.1 - globals: 13.20.0 + globals: 13.23.0 ignore: 5.2.4 import-fresh: 3.3.0 js-yaml: 4.1.0 @@ -420,10 +416,10 @@ packages: engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } dev: true - /@humanwhocodes/config-array@0.11.10: + /@humanwhocodes/config-array@0.11.11: resolution: { - integrity: sha512-KVVjQmNUepDVGXNuoRRdmmEjruj0KfiGSbS8LVc12LMsWDQzRXJ0qdhN8L8uUigKpfEHRhlaQFY0ib1tnUbNeQ== + integrity: sha512-N2brEuAadi0CcdeMXUkhbZB84eskAc8MEX1By6qEchoVywSgXPIjou4rYsl0V3Hj0ZnuGycGCjdNgockbzeWNA== } engines: { node: '>=10.10.0' } dependencies: @@ -449,10 +445,10 @@ packages: } dev: true - /@jest/schemas@29.6.0: + /@jest/schemas@29.6.3: resolution: { - integrity: sha512-rxLjXyJBTL4LQeJW3aKo0M/+GkCOXsO+8i9Iu7eDb6KwtP65ayoDsitrdPBtujxQ88k4wI2FNYfa6TOGwSn6cQ== + integrity: sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA== } engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } dependencies: @@ -468,13 +464,13 @@ packages: dependencies: '@jridgewell/set-array': 1.1.2 '@jridgewell/sourcemap-codec': 1.4.15 - '@jridgewell/trace-mapping': 0.3.18 + '@jridgewell/trace-mapping': 0.3.19 dev: true - /@jridgewell/resolve-uri@3.1.0: + /@jridgewell/resolve-uri@3.1.1: resolution: { - integrity: sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w== + integrity: sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA== } engines: { node: '>=6.0.0' } dev: true @@ -487,13 +483,6 @@ packages: engines: { node: '>=6.0.0' } dev: true - /@jridgewell/sourcemap-codec@1.4.14: - resolution: - { - integrity: sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw== - } - dev: true - /@jridgewell/sourcemap-codec@1.4.15: resolution: { @@ -501,14 +490,14 @@ packages: } dev: true - /@jridgewell/trace-mapping@0.3.18: + /@jridgewell/trace-mapping@0.3.19: resolution: { - integrity: sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA== + integrity: sha512-kf37QtfW+Hwx/buWGMPcR60iF9ziHa6r/CZJIHbmcm4+0qrXiVdxegAH0F6yddEVQ7zdkjcGCgCzUu+BcbhQxw== } dependencies: - '@jridgewell/resolve-uri': 3.1.0 - '@jridgewell/sourcemap-codec': 1.4.14 + '@jridgewell/resolve-uri': 3.1.1 + '@jridgewell/sourcemap-codec': 1.4.15 dev: true /@nodelib/fs.scandir@2.1.5: @@ -549,93 +538,93 @@ packages: engines: { node: '>=16' } hasBin: true dependencies: - '@types/node': 20.2.5 + '@types/node': 20.8.2 playwright-core: 1.36.1 optionalDependencies: fsevents: 2.3.2 dev: true - /@polka/url@1.0.0-next.21: + /@polka/url@1.0.0-next.23: resolution: { - integrity: sha512-a5Sab1C4/icpTZVzZc5Ghpz88yQtGOyNqYXcZgOssB2uuAr+wF/MvN6bgtW32q7HHrvBki+BsZ0OuNv6EV3K9g== + integrity: sha512-C16M+IYz0rgRhWZdCmK+h58JMv8vijAA61gmz2rspCSwKwzBebpdcsiUmwrtJRdphuY30i6BSLEOP8ppbNLyLg== } dev: true - /@rollup/plugin-commonjs@25.0.3(rollup@3.23.0): + /@rollup/plugin-commonjs@25.0.5(rollup@3.29.4): resolution: { - integrity: sha512-uBdtWr/H3BVcgm97MUdq2oJmqBR23ny1hOrWe2PKo9FTbjsGqg32jfasJUKYAI5ouqacjRnj65mBB/S79F+GQA== + integrity: sha512-xY8r/A9oisSeSuLCTfhssyDjo9Vp/eDiRLXkg1MXCcEEgEjPmLU+ZyDB20OOD0NlyDa/8SGbK5uIggF5XTx77w== } engines: { node: '>=14.0.0' } peerDependencies: - rollup: ^2.68.0||^3.0.0 + rollup: ^2.68.0||^3.0.0||^4.0.0 peerDependenciesMeta: rollup: optional: true dependencies: - '@rollup/pluginutils': 5.0.2(rollup@3.23.0) + '@rollup/pluginutils': 5.0.5(rollup@3.29.4) commondir: 1.0.1 estree-walker: 2.0.2 glob: 8.1.0 is-reference: 1.2.1 magic-string: 0.27.0 - rollup: 3.23.0 + rollup: 3.29.4 dev: true - /@rollup/plugin-json@6.0.0(rollup@3.23.0): + /@rollup/plugin-json@6.0.1(rollup@3.29.4): resolution: { - integrity: sha512-i/4C5Jrdr1XUarRhVu27EEwjt4GObltD7c+MkCIpO2QIbojw8MUs+CCTqOphQi3Qtg1FLmYt+l+6YeoIf51J7w== + integrity: sha512-RgVfl5hWMkxN1h/uZj8FVESvPuBJ/uf6ly6GTj0GONnkfoBN5KC0MSz+PN2OLDgYXMhtG0mWpTrkiOjoxAIevw== } engines: { node: '>=14.0.0' } peerDependencies: - rollup: ^1.20.0||^2.0.0||^3.0.0 + rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 peerDependenciesMeta: rollup: optional: true dependencies: - '@rollup/pluginutils': 5.0.2(rollup@3.23.0) - rollup: 3.23.0 + '@rollup/pluginutils': 5.0.5(rollup@3.29.4) + rollup: 3.29.4 dev: true - /@rollup/plugin-node-resolve@15.1.0(rollup@3.23.0): + /@rollup/plugin-node-resolve@15.2.2(rollup@3.29.4): resolution: { - integrity: sha512-xeZHCgsiZ9pzYVgAo9580eCGqwh/XCEUM9q6iQfGNocjgkufHAqC3exA+45URvhiYV8sBF9RlBai650eNs7AsA== + integrity: sha512-f64bU4OKqV0yihtxFemmuf0oj37pToCFMISCA+sJbbIAl5wcpbRO9XgWNWb1tDiWQJUcPxo6V0l59hcuZOQ3kw== } engines: { node: '>=14.0.0' } peerDependencies: - rollup: ^2.78.0||^3.0.0 + rollup: ^2.78.0||^3.0.0||^4.0.0 peerDependenciesMeta: rollup: optional: true dependencies: - '@rollup/pluginutils': 5.0.2(rollup@3.23.0) + '@rollup/pluginutils': 5.0.5(rollup@3.29.4) '@types/resolve': 1.20.2 deepmerge: 4.3.1 is-builtin-module: 3.2.1 is-module: 1.0.0 - resolve: 1.22.2 - rollup: 3.23.0 + resolve: 1.22.6 + rollup: 3.29.4 dev: true - /@rollup/pluginutils@5.0.2(rollup@3.23.0): + /@rollup/pluginutils@5.0.5(rollup@3.29.4): resolution: { - integrity: sha512-pTd9rIsP92h+B6wWwFbW8RkZv4hiR/xKsqre4SIuAOaOEQRxi0lqLke9k2/7WegC85GgUs9pjmOjCUi3In4vwA== + integrity: sha512-6aEYR910NyP73oHiJglti74iRyOwgFU4x3meH/H8OJx6Ry0j6cOVZ5X/wTvub7G7Ao6qaHBEaNsV3GLJkSsF+Q== } engines: { node: '>=14.0.0' } peerDependencies: - rollup: ^1.20.0||^2.0.0||^3.0.0 + rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 peerDependenciesMeta: rollup: optional: true dependencies: - '@types/estree': 1.0.1 + '@types/estree': 1.0.2 estree-walker: 2.0.2 picomatch: 2.3.1 - rollup: 3.23.0 + rollup: 3.29.4 dev: true /@sinclair/typebox@0.27.8: @@ -653,11 +642,11 @@ packages: peerDependencies: '@sveltejs/kit': ^1.0.0 dependencies: - '@rollup/plugin-commonjs': 25.0.3(rollup@3.23.0) - '@rollup/plugin-json': 6.0.0(rollup@3.23.0) - '@rollup/plugin-node-resolve': 15.1.0(rollup@3.23.0) + '@rollup/plugin-commonjs': 25.0.5(rollup@3.29.4) + '@rollup/plugin-json': 6.0.1(rollup@3.29.4) + '@rollup/plugin-node-resolve': 15.2.2(rollup@3.29.4) '@sveltejs/kit': 1.22.3(svelte@3.59.2)(vite@4.4.4) - rollup: 3.23.0 + rollup: 3.29.4 dev: true /@sveltejs/kit@1.22.3(svelte@3.59.2)(vite@4.4.4): @@ -672,61 +661,61 @@ packages: svelte: ^3.54.0 || ^4.0.0-next.0 vite: ^4.0.0 dependencies: - '@sveltejs/vite-plugin-svelte': 2.4.1(svelte@3.59.2)(vite@4.4.4) - '@types/cookie': 0.5.1 + '@sveltejs/vite-plugin-svelte': 2.4.6(svelte@3.59.2)(vite@4.4.4) + '@types/cookie': 0.5.2 cookie: 0.5.0 devalue: 4.3.2 esm-env: 1.0.0 kleur: 4.1.5 - magic-string: 0.30.0 + magic-string: 0.30.4 mime: 3.0.0 sade: 1.8.1 set-cookie-parser: 2.6.0 sirv: 2.0.3 svelte: 3.59.2 undici: 5.22.1 - vite: 4.4.4(@types/node@20.2.5) + vite: 4.4.4(@types/node@20.8.2) transitivePeerDependencies: - supports-color dev: true - /@sveltejs/vite-plugin-svelte-inspector@1.0.2(@sveltejs/vite-plugin-svelte@2.4.1)(svelte@3.59.2)(vite@4.4.4): + /@sveltejs/vite-plugin-svelte-inspector@1.0.4(@sveltejs/vite-plugin-svelte@2.4.6)(svelte@3.59.2)(vite@4.4.4): resolution: { - integrity: sha512-Cy1dUMcYCnDVV/hPLXa43YZJ2jGKVW5rA0xuNL9dlmYhT0yoS1g7+FOFSRlgk0BXKk/Oc7grs+8BVA5Iz2fr8A== + integrity: sha512-zjiuZ3yydBtwpF3bj0kQNV0YXe+iKE545QGZVTaylW3eAzFr+pJ/cwK8lZEaRp4JtaJXhD5DyWAV4AxLh6DgaQ== } engines: { node: ^14.18.0 || >= 16 } peerDependencies: '@sveltejs/vite-plugin-svelte': ^2.2.0 - svelte: ^3.54.0 || ^4.0.0-next.0 + svelte: ^3.54.0 || ^4.0.0 vite: ^4.0.0 dependencies: - '@sveltejs/vite-plugin-svelte': 2.4.1(svelte@3.59.2)(vite@4.4.4) + '@sveltejs/vite-plugin-svelte': 2.4.6(svelte@3.59.2)(vite@4.4.4) debug: 4.3.4 svelte: 3.59.2 - vite: 4.4.4(@types/node@20.2.5) + vite: 4.4.4(@types/node@20.8.2) transitivePeerDependencies: - supports-color dev: true - /@sveltejs/vite-plugin-svelte@2.4.1(svelte@3.59.2)(vite@4.4.4): + /@sveltejs/vite-plugin-svelte@2.4.6(svelte@3.59.2)(vite@4.4.4): resolution: { - integrity: sha512-bNNKvoRY89ptY7udeBSCmTdCVwkjmMcZ0j/z9J5MuedT8jPjq0zrknAo/jF1sToAza4NVaAgR9AkZoD9oJJmnA== + integrity: sha512-zO79p0+DZnXPnF0ltIigWDx/ux7Ni+HRaFOw720Qeivc1azFUrJxTl0OryXVibYNx1hCboGia1NRV3x8RNv4cA== } engines: { node: ^14.18.0 || >= 16 } peerDependencies: - svelte: ^3.54.0 || ^4.0.0-next.0 + svelte: ^3.54.0 || ^4.0.0 vite: ^4.0.0 dependencies: - '@sveltejs/vite-plugin-svelte-inspector': 1.0.2(@sveltejs/vite-plugin-svelte@2.4.1)(svelte@3.59.2)(vite@4.4.4) + '@sveltejs/vite-plugin-svelte-inspector': 1.0.4(@sveltejs/vite-plugin-svelte@2.4.6)(svelte@3.59.2)(vite@4.4.4) debug: 4.3.4 deepmerge: 4.3.1 kleur: 4.1.5 - magic-string: 0.30.0 + magic-string: 0.30.4 svelte: 3.59.2 - svelte-hmr: 0.15.2(svelte@3.59.2) - vite: 4.4.4(@types/node@20.2.5) + svelte-hmr: 0.15.3(svelte@3.59.2) + vite: 4.4.4(@types/node@20.8.2) vitefu: 0.2.4(vite@4.4.4) transitivePeerDependencies: - supports-color @@ -738,41 +727,41 @@ packages: integrity: sha512-frBecisrNGz+F4T6bcc+NLeolfiojh5FxW2klu669+8BARtyQv2C/GkNW6FUodVe4BroGMP/wER/YDGc7rEllw== } dependencies: - '@types/chai': 4.3.5 + '@types/chai': 4.3.6 dev: true - /@types/chai@4.3.5: + /@types/chai@4.3.6: resolution: { - integrity: sha512-mEo1sAde+UCE6b2hxn332f1g1E8WfYRu6p5SvTKr2ZKC1f7gFJXk4h5PyGP9Dt6gCaG8y8XhwnXWC6Iy2cmBng== + integrity: sha512-VOVRLM1mBxIRxydiViqPcKn6MIxZytrbMpd6RJLIWKxUNr3zux8no0Oc7kJx0WAPIitgZ0gkrDS+btlqQpubpw== } dev: true - /@types/cookie@0.5.1: + /@types/cookie@0.5.2: resolution: { - integrity: sha512-COUnqfB2+ckwXXSFInsFdOAWQzCCx+a5hq2ruyj+Vjund94RJQd4LG2u9hnvJrTgunKAaax7ancBYlDrNYxA0g== + integrity: sha512-DBpRoJGKJZn7RY92dPrgoMew8xCWc2P71beqsjyhEI/Ds9mOyVmBwtekyfhpwFIVt1WrxTonFifiOZ62V8CnNA== } dev: true - /@types/estree@1.0.1: + /@types/estree@1.0.2: resolution: { - integrity: sha512-LG4opVs2ANWZ1TJoKc937iMmNstM/d0ae1vNbnBvBhqCSezgVUOzcLCqbI5elV8Vy6WKwKjaqR+zO9VKirBBCA== + integrity: sha512-VeiPZ9MMwXjO32/Xu7+OwflfmeoRwkE/qzndw42gGtgJwZopBnzy2gD//NN1+go1mADzkDcqf/KnFRSjTJ8xJA== } dev: true - /@types/json-schema@7.0.12: + /@types/json-schema@7.0.13: resolution: { - integrity: sha512-Hr5Jfhc9eYOQNPYO5WLDq/n4jqijdHNlDXjuAQkkt+mWdQR+XJToOHrsD4cPaMXpn6KO7y2+wM8AZEs8VpBLVA== + integrity: sha512-RbSSoHliUbnXj3ny0CNFOoxrIDV6SUGyStHsvDqosw6CkdPV8TtWGlfecuK4ToyMEAql6pzNxgCFKanovUzlgQ== } dev: true - /@types/node@20.2.5: + /@types/node@20.8.2: resolution: { - integrity: sha512-JJulVEQXmiY9Px5axXHeYGLSjhkZEnD+MDPDGbCbIAbMslkKwmygtZFy1X6s/075Yo94sf8GuSlFfPzysQrWZQ== + integrity: sha512-Vvycsc9FQdwhxE3y3DzeIxuEJbWGDsnrxvMADzTDF/lcdR9/K+AQIeAghTQsHtotg/q0j3WEOYS/jQgSdWue3w== } dev: true @@ -783,10 +772,10 @@ packages: } dev: true - /@types/pug@2.0.6: + /@types/pug@2.0.7: resolution: { - integrity: sha512-SnHmG9wN1UVmagJOnyo/qkk0Z7gejYxOYYmaAwr5u2yFYfsupN3sg10kyzN8Hep/2zbHxCnsumxOoRIRMBwKCg== + integrity: sha512-I469DU0UXNC1aHepwirWhu9YKg5fkxohZD95Ey/5A7lovC+Siu+MCLffva87lnfThaOrw9Vb1DUN5t55oULAAw== } dev: true @@ -804,13 +793,13 @@ packages: } deprecated: This is a stub types definition. sass provides its own type definitions, so you do not need this installed. dependencies: - sass: 1.62.1 + sass: 1.68.0 dev: true - /@types/semver@7.5.0: + /@types/semver@7.5.3: resolution: { - integrity: sha512-G8hZ6XJiHnuhQKR7ZmysCeJWE08o8T0AXtk5darsCaTVsYZhhgUrq53jizaR2FvsoeCwJhlmwTjkXBY5Pn/ZHw== + integrity: sha512-OxepLK9EuNEIPxWNME+C6WwbRAOOI2o2BaQEGzz5Lu2e4Z5eDnEo+/aVEDMIXywoJitJ7xWd641wrGLZdtwRyw== } dev: true @@ -828,7 +817,7 @@ packages: typescript: optional: true dependencies: - '@eslint-community/regexpp': 4.5.1 + '@eslint-community/regexpp': 4.9.1 '@typescript-eslint/parser': 5.62.0(eslint@8.44.0)(typescript@4.9.5) '@typescript-eslint/scope-manager': 5.62.0 '@typescript-eslint/type-utils': 5.62.0(eslint@8.44.0)(typescript@4.9.5) @@ -944,8 +933,8 @@ packages: eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 dependencies: '@eslint-community/eslint-utils': 4.4.0(eslint@8.44.0) - '@types/json-schema': 7.0.12 - '@types/semver': 7.5.0 + '@types/json-schema': 7.0.13 + '@types/semver': 7.5.3 '@typescript-eslint/scope-manager': 5.62.0 '@typescript-eslint/types': 5.62.0 '@typescript-eslint/typescript-estree': 5.62.0(typescript@4.9.5) @@ -965,7 +954,7 @@ packages: engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } dependencies: '@typescript-eslint/types': 5.62.0 - eslint-visitor-keys: 3.4.1 + eslint-visitor-keys: 3.4.3 dev: true /@vitest/expect@0.33.0: @@ -976,7 +965,7 @@ packages: dependencies: '@vitest/spy': 0.33.0 '@vitest/utils': 0.33.0 - chai: 4.3.7 + chai: 4.3.10 dev: true /@vitest/runner@0.33.0: @@ -996,9 +985,9 @@ packages: integrity: sha512-tJjrl//qAHbyHajpFvr8Wsk8DIOODEebTu7pgBrP07iOepR5jYkLFiqLq2Ltxv+r0uptUb4izv1J8XBOwKkVYA== } dependencies: - magic-string: 0.30.1 + magic-string: 0.30.4 pathe: 1.1.1 - pretty-format: 29.6.1 + pretty-format: 29.7.0 dev: true /@vitest/spy@0.33.0: @@ -1007,7 +996,7 @@ packages: integrity: sha512-Kv+yZ4hnH1WdiAkPUQTpRxW8kGtH8VRTnus7ZTGovFYM1ZezJpvGtb9nPIjPnptHbsyIAxYZsEpVPYgtpjGnrg== } dependencies: - tinyspy: 2.1.1 + tinyspy: 2.2.0 dev: true /@vitest/utils@0.33.0: @@ -1016,9 +1005,9 @@ packages: integrity: sha512-pF1w22ic965sv+EN6uoePkAOTkAPWM03Ri/jXNyMIKBb/XHLDPfhLvf/Fa9g0YECevAIz56oVYXhodLvLQ/awA== } dependencies: - diff-sequences: 29.4.3 + diff-sequences: 29.6.3 loupe: 2.3.6 - pretty-format: 29.6.1 + pretty-format: 29.7.0 dev: true /acorn-jsx@5.3.2(acorn@8.10.0): @@ -1134,7 +1123,7 @@ packages: } dev: true - /autoprefixer@10.4.14(postcss@8.4.26): + /autoprefixer@10.4.14(postcss@8.4.31): resolution: { integrity: sha512-FQzyfOsTlwVzjHxKEqRIAdJx9niO6VCBCoEwax/VLSoQF29ggECcPuBqUMZ+u8jCZOPSy8b8/8KnuFbp0SaFZQ== @@ -1144,12 +1133,12 @@ packages: peerDependencies: postcss: ^8.1.0 dependencies: - browserslist: 4.21.7 - caniuse-lite: 1.0.30001492 - fraction.js: 4.2.0 + browserslist: 4.22.1 + caniuse-lite: 1.0.30001546 + fraction.js: 4.3.6 normalize-range: 0.1.2 picocolors: 1.0.0 - postcss: 8.4.26 + postcss: 8.4.31 postcss-value-parser: 4.2.0 dev: true @@ -1197,18 +1186,18 @@ packages: fill-range: 7.0.1 dev: true - /browserslist@4.21.7: + /browserslist@4.22.1: resolution: { - integrity: sha512-BauCXrQ7I2ftSqd2mvKHGo85XR0u7Ru3C/Hxsy/0TkfCtjrmAbPdzLGasmoiBxplpDXlPvdjX9u7srIMfgasNA== + integrity: sha512-FEVc202+2iuClEhZhrWy6ZiAcRLvNMyYcxZ8raemul1DYVOVdFsbqckWLdsixQZCpJlwe77Z3UTalE7jsjnKfQ== } engines: { node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7 } hasBin: true dependencies: - caniuse-lite: 1.0.30001492 - electron-to-chromium: 1.4.414 - node-releases: 2.0.12 - update-browserslist-db: 1.0.11(browserslist@4.21.7) + caniuse-lite: 1.0.30001546 + electron-to-chromium: 1.4.543 + node-releases: 2.0.13 + update-browserslist-db: 1.0.13(browserslist@4.22.1) dev: true /buffer-crc32@0.2.13: @@ -1260,10 +1249,10 @@ packages: engines: { node: '>= 6' } dev: true - /caniuse-lite@1.0.30001492: + /caniuse-lite@1.0.30001546: resolution: { - integrity: sha512-2efF8SAZwgAX1FJr87KWhvuJxnGJKOnctQa8xLOskAXNXq8oiuqgl6u1kk3fFpsp3GgvzlRjiK1sl63hNtFADw== + integrity: sha512-zvtSJwuQFpewSyRrI3AsftF6rM0X80mZkChIt1spBGEvRglCrjTniXvinc8JKRoqTwXAgvqTImaN9igfSMtUBw== } dev: true @@ -1274,22 +1263,22 @@ packages: } dependencies: debug: 4.3.4 - tslib: 2.5.2 + tslib: 2.6.2 transitivePeerDependencies: - supports-color dev: false - /chai@4.3.7: + /chai@4.3.10: resolution: { - integrity: sha512-HLnAzZ2iupm25PlN0xFreAlBA5zaBSv3og0DdeGA4Ar6h6rJ3A0rolRUKJhSF2V10GZKDgWF/VmAEsNWjCRB+A== + integrity: sha512-0UXG04VuVbruMUYbJ6JctvH0YnC/4q3/AkT18q4NaITo91CUm0liMS9VqzT9vZhVQ/1eqPanMWjBM+Juhfb/9g== } engines: { node: '>=4' } dependencies: assertion-error: 1.1.0 - check-error: 1.0.2 + check-error: 1.0.3 deep-eql: 4.1.3 - get-func-name: 2.0.0 + get-func-name: 2.0.2 loupe: 2.3.6 pathval: 1.1.1 type-detect: 4.0.8 @@ -1306,11 +1295,13 @@ packages: supports-color: 7.2.0 dev: true - /check-error@1.0.2: + /check-error@1.0.3: resolution: { - integrity: sha512-BrgHpW9NURQgzoNyjfq0Wu6VFO6D7IZEmJNdtgNqpzGG8RuNFHt2jQxWlAs4HMe119chBnv+34syEZtc6IhLtA== + integrity: sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg== } + dependencies: + get-func-name: 2.0.2 dev: true /chokidar@3.5.3: @@ -1328,7 +1319,7 @@ packages: normalize-path: 3.0.0 readdirp: 3.6.0 optionalDependencies: - fsevents: 2.3.2 + fsevents: 2.3.3 dev: true /color-convert@2.0.1: @@ -1460,10 +1451,10 @@ packages: } dev: true - /diff-sequences@29.4.3: + /diff-sequences@29.6.3: resolution: { - integrity: sha512-ofrBgwpPhCD85kMKtE9RYFFq6OC1A89oW2vvgWZNCwxrUpRUILopY7lsYyMDSjc8g6U6aiO0Qubg6r4Wgt5ZnA== + integrity: sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q== } engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } dev: true @@ -1503,10 +1494,10 @@ packages: engines: { node: '>=12' } dev: true - /electron-to-chromium@1.4.414: + /electron-to-chromium@1.4.543: resolution: { - integrity: sha512-RRuCvP6ekngVh2SAJaOKT/hxqc9JAsK+Pe0hP5tGQIfonU2Zy9gMGdJ+mBdyl/vNucMG6gkXYtuM4H/1giws5w== + integrity: sha512-t2ZP4AcGE0iKCCQCBx/K2426crYdxD3YU6l0uK2EO3FZH0pbC4pFz/sZm2ruZsND6hQBTcDWWlo/MLpiOdif5g== } dev: true @@ -1602,10 +1593,10 @@ packages: estraverse: 4.3.0 dev: true - /eslint-scope@7.2.0: + /eslint-scope@7.2.2: resolution: { - integrity: sha512-DYj5deGlHBfMt15J7rdtyKNq/Nqlv5KfU4iodrQ019XESsRnwXH9KAE0y3cwtUHDo2ob7CypAnCqefh6vioWRw== + integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg== } engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } dependencies: @@ -1613,10 +1604,10 @@ packages: estraverse: 5.3.0 dev: true - /eslint-visitor-keys@3.4.1: + /eslint-visitor-keys@3.4.3: resolution: { - integrity: sha512-pZnmmLwYzf+kWaM/Qgrvpen51upAktaaiI01nsJD/Yr3lMOdNtq0cxkrrg16w64VtisN6okbs7Q8AfGqj4c9fA== + integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag== } engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } dev: true @@ -1630,10 +1621,10 @@ packages: hasBin: true dependencies: '@eslint-community/eslint-utils': 4.4.0(eslint@8.44.0) - '@eslint-community/regexpp': 4.5.1 - '@eslint/eslintrc': 2.1.0 + '@eslint-community/regexpp': 4.9.1 + '@eslint/eslintrc': 2.1.2 '@eslint/js': 8.44.0 - '@humanwhocodes/config-array': 0.11.10 + '@humanwhocodes/config-array': 0.11.11 '@humanwhocodes/module-importer': 1.0.1 '@nodelib/fs.walk': 1.2.8 ajv: 6.12.6 @@ -1642,8 +1633,8 @@ packages: debug: 4.3.4 doctrine: 3.0.0 escape-string-regexp: 4.0.0 - eslint-scope: 7.2.0 - eslint-visitor-keys: 3.4.1 + eslint-scope: 7.2.2 + eslint-visitor-keys: 3.4.3 espree: 9.6.1 esquery: 1.5.0 esutils: 2.0.3 @@ -1651,7 +1642,7 @@ packages: file-entry-cache: 6.0.1 find-up: 5.0.0 glob-parent: 6.0.2 - globals: 13.20.0 + globals: 13.23.0 graphemer: 1.4.0 ignore: 5.2.4 import-fresh: 3.3.0 @@ -1688,7 +1679,7 @@ packages: dependencies: acorn: 8.10.0 acorn-jsx: 5.3.2(acorn@8.10.0) - eslint-visitor-keys: 3.4.1 + eslint-visitor-keys: 3.4.3 dev: true /esquery@1.5.0: @@ -1749,10 +1740,10 @@ packages: } dev: true - /fast-glob@3.2.12: + /fast-glob@3.3.1: resolution: { - integrity: sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w== + integrity: sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg== } engines: { node: '>=8.6.0' } dependencies: @@ -1793,7 +1784,7 @@ packages: } engines: { node: ^10.12.0 || >=12.0.0 } dependencies: - flat-cache: 3.0.4 + flat-cache: 3.1.0 dev: true /fill-range@7.0.1: @@ -1817,28 +1808,29 @@ packages: path-exists: 4.0.0 dev: true - /flat-cache@3.0.4: + /flat-cache@3.1.0: resolution: { - integrity: sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg== + integrity: sha512-OHx4Qwrrt0E4jEIcI5/Xb+f+QmJYNj2rrK8wiIdQOIrB9WrrJL8cjZvXdXuBTkkEwEqLycb5BeZDV1o2i9bTew== } - engines: { node: ^10.12.0 || >=12.0.0 } + engines: { node: '>=12.0.0' } dependencies: - flatted: 3.2.7 + flatted: 3.2.9 + keyv: 4.5.3 rimraf: 3.0.2 dev: true - /flatted@3.2.7: + /flatted@3.2.9: resolution: { - integrity: sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ== + integrity: sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ== } dev: true - /fraction.js@4.2.0: + /fraction.js@4.3.6: resolution: { - integrity: sha512-MhLuK+2gUcnZe8ZHlaaINnQLl0xRIGRfcGk2yl8xoQAfHrSsL3rYu6FCmBdkdbhc9EPlwyGHewaRsvwRMJtAlA== + integrity: sha512-n2aZ9tNfYDwaHhvFTkhFErqOMIb8uyzSQ+vGJBjZyanAKZVbGUQ1sngfk9FdkBw7G26O7AgNjLcecLffD1c7eg== } dev: true @@ -1860,17 +1852,21 @@ packages: dev: true optional: true - /function-bind@1.1.1: + /fsevents@2.3.3: resolution: { - integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== + integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== } + engines: { node: ^8.16.0 || ^10.6.0 || >=11.0.0 } + os: [darwin] + requiresBuild: true dev: true + optional: true - /get-func-name@2.0.0: + /get-func-name@2.0.2: resolution: { - integrity: sha512-Hm0ixYtaSZ/V7C8FJrtZIuBBI+iSgL+1Aq82zSu8VQNB4S3Gk8e7Qs3VwBDJAhmRZcFqkl3tQu36g/Foh5I5ig== + integrity: sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ== } dev: true @@ -1936,10 +1932,10 @@ packages: once: 1.4.0 dev: true - /globals@13.20.0: + /globals@13.23.0: resolution: { - integrity: sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ== + integrity: sha512-XAmF0RjlrjY23MA51q3HltdlGxUpXPvg0GioKiD9X6HD28iMjo2dKC8Vqwm7lne4GNr78+RHTfliktR6ZH09wA== } engines: { node: '>=8' } dependencies: @@ -1955,7 +1951,7 @@ packages: dependencies: array-union: 2.1.0 dir-glob: 3.0.1 - fast-glob: 3.2.12 + fast-glob: 3.3.1 ignore: 5.2.4 merge2: 1.4.1 slash: 3.0.0 @@ -1983,14 +1979,12 @@ packages: engines: { node: '>=8' } dev: true - /has@1.0.3: + /has@1.0.4: resolution: { - integrity: sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== + integrity: sha512-qdSAmqLF6209RFj4VVItywPMbm3vWylknmB3nvNiUIs72xAimcM8nVYxYr7ncvZq5qzk9MKIZR8ijqD/1QuYjQ== } engines: { node: '>= 0.4.0' } - dependencies: - function-bind: 1.1.1 dev: true /ignore@5.2.4: @@ -2001,10 +1995,10 @@ packages: engines: { node: '>= 4' } dev: true - /immutable@4.3.0: + /immutable@4.3.4: resolution: { - integrity: sha512-0AOCmOip+xgJwEVTQj1EfiDDOkPmuyllDuTuEX+DDXUgapLAsBIfkg3sxCYyCEA8mQqZrrxPUGjcOQ2JS3WLkg== + integrity: sha512-fsXeu4J4i6WNWSikpI88v/PcVflZz+6kMhUfIwc5SY+poQRPnaf5V7qds6SUyUN3cVxEzuCab7QIoLOQ+DQ1wA== } dev: true @@ -2064,13 +2058,13 @@ packages: builtin-modules: 3.3.0 dev: true - /is-core-module@2.12.1: + /is-core-module@2.13.0: resolution: { - integrity: sha512-Q4ZuBAe2FUsKtyQJoQHlvP8OvBERxO3jEmy1I7hcRXcJBGGHFh/aJBswbXuS9sgrDH2QUO8ilkwNPHvHMd8clg== + integrity: sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ== } dependencies: - has: 1.0.3 + has: 1.0.4 dev: true /is-extglob@2.1.1: @@ -2120,7 +2114,7 @@ packages: integrity: sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ== } dependencies: - '@types/estree': 1.0.1 + '@types/estree': 1.0.2 dev: true /isexe@2.0.0: @@ -2130,10 +2124,10 @@ packages: } dev: true - /jiti@1.18.2: + /jiti@1.20.0: resolution: { - integrity: sha512-QAdOptna2NYiSSpv0O/BwoHBSmz4YhpzJHyi+fnMRTXFjp7B8i/YG5Z8IfusxB1ufjcD2Sre1F3R+nX3fvy7gg== + integrity: sha512-3TV69ZbrvV6U5DfQimop50jE9Dl6J8O1ja1dvBbMba/sZ3YBEQqJ2VZRoQPVnhlzjNtU1vaXRZVrVjU4qtm8yA== } hasBin: true dev: true @@ -2148,6 +2142,13 @@ packages: argparse: 2.0.1 dev: true + /json-buffer@3.0.1: + resolution: + { + integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ== + } + dev: true + /json-schema-traverse@0.4.1: resolution: { @@ -2176,6 +2177,15 @@ packages: } dev: false + /keyv@4.5.3: + resolution: + { + integrity: sha512-QCiSav9WaX1PgETJ+SpNnx2PRRapJ/oRSXM4VO5OGYGSjrxbKPVFVhB3l2OCbLCk329N8qyAtsJjSjvVBWzEug== + } + dependencies: + json-buffer: 3.0.1 + dev: true + /kleur@4.1.5: resolution: { @@ -2265,7 +2275,7 @@ packages: integrity: sha512-RaPMZKiMy8/JruncMU5Bt6na1eftNoo++R4Y+N2FrxkDVTrGvcyzFTsaGif4QTeKESheMGegbhw6iUAq+5A8zA== } dependencies: - get-func-name: 2.0.0 + get-func-name: 2.0.2 dev: true /lru-cache@6.0.0: @@ -2296,20 +2306,10 @@ packages: '@jridgewell/sourcemap-codec': 1.4.15 dev: true - /magic-string@0.30.0: - resolution: - { - integrity: sha512-LA+31JYDJLs82r2ScLrlz1GjSgu66ZV518eyWT+S8VhyQn/JL0u9MeBOvQMGYiPk1DBiSN9DDMOcXvigJZaViQ== - } - engines: { node: '>=12' } - dependencies: - '@jridgewell/sourcemap-codec': 1.4.15 - dev: true - - /magic-string@0.30.1: + /magic-string@0.30.4: resolution: { - integrity: sha512-mbVKXPmS0z0G4XqFDCTllmDQ6coZzn94aMlb0o/A4HEHJCKcanlDZwYJgwnkmgD3jyWhUgj9VsPrfd972yPffA== + integrity: sha512-Q/TKtsC5BPm0kGqgBIF9oXAs/xEf2vRKiIB4wCRQTJOQIByZ1d+NnUOotvJOvNpi5RNIgVOMC3pOuaP1ZTDlVg== } engines: { node: '>=12' } dependencies: @@ -2388,16 +2388,16 @@ packages: minimist: 1.2.8 dev: true - /mlly@1.4.0: + /mlly@1.4.2: resolution: { - integrity: sha512-ua8PAThnTwpprIaU47EPeZ/bPUVp2QYBbWMphUQpVdBI3Lgqzm5KZQ45Agm3YJedHXaIHl6pBGabaLSUPPSptg== + integrity: sha512-i/Ykufi2t1EZ6NaPLdfnZk2AX8cs0d+mTzVKuPfqPKPatxLApaBoxJQ9x1/uckXtrS/U5oisPMDkNs0yQTaBRg== } dependencies: acorn: 8.10.0 pathe: 1.1.1 pkg-types: 1.0.3 - ufo: 1.1.2 + ufo: 1.3.1 dev: true /mri@1.2.0: @@ -2456,10 +2456,10 @@ packages: } dev: true - /node-releases@2.0.12: + /node-releases@2.0.13: resolution: { - integrity: sha512-QzsYKWhXTWx8h1kIvqfnC++o0pEmpRQA/aenALsL2F4pqNVr7YzcdMlDij5WBnwftRbJCNJL/O7zdKaxKPHqgQ== + integrity: sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ== } dev: true @@ -2635,10 +2635,10 @@ packages: engines: { node: '>=0.10.0' } dev: true - /pirates@4.0.5: + /pirates@4.0.6: resolution: { - integrity: sha512-8V9+HQPupnaXMA23c5hvl69zXvTwTzyAYasnkb0Tts4XvO4CliqONMOnvlq26rkhLC3nWDFBJf73LU1e1VZLaQ== + integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg== } engines: { node: '>= 6' } dev: true @@ -2650,7 +2650,7 @@ packages: } dependencies: jsonc-parser: 3.2.0 - mlly: 1.4.0 + mlly: 1.4.2 pathe: 1.1.1 dev: true @@ -2663,7 +2663,7 @@ packages: hasBin: true dev: true - /postcss-import@14.1.0(postcss@8.4.26): + /postcss-import@14.1.0(postcss@8.4.31): resolution: { integrity: sha512-flwI+Vgm4SElObFVPpTIT7SU7R3qk2L7PyduMcokiaVKuWv9d/U+Gm/QAd8NDLuykTWTkcrjOeD2Pp1rMeBTGw== @@ -2672,13 +2672,13 @@ packages: peerDependencies: postcss: ^8.0.0 dependencies: - postcss: 8.4.26 + postcss: 8.4.31 postcss-value-parser: 4.2.0 read-cache: 1.0.0 - resolve: 1.22.2 + resolve: 1.22.6 dev: true - /postcss-js@4.0.1(postcss@8.4.26): + /postcss-js@4.0.1(postcss@8.4.31): resolution: { integrity: sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw== @@ -2688,10 +2688,10 @@ packages: postcss: ^8.4.21 dependencies: camelcase-css: 2.0.1 - postcss: 8.4.26 + postcss: 8.4.31 dev: true - /postcss-load-config@3.1.4(postcss@8.4.26): + /postcss-load-config@3.1.4(postcss@8.4.31): resolution: { integrity: sha512-6DiM4E7v4coTE4uzA8U//WhtPwyhiim3eyjEMFCnUpzbrkK9wJHgKDT2mR+HbtSrd/NubVaYTOpSpjUl8NQeRg== @@ -2707,11 +2707,11 @@ packages: optional: true dependencies: lilconfig: 2.1.0 - postcss: 8.4.26 + postcss: 8.4.31 yaml: 1.10.2 dev: true - /postcss-nested@6.0.0(postcss@8.4.26): + /postcss-nested@6.0.0(postcss@8.4.31): resolution: { integrity: sha512-0DkamqrPcmkBDsLn+vQDIrtkSbNkv5AD/M322ySo9kqFkCIYklym2xEmWkwo+Y3/qZo34tzEPNUw4y7yMCdv5w== @@ -2720,7 +2720,7 @@ packages: peerDependencies: postcss: ^8.2.14 dependencies: - postcss: 8.4.26 + postcss: 8.4.31 postcss-selector-parser: 6.0.13 dev: true @@ -2742,10 +2742,10 @@ packages: } dev: true - /postcss@8.4.26: + /postcss@8.4.31: resolution: { - integrity: sha512-jrXHFF8iTloAenySjM/ob3gSj7pCu0Ji49hnjqzsgSRa50hkWCKD0HQ+gMNJkW38jBI68MpAAg7ZWwHwX8NMMw== + integrity: sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ== } engines: { node: ^10 || ^12 || >=14 } dependencies: @@ -2784,14 +2784,14 @@ packages: hasBin: true dev: true - /pretty-format@29.6.1: + /pretty-format@29.7.0: resolution: { - integrity: sha512-7jRj+yXO0W7e4/tSJKoR7HRIHLPPjtNaUGG2xxKQnGvPNRkgWcQ0AZX6P4KBRJN4FcTBWb3sa7DVUJmocYuoog== + integrity: sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ== } engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } dependencies: - '@jest/schemas': 29.6.0 + '@jest/schemas': 29.6.3 ansi-styles: 5.2.0 react-is: 18.2.0 dev: true @@ -2861,14 +2861,14 @@ packages: engines: { node: '>=4' } dev: true - /resolve@1.22.2: + /resolve@1.22.6: resolution: { - integrity: sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g== + integrity: sha512-njhxM7mV12JfufShqGy3Rz8j11RPdLy4xi15UurGJeoHLfJpVXKdh3ueuOqbYUcDZnffr6X739JBo5LzyahEsw== } hasBin: true dependencies: - is-core-module: 2.12.1 + is-core-module: 2.13.0 path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 dev: true @@ -2901,26 +2901,15 @@ packages: glob: 7.2.3 dev: true - /rollup@3.23.0: + /rollup@3.29.4: resolution: { - integrity: sha512-h31UlwEi7FHihLe1zbk+3Q7z1k/84rb9BSwmBSr/XjOCEaBJ2YyedQDuM0t/kfOS0IxM+vk1/zI9XxYj9V+NJQ== + integrity: sha512-oWzmBZwvYrU0iJHtDmhsm662rC15FRXmcjCk1xD771dFDx5jJ02ufAQQTn0etB2emNk4J9EZg/yWKpsn9BWGRw== } engines: { node: '>=14.18.0', npm: '>=8.0.0' } hasBin: true optionalDependencies: - fsevents: 2.3.2 - dev: true - - /rollup@3.26.2: - resolution: - { - integrity: sha512-6umBIGVz93er97pMgQO08LuH3m6PUb3jlDUUGFsNJB6VgTCUaDFpupf5JfU30529m/UKOgmiX+uY6Sx8cOYpLA== - } - engines: { node: '>=14.18.0', npm: '>=8.0.0' } - hasBin: true - optionalDependencies: - fsevents: 2.3.2 + fsevents: 2.3.3 dev: true /run-parallel@1.2.0: @@ -2954,16 +2943,16 @@ packages: rimraf: 2.7.1 dev: true - /sass@1.62.1: + /sass@1.68.0: resolution: { - integrity: sha512-NHpxIzN29MXvWiuswfc1W3I0N8SXBd8UR26WntmDlRYf0bSADnwnOjsyMZ3lMezSlArD33Vs3YFhp7dWvL770A== + integrity: sha512-Lmj9lM/fef0nQswm1J2HJcEsBUba4wgNx2fea6yJHODREoMFnwRpZydBnX/RjyXw2REIwdkbqE4hrTo4qfDBUA== } engines: { node: '>=14.0.0' } hasBin: true dependencies: chokidar: 3.5.3 - immutable: 4.3.0 + immutable: 4.3.4 source-map-js: 1.0.2 dev: true @@ -3016,7 +3005,7 @@ packages: } engines: { node: '>= 10' } dependencies: - '@polka/url': 1.0.0-next.21 + '@polka/url': 1.0.0-next.23 mrmime: 1.0.1 totalist: 3.0.1 dev: true @@ -3065,10 +3054,10 @@ packages: } dev: true - /std-env@3.3.3: + /std-env@3.4.3: resolution: { - integrity: sha512-Rz6yejtVyWnVjC1RFvNmYL10kgjC49EOghxWn0RFqlCHGFpQx+Xe7yW3I4ceK1SGrWIGMjD5Kbue8W/udkbMJg== + integrity: sha512-f9aPhy8fYBuMN+sNfakZV18U39PbalgjXG3lLB9WkaYTxijru61wb57V9wxxNthXM5Sd88ETBWi29qLAsHO52Q== } dev: true @@ -3108,19 +3097,19 @@ packages: engines: { node: '>=8' } dev: true - /strip-literal@1.0.1: + /strip-literal@1.3.0: resolution: { - integrity: sha512-QZTsipNpa2Ppr6v1AmJHESqJ3Uz247MUS0OjrnnZjFAvEoWqxuyFuXn2xLgMtRnijJShAa1HL0gtJyUs7u7n3Q== + integrity: sha512-PugKzOsyXpArk0yWmUwqOZecSO0GH0bPoctLcqNDH9J04pVW3lflYE0ujElBGTloevcxF5MofAOZ7C5l2b+wLg== } dependencies: acorn: 8.10.0 dev: true - /sucrase@3.32.0: + /sucrase@3.34.0: resolution: { - integrity: sha512-ydQOU34rpSyj2TGyz4D2p8rbktIOZ8QY9s+DGLvFU1i5pWJE8vkpruCjGCMHsdXwnD7JDcS+noSwM/a7zyNFDQ== + integrity: sha512-70/LQEZ07TEcxiU2dz51FKaE6hCTWC6vr7FOk3Gr0U60C3shtAN+H+BFr9XlYe5xqf3RA8nrc+VIwzCfnxuXJw== } engines: { node: '>=8' } hasBin: true @@ -3130,7 +3119,7 @@ packages: glob: 7.1.6 lines-and-columns: 1.2.4 mz: 2.7.0 - pirates: 4.0.5 + pirates: 4.0.6 ts-interface-checker: 0.1.13 dev: true @@ -3152,19 +3141,19 @@ packages: engines: { node: '>= 0.4' } dev: true - /svelte-hmr@0.15.2(svelte@3.59.2): + /svelte-hmr@0.15.3(svelte@3.59.2): resolution: { - integrity: sha512-q/bAruCvFLwvNbeE1x3n37TYFb3mTBJ6TrCq6p2CoFbSTNhDE9oAtEfpy+wmc9So8AG0Tja+X0/mJzX9tSfvIg== + integrity: sha512-41snaPswvSf8TJUhlkoJBekRrABDXDMdpNpT2tfHIv4JuhgvHqLMhEPGtaQn0BmbNSTkuz2Ed20DF2eHw0SmBQ== } engines: { node: ^12.20 || ^14.13.1 || >= 16 } peerDependencies: - svelte: ^3.19.0 || ^4.0.0-next.0 + svelte: ^3.19.0 || ^4.0.0 dependencies: svelte: 3.59.2 dev: true - /svelte-preprocess@4.10.7(postcss@8.4.26)(svelte@3.59.2)(typescript@4.9.5): + /svelte-preprocess@4.10.7(postcss@8.4.31)(svelte@3.59.2)(typescript@4.9.5): resolution: { integrity: sha512-sNPBnqYD6FnmdBrUmBCaqS00RyCsCpj2BG58A1JBswNF7b0OKviwxqVrOL/CKyJrLSClrSeqQv5BXNg2RUbPOw== @@ -3208,11 +3197,11 @@ packages: typescript: optional: true dependencies: - '@types/pug': 2.0.6 + '@types/pug': 2.0.7 '@types/sass': 1.45.0 detect-indent: 6.1.0 magic-string: 0.25.9 - postcss: 8.4.26 + postcss: 8.4.31 sorcery: 0.10.0 strip-indent: 3.0.0 svelte: 3.59.2 @@ -3234,7 +3223,7 @@ packages: engines: { node: '>= 8' } dev: true - /tailwindcss@3.3.1(postcss@8.4.26): + /tailwindcss@3.3.1(postcss@8.4.31): resolution: { integrity: sha512-Vkiouc41d4CEq0ujXl6oiGFQ7bA3WEhUZdTgXAhtKxSy49OmKs8rEfQmupsfF0IGW8fv2iQkp1EVUuapCFrZ9g== @@ -3249,25 +3238,25 @@ packages: color-name: 1.1.4 didyoumean: 1.2.2 dlv: 1.1.3 - fast-glob: 3.2.12 + fast-glob: 3.3.1 glob-parent: 6.0.2 is-glob: 4.0.3 - jiti: 1.18.2 + jiti: 1.20.0 lilconfig: 2.1.0 micromatch: 4.0.5 normalize-path: 3.0.0 object-hash: 3.0.0 picocolors: 1.0.0 - postcss: 8.4.26 - postcss-import: 14.1.0(postcss@8.4.26) - postcss-js: 4.0.1(postcss@8.4.26) - postcss-load-config: 3.1.4(postcss@8.4.26) - postcss-nested: 6.0.0(postcss@8.4.26) + postcss: 8.4.31 + postcss-import: 14.1.0(postcss@8.4.31) + postcss-js: 4.0.1(postcss@8.4.31) + postcss-load-config: 3.1.4(postcss@8.4.31) + postcss-nested: 6.0.0(postcss@8.4.31) postcss-selector-parser: 6.0.13 postcss-value-parser: 4.2.0 quick-lru: 5.1.1 - resolve: 1.22.2 - sucrase: 3.32.0 + resolve: 1.22.6 + sucrase: 3.34.0 transitivePeerDependencies: - ts-node dev: true @@ -3298,10 +3287,10 @@ packages: any-promise: 1.3.0 dev: true - /tinybench@2.5.0: + /tinybench@2.5.1: resolution: { - integrity: sha512-kRwSG8Zx4tjF9ZiyH4bhaebu+EDz1BOx9hOigYHlUW4xxI/wKIUQUqo018UlU4ar6ATPBsaMrdbKZ+tmPdohFA== + integrity: sha512-65NKvSuAVDP/n4CqH+a9w2kTlLReS9vhsAP06MWx+/89nMinJyB2icyl58RIcqCmIggpojIGeuJGhjU1aGMBSg== } dev: true @@ -3313,10 +3302,10 @@ packages: engines: { node: '>=14.0.0' } dev: true - /tinyspy@2.1.1: + /tinyspy@2.2.0: resolution: { - integrity: sha512-XPJL2uSzcOyBMky6OFrusqWlzfFrXtE0hPuMgW8A2HmaqrPo4ZQHRN/V0QXN3FSjKxpsbRrFc5LI7KOwBsT1/w== + integrity: sha512-d2eda04AN/cPOR89F7Xv5bK/jrQEhmcLFe6HFldoeO9AJtps+fqEnh486vnT/8y4bw38pSyxDcTCAq+Ks2aJTg== } engines: { node: '>=14.0.0' } dev: true @@ -3353,10 +3342,10 @@ packages: } dev: true - /tslib@2.5.2: + /tslib@2.6.2: resolution: { - integrity: sha512-5svOrSA2w3iGFDs1HibEVBGbDrAY82bFQ3HZ3ixB+88nsbsWQoKqDRb5UBYAUPEzbBn6dAp5gRNXglySbx1MlA== + integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q== } dev: false @@ -3408,10 +3397,10 @@ packages: hasBin: true dev: true - /ufo@1.1.2: + /ufo@1.3.1: resolution: { - integrity: sha512-TrY6DsjTQQgyS3E3dBaOXf0TpPD8u9FVrVYmKVegJuFw51n/YB9XPt+U6ydzFG5ZIN7+DIjPbNmXoBj9esYhgQ== + integrity: sha512-uY/99gMLIOlJPwATcMVYfqDSxUR9//AUcgZMzwfSTJPDKzA1S8mX4VLqa+fiAtveraQUBCz4FFcwVZBGbwBXIw== } dev: true @@ -3425,16 +3414,16 @@ packages: busboy: 1.6.0 dev: true - /update-browserslist-db@1.0.11(browserslist@4.21.7): + /update-browserslist-db@1.0.13(browserslist@4.22.1): resolution: { - integrity: sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA== + integrity: sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg== } hasBin: true peerDependencies: browserslist: '>= 4.21.0' dependencies: - browserslist: 4.21.7 + browserslist: 4.22.1 escalade: 3.1.1 picocolors: 1.0.0 dev: true @@ -3463,7 +3452,7 @@ packages: hasBin: true dev: false - /vite-node@0.33.0(@types/node@20.2.5): + /vite-node@0.33.0(@types/node@20.8.2): resolution: { integrity: sha512-19FpHYbwWWxDr73ruNahC+vtEdza52kA90Qb3La98yZ0xULqV8A5JLNPUff0f5zID4984tW7l3DH2przTJUZSw== @@ -3473,10 +3462,10 @@ packages: dependencies: cac: 6.7.14 debug: 4.3.4 - mlly: 1.4.0 + mlly: 1.4.2 pathe: 1.1.1 picocolors: 1.0.0 - vite: 4.4.4(@types/node@20.2.5) + vite: 4.4.4(@types/node@20.8.2) transitivePeerDependencies: - '@types/node' - less @@ -3488,7 +3477,7 @@ packages: - terser dev: true - /vite@4.4.4(@types/node@20.2.5): + /vite@4.4.4(@types/node@20.8.2): resolution: { integrity: sha512-4mvsTxjkveWrKDJI70QmelfVqTm+ihFAb6+xf4sjEU2TmUCTlVX87tmg/QooPEMQb/lM9qGHT99ebqPziEd3wg== @@ -3519,12 +3508,12 @@ packages: terser: optional: true dependencies: - '@types/node': 20.2.5 + '@types/node': 20.8.2 esbuild: 0.18.13 - postcss: 8.4.26 - rollup: 3.26.2 + postcss: 8.4.31 + rollup: 3.29.4 optionalDependencies: - fsevents: 2.3.2 + fsevents: 2.3.3 dev: true /vitefu@0.2.4(vite@4.4.4): @@ -3538,7 +3527,7 @@ packages: vite: optional: true dependencies: - vite: 4.4.4(@types/node@20.2.5) + vite: 4.4.4(@types/node@20.8.2) dev: true /vitest@0.33.0: @@ -3575,9 +3564,9 @@ packages: webdriverio: optional: true dependencies: - '@types/chai': 4.3.5 + '@types/chai': 4.3.6 '@types/chai-subset': 1.3.3 - '@types/node': 20.2.5 + '@types/node': 20.8.2 '@vitest/expect': 0.33.0 '@vitest/runner': 0.33.0 '@vitest/snapshot': 0.33.0 @@ -3586,18 +3575,18 @@ packages: acorn: 8.10.0 acorn-walk: 8.2.0 cac: 6.7.14 - chai: 4.3.7 + chai: 4.3.10 debug: 4.3.4 local-pkg: 0.4.3 - magic-string: 0.30.1 + magic-string: 0.30.4 pathe: 1.1.1 picocolors: 1.0.0 - std-env: 3.3.3 - strip-literal: 1.0.1 - tinybench: 2.5.0 + std-env: 3.4.3 + strip-literal: 1.3.0 + tinybench: 2.5.1 tinypool: 0.6.0 - vite: 4.4.4(@types/node@20.2.5) - vite-node: 0.33.0(@types/node@20.2.5) + vite: 4.4.4(@types/node@20.8.2) + vite-node: 0.33.0(@types/node@20.8.2) why-is-node-running: 2.2.2 transitivePeerDependencies: - less diff --git a/packages/grid/helm/helm.py b/packages/grid/helm/helm.py index 301db1f984f..fec1a2104c1 100644 --- a/packages/grid/helm/helm.py +++ b/packages/grid/helm/helm.py @@ -1,12 +1,25 @@ # stdlib import argparse import os +import shutil import sys from typing import Any # third party import yaml + +# Preserve those beautiful multi-line strings with | +# https://stackoverflow.com/a/33300001 +def str_presenter(dumper: Any, data: Any) -> Any: + if len(data.splitlines()) > 1: # check for multiline string + return dumper.represent_scalar("tag:yaml.org,2002:str", data, style="|") + return dumper.represent_scalar("tag:yaml.org,2002:str", data) + + +yaml.add_representer(str, str_presenter) +yaml.representer.SafeRepresenter.add_representer(str, str_presenter) + template_variables = { "STACK_API_KEY": "secrets.syft", "DEFAULT_ROOT_EMAIL": "secrets.syft", @@ -52,11 +65,9 @@ def replace_variables(d: Any) -> None: if "kubernetes.io/ingress.class" in d: d["kubernetes.io/ingress.class"] = "{{ .Values.ingress.ingressClass }}" - if "host" in d: - d["host"] = "{{ .Values.node.settings.hostname }}" - - if "hosts" in d: - d["hosts"] = ["{{ .Values.node.settings.hostname }}"] + if "kind" in d and d["kind"] == "Ingress" and "spec" in d: + d["spec"]["tls"] = [{"hosts": ["{{ .Values.node.settings.hostname }}"]}] + d["spec"]["rules"][0]["host"] = "{{ .Values.node.settings.hostname }}" # parse whole tree @@ -73,9 +84,9 @@ def fix_devspace_yaml(d: Any) -> None: fix_devspace_yaml(item) -def get_yaml_name(doc: Any) -> Any: +def get_yaml_name(doc: dict) -> Any: try: - return yaml.safe_load(doc).get("metadata", {}).get("name", "") + return doc.get("metadata", {}).get("name", "") except Exception: # nosec return "" @@ -87,13 +98,12 @@ def main() -> None: "file", nargs="?", type=argparse.FileType("r"), default=sys.stdin ) args = parser.parse_args() - helm_dir = "helm" - text = args.file.read() - # input_file = f"{helm_dir}/raw_manifests.yaml" - # with open(input_file, "w") as f: - # f.write(text) + file_count = 0 + helm_dir = "helm" + manifest_file = f"{helm_dir}/manifests.yaml" + helm_chart_template_dir = f"{helm_dir}/syft/templates" # Read input from file or stdin lines = text.splitlines() @@ -103,50 +113,42 @@ def main() -> None: first_index = next( i for i, line in enumerate(lines) if line.strip().startswith("apiVersion") ) - input_data = "---\n" + "\n".join(lines[first_index - 1 :]) + input_data = "\n".join(lines[first_index:]) except StopIteration: - print("No line starting with 'apiVersion' found in the input.") - return + print("❌ Error: No line starting with 'apiVersion' found in the input.") + exit(1) - helm_chart_template_dir = f"{helm_dir}/syft/templates" + # Load the multi-doc yaml file + try: + yaml_docs = list(yaml.safe_load_all(input_data)) + except Exception as e: + print(f"❌ Error while parsing yaml file: {e}") + exit(1) + + # clear templates dir + shutil.rmtree(helm_chart_template_dir, ignore_errors=True) + + # Create directories if they don't exist + os.makedirs(helm_chart_template_dir, exist_ok=True) - # Split input_data into separate documents - yaml_docs = input_data.split("---") + # Cleanup YAML docs + yaml_docs = [doc for doc in yaml_docs if doc] # Sort YAML docs based on metadata name yaml_docs.sort(key=get_yaml_name) - # Join sorted YAML docs - sorted_input_data = "---".join(yaml_docs) - # Save sorted YAML docs to file - input_file = f"{helm_dir}/manifests.yaml" - with open(input_file, "w") as f: - f.write(sorted_input_data) + with open(manifest_file, "w") as f: + yaml.dump_all(yaml_docs, f) for doc in yaml_docs: - lines = doc.strip().split("\n") - if len(lines) <= 2: - continue # skip empty sections - - output_dir = os.path.join(helm_chart_template_dir) - - # Create directories if they don't exist - os.makedirs(output_dir, exist_ok=True) - - # Parse yaml to find metadata.name - yaml_content = yaml.safe_load("\n".join(lines[1:])) # exclude source_line - fix_devspace_yaml(yaml_content) - name = yaml_content.get("metadata", {}).get("name") + fix_devspace_yaml(doc) + name = doc.get("metadata", {}).get("name") + kind = doc.get("kind", "").lower() if name: # Create new file with name or append if it already exists - new_file = os.path.join(output_dir, f"{name}.yaml") - if os.path.exists(new_file): - mode = "a" # append if file exists - else: - mode = "w" # write if new file - - yaml_dump = yaml.dump(yaml_content) + new_file = os.path.join(helm_chart_template_dir, f"{name}-{kind}.yaml") + yaml_dump = yaml.dump(doc) yaml_dump = ( yaml_dump.replace("'{{", "{{") .replace("}}'", "}}") @@ -154,8 +156,15 @@ def main() -> None: .replace("}}''", "}}") ) - with open(new_file, mode) as f: - f.write("---\n" + yaml_dump) # add document separator + with open(new_file, "w") as f: + f.write(yaml_dump) # add document separator + file_count += 1 + + if file_count > 0: + print(f"✅ Done: Generated {file_count} template files") + else: + print("❌ Failed: No files were generated. Check input for errors.") + exit(1) if __name__ == "__main__": diff --git a/packages/grid/helm/manifests.yaml b/packages/grid/helm/manifests.yaml index 933a8df8509..e65ae44e901 100644 --- a/packages/grid/helm/manifests.yaml +++ b/packages/grid/helm/manifests.yaml @@ -1,3 +1,8 @@ +--- +# Source: component-chart/templates/deployment.yaml +# Create headless service for StatefulSet +--- + --- # Source: component-chart/templates/ingress.yaml # @@ -6,17 +11,17 @@ --- # Source: component-chart/templates/deployment.yaml # Create headless service for StatefulSet ---- - --- # Source: component-chart/templates/ingress.yaml # --- -# Source: component-chart/templates/deployment.yaml -# Create headless service for StatefulSet ------- + +--- +# Source: component-chart/templates/ingress.yaml +# +--- # Source: component-chart/templates/service.yaml apiVersion: v1 kind: Service @@ -26,7 +31,7 @@ metadata: "app.kubernetes.io/name": "backend" "app.kubernetes.io/managed-by": "Helm" annotations: - "helm.sh/chart": "component-chart-0.8.6" + "helm.sh/chart": "component-chart-0.9.1" spec: externalIPs: ports: @@ -49,7 +54,7 @@ metadata: "app.kubernetes.io/component": "backend" "app.kubernetes.io/managed-by": "Helm" annotations: - "helm.sh/chart": "component-chart-0.8.6" + "helm.sh/chart": "component-chart-0.9.1" spec: replicas: 1 podManagementPolicy: "OrderedReady" @@ -66,7 +71,7 @@ spec: "app.kubernetes.io/component": "backend" "app.kubernetes.io/managed-by": "Helm" annotations: - "helm.sh/chart": "component-chart-0.8.6" + "helm.sh/chart": "component-chart-0.9.1" spec: imagePullSecrets: nodeSelector: @@ -93,7 +98,7 @@ spec: ephemeralContainers: null containers: - - image: "docker.io/openmined/grid-backend:0.8.2-beta.1" + - image: "docker.io/openmined/grid-backend:0.8.2-beta.33" name: "container-0" command: args: @@ -111,7 +116,7 @@ spec: - name: RELEASE value: production - name: VERSION - value: 0.8.2-beta.1 + value: 0.8.2-beta.33 - name: VERSION_HASH value: unknown - name: NODE_TYPE @@ -177,7 +182,7 @@ spec: "app.kubernetes.io/component": "backend" "app.kubernetes.io/managed-by": "Helm" annotations: - "helm.sh/chart": "component-chart-0.8.6" + "helm.sh/chart": "component-chart-0.9.1" spec: accessModes: - ReadWriteOnce @@ -185,6 +190,7 @@ spec: requests: storage: "100Mi" --- +# Source: component-chart/templates/deployment.yaml # Create headless service for StatefulSet apiVersion: v1 kind: Service @@ -194,7 +200,7 @@ metadata: "app.kubernetes.io/name": "backend" "app.kubernetes.io/managed-by": "Helm" annotations: - "helm.sh/chart": "component-chart-0.8.6" + "helm.sh/chart": "component-chart-0.9.1" spec: ports: # At least one port is required to have Kubernetes define an endpoint which is required for DNS to work @@ -215,7 +221,7 @@ metadata: "app.kubernetes.io/name": "frontend" "app.kubernetes.io/managed-by": "Helm" annotations: - "helm.sh/chart": "component-chart-0.8.6" + "helm.sh/chart": "component-chart-0.9.1" spec: externalIPs: ports: @@ -238,7 +244,7 @@ metadata: "app.kubernetes.io/component": "frontend" "app.kubernetes.io/managed-by": "Helm" annotations: - "helm.sh/chart": "component-chart-0.8.6" + "helm.sh/chart": "component-chart-0.9.1" spec: replicas: 1 strategy: @@ -255,7 +261,7 @@ spec: "app.kubernetes.io/component": "frontend" "app.kubernetes.io/managed-by": "Helm" annotations: - "helm.sh/chart": "component-chart-0.8.6" + "helm.sh/chart": "component-chart-0.9.1" spec: imagePullSecrets: nodeSelector: @@ -282,13 +288,13 @@ spec: ephemeralContainers: null containers: - - image: "docker.io/openmined/grid-frontend:0.8.2-beta.1" + - image: "docker.io/openmined/grid-frontend:0.8.2-beta.33" name: "container-0" command: args: env: - name: VERSION - value: 0.8.2-beta.1 + value: 0.8.2-beta.33 - name: VERSION_HASH value: unknown - name: NODE_TYPE @@ -351,7 +357,7 @@ metadata: "app.kubernetes.io/name": "mongo" "app.kubernetes.io/managed-by": "Helm" annotations: - "helm.sh/chart": "component-chart-0.8.6" + "helm.sh/chart": "component-chart-0.9.1" spec: externalIPs: ports: @@ -374,7 +380,7 @@ metadata: "app.kubernetes.io/component": "mongo" "app.kubernetes.io/managed-by": "Helm" annotations: - "helm.sh/chart": "component-chart-0.8.6" + "helm.sh/chart": "component-chart-0.9.1" spec: replicas: 1 podManagementPolicy: "OrderedReady" @@ -391,7 +397,7 @@ spec: "app.kubernetes.io/component": "mongo" "app.kubernetes.io/managed-by": "Helm" annotations: - "helm.sh/chart": "component-chart-0.8.6" + "helm.sh/chart": "component-chart-0.9.1" spec: imagePullSecrets: nodeSelector: @@ -418,7 +424,7 @@ spec: ephemeralContainers: null containers: - - image: "mongo:latest" + - image: "mongo:7.0.0" name: "container-0" command: args: @@ -456,7 +462,7 @@ spec: "app.kubernetes.io/component": "mongo" "app.kubernetes.io/managed-by": "Helm" annotations: - "helm.sh/chart": "component-chart-0.8.6" + "helm.sh/chart": "component-chart-0.9.1" spec: accessModes: - ReadWriteOnce @@ -474,7 +480,7 @@ metadata: "app.kubernetes.io/name": "mongo" "app.kubernetes.io/managed-by": "Helm" annotations: - "helm.sh/chart": "component-chart-0.8.6" + "helm.sh/chart": "component-chart-0.9.1" spec: ports: # At least one port is required to have Kubernetes define an endpoint which is required for DNS to work @@ -495,7 +501,7 @@ metadata: "app.kubernetes.io/name": "proxy" "app.kubernetes.io/managed-by": "Helm" annotations: - "helm.sh/chart": "component-chart-0.8.6" + "helm.sh/chart": "component-chart-0.9.1" spec: externalIPs: ports: @@ -518,7 +524,7 @@ metadata: "app.kubernetes.io/component": "proxy" "app.kubernetes.io/managed-by": "Helm" annotations: - "helm.sh/chart": "component-chart-0.8.6" + "helm.sh/chart": "component-chart-0.9.1" spec: replicas: 1 strategy: @@ -535,7 +541,7 @@ spec: "app.kubernetes.io/component": "proxy" "app.kubernetes.io/managed-by": "Helm" annotations: - "helm.sh/chart": "component-chart-0.8.6" + "helm.sh/chart": "component-chart-0.9.1" spec: imagePullSecrets: nodeSelector: @@ -562,7 +568,7 @@ spec: ephemeralContainers: null containers: - - image: "traefik:v2.8.1" + - image: "traefik:v2.10" name: "container-0" command: args: @@ -594,9 +600,193 @@ spec: name: traefik-main-config volumeClaimTemplates: --- +# Source: component-chart/templates/service.yaml +apiVersion: v1 +kind: Service +metadata: + name: "seaweedfs" + labels: + "app.kubernetes.io/name": "seaweedfs" + "app.kubernetes.io/managed-by": "Helm" + annotations: + "helm.sh/chart": "component-chart-0.9.1" +spec: + externalIPs: + ports: + - name: "port-0" + port: 8888 + targetPort: 8888 + protocol: "TCP" + - name: "port-1" + port: 8333 + targetPort: 8333 + protocol: "TCP" + selector: + "app.kubernetes.io/name": "devspace-app" + "app.kubernetes.io/component": "seaweedfs" + type: "ClusterIP" +--- +# Source: component-chart/templates/deployment.yaml +apiVersion: apps/v1 +kind: StatefulSet +metadata: + name: "seaweedfs" + labels: + "app.kubernetes.io/name": "devspace-app" + "app.kubernetes.io/component": "seaweedfs" + "app.kubernetes.io/managed-by": "Helm" + annotations: + "helm.sh/chart": "component-chart-0.9.1" +spec: + replicas: 1 + podManagementPolicy: "OrderedReady" + serviceName: "seaweedfs-headless" + selector: + matchLabels: + "app.kubernetes.io/name": "devspace-app" + "app.kubernetes.io/component": "seaweedfs" + "app.kubernetes.io/managed-by": "Helm" + template: + metadata: + labels: + "app.kubernetes.io/name": "devspace-app" + "app.kubernetes.io/component": "seaweedfs" + "app.kubernetes.io/managed-by": "Helm" + annotations: + "helm.sh/chart": "component-chart-0.9.1" + spec: + imagePullSecrets: + nodeSelector: + null + nodeName: + null + affinity: + null + tolerations: + null + dnsConfig: + null + hostAliases: + null + overhead: + null + readinessGates: + null + securityContext: + null + topologySpreadConstraints: + null + terminationGracePeriodSeconds: 5 + ephemeralContainers: + null + containers: + - image: "chrislusf/seaweedfs:3.55" + name: "container-0" + command: + - "sh" + - "/etc/seaweedfs/start.sh" + args: + env: + - name: S3_VOLUME_SIZE_MB + value: "1024" + - name: S3_ROOT_USER + value: admin + - name: S3_ROOT_PWD + value: admin + - name: S3_PORT + value: "8333" + envFrom: + null + securityContext: + null + lifecycle: + null + livenessProbe: + null + readinessProbe: + null + startupProbe: + null + volumeDevices: + null + volumeMounts: + - mountPath: "/etc/seaweedfs/filer.toml" + name: "seaweedfs-config" + subPath: "filer.toml" + readOnly: false + - mountPath: "/etc/seaweedfs/start.sh" + name: "seaweedfs-config" + subPath: "start.sh" + readOnly: false + - mountPath: "/data/blob" + name: "seaweedfs-data" + subPath: "" + readOnly: false + initContainers: + volumes: + - name: "seaweedfs-config" + configMap: + name: seaweedfs-config + volumeClaimTemplates: + - metadata: + name: "seaweedfs-data" + labels: + "app.kubernetes.io/name": "devspace-app" + "app.kubernetes.io/component": "seaweedfs" + "app.kubernetes.io/managed-by": "Helm" + annotations: + "helm.sh/chart": "component-chart-0.9.1" + spec: + accessModes: + - ReadWriteOnce + resources: + requests: + storage: "5Gi" +--- # Source: component-chart/templates/ingress.yaml # +apiVersion: v1 +data: + filer.toml: | + [leveldb2] + enabled = true + dir = "./filerldb2" + start.sh: | + #! /usr/bin/env bash + + sleep 30 && + echo "s3.configure -access_key ${S3_ROOT_USER} -secret_key ${S3_ROOT_PWD} -user iam -actions Read,Write,List,Tagging,Admin -apply" \ + | weed shell > /dev/null 2>&1 \ + & weed server -s3 -s3.port=${S3_PORT} -master.volumeSizeLimitMB=${S3_VOLUME_SIZE_MB} +kind: ConfigMap +metadata: + name: seaweedfs-config + namespace: default + +--- +# Source: component-chart/templates/deployment.yaml +# Create headless service for StatefulSet +apiVersion: v1 +kind: Service +metadata: + name: "seaweedfs-headless" + labels: + "app.kubernetes.io/name": "seaweedfs" + "app.kubernetes.io/managed-by": "Helm" + annotations: + "helm.sh/chart": "component-chart-0.9.1" +spec: + ports: + # At least one port is required to have Kubernetes define an endpoint which is required for DNS to work + - port: 80 + name: web + clusterIP: None + selector: + "app.kubernetes.io/name": "devspace-app" + "app.kubernetes.io/component": "seaweedfs" + "app.kubernetes.io/managed-by": "Helm" +--- apiVersion: v1 data: dynamic.yml: | diff --git a/packages/grid/helm/repo/index.yaml b/packages/grid/helm/repo/index.yaml index 0af7646e729..38d620783c5 100644 --- a/packages/grid/helm/repo/index.yaml +++ b/packages/grid/helm/repo/index.yaml @@ -1,9 +1,41 @@ apiVersion: v1 entries: syft: + - apiVersion: v2 + appVersion: 0.8.2-beta.35 + created: "2023-10-09T14:12:21.587674715Z" + dependencies: + - name: component-chart + repository: https://charts.devspace.sh + version: 0.9.1 + description: Perform numpy-like analysis on data that remains in someone elses + server + digest: 29d7ed3c7e2c9bf375cfa107555fd13847b4a26a0957b34814df35c21505aae7 + icon: https://raw.githubusercontent.com/OpenMined/PySyft/dev/docs/img/title_syft_light.png + name: syft + type: application + urls: + - https://openmined.github.io/PySyft/helm/syft-0.8.2-beta.35.tgz + version: 0.8.2-beta.35 + - apiVersion: v2 + appVersion: 0.8.2-beta.34 + created: "2023-10-09T14:12:21.587144627Z" + dependencies: + - name: component-chart + repository: https://charts.devspace.sh + version: 0.9.1 + description: Perform numpy-like analysis on data that remains in someone elses + server + digest: d9fd70258e5f60a89e87a1635d6e0410fd179c9850def738ab7b3216d81561ce + icon: https://raw.githubusercontent.com/OpenMined/PySyft/dev/docs/img/title_syft_light.png + name: syft + type: application + urls: + - https://openmined.github.io/PySyft/helm/syft-0.8.2-beta.34.tgz + version: 0.8.2-beta.34 - apiVersion: v2 appVersion: 0.8.2-beta.33 - created: "2023-10-02T10:55:27.318668102Z" + created: "2023-10-09T14:12:21.586621111Z" dependencies: - name: component-chart repository: https://charts.devspace.sh @@ -19,14 +51,14 @@ entries: version: 0.8.2-beta.33 - apiVersion: v2 appVersion: 0.8.2-beta.32 - created: "2023-10-02T10:55:27.318183148Z" + created: "2023-10-09T14:12:21.586140476Z" dependencies: - name: component-chart repository: https://charts.devspace.sh - version: 0.8.6 + version: 0.9.1 description: Perform numpy-like analysis on data that remains in someone elses server - digest: a2a5e157e5d9fe60f85388c955829e4b890bdbce7d89885318e3622db997b39e + digest: 2daca9dbf41826d7d2366df64fe51660155eded693620a778743be20f7f2705a icon: https://raw.githubusercontent.com/OpenMined/PySyft/dev/docs/img/title_syft_light.png name: syft type: application @@ -35,7 +67,7 @@ entries: version: 0.8.2-beta.32 - apiVersion: v2 appVersion: 0.8.2-beta.31 - created: "2023-10-02T10:55:27.317703574Z" + created: "2023-10-09T14:12:21.585609787Z" dependencies: - name: component-chart repository: https://charts.devspace.sh @@ -51,7 +83,7 @@ entries: version: 0.8.2-beta.31 - apiVersion: v2 appVersion: 0.8.2-beta.30 - created: "2023-10-02T10:55:27.317219803Z" + created: "2023-10-09T14:12:21.585124231Z" dependencies: - name: component-chart repository: https://charts.devspace.sh @@ -67,7 +99,7 @@ entries: version: 0.8.2-beta.30 - apiVersion: v2 appVersion: 0.8.2-beta.29 - created: "2023-10-02T10:55:27.31622029Z" + created: "2023-10-09T14:12:21.58413049Z" dependencies: - name: component-chart repository: https://charts.devspace.sh @@ -83,7 +115,7 @@ entries: version: 0.8.2-beta.29 - apiVersion: v2 appVersion: 0.8.2-beta.28 - created: "2023-10-02T10:55:27.315697375Z" + created: "2023-10-09T14:12:21.583586746Z" dependencies: - name: component-chart repository: https://charts.devspace.sh @@ -99,7 +131,7 @@ entries: version: 0.8.2-beta.28 - apiVersion: v2 appVersion: 0.8.2-beta.27 - created: "2023-10-02T10:55:27.315169221Z" + created: "2023-10-09T14:12:21.582569185Z" dependencies: - name: component-chart repository: https://charts.devspace.sh @@ -115,7 +147,7 @@ entries: version: 0.8.2-beta.27 - apiVersion: v2 appVersion: 0.8.2-beta.26 - created: "2023-10-02T10:55:27.314622382Z" + created: "2023-10-09T14:12:21.582073511Z" dependencies: - name: component-chart repository: https://charts.devspace.sh @@ -131,7 +163,7 @@ entries: version: 0.8.2-beta.26 - apiVersion: v2 appVersion: 0.8.2-beta.25 - created: "2023-10-02T10:55:27.313561468Z" + created: "2023-10-09T14:12:21.581591944Z" dependencies: - name: component-chart repository: https://charts.devspace.sh @@ -147,7 +179,7 @@ entries: version: 0.8.2-beta.25 - apiVersion: v2 appVersion: 0.8.2-beta.24 - created: "2023-10-02T10:55:27.313081434Z" + created: "2023-10-09T14:12:21.58110129Z" dependencies: - name: component-chart repository: https://charts.devspace.sh @@ -163,7 +195,7 @@ entries: version: 0.8.2-beta.24 - apiVersion: v2 appVersion: 0.8.2-beta.23 - created: "2023-10-02T10:55:27.312603443Z" + created: "2023-10-09T14:12:21.58062384Z" dependencies: - name: component-chart repository: https://charts.devspace.sh @@ -179,7 +211,7 @@ entries: version: 0.8.2-beta.23 - apiVersion: v2 appVersion: 0.8.2-beta.22 - created: "2023-10-02T10:55:27.312120413Z" + created: "2023-10-09T14:12:21.580141321Z" dependencies: - name: component-chart repository: https://charts.devspace.sh @@ -195,7 +227,7 @@ entries: version: 0.8.2-beta.22 - apiVersion: v2 appVersion: 0.8.2-beta.21 - created: "2023-10-02T10:55:27.311616183Z" + created: "2023-10-09T14:12:21.57962611Z" dependencies: - name: component-chart repository: https://charts.devspace.sh @@ -211,7 +243,7 @@ entries: version: 0.8.2-beta.21 - apiVersion: v2 appVersion: 0.8.2-beta.20 - created: "2023-10-02T10:55:27.311133874Z" + created: "2023-10-09T14:12:21.579127531Z" dependencies: - name: component-chart repository: https://charts.devspace.sh @@ -227,7 +259,7 @@ entries: version: 0.8.2-beta.20 - apiVersion: v2 appVersion: 0.8.2-beta.19 - created: "2023-10-02T10:55:27.31014443Z" + created: "2023-10-09T14:12:21.578136605Z" dependencies: - name: component-chart repository: https://charts.devspace.sh @@ -243,7 +275,7 @@ entries: version: 0.8.2-beta.19 - apiVersion: v2 appVersion: 0.8.2-beta.18 - created: "2023-10-02T10:55:27.309655108Z" + created: "2023-10-09T14:12:21.577631824Z" dependencies: - name: component-chart repository: https://charts.devspace.sh @@ -259,7 +291,7 @@ entries: version: 0.8.2-beta.18 - apiVersion: v2 appVersion: 0.8.2-beta.17 - created: "2023-10-02T10:55:27.309144587Z" + created: "2023-10-09T14:12:21.577095484Z" dependencies: - name: component-chart repository: https://charts.devspace.sh @@ -275,7 +307,7 @@ entries: version: 0.8.2-beta.17 - apiVersion: v2 appVersion: 0.8.2-beta.16 - created: "2023-10-02T10:55:27.308596465Z" + created: "2023-10-09T14:12:21.576012801Z" dependencies: - name: component-chart repository: https://charts.devspace.sh @@ -291,7 +323,7 @@ entries: version: 0.8.2-beta.16 - apiVersion: v2 appVersion: 0.8.2-beta.15 - created: "2023-10-02T10:55:27.307361499Z" + created: "2023-10-09T14:12:21.57548626Z" dependencies: - name: component-chart repository: https://charts.devspace.sh @@ -307,7 +339,7 @@ entries: version: 0.8.2-beta.15 - apiVersion: v2 appVersion: 0.8.2-beta.14 - created: "2023-10-02T10:55:27.306875964Z" + created: "2023-10-09T14:12:21.574991167Z" dependencies: - name: component-chart repository: https://charts.devspace.sh @@ -323,7 +355,7 @@ entries: version: 0.8.2-beta.14 - apiVersion: v2 appVersion: 0.8.2-beta.13 - created: "2023-10-02T10:55:27.306378898Z" + created: "2023-10-09T14:12:21.574478041Z" dependencies: - name: component-chart repository: https://charts.devspace.sh @@ -339,7 +371,7 @@ entries: version: 0.8.2-beta.13 - apiVersion: v2 appVersion: 0.8.2-beta.12 - created: "2023-10-02T10:55:27.30587585Z" + created: "2023-10-09T14:12:21.573991444Z" dependencies: - name: component-chart repository: https://charts.devspace.sh @@ -355,7 +387,7 @@ entries: version: 0.8.2-beta.12 - apiVersion: v2 appVersion: 0.8.2-beta.11 - created: "2023-10-02T10:55:27.305359778Z" + created: "2023-10-09T14:12:21.57350061Z" dependencies: - name: component-chart repository: https://charts.devspace.sh @@ -371,7 +403,7 @@ entries: version: 0.8.2-beta.11 - apiVersion: v2 appVersion: 0.8.2-beta.10 - created: "2023-10-02T10:55:27.304855729Z" + created: "2023-10-09T14:12:21.572993545Z" dependencies: - name: component-chart repository: https://charts.devspace.sh @@ -387,7 +419,7 @@ entries: version: 0.8.2-beta.10 - apiVersion: v2 appVersion: 0.8.2-beta.9 - created: "2023-10-02T10:55:27.322211846Z" + created: "2023-10-09T14:12:21.591300833Z" dependencies: - name: component-chart repository: https://charts.devspace.sh @@ -403,7 +435,7 @@ entries: version: 0.8.2-beta.9 - apiVersion: v2 appVersion: 0.8.2-beta.8 - created: "2023-10-02T10:55:27.321712957Z" + created: "2023-10-09T14:12:21.590793267Z" dependencies: - name: component-chart repository: https://charts.devspace.sh @@ -419,7 +451,7 @@ entries: version: 0.8.2-beta.8 - apiVersion: v2 appVersion: 0.8.2-beta.7 - created: "2023-10-02T10:55:27.321175004Z" + created: "2023-10-09T14:12:21.590245075Z" dependencies: - name: component-chart repository: https://charts.devspace.sh @@ -435,7 +467,7 @@ entries: version: 0.8.2-beta.7 - apiVersion: v2 appVersion: 0.8.2-beta.6 - created: "2023-10-02T10:55:27.320142179Z" + created: "2023-10-09T14:12:21.589491711Z" dependencies: - name: component-chart repository: https://charts.devspace.sh @@ -451,7 +483,7 @@ entries: version: 0.8.2-beta.6 - apiVersion: v2 appVersion: 0.8.2-beta.5 - created: "2023-10-02T10:55:27.319626879Z" + created: "2023-10-09T14:12:21.588657917Z" dependencies: - name: component-chart repository: https://charts.devspace.sh @@ -467,7 +499,7 @@ entries: version: 0.8.2-beta.5 - apiVersion: v2 appVersion: 0.8.2-beta.4 - created: "2023-10-02T10:55:27.319146133Z" + created: "2023-10-09T14:12:21.588173695Z" dependencies: - name: component-chart repository: https://charts.devspace.sh @@ -483,7 +515,7 @@ entries: version: 0.8.2-beta.4 - apiVersion: v2 appVersion: 0.8.2-beta.3 - created: "2023-10-02T10:55:27.316720913Z" + created: "2023-10-09T14:12:21.584638065Z" dependencies: - name: component-chart repository: https://charts.devspace.sh @@ -499,7 +531,7 @@ entries: version: 0.8.2-beta.3 - apiVersion: v2 appVersion: 0.8.2-beta.2 - created: "2023-10-02T10:55:27.310643119Z" + created: "2023-10-09T14:12:21.578634843Z" dependencies: - name: component-chart repository: https://charts.devspace.sh @@ -515,7 +547,7 @@ entries: version: 0.8.2-beta.2 - apiVersion: v2 appVersion: 0.8.2-beta.1 - created: "2023-10-02T10:55:27.304368411Z" + created: "2023-10-09T14:12:21.572487712Z" dependencies: - name: component-chart repository: https://charts.devspace.sh @@ -531,7 +563,7 @@ entries: version: 0.8.2-beta.1 - apiVersion: v2 appVersion: 0.8.1 - created: "2023-10-02T10:55:27.303839295Z" + created: "2023-10-09T14:12:21.571986608Z" dependencies: - name: component-chart repository: https://charts.devspace.sh @@ -547,7 +579,7 @@ entries: version: 0.8.1 - apiVersion: v2 appVersion: 0.8.1-beta.21 - created: "2023-10-02T10:55:27.303342469Z" + created: "2023-10-09T14:12:21.571434689Z" dependencies: - name: component-chart repository: https://charts.devspace.sh @@ -563,7 +595,7 @@ entries: version: 0.8.1-beta.21 - apiVersion: v2 appVersion: 0.8.1-beta.20 - created: "2023-10-02T10:55:27.302852817Z" + created: "2023-10-09T14:12:21.570884664Z" dependencies: - name: component-chart repository: https://charts.devspace.sh @@ -579,7 +611,7 @@ entries: version: 0.8.1-beta.20 - apiVersion: v2 appVersion: 0.8.1-beta.19 - created: "2023-10-02T10:55:27.302321576Z" + created: "2023-10-09T14:12:21.569753015Z" dependencies: - name: component-chart repository: https://charts.devspace.sh @@ -595,7 +627,7 @@ entries: version: 0.8.1-beta.19 - apiVersion: v2 appVersion: 0.8.1-beta.15 - created: "2023-10-02T10:55:27.301817477Z" + created: "2023-10-09T14:12:21.569233587Z" dependencies: - name: component-chart repository: https://charts.devspace.sh @@ -611,7 +643,7 @@ entries: version: 0.8.1-beta.15 - apiVersion: v2 appVersion: 0.8.1-beta.12 - created: "2023-10-02T10:55:27.30127198Z" + created: "2023-10-09T14:12:21.568708268Z" dependencies: - name: component-chart repository: https://charts.devspace.sh @@ -625,4 +657,4 @@ entries: urls: - https://openmined.github.io/PySyft/helm/syft-0.8.1-beta.12.tgz version: 0.8.1-beta.12 -generated: "2023-10-02T10:55:27.300535147Z" +generated: "2023-10-09T14:12:21.568023612Z" diff --git a/packages/grid/helm/repo/syft-0.8.2-beta.32.tgz b/packages/grid/helm/repo/syft-0.8.2-beta.32.tgz index c3d1bba0964..842d7581593 100644 Binary files a/packages/grid/helm/repo/syft-0.8.2-beta.32.tgz and b/packages/grid/helm/repo/syft-0.8.2-beta.32.tgz differ diff --git a/packages/grid/helm/repo/syft-0.8.2-beta.34.tgz b/packages/grid/helm/repo/syft-0.8.2-beta.34.tgz new file mode 100644 index 00000000000..b550ce79a59 Binary files /dev/null and b/packages/grid/helm/repo/syft-0.8.2-beta.34.tgz differ diff --git a/packages/grid/helm/repo/syft-0.8.2-beta.35.tgz b/packages/grid/helm/repo/syft-0.8.2-beta.35.tgz new file mode 100644 index 00000000000..8ee7ad2eac8 Binary files /dev/null and b/packages/grid/helm/repo/syft-0.8.2-beta.35.tgz differ diff --git a/packages/grid/helm/syft/Chart.lock b/packages/grid/helm/syft/Chart.lock index ca5dba38a8e..e171adaed3c 100644 --- a/packages/grid/helm/syft/Chart.lock +++ b/packages/grid/helm/syft/Chart.lock @@ -1,6 +1,6 @@ dependencies: - name: component-chart repository: https://charts.devspace.sh - version: 0.8.6 -digest: sha256:dbc0467d06d4890514b116edbeb834771de9a5d61b54c2b221bb0f9147c48113 -generated: "2023-06-20T12:26:38.550418+10:00" + version: 0.9.1 +digest: sha256:fbc2b8447b97f168c9199a0bbdc3a95501a19a3213a5ddbd7a78bc4ef2ab999f +generated: "2023-09-28T21:45:16.869504405+05:30" diff --git a/packages/grid/helm/syft/Chart.yaml b/packages/grid/helm/syft/Chart.yaml index e74a528303d..ab1065b0068 100644 --- a/packages/grid/helm/syft/Chart.yaml +++ b/packages/grid/helm/syft/Chart.yaml @@ -2,11 +2,11 @@ apiVersion: v2 name: syft description: Perform numpy-like analysis on data that remains in someone elses server type: application -version: "0.8.2-beta.33" -appVersion: "0.8.2-beta.33" +version: "0.8.2-beta.35" +appVersion: "0.8.2-beta.35" icon: https://raw.githubusercontent.com/OpenMined/PySyft/dev/docs/img/title_syft_light.png dependencies: - name: component-chart - version: "0.8.6" + version: "0.9.1" repository: "https://charts.devspace.sh" diff --git a/packages/grid/helm/syft/charts/component-chart-0.8.6.tgz b/packages/grid/helm/syft/charts/component-chart-0.8.6.tgz deleted file mode 100644 index 6681f8c86d8..00000000000 Binary files a/packages/grid/helm/syft/charts/component-chart-0.8.6.tgz and /dev/null differ diff --git a/packages/grid/helm/syft/charts/component-chart-0.9.1.tgz b/packages/grid/helm/syft/charts/component-chart-0.9.1.tgz new file mode 100644 index 00000000000..fa9d380b7e1 Binary files /dev/null and b/packages/grid/helm/syft/charts/component-chart-0.9.1.tgz differ diff --git a/packages/grid/helm/syft/templates/backend-headless.yaml b/packages/grid/helm/syft/templates/backend-headless-service.yaml similarity index 88% rename from packages/grid/helm/syft/templates/backend-headless.yaml rename to packages/grid/helm/syft/templates/backend-headless-service.yaml index 3b90239e026..5cd1e6668ac 100644 --- a/packages/grid/helm/syft/templates/backend-headless.yaml +++ b/packages/grid/helm/syft/templates/backend-headless-service.yaml @@ -1,9 +1,8 @@ ---- apiVersion: v1 kind: Service metadata: annotations: - helm.sh/chart: component-chart-0.8.6 + helm.sh/chart: component-chart-0.9.1 labels: app.kubernetes.io/managed-by: Helm app.kubernetes.io/name: backend diff --git a/packages/grid/helm/syft/templates/backend-service.yaml b/packages/grid/helm/syft/templates/backend-service.yaml new file mode 100644 index 00000000000..f1e676707bb --- /dev/null +++ b/packages/grid/helm/syft/templates/backend-service.yaml @@ -0,0 +1,20 @@ +apiVersion: v1 +kind: Service +metadata: + annotations: + helm.sh/chart: component-chart-0.9.1 + labels: + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: backend + name: backend +spec: + externalIPs: null + ports: + - name: port-0 + port: 80 + protocol: TCP + targetPort: 80 + selector: + app.kubernetes.io/component: backend + app.kubernetes.io/name: devspace-app + type: ClusterIP diff --git a/packages/grid/helm/syft/templates/backend.yaml b/packages/grid/helm/syft/templates/backend-statefulset.yaml similarity index 84% rename from packages/grid/helm/syft/templates/backend.yaml rename to packages/grid/helm/syft/templates/backend-statefulset.yaml index aef07935c67..4635147d65f 100644 --- a/packages/grid/helm/syft/templates/backend.yaml +++ b/packages/grid/helm/syft/templates/backend-statefulset.yaml @@ -1,30 +1,8 @@ ---- -apiVersion: v1 -kind: Service -metadata: - annotations: - helm.sh/chart: component-chart-0.8.6 - labels: - app.kubernetes.io/managed-by: Helm - app.kubernetes.io/name: backend - name: backend -spec: - externalIPs: null - ports: - - name: port-0 - port: 80 - protocol: TCP - targetPort: 80 - selector: - app.kubernetes.io/component: backend - app.kubernetes.io/name: devspace-app - type: ClusterIP ---- apiVersion: apps/v1 kind: StatefulSet metadata: annotations: - helm.sh/chart: component-chart-0.8.6 + helm.sh/chart: component-chart-0.9.1 labels: app.kubernetes.io/component: backend app.kubernetes.io/managed-by: Helm @@ -42,7 +20,7 @@ spec: template: metadata: annotations: - helm.sh/chart: component-chart-0.8.6 + helm.sh/chart: component-chart-0.9.1 labels: app.kubernetes.io/component: backend app.kubernetes.io/managed-by: Helm @@ -66,7 +44,7 @@ spec: - name: RELEASE value: production - name: VERSION - value: 0.8.2-beta.1 + value: 0.8.2-beta.33 - name: VERSION_HASH value: {{ .Values.node.settings.versionHash }} - name: NODE_TYPE @@ -104,7 +82,7 @@ spec: - name: BACKEND_STORAGE_PATH value: /storage envFrom: null - image: docker.io/openmined/grid-backend:0.8.2-beta.1 + image: docker.io/openmined/grid-backend:0.8.2-beta.33 lifecycle: null livenessProbe: null name: container-0 @@ -134,7 +112,7 @@ spec: volumeClaimTemplates: - metadata: annotations: - helm.sh/chart: component-chart-0.8.6 + helm.sh/chart: component-chart-0.9.1 labels: app.kubernetes.io/component: backend app.kubernetes.io/managed-by: Helm diff --git a/packages/grid/helm/syft/templates/frontend.yaml b/packages/grid/helm/syft/templates/frontend-deployment.yaml similarity index 72% rename from packages/grid/helm/syft/templates/frontend.yaml rename to packages/grid/helm/syft/templates/frontend-deployment.yaml index 5259dedd3d6..e0b2ddb8346 100644 --- a/packages/grid/helm/syft/templates/frontend.yaml +++ b/packages/grid/helm/syft/templates/frontend-deployment.yaml @@ -1,30 +1,8 @@ ---- -apiVersion: v1 -kind: Service -metadata: - annotations: - helm.sh/chart: component-chart-0.8.6 - labels: - app.kubernetes.io/managed-by: Helm - app.kubernetes.io/name: frontend - name: frontend -spec: - externalIPs: null - ports: - - name: port-0 - port: 80 - protocol: TCP - targetPort: 80 - selector: - app.kubernetes.io/component: frontend - app.kubernetes.io/name: devspace-app - type: ClusterIP ---- apiVersion: apps/v1 kind: Deployment metadata: annotations: - helm.sh/chart: component-chart-0.8.6 + helm.sh/chart: component-chart-0.9.1 labels: app.kubernetes.io/component: frontend app.kubernetes.io/managed-by: Helm @@ -42,7 +20,7 @@ spec: template: metadata: annotations: - helm.sh/chart: component-chart-0.8.6 + helm.sh/chart: component-chart-0.9.1 labels: app.kubernetes.io/component: frontend app.kubernetes.io/managed-by: Helm @@ -54,7 +32,7 @@ spec: command: null env: - name: VERSION - value: 0.8.2-beta.1 + value: 0.8.2-beta.33 - name: VERSION_HASH value: {{ .Values.node.settings.versionHash }} - name: NODE_TYPE @@ -62,7 +40,7 @@ spec: - name: NEXT_PUBLIC_API_URL value: ${NEXT_PUBLIC_API_URL} envFrom: null - image: docker.io/openmined/grid-frontend:0.8.2-beta.1 + image: docker.io/openmined/grid-frontend:0.8.2-beta.33 lifecycle: null livenessProbe: null name: container-0 diff --git a/packages/grid/helm/syft/templates/frontend-service.yaml b/packages/grid/helm/syft/templates/frontend-service.yaml new file mode 100644 index 00000000000..5b9916d409c --- /dev/null +++ b/packages/grid/helm/syft/templates/frontend-service.yaml @@ -0,0 +1,20 @@ +apiVersion: v1 +kind: Service +metadata: + annotations: + helm.sh/chart: component-chart-0.9.1 + labels: + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: frontend + name: frontend +spec: + externalIPs: null + ports: + - name: port-0 + port: 80 + protocol: TCP + targetPort: 80 + selector: + app.kubernetes.io/component: frontend + app.kubernetes.io/name: devspace-app + type: ClusterIP diff --git a/packages/grid/helm/syft/templates/grid-stack-ingress.yaml b/packages/grid/helm/syft/templates/grid-stack-ingress-ingress.yaml similarity index 83% rename from packages/grid/helm/syft/templates/grid-stack-ingress.yaml rename to packages/grid/helm/syft/templates/grid-stack-ingress-ingress.yaml index 134a05a92f9..4047ef28ee6 100644 --- a/packages/grid/helm/syft/templates/grid-stack-ingress.yaml +++ b/packages/grid/helm/syft/templates/grid-stack-ingress-ingress.yaml @@ -1,4 +1,3 @@ ---- apiVersion: networking.k8s.io/v1 kind: Ingress metadata: @@ -11,10 +10,6 @@ spec: name: proxy port: number: 80 - tls: - - hosts: - - {{ .Values.node.settings.hostname }} - # secretName: Add custom TLS secret here or default certificate is used rules: - host: {{ .Values.node.settings.hostname }} http: @@ -25,4 +20,7 @@ spec: port: number: 80 path: / - pathType: Prefix \ No newline at end of file + pathType: Prefix + tls: + - hosts: + - {{ .Values.node.settings.hostname }} diff --git a/packages/grid/helm/syft/templates/mongo-headless.yaml b/packages/grid/helm/syft/templates/mongo-headless-service.yaml similarity index 88% rename from packages/grid/helm/syft/templates/mongo-headless.yaml rename to packages/grid/helm/syft/templates/mongo-headless-service.yaml index c6cd2b22bc8..685f3c81f96 100644 --- a/packages/grid/helm/syft/templates/mongo-headless.yaml +++ b/packages/grid/helm/syft/templates/mongo-headless-service.yaml @@ -1,9 +1,8 @@ ---- apiVersion: v1 kind: Service metadata: annotations: - helm.sh/chart: component-chart-0.8.6 + helm.sh/chart: component-chart-0.9.1 labels: app.kubernetes.io/managed-by: Helm app.kubernetes.io/name: mongo diff --git a/packages/grid/helm/syft/templates/mongo-service.yaml b/packages/grid/helm/syft/templates/mongo-service.yaml new file mode 100644 index 00000000000..23699f74f21 --- /dev/null +++ b/packages/grid/helm/syft/templates/mongo-service.yaml @@ -0,0 +1,20 @@ +apiVersion: v1 +kind: Service +metadata: + annotations: + helm.sh/chart: component-chart-0.9.1 + labels: + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: mongo + name: mongo +spec: + externalIPs: null + ports: + - name: port-0 + port: 27017 + protocol: TCP + targetPort: 27017 + selector: + app.kubernetes.io/component: mongo + app.kubernetes.io/name: devspace-app + type: ClusterIP diff --git a/packages/grid/helm/syft/templates/mongo.yaml b/packages/grid/helm/syft/templates/mongo-statefulset.yaml similarity index 77% rename from packages/grid/helm/syft/templates/mongo.yaml rename to packages/grid/helm/syft/templates/mongo-statefulset.yaml index eba25bf46cd..9da6335d889 100644 --- a/packages/grid/helm/syft/templates/mongo.yaml +++ b/packages/grid/helm/syft/templates/mongo-statefulset.yaml @@ -1,30 +1,8 @@ ---- -apiVersion: v1 -kind: Service -metadata: - annotations: - helm.sh/chart: component-chart-0.8.6 - labels: - app.kubernetes.io/managed-by: Helm - app.kubernetes.io/name: mongo - name: mongo -spec: - externalIPs: null - ports: - - name: port-0 - port: 27017 - protocol: TCP - targetPort: 27017 - selector: - app.kubernetes.io/component: mongo - app.kubernetes.io/name: devspace-app - type: ClusterIP ---- apiVersion: apps/v1 kind: StatefulSet metadata: annotations: - helm.sh/chart: component-chart-0.8.6 + helm.sh/chart: component-chart-0.9.1 labels: app.kubernetes.io/component: mongo app.kubernetes.io/managed-by: Helm @@ -42,7 +20,7 @@ spec: template: metadata: annotations: - helm.sh/chart: component-chart-0.8.6 + helm.sh/chart: component-chart-0.9.1 labels: app.kubernetes.io/component: mongo app.kubernetes.io/managed-by: Helm @@ -58,7 +36,7 @@ spec: - name: MONGO_INITDB_ROOT_PASSWORD value: {{ .Values.secrets.db.mongo.mongoInitdbRootPassword }} envFrom: null - image: mongo:latest + image: mongo:7.0.0 lifecycle: null livenessProbe: null name: container-0 @@ -88,7 +66,7 @@ spec: volumeClaimTemplates: - metadata: annotations: - helm.sh/chart: component-chart-0.8.6 + helm.sh/chart: component-chart-0.9.1 labels: app.kubernetes.io/component: mongo app.kubernetes.io/managed-by: Helm diff --git a/packages/grid/helm/syft/templates/proxy.yaml b/packages/grid/helm/syft/templates/proxy-deployment.yaml similarity index 74% rename from packages/grid/helm/syft/templates/proxy.yaml rename to packages/grid/helm/syft/templates/proxy-deployment.yaml index 700f6b52e75..4197618d8ef 100644 --- a/packages/grid/helm/syft/templates/proxy.yaml +++ b/packages/grid/helm/syft/templates/proxy-deployment.yaml @@ -1,30 +1,8 @@ ---- -apiVersion: v1 -kind: Service -metadata: - annotations: - helm.sh/chart: component-chart-0.8.6 - labels: - app.kubernetes.io/managed-by: Helm - app.kubernetes.io/name: proxy - name: proxy -spec: - externalIPs: null - ports: - - name: proxy - port: 80 - protocol: TCP - targetPort: 80 - selector: - app.kubernetes.io/component: proxy - app.kubernetes.io/name: devspace-app - type: ClusterIP ---- apiVersion: apps/v1 kind: Deployment metadata: annotations: - helm.sh/chart: component-chart-0.8.6 + helm.sh/chart: component-chart-0.9.1 labels: app.kubernetes.io/component: proxy app.kubernetes.io/managed-by: Helm @@ -42,7 +20,7 @@ spec: template: metadata: annotations: - helm.sh/chart: component-chart-0.8.6 + helm.sh/chart: component-chart-0.9.1 labels: app.kubernetes.io/component: proxy app.kubernetes.io/managed-by: Helm @@ -56,7 +34,7 @@ spec: - name: SERVICE_NAME value: proxy envFrom: null - image: traefik:v2.8.1 + image: traefik:v2.10 lifecycle: null livenessProbe: null name: container-0 diff --git a/packages/grid/helm/syft/templates/proxy-service.yaml b/packages/grid/helm/syft/templates/proxy-service.yaml new file mode 100644 index 00000000000..987607391df --- /dev/null +++ b/packages/grid/helm/syft/templates/proxy-service.yaml @@ -0,0 +1,20 @@ +apiVersion: v1 +kind: Service +metadata: + annotations: + helm.sh/chart: component-chart-0.9.1 + labels: + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: proxy + name: proxy +spec: + externalIPs: null + ports: + - name: proxy + port: 80 + protocol: TCP + targetPort: 80 + selector: + app.kubernetes.io/component: proxy + app.kubernetes.io/name: devspace-app + type: ClusterIP diff --git a/packages/grid/helm/syft/templates/seaweedfs-config-configmap.yaml b/packages/grid/helm/syft/templates/seaweedfs-config-configmap.yaml new file mode 100644 index 00000000000..f12bd2e697b --- /dev/null +++ b/packages/grid/helm/syft/templates/seaweedfs-config-configmap.yaml @@ -0,0 +1,16 @@ +apiVersion: v1 +data: + filer.toml: | + [leveldb2] + enabled = true + dir = "./filerldb2" + start.sh: | + #! /usr/bin/env bash + + sleep 30 && + echo "s3.configure -access_key ${S3_ROOT_USER} -secret_key ${S3_ROOT_PWD} -user iam -actions Read,Write,List,Tagging,Admin -apply" \ + | weed shell > /dev/null 2>&1 \ + & weed server -s3 -s3.port=${S3_PORT} -master.volumeSizeLimitMB=${S3_VOLUME_SIZE_MB} +kind: ConfigMap +metadata: + name: seaweedfs-config diff --git a/packages/grid/helm/syft/templates/seaweedfs-headless-service.yaml b/packages/grid/helm/syft/templates/seaweedfs-headless-service.yaml new file mode 100644 index 00000000000..850425304a2 --- /dev/null +++ b/packages/grid/helm/syft/templates/seaweedfs-headless-service.yaml @@ -0,0 +1,18 @@ +apiVersion: v1 +kind: Service +metadata: + annotations: + helm.sh/chart: component-chart-0.9.1 + labels: + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: seaweedfs + name: seaweedfs-headless +spec: + clusterIP: None + ports: + - name: web + port: 80 + selector: + app.kubernetes.io/component: seaweedfs + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: devspace-app diff --git a/packages/grid/helm/syft/templates/seaweedfs-service.yaml b/packages/grid/helm/syft/templates/seaweedfs-service.yaml new file mode 100644 index 00000000000..5bfa2fbaec4 --- /dev/null +++ b/packages/grid/helm/syft/templates/seaweedfs-service.yaml @@ -0,0 +1,24 @@ +apiVersion: v1 +kind: Service +metadata: + annotations: + helm.sh/chart: component-chart-0.9.1 + labels: + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: seaweedfs + name: seaweedfs +spec: + externalIPs: null + ports: + - name: port-0 + port: 8888 + protocol: TCP + targetPort: 8888 + - name: port-1 + port: 8333 + protocol: TCP + targetPort: 8333 + selector: + app.kubernetes.io/component: seaweedfs + app.kubernetes.io/name: devspace-app + type: ClusterIP diff --git a/packages/grid/helm/syft/templates/seaweedfs-statefulset.yaml b/packages/grid/helm/syft/templates/seaweedfs-statefulset.yaml new file mode 100644 index 00000000000..fbd97f33530 --- /dev/null +++ b/packages/grid/helm/syft/templates/seaweedfs-statefulset.yaml @@ -0,0 +1,97 @@ +apiVersion: apps/v1 +kind: StatefulSet +metadata: + annotations: + helm.sh/chart: component-chart-0.9.1 + labels: + app.kubernetes.io/component: seaweedfs + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: devspace-app + name: seaweedfs +spec: + podManagementPolicy: OrderedReady + replicas: 1 + selector: + matchLabels: + app.kubernetes.io/component: seaweedfs + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: devspace-app + serviceName: seaweedfs-headless + template: + metadata: + annotations: + helm.sh/chart: component-chart-0.9.1 + labels: + app.kubernetes.io/component: seaweedfs + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: devspace-app + spec: + affinity: null + containers: + - args: null + command: + - sh + - /etc/seaweedfs/start.sh + env: + - name: S3_VOLUME_SIZE_MB + value: '1024' + - name: S3_ROOT_USER + value: admin + - name: S3_ROOT_PWD + value: admin + - name: S3_PORT + value: '8333' + envFrom: null + image: chrislusf/seaweedfs:3.55 + lifecycle: null + livenessProbe: null + name: container-0 + readinessProbe: null + securityContext: null + startupProbe: null + volumeDevices: null + volumeMounts: + - mountPath: /etc/seaweedfs/filer.toml + name: seaweedfs-config + readOnly: false + subPath: filer.toml + - mountPath: /etc/seaweedfs/start.sh + name: seaweedfs-config + readOnly: false + subPath: start.sh + - mountPath: /data/blob + name: seaweedfs-data + readOnly: false + subPath: '' + dnsConfig: null + ephemeralContainers: null + hostAliases: null + imagePullSecrets: null + initContainers: null + nodeName: null + nodeSelector: null + overhead: null + readinessGates: null + securityContext: null + terminationGracePeriodSeconds: 5 + tolerations: null + topologySpreadConstraints: null + volumes: + - configMap: + name: seaweedfs-config + name: seaweedfs-config + volumeClaimTemplates: + - metadata: + annotations: + helm.sh/chart: component-chart-0.9.1 + labels: + app.kubernetes.io/component: seaweedfs + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: devspace-app + name: seaweedfs-data + spec: + accessModes: + - ReadWriteOnce + resources: + requests: + storage: 5Gi diff --git a/packages/grid/helm/syft/templates/traefik-main-config-configmap.yaml b/packages/grid/helm/syft/templates/traefik-main-config-configmap.yaml new file mode 100644 index 00000000000..829e7220b55 --- /dev/null +++ b/packages/grid/helm/syft/templates/traefik-main-config-configmap.yaml @@ -0,0 +1,68 @@ +apiVersion: v1 +data: + dynamic.yml: | + http: + services: + frontend: + loadBalancer: + servers: + - url: "http://frontend" + backend: + loadBalancer: + servers: + - url: "http://backend" + seaweedfs: + loadBalancer: + servers: + - url: "http://seaweedfs:8333" + routers: + frontend: + rule: "PathPrefix(`/`)" + entryPoints: + - "web" + service: "frontend" + backend: + rule: "PathPrefix(`/api`) || PathPrefix(`/docs`) || PathPrefix(`/redoc`)" + entryPoints: + - "web" + service: "backend" + blob-storage: + rule: "PathPrefix(`/blob`)" + entryPoints: + - "web" + service: "seaweedfs" + middlewares: + - "blob-storage-url" + - "blob-storage-host" + middlewares: + blob-storage-host: + headers: + customrequestheaders: + Host: seaweedfs:8333 + blob-storage-url: + stripprefix: + prefixes: /blob + forceslash: true + traefik.yml: | + global: + checkNewVersion: false + sendAnonymousUsage: false + + log: + level: INFO + + entryPoints: + web: + address: :80 + ping: + address: :8082 + + ping: + entryPoint: "ping" + + providers: + file: + filename: /etc/traefik/dynamic.yml +kind: ConfigMap +metadata: + name: traefik-main-config diff --git a/packages/grid/helm/syft/templates/traefik-main-config.yaml b/packages/grid/helm/syft/templates/traefik-main-config.yaml deleted file mode 100644 index e3b28b6d9ea..00000000000 --- a/packages/grid/helm/syft/templates/traefik-main-config.yaml +++ /dev/null @@ -1,23 +0,0 @@ ---- -apiVersion: v1 -data: - dynamic.yml: "http:\n services:\n frontend:\n loadBalancer:\n servers:\n\ - \ - url: \"http://frontend\"\n backend:\n loadBalancer:\n \ - \ servers:\n - url: \"http://backend\"\n seaweedfs:\n loadBalancer:\n\ - \ servers:\n - url: \"http://seaweedfs:8333\"\n routers:\n \ - \ frontend:\n rule: \"PathPrefix(`/`)\"\n entryPoints:\n - \"\ - web\"\n service: \"frontend\"\n backend:\n rule: \"PathPrefix(`/api`)\ - \ || PathPrefix(`/docs`) || PathPrefix(`/redoc`)\"\n entryPoints:\n \ - \ - \"web\"\n service: \"backend\"\n blob-storage:\n rule: \"PathPrefix(`/blob`)\"\ - \n entryPoints:\n - \"web\"\n service: \"seaweedfs\"\n middlewares:\n\ - \ - \"blob-storage-url\"\n - \"blob-storage-host\"\n middlewares:\n\ - \ blob-storage-host:\n headers:\n customrequestheaders:\n \ - \ Host: seaweedfs:8333\n blob-storage-url:\n stripprefix:\n \ - \ prefixes: /blob\n forceslash: true\n" - traefik.yml: "global:\n checkNewVersion: false\n sendAnonymousUsage: false\n\n\ - log:\n level: INFO\n\nentryPoints:\n web:\n address: :80\n ping:\n address:\ - \ :8082\n\nping:\n entryPoint: \"ping\"\n\nproviders:\n file:\n filename:\ - \ /etc/traefik/dynamic.yml\n" -kind: ConfigMap -metadata: - name: traefik-main-config diff --git a/packages/grid/k8s/manifests/ingress.yaml b/packages/grid/k8s/manifests/ingress.yaml index 6dfc106550f..072e54dedb0 100644 --- a/packages/grid/k8s/manifests/ingress.yaml +++ b/packages/grid/k8s/manifests/ingress.yaml @@ -10,13 +10,8 @@ spec: name: proxy port: number: 80 - tls: - - hosts: - - "" - # secretName: Add custom TLS secret here or default certificate is used rules: - - host: "" - http: + - http: paths: - backend: service: diff --git a/packages/grid/k8s/manifests/seaweed-filer.yaml b/packages/grid/k8s/manifests/seaweed-filer.yaml deleted file mode 100644 index 7487645c94a..00000000000 --- a/packages/grid/k8s/manifests/seaweed-filer.yaml +++ /dev/null @@ -1,11 +0,0 @@ -apiVersion: v1 -kind: ConfigMap -data: - filer.toml: | - [redis] - enabled = true - address = "redis:6379" - password = "" - database = 15 -metadata: - name: seaweed-config-filer diff --git a/packages/grid/k8s/manifests/seaweed-s3.yaml b/packages/grid/k8s/manifests/seaweed-s3.yaml deleted file mode 100644 index ecf48f0e037..00000000000 --- a/packages/grid/k8s/manifests/seaweed-s3.yaml +++ /dev/null @@ -1,20 +0,0 @@ -apiVersion: v1 -kind: ConfigMap -data: - s3config.json: | - { - "identities": [ - { - "name": "admin", - "credentials": [ - { - "accessKey": "admin", - "secretKey": "admin" - } - ], - "actions": ["Admin", "Read", "List", "Tagging", "Write"] - } - ] - } -metadata: - name: seaweed-config-s3 diff --git a/packages/grid/k8s/manifests/seaweedfs.yaml b/packages/grid/k8s/manifests/seaweedfs.yaml new file mode 100644 index 00000000000..994da439b83 --- /dev/null +++ b/packages/grid/k8s/manifests/seaweedfs.yaml @@ -0,0 +1,17 @@ +apiVersion: v1 +kind: ConfigMap +data: + filer.toml: | + [leveldb2] + enabled = true + dir = "./filerldb2" + + start.sh: | + #! /usr/bin/env bash + + sleep 30 && + echo "s3.configure -access_key ${S3_ROOT_USER} -secret_key ${S3_ROOT_PWD} -user iam -actions Read,Write,List,Tagging,Admin -apply" \ + | weed shell > /dev/null 2>&1 \ + & weed server -s3 -s3.port=${S3_PORT} -master.volumeSizeLimitMB=${S3_VOLUME_SIZE_MB} +metadata: + name: seaweedfs-config diff --git a/packages/grid/podman/podman-kube/podman-syft-kube.yaml b/packages/grid/podman/podman-kube/podman-syft-kube.yaml index b3ffc45e120..3bd7727f113 100644 --- a/packages/grid/podman/podman-kube/podman-syft-kube.yaml +++ b/packages/grid/podman/podman-kube/podman-syft-kube.yaml @@ -41,7 +41,7 @@ spec: - configMapRef: name: podman-syft-config - image: docker.io/openmined/grid-backend:0.8.2-beta.33 + image: docker.io/openmined/grid-backend:0.8.2-beta.35 imagePullPolicy: IfNotPresent resources: {} tty: true @@ -57,7 +57,7 @@ spec: envFrom: - configMapRef: name: podman-syft-config - image: docker.io/openmined/grid-frontend:0.8.2-beta.33 + image: docker.io/openmined/grid-frontend:0.8.2-beta.35 imagePullPolicy: IfNotPresent resources: {} tty: true diff --git a/packages/grid/seaweedfs/s3config.json b/packages/grid/seaweedfs/s3config.json deleted file mode 100644 index 49416a081fe..00000000000 --- a/packages/grid/seaweedfs/s3config.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "identities": [ - { - "name": "admin", - "credentials": [ - { - "accessKey": "admin", - "secretKey": "admin" - } - ], - "actions": ["Admin", "Read", "List", "Tagging", "Write"] - } - ] -} diff --git a/packages/grid/vagrant/almalinux_9/arm_64/Vagrantfile b/packages/grid/vagrant/almalinux_9/arm_64/Vagrantfile new file mode 100644 index 00000000000..617003eb4f2 --- /dev/null +++ b/packages/grid/vagrant/almalinux_9/arm_64/Vagrantfile @@ -0,0 +1,38 @@ +Vagrant.configure("2") do |config| + config.vm.box = "almalinux/9.aarch64" + config.vm.hostname = "almalinux-9" + + config.vm.provider "virtualbox" do |vb| + vb.memory = "4096" + vb.cpus = "2" + end + + config.vm.provider "vmware_desktop" do |vd| + vd.memory = "4096" + vd.cpus = "2" + end + + config.vm.box_check_update = false + + config.vm.provision "shell", inline: <<-SHELL + #!/bin/bash + echo "Hello from the inline Bash script!" + # Flush existing rules + iptables-save > rules.v4.old + iptables -F + + # Set the default policies to DROP + iptables -P INPUT DROP + iptables -P FORWARD DROP + iptables -P OUTPUT ACCEPT + + # Allow incoming SSH traffic + iptables -A INPUT -p tcp --dport 22 -j ACCEPT + + # Save the rules so they persist across reboots + iptables-save > rules.v4.new + pwd + + SHELL + + end \ No newline at end of file diff --git a/packages/grid/vagrant/almalinux_9/x86_64/Vagrantfile b/packages/grid/vagrant/almalinux_9/x86_64/Vagrantfile new file mode 100644 index 00000000000..20fe9b8d652 --- /dev/null +++ b/packages/grid/vagrant/almalinux_9/x86_64/Vagrantfile @@ -0,0 +1,37 @@ +Vagrant.configure("2") do |config| + config.vm.box = "almalinux/9" + config.vm.hostname = "almalinux-9" + + config.vm.provider "virtualbox" do |vb| + vb.memory = "4096" + vb.cpus = "2" + end + + config.vm.provider "vmware_desktop" do |vd| + vd.memory = "4096" + vd.cpus = "2" + end + config.vm.box_check_update = false + + config.vm.provision "shell", inline: <<-SHELL + #!/bin/bash + echo "Hello from the inline Bash script!" + # Flush existing rules + iptables-save > rules.v4.old + iptables -F + + # Set the default policies to DROP + iptables -P INPUT DROP + iptables -P FORWARD DROP + iptables -P OUTPUT ACCEPT + + # Allow incoming SSH traffic + iptables -A INPUT -p tcp --dport 22 -j ACCEPT + + # Save the rules so they persist across reboots + iptables-save > rules.v4.new + pwd + + SHELL + + end \ No newline at end of file diff --git a/packages/grid/podman/vagrant/arm_64/Vagrantfile b/packages/grid/vagrant/fedora_38/arm_64/Vagrantfile similarity index 89% rename from packages/grid/podman/vagrant/arm_64/Vagrantfile rename to packages/grid/vagrant/fedora_38/arm_64/Vagrantfile index 1d6c6eaaac9..8d4d9b73445 100644 --- a/packages/grid/podman/vagrant/arm_64/Vagrantfile +++ b/packages/grid/vagrant/fedora_38/arm_64/Vagrantfile @@ -11,7 +11,7 @@ Vagrant.configure("2") do |config| vd.memory = "4096" vd.cpus = "2" end - config.vm.synced_folder "../../podman-kube", "/home/vagrant/podman-kube" ,type: "rsync" + config.vm.synced_folder "../../../podman/podman-kube", "/home/vagrant/podman-kube" ,type: "rsync" config.vm.box_check_update = false config.vm.network "forwarded_port", guest: 8080, host: 8080, host_ip: "127.0.0.1" diff --git a/packages/grid/podman/vagrant/x86_64/Vagrantfile b/packages/grid/vagrant/fedora_38/x86_64/Vagrantfile similarity index 80% rename from packages/grid/podman/vagrant/x86_64/Vagrantfile rename to packages/grid/vagrant/fedora_38/x86_64/Vagrantfile index 382c9938468..b39b162957c 100644 --- a/packages/grid/podman/vagrant/x86_64/Vagrantfile +++ b/packages/grid/vagrant/fedora_38/x86_64/Vagrantfile @@ -1,6 +1,6 @@ Vagrant.configure("2") do |config| - config.vm.box = "bento/fedora-38-x86_64" - config.vm.hostname = "fedora-38" + config.vm.box = "bento/fedora-38" + config.vm.hostname = "fedora-38-x86_64" config.vm.provider "virtualbox" do |vb| vb.memory = "4096" @@ -11,7 +11,7 @@ Vagrant.configure("2") do |config| vd.memory = "4096" vd.cpus = "2" end - config.vm.synced_folder "../../podman-kube", "/home/vagrant/podman-kube" ,type: "rsync" + config.vm.synced_folder "../../../podman/podman-kube", "/home/vagrant/podman-kube" ,type: "rsync" config.vm.box_check_update = false config.vm.network "forwarded_port", guest: 8080, host: 8080, host_ip: "127.0.0.1" diff --git a/packages/grid/worker/worker.dockerfile b/packages/grid/worker/worker.dockerfile index d7b096687ee..cc87d13b2bb 100644 --- a/packages/grid/worker/worker.dockerfile +++ b/packages/grid/worker/worker.dockerfile @@ -18,12 +18,6 @@ RUN --mount=type=cache,sharing=locked,target=/var/cache/apt \ RUN --mount=type=cache,target=/root/.cache \ pip install -U pip -# copy precompiled arm64 packages -COPY grid/backend/wheels /wheels -RUN --mount=type=cache,target=/root/.cache if [ $(uname -m) != "x86_64" ]; then \ - pip install --user /wheels/jaxlib-0.4.16-cp311-cp311-manylinux2014_aarch64.whl; \ - pip install --user jax==0.4.16; \ - fi WORKDIR /app diff --git a/packages/hagrid/.bumpversion.cfg b/packages/hagrid/.bumpversion.cfg index ae6ab007ceb..1d006900387 100644 --- a/packages/hagrid/.bumpversion.cfg +++ b/packages/hagrid/.bumpversion.cfg @@ -1,5 +1,5 @@ [bumpversion] -current_version = 0.3.73 +current_version = 0.3.77 tag = False tag_name = {new_version} commit = True diff --git a/packages/hagrid/hagrid/cli.py b/packages/hagrid/hagrid/cli.py index 3d7a5b92044..35852e6521f 100644 --- a/packages/hagrid/hagrid/cli.py +++ b/packages/hagrid/hagrid/cli.py @@ -130,8 +130,10 @@ def get_compose_src_path( **kwargs: TypeDict[str, Any], ) -> str: grid_path = GRID_SRC_PATH() - tag = kwargs.get("tag", None) - if EDITABLE_MODE and template_location is None or tag == "0.7.0": # type: ignore + tag = kwargs["tag"] + # Use local compose files if in editable mode and + # template_location is None and (kwargs["dev"] is True or tag is local) + if EDITABLE_MODE and template_location is None and (kwargs["dev"] is True or tag == "local"): # type: ignore path = grid_path else: path = deployment_dir(node_name) @@ -1356,25 +1358,64 @@ def create_launch_cmd( if ( parsed_kwargs["tag"] is not None and parsed_kwargs["template"] is None - and parsed_kwargs["tag"] not in ["local", "0.7.0"] + and parsed_kwargs["tag"] not in ["local"] ): + # third party + from packaging import version + + pattern = r"[0-9].[0-9].[0-9]" + input_tag = parsed_kwargs["tag"] + if ( + not re.match(pattern, input_tag) + and input_tag != "latest" + and input_tag != "beta" + and "b" not in input_tag + ): + raise Exception( + f"Not a valid tag: {parsed_kwargs['tag']}" + + "\nValid tags: latest, beta, beta version(ex: 0.8.2b35),[0-9].[0-9].[0-9]" + ) + # TODO: we need to redo this so that pypi and docker mappings are in a single # file inside dev if parsed_kwargs["tag"] == "latest": parsed_kwargs["template"] = LATEST_STABLE_SYFT parsed_kwargs["tag"] = LATEST_STABLE_SYFT - elif parsed_kwargs["tag"] == "beta": - parsed_kwargs["template"] = "dev" - parsed_kwargs["tag"] = LATEST_BETA_SYFT + elif parsed_kwargs["tag"] == "beta" or "b" in parsed_kwargs["tag"]: + tag = ( + LATEST_BETA_SYFT + if parsed_kwargs["tag"] == "beta" + else parsed_kwargs["tag"] + ) + + # Currently, manifest_template.yml is only supported for beta versions >= 0.8.2b34 + beta_version = version.parse(tag) + MINIMUM_BETA_VERSION = "0.8.2b34" + if beta_version < version.parse(MINIMUM_BETA_VERSION): + raise Exception( + f"Minimum beta version tag supported is {MINIMUM_BETA_VERSION}" + ) + + # Check if the beta version is available + template_url = f"https://github.com/OpenMined/PySyft/releases/download/v{str(beta_version)}/manifest_template.yml" + response = requests.get(template_url) # nosec + if response.status_code != 200: + raise Exception( + f"Tag {parsed_kwargs['tag']} is not available" + + " \n for download. Please check the available tags at: " + + "\n https://github.com/OpenMined/PySyft/releases" + ) + + parsed_kwargs["template"] = template_url + parsed_kwargs["tag"] = tag else: - template = parsed_kwargs["tag"] - # 🟡 TODO: Revert to use tags once, we have tag branches with beta - # versions also. - if "b" in template: - template = "dev" - # if template == "beta": - # template = "dev" - parsed_kwargs["template"] = template + MINIMUM_TAG_VERSION = version.parse("0.8.0") + tag = version.parse(parsed_kwargs["tag"]) + if tag < MINIMUM_TAG_VERSION: + raise Exception( + f"Minimum supported stable tag version is {MINIMUM_TAG_VERSION}" + ) + parsed_kwargs["template"] = parsed_kwargs["tag"] if host in ["docker"] and parsed_kwargs["template"] and host is not None: # Setup the files from the manifest_template.yml diff --git a/packages/hagrid/hagrid/deps.py b/packages/hagrid/hagrid/deps.py index 3e37b09e8fb..31b6330781c 100644 --- a/packages/hagrid/hagrid/deps.py +++ b/packages/hagrid/hagrid/deps.py @@ -42,7 +42,7 @@ from .version import __version__ LATEST_STABLE_SYFT = "0.8.1" -LATEST_BETA_SYFT = "0.8.2-beta.33" +LATEST_BETA_SYFT = "0.8.2-beta.35" DOCKER_ERROR = """ You are running an old version of docker, possibly on Linux. You need to install v2. diff --git a/packages/hagrid/hagrid/manifest_template.yml b/packages/hagrid/hagrid/manifest_template.yml index 9719f34d826..4de4a9a3173 100644 --- a/packages/hagrid/hagrid/manifest_template.yml +++ b/packages/hagrid/hagrid/manifest_template.yml @@ -1,9 +1,9 @@ manifestVersion: 0.1 -hagrid_version: 0.3.73 -syft_version: 0.8.2-beta.33 -dockerTag: 0.8.2-beta.33 +hagrid_version: 0.3.77 +syft_version: 0.8.2-beta.35 +dockerTag: 0.8.2-beta.35 baseUrl: https://raw.githubusercontent.com/OpenMined/PySyft/ -hash: c0d300071018dbcf13f7c9fb5a2aae0e1e2513fe +hash: 7cc9072e300872e02ae8bfcecf7bb000cdea6a17 target_dir: ~/.hagrid/PySyft/ files: grid: diff --git a/packages/hagrid/hagrid/orchestra.py b/packages/hagrid/hagrid/orchestra.py index 503327dd8ab..ed4ee7bb9ec 100644 --- a/packages/hagrid/hagrid/orchestra.py +++ b/packages/hagrid/hagrid/orchestra.py @@ -295,6 +295,7 @@ def deploy_to_python( sig = inspect.signature(worker_class.named) if "node_type" in sig.parameters.keys(): worker = worker_class.named( + dev_mode=dev_mode, name=name, processes=processes, reset=reset, diff --git a/packages/hagrid/hagrid/version.py b/packages/hagrid/hagrid/version.py index 2facaaf6bc6..e4119daf658 100644 --- a/packages/hagrid/hagrid/version.py +++ b/packages/hagrid/hagrid/version.py @@ -1,6 +1,6 @@ #!/usr/bin/env python3 # HAGrid Version -__version__ = "0.3.73" +__version__ = "0.3.77" if __name__ == "__main__": print(__version__) diff --git a/packages/hagrid/setup.py b/packages/hagrid/setup.py index 2bd48d64774..4ba9940fcd7 100644 --- a/packages/hagrid/setup.py +++ b/packages/hagrid/setup.py @@ -5,7 +5,7 @@ from setuptools import find_packages from setuptools import setup -__version__ = "0.3.73" +__version__ = "0.3.77" DATA_FILES = {"img": ["hagrid/img/*.png"], "hagrid": ["*.yml"]} diff --git a/packages/syft/setup.cfg b/packages/syft/setup.cfg index 3dfe434713d..ae1df7922fb 100644 --- a/packages/syft/setup.cfg +++ b/packages/syft/setup.cfg @@ -1,6 +1,6 @@ [metadata] name = syft -version = attr: "0.8.2-beta.33" +version = attr: "0.8.2-beta.35" description = Perform numpy-like analysis on data that remains in someone elses server author = OpenMined author_email = info@openmined.org @@ -31,8 +31,8 @@ syft = forbiddenfruit==0.1.4 gevent==22.10.2 gipc==1.5.0 - jaxlib==0.4.16 - jax==0.4.16 + jaxlib==0.4.18 + jax==0.4.18 loguru==0.7.0 networkx==2.8 numpy>=1.22.4,<=1.24.3 @@ -65,6 +65,7 @@ syft = torch==2.0.1 recordlinkage==0.15 argon2-cffi==21.3.0 + docker==6.1.3 install_requires = %(syft)s diff --git a/packages/syft/src/syft/VERSION b/packages/syft/src/syft/VERSION index eb0c9fba798..c45494e2144 100644 --- a/packages/syft/src/syft/VERSION +++ b/packages/syft/src/syft/VERSION @@ -1,5 +1,5 @@ # Mono Repo Global Version -__version__ = "0.8.2-beta.33" +__version__ = "0.8.2-beta.35" # elsewhere we can call this file: `python VERSION` and simply take the stdout # stdlib diff --git a/packages/syft/src/syft/__init__.py b/packages/syft/src/syft/__init__.py index 8469a7c11a8..001c6b81dd4 100644 --- a/packages/syft/src/syft/__init__.py +++ b/packages/syft/src/syft/__init__.py @@ -1,4 +1,4 @@ -__version__ = "0.8.2-beta.33" +__version__ = "0.8.2-beta.35" # stdlib import pathlib diff --git a/packages/syft/src/syft/client/api.py b/packages/syft/src/syft/client/api.py index 703684e9e11..c1b2087b333 100644 --- a/packages/syft/src/syft/client/api.py +++ b/packages/syft/src/syft/client/api.py @@ -350,7 +350,7 @@ def __getattribute__(self, name: str): ) def __getitem__(self, key: Union[str, int]) -> Any: - if isinstance(key, int) and hasattr(self, "get_all"): + if hasattr(self, "get_all"): return self.get_all()[key] raise NotImplementedError diff --git a/packages/syft/src/syft/client/domain_client.py b/packages/syft/src/syft/client/domain_client.py index 7adaeaa8b39..5ff7f1e2274 100644 --- a/packages/syft/src/syft/client/domain_client.py +++ b/packages/syft/src/syft/client/domain_client.py @@ -25,6 +25,7 @@ from ..types.uid import UID from ..util.fonts import fonts_css from ..util.util import get_mb_size +from ..util.util import prompt_warning_message from .api import APIModule from .client import SyftClient from .client import login @@ -49,7 +50,7 @@ def add_default_uploader( name=user.name, email=user.email, ) - obj.contributors.append(uploader) + obj.contributors.add(uploader) obj.uploader = uploader return obj @@ -72,6 +73,20 @@ def upload_dataset(self, dataset: CreateDataset) -> Union[SyftSuccess, SyftError dataset._check_asset_must_contain_mock() dataset_size = 0 + # TODO: Refactor so that object can also be passed to generate warnings + metadata = self.api.connection.get_node_metadata(self.api.signing_key) + + if ( + metadata.show_warnings + and metadata.node_side_type == NodeSideType.HIGH_SIDE.value + ): + message = ( + "You're approving a request on " + f"{metadata.node_side_type} side {metadata.node_type} " + "which may host datasets with private information." + ) + prompt_warning_message(message=message, confirm=True) + for asset in tqdm(dataset.asset_list): print(f"Uploading: {asset.name}") try: @@ -138,6 +153,12 @@ def code(self) -> Optional[APIModule]: return self.api.services.code return None + @property + def worker(self) -> Optional[APIModule]: + if self.api.has_service("worker"): + return self.api.services.worker + return None + @property def requests(self) -> Optional[APIModule]: if self.api.has_service("request"): diff --git a/packages/syft/src/syft/exceptions/__init__.py b/packages/syft/src/syft/exceptions/__init__.py new file mode 100644 index 00000000000..e69de29bb2d diff --git a/packages/syft/src/syft/exceptions/exception.py b/packages/syft/src/syft/exceptions/exception.py new file mode 100644 index 00000000000..6bab71a747a --- /dev/null +++ b/packages/syft/src/syft/exceptions/exception.py @@ -0,0 +1,27 @@ +# stdlib +from typing import List +from typing import Optional + +# relative +from ..service.context import NodeServiceContext +from ..service.response import SyftError +from ..service.user.user_roles import ServiceRole + + +class PySyftException(Exception): + """Base class for all PySyft exceptions.""" + + def __init__(self, message: str, roles: Optional[List[ServiceRole]] = None): + super().__init__(message) + self.message = message + self.roles = roles if roles else [ServiceRole.ADMIN] + + def raise_with_context(self, context: NodeServiceContext): + self.context = context + return self + + def handle(self) -> SyftError: + # if self.context and self.context.role in self.roles: + return SyftError(message=self.message) + # else: + # return SyftError(message="Access denied to exception message.") diff --git a/packages/syft/src/syft/exceptions/user.py b/packages/syft/src/syft/exceptions/user.py new file mode 100644 index 00000000000..59147e29522 --- /dev/null +++ b/packages/syft/src/syft/exceptions/user.py @@ -0,0 +1,9 @@ +# stdlib + +# relative +from ..service.user.user_roles import ServiceRole +from .exception import PySyftException + +UserAlreadyExistsException = PySyftException( + message="User already exists", roles=[ServiceRole.ADMIN] +) diff --git a/packages/syft/src/syft/external/oblv/oblv_service.py b/packages/syft/src/syft/external/oblv/oblv_service.py index 38d380be88a..beb4d4cad92 100644 --- a/packages/syft/src/syft/external/oblv/oblv_service.py +++ b/packages/syft/src/syft/external/oblv/oblv_service.py @@ -376,9 +376,9 @@ def send_user_code_inputs_to_enclave( message=f"Unable to find {user_code_id} in {type(user_code_service)}" ) user_code = user_code.ok() - + reason: str = context.extra_kwargs.get("reason", "") res = user_code.status.mutate( - value=UserCodeStatus.APPROVED, + value=(UserCodeStatus.APPROVED, reason), node_name=node_name, verify_key=context.credentials, ) diff --git a/packages/syft/src/syft/node/node.py b/packages/syft/src/syft/node/node.py index a22e3dabd28..376a576215d 100644 --- a/packages/syft/src/syft/node/node.py +++ b/packages/syft/src/syft/node/node.py @@ -38,6 +38,7 @@ from ..client.api import SyftAPICall from ..client.api import SyftAPIData from ..client.api import debox_signed_syftapicall_response +from ..exceptions.exception import PySyftException from ..external import OBLV from ..serde.deserialize import _deserialize from ..serde.serialize import _serialize @@ -86,6 +87,7 @@ from ..service.user.user_roles import ServiceRole from ..service.user.user_service import UserService from ..service.user.user_stash import UserStash +from ..service.worker.worker_service import WorkerService from ..store.blob_storage import BlobStorageConfig from ..store.blob_storage.on_disk import OnDiskBlobStorageClientConfig from ..store.blob_storage.on_disk import OnDiskBlobStorageConfig @@ -254,9 +256,11 @@ def __init__( queue_config: Optional[QueueConfig] = None, node_side_type: Union[str, NodeSideType] = NodeSideType.HIGH_SIDE, enable_warnings: bool = False, + dev_mode: bool = False, ): # 🟡 TODO 22: change our ENV variable format and default init args to make this # less horrible or add some convenience functions + self.dev_mode = dev_mode if node_uid_env is not None: self.id = UID.from_string(node_uid_env) else: @@ -282,6 +286,7 @@ def __init__( services = ( [ UserService, + WorkerService, SettingsService, ActionService, LogService, @@ -350,6 +355,37 @@ def __init__( NodeRegistry.set_node_for(self.id, self) + @property + def host_syft_location(self): + """e.g. /Users//workspace/pysyft""" + if not self.dev_mode: + raise ValueError("You can only get host location in dev mode") + # We set this variable in docker compose (from pwd) + env_val = os.environ.get("HOST_GRID_PATH", None) + # stdlib + from pathlib import Path + + # if in docker + if env_val is not None: + return str(Path(env_val).parent.parent) + # if in python during development + else: + # syft absolute + import syft as sy + + # /Users//workspace/PySyft/packages/syft/src/syft/__init__.py -> + # /Users//workspace/PySyft + return Path(sy.__file__).parent.parent.parent.parent.parent + + @property + def runs_in_docker(self): + path = "/proc/self/cgroup" + return ( + os.path.exists("/.dockerenv") + or os.path.isfile(path) + and any("docker" in line for line in open(path)) + ) + def init_blob_storage(self, config: Optional[BlobStorageConfig] = None) -> None: if config is None: root_directory = get_root_data_path() @@ -408,6 +444,7 @@ def named( n_consumers: int = 0, create_producer: bool = False, queue_port: Optional[int] = None, + dev_mode: bool = False, ) -> Self: name_hash = hashlib.sha256(name.encode("utf8")).digest() name_hash_uuid = name_hash[0:16] @@ -479,6 +516,7 @@ def named( enable_warnings=enable_warnings, blob_storage_config=blob_storage_config, queue_config=queue_config, + dev_mode=dev_mode, ) def is_root(self, credentials: SyftVerifyKey) -> bool: @@ -626,6 +664,7 @@ def _construct_services(self): kwargs["store"] = self.action_store store_services = [ UserService, + WorkerService, SettingsService, DatasetService, UserCodeService, @@ -893,6 +932,8 @@ def handle_api_call_with_unsigned_result( method = self.get_service_method(_private_api_path) try: result = method(context, *api_call.args, **api_call.kwargs) + except PySyftException as e: + return e.handle() except Exception: result = SyftError( message=f"Exception calling {api_call.path}. {traceback.format_exc()}" diff --git a/packages/syft/src/syft/serde/recursive_primitives.py b/packages/syft/src/syft/serde/recursive_primitives.py index e04f95e753d..efcf6ca210b 100644 --- a/packages/syft/src/syft/serde/recursive_primitives.py +++ b/packages/syft/src/syft/serde/recursive_primitives.py @@ -1,6 +1,7 @@ # stdlib from collections import OrderedDict from collections import defaultdict +from collections.abc import Mapping from enum import Enum from enum import EnumMeta import functools @@ -12,7 +13,6 @@ from typing import Collection from typing import Dict from typing import List -from typing import Mapping from typing import Optional from typing import Type from typing import TypeVar @@ -31,6 +31,7 @@ # import types unsupported on python 3.8 if sys.version_info >= (3, 9): # stdlib + from typing import GenericAlias from typing import _SpecialGenericAlias from typing import _UnionGenericAlias @@ -396,6 +397,7 @@ def recursive_serde_register_type( ], ) recursive_serde_register_type(_SpecialGenericAlias) + recursive_serde_register_type(GenericAlias) recursive_serde_register_type(Any) recursive_serde_register_type(EnumMeta) diff --git a/packages/syft/src/syft/serde/third_party.py b/packages/syft/src/syft/serde/third_party.py index ee068f09332..edc08dee1b0 100644 --- a/packages/syft/src/syft/serde/third_party.py +++ b/packages/syft/src/syft/serde/third_party.py @@ -2,6 +2,7 @@ from datetime import date from datetime import datetime from datetime import time +import functools from io import BytesIO # third party @@ -26,9 +27,12 @@ import zmq.green as zmq # relative +from ..types.tupledict import TupleDict from .deserialize import _deserialize as deserialize +from .recursive_primitives import deserialize_kv from .recursive_primitives import recursive_serde_register from .recursive_primitives import recursive_serde_register_type +from .recursive_primitives import serialize_kv from .serialize import _serialize as serialize recursive_serde_register( @@ -124,6 +128,12 @@ def deserialize_series(blob: bytes) -> Series: deserialize=lambda x: Timestamp(deserialize(x, from_bytes=True)), ) +recursive_serde_register( + TupleDict, + serialize=serialize_kv, + deserialize=functools.partial(deserialize_kv, TupleDict), +) + def serialize_bytes_io(io: BytesIO) -> bytes: io.seek(0) diff --git a/packages/syft/src/syft/service/action/action_service.py b/packages/syft/src/syft/service/action/action_service.py index 7c217d90927..cee5a838fab 100644 --- a/packages/syft/src/syft/service/action/action_service.py +++ b/packages/syft/src/syft/service/action/action_service.py @@ -29,7 +29,6 @@ from ..service import UserLibConfigRegistry from ..service import service_method from ..user.user_roles import GUEST_ROLE_LEVEL -from ..warnings import HighSideCRUDWarning from .action_object import Action from .action_object import ActionObject from .action_object import ActionObjectPointer @@ -73,7 +72,6 @@ def np_array(self, context: AuthedServiceContext, data: Any) -> Any: path="action.set", name="set", roles=GUEST_ROLE_LEVEL, - warning=HighSideCRUDWarning(confirmation=True), ) def set( self, diff --git a/packages/syft/src/syft/service/code/user_code.py b/packages/syft/src/syft/service/code/user_code.py index 8afed43d1be..b535dd7c1a3 100644 --- a/packages/syft/src/syft/service/code/user_code.py +++ b/packages/syft/src/syft/service/code/user_code.py @@ -16,6 +16,7 @@ from typing import Dict from typing import List from typing import Optional +from typing import Tuple from typing import Type from typing import Union @@ -117,7 +118,7 @@ def __hash__(self) -> int: # as status is in attr_searchable @serializable(attrs=["status_dict"]) class UserCodeStatusCollection(SyftHashableObject): - status_dict: Dict[NodeIdentity, UserCodeStatus] = {} + status_dict: Dict[NodeIdentity, Tuple[UserCodeStatus, str]] = {} def __init__(self, status_dict: Dict): self.status_dict = status_dict @@ -134,14 +135,15 @@ def _repr_html_(self):

User Code Status

""" - for node_identity, status in self.status_dict.items(): + for node_identity, (status, reason) in self.status_dict.items(): node_name_str = f"{node_identity.node_name}" uid_str = f"{node_identity.node_id}" status_str = f"{status.value}" string += f""" • UID: {uid_str}  Node name: {node_name_str}  - Status: {status_str} + Status: {status_str}; + Reason: {reason}
""" string += "

" @@ -149,18 +151,24 @@ def _repr_html_(self): def __repr_syft_nested__(self): string = "" - for node_identity, status in self.status_dict.items(): - string += f"{node_identity.node_name}: {status}
" + for node_identity, (status, reason) in self.status_dict.items(): + string += f"{node_identity.node_name}: {status}, {reason}
" return string def get_status_message(self): if self.approved: return SyftSuccess(message=f"{type(self)} approved") + denial_string = "" string = "" - for node_identity, status in self.status_dict.items(): - string += f"Code status on node '{node_identity.node_name}' is '{status}'. " + for node_identity, (status, reason) in self.status_dict.items(): + denial_string += f"Code status on node '{node_identity.node_name}' is '{status}'. Reason: {reason}" + if not reason.endswith("."): + denial_string += "." + string += f"Code status on node '{node_identity.node_name}' is '{status}'." if self.denied: - return SyftError(message=f"{type(self)} Your code cannot be run: {string}") + return SyftError( + message=f"{type(self)} Your code cannot be run: {denial_string}" + ) else: return SyftNotReady( message=f"{type(self)} Your code is waiting for approval. {string}" @@ -168,15 +176,18 @@ def get_status_message(self): @property def approved(self) -> bool: - return all(x == UserCodeStatus.APPROVED for x in self.status_dict.values()) + return all(x == UserCodeStatus.APPROVED for x, _ in self.status_dict.values()) @property def denied(self) -> bool: - return UserCodeStatus.DENIED in self.status_dict.values() + for status, _ in self.status_dict.values(): + if status == UserCodeStatus.DENIED: + return True + return False def for_user_context(self, context: AuthedServiceContext) -> UserCodeStatus: if context.node.node_type == NodeType.ENCLAVE: - keys = set(self.status_dict.values()) + keys = {status for status, _ in self.status_dict.values()} if len(keys) == 1 and UserCodeStatus.APPROVED in keys: return UserCodeStatus.APPROVED elif UserCodeStatus.PENDING in keys and UserCodeStatus.DENIED not in keys: @@ -193,7 +204,7 @@ def for_user_context(self, context: AuthedServiceContext) -> UserCodeStatus: verify_key=context.node.signing_key.verify_key, ) if node_identity in self.status_dict: - return self.status_dict[node_identity] + return self.status_dict[node_identity][0] else: raise Exception( f"Code Object does not contain {context.node.name} Domain's data" @@ -204,7 +215,11 @@ def for_user_context(self, context: AuthedServiceContext) -> UserCodeStatus: ) def mutate( - self, value: UserCodeStatus, node_name: str, node_id, verify_key: SyftVerifyKey + self, + value: Tuple[UserCodeStatus, str], + node_name: str, + node_id, + verify_key: SyftVerifyKey, ) -> Union[SyftError, Self]: node_identity = NodeIdentity( node_name=node_name, node_id=node_id, verify_key=verify_key @@ -260,7 +275,7 @@ def __setattr__(self, key: str, value: Any) -> None: return super().__setattr__(key, value) def _coll_repr_(self) -> Dict[str, Any]: - status = list(self.status.status_dict.values())[0].value + status = [status for status, _ in self.status.status_dict.values()][0].value if status == UserCodeStatus.PENDING.value: badge_color = "badge-purple" elif status == UserCodeStatus.APPROVED.value: @@ -305,7 +320,7 @@ def output_readers(self) -> List[SyftVerifyKey]: @property def code_status(self) -> list: status_list = [] - for node_view, status in self.status.status_dict.items(): + for node_view, (status, _) in self.status.status_dict.items(): status_list.append( f"Node: {node_view.node_name}, Status: {status.value}", ) @@ -813,7 +828,7 @@ def add_custom_status(context: TransformContext) -> TransformContext: verify_key=context.node.signing_key.verify_key, ) context.output["status"] = UserCodeStatusCollection( - status_dict={node_identity: UserCodeStatus.PENDING} + status_dict={node_identity: (UserCodeStatus.PENDING, "")} ) # if node_identity in input_keys or len(input_keys) == 0: # context.output["status"] = UserCodeStatusContext( @@ -822,7 +837,7 @@ def add_custom_status(context: TransformContext) -> TransformContext: # else: # raise ValueError(f"Invalid input keys: {input_keys} for {node_identity}") elif context.node.node_type == NodeType.ENCLAVE: - status_dict = {key: UserCodeStatus.PENDING for key in input_keys} + status_dict = {key: (UserCodeStatus.PENDING, "") for key in input_keys} context.output["status"] = UserCodeStatusCollection(status_dict=status_dict) else: raise NotImplementedError( diff --git a/packages/syft/src/syft/service/context.py b/packages/syft/src/syft/service/context.py index d132bdac984..0f0a4175b1d 100644 --- a/packages/syft/src/syft/service/context.py +++ b/packages/syft/src/syft/service/context.py @@ -71,9 +71,12 @@ class ChangeContext(SyftBaseObject): node: Optional[AbstractNode] = None approving_user_credentials: Optional[SyftVerifyKey] requesting_user_credentials: Optional[SyftVerifyKey] + extra_kwargs: Dict = {} @staticmethod def from_service(context: AuthedServiceContext) -> Self: return ChangeContext( - node=context.node, approving_user_credentials=context.credentials + node=context.node, + approving_user_credentials=context.credentials, + extra_kwargs=context.extra_kwargs, ) diff --git a/packages/syft/src/syft/service/dataset/dataset.py b/packages/syft/src/syft/service/dataset/dataset.py index e9da25cbb45..42f1d6734d7 100644 --- a/packages/syft/src/syft/service/dataset/dataset.py +++ b/packages/syft/src/syft/service/dataset/dataset.py @@ -1,5 +1,4 @@ # stdlib -from collections import OrderedDict from datetime import datetime from enum import Enum from typing import Any @@ -7,6 +6,7 @@ from typing import Dict from typing import List from typing import Optional +from typing import Set from typing import Tuple from typing import Union @@ -32,6 +32,7 @@ from ...types.transforms import generate_id from ...types.transforms import transform from ...types.transforms import validate_url +from ...types.tupledict import TupleDict from ...types.uid import UID from ...util import options from ...util.colors import ON_SURFACE_HIGHEST @@ -52,14 +53,6 @@ DATA_SIZE_WARNING_LIMIT = 512 -@serializable() -class TupleDict(OrderedDict): - def __getitem__(self, key: Union[str, int]) -> Any: - if isinstance(key, int): - return list(self.values())[key] - return super().__getitem__(key) - - NamePartitionKey = PartitionKey(key="name", type_=str) @@ -89,6 +82,16 @@ def _repr_html_(self) -> Any: """ + def __eq__(self, value: object) -> bool: + if not isinstance(value, Contributor): + return False + + # We assoctiate two contributors as equal if they have the same email + return self.email == value.email + + def __hash__(self) -> int: + return hash(self.email) + @serializable() class MarkdownDescription(SyftObject): @@ -125,12 +128,12 @@ class Asset(SyftObject): node_uid: UID name: str description: Optional[MarkdownDescription] = None - contributors: List[Contributor] = [] + contributors: Set[Contributor] = set() data_subjects: List[DataSubject] = [] mock_is_real: bool = False shape: Optional[Tuple] created_at: DateTime = DateTime.now() - uploader: Contributor + uploader: Optional[Contributor] __repr_attrs__ = ["name", "shape"] @@ -154,11 +157,12 @@ def _repr_html_(self) -> Any: # relative from ...service.action.action_object import ActionObject - uploaded_by_line = "n/a" - if len(self.contributors) > 0: - uploaded_by_line = ( - f"

Uploaded by: {self.uploader.name}

" - ) + uploaded_by_line = ( + f"

Uploaded by: {self.uploader.name} ({self.uploader.email})

" + if self.uploader + else "" + ) + if isinstance(self.data, ActionObject): data_table_line = itables.to_html_datatable( df=self.data.syft_action_data, css=itables_css @@ -167,6 +171,18 @@ def _repr_html_(self) -> Any: data_table_line = itables.to_html_datatable(df=self.data, css=itables_css) else: data_table_line = self.data + + if isinstance(self.mock, ActionObject): + mock_table_line = itables.to_html_datatable( + df=self.mock.syft_action_data, css=itables_css + ) + elif isinstance(self.data, pd.DataFrame): + mock_table_line = itables.to_html_datatable(df=self.mock, css=itables_css) + else: + mock_table_line = self.mock + if isinstance(mock_table_line, SyftError): + mock_table_line = mock_table_line.message + return f"""