Skip to content

Commit e1cfed7

Browse files
jopemachineclaude
andcommitted
refactor(BA-5982): drop deployment_revision adapter split
Roll back the dedicated ``DeploymentRevisionAdapter`` introduced earlier in this PR. Adapter / handler / processor for the bulk admin refresh all live back inside the single ``deployment`` slice; the service-side helper ``_build_creator_from_revision_data`` and the inline ``admin_refresh_deployment_revisions`` loop are restored to their pre-split form, and ``RefreshDeploymentRevisionsAction`` returns to the no-arg shape that triggers the service to do the whole sweep on its own. ``DeploymentAdapter`` is again the single owner of revision-side adapter methods including ``admin_refresh_deployment_revisions``; the GQL resolver and REST handler call it directly with no extra ``revision_adapter`` injection. Other refactor work in this PR (``from_spec`` → ``from_revision_spec``, ``replica_counts`` → ``replica``, the ``ModelRevisionData.deployment_id`` field, the Spec/Data split, the ``revision_number`` exposure) is unaffected. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
1 parent 7d64993 commit e1cfed7

10 files changed

Lines changed: 128 additions & 219 deletions

File tree

src/ai/backend/manager/api/adapters/deployment/adapter.py

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,7 @@
6767
AccessTokenNode,
6868
ActivateRevisionPayload,
6969
AddRevisionPayload,
70+
AdminRefreshDeploymentRevisionsPayload,
7071
AdminSearchDeploymentsPayload,
7172
AdminSearchRevisionsPayload,
7273
AutoScalingRuleNode,
@@ -86,6 +87,7 @@
8687
ReplaceDeploymentOptionsPayload,
8788
ReplicaNode,
8889
RevisionNode,
90+
RevisionRefreshResultInfo,
8991
RouteNode,
9092
SearchAccessTokensPayload,
9193
SearchAutoScalingRulesPayload,
@@ -295,6 +297,9 @@
295297
from ai.backend.manager.services.deployment.actions.model_revision.search_revisions import (
296298
SearchRevisionsAction,
297299
)
300+
from ai.backend.manager.services.deployment.actions.refresh_deployment_revisions import (
301+
RefreshDeploymentRevisionsAction,
302+
)
298303
from ai.backend.manager.services.deployment.actions.replace_deployment_options import (
299304
ReplaceDeploymentOptionsAction,
300305
)
@@ -780,6 +785,27 @@ async def activate_revision(self, input: ActivateRevisionInput) -> ActivateRevis
780785
deployment_policy=self._policy_data_to_dto(action_result.deployment_policy),
781786
)
782787

788+
async def admin_refresh_deployment_revisions(
789+
self,
790+
) -> AdminRefreshDeploymentRevisionsPayload:
791+
"""Create and activate a fresh revision for every active deployment."""
792+
action_result = (
793+
await self._processors.deployment.admin_refresh_deployment_revisions.wait_for_complete(
794+
RefreshDeploymentRevisionsAction()
795+
)
796+
)
797+
return AdminRefreshDeploymentRevisionsPayload(
798+
results=[
799+
RevisionRefreshResultInfo(
800+
deployment_id=r.deployment_id,
801+
new_revision_id=r.new_revision_id,
802+
success=r.success,
803+
failure_reason=r.failure_reason,
804+
)
805+
for r in action_result.results
806+
]
807+
)
808+
783809
async def delete(self, input: DeleteDeploymentInput) -> DeleteDeploymentPayload:
784810
"""Delete a deployment."""
785811
await self._processors.deployment.destroy_deployment.wait_for_complete(

src/ai/backend/manager/api/adapters/deployment_revision/__init__.py

Whitespace-only changes.

src/ai/backend/manager/api/adapters/deployment_revision/adapter.py

Lines changed: 0 additions & 154 deletions
This file was deleted.

src/ai/backend/manager/api/adapters/registry.py

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -11,9 +11,6 @@
1111
from ai.backend.manager.api.adapters.audit_log.adapter import AuditLogAdapter
1212
from ai.backend.manager.api.adapters.container_registry.adapter import ContainerRegistryAdapter
1313
from ai.backend.manager.api.adapters.deployment.adapter import DeploymentAdapter
14-
from ai.backend.manager.api.adapters.deployment_revision.adapter import (
15-
DeploymentRevisionAdapter,
16-
)
1714
from ai.backend.manager.api.adapters.deployment_revision_preset.adapter import (
1815
DeploymentRevisionPresetAdapter,
1916
)
@@ -81,7 +78,6 @@ def __init__(
8178
audit_log: AuditLogAdapter,
8279
container_registry: ContainerRegistryAdapter,
8380
deployment: DeploymentAdapter,
84-
deployment_revision: DeploymentRevisionAdapter,
8581
domain: DomainAdapter,
8682
fair_share: FairShareAdapter,
8783
huggingface_registry: HuggingFaceRegistryAdapter,
@@ -123,7 +119,6 @@ def __init__(
123119
self.audit_log = audit_log
124120
self.container_registry = container_registry
125121
self.deployment = deployment
126-
self.deployment_revision = deployment_revision
127122
self.domain = domain
128123
self.fair_share = fair_share
129124
self.huggingface_registry = huggingface_registry
@@ -184,7 +179,6 @@ def create(
184179
audit_log=AuditLogAdapter(processors),
185180
container_registry=ContainerRegistryAdapter(processors),
186181
deployment=DeploymentAdapter(processors, deployment_coordinator),
187-
deployment_revision=DeploymentRevisionAdapter(processors),
188182
domain=DomainAdapter(processors),
189183
fair_share=FairShareAdapter(processors),
190184
huggingface_registry=HuggingFaceRegistryAdapter(processors),

src/ai/backend/manager/api/gql/deployment/resolver/deployment.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -289,7 +289,7 @@ async def admin_refresh_deployment_revisions(
289289
info: Info[StrawberryGQLContext],
290290
) -> AdminRefreshDeploymentRevisionsPayload | None:
291291
check_admin_only()
292-
payload = await info.context.adapters.deployment_revision.admin_refresh_deployment_revisions()
292+
payload = await info.context.adapters.deployment.admin_refresh_deployment_revisions()
293293
return AdminRefreshDeploymentRevisionsPayload(
294294
results=[
295295
RevisionRefreshResult(

src/ai/backend/manager/api/rest/v2/deployment/handler.py

Lines changed: 2 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -61,24 +61,15 @@
6161

6262
if TYPE_CHECKING:
6363
from ai.backend.manager.api.adapters.deployment.adapter import DeploymentAdapter
64-
from ai.backend.manager.api.adapters.deployment_revision.adapter import (
65-
DeploymentRevisionAdapter,
66-
)
6764

6865
log: Final = BraceStyleAdapter(logging.getLogger(__spec__.name))
6966

7067

7168
class V2DeploymentHandler:
7269
"""REST v2 handler for deployment operations."""
7370

74-
def __init__(
75-
self,
76-
*,
77-
adapter: DeploymentAdapter,
78-
revision_adapter: DeploymentRevisionAdapter,
79-
) -> None:
71+
def __init__(self, *, adapter: DeploymentAdapter) -> None:
8072
self._adapter = adapter
81-
self._revision_adapter = revision_adapter
8273

8374
# ------------------------------------------------------------------
8475
# Core deployment CRUD
@@ -277,7 +268,7 @@ async def sync_replicas(
277268

278269
async def admin_refresh_deployment_revisions(self) -> APIResponse:
279270
"""Rebuild and activate a fresh revision for every active deployment."""
280-
result = await self._revision_adapter.admin_refresh_deployment_revisions()
271+
result = await self._adapter.admin_refresh_deployment_revisions()
281272
return APIResponse.build(status_code=HTTPStatus.OK, response_model=result)
282273

283274
# ------------------------------------------------------------------

src/ai/backend/manager/api/rest/v2/tree.py

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -122,10 +122,7 @@ def build_v2_routes(
122122
artifact_registry_handler = V2ArtifactRegistryHandler(adapter=adapters.artifact_registry)
123123
audit_log_handler = V2AuditLogHandler(adapter=adapters.audit_log)
124124
container_registry_handler = V2ContainerRegistryHandler(adapter=adapters.container_registry)
125-
deployment_handler = V2DeploymentHandler(
126-
adapter=adapters.deployment,
127-
revision_adapter=adapters.deployment_revision,
128-
)
125+
deployment_handler = V2DeploymentHandler(adapter=adapters.deployment)
129126
domain_handler = V2DomainHandler(adapter=adapters.domain)
130127
fair_share_handler = V2FairShareHandler(adapter=adapters.fair_share)
131128
huggingface_registry_handler = V2HuggingFaceRegistryHandler(

src/ai/backend/manager/services/deployment/actions/refresh_deployment_revisions.py

Lines changed: 5 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,28 +1,20 @@
1-
from collections.abc import Mapping
21
from dataclasses import dataclass, field
32
from typing import override
43

5-
from ai.backend.common.identifier.deployment import DeploymentID
64
from ai.backend.manager.actions.action import BaseActionResult
75
from ai.backend.manager.actions.types import ActionOperationType
8-
from ai.backend.manager.data.deployment.creator import ModelRevisionCreator
96
from ai.backend.manager.data.deployment.types import RevisionRefreshResult
107
from ai.backend.manager.services.deployment.actions.base import DeploymentBaseAction
118

129

1310
@dataclass
1411
class RefreshDeploymentRevisionsAction(DeploymentBaseAction):
15-
"""Admin-only batch action that adds and activates a fresh revision for
16-
each deployment in ``creators_by_id``.
17-
18-
The adapter layer is responsible for projecting each previous-revision
19-
``ModelRevisionData`` onto a ``ModelRevisionCreator`` before invoking
20-
this action; the service does no type conversion of its own. Each
21-
deployment is processed independently so a single failure does not
22-
abort the rest (partial success by design).
23-
"""
12+
"""Admin-only action to refresh revisions for all active deployments.
2413
25-
creators_by_id: Mapping[DeploymentID, ModelRevisionCreator]
14+
Creates a new revision based on each active deployment's current revision
15+
and activates it, allowing DeploymentController to re-resolve preset,
16+
deployment-config, and model_definition.
17+
"""
2618

2719
@override
2820
def entity_id(self) -> str | None:

src/ai/backend/manager/services/deployment/processors.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -183,7 +183,7 @@ class DeploymentProcessors(AbstractProcessorPackage):
183183
SearchRevisionResourceSlotsAction, SearchRevisionResourceSlotsActionResult
184184
]
185185
activate_revision: ActionProcessor[ActivateRevisionAction, ActivateRevisionActionResult]
186-
refresh_deployment_revisions: ActionProcessor[
186+
admin_refresh_deployment_revisions: ActionProcessor[
187187
RefreshDeploymentRevisionsAction, RefreshDeploymentRevisionsActionResult
188188
]
189189

@@ -273,8 +273,8 @@ def __init__(
273273
service.search_revision_resource_slots, action_monitors
274274
)
275275
self.activate_revision = ActionProcessor(service.activate_revision, action_monitors)
276-
self.refresh_deployment_revisions = ActionProcessor(
277-
service.refresh_deployment_revisions, action_monitors
276+
self.admin_refresh_deployment_revisions = ActionProcessor(
277+
service.admin_refresh_deployment_revisions, action_monitors
278278
)
279279

280280
# Route operations

0 commit comments

Comments
 (0)