Skip to content

Commit 572c9c0

Browse files
committed
feat: Add RBAC Entity Creator
1 parent 147ce90 commit 572c9c0

1 file changed

Lines changed: 51 additions & 0 deletions

File tree

  • src/ai/backend/manager/models/rbac_models
Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
import logging
2+
from abc import ABC
3+
from dataclasses import dataclass
4+
from typing import Any, override
5+
6+
from sqlalchemy.dialects.postgresql import insert as pg_insert
7+
from sqlalchemy.exc import IntegrityError
8+
from sqlalchemy.ext.asyncio import AsyncSession as SASession
9+
10+
from ai.backend.logging import BraceStyleAdapter
11+
from ai.backend.manager.data.permission.association_scopes_entities import (
12+
AssociationScopesEntitiesCreateInput,
13+
)
14+
from ai.backend.manager.data.permission.id import ObjectId, ScopeId
15+
from ai.backend.manager.models.rbac_models.association_scopes_entities import (
16+
AssociationScopesEntitiesRow,
17+
)
18+
from ai.backend.manager.types import Creator
19+
20+
log = BraceStyleAdapter(logging.getLogger(__name__))
21+
22+
23+
@dataclass
24+
class RBACCreator(Creator, ABC):
25+
scope_id: ScopeId
26+
entity_id: ObjectId
27+
28+
@override
29+
def fields_to_store(self) -> dict[str, Any]:
30+
return {
31+
"scope_id": self.scope_id,
32+
"entity_id": self.entity_id,
33+
}
34+
35+
async def create_rbac_row(self, db_session: SASession) -> None:
36+
creator = AssociationScopesEntitiesCreateInput(
37+
scope_id=self.scope_id,
38+
object_id=self.entity_id,
39+
)
40+
try:
41+
await db_session.execute(
42+
pg_insert(AssociationScopesEntitiesRow)
43+
.values(creator.fields_to_store())
44+
.on_conflict_do_nothing()
45+
)
46+
except IntegrityError:
47+
log.exception(
48+
"entity and scope mapping already exists: {}, {}. Skipping.",
49+
self.entity_id.to_str(),
50+
self.scope_id.to_str(),
51+
)

0 commit comments

Comments
 (0)