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
213 lines
6.0 KiB
Python
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)
|