Mercurial > code > home > repos > light-bridge
changeset 27:32cfefe3155b
try harder to crash if there's an mqtt error, so k8s does a full restart
author | drewp@bigasterisk.com |
---|---|
date | Sat, 23 Mar 2024 15:25:02 -0700 |
parents | 33b3eb24506e |
children | fb2e91f230f4 |
files | deploy.yaml light_bridge.py mqtt_io.py pdm.lock pyproject.toml skaffold.yaml |
diffstat | 6 files changed, 26 insertions(+), 17 deletions(-) [+] |
line wrap: on
line diff
--- a/deploy.yaml Sat Feb 03 20:56:27 2024 -0800 +++ b/deploy.yaml Sat Mar 23 15:25:02 2024 -0700 @@ -40,11 +40,8 @@ command: - pdm - run - - uvicorn - - '--port=8001' - - '--host=0.0.0.0' - - '--reload' - - 'light_bridge:app' + - python + - light_bridge.py --- apiVersion: v1 kind: Service
--- a/light_bridge.py Sat Feb 03 20:56:27 2024 -0800 +++ b/light_bridge.py Sat Mar 23 15:25:02 2024 -0700 @@ -4,10 +4,11 @@ import asyncio import json import logging +import os import time from functools import partial -from color import Color +import uvicorn from patchablegraph import PatchableGraph from patchablegraph.handler import GraphEvents, StaticGraph from sse_starlette.sse import EventSourceResponse @@ -17,8 +18,10 @@ from starlette.routing import Route from starlette_exporter import PrometheusMiddleware, handle_metrics +from color import Color from light import Lights from mqtt_io import MqttIo + logging.basicConfig(level=logging.INFO) log = logging.getLogger() @@ -29,6 +32,7 @@ await light.setColor(Color.fromHex(body)) return JSONResponse(light.to_dict()) + async def lightNames(lights: Lights, request: Request) -> JSONResponse: return JSONResponse({'lightNames': lights.allNames()}) @@ -48,6 +52,11 @@ return EventSourceResponse(g()) +def crash(request: Request): + log.info('crash requested') + os.abort() + + def main(): mqtt = MqttIo() lights = Lights(mqtt) @@ -59,6 +68,7 @@ Route('/api/table', partial(table, lights)), Route('/api/graph', StaticGraph(graph)), Route('/api/graph/events', GraphEvents(graph)), + Route('/api/crash', crash), ]) app.add_middleware(PrometheusMiddleware, app_name='light-bridge') @@ -67,4 +77,4 @@ return app -app = main() +uvicorn.run(main, host="0.0.0.0", port=8001, log_level=logging.INFO, factory=True)
--- a/mqtt_io.py Sat Feb 03 20:56:27 2024 -0800 +++ b/mqtt_io.py Sat Mar 23 15:25:02 2024 -0700 @@ -2,6 +2,7 @@ import inspect import json import logging +import os import time from typing import Callable, cast import weakref @@ -109,6 +110,7 @@ except aiomqtt.MqttError as e: MQTT_CONNECTED.set(0) log.error(e, exc_info=True) + os.abort() async def _connectAndRead(self): async with self.client:
--- a/pdm.lock Sat Feb 03 20:56:27 2024 -0800 +++ b/pdm.lock Sat Mar 23 15:25:02 2024 -0700 @@ -5,7 +5,7 @@ groups = ["default"] strategy = ["cross_platform", "inherit_metadata"] lock_version = "4.4.1" -content_hash = "sha256:b3fe693267977a2e72f6da23fbd5096fce62a9d204550479e044796d39d8043f" +content_hash = "sha256:4359b7e7203aa1b1ef1eef3919d7098ccbe7430e6f60ab131a27326e996fe156" [[package]] name = "aiohttp" @@ -714,7 +714,7 @@ [[package]] name = "uvicorn" -version = "0.27.0" +version = "0.29.0" requires_python = ">=3.8" summary = "The lightning-fast ASGI server." groups = ["default"] @@ -723,13 +723,13 @@ "h11>=0.8", ] files = [ - {file = "uvicorn-0.27.0-py3-none-any.whl", hash = "sha256:890b00f6c537d58695d3bb1f28e23db9d9e7a17cbcc76d7457c499935f933e24"}, - {file = "uvicorn-0.27.0.tar.gz", hash = "sha256:c855578045d45625fd027367f7653d249f7c49f9361ba15cf9624186b26b8eb6"}, + {file = "uvicorn-0.29.0-py3-none-any.whl", hash = "sha256:2c2aac7ff4f4365c206fd773a39bf4ebd1047c238f8b8268ad996829323473de"}, + {file = "uvicorn-0.29.0.tar.gz", hash = "sha256:6a69214c0b6a087462412670b3ef21224fa48cae0e452b5883e8e8bdfdd11dd0"}, ] [[package]] name = "uvicorn" -version = "0.27.0" +version = "0.29.0" extras = ["standard"] requires_python = ">=3.8" summary = "The lightning-fast ASGI server." @@ -739,14 +739,14 @@ "httptools>=0.5.0", "python-dotenv>=0.13", "pyyaml>=5.1", - "uvicorn==0.27.0", + "uvicorn==0.29.0", "uvloop!=0.15.0,!=0.15.1,>=0.14.0; (sys_platform != \"cygwin\" and sys_platform != \"win32\") and platform_python_implementation != \"PyPy\"", "watchfiles>=0.13", "websockets>=10.4", ] files = [ - {file = "uvicorn-0.27.0-py3-none-any.whl", hash = "sha256:890b00f6c537d58695d3bb1f28e23db9d9e7a17cbcc76d7457c499935f933e24"}, - {file = "uvicorn-0.27.0.tar.gz", hash = "sha256:c855578045d45625fd027367f7653d249f7c49f9361ba15cf9624186b26b8eb6"}, + {file = "uvicorn-0.29.0-py3-none-any.whl", hash = "sha256:2c2aac7ff4f4365c206fd773a39bf4ebd1047c238f8b8268ad996829323473de"}, + {file = "uvicorn-0.29.0.tar.gz", hash = "sha256:6a69214c0b6a087462412670b3ef21224fa48cae0e452b5883e8e8bdfdd11dd0"}, ] [[package]]
--- a/pyproject.toml Sat Feb 03 20:56:27 2024 -0800 +++ b/pyproject.toml Sat Mar 23 15:25:02 2024 -0700 @@ -9,7 +9,7 @@ "ruff>=0.0.286", "starlette-exporter>=0.13.0", "starlette>=0.20.4", - "uvicorn[standard]>=0.18.2", + "uvicorn>=0.29.0", "background-loop>=1.3.0", "patchablegraph>=1.5.0", "rdfdb==0.24.0",