feat(BA-6006): Add resource slot validation when creating deployment revision#11580
Conversation
There was a problem hiding this comment.
Pull request overview
Adds an explicit deployment-revision validation layer so revision creation fails fast when required resource slots (from resource_slot_types.required) are missing or zero, preventing “dead revisions” and related orphan states before persistence.
Changes:
- Introduces a deployment revision validator framework (
DeploymentRevisionValidator+ rule base + context) with dual entry points for v2 vs legacy spec shapes. - Adds
RequiredResourceSlotRuleand wires it into deployment revision creation flows (add_revision,build_creator_from_legacy_draft,resolve_legacy_revision_spec). - Adds repository/DBSource support to fetch globally required slot names and includes unit tests + changelog entry.
Reviewed changes
Copilot reviewed 8 out of 8 changed files in this pull request and generated no comments.
Show a summary per file
| File | Description |
|---|---|
tests/unit/manager/sokovan/deployment/test_revision_validators.py |
Adds unit tests covering required-slot enforcement for both v2 and legacy validator entry points. |
src/ai/backend/manager/sokovan/deployment/validators/required_resource_slot_rule.py |
Implements the required resource-slot rule for deployment revision specs. |
src/ai/backend/manager/sokovan/deployment/validators/deployment_revision_base.py |
Adds the validator chain, rule interface, and validation context for deployment revisions. |
src/ai/backend/manager/sokovan/deployment/validators/__init__.py |
Exposes the new validator components via package exports. |
src/ai/backend/manager/sokovan/deployment/deployment_controller.py |
Wires revision validation into v2 and legacy revision creation/resolve paths; builds validation context per call site. |
src/ai/backend/manager/repositories/deployment/repository.py |
Adds repository method to fetch globally required slot names for revision validation. |
src/ai/backend/manager/repositories/deployment/db_source/db_source.py |
Implements DB query to retrieve required slot names from resource_slot_types.required. |
changes/11580.feature.md |
Adds release note entry for the new revision creation validation. |
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
| context: DeploymentRevisionValidationContext, | ||
| ) -> None: | ||
| self._check_resource_slots( | ||
| ResourceSlot(spec.resource_spec.resource_slots), |
There was a problem hiding this comment.
I would like the type conversion to occur at the time of the initial input.
There was a problem hiding this comment.
Since the type of resource_slots in the existing ResourceSpec is Mapping[str, Any], modifying this part as well would likely make the scope too broad.
Replace concrete frozenset[]/tuple[] type annotations on the revision validator chain with abstract Iterable/Sequence so callers are not locked into specific concrete containers. Runtime values stay frozenset for the required slot names and tuple for the rule chain. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Summary
DeploymentRevisionValidatorchain (sokovan/deployment/validators/) withRequiredResourceSlotRulemirroring PR feat(BA-5999): Validate session spec includes required resource slots in session creation #11556's session-side rule, so deployment revision creation fails fast withInvalidAPIParameterswhen the finalized revision spec omits a globally required resource slot.validate(spec: DeploymentRevisionCreatorSpec, ctx)for v2add_revision, andvalidate_legacy_revision_spec(spec: ModelRevisionSpec, ctx)forbuild_creator_from_legacy_draft/resolve_legacy_revision_spec. Both entries are abstract on the rule base class so new rules must wire both paths.fetch_revision_required_slot_namesonDeploymentRepository/DeploymentDBSourcereadsresource_slot_types.required; the controller assemblesDeploymentRevisionValidationContextonce per call site.scheduling_controller._spec_validator(added in feat(BA-5999): Validate session spec includes required resource slots in session creation #11556) stays in place to cover non-revision session paths.Test plan
tests/unit/manager/sokovan/deployment/test_revision_validators.pypass.add_revision: 4xx returned and no row written when a required slot is missing.build_creator_from_legacy_draft): 4xx returned before endpoint creation when a required slot is missing.resolve_legacy_revision_spec: 4xx returned before returning the spec when a required slot is missing.Resolves BA-6006