Files
cleveragents-core/benchmarks/resource_repository_bench.py
T
Jeffrey Phillips Freeman 36c571db83
CI / lint (pull_request) Successful in 15s
CI / typecheck (pull_request) Successful in 30s
CI / security (pull_request) Successful in 22s
CI / quality (pull_request) Successful in 16s
CI / integration_tests (pull_request) Successful in 5m12s
CI / build (pull_request) Successful in 16s
CI / lint (push) Successful in 13s
CI / typecheck (push) Successful in 29s
CI / security (push) Successful in 23s
CI / quality (push) Successful in 16s
CI / unit_tests (pull_request) Successful in 13m42s
CI / integration_tests (push) Successful in 4m53s
CI / build (push) Successful in 16s
CI / unit_tests (push) Successful in 15m9s
CI / coverage (pull_request) Successful in 7m58s
CI / coverage (push) Successful in 8m14s
CI / docker (pull_request) Successful in 9s
CI / docker (push) Successful in 8s
feat(repo): add resource repositories
2026-02-16 21:35:54 +00:00

213 lines
6.0 KiB
Python

"""ASV benchmarks for resource repository operations."""
from datetime import UTC, datetime
def _setup_db():
"""Create an in-memory database with schema and return session factory."""
from sqlalchemy import create_engine, event
from sqlalchemy.orm import sessionmaker
from cleveragents.infrastructure.database.models import Base
engine = create_engine("sqlite:///:memory:")
@event.listens_for(engine, "connect")
def _fk(conn, _rec):
conn.cursor().execute("PRAGMA foreign_keys=ON")
Base.metadata.create_all(engine)
return sessionmaker(bind=engine)
def _seed_type(rt_repo, name="bench/seed-type"):
"""Seed a resource type for benchmarks."""
from cleveragents.domain.models.core.resource_type import (
ResourceKind,
ResourceTypeSpec,
SandboxStrategy,
)
spec = ResourceTypeSpec(
name=name,
description="Bench type",
resource_kind=ResourceKind.PHYSICAL,
sandbox_strategy=SandboxStrategy.NONE,
user_addable=True,
cli_args=[],
parent_types=[],
child_types=[],
auto_discovery=None,
equivalence=None,
handler=None,
capabilities={
"read": True,
"write": True,
"sandbox": True,
"checkpoint": False,
},
built_in=False,
)
rt_repo.create(spec)
return spec
_CB32 = "0123456789ABCDEFGHJKMNPQRSTVWXYZ"
_BENCH_CTR = 0
def _bench_ulid():
global _BENCH_CTR
_BENCH_CTR += 1
n = _BENCH_CTR
suffix = ""
for _ in range(8):
suffix = _CB32[n % 32] + suffix
n //= 32
return f"01HGZ6FE0AQDYTR4BX{suffix}"
class TimeResourceTypeCreate:
"""Benchmark ResourceTypeRepository.create() throughput."""
def setup(self):
from cleveragents.infrastructure.database.repositories import (
ResourceTypeRepository,
)
self.factory = _setup_db()
self.repo = ResourceTypeRepository(self.factory)
self._counter = 0
def time_create_resource_type(self):
from cleveragents.domain.models.core.resource_type import (
ResourceKind,
ResourceTypeSpec,
SandboxStrategy,
)
self._counter += 1
spec = ResourceTypeSpec(
name=f"bench/type-{self._counter}",
description="Bench",
resource_kind=ResourceKind.PHYSICAL,
sandbox_strategy=SandboxStrategy.NONE,
user_addable=True,
cli_args=[],
parent_types=[],
child_types=[],
auto_discovery=None,
equivalence=None,
handler=None,
capabilities={
"read": True,
"write": True,
"sandbox": True,
"checkpoint": False,
},
built_in=False,
)
self.repo.create(spec)
class TimeResourceTypeList:
"""Benchmark ResourceTypeRepository.list_types() throughput."""
def setup(self):
from cleveragents.infrastructure.database.repositories import (
ResourceTypeRepository,
)
self.factory = _setup_db()
self.repo = ResourceTypeRepository(self.factory)
for i in range(50):
_seed_type(self.repo, name=f"bench/list-type-{i}")
def time_list_all_types(self):
self.repo.list_types()
def time_list_by_namespace(self):
self.repo.list_types(namespace="bench")
class TimeResourceCreate:
"""Benchmark ResourceRepository.create() throughput."""
def setup(self):
from cleveragents.infrastructure.database.repositories import (
ResourceRepository,
ResourceTypeRepository,
)
self.factory = _setup_db()
self.rt_repo = ResourceTypeRepository(self.factory)
self.res_repo = ResourceRepository(self.factory)
_seed_type(self.rt_repo)
self._counter = 0
def time_create_resource(self):
from cleveragents.domain.models.core.resource import (
PhysVirt,
Resource,
ResourceCapabilities,
)
self._counter += 1
res = Resource(
resource_id=_bench_ulid(),
name=f"bench/res-{self._counter}",
resource_type_name="bench/seed-type",
classification=PhysVirt.PHYSICAL,
description="Bench resource",
properties={},
location="/tmp/bench",
content_hash=None,
sandbox_strategy=None,
capabilities=ResourceCapabilities(),
created_at=datetime.now(tz=UTC),
updated_at=datetime.now(tz=UTC),
)
self.res_repo.create(res)
class TimeResourceResolve:
"""Benchmark ResourceRepository.resolve_namespaced_name() throughput."""
def setup(self):
from cleveragents.domain.models.core.resource import (
PhysVirt,
Resource,
ResourceCapabilities,
)
from cleveragents.infrastructure.database.repositories import (
ResourceRepository,
ResourceTypeRepository,
)
self.factory = _setup_db()
self.rt_repo = ResourceTypeRepository(self.factory)
self.res_repo = ResourceRepository(self.factory)
_seed_type(self.rt_repo)
self.ulid = _bench_ulid()
res = Resource(
resource_id=self.ulid,
name="bench/resolve-target",
resource_type_name="bench/seed-type",
classification=PhysVirt.PHYSICAL,
description="Resolve target",
properties={},
location="/tmp/bench",
content_hash=None,
sandbox_strategy=None,
capabilities=ResourceCapabilities(),
created_at=datetime.now(tz=UTC),
updated_at=datetime.now(tz=UTC),
)
self.res_repo.create(res)
def time_resolve_by_name(self):
self.res_repo.resolve_namespaced_name("bench/resolve-target")
def time_resolve_by_ulid(self):
self.res_repo.resolve_namespaced_name(self.ulid)