feat(BA-5737): add RBAC-enforced VFolder create mutations#11139
feat(BA-5737): add RBAC-enforced VFolder create mutations#11139
Conversation
There was a problem hiding this comment.
Pull request overview
Adds a project-scoped mutation surface for vfolder v2 so project admin flows can create/delete vfolders via PROJECT-scoped RBAC (consistent with the existing projectVfolders query).
Changes:
- Introduce PROJECT-scoped vfolder actions (
Create/Delete/BulkDelete*InProject) and wire them throughScopeActionProcessorusing scope RBAC validators. - Expose new GraphQL mutations (
createProjectVfolderV2,deleteProjectVfolderV2,bulkDeleteProjectVfoldersV2) backed by the new adapter methods. - Add unit/component test coverage for delete/bulk-delete project-scoped paths and service routing.
Reviewed changes
Copilot reviewed 13 out of 13 changed files in this pull request and generated 4 comments.
Show a summary per file
| File | Description |
|---|---|
| tests/unit/manager/services/vfolder/test_vfolder_in_project_service.py | Unit tests for service delegation and project membership checks. |
| tests/component/vfolder_v2/test_vfolder_project_mutations.py | Component tests exercising RBAC + service behavior for project-scoped deletes. |
| src/ai/backend/manager/services/vfolder/services/vfolder.py | Adds create_in_project, delete_in_project, bulk_delete_in_project service methods. |
| src/ai/backend/manager/services/vfolder/processors/vfolder.py | Registers new PROJECT-scoped action processors and supported action specs. |
| src/ai/backend/manager/services/vfolder/actions/vfolder_in_project.py | New PROJECT-scoped action/result dataclasses for create/delete/bulk-delete. |
| src/ai/backend/manager/api/gql/vfolder_v2/resolver/mutation.py | Adds new GraphQL mutations for project-scoped create/delete/bulk-delete. |
| src/ai/backend/manager/api/gql/vfolder_v2/resolver/init.py | Exports the new mutation resolvers. |
| src/ai/backend/manager/api/gql/vfolder_v2/init.py | Re-exports new vfolder v2 mutations for schema wiring. |
| src/ai/backend/manager/api/gql/schema.py | Adds new mutation fields to the GraphQL Mutation type. |
| src/ai/backend/manager/api/adapters/vfolder.py | Adds adapter entrypoints that dispatch project-scoped actions to processors. |
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
c8a7a42 to
14fd0ed
Compare
|
I remembered there was a discussion about not using VFolderV2 in GraphQL because it would interfere with the agentic workflow. |
e2e94f0 to
6021bea
Compare
6021bea to
82bb6c1
Compare
cb815be to
eb22e8e
Compare
638554d to
3de71a7
Compare
a95a4d9 to
9e1e8e9
Compare
| self, action: CreateVFolderInProjectAction | ||
| ) -> CreateVFolderInProjectActionResult: | ||
| """Create a vfolder owned by a project. |
There was a problem hiding this comment.
This function works same as create_v2() except permission check
5f76a19 to
2e5bb7c
Compare
69e108d to
e3e1065
Compare
6968641 to
bb99e05
Compare
|
PR title seems outdated |
| """ | ||
| Added in UNRELEASED. Create a virtual folder owned by the specified project. Requires project-scoped CREATE permission. | ||
| """ | ||
| createProjectVFolder(projectId: UUID!, input: CreateVFolderV2Input!): CreateVFolderV2Payload! @join__field(graph: STRAWBERRY) |
There was a problem hiding this comment.
VFolderV2 is still included
There was a problem hiding this comment.
CreateVFolderV2Input is an existing type, not a new one
Add createProjectVFolder GraphQL mutation, REST POST endpoint, SDK method, and CLI command for creating vfolders within a project scope. Uses ScopeActionProcessor + scope_rbac_validators. Independent create_in_project() service — no legacy UserRole gate. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Co-authored-by: octodog <mu001@lablup.com>
499eb4c to
305e551
Compare
| """ | ||
| Added in UNRELEASED. Create a virtual folder owned by the specified project. Requires project-scoped CREATE permission. | ||
| """ | ||
| createProjectVFolder(projectId: UUID!, input: CreateVFolderV2Input!): CreateVFolderV2Payload! |
There was a problem hiding this comment.
It seems there’s already a mutation that uses CreateVFolderV2Input; please check that. Since the projectId value is already included, it feels like we’re setting a duplicate field.
Summary
createProjectVfolderV2GraphQL mutations so project admin flows have a consistent project-scoped mutation surface alongside the existingprojectVfoldersquery.Test plan
pants fmt :: && pants fix :: && pants lint --changed-since=origin/main— greenResolves BA-5737
📚 Documentation preview 📚: https://sorna--11139.org.readthedocs.build/en/11139/
📚 Documentation preview 📚: https://sorna-ko--11139.org.readthedocs.build/ko/11139/