Basic microservice setup for tbe project
pip install tbe-mcs-app==0.1.7
Tbe ecosystem contains of a lot of microservices, which requires unification, reusability.
This package represents a common setup for any tbe microservice
App configuration assumes to be setup via data class with validation
Current setup is:
@attr.s
class AppConfig:
"""Configuration of the aiohttp application."""
REDIS_CACHE = attr.ib(
default=env.str("REDIS_CACHE", default=""),
validator=attr.validators.instance_of(str),
)
SENTRY_DSN = attr.ib(
default=env.str("SENTRY_DSN", default=""),
validator=attr.validators.instance_of(str),
)
DEBUG = attr.ib(
default=env.bool("DEBUG", default=False),
validator=attr.validators.instance_of(bool),
)
DEBUG_TOOLBAR = attr.ib(
default=env.bool(
"DEBUG_TOOLBAR", default=False
),
validator=attr.validators.instance_of(bool),
)
HOST = attr.ib(
default=env.str("HOST", default="0.0.0.0"),
validator=attr.validators.instance_of(str),
)
PORT = attr.ib(
default=env.int("PORT", default=80),
validator=attr.validators.instance_of(int),
)
import pathlib
import os
import trafaret as t
import yaml
from aiohttp import web
from tbe_mcs_app import build_tbe_mcs_app
from tbe_mcs_app.structs import (
WebRoute,
Http,
AppConfig,
)
async def health_check(request):
return web.Response()
async def get_some_data(request):
payload = await request.json()
return web.json_response(data=payload)
async def test_tbe_mcs_app_(
tmpdir, aiohttp_client, caplog
):
app_config = AppConfig(DEBUG=True)
web_routes = [
WebRoute(
endpoint="/health_check",
https=[
Http(
method="GET", handler=health_check
)
],
),
WebRoute(
endpoint="/get_some_data",
https=[
Http(
method="POST",
handler=get_some_data,
)
],
),
]
app = build_tbe_mcs_app(
web_routes, app_config=app_config
)
client = await aiohttp_client(app)
resp = await client.get("/health_check")
assert resp.status == 200
resp = await client.get("/api/doc")
assert resp.status == 200
resp = await client.get("/_debugtoolbar")
assert resp.status == 200
resp = await client.post(
"/get_some_data",
json={"test_key": "test_value"},
)
assert await resp.json() == {
"test_key": "test_value"
}
resp = await client.get("/not_exists")
assert await resp.json() == {
"error": "HTTPNotFound: ('Not Found',)"
}
resp = await client.get("/get_some_data")
assert await resp.json() == {
"error": "HTTPMethodNotAllowed: ('Method Not Allowed',)"
}