feat: refine log system (#142)

* refine package logging

* add interface

* revert version selection

* replace tuple with model

* rename column in logs table, add coverters

* generate process identifier for child proocesses
This commit is contained in:
2025-03-09 14:46:33 +02:00
committed by GitHub
parent 08640d9108
commit 6f57ed550b
38 changed files with 711 additions and 209 deletions

View File

@ -0,0 +1,77 @@
import pytest
from aiohttp.test_utils import TestClient
from ahriman.models.build_status import BuildStatusEnum
from ahriman.models.package import Package
from ahriman.models.user_access import UserAccess
from ahriman.web.views.v1.service.logs import LogsView
async def test_get_permission() -> None:
"""
must return correct permission for the request
"""
for method in ("DELETE",):
request = pytest.helpers.request("", "", method)
assert await LogsView.get_permission(request) == UserAccess.Full
def test_routes() -> None:
"""
must return correct routes
"""
assert LogsView.ROUTES == ["/api/v1/service/logs"]
async def test_delete(client: TestClient, package_ahriman: Package) -> None:
"""
must delete all logs
"""
await client.post(f"/api/v1/packages/{package_ahriman.base}",
json={"status": BuildStatusEnum.Success.value, "package": package_ahriman.view()})
await client.post(f"/api/v1/packages/{package_ahriman.base}/logs",
json={"created": 42.0, "message": "message 1", "version": "42"})
await client.post(f"/api/v1/packages/{package_ahriman.base}/logs",
json={"created": 43.0, "message": "message 2", "version": "43"})
response = await client.delete("/api/v1/service/logs")
assert response.status == 204
response = await client.get(f"/api/v2/packages/{package_ahriman.base}/logs")
json = await response.json()
assert not json
async def test_delete_partially(client: TestClient, package_ahriman: Package) -> None:
"""
must delete logs based on count input
"""
await client.post(f"/api/v1/packages/{package_ahriman.base}",
json={"status": BuildStatusEnum.Success.value, "package": package_ahriman.view()})
await client.post(f"/api/v1/packages/{package_ahriman.base}/logs",
json={"created": 42.0, "message": "message 1", "version": "42"})
await client.post(f"/api/v1/packages/{package_ahriman.base}/logs",
json={"created": 43.0, "message": "message 2", "version": "43"})
request_schema = pytest.helpers.schema_request(LogsView.delete, location="querystring")
payload = {"keep_last_records": 1}
assert not request_schema.validate(payload)
response = await client.delete("/api/v1/service/logs", params=payload)
assert response.status == 204
response = await client.get(f"/api/v2/packages/{package_ahriman.base}/logs")
json = await response.json()
assert json
async def test_delete_exception(client: TestClient, package_ahriman: Package) -> None:
"""
must raise exception on invalid payload
"""
response_schema = pytest.helpers.schema_response(LogsView.delete, code=400)
response = await client.delete("/api/v1/service/logs", params={"keep_last_records": "string"})
assert response.status == 400
assert not response_schema.validate(await response.json())

View File

@ -3,6 +3,7 @@ import pytest
from aiohttp.test_utils import TestClient
from ahriman.models.build_status import BuildStatusEnum
from ahriman.models.log_record_id import LogRecordId
from ahriman.models.package import Package
from ahriman.models.user_access import UserAccess
from ahriman.web.views.v2.packages.logs import LogsView
@ -48,10 +49,14 @@ async def test_get(client: TestClient, package_ahriman: Package) -> None:
{
"created": 42.0,
"message": "message 1",
"version": "42",
"process_id": LogRecordId.DEFAULT_PROCESS_ID,
},
{
"created": 43.0,
"message": "message 2",
"version": "42",
"process_id": LogRecordId.DEFAULT_PROCESS_ID,
},
]
@ -76,7 +81,9 @@ async def test_get_with_pagination(client: TestClient, package_ahriman: Package)
logs = await response.json()
assert not response_schema.validate(logs)
assert logs == [{"created": 42.0, "message": "message 1"}]
assert logs == [
{"created": 42.0, "message": "message 1", "version": "42", "process_id": LogRecordId.DEFAULT_PROCESS_ID},
]
async def test_get_bad_request(client: TestClient, package_ahriman: Package) -> None: