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",
--- a/skaffold.yaml	Sat Feb 03 20:56:27 2024 -0800
+++ b/skaffold.yaml	Sat Mar 23 15:25:02 2024 -0700
@@ -9,7 +9,7 @@
       sync:
         infer:
           - 'src/**'
-          - '*.py'
+          #- '*.py'
   tagPolicy:
     dateTime:
       format: 2006-01-02_15-04-05