From 88017e928107d87ed8d256a696e42bda07a8938f Mon Sep 17 00:00:00 2001 From: michael Date: Tue, 18 Apr 2023 00:16:28 +0200 Subject: [PATCH] spil server side: updates and doc --- README.md | 7 +++ docker-compose.yml | 7 ++- docs/client_server.md | 61 +++++++++++++++++++++ docs/img/rest-small.png | Bin 0 -> 14713 bytes docs/img/rest.png | Bin 0 -> 122679 bytes docs/index.rst | 1 + docs/installation.md | 6 ++ docs/overview.md | 7 +++ spil_hamlet_conf/spil_rest_conf.py | 35 ++++++++++++ spil_server/client_server.md | 43 --------------- spil_server/docker/Dockerfile | 2 +- spil_server/fastapi/app/main.py | 85 +++++++++++++++++++++-------- 12 files changed, 184 insertions(+), 70 deletions(-) create mode 100644 docs/client_server.md create mode 100644 docs/img/rest-small.png create mode 100644 docs/img/rest.png create mode 100644 spil_hamlet_conf/spil_rest_conf.py delete mode 100644 spil_server/client_server.md diff --git a/README.md b/README.md index 40aee98..ea60123 100644 --- a/README.md +++ b/README.md @@ -275,6 +275,13 @@ It is possible to run actions on the currently selected Sid. **spil_ui** is a separate repository (in the process of being released). +## REST API + +Spil can run server side. + +![](docs/img/rest-small.png) + +*(REST API and docker under development)* ## Flexible and configurable diff --git a/docker-compose.yml b/docker-compose.yml index ae2deca..901d8cd 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -9,13 +9,14 @@ services: ports: - "80:80" + # you can replace "./spil_hamlet_conf" by an actual config volumes: - ./spil_hamlet_conf:/spil_conf - # for development: edit the config will reload the app + # for development: this is needed to make hot reload work (see below) environment: - WATCHFILES_FORCE_POLLING=true - # development options for config hot reload. + # for development: runs with hot reload, reloads server when the config folder changes command: ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "80", "--reload", "--reload-dir", "/spil_conf"] - # https://www.uvicorn.org/settings/ \ No newline at end of file + # See https://www.uvicorn.org/settings/ \ No newline at end of file diff --git a/docs/client_server.md b/docs/client_server.md new file mode 100644 index 0000000..9e7a269 --- /dev/null +++ b/docs/client_server.md @@ -0,0 +1,61 @@ +# Spil network deployment + +Client / Server deployment of Spil is still experimental, and work in progress. + +## Server side Spil + +A fastapi powered Spil REST API is currently under development. + +It allows access to the Crud interface via a rest api. +- /find/{config}/{sid} +- /get/{config}/{sid} +- /write/{config}/{sid} + +![](img/rest.png) + +### Running the API + +- Either from the cloned repo: + (includes creation of test data) +```shell +git clone https://github.com/MichaelHaussmann/spil.git +cd spil +python -c "import spil;import hamlet_scripts.save_examples_to_mock_fs as mfs;mfs.run()" +cd spil_server/fastapi/app +uvicorn main:app --reload +``` + +The API will run on [http://127.0.0.1:8000/find](http://127.0.0.1:8000/find) and [http://127.0.0.1:8000/get](http://127.0.0.1:8000/get) +Example: [http://127.0.0.1:8000/find/all/hamlet/a/**/maya?asset=*&task=rig&version=v001](http://127.0.0.1:8000/find/all/hamlet/a/**/maya?asset=*&task=rig&version=v001) + + +- Using Docker compose +```shell +git clone https://github.com/MichaelHaussmann/spil.git +cd spil +docker compose up -d +``` +This will build `spil/spil_server/docker/Dockerfile` +And run as defined in `spil/docker-compose.yml` + +The API will run on [http://127.0.0.1/find](http://127.0.0.1/find) and [http://127.0.0.1/get](http://127.0.0.1/get) +Example: [http://127.0.0.1/find/all/hamlet/a/**/maya?asset=*&task=rig&version=v001](http://127.0.0.1/find/all/hamlet/a/**/maya?asset=*&task=rig&version=v001) + + +### Production config + +Check out comments in the Dockerfile `spil/spil_server/docker/Dockerfile` +and the docker-compose `spil/docker-compose.yml` +It is possible to map a production configuration onto the docker config folder. + + +## Client Side Spil + +A FindInSpilRest Finder is also in development. + +It is able to consume the Spil rest API. +This Finder can replace any other finder, and be used without any change in the code. + +**This is not currently implemented** + + diff --git a/docs/img/rest-small.png b/docs/img/rest-small.png new file mode 100644 index 0000000000000000000000000000000000000000..61bc014e8eb92e6041d21253c92ad6e4a387465a GIT binary patch literal 14713 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 UcYqH0TO{DCn4D;(@OS_J0rE~r=>Px# literal 0 HcmV?d00001 diff --git a/docs/img/rest.png b/docs/img/rest.png new file mode 100644 index 0000000000000000000000000000000000000000..2681f4a14b250eb11f77da228568a131b20b21d9 GIT binary patch literal 122679 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 A<^TWy literal 0 HcmV?d00001 diff --git a/docs/index.rst b/docs/index.rst index ed9bdbc..bc33544 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -18,6 +18,7 @@ installation configuration configuration_advanced + client_server .. toctree:: :caption: User Guides diff --git a/docs/installation.md b/docs/installation.md index e8e6a0d..7860095 100644 --- a/docs/installation.md +++ b/docs/installation.md @@ -76,3 +76,9 @@ Found: hamlet/a/char/gertrude You are all set, and can experiment with Spil. +## Server Side Install + +Work in progress Docker and REST API. +See [Spil network deployment](client_server.md) + + diff --git a/docs/overview.md b/docs/overview.md index c778dee..9193cdd 100644 --- a/docs/overview.md +++ b/docs/overview.md @@ -273,6 +273,13 @@ It is possible to run actions on the currently selected Sid. **spil_ui** is a separate repository (in the process of being released). +## REST API + +Spil can run server side. + +![](img/rest-small.png) + +*(REST API and docker under development)* ## Flexible and configurable diff --git a/spil_hamlet_conf/spil_rest_conf.py b/spil_hamlet_conf/spil_rest_conf.py new file mode 100644 index 0000000..b2be811 --- /dev/null +++ b/spil_hamlet_conf/spil_rest_conf.py @@ -0,0 +1,35 @@ +# type: ignore +""" +Demo configuration for the rest API. + +Defines Finder and Getter instances for routes formatted as: +"/find/{config}/{search:path}" +where "config" is the name of the config. + +""" +from spil import FindInList +from spil import FindInAll, GetFromAll, FindInPaths, GetFromPaths +# from spil_plugins.sg.get_sg import GetFromSG +# from spil_plugins.sg.find_sg import FindInSG +from spil_hamlet_conf.hamlet_scripts.example_sids import sids + + +# Example: +# "/find/all/hamlet/*" +# will call FindInAll().find() +finder_config = { + # 'sg': FindInSG(), + 'all': FindInAll(), + 'paths': FindInPaths(), + 'ls': FindInList(list(sids)) +} + + +# Example: +# "/get/all/hamlet/*" +# will call GetFromAll().get() +getter_config = { + # 'sg': GetFromSG(), + 'all': GetFromAll(), + 'paths': GetFromPaths() +} diff --git a/spil_server/client_server.md b/spil_server/client_server.md deleted file mode 100644 index 314a9f1..0000000 --- a/spil_server/client_server.md +++ /dev/null @@ -1,43 +0,0 @@ -# Spil network deployment - -Client / Server deployment of Spil is still experimental, and work in progress. - -## Server side Spil - -A fastapi powered Spil REST API is currently under development. - -It allows access to the Crud interface via a rest api. -- /find/{config}/{sid} -- /get/{config}/{sid} -- /write/{config}/{sid} - -## Client Side Spil - -A FindInSpilRest Finder is also in development. - -It is able to consume the Spil rest API. -This Finder can replace any other finder, and be used without any change in the code. - - -## Client-Server - -Spil can run both on client and server -With a server instance, serving the rest API. -And a client instance, consuming the rest API, for example used by the UI. - -To make this happen clients and servers just need to use different configs. - -Finders are interchangeable and connectable. -The spil_data_conf defines which Finder is used for which data type. - -#### Connectable Finders - -Some Finders call or use other Finders. -For example: -- FindInAll - Calls do_find on other finders, depending on a config. -- FindInCache - Caches the result of other Finders -- FindInSpilRest - Calls the Spil Rest API, which in turn calls Finders. - diff --git a/spil_server/docker/Dockerfile b/spil_server/docker/Dockerfile index f0fc098..5cdca72 100644 --- a/spil_server/docker/Dockerfile +++ b/spil_server/docker/Dockerfile @@ -2,7 +2,6 @@ # Build: docker build -t spil/spil -f spil_server/docker/Dockerfile . # Run with python: docker run -ti spil/spil python -#FROM python:3.11 FROM tiangolo/uvicorn-gunicorn-fastapi:python3.7 COPY ./spil_server/docker/requirements.txt /spil/requirements.txt @@ -19,6 +18,7 @@ ENV PYTHONPATH="${PYTHONPATH}:/spil:/spil_conf" COPY ./spil_hamlet_conf /spil/spil_hamlet_conf # Init test data +# Only used for builtin demo. Can be removed for real usage. # PYTHONDONTWRITEBYTECODE avoids to have __pycache__ in the Image RUN export PYTHONDONTWRITEBYTECODE=1 && python -c "import spil;import hamlet_scripts.save_examples_to_mock_fs as mfs;mfs.run()" diff --git a/spil_server/fastapi/app/main.py b/spil_server/fastapi/app/main.py index b4b70f3..a8b1ad3 100644 --- a/spil_server/fastapi/app/main.py +++ b/spil_server/fastapi/app/main.py @@ -1,44 +1,71 @@ """ -uvicorn main:app --reload +This file is part of SPIL, The Simple Pipeline Lib. + +(C) copyright 2019-2023 Michael Haussmann, spil@xeo.info + +SPIL is free software: you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. + +SPIL is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License along with SPIL. +If not, see . """ from __future__ import annotations -from typing import Any, Optional, List - from pathlib import Path from fastapi import FastAPI from starlette.requests import Request +""" + + +* This is work in progress * +* Not production ready * + + +https://fastapi.tiangolo.com/deployment/docker/ (includes a nice intro to dockers) +https://github.com/tiangolo/uvicorn-gunicorn-fastapi-docker + +Mount volume in Windows: +https://medium.com/@kale.miller96/how-to-mount-your-current-working-directory-to-your-docker-container-in-windows-74e47fa104d7 + +uvicorn main:app --reload +""" try: import spil except ImportError: root = Path(__file__).resolve().parent.parent.parent.parent - import sys + import sys # fmt: skip sys.path.append(root.as_posix()) -from spil import Sid, Finder, Getter, FindInList -from spil import FindInAll, GetFromAll, FindInPaths, GetFromPaths -# from spil_plugins.sg.get_sg import GetFromSG -# from spil_plugins.sg.find_sg import FindInSG -from spil_hamlet_conf.hamlet_scripts.example_sids import sids +from spil import Finder, Getter + +try: + import spil_rest_conf as rest_conf # type: ignore +except ImportError: + from spil.conf import sid_conf_import_error_message # fmt: skip + problem = sid_conf_import_error_message.format(module="spil_rest_conf") + print(problem) + rest_conf = None -app = FastAPI() -finder_config = { - # 'sg': FindInSG(), - 'all': FindInAll(), - 'paths': FindInPaths(), - 'ls': FindInList(list(sids)) -} +app = FastAPI() -getter_config = { - # 'sg': GetFromSG(), - 'all': GetFromAll(), - 'paths': GetFromPaths() -} @app.get("/find/{config}/{search:path}") def find(config: str, search: str, request: Request): - finder: Finder | None = finder_config.get(config) + """ + Returns Sids for named "config" and given "search" sid. + + Args: + config: name of a config + search: search sid + request: optional request (is automatically handled) + + Returns: + the retrieved sids, as json list. + + """ + finder: Finder | None = rest_conf.finder_config.get(config) if not finder: print(f"Finder not found for {config}") return [] @@ -50,9 +77,21 @@ def find(config: str, search: str, request: Request): for sid in finder.find(search): yield {"sid": sid.uri} + @app.get("/get/{config}/{search:path}") def get(config: str, search: str, request: Request): - getter: Getter | None = getter_config.get(config) + """ + Returns Sids and data for named "config" and given "search" sid. + + Args: + config: name of a config + search: search sid + request: optional request (is automatically handled) + + Returns: + the retrieved data, as json list. + """ + getter: Getter | None = rest_conf.getter_config.get(config) if not getter: print(f"Finder not found for {config}") return []