tenant_quotas.py 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. from datetime import datetime
  2. from typing import ClassVar, List, Optional
  3. from sqlalchemy import BigInteger
  4. from sqlmodel import (
  5. Column,
  6. Field,
  7. ForeignKey,
  8. Integer,
  9. SQLModel,
  10. UniqueConstraint,
  11. )
  12. from gpustack.mixins import BaseModelMixin
  13. from gpustack.schemas.common import ListParams, PaginatedList
  14. class TenantQuotaUpdate(SQLModel):
  15. gpu: Optional[int] = Field(default=None, ge=0)
  16. cpu_milli: Optional[int] = Field(default=None, ge=0)
  17. memory_bytes: Optional[int] = Field(
  18. default=None, sa_column=Column(BigInteger, nullable=True)
  19. )
  20. gpu_instance: Optional[int] = Field(default=None, ge=0)
  21. class TenantQuotaBase(TenantQuotaUpdate):
  22. cluster_id: int = Field(
  23. sa_column=Column(
  24. Integer,
  25. ForeignKey("clusters.id", ondelete="CASCADE"),
  26. nullable=False,
  27. ),
  28. )
  29. owner_principal_id: int = Field(
  30. sa_column=Column(
  31. Integer,
  32. ForeignKey("principals.id", ondelete="CASCADE"),
  33. nullable=False,
  34. ),
  35. )
  36. class TenantQuota(TenantQuotaBase, BaseModelMixin, table=True):
  37. __tablename__ = 'tenant_quotas'
  38. __table_args__ = (
  39. UniqueConstraint(
  40. 'cluster_id', 'owner_principal_id', name='uix_tenant_quota_cluster_org'
  41. ),
  42. )
  43. id: Optional[int] = Field(default=None, primary_key=True)
  44. class TenantQuotaListParams(ListParams):
  45. cluster_id: Optional[int] = None
  46. owner_principal_id: Optional[int] = None
  47. sortable_fields: ClassVar[List[str]] = [
  48. "cluster_id",
  49. "owner_principal_id",
  50. "created_at",
  51. "updated_at",
  52. ]
  53. class TenantQuotaPublic(TenantQuotaBase):
  54. id: int
  55. created_at: datetime
  56. updated_at: datetime
  57. TenantQuotasPublic = PaginatedList[TenantQuotaPublic]