Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 8 additions & 0 deletions src/dstack/_internal/core/models/projects.py
Original file line number Diff line number Diff line change
Expand Up @@ -26,3 +26,11 @@ class Project(CoreModel):
backends: List[BackendInfo]
members: List[Member]
is_public: bool = False


class ProjectHookConfig(CoreModel):
"""
This class can be inherited to extend the project creation configuration passed to the hooks.
"""

pass
14 changes: 11 additions & 3 deletions src/dstack/_internal/server/services/projects.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,12 @@
)
from dstack._internal.core.backends.models import BackendInfo
from dstack._internal.core.errors import ForbiddenError, ResourceExistsError, ServerClientError
from dstack._internal.core.models.projects import Member, MemberPermissions, Project
from dstack._internal.core.models.projects import (
Member,
MemberPermissions,
Project,
ProjectHookConfig,
)
from dstack._internal.core.models.runs import RunStatus
from dstack._internal.core.models.users import GlobalRole, ProjectRole
from dstack._internal.server.models import (
Expand Down Expand Up @@ -120,6 +125,7 @@ async def create_project(
user: UserModel,
project_name: str,
is_public: bool = False,
config: Optional[ProjectHookConfig] = None,
) -> Project:
user_permissions = users.get_user_permissions(user)
if not user_permissions.can_create_projects:
Expand Down Expand Up @@ -147,7 +153,7 @@ async def create_project(
session=session, project_name=project_name
)
for hook in _CREATE_PROJECT_HOOKS:
await hook(session, project_model)
await hook(session, project_model, config)
# a hook may change project
session.expire(project_model)
project_model = await get_project_model_by_name_or_error(
Expand Down Expand Up @@ -609,7 +615,9 @@ def get_member_permissions(member_model: MemberModel) -> MemberPermissions:
_CREATE_PROJECT_HOOKS = []


def register_create_project_hook(func: Callable[[AsyncSession, ProjectModel], Awaitable[None]]):
def register_create_project_hook(
func: Callable[[AsyncSession, ProjectModel, Optional[ProjectHookConfig]], Awaitable[None]],
):
_CREATE_PROJECT_HOOKS.append(func)


Expand Down
Loading