Compare commits

...

2 Commits

Author SHA1 Message Date
f13c25e50c
Merge 713cc63a0f into 08640d9108 2025-03-07 02:24:32 +02:00
713cc63a0f replace tuple with model 2025-03-07 02:24:26 +02:00
15 changed files with 143 additions and 100 deletions

View File

@ -20,6 +20,7 @@
from sqlite3 import Connection from sqlite3 import Connection
from ahriman.core.database.operations.operations import Operations from ahriman.core.database.operations.operations import Operations
from ahriman.models.log_record import LogRecord
from ahriman.models.log_record_id import LogRecordId from ahriman.models.log_record_id import LogRecordId
from ahriman.models.repository_id import RepositoryId from ahriman.models.repository_id import RepositoryId
@ -30,7 +31,7 @@ class LogsOperations(Operations):
""" """
def logs_get(self, package_base: str, limit: int = -1, offset: int = 0, def logs_get(self, package_base: str, limit: int = -1, offset: int = 0,
repository_id: RepositoryId | None = None) -> list[tuple[LogRecordId, float, str]]: repository_id: RepositoryId | None = None) -> list[LogRecord]:
""" """
extract logs for specified package base extract logs for specified package base
@ -41,13 +42,13 @@ class LogsOperations(Operations):
repository_id(RepositoryId, optional): repository unique identifier override (Default value = None) repository_id(RepositoryId, optional): repository unique identifier override (Default value = None)
Return: Return:
list[tuple[LogRecordId, float, str]]: sorted package log records and their timestamps list[LogRecord]: sorted package log records
""" """
repository_id = repository_id or self._repository_id repository_id = repository_id or self._repository_id
def run(connection: Connection) -> list[tuple[LogRecordId, float, str]]: def run(connection: Connection) -> list[LogRecord]:
return [ return [
(LogRecordId(package_base, row["version"], row["process_id"]), row["created"], row["record"]) LogRecord(LogRecordId(package_base, row["version"], row["process_id"]), row["created"], row["record"])
for row in connection.execute( for row in connection.execute(
""" """
select created, record, version, process_id from ( select created, record, version, process_id from (
@ -66,15 +67,12 @@ class LogsOperations(Operations):
return self.with_connection(run) return self.with_connection(run)
def logs_insert(self, log_record_id: LogRecordId, created: float, record: str, def logs_insert(self, log_record: LogRecord, repository_id: RepositoryId | None = None) -> None:
repository_id: RepositoryId | None = None) -> None:
""" """
write new log record to database write new log record to database
Args: Args:
log_record_id(LogRecordId): current log record id log_record(LogRecord): log record object
created(float): log created timestamp from log record attribute
record(str): log record
repository_id(RepositoryId, optional): repository unique identifier override (Default value = None) repository_id(RepositoryId, optional): repository unique identifier override (Default value = None)
""" """
repository_id = repository_id or self._repository_id repository_id = repository_id or self._repository_id
@ -88,12 +86,12 @@ class LogsOperations(Operations):
(:package_base, :version, :created, :record, :repository, :process_id) (:package_base, :version, :created, :record, :repository, :process_id)
""", """,
{ {
"package_base": log_record_id.package_base, "package_base": log_record.log_record_id.package_base,
"version": log_record_id.version, "version": log_record.log_record_id.version,
"created": created, "created": log_record.created,
"record": record, "record": log_record.message,
"repository": repository_id.id, "repository": repository_id.id,
"process_id": log_record_id.process_id, "process_id": log_record.log_record_id.process_id,
} }
) )

View File

@ -24,6 +24,7 @@ from typing import Self
from ahriman.core.configuration import Configuration from ahriman.core.configuration import Configuration
from ahriman.core.status import Client from ahriman.core.status import Client
from ahriman.models.log_record import LogRecord
from ahriman.models.repository_id import RepositoryId from ahriman.models.repository_id import RepositoryId
@ -95,7 +96,7 @@ class HttpLogHandler(logging.Handler):
return # in case if no package base supplied we need just skip log message return # in case if no package base supplied we need just skip log message
try: try:
self.reporter.package_logs_add(log_record_id, record.created, record.getMessage()) self.reporter.package_logs_add(LogRecord(log_record_id, record.created, record.getMessage()))
except Exception: except Exception:
if self.suppress_errors: if self.suppress_errors:
return return

View File

@ -27,7 +27,7 @@ from ahriman.models.changes import Changes
from ahriman.models.dependencies import Dependencies from ahriman.models.dependencies import Dependencies
from ahriman.models.event import Event, EventType from ahriman.models.event import Event, EventType
from ahriman.models.internal_status import InternalStatus from ahriman.models.internal_status import InternalStatus
from ahriman.models.log_record_id import LogRecordId from ahriman.models.log_record import LogRecord
from ahriman.models.package import Package from ahriman.models.package import Package
from ahriman.models.pkgbuild_patch import PkgbuildPatch from ahriman.models.pkgbuild_patch import PkgbuildPatch
from ahriman.models.repository_id import RepositoryId from ahriman.models.repository_id import RepositoryId
@ -194,19 +194,16 @@ class Client:
""" """
raise NotImplementedError raise NotImplementedError
def package_logs_add(self, log_record_id: LogRecordId, created: float, message: str) -> None: def package_logs_add(self, log_record: LogRecord) -> None:
""" """
post log record post log record
Args: Args:
log_record_id(LogRecordId): log record id log_record(LogRecord): log record
created(float): log created timestamp
message(str): log message
""" """
# this method does not raise NotImplementedError because it is actively used as dummy client for http log # this method does not raise NotImplementedError because it is actively used as dummy client for http log
def package_logs_get(self, package_base: str, limit: int = -1, def package_logs_get(self, package_base: str, limit: int = -1, offset: int = 0) -> list[LogRecord]:
offset: int = 0) -> list[tuple[LogRecordId, float, str]]:
""" """
get package logs get package logs
@ -216,7 +213,7 @@ class Client:
offset(int, optional): records offset (Default value = 0) offset(int, optional): records offset (Default value = 0)
Returns: Returns:
list[tuple[LogRecordId, float, str]]: package logs list[LogRecord]: package logs
Raises: Raises:
NotImplementedError: not implemented method NotImplementedError: not implemented method

View File

@ -23,7 +23,7 @@ from ahriman.models.build_status import BuildStatus, BuildStatusEnum
from ahriman.models.changes import Changes from ahriman.models.changes import Changes
from ahriman.models.dependencies import Dependencies from ahriman.models.dependencies import Dependencies
from ahriman.models.event import Event, EventType from ahriman.models.event import Event, EventType
from ahriman.models.log_record_id import LogRecordId from ahriman.models.log_record import LogRecord
from ahriman.models.package import Package from ahriman.models.package import Package
from ahriman.models.pkgbuild_patch import PkgbuildPatch from ahriman.models.pkgbuild_patch import PkgbuildPatch
from ahriman.models.repository_id import RepositoryId from ahriman.models.repository_id import RepositoryId
@ -143,19 +143,16 @@ class LocalClient(Client):
return packages return packages
return [(package, status) for package, status in packages if package.base == package_base] return [(package, status) for package, status in packages if package.base == package_base]
def package_logs_add(self, log_record_id: LogRecordId, created: float, message: str) -> None: def package_logs_add(self, log_record: LogRecord) -> None:
""" """
post log record post log record
Args: Args:
log_record_id(LogRecordId): log record id log_record(LogRecord): log record
created(float): log created timestamp
message(str): log message
""" """
self.database.logs_insert(log_record_id, created, message, self.repository_id) self.database.logs_insert(log_record, self.repository_id)
def package_logs_get(self, package_base: str, limit: int = -1, def package_logs_get(self, package_base: str, limit: int = -1, offset: int = 0) -> list[LogRecord]:
offset: int = 0) -> list[tuple[LogRecordId, float, str]]:
""" """
get package logs get package logs
@ -165,7 +162,7 @@ class LocalClient(Client):
offset(int, optional): records offset (Default value = 0) offset(int, optional): records offset (Default value = 0)
Returns: Returns:
list[tuple[LogRecordId, float, str]]: package logs list[LogRecord]: package logs
""" """
return self.database.logs_get(package_base, limit, offset, self.repository_id) return self.database.logs_get(package_base, limit, offset, self.repository_id)

View File

@ -28,7 +28,7 @@ from ahriman.models.build_status import BuildStatus, BuildStatusEnum
from ahriman.models.changes import Changes from ahriman.models.changes import Changes
from ahriman.models.dependencies import Dependencies from ahriman.models.dependencies import Dependencies
from ahriman.models.event import Event, EventType from ahriman.models.event import Event, EventType
from ahriman.models.log_record_id import LogRecordId from ahriman.models.log_record import LogRecord
from ahriman.models.package import Package from ahriman.models.package import Package
from ahriman.models.pkgbuild_patch import PkgbuildPatch from ahriman.models.pkgbuild_patch import PkgbuildPatch
@ -107,9 +107,9 @@ class Watcher(LazyLogging):
except KeyError: except KeyError:
raise UnknownPackageError(package_base) from None raise UnknownPackageError(package_base) from None
package_logs_add: Callable[[LogRecordId, float, str], None] package_logs_add: Callable[[LogRecord], None]
package_logs_get: Callable[[str, int, int], list[tuple[LogRecordId, float, str]]] package_logs_get: Callable[[str, int, int], list[LogRecord]]
package_logs_remove: Callable[[str, str | None], None] package_logs_remove: Callable[[str, str | None], None]

View File

@ -29,6 +29,7 @@ from ahriman.models.changes import Changes
from ahriman.models.dependencies import Dependencies from ahriman.models.dependencies import Dependencies
from ahriman.models.event import Event, EventType from ahriman.models.event import Event, EventType
from ahriman.models.internal_status import InternalStatus from ahriman.models.internal_status import InternalStatus
from ahriman.models.log_record import LogRecord
from ahriman.models.log_record_id import LogRecordId from ahriman.models.log_record_id import LogRecordId
from ahriman.models.package import Package from ahriman.models.package import Package
from ahriman.models.pkgbuild_patch import PkgbuildPatch from ahriman.models.pkgbuild_patch import PkgbuildPatch
@ -306,30 +307,27 @@ class WebClient(Client, SyncAhrimanClient):
return [] return []
def package_logs_add(self, log_record_id: LogRecordId, created: float, message: str) -> None: def package_logs_add(self, log_record: LogRecord) -> None:
""" """
post log record post log record
Args: Args:
log_record_id(LogRecordId): log record id log_record(LogRecord): log record
created(float): log created timestamp
message(str): log message
""" """
payload = { payload = {
"created": created, "created": log_record.created,
"message": message, "message": log_record.message,
"process_id": log_record_id.process_id, "process_id": log_record.log_record_id.process_id,
"version": log_record_id.version, "version": log_record.log_record_id.version,
} }
# this is special case, because we would like to do not suppress exception here # this is special case, because we would like to do not suppress exception here
# in case of exception raised it will be handled by upstream HttpLogHandler # in case of exception raised it will be handled by upstream HttpLogHandler
# In the other hand, we force to suppress all http logs here to avoid cyclic reporting # In the other hand, we force to suppress all http logs here to avoid cyclic reporting
self.make_request("POST", self._logs_url(log_record_id.package_base), self.make_request("POST", self._logs_url(log_record.log_record_id.package_base),
params=self.repository_id.query(), json=payload, suppress_errors=True) params=self.repository_id.query(), json=payload, suppress_errors=True)
def package_logs_get(self, package_base: str, limit: int = -1, def package_logs_get(self, package_base: str, limit: int = -1, offset: int = 0) -> list[LogRecord]:
offset: int = 0) -> list[tuple[LogRecordId, float, str]]:
""" """
get package logs get package logs
@ -339,7 +337,7 @@ class WebClient(Client, SyncAhrimanClient):
offset(int, optional): records offset (Default value = 0) offset(int, optional): records offset (Default value = 0)
Returns: Returns:
list[tuple[LogRecordId, float, str]]: package logs list[LogRecord]: package logs
""" """
query = self.repository_id.query() + [("limit", str(limit)), ("offset", str(offset))] query = self.repository_id.query() + [("limit", str(limit)), ("offset", str(offset))]
@ -348,7 +346,7 @@ class WebClient(Client, SyncAhrimanClient):
response_json = response.json() response_json = response.json()
return [ return [
( LogRecord(
LogRecordId(package_base, record["version"], record["process_id"]), LogRecordId(package_base, record["version"], record["process_id"]),
record["created"], record["created"],
record["message"] record["message"]

View File

@ -0,0 +1,38 @@
#
# Copyright (c) 2021-2025 ahriman team.
#
# This file is part of ahriman
# (see https://github.com/arcan1s/ahriman).
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
from dataclasses import dataclass
from ahriman.models.log_record_id import LogRecordId
@dataclass(frozen=True)
class LogRecord:
"""
log record
Attributes:
log_record_id(LogRecordId): log record identifier
created(float): log record creation timestamp
message(str): log record message
"""
log_record_id: LogRecordId
created: float
message: str

View File

@ -21,6 +21,7 @@ from aiohttp.web import HTTPBadRequest, HTTPNoContent, HTTPNotFound, Response, j
from ahriman.core.exceptions import UnknownPackageError from ahriman.core.exceptions import UnknownPackageError
from ahriman.core.utils import pretty_datetime from ahriman.core.utils import pretty_datetime
from ahriman.models.log_record import LogRecord
from ahriman.models.log_record_id import LogRecordId from ahriman.models.log_record_id import LogRecordId
from ahriman.models.user_access import UserAccess from ahriman.models.user_access import UserAccess
from ahriman.web.apispec.decorators import apidocs from ahriman.web.apispec.decorators import apidocs
@ -96,7 +97,7 @@ class LogsView(StatusViewGuard, BaseView):
response = { response = {
"package_base": package_base, "package_base": package_base,
"status": status.view(), "status": status.view(),
"logs": "\n".join(f"[{pretty_datetime(created)}] {message}" for _, created, message in logs) "logs": "\n".join(f"[{pretty_datetime(log_record.created)}] {log_record.message}" for log_record in logs)
} }
return json_response(response) return json_response(response)
@ -130,6 +131,7 @@ class LogsView(StatusViewGuard, BaseView):
# either read from process identifier from payload or assign to the current process identifier # either read from process identifier from payload or assign to the current process identifier
process_id = data.get("process_id", LogRecordId("", "").process_id) process_id = data.get("process_id", LogRecordId("", "").process_id)
self.service().package_logs_add(LogRecordId(package_base, version, process_id), created, record) log_record = LogRecord(LogRecordId(package_base, version, process_id), created, record)
self.service().package_logs_add(log_record)
raise HTTPNoContent raise HTTPNoContent

View File

@ -65,10 +65,10 @@ class LogsView(StatusViewGuard, BaseView):
response = [ response = [
{ {
"created": created, "created": log_record.created,
"message": message, "message": log_record.message,
"version": log_record_id.version, "version": log_record.log_record_id.version,
"process_id": log_record_id.process_id, "process_id": log_record.log_record_id.process_id,
} for log_record_id, created, message in logs } for log_record in logs
] ]
return json_response(response) return json_response(response)

View File

@ -1,4 +1,5 @@
from ahriman.core.database import SQLite from ahriman.core.database import SQLite
from ahriman.models.log_record import LogRecord
from ahriman.models.log_record_id import LogRecordId from ahriman.models.log_record_id import LogRecordId
from ahriman.models.package import Package from ahriman.models.package import Package
from ahriman.models.repository_id import RepositoryId from ahriman.models.repository_id import RepositoryId
@ -9,16 +10,16 @@ def test_logs_insert_remove_version(database: SQLite, package_ahriman: Package,
""" """
must clear version specific package logs must clear version specific package logs
""" """
database.logs_insert(LogRecordId(package_ahriman.base, "1"), 42.0, "message 1") database.logs_insert(LogRecord(LogRecordId(package_ahriman.base, "1"), 42.0, "message 1"))
database.logs_insert(LogRecordId(package_ahriman.base, "2"), 43.0, "message 2") database.logs_insert(LogRecord(LogRecordId(package_ahriman.base, "2"), 43.0, "message 2"))
database.logs_insert(LogRecordId(package_python_schedule.base, "1"), 42.0, "message 3") database.logs_insert(LogRecord(LogRecordId(package_python_schedule.base, "1"), 42.0, "message 3"))
database.logs_remove(package_ahriman.base, "1") database.logs_remove(package_ahriman.base, "1")
assert database.logs_get(package_ahriman.base) == [ assert database.logs_get(package_ahriman.base) == [
(LogRecordId(package_ahriman.base, "1"), 42.0, "message 1"), LogRecord(LogRecordId(package_ahriman.base, "1"), 42.0, "message 1"),
] ]
assert database.logs_get(package_python_schedule.base) == [ assert database.logs_get(package_python_schedule.base) == [
(LogRecordId(package_python_schedule.base, "1"), 42.0, "message 3"), LogRecord(LogRecordId(package_python_schedule.base, "1"), 42.0, "message 3"),
] ]
@ -26,27 +27,29 @@ def test_logs_insert_remove_multi(database: SQLite, package_ahriman: Package) ->
""" """
must clear logs for specified repository must clear logs for specified repository
""" """
database.logs_insert(LogRecordId(package_ahriman.base, "1"), 42.0, "message 1") database.logs_insert(LogRecord(LogRecordId(package_ahriman.base, "1"), 42.0, "message 1"))
database.logs_insert(LogRecordId(package_ahriman.base, "1"), 43.0, "message 2", database.logs_insert(LogRecord(LogRecordId(package_ahriman.base, "1"), 43.0, "message 2"),
RepositoryId("i686", database._repository_id.name)) RepositoryId("i686", database._repository_id.name))
database.logs_remove(package_ahriman.base, None, RepositoryId("i686", database._repository_id.name)) database.logs_remove(package_ahriman.base, None, RepositoryId("i686", database._repository_id.name))
assert not database.logs_get(package_ahriman.base, repository_id=RepositoryId("i686", database._repository_id.name)) assert not database.logs_get(package_ahriman.base, repository_id=RepositoryId("i686", database._repository_id.name))
assert database.logs_get(package_ahriman.base) == [(LogRecordId(package_ahriman.base, "1"), 42.0, "message 1")] assert database.logs_get(package_ahriman.base) == [
LogRecord(LogRecordId(package_ahriman.base, "1"), 42.0, "message 1"),
]
def test_logs_insert_remove_full(database: SQLite, package_ahriman: Package, package_python_schedule: Package) -> None: def test_logs_insert_remove_full(database: SQLite, package_ahriman: Package, package_python_schedule: Package) -> None:
""" """
must clear full package logs must clear full package logs
""" """
database.logs_insert(LogRecordId(package_ahriman.base, "1"), 42.0, "message 1") database.logs_insert(LogRecord(LogRecordId(package_ahriman.base, "1"), 42.0, "message 1"))
database.logs_insert(LogRecordId(package_ahriman.base, "2"), 43.0, "message 2") database.logs_insert(LogRecord(LogRecordId(package_ahriman.base, "2"), 43.0, "message 2"))
database.logs_insert(LogRecordId(package_python_schedule.base, "1"), 42.0, "message 3") database.logs_insert(LogRecord(LogRecordId(package_python_schedule.base, "1"), 42.0, "message 3"))
database.logs_remove(package_ahriman.base, None) database.logs_remove(package_ahriman.base, None)
assert not database.logs_get(package_ahriman.base) assert not database.logs_get(package_ahriman.base)
assert database.logs_get(package_python_schedule.base) == [ assert database.logs_get(package_python_schedule.base) == [
(LogRecordId(package_python_schedule.base, "1"), 42.0, "message 3"), LogRecord(LogRecordId(package_python_schedule.base, "1"), 42.0, "message 3"),
] ]
@ -54,11 +57,11 @@ def test_logs_insert_get(database: SQLite, package_ahriman: Package) -> None:
""" """
must insert and get package logs must insert and get package logs
""" """
database.logs_insert(LogRecordId(package_ahriman.base, "1"), 43.0, "message 2") database.logs_insert(LogRecord(LogRecordId(package_ahriman.base, "1"), 43.0, "message 2"))
database.logs_insert(LogRecordId(package_ahriman.base, "1"), 42.0, "message 1") database.logs_insert(LogRecord(LogRecordId(package_ahriman.base, "1"), 42.0, "message 1"))
assert database.logs_get(package_ahriman.base) == [ assert database.logs_get(package_ahriman.base) == [
(LogRecordId(package_ahriman.base, "1"), 42.0, "message 1"), LogRecord(LogRecordId(package_ahriman.base, "1"), 42.0, "message 1"),
(LogRecordId(package_ahriman.base, "1"), 43.0, "message 2"), LogRecord(LogRecordId(package_ahriman.base, "1"), 43.0, "message 2"),
] ]
@ -66,10 +69,10 @@ def test_logs_insert_get_pagination(database: SQLite, package_ahriman: Package)
""" """
must insert and get package logs with pagination must insert and get package logs with pagination
""" """
database.logs_insert(LogRecordId(package_ahriman.base, "1"), 42.0, "message 1") database.logs_insert(LogRecord(LogRecordId(package_ahriman.base, "1"), 42.0, "message 1"))
database.logs_insert(LogRecordId(package_ahriman.base, "1"), 43.0, "message 2") database.logs_insert(LogRecord(LogRecordId(package_ahriman.base, "1"), 43.0, "message 2"))
assert database.logs_get(package_ahriman.base, 1, 1) == [ assert database.logs_get(package_ahriman.base, 1, 1) == [
(LogRecordId(package_ahriman.base, "1"), 42.0, "message 1"), LogRecord(LogRecordId(package_ahriman.base, "1"), 42.0, "message 1"),
] ]
@ -77,16 +80,16 @@ def test_logs_insert_get_multi(database: SQLite, package_ahriman: Package) -> No
""" """
must insert and get package logs for multiple repositories must insert and get package logs for multiple repositories
""" """
database.logs_insert(LogRecordId(package_ahriman.base, "1"), 42.0, "message 1") database.logs_insert(LogRecord(LogRecordId(package_ahriman.base, "1"), 42.0, "message 1"))
database.logs_insert(LogRecordId(package_ahriman.base, "1"), 43.0, "message 2", database.logs_insert(LogRecord(LogRecordId(package_ahriman.base, "1"), 43.0, "message 2"),
RepositoryId("i686", database._repository_id.name)) RepositoryId("i686", database._repository_id.name))
assert database.logs_get(package_ahriman.base, assert database.logs_get(package_ahriman.base,
repository_id=RepositoryId("i686", database._repository_id.name)) == [ repository_id=RepositoryId("i686", database._repository_id.name)) == [
(LogRecordId(package_ahriman.base, "1"), 43.0, "message 2"), LogRecord(LogRecordId(package_ahriman.base, "1"), 43.0, "message 2"),
] ]
assert database.logs_get(package_ahriman.base) == [ assert database.logs_get(package_ahriman.base) == [
(LogRecordId(package_ahriman.base, "1"), 42.0, "message 1"), LogRecord(LogRecordId(package_ahriman.base, "1"), 42.0, "message 1"),
] ]
@ -94,9 +97,9 @@ def test_logs_rotate_remove_all(database: SQLite, package_ahriman: Package) -> N
""" """
must remove all records when rotating with keep_last_records is 0 must remove all records when rotating with keep_last_records is 0
""" """
database.logs_insert(LogRecordId(package_ahriman.base, "1"), 42.0, "message 1") database.logs_insert(LogRecord(LogRecordId(package_ahriman.base, "1"), 42.0, "message 1"))
database.logs_insert(LogRecordId(package_ahriman.base, "1"), 43.0, "message 2") database.logs_insert(LogRecord(LogRecordId(package_ahriman.base, "1"), 43.0, "message 2"))
database.logs_insert(LogRecordId(package_ahriman.base, "2"), 44.0, "message 3") database.logs_insert(LogRecord(LogRecordId(package_ahriman.base, "2"), 44.0, "message 3"))
database.logs_rotate(0) database.logs_rotate(0)
assert not database.logs_get(package_ahriman.base) assert not database.logs_get(package_ahriman.base)
@ -106,16 +109,16 @@ def test_logs_rotate_remove_duplicates(database: SQLite, package_ahriman: Packag
""" """
must remove duplicate records while preserving the most recent one for each package version must remove duplicate records while preserving the most recent one for each package version
""" """
database.logs_insert(LogRecordId(package_ahriman.base, "1", "p1"), 42.0, "message 1") database.logs_insert(LogRecord(LogRecordId(package_ahriman.base, "1", "p1"), 42.0, "message 1"))
database.logs_insert(LogRecordId(package_ahriman.base, "1", "p2"), 43.0, "message 2") database.logs_insert(LogRecord(LogRecordId(package_ahriman.base, "1", "p2"), 43.0, "message 2"))
database.logs_insert(LogRecordId(package_ahriman.base, "1", "p3"), 44.0, "message 3") database.logs_insert(LogRecord(LogRecordId(package_ahriman.base, "1", "p3"), 44.0, "message 3"))
database.logs_insert(LogRecordId(package_ahriman.base, "2", "p1"), 45.0, "message 4") database.logs_insert(LogRecord(LogRecordId(package_ahriman.base, "2", "p1"), 45.0, "message 4"))
database.logs_rotate(2) database.logs_rotate(2)
logs = database.logs_get(package_ahriman.base) logs = database.logs_get(package_ahriman.base)
assert len(logs) == 2 assert len(logs) == 2
assert logs == [ assert logs == [
(LogRecordId(package_ahriman.base, "1", "p3"), 44.0, "message 3"), LogRecord(LogRecordId(package_ahriman.base, "1", "p3"), 44.0, "message 3"),
(LogRecordId(package_ahriman.base, "2", "p1"), 45.0, "message 4"), LogRecord(LogRecordId(package_ahriman.base, "2", "p1"), 45.0, "message 4"),
] ]

View File

@ -4,6 +4,7 @@ from pytest_mock import MockerFixture
from ahriman.core.configuration import Configuration from ahriman.core.configuration import Configuration
from ahriman.core.log.http_log_handler import HttpLogHandler from ahriman.core.log.http_log_handler import HttpLogHandler
from ahriman.models.log_record import LogRecord
from ahriman.models.log_record_id import LogRecordId from ahriman.models.log_record_id import LogRecordId
from ahriman.models.package import Package from ahriman.models.package import Package
@ -51,7 +52,7 @@ def test_emit(configuration: Configuration, log_record: logging.LogRecord, packa
handler = HttpLogHandler(repository_id, configuration, report=False, suppress_errors=False) handler = HttpLogHandler(repository_id, configuration, report=False, suppress_errors=False)
handler.emit(log_record) handler.emit(log_record)
log_mock.assert_called_once_with(log_record_id, log_record.created, log_record.getMessage()) log_mock.assert_called_once_with(LogRecord(log_record_id, log_record.created, log_record.getMessage()))
def test_emit_failed(configuration: Configuration, log_record: logging.LogRecord, package_ahriman: Package, def test_emit_failed(configuration: Configuration, log_record: logging.LogRecord, package_ahriman: Package,

View File

@ -13,6 +13,7 @@ from ahriman.models.changes import Changes
from ahriman.models.dependencies import Dependencies from ahriman.models.dependencies import Dependencies
from ahriman.models.event import Event from ahriman.models.event import Event
from ahriman.models.internal_status import InternalStatus from ahriman.models.internal_status import InternalStatus
from ahriman.models.log_record import LogRecord
from ahriman.models.log_record_id import LogRecordId from ahriman.models.log_record_id import LogRecordId
from ahriman.models.package import Package from ahriman.models.package import Package
from ahriman.models.pkgbuild_patch import PkgbuildPatch from ahriman.models.pkgbuild_patch import PkgbuildPatch
@ -112,7 +113,7 @@ def test_event_get(client: Client) -> None:
client.event_get(None, None) client.event_get(None, None)
def test_logs_rotate(client: Client, package_ahriman: Package) -> None: def test_logs_rotate(client: Client) -> None:
""" """
must do not raise exception on logs rotation call must do not raise exception on logs rotation call
""" """
@ -164,7 +165,7 @@ def test_package_logs_add(client: Client, package_ahriman: Package, log_record:
must process log record addition without exception must process log record addition without exception
""" """
log_record_id = LogRecordId(package_ahriman.base, package_ahriman.version) log_record_id = LogRecordId(package_ahriman.base, package_ahriman.version)
client.package_logs_add(log_record_id, log_record.created, log_record.getMessage()) client.package_logs_add(LogRecord(log_record_id, log_record.created, log_record.getMessage()))
def test_package_logs_get(client: Client, package_ahriman: Package) -> None: def test_package_logs_get(client: Client, package_ahriman: Package) -> None:

View File

@ -8,6 +8,7 @@ from ahriman.models.build_status import BuildStatus, BuildStatusEnum
from ahriman.models.changes import Changes from ahriman.models.changes import Changes
from ahriman.models.dependencies import Dependencies from ahriman.models.dependencies import Dependencies
from ahriman.models.event import Event, EventType from ahriman.models.event import Event, EventType
from ahriman.models.log_record import LogRecord
from ahriman.models.log_record_id import LogRecordId from ahriman.models.log_record_id import LogRecordId
from ahriman.models.package import Package from ahriman.models.package import Package
from ahriman.models.pkgbuild_patch import PkgbuildPatch from ahriman.models.pkgbuild_patch import PkgbuildPatch
@ -112,10 +113,10 @@ def test_package_logs_add(local_client: LocalClient, package_ahriman: Package, l
""" """
logs_mock = mocker.patch("ahriman.core.database.SQLite.logs_insert") logs_mock = mocker.patch("ahriman.core.database.SQLite.logs_insert")
log_record_id = LogRecordId(package_ahriman.base, package_ahriman.version) log_record_id = LogRecordId(package_ahriman.base, package_ahriman.version)
record = LogRecord(log_record_id, log_record.created, log_record.getMessage())
local_client.package_logs_add(log_record_id, log_record.created, log_record.getMessage()) local_client.package_logs_add(record)
logs_mock.assert_called_once_with(log_record_id, log_record.created, log_record.getMessage(), logs_mock.assert_called_once_with(record, local_client.repository_id)
local_client.repository_id)
def test_package_logs_get(local_client: LocalClient, package_ahriman: Package, mocker: MockerFixture) -> None: def test_package_logs_get(local_client: LocalClient, package_ahriman: Package, mocker: MockerFixture) -> None:

View File

@ -12,6 +12,7 @@ from ahriman.models.changes import Changes
from ahriman.models.dependencies import Dependencies from ahriman.models.dependencies import Dependencies
from ahriman.models.event import Event, EventType from ahriman.models.event import Event, EventType
from ahriman.models.internal_status import InternalStatus from ahriman.models.internal_status import InternalStatus
from ahriman.models.log_record import LogRecord
from ahriman.models.log_record_id import LogRecordId from ahriman.models.log_record_id import LogRecordId
from ahriman.models.package import Package from ahriman.models.package import Package
from ahriman.models.pkgbuild_patch import PkgbuildPatch from ahriman.models.pkgbuild_patch import PkgbuildPatch
@ -605,9 +606,10 @@ def test_package_logs_add(web_client: WebClient, log_record: logging.LogRecord,
"process_id": LogRecordId.process_id, "process_id": LogRecordId.process_id,
"version": package_ahriman.version, "version": package_ahriman.version,
} }
record = LogRecord(LogRecordId(package_ahriman.base, package_ahriman.version),
log_record.created, log_record.getMessage())
web_client.package_logs_add(LogRecordId(package_ahriman.base, package_ahriman.version), web_client.package_logs_add(record)
log_record.created, log_record.getMessage())
requests_mock.assert_called_once_with("POST", pytest.helpers.anyvar(str, True), requests_mock.assert_called_once_with("POST", pytest.helpers.anyvar(str, True),
params=web_client.repository_id.query(), json=payload, suppress_errors=True) params=web_client.repository_id.query(), json=payload, suppress_errors=True)
@ -619,9 +621,11 @@ def test_package_logs_add_failed(web_client: WebClient, log_record: logging.LogR
""" """
mocker.patch("requests.Session.request", side_effect=Exception()) mocker.patch("requests.Session.request", side_effect=Exception())
log_record.package_base = package_ahriman.base log_record.package_base = package_ahriman.base
record = LogRecord(LogRecordId(package_ahriman.base, package_ahriman.version),
log_record.created, log_record.getMessage())
with pytest.raises(Exception): with pytest.raises(Exception):
web_client.package_logs_add(LogRecordId(package_ahriman.base, package_ahriman.version), web_client.package_logs_add(record)
log_record.created, log_record.getMessage())
def test_package_logs_add_failed_http_error(web_client: WebClient, log_record: logging.LogRecord, def test_package_logs_add_failed_http_error(web_client: WebClient, log_record: logging.LogRecord,
@ -631,9 +635,11 @@ def test_package_logs_add_failed_http_error(web_client: WebClient, log_record: l
""" """
mocker.patch("requests.Session.request", side_effect=requests.HTTPError()) mocker.patch("requests.Session.request", side_effect=requests.HTTPError())
log_record.package_base = package_ahriman.base log_record.package_base = package_ahriman.base
record = LogRecord(LogRecordId(package_ahriman.base, package_ahriman.version),
log_record.created, log_record.getMessage())
with pytest.raises(Exception): with pytest.raises(Exception):
web_client.package_logs_add(LogRecordId(package_ahriman.base, package_ahriman.version), web_client.package_logs_add(record)
log_record.created, log_record.getMessage())
def test_package_logs_get(web_client: WebClient, package_ahriman: Package, mocker: MockerFixture) -> None: def test_package_logs_get(web_client: WebClient, package_ahriman: Package, mocker: MockerFixture) -> None:
@ -656,7 +662,7 @@ def test_package_logs_get(web_client: WebClient, package_ahriman: Package, mocke
requests_mock.assert_called_once_with("GET", pytest.helpers.anyvar(str, True), requests_mock.assert_called_once_with("GET", pytest.helpers.anyvar(str, True),
params=web_client.repository_id.query() + [("limit", "1"), ("offset", "2")]) params=web_client.repository_id.query() + [("limit", "1"), ("offset", "2")])
assert result == [ assert result == [
(LogRecordId(package_ahriman.base, package_ahriman.version), message["created"], message["message"]), LogRecord(LogRecordId(package_ahriman.base, package_ahriman.version), message["created"], message["message"]),
] ]

View File