Skip to content

Commit

Permalink
Use get request for logs instead of websocket
Browse files Browse the repository at this point in the history
  • Loading branch information
UpstreamData authored and b-rowan committed Nov 26, 2024
1 parent 88e0ee2 commit 93be755
Show file tree
Hide file tree
Showing 14 changed files with 29 additions and 123 deletions.
1 change: 0 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -146,7 +146,6 @@ The structure of gooseBit is as follows:
- `nav`: Navbar handler.
- `updater`: DDI API handler and device update manager.
- `updates`: SWUpdate file parsing.
- `realtime`: Realtime API functionality with websockets.
- `auth`: Authentication functions and permission handling.
- `models`: Database models.
- `db`: Database config and initialization.
Expand Down
1 change: 0 additions & 1 deletion docs/development.md
Original file line number Diff line number Diff line change
Expand Up @@ -71,7 +71,6 @@ The structure of gooseBit is as follows:
- `nav`: Navbar handler.
- `updater`: DDI API handler and device update manager.
- `updates`: SWUpdate file parsing.
- `realtime`: Realtime API functionality with websockets.
- `auth`: Authentication functions and permission handling.
- `models`: Database models.
- `db`: Database config and initialization.
Expand Down
3 changes: 1 addition & 2 deletions goosebit/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@
from starlette.exceptions import HTTPException as StarletteHTTPException
from tortoise.exceptions import ValidationError

from goosebit import api, db, realtime, ui, updater
from goosebit import api, db, ui, updater
from goosebit.api.telemetry import metrics
from goosebit.auth import get_user_from_request, login_user, redirect_if_authenticated
from goosebit.settings import config
Expand Down Expand Up @@ -57,7 +57,6 @@ async def lifespan(_: FastAPI):
app.include_router(updater.router)
app.include_router(ui.router)
app.include_router(api.router)
app.include_router(realtime.router)
app.mount("/static", static, name="static")
Instrumentor.instrument_app(app)

Expand Down
1 change: 1 addition & 0 deletions goosebit/api/v1/devices/device/responses.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@

class DeviceLogResponse(BaseModel):
log: str | None
progress: int | None


class DeviceResponse(DeviceSchema):
Expand Down
2 changes: 1 addition & 1 deletion goosebit/api/v1/devices/device/routes.py
Original file line number Diff line number Diff line change
Expand Up @@ -29,4 +29,4 @@ async def device_get(_: Request, device: Device = Depends(get_device)) -> Device
async def device_logs(_: Request, device: Device = Depends(get_device)) -> DeviceLogResponse:
if device is None:
raise HTTPException(404)
return DeviceLogResponse(log=device.last_log)
return DeviceLogResponse(log=device.last_log, progress=device.progress)
40 changes: 0 additions & 40 deletions goosebit/device_manager.py
Original file line number Diff line number Diff line change
@@ -1,10 +1,7 @@
from __future__ import annotations

import asyncio
import re
from contextlib import asynccontextmanager
from enum import StrEnum
from typing import Awaitable, Callable

from aiocache import caches

Expand Down Expand Up @@ -36,7 +33,6 @@ class HandlingType(StrEnum):

class DeviceManager:
_hardware_default = None
_log_subscriptions: dict[Device, list[Callable]] = {}

@staticmethod
async def get_device(dev_id: str) -> Device:
Expand Down Expand Up @@ -147,8 +143,6 @@ async def deployment_action_start(device: Device):
device.progress = 0
await DeviceManager.save_device(device, update_fields=["last_log", "progress"])

await DeviceManager.publish_log(device, None)

@staticmethod
async def deployment_action_success(device: Device):
device.progress = 100
Expand Down Expand Up @@ -206,39 +200,6 @@ async def get_update(device: Device) -> tuple[HandlingType, Software | None]:

return handling_type, software

@staticmethod
@asynccontextmanager
async def subscribe_log(device: Device, callback: Callable[[str], Awaitable[None]]):
# do not modify, breaks when combined
subscribers = DeviceManager.get_log_subscribers(device)
subscribers.append(callback)
DeviceManager.set_log_subscribers(device, subscribers)

if device is not None:
await callback(device.last_log)
try:
yield
except asyncio.CancelledError:
pass
finally:
# do not modify, breaks when combined
subscribers = DeviceManager.get_log_subscribers(device)
subscribers.remove(callback)
DeviceManager.set_log_subscribers(device, subscribers)

@staticmethod
def get_log_subscribers(device: Device):
return DeviceManager._log_subscriptions.get(device, [])

@staticmethod
def set_log_subscribers(device: Device, value: list):
DeviceManager._log_subscriptions[device] = value

@staticmethod
async def publish_log(device: Device, log_data: str | None):
for cb in DeviceManager.get_log_subscribers(device):
await cb(log_data)

@staticmethod
async def update_log(device: Device, log_data: str) -> None:
if log_data is None:
Expand All @@ -253,7 +214,6 @@ async def update_log(device: Device, log_data: str) -> None:
device.progress = matches[-1]

device.last_log += f"{log_data}\n"
await DeviceManager.publish_log(device, f"{log_data}\n")

await DeviceManager.save_device(device, update_fields=["progress", "last_log"])

Expand Down
1 change: 0 additions & 1 deletion goosebit/realtime/__init__.py

This file was deleted.

41 changes: 0 additions & 41 deletions goosebit/realtime/logs.py

This file was deleted.

13 changes: 0 additions & 13 deletions goosebit/realtime/routes.py

This file was deleted.

1 change: 1 addition & 0 deletions goosebit/ui/bff/devices/device/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
from .routes import router # noqa : F401
16 changes: 16 additions & 0 deletions goosebit/ui/bff/devices/device/routes.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
from __future__ import annotations

from fastapi import APIRouter, Security

from goosebit.api.v1.devices.device import routes
from goosebit.auth import validate_user_permissions

router = APIRouter(prefix="/{dev_id}")

router.add_api_route(
"/log",
routes.device_logs,
methods=["GET"],
dependencies=[Security(validate_user_permissions, scopes=["device.read"])],
name="bff_device_logs",
)
2 changes: 2 additions & 0 deletions goosebit/ui/bff/devices/routes.py
Original file line number Diff line number Diff line change
Expand Up @@ -19,10 +19,12 @@
from goosebit.ui.bff.common.util import parse_datatables_query

from ..common.responses import DTColumnDescription, DTColumns
from . import device
from .requests import DevicesPatchRequest
from .responses import BFFDeviceResponse

router = APIRouter(prefix="/devices")
router.include_router(device.router)


@router.get(
Expand Down
29 changes: 7 additions & 22 deletions goosebit/ui/static/js/logs.js
Original file line number Diff line number Diff line change
@@ -1,25 +1,10 @@
document.addEventListener("DOMContentLoaded", () => {
const logs_ws = create_ws(`/realtime/logs/${device}`);
document.addEventListener("DOMContentLoaded", async () => {
const res = await get_request(`/ui/bff/devices/${device}/log`);

logs_ws.addEventListener("message", (event) => {
const res = JSON.parse(event.data);
const logElem = document.getElementById("device-log");
logElem.textContent = res.log;

const logElem = document.getElementById("device-log");
if (res.clear) {
logElem.textContent = "";
}
logElem.textContent += res.log;

const progressElem = document.getElementById("install-progress");
progressElem.style.width = `${res.progress}%`;
progressElem.innerHTML = `${res.progress}%`;
});
const progressElem = document.getElementById("install-progress");
progressElem.style.width = `${res.progress}%`;
progressElem.innerHTML = `${res.progress}%`;
});

function create_ws(s) {
const l = window.location;
const protocol = l.protocol === "https:" ? "wss://" : "ws://";
const port = l.port !== "80" || l.port !== "443" ? l.port : "";
const url = `${protocol}${l.hostname}:${port}${s}`;
return new WebSocket(url);
}
1 change: 0 additions & 1 deletion pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,6 @@ jinja2 = "^3.1.4"
itsdangerous = "^2.2.0"
tortoise-orm = "^0.22.1"
aerich = "^0.7.2"
websockets = "^14.0"
argon2-cffi = "^23.1.0"
joserfc = "^1.0.0"
semver = "^3.0.2"
Expand Down

0 comments on commit 93be755

Please sign in to comment.