Skip to content

Commit 2683af0

Browse files
jopemachineclaude
andcommitted
fix(BA-5982): replace ValueError with RevisionMissingModelVFolder (BA-400)
``DeploymentSessionDraftBuilder.build`` and ``_resolve_mounts`` were raising bare ``ValueError`` when ``model_mount_config.vfolder_id`` is ``None`` — a real reachable state, since ``deployment_revisions.model`` is a SET NULL FK that collapses to NULL when the backing vfolder row is deleted. Per the project rule, business-logic exceptions must inherit from ``BackendAIError``. Add ``RevisionMissingModelVFolder(BackendAIError, web.HTTPBadRequest)`` to ``manager/errors/deployment.py`` and switch both raise sites in ``deployment_draft_builder.py`` to use it. Other call sites that detect the same condition (``SessionValidationSpec.from_revision_spec`` / ``from_revision``, ``service._build_creator_from_revision_data``) already raise ``InvalidAPIParameters`` so they stay ``BackendAIError``-based and unchanged. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
1 parent e1cfed7 commit 2683af0

2 files changed

Lines changed: 26 additions & 2 deletions

File tree

src/ai/backend/manager/errors/deployment.py

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,29 @@ def error_code(self) -> ErrorCode:
6666
)
6767

6868

69+
class RevisionMissingModelVFolder(BackendAIError, web.HTTPBadRequest):
70+
"""A revision's model vfolder reference is null.
71+
72+
Raised when the draft / session pipeline reads a
73+
``ModelRevisionData`` whose ``model_mount_config.vfolder_id`` has
74+
collapsed to ``NULL`` because the backing vfolder row was deleted
75+
(``vfolders.id`` SET NULL FK on ``deployment_revisions.model``).
76+
The revision is preserved for history, but no new session can be
77+
spawned from it until a new revision pointing at a live model
78+
vfolder takes over.
79+
"""
80+
81+
error_type = "https://api.backend.ai/probs/revision-missing-model-vfolder"
82+
error_title = "Deployment revision has no model vfolder."
83+
84+
def error_code(self) -> ErrorCode:
85+
return ErrorCode(
86+
domain=ErrorDomain.MODEL_SERVICE,
87+
operation=ErrorOperation.READ,
88+
error_detail=ErrorDetail.INVALID_PARAMETERS,
89+
)
90+
91+
6992
class RevisionNotDeployable(BackendAIError, web.HTTPConflict):
7093
"""A revision references resources that no longer exist.
7194

src/ai/backend/manager/sokovan/deployment/deployment_draft_builder.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@
4444
ResourceOpts,
4545
SessionHandlerOptions,
4646
)
47+
from ai.backend.manager.errors.deployment import RevisionMissingModelVFolder
4748
from ai.backend.manager.repositories.scheduler.types.session_creation import DeploymentContext
4849

4950

@@ -76,7 +77,7 @@ def build(
7677
model_definition_payload = cls._model_definition_payload(target_revision, context)
7778

7879
if target_revision.model_mount_config.vfolder_id is None:
79-
raise ValueError(
80+
raise RevisionMissingModelVFolder(
8081
f"Revision {target_revision.id} has no model vfolder; cannot build session draft"
8182
)
8283

@@ -152,7 +153,7 @@ def _resolve_mounts(
152153
# Model vfolder is always first (READ_ONLY), extra mounts follow
153154
# with their frozen permissions already on each entry.
154155
if target_revision.model_mount_config.vfolder_id is None:
155-
raise ValueError(
156+
raise RevisionMissingModelVFolder(
156157
f"Revision {target_revision.id} has no model vfolder; cannot build mount entries"
157158
)
158159
return (

0 commit comments

Comments
 (0)