diff --git a/src/ahriman/core/database/migrations/m010_version_based_logs_removal.py b/src/ahriman/core/database/migrations/m010_version_based_logs_removal.py
new file mode 100644
index 00000000..551c014e
--- /dev/null
+++ b/src/ahriman/core/database/migrations/m010_version_based_logs_removal.py
@@ -0,0 +1,36 @@
+#
+# Copyright (c) 2021-2023 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 .
+#
+__all__ = ["steps"]
+
+
+steps = [
+ """
+ drop index logs_package_base_process_id
+ """,
+ """
+ alter table logs drop column process_id
+ """,
+ """
+ alter table logs add column version text not null default ''
+ """,
+ """
+ create index logs_package_base_version on logs (package_base, version)
+ """,
+]
diff --git a/src/ahriman/core/database/operations/logs_operations.py b/src/ahriman/core/database/operations/logs_operations.py
index e9365eb7..f952ee62 100644
--- a/src/ahriman/core/database/operations/logs_operations.py
+++ b/src/ahriman/core/database/operations/logs_operations.py
@@ -66,13 +66,13 @@ class LogsOperations(Operations):
connection.execute(
"""
insert into logs
- (package_base, process_id, created, record)
+ (package_base, created, version, record)
values
- (:package_base, :process_id, :created, :record)
+ (:package_base, :created, :version, :record)
""",
{
"package_base": log_record_id.package_base,
- "process_id": log_record_id.process_id,
+ "version": log_record_id.version,
"created": created,
"record": record,
}
@@ -80,22 +80,22 @@ class LogsOperations(Operations):
return self.with_connection(run, commit=True)
- def logs_remove(self, package_base: str, current_process_id: int | None) -> None:
+ def logs_remove(self, package_base: str, version: str | None) -> None:
"""
remove log records for the specified package
Args:
package_base(str): package base to remove logs
- current_process_id(int | None): current process id. If set it will remove only logs belonging to another
- process
+ version(str): package version. If set it will remove only logs belonging to another
+ version
"""
def run(connection: Connection) -> None:
connection.execute(
"""
delete from logs
- where package_base = :package_base and (:process_id is null or process_id <> :process_id)
+ where package_base = :package_base and (:version is null or version <> :version)
""",
- {"package_base": package_base, "process_id": current_process_id}
+ {"package_base": package_base, "version": version}
)
return self.with_connection(run, commit=True)
diff --git a/src/ahriman/core/log/http_log_handler.py b/src/ahriman/core/log/http_log_handler.py
index 0b19dea1..f1826c1d 100644
--- a/src/ahriman/core/log/http_log_handler.py
+++ b/src/ahriman/core/log/http_log_handler.py
@@ -77,8 +77,8 @@ class HttpLogHandler(logging.Handler):
Args:
record(logging.LogRecord): log record to log
"""
- package_base = getattr(record, "package_base", None)
- if package_base is None:
+ log_record_id = getattr(record, "package_id", None)
+ if log_record_id is None:
return # in case if no package base supplied we need just skip log message
- self.reporter.package_logs(package_base, record)
+ self.reporter.package_logs(log_record_id, record)
diff --git a/src/ahriman/core/log/lazy_logging.py b/src/ahriman/core/log/lazy_logging.py
index feeedb4f..30d5692f 100644
--- a/src/ahriman/core/log/lazy_logging.py
+++ b/src/ahriman/core/log/lazy_logging.py
@@ -24,6 +24,8 @@ from collections.abc import Generator
from functools import cached_property
from typing import Any
+from ahriman.models.log_record_id import LogRecordId
+
class LazyLogging:
"""
@@ -60,38 +62,40 @@ class LazyLogging:
logging.setLogRecordFactory(logging.LogRecord)
@staticmethod
- def _package_logger_set(package_base: str) -> None:
+ def _package_logger_set(package_base: str, version: str | None) -> None:
"""
set package base as extra info to the logger
Args:
package_base(str): package base
+ version(str | None): package version if available
"""
current_factory = logging.getLogRecordFactory()
def package_record_factory(*args: Any, **kwargs: Any) -> logging.LogRecord:
record = current_factory(*args, **kwargs)
- record.package_base = package_base
+ record.package_id = LogRecordId(package_base, version or "")
return record
logging.setLogRecordFactory(package_record_factory)
@contextlib.contextmanager
- def in_package_context(self, package_base: str) -> Generator[None, None, None]:
+ def in_package_context(self, package_base: str, version: str | None) -> Generator[None, None, None]:
"""
execute function while setting package context
Args:
package_base(str): package base to set context in
+ version(str | None): package version if available
Examples:
This function is designed to be called as context manager with ``package_base`` argument, e.g.:
- >>> with self.in_package_context(package.base):
+ >>> with self.in_package_context(package.base, package.version):
>>> build_package(package)
"""
try:
- self._package_logger_set(package_base)
+ self._package_logger_set(package_base, version)
yield
finally:
self._package_logger_reset()
diff --git a/src/ahriman/core/repository/executor.py b/src/ahriman/core/repository/executor.py
index d22d4301..1a46d64e 100644
--- a/src/ahriman/core/repository/executor.py
+++ b/src/ahriman/core/repository/executor.py
@@ -93,7 +93,8 @@ class Executor(Cleaner):
result = Result()
for single in updates:
- with self.in_package_context(single.base), TemporaryDirectory(ignore_cleanup_errors=True) as dir_name:
+ with self.in_package_context(single.base, local_versions.get(single.base)), \
+ TemporaryDirectory(ignore_cleanup_errors=True) as dir_name:
try:
packager = self.packager(packagers, single.base)
build_single(single, Path(dir_name), packager.packager_id)
@@ -201,14 +202,16 @@ class Executor(Cleaner):
package_path = self.paths.repository / safe_filename(name)
self.repo.add(package_path)
- current_packages = self.packages()
+ current_packages = {package.base: package for package in self.packages()}
+ local_versions = {package_base: package.version for package_base, package in current_packages.items()}
+
removed_packages: list[str] = [] # list of packages which have been removed from the base
updates = self.load_archives(packages)
packagers = packagers or Packagers()
result = Result()
for local in updates:
- with self.in_package_context(local.base):
+ with self.in_package_context(local.base, local_versions.get(local.base)):
try:
packager = self.packager(packagers, local.base)
@@ -218,12 +221,9 @@ class Executor(Cleaner):
self.reporter.set_success(local)
result.add_success(local)
- current_package_archives = {
- package
- for current in current_packages
- if current.base == local.base
- for package in current.packages
- }
+ current_package_archives: set[str] = set()
+ if local.base in current_packages:
+ current_package_archives = set(current_packages[local.base].packages.keys())
removed_packages.extend(current_package_archives.difference(local.packages))
except Exception:
self.reporter.set_failed(local.base)
diff --git a/src/ahriman/core/repository/update_handler.py b/src/ahriman/core/repository/update_handler.py
index 95a91703..32f1ee01 100644
--- a/src/ahriman/core/repository/update_handler.py
+++ b/src/ahriman/core/repository/update_handler.py
@@ -66,10 +66,11 @@ class UpdateHandler(Cleaner):
continue
raise UnknownPackageError(package.base)
- result: list[Package] = []
+ local_versions = {package.base: package.version for package in self.packages()}
+ result: list[Package] = []
for local in self.packages():
- with self.in_package_context(local.base):
+ with self.in_package_context(local.base, local_versions.get(local.base)):
if not local.remote.is_remote:
continue # avoid checking local packages
if local.base in self.ignore_list:
@@ -102,11 +103,12 @@ class UpdateHandler(Cleaner):
Returns:
list[Package]: list of local packages which are out-of-dated
"""
- result: list[Package] = []
packages = {local.base: local for local in self.packages()}
+ local_versions = {package_base: package.version for package_base, package in packages.items()}
+ result: list[Package] = []
for cache_dir in self.paths.cache.iterdir():
- with self.in_package_context(cache_dir.name):
+ with self.in_package_context(cache_dir.name, local_versions.get(cache_dir.name)):
try:
source = RemoteSource(
source=PackageSource.Local,
diff --git a/src/ahriman/core/status/client.py b/src/ahriman/core/status/client.py
index ccecd794..6fea81be 100644
--- a/src/ahriman/core/status/client.py
+++ b/src/ahriman/core/status/client.py
@@ -24,6 +24,7 @@ import logging
from ahriman.core.configuration import Configuration
from ahriman.models.build_status import BuildStatus, BuildStatusEnum
from ahriman.models.internal_status import InternalStatus
+from ahriman.models.log_record_id import LogRecordId
from ahriman.models.package import Package
@@ -82,12 +83,12 @@ class Client:
del package_base
return []
- def package_logs(self, package_base: str, record: logging.LogRecord) -> None:
+ def package_logs(self, log_record_id: LogRecordId, record: logging.LogRecord) -> None:
"""
post log record
Args:
- package_base(str) package base
+ log_record_id(LogRecordId): log record id
record(logging.LogRecord): log record to post to api
"""
diff --git a/src/ahriman/core/status/watcher.py b/src/ahriman/core/status/watcher.py
index 285cff03..2ca9269a 100644
--- a/src/ahriman/core/status/watcher.py
+++ b/src/ahriman/core/status/watcher.py
@@ -17,8 +17,6 @@
# You should have received a copy of the GNU General Public License
# along with this program. If not, see .
#
-import os
-
from ahriman.core.configuration import Configuration
from ahriman.core.database import SQLite
from ahriman.core.exceptions import UnknownPackageError
@@ -59,7 +57,7 @@ class Watcher(LazyLogging):
self.status = BuildStatus()
# special variables for updating logs
- self._last_log_record_id = LogRecordId("", os.getpid())
+ self._last_log_record_id = LogRecordId("", "")
@property
def packages(self) -> list[tuple[Package, BuildStatus]]:
@@ -99,15 +97,15 @@ class Watcher(LazyLogging):
"""
return self.database.logs_get(package_base)
- def logs_remove(self, package_base: str, current_process_id: int | None) -> None:
+ def logs_remove(self, package_base: str, version: str | None) -> None:
"""
remove package related logs
Args:
package_base(str): package base
- current_process_id(int | None): current process id
+ version(str): package versio
"""
- self.database.logs_remove(package_base, current_process_id)
+ self.database.logs_remove(package_base, version)
def logs_update(self, log_record_id: LogRecordId, created: float, record: str) -> None:
"""
@@ -120,7 +118,7 @@ class Watcher(LazyLogging):
"""
if self._last_log_record_id != log_record_id:
# there is new log record, so we remove old ones
- self.logs_remove(log_record_id.package_base, log_record_id.process_id)
+ self.logs_remove(log_record_id.package_base, log_record_id.version)
self._last_log_record_id = log_record_id
self.database.logs_insert(log_record_id, created, record)
diff --git a/src/ahriman/core/status/web_client.py b/src/ahriman/core/status/web_client.py
index 0c6f9029..f88d6a78 100644
--- a/src/ahriman/core/status/web_client.py
+++ b/src/ahriman/core/status/web_client.py
@@ -33,6 +33,7 @@ from ahriman.core.status.client import Client
from ahriman.core.util import exception_response_text
from ahriman.models.build_status import BuildStatus, BuildStatusEnum
from ahriman.models.internal_status import InternalStatus
+from ahriman.models.log_record_id import LogRecordId
from ahriman.models.package import Package
from ahriman.models.user import User
@@ -253,20 +254,20 @@ class WebClient(Client, LazyLogging):
for package in response_json
]
- def package_logs(self, package_base: str, record: logging.LogRecord) -> None:
+ def package_logs(self, log_record_id: LogRecordId, record: logging.LogRecord) -> None:
"""
post log record
Args:
- package_base(str) package base
+ log_record_id(LogRecordId): log record id
record(logging.LogRecord): log record to post to api
"""
payload = {
"created": record.created,
"message": record.getMessage(),
- "process_id": record.process,
+ "version": log_record_id.version,
}
- self.make_request("POST", self._logs_url(package_base), json=payload)
+ self.make_request("POST", self._logs_url(log_record_id.package_base), json=payload)
def package_remove(self, package_base: str) -> None:
"""
diff --git a/src/ahriman/models/log_record_id.py b/src/ahriman/models/log_record_id.py
index 3e8a0905..876f2569 100644
--- a/src/ahriman/models/log_record_id.py
+++ b/src/ahriman/models/log_record_id.py
@@ -27,8 +27,8 @@ class LogRecordId:
Attributes:
package_base(str): package base for which log record belongs
- process_id(int): process id from which log record was emitted
+ version(str): package version for which log record belongs
"""
package_base: str
- process_id: int
+ version: str
diff --git a/src/ahriman/web/schemas/log_schema.py b/src/ahriman/web/schemas/log_schema.py
index 27fa09aa..a74dff3d 100644
--- a/src/ahriman/web/schemas/log_schema.py
+++ b/src/ahriman/web/schemas/log_schema.py
@@ -19,6 +19,8 @@
#
from marshmallow import Schema, fields
+from ahriman import __version__
+
class LogSchema(Schema):
"""
@@ -29,9 +31,9 @@ class LogSchema(Schema):
"description": "Log record timestamp",
"example": 1680537091.233495,
})
- process_id = fields.Integer(required=True, metadata={
- "description": "Current process id",
- "example": 42,
+ version = fields.Integer(required=True, metadata={
+ "description": "Package version to tag",
+ "example": __version__,
})
message = fields.String(required=True, metadata={
"description": "Log message",
diff --git a/src/ahriman/web/views/service/upload.py b/src/ahriman/web/views/service/upload.py
index 8c9ce544..0cb79e16 100644
--- a/src/ahriman/web/views/service/upload.py
+++ b/src/ahriman/web/views/service/upload.py
@@ -19,11 +19,11 @@
#
import aiohttp_apispec # type: ignore[import]
import shutil
-import tempfile
from aiohttp import BodyPartReader
from aiohttp.web import HTTPBadRequest, HTTPCreated, HTTPNotFound
from pathlib import Path
+from tempfile import NamedTemporaryFile
from ahriman.models.user_access import UserAccess
from ahriman.web.schemas import AuthSchema, ErrorSchema, FileSchema
@@ -68,7 +68,7 @@ class UploadView(BaseView):
# in order to handle errors automatically we create temporary file for long operation (transfer)
# and then copy it to valid location
- with tempfile.NamedTemporaryFile() as cache:
+ with NamedTemporaryFile() as cache:
while True:
chunk = await part.read_chunk()
if not chunk:
diff --git a/src/ahriman/web/views/status/logs.py b/src/ahriman/web/views/status/logs.py
index 8ad70c35..b7006f64 100644
--- a/src/ahriman/web/views/status/logs.py
+++ b/src/ahriman/web/views/status/logs.py
@@ -137,10 +137,10 @@ class LogsView(BaseView):
try:
created = data["created"]
record = data["message"]
- process_id = data["process_id"]
+ version = data["version"]
except Exception as e:
raise HTTPBadRequest(reason=str(e))
- self.service.logs_update(LogRecordId(package_base, process_id), created, record)
+ self.service.logs_update(LogRecordId(package_base, version), created, record)
raise HTTPNoContent()
diff --git a/tests/ahriman/core/database/migrations/test_m009_local_source.py b/tests/ahriman/core/database/migrations/test_m009_local_source.py
index 4c63ef3e..5d63d651 100644
--- a/tests/ahriman/core/database/migrations/test_m009_local_source.py
+++ b/tests/ahriman/core/database/migrations/test_m009_local_source.py
@@ -1,7 +1,7 @@
from ahriman.core.database.migrations.m009_local_source import steps
-def test_migration_packagers() -> None:
+def test_migration_local_source() -> None:
"""
migration must not be empty
"""
diff --git a/tests/ahriman/core/database/migrations/test_m010_version_based_logs_removal.py b/tests/ahriman/core/database/migrations/test_m010_version_based_logs_removal.py
new file mode 100644
index 00000000..6e702bcb
--- /dev/null
+++ b/tests/ahriman/core/database/migrations/test_m010_version_based_logs_removal.py
@@ -0,0 +1,8 @@
+from ahriman.core.database.migrations.m010_version_based_logs_removal import steps
+
+
+def test_migration_version_based_logs_removal() -> None:
+ """
+ migration must not be empty
+ """
+ assert steps
diff --git a/tests/ahriman/core/database/operations/test_logs_operations.py b/tests/ahriman/core/database/operations/test_logs_operations.py
index 4a609196..ee0a6922 100644
--- a/tests/ahriman/core/database/operations/test_logs_operations.py
+++ b/tests/ahriman/core/database/operations/test_logs_operations.py
@@ -8,11 +8,11 @@ def test_logs_insert_remove_process(database: SQLite, package_ahriman: Package,
"""
must clear process specific package logs
"""
- database.logs_insert(LogRecordId(package_ahriman.base, 1), 42.0, "message 1")
- database.logs_insert(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(LogRecordId(package_ahriman.base, "1"), 42.0, "message 1")
+ database.logs_insert(LogRecordId(package_ahriman.base, "2"), 43.0, "message 2")
+ database.logs_insert(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) == "[1970-01-01 00:00:42] message 1"
assert database.logs_get(package_python_schedule.base) == "[1970-01-01 00:00:42] message 3"
@@ -21,9 +21,9 @@ def test_logs_insert_remove_full(database: SQLite, package_ahriman: Package, pac
"""
must clear full package logs
"""
- database.logs_insert(LogRecordId(package_ahriman.base, 1), 42.0, "message 1")
- database.logs_insert(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(LogRecordId(package_ahriman.base, "1"), 42.0, "message 1")
+ database.logs_insert(LogRecordId(package_ahriman.base, "2"), 43.0, "message 2")
+ database.logs_insert(LogRecordId(package_python_schedule.base, "1"), 42.0, "message 3")
database.logs_remove(package_ahriman.base, None)
assert not database.logs_get(package_ahriman.base)
@@ -34,6 +34,6 @@ def test_logs_insert_get(database: SQLite, package_ahriman: Package) -> None:
"""
must insert and get package logs
"""
- database.logs_insert(LogRecordId(package_ahriman.base, 1), 43.0, "message 2")
- database.logs_insert(LogRecordId(package_ahriman.base, 1), 42.0, "message 1")
+ database.logs_insert(LogRecordId(package_ahriman.base, "1"), 43.0, "message 2")
+ database.logs_insert(LogRecordId(package_ahriman.base, "1"), 42.0, "message 1")
assert database.logs_get(package_ahriman.base) == "[1970-01-01 00:00:42] message 1\n[1970-01-01 00:00:43] message 2"
diff --git a/tests/ahriman/core/log/test_http_log_handler.py b/tests/ahriman/core/log/test_http_log_handler.py
index 340b33bc..e37ad4fd 100644
--- a/tests/ahriman/core/log/test_http_log_handler.py
+++ b/tests/ahriman/core/log/test_http_log_handler.py
@@ -4,6 +4,7 @@ from pytest_mock import MockerFixture
from ahriman.core.configuration import Configuration
from ahriman.core.log.http_log_handler import HttpLogHandler
+from ahriman.models.log_record_id import LogRecordId
from ahriman.models.package import Package
@@ -39,13 +40,13 @@ def test_emit(configuration: Configuration, log_record: logging.LogRecord, packa
"""
must emit log record to reporter
"""
- log_record.package_base = package_ahriman.base
+ log_record_id = log_record.package_id = LogRecordId(package_ahriman.base, package_ahriman.version)
log_mock = mocker.patch("ahriman.core.status.client.Client.package_logs")
handler = HttpLogHandler(configuration, report=False)
handler.emit(log_record)
- log_mock.assert_called_once_with(package_ahriman.base, log_record)
+ log_mock.assert_called_once_with(log_record_id, log_record)
def test_emit_skip(configuration: Configuration, log_record: logging.LogRecord, mocker: MockerFixture) -> None:
diff --git a/tests/ahriman/core/log/test_lazy_logging.py b/tests/ahriman/core/log/test_lazy_logging.py
index fd4e030d..81abe4f2 100644
--- a/tests/ahriman/core/log/test_lazy_logging.py
+++ b/tests/ahriman/core/log/test_lazy_logging.py
@@ -5,6 +5,7 @@ from pytest_mock import MockerFixture
from ahriman.core.alpm.repo import Repo
from ahriman.core.database import SQLite
+from ahriman.models.log_record_id import LogRecordId
from ahriman.models.package import Package
@@ -20,16 +21,16 @@ def test_package_logger_set_reset(database: SQLite) -> None:
"""
must set and reset package base attribute
"""
- package_base = "package base"
+ log_record_id = LogRecordId("base", "version")
- database._package_logger_set(package_base)
+ database._package_logger_set(log_record_id.package_base, log_record_id.version)
record = logging.makeLogRecord({})
- assert record.package_base == package_base
+ assert record.package_id == log_record_id
database._package_logger_reset()
record = logging.makeLogRecord({})
with pytest.raises(AttributeError):
- record.package_base
+ record.package_id
def test_in_package_context(database: SQLite, package_ahriman: Package, mocker: MockerFixture) -> None:
@@ -39,10 +40,24 @@ def test_in_package_context(database: SQLite, package_ahriman: Package, mocker:
set_mock = mocker.patch("ahriman.core.log.LazyLogging._package_logger_set")
reset_mock = mocker.patch("ahriman.core.log.LazyLogging._package_logger_reset")
- with database.in_package_context(package_ahriman.base):
+ with database.in_package_context(package_ahriman.base, package_ahriman.version):
pass
- set_mock.assert_called_once_with(package_ahriman.base)
+ set_mock.assert_called_once_with(package_ahriman.base, package_ahriman.version)
+ reset_mock.assert_called_once_with()
+
+
+def test_in_package_context_empty_version(database: SQLite, package_ahriman: Package, mocker: MockerFixture) -> None:
+ """
+ must set package log context
+ """
+ set_mock = mocker.patch("ahriman.core.log.LazyLogging._package_logger_set")
+ reset_mock = mocker.patch("ahriman.core.log.LazyLogging._package_logger_reset")
+
+ with database.in_package_context(package_ahriman.base, None):
+ pass
+
+ set_mock.assert_called_once_with(package_ahriman.base, None)
reset_mock.assert_called_once_with()
@@ -54,7 +69,7 @@ def test_in_package_context_failed(database: SQLite, package_ahriman: Package, m
reset_mock = mocker.patch("ahriman.core.log.LazyLogging._package_logger_reset")
with pytest.raises(Exception):
- with database.in_package_context(package_ahriman.base):
+ with database.in_package_context(package_ahriman.base, ""):
raise Exception()
reset_mock.assert_called_once_with()
diff --git a/tests/ahriman/core/status/test_client.py b/tests/ahriman/core/status/test_client.py
index f6c0c20a..ceb361fe 100644
--- a/tests/ahriman/core/status/test_client.py
+++ b/tests/ahriman/core/status/test_client.py
@@ -7,6 +7,7 @@ from ahriman.core.status.client import Client
from ahriman.core.status.web_client import WebClient
from ahriman.models.build_status import BuildStatus, BuildStatusEnum
from ahriman.models.internal_status import InternalStatus
+from ahriman.models.log_record_id import LogRecordId
from ahriman.models.package import Package
@@ -66,11 +67,11 @@ def test_package_get(client: Client, package_ahriman: Package) -> None:
assert client.package_get(None) == []
-def test_package_log(client: Client, package_ahriman: Package, log_record: logging.LogRecord) -> None:
+def test_package_logs(client: Client, package_ahriman: Package, log_record: logging.LogRecord) -> None:
"""
must process log record without errors
"""
- client.package_logs(package_ahriman.base, log_record)
+ client.package_logs(LogRecordId(package_ahriman.base, package_ahriman.version), log_record)
def test_package_remove(client: Client, package_ahriman: Package) -> None:
diff --git a/tests/ahriman/core/status/test_watcher.py b/tests/ahriman/core/status/test_watcher.py
index 1302b8cb..0053d29d 100644
--- a/tests/ahriman/core/status/test_watcher.py
+++ b/tests/ahriman/core/status/test_watcher.py
@@ -64,8 +64,8 @@ def test_logs_remove(watcher: Watcher, package_ahriman: Package, mocker: MockerF
must remove package logs
"""
logs_mock = mocker.patch("ahriman.core.database.SQLite.logs_remove")
- watcher.logs_remove(package_ahriman.base, 42)
- logs_mock.assert_called_once_with(package_ahriman.base, 42)
+ watcher.logs_remove(package_ahriman.base, "42")
+ logs_mock.assert_called_once_with(package_ahriman.base, "42")
def test_logs_update_new(watcher: Watcher, package_ahriman: Package, mocker: MockerFixture) -> None:
@@ -75,11 +75,11 @@ def test_logs_update_new(watcher: Watcher, package_ahriman: Package, mocker: Moc
delete_mock = mocker.patch("ahriman.core.status.watcher.Watcher.logs_remove")
insert_mock = mocker.patch("ahriman.core.database.SQLite.logs_insert")
- log_record_id = LogRecordId(package_ahriman.base, watcher._last_log_record_id.process_id)
+ log_record_id = LogRecordId(package_ahriman.base, watcher._last_log_record_id.version)
assert watcher._last_log_record_id != log_record_id
watcher.logs_update(log_record_id, 42.01, "log record")
- delete_mock.assert_called_once_with(package_ahriman.base, log_record_id.process_id)
+ delete_mock.assert_called_once_with(package_ahriman.base, log_record_id.version)
insert_mock.assert_called_once_with(log_record_id, 42.01, "log record")
assert watcher._last_log_record_id == log_record_id
@@ -92,7 +92,7 @@ def test_logs_update_update(watcher: Watcher, package_ahriman: Package, mocker:
delete_mock = mocker.patch("ahriman.core.status.watcher.Watcher.logs_remove")
insert_mock = mocker.patch("ahriman.core.database.SQLite.logs_insert")
- log_record_id = LogRecordId(package_ahriman.base, watcher._last_log_record_id.process_id)
+ log_record_id = LogRecordId(package_ahriman.base, watcher._last_log_record_id.version)
watcher._last_log_record_id = log_record_id
watcher.logs_update(log_record_id, 42.01, "log record")
diff --git a/tests/ahriman/core/status/test_web_client.py b/tests/ahriman/core/status/test_web_client.py
index ae47c7a9..b562bcbd 100644
--- a/tests/ahriman/core/status/test_web_client.py
+++ b/tests/ahriman/core/status/test_web_client.py
@@ -11,6 +11,7 @@ from ahriman.core.configuration import Configuration
from ahriman.core.status.web_client import WebClient
from ahriman.models.build_status import BuildStatus, BuildStatusEnum
from ahriman.models.internal_status import InternalStatus
+from ahriman.models.log_record_id import LogRecordId
from ahriman.models.package import Package
from ahriman.models.user import User
@@ -280,10 +281,10 @@ def test_package_logs(web_client: WebClient, log_record: logging.LogRecord, pack
payload = {
"created": log_record.created,
"message": log_record.getMessage(),
- "process_id": log_record.process,
+ "version": package_ahriman.version,
}
- web_client.package_logs(package_ahriman.base, log_record)
+ web_client.package_logs(LogRecordId(package_ahriman.base, package_ahriman.version), log_record)
requests_mock.assert_called_once_with("POST", pytest.helpers.anyvar(str, True),
params=None, json=payload, files=None)
@@ -295,7 +296,7 @@ def test_package_logs_failed(web_client: WebClient, log_record: logging.LogRecor
"""
mocker.patch("requests.Session.request", side_effect=Exception())
log_record.package_base = package_ahriman.base
- web_client.package_logs(package_ahriman.base, log_record)
+ web_client.package_logs(LogRecordId(package_ahriman.base, package_ahriman.version), log_record)
def test_package_logs_failed_http_error(web_client: WebClient, log_record: logging.LogRecord, package_ahriman: Package,
@@ -305,7 +306,7 @@ def test_package_logs_failed_http_error(web_client: WebClient, log_record: loggi
"""
mocker.patch("requests.Session.request", side_effect=requests.exceptions.HTTPError())
log_record.package_base = package_ahriman.base
- web_client.package_logs(package_ahriman.base, log_record)
+ web_client.package_logs(LogRecordId(package_ahriman.base, package_ahriman.version), log_record)
def test_package_remove(web_client: WebClient, package_ahriman: Package, mocker: MockerFixture) -> None:
diff --git a/tests/ahriman/web/views/service/test_views_service_upload.py b/tests/ahriman/web/views/service/test_views_service_upload.py
index 1e527ac9..87d36368 100644
--- a/tests/ahriman/web/views/service/test_views_service_upload.py
+++ b/tests/ahriman/web/views/service/test_views_service_upload.py
@@ -30,7 +30,7 @@ async def test_save_file(mocker: MockerFixture) -> None:
part_mock.filename = "filename"
part_mock.read_chunk = AsyncMock(side_effect=[b"content", None])
- tempfile_mock = mocker.patch("tempfile.NamedTemporaryFile")
+ tempfile_mock = mocker.patch("ahriman.web.views.service.upload.NamedTemporaryFile")
file_mock = MagicMock()
tempfile_mock.return_value.__enter__.return_value = file_mock
diff --git a/tests/ahriman/web/views/status/test_views_status_logs.py b/tests/ahriman/web/views/status/test_views_status_logs.py
index 67d37f5d..af36ec39 100644
--- a/tests/ahriman/web/views/status/test_views_status_logs.py
+++ b/tests/ahriman/web/views/status/test_views_status_logs.py
@@ -30,9 +30,9 @@ async def test_delete(client: TestClient, package_ahriman: Package, package_pyth
json={"status": BuildStatusEnum.Success.value, "package": package_python_schedule.view()})
await client.post(f"/api/v1/packages/{package_ahriman.base}/logs",
- json={"created": 42.0, "message": "message", "process_id": 42})
+ json={"created": 42.0, "message": "message", "version": "42"})
await client.post(f"/api/v1/packages/{package_python_schedule.base}/logs",
- json={"created": 42.0, "message": "message", "process_id": 42})
+ json={"created": 42.0, "message": "message", "version": "42"})
response = await client.delete(f"/api/v1/packages/{package_ahriman.base}/logs")
assert response.status == 204
@@ -53,7 +53,7 @@ async def test_get(client: TestClient, package_ahriman: Package) -> None:
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", "process_id": 42})
+ json={"created": 42.0, "message": "message", "version": "42"})
response_schema = pytest.helpers.schema_response(LogsView.get)
response = await client.get(f"/api/v1/packages/{package_ahriman.base}/logs")
@@ -83,7 +83,7 @@ async def test_post(client: TestClient, package_ahriman: Package) -> None:
json={"status": BuildStatusEnum.Success.value, "package": package_ahriman.view()})
request_schema = pytest.helpers.schema_request(LogsView.post)
- payload = {"created": 42.0, "message": "message", "process_id": 42}
+ payload = {"created": 42.0, "message": "message", "version": "42"}
assert not request_schema.validate(payload)
response = await client.post(f"/api/v1/packages/{package_ahriman.base}/logs", json=payload)
assert response.status == 204