Minimal FastAPI and secrets service implementation
This commit is contained in:
parent
3b1f789a42
commit
c7eafd9472
1
.gitignore
vendored
1
.gitignore
vendored
|
|
@ -160,3 +160,4 @@ cython_debug/
|
|||
# option (not recommended) you can uncomment the following to ignore the entire idea folder.
|
||||
#.idea/
|
||||
|
||||
secrets
|
||||
0
amarillo/app/services/__init__.py
Normal file
0
amarillo/app/services/__init__.py
Normal file
14
amarillo/app/services/secrets.py
Normal file
14
amarillo/app/services/secrets.py
Normal file
|
|
@ -0,0 +1,14 @@
|
|||
from typing import Dict
|
||||
from pydantic import Field
|
||||
from pydantic_settings import BaseSettings
|
||||
|
||||
# Example: secrets = { "mfdz": "some secret" }
|
||||
class Secrets(BaseSettings):
|
||||
ride2go_token: str = Field(None, env = 'RIDE2GO_TOKEN')
|
||||
metrics_user: str = Field(None, env = 'METRICS_USER')
|
||||
metrics_password: str = Field(None, env = 'METRICS_PASSWORD')
|
||||
|
||||
|
||||
# Read if file exists, otherwise no error (it's in .gitignore)
|
||||
secrets = Secrets(_env_file='secrets', _env_file_encoding='utf-8')
|
||||
|
||||
107
amarillo/main.py
Normal file
107
amarillo/main.py
Normal file
|
|
@ -0,0 +1,107 @@
|
|||
import logging.config
|
||||
|
||||
# from app.configuration import configure_enhancer_services, configure_services, configure_admin_token
|
||||
|
||||
logging.config.fileConfig('logging.conf', disable_existing_loggers=False)
|
||||
logger = logging.getLogger("main")
|
||||
|
||||
import uvicorn
|
||||
import mimetypes
|
||||
from starlette.staticfiles import StaticFiles
|
||||
|
||||
|
||||
# from app.routers import carpool, agency, agencyconf, metrics, region
|
||||
from fastapi import FastAPI
|
||||
|
||||
# https://pydantic-docs.helpmanual.io/usage/settings/
|
||||
# from app.views import home
|
||||
|
||||
# from prometheus_fastapi_instrumentator import Instrumentator
|
||||
# from prometheus_fastapi_instrumentator import metrics as pfi_metrics
|
||||
|
||||
logger.info("Hello Amarillo!")
|
||||
|
||||
app = FastAPI(title="Amarillo - The Carpooling Intermediary",
|
||||
description="This service allows carpool agencies to publish "
|
||||
"their trip offers, so routing services may suggest "
|
||||
"them as trip options. For carpool offers, only the "
|
||||
"minimum required information (origin/destination, "
|
||||
"optionally intermediate stops, departure time and a "
|
||||
"deep link for booking/contacting the driver) needs to "
|
||||
"be published, booking/contact exchange is to be "
|
||||
"handled by the publishing agency.",
|
||||
version="0.0.1",
|
||||
# TODO 404
|
||||
terms_of_service="http://mfdz.de/carpool-hub-terms/",
|
||||
contact={
|
||||
# "name": "unused",
|
||||
# "url": "http://unused",
|
||||
"email": "info@mfdz.de",
|
||||
},
|
||||
license_info={
|
||||
"name": "AGPL-3.0 License",
|
||||
"url": "https://www.gnu.org/licenses/agpl-3.0.de.html",
|
||||
},
|
||||
openapi_tags=[
|
||||
{
|
||||
"name": "carpool",
|
||||
# "description": "Find out more about Amarillo - the carpooling intermediary",
|
||||
"externalDocs": {
|
||||
"description": "Find out more about Amarillo - the carpooling intermediary",
|
||||
"url": "https://github.com/mfdz/amarillo",
|
||||
},
|
||||
}],
|
||||
servers=[
|
||||
{
|
||||
"description": "DABB bbnavi Amarillo service",
|
||||
"url": "https://amarillo.bbnavi.de"
|
||||
},
|
||||
{
|
||||
"description": "Demo server by MFDZ",
|
||||
"url": "https://amarillo.mfdz.de"
|
||||
},
|
||||
{
|
||||
"description": "Dev server for development",
|
||||
"url": "https://amarillo-dev.mfdz.de"
|
||||
},
|
||||
{
|
||||
"description": "Localhost for development",
|
||||
"url": "http://localhost:8000"
|
||||
}
|
||||
],
|
||||
redoc_url=None
|
||||
)
|
||||
|
||||
# app.include_router(carpool.router)
|
||||
# app.include_router(agency.router)
|
||||
# app.include_router(agencyconf.router)
|
||||
# app.include_router(region.router)
|
||||
# app.include_router(metrics.router)
|
||||
|
||||
|
||||
# instrumentator = Instrumentator().instrument(app)
|
||||
# instrumentator.add(pfi_metrics.default())
|
||||
# instrumentator.add(metrics.amarillo_trips_number_total())
|
||||
|
||||
|
||||
# instrumentator.instrument(app)
|
||||
|
||||
# def configure():
|
||||
# configure_admin_token()
|
||||
# configure_services()
|
||||
# configure_routing()
|
||||
|
||||
|
||||
# def configure_routing():
|
||||
# mimetypes.add_type('application/x-protobuf', '.pbf')
|
||||
# app.mount('/static', StaticFiles(directory='static'), name='static')
|
||||
# app.mount('/gtfs', StaticFiles(directory='data/gtfs'), name='gtfs')
|
||||
# app.include_router(home.router)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
# configure()
|
||||
uvicorn.run(app, host="0.0.0.0", port=8000)
|
||||
else:
|
||||
# configure()
|
||||
pass
|
||||
121
amarillo/plugin_discovery.ipynb
Normal file
121
amarillo/plugin_discovery.ipynb
Normal file
|
|
@ -0,0 +1,121 @@
|
|||
{
|
||||
"cells": [
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"## Test notebook for discovering and importing plugins"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 1,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"data": {
|
||||
"text/plain": [
|
||||
"{'amarillo.plugins.metrics': <module 'amarillo.plugins.metrics' from '/home/user/amarillo/amarillo-plugins/amarillo-metrics/amarillo/plugins/metrics/__init__.py'>}"
|
||||
]
|
||||
},
|
||||
"execution_count": 1,
|
||||
"metadata": {},
|
||||
"output_type": "execute_result"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"import importlib\n",
|
||||
"import pkgutil\n",
|
||||
"\n",
|
||||
"import amarillo.plugins # FIXME this namespace does not exist if there are 0 plugins installed\n",
|
||||
"\n",
|
||||
"def iter_namespace(ns_pkg):\n",
|
||||
" # Source: https://packaging.python.org/guides/creating-and-discovering-plugins/\n",
|
||||
" return pkgutil.iter_modules(ns_pkg.__path__, ns_pkg.__name__ + \".\")\n",
|
||||
"\n",
|
||||
"discovered_plugins = {\n",
|
||||
" name: importlib.import_module(name)\n",
|
||||
" for finder, name, ispkg\n",
|
||||
" in iter_namespace(amarillo.plugins)\n",
|
||||
"}\n",
|
||||
"\n",
|
||||
"discovered_plugins"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 2,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"data": {
|
||||
"text/plain": [
|
||||
"['__name__',\n",
|
||||
" '__doc__',\n",
|
||||
" '__package__',\n",
|
||||
" '__loader__',\n",
|
||||
" '__spec__',\n",
|
||||
" '__path__',\n",
|
||||
" '__file__',\n",
|
||||
" '__cached__',\n",
|
||||
" '__builtins__',\n",
|
||||
" 'metrics',\n",
|
||||
" 'json',\n",
|
||||
" 'logging',\n",
|
||||
" 'os',\n",
|
||||
" 'random',\n",
|
||||
" 'Callable',\n",
|
||||
" 'APIRouter',\n",
|
||||
" 'HTTPException',\n",
|
||||
" 'Depends',\n",
|
||||
" 'Request',\n",
|
||||
" 'datetime',\n",
|
||||
" 'generate_latest',\n",
|
||||
" 'Gauge',\n",
|
||||
" 'Counter',\n",
|
||||
" 'Info',\n",
|
||||
" 'FastAPI',\n",
|
||||
" 'HTTPBasic',\n",
|
||||
" 'HTTPBasicCredentials',\n",
|
||||
" 'PlainTextResponse',\n",
|
||||
" 'secrets',\n",
|
||||
" 'logger',\n",
|
||||
" 'security',\n",
|
||||
" 'amarillo_trips_number_total',\n",
|
||||
" 'router']"
|
||||
]
|
||||
},
|
||||
"execution_count": 2,
|
||||
"metadata": {},
|
||||
"output_type": "execute_result"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"metrics = discovered_plugins['amarillo.plugins.metrics']\n",
|
||||
"\n",
|
||||
"metrics.__dir__()"
|
||||
]
|
||||
}
|
||||
],
|
||||
"metadata": {
|
||||
"kernelspec": {
|
||||
"display_name": ".venv",
|
||||
"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.2"
|
||||
}
|
||||
},
|
||||
"nbformat": 4,
|
||||
"nbformat_minor": 2
|
||||
}
|
||||
21
pyproject.toml
Normal file
21
pyproject.toml
Normal file
|
|
@ -0,0 +1,21 @@
|
|||
[project]
|
||||
name = "amarillo-core"
|
||||
version = "0.0.1"
|
||||
dependencies = [
|
||||
"fastapi[all]==0.104.0",
|
||||
"geopandas==0.14",
|
||||
"uvicorn[standard]==0.23.2",
|
||||
"pydantic[dotenv]==2.4.2",
|
||||
"protobuf==3.20.3",
|
||||
"rtree==1.1.0",
|
||||
"schedule==1.2.1",
|
||||
"setproctitle==1.3.3",
|
||||
"starlette",
|
||||
"pandas==2.1.1",
|
||||
"requests==2.31.0",
|
||||
"Shapely==2.0.2",
|
||||
"pygeos==0.14",
|
||||
"pyproj==3.6.1",
|
||||
"geojson-pydantic==1.0.1",
|
||||
"watchdog==3.0.0"
|
||||
]
|
||||
16
requirements.txt
Normal file
16
requirements.txt
Normal file
|
|
@ -0,0 +1,16 @@
|
|||
fastapi[all]==0.104.0
|
||||
geopandas==0.14
|
||||
uvicorn[standard]==0.23.2
|
||||
pydantic[dotenv]==2.4.2
|
||||
protobuf==3.20.3
|
||||
rtree==1.1.0
|
||||
schedule==1.2.1
|
||||
setproctitle==1.3.3
|
||||
starlette
|
||||
pandas==2.1.1
|
||||
requests==2.31.0
|
||||
Shapely==2.0.2
|
||||
pygeos==0.14
|
||||
pyproj==3.6.1
|
||||
geojson-pydantic==1.0.1
|
||||
watchdog==3.0.0
|
||||
Loading…
Reference in a new issue