Skip to content

Commit ca18385

Browse files
committed
refactor(BA-5815): switch Policy GQL surface to id-keyed update/purge
Track BA-5814 DTO refactor: • Split AdminAppConfigPolicyItemInputGQL into Create / Update variants (per review on PR #11269 — extensibility for diverging fields). • AdminBulkPurgeAppConfigPolicyInputGQL now takes ids: list[UUID]. • AdminBulkPurgeAppConfigPoliciesPayloadGQL exposes purgedIds: [UUID!]! (was purgedConfigNames). • AppConfigPolicyBulkErrorGQL drops `config_name`. • Root `appConfigPolicy` query keys on row id (was config_name). • Add per-resolver one-liner docstrings to mutation entry points. Regenerate v2 schema dump and supergraph to match.
1 parent 13c982f commit ca18385

7 files changed

Lines changed: 98 additions & 47 deletions

File tree

docs/manager/graphql-reference/supergraph.graphql

Lines changed: 27 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -191,8 +191,10 @@ type AddRevisionPayload
191191
revision: ModelRevision!
192192
}
193193

194-
"""Added in UNRELEASED. Per-item input for admin bulk create / update."""
195-
input AdminAppConfigPolicyItemInput
194+
"""
195+
Added in UNRELEASED. Per-item input for admin bulk create — `config_name` + initial `scope_sources`.
196+
"""
197+
input AdminAppConfigPolicyCreateItemInput
196198
@join__type(graph: STRAWBERRY)
197199
{
198200
"""Unique, immutable policy name."""
@@ -202,6 +204,19 @@ input AdminAppConfigPolicyItemInput
202204
scopeSources: [String!]!
203205
}
204206

207+
"""
208+
Added in UNRELEASED. Per-item input for admin bulk update — target row id + new `scope_sources`.
209+
"""
210+
input AdminAppConfigPolicyUpdateItemInput
211+
@join__type(graph: STRAWBERRY)
212+
{
213+
"""Policy row id."""
214+
id: UUID!
215+
216+
"""Ordered scope chain."""
217+
scopeSources: [String!]!
218+
}
219+
205220
"""Added in UNRELEASED. Payload for `adminBulkCreateAppConfigPolicies`."""
206221
type AdminBulkCreateAppConfigPoliciesPayload
207222
@join__type(graph: STRAWBERRY)
@@ -218,28 +233,28 @@ input AdminBulkCreateAppConfigPolicyInput
218233
@join__type(graph: STRAWBERRY)
219234
{
220235
"""Policies to create."""
221-
items: [AdminAppConfigPolicyItemInput!]!
236+
items: [AdminAppConfigPolicyCreateItemInput!]!
222237
}
223238

224239
"""Added in UNRELEASED. Payload for `adminBulkPurgeAppConfigPolicies`."""
225240
type AdminBulkPurgeAppConfigPoliciesPayload
226241
@join__type(graph: STRAWBERRY)
227242
{
228-
"""`config_name`s of policies actually removed (absent names no-oped)."""
229-
purgedConfigNames: [String!]!
243+
"""Ids of policies actually removed (absent ids no-oped)."""
244+
purgedIds: [UUID!]!
230245

231246
"""Per-item failures."""
232247
failed: [AppConfigPolicyBulkError!]!
233248
}
234249

235250
"""
236-
Added in UNRELEASED. Admin bulk purge input for app-config policies (keyed on `config_name`).
251+
Added in UNRELEASED. Admin bulk purge input for app-config policies (keyed on row id).
237252
"""
238253
input AdminBulkPurgeAppConfigPolicyInput
239254
@join__type(graph: STRAWBERRY)
240255
{
241-
"""`config_name`s to purge."""
242-
configNames: [String!]!
256+
"""Policy row ids to purge."""
257+
ids: [UUID!]!
243258
}
244259

245260
"""Added in UNRELEASED. Payload for `adminBulkUpdateAppConfigPolicies`."""
@@ -258,7 +273,7 @@ input AdminBulkUpdateAppConfigPolicyInput
258273
@join__type(graph: STRAWBERRY)
259274
{
260275
"""Policies to update."""
261-
items: [AdminAppConfigPolicyItemInput!]!
276+
items: [AdminAppConfigPolicyUpdateItemInput!]!
262277
}
263278

264279
"""Added in 26.4.2. Admin input for creating a keypair for a user."""
@@ -993,9 +1008,6 @@ type AppConfigPolicyBulkError
9931008
"""Original position in the input list."""
9941009
index: Int!
9951010

996-
"""`config_name` of the failed row."""
997-
configName: String!
998-
9991011
"""Reason for the failure."""
10001012
message: String!
10011013
}
@@ -11040,7 +11052,7 @@ type Mutation
1104011052
adminBulkUpdateAppConfigPolicies(input: AdminBulkUpdateAppConfigPolicyInput!): AdminBulkUpdateAppConfigPoliciesPayload! @join__field(graph: STRAWBERRY)
1104111053

1104211054
"""
11043-
Added in UNRELEASED. Rejects items whose `config_name` still has referencing fragment rows. Admin only.
11055+
Added in UNRELEASED. Hard-delete policies by row id; rows still referenced by fragments surface in `failed`. Admin only.
1104411056
"""
1104511057
adminBulkPurgeAppConfigPolicies(input: AdminBulkPurgeAppConfigPolicyInput!): AdminBulkPurgeAppConfigPoliciesPayload! @join__field(graph: STRAWBERRY)
1104611058

@@ -13562,9 +13574,9 @@ type Query
1356213574
adminImageAliases(filter: ImageV2AliasFilter = null, orderBy: [ImageV2AliasOrderByGQL!] = null, before: String = null, after: String = null, first: Int = null, last: Int = null, limit: Int = null, offset: Int = null): ImageV2AliasConnection @join__field(graph: STRAWBERRY)
1356313575

1356413576
"""
13565-
Added in UNRELEASED. Get a single app-config policy by `config_name`. Available to any authenticated user.
13577+
Added in UNRELEASED. Get a single app-config policy by row id. Available to any authenticated user.
1356613578
"""
13567-
appConfigPolicy(configName: String!): AppConfigPolicy @join__field(graph: STRAWBERRY)
13579+
appConfigPolicy(id: UUID!): AppConfigPolicy @join__field(graph: STRAWBERRY)
1356813580

1356913581
"""
1357013582
Added in UNRELEASED. List app-config policies with filtering and pagination. Available to any authenticated user.

docs/manager/graphql-reference/v2-schema.graphql

Lines changed: 25 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -145,15 +145,28 @@ type AddRevisionPayload {
145145
revision: ModelRevision!
146146
}
147147

148-
"""Added in UNRELEASED. Per-item input for admin bulk create / update."""
149-
input AdminAppConfigPolicyItemInput {
148+
"""
149+
Added in UNRELEASED. Per-item input for admin bulk create — `config_name` + initial `scope_sources`.
150+
"""
151+
input AdminAppConfigPolicyCreateItemInput {
150152
"""Unique, immutable policy name."""
151153
configName: String!
152154

153155
"""Ordered scope chain."""
154156
scopeSources: [String!]!
155157
}
156158

159+
"""
160+
Added in UNRELEASED. Per-item input for admin bulk update — target row id + new `scope_sources`.
161+
"""
162+
input AdminAppConfigPolicyUpdateItemInput {
163+
"""Policy row id."""
164+
id: UUID!
165+
166+
"""Ordered scope chain."""
167+
scopeSources: [String!]!
168+
}
169+
157170
"""Added in UNRELEASED. Payload for `adminBulkCreateAppConfigPolicies`."""
158171
type AdminBulkCreateAppConfigPoliciesPayload {
159172
"""Created policies."""
@@ -166,24 +179,24 @@ type AdminBulkCreateAppConfigPoliciesPayload {
166179
"""Added in UNRELEASED. Admin bulk create input for app-config policies."""
167180
input AdminBulkCreateAppConfigPolicyInput {
168181
"""Policies to create."""
169-
items: [AdminAppConfigPolicyItemInput!]!
182+
items: [AdminAppConfigPolicyCreateItemInput!]!
170183
}
171184

172185
"""Added in UNRELEASED. Payload for `adminBulkPurgeAppConfigPolicies`."""
173186
type AdminBulkPurgeAppConfigPoliciesPayload {
174-
"""`config_name`s of policies actually removed (absent names no-oped)."""
175-
purgedConfigNames: [String!]!
187+
"""Ids of policies actually removed (absent ids no-oped)."""
188+
purgedIds: [UUID!]!
176189

177190
"""Per-item failures."""
178191
failed: [AppConfigPolicyBulkError!]!
179192
}
180193

181194
"""
182-
Added in UNRELEASED. Admin bulk purge input for app-config policies (keyed on `config_name`).
195+
Added in UNRELEASED. Admin bulk purge input for app-config policies (keyed on row id).
183196
"""
184197
input AdminBulkPurgeAppConfigPolicyInput {
185-
"""`config_name`s to purge."""
186-
configNames: [String!]!
198+
"""Policy row ids to purge."""
199+
ids: [UUID!]!
187200
}
188201

189202
"""Added in UNRELEASED. Payload for `adminBulkUpdateAppConfigPolicies`."""
@@ -198,7 +211,7 @@ type AdminBulkUpdateAppConfigPoliciesPayload {
198211
"""Added in UNRELEASED. Admin bulk update input for app-config policies."""
199212
input AdminBulkUpdateAppConfigPolicyInput {
200213
"""Policies to update."""
201-
items: [AdminAppConfigPolicyItemInput!]!
214+
items: [AdminAppConfigPolicyUpdateItemInput!]!
202215
}
203216

204217
"""Added in 26.4.2. Admin input for creating a keypair for a user."""
@@ -688,9 +701,6 @@ type AppConfigPolicyBulkError {
688701
"""Original position in the input list."""
689702
index: Int!
690703

691-
"""`config_name` of the failed row."""
692-
configName: String!
693-
694704
"""Reason for the failure."""
695705
message: String!
696706
}
@@ -6968,7 +6978,7 @@ type Mutation {
69686978
adminBulkUpdateAppConfigPolicies(input: AdminBulkUpdateAppConfigPolicyInput!): AdminBulkUpdateAppConfigPoliciesPayload!
69696979

69706980
"""
6971-
Added in UNRELEASED. Rejects items whose `config_name` still has referencing fragment rows. Admin only.
6981+
Added in UNRELEASED. Hard-delete policies by row id; rows still referenced by fragments surface in `failed`. Admin only.
69726982
"""
69736983
adminBulkPurgeAppConfigPolicies(input: AdminBulkPurgeAppConfigPolicyInput!): AdminBulkPurgeAppConfigPoliciesPayload!
69746984

@@ -8705,9 +8715,9 @@ type Query {
87058715
adminImageAliases(filter: ImageV2AliasFilter = null, orderBy: [ImageV2AliasOrderByGQL!] = null, before: String = null, after: String = null, first: Int = null, last: Int = null, limit: Int = null, offset: Int = null): ImageV2AliasConnection
87068716

87078717
"""
8708-
Added in UNRELEASED. Get a single app-config policy by `config_name`. Available to any authenticated user.
8718+
Added in UNRELEASED. Get a single app-config policy by row id. Available to any authenticated user.
87098719
"""
8710-
appConfigPolicy(configName: String!): AppConfigPolicy
8720+
appConfigPolicy(id: UUID!): AppConfigPolicy
87118721

87128722
"""
87138723
Added in UNRELEASED. List app-config policies with filtering and pagination. Available to any authenticated user.

src/ai/backend/manager/api/gql/app_config_policy/resolver/mutation.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ async def admin_bulk_create_app_config_policies(
3131
info: Info[StrawberryGQLContext],
3232
input: AdminBulkCreateAppConfigPolicyInputGQL,
3333
) -> AdminBulkCreateAppConfigPoliciesPayloadGQL:
34+
"""Bulk-create app-config policies; failures surface per-item via `failed`."""
3435
check_admin_only()
3536
result = await info.context.adapters.app_config_policy.admin_bulk_create(input.to_pydantic())
3637
return AdminBulkCreateAppConfigPoliciesPayloadGQL.from_pydantic(result)
@@ -48,6 +49,7 @@ async def admin_bulk_update_app_config_policies(
4849
info: Info[StrawberryGQLContext],
4950
input: AdminBulkUpdateAppConfigPolicyInputGQL,
5051
) -> AdminBulkUpdateAppConfigPoliciesPayloadGQL:
52+
"""Bulk-replace `scope_sources` per row id; missing-id items surface in `failed`."""
5153
check_admin_only()
5254
result = await info.context.adapters.app_config_policy.admin_bulk_update(input.to_pydantic())
5355
return AdminBulkUpdateAppConfigPoliciesPayloadGQL.from_pydantic(result)
@@ -57,14 +59,15 @@ async def admin_bulk_update_app_config_policies(
5759
BackendAIGQLMeta(
5860
added_version=NEXT_RELEASE_VERSION,
5961
description=(
60-
"Rejects items whose `config_name` still has referencing fragment rows. Admin only."
62+
"Hard-delete policies by row id; rows still referenced by fragments surface in `failed`. Admin only."
6163
),
6264
)
6365
)
6466
async def admin_bulk_purge_app_config_policies(
6567
info: Info[StrawberryGQLContext],
6668
input: AdminBulkPurgeAppConfigPolicyInputGQL,
6769
) -> AdminBulkPurgeAppConfigPoliciesPayloadGQL:
70+
"""Bulk-purge app-config policies by row id; absent ids no-op."""
6871
check_admin_only()
6972
result = await info.context.adapters.app_config_policy.admin_bulk_purge(input.to_pydantic())
7073
return AdminBulkPurgeAppConfigPoliciesPayloadGQL.from_pydantic(result)

src/ai/backend/manager/api/gql/app_config_policy/resolver/query.py

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@
22

33
from __future__ import annotations
44

5+
from uuid import UUID
6+
57
import strawberry
68
from strawberry import Info
79

@@ -28,15 +30,15 @@
2830
BackendAIGQLMeta(
2931
added_version=NEXT_RELEASE_VERSION,
3032
description=(
31-
"Get a single app-config policy by `config_name`. Available to any authenticated user."
33+
"Get a single app-config policy by row id. Available to any authenticated user."
3234
),
3335
)
3436
) # type: ignore[misc]
3537
async def app_config_policy(
3638
info: Info[StrawberryGQLContext],
37-
config_name: str,
39+
id: UUID,
3840
) -> AppConfigPolicyGQL | None:
39-
payload = await info.context.adapters.app_config_policy.get(config_name)
41+
payload = await info.context.adapters.app_config_policy.get(id)
4042
if payload.item is None:
4143
return None
4244
return AppConfigPolicyGQL.from_pydantic(payload.item)

src/ai/backend/manager/api/gql/app_config_policy/types/__init__.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
from .bulk_inputs import (
2-
AdminAppConfigPolicyItemInputGQL,
2+
AdminAppConfigPolicyCreateItemInputGQL,
3+
AdminAppConfigPolicyUpdateItemInputGQL,
34
AdminBulkCreateAppConfigPolicyInputGQL,
45
AdminBulkPurgeAppConfigPolicyInputGQL,
56
AdminBulkUpdateAppConfigPolicyInputGQL,
@@ -22,7 +23,8 @@
2223
)
2324

2425
__all__ = [
25-
"AdminAppConfigPolicyItemInputGQL",
26+
"AdminAppConfigPolicyCreateItemInputGQL",
27+
"AdminAppConfigPolicyUpdateItemInputGQL",
2628
"AdminBulkCreateAppConfigPoliciesPayloadGQL",
2729
"AdminBulkCreateAppConfigPolicyInputGQL",
2830
"AdminBulkPurgeAppConfigPoliciesPayloadGQL",

src/ai/backend/manager/api/gql/app_config_policy/types/bulk_inputs.py

Lines changed: 29 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,13 @@
22

33
from __future__ import annotations
44

5+
from uuid import UUID
6+
7+
from ai.backend.common.dto.manager.v2.app_config_policy.request import (
8+
AdminAppConfigPolicyCreateItemInput as AdminCreateItemInputDTO,
9+
)
510
from ai.backend.common.dto.manager.v2.app_config_policy.request import (
6-
AdminAppConfigPolicyItemInput as AdminItemInputDTO,
11+
AdminAppConfigPolicyUpdateItemInput as AdminUpdateItemInputDTO,
712
)
813
from ai.backend.common.dto.manager.v2.app_config_policy.request import (
914
AdminBulkCreateAppConfigPoliciesInput as AdminBulkCreateInputDTO,
@@ -26,15 +31,27 @@
2631
@gql_pydantic_input(
2732
BackendAIGQLMeta(
2833
added_version=NEXT_RELEASE_VERSION,
29-
description="Per-item input for admin bulk create / update.",
34+
description="Per-item input for admin bulk create — `config_name` + initial `scope_sources`.",
3035
),
31-
name="AdminAppConfigPolicyItemInput",
36+
name="AdminAppConfigPolicyCreateItemInput",
3237
)
33-
class AdminAppConfigPolicyItemInputGQL(PydanticInputMixin[AdminItemInputDTO]):
38+
class AdminAppConfigPolicyCreateItemInputGQL(PydanticInputMixin[AdminCreateItemInputDTO]):
3439
config_name: str = gql_field(description="Unique, immutable policy name.")
3540
scope_sources: list[str] = gql_field(description="Ordered scope chain.")
3641

3742

43+
@gql_pydantic_input(
44+
BackendAIGQLMeta(
45+
added_version=NEXT_RELEASE_VERSION,
46+
description="Per-item input for admin bulk update — target row id + new `scope_sources`.",
47+
),
48+
name="AdminAppConfigPolicyUpdateItemInput",
49+
)
50+
class AdminAppConfigPolicyUpdateItemInputGQL(PydanticInputMixin[AdminUpdateItemInputDTO]):
51+
id: UUID = gql_field(description="Policy row id.")
52+
scope_sources: list[str] = gql_field(description="Ordered scope chain.")
53+
54+
3855
@gql_pydantic_input(
3956
BackendAIGQLMeta(
4057
added_version=NEXT_RELEASE_VERSION,
@@ -43,7 +60,9 @@ class AdminAppConfigPolicyItemInputGQL(PydanticInputMixin[AdminItemInputDTO]):
4360
name="AdminBulkCreateAppConfigPolicyInput",
4461
)
4562
class AdminBulkCreateAppConfigPolicyInputGQL(PydanticInputMixin[AdminBulkCreateInputDTO]):
46-
items: list[AdminAppConfigPolicyItemInputGQL] = gql_field(description="Policies to create.")
63+
items: list[AdminAppConfigPolicyCreateItemInputGQL] = gql_field(
64+
description="Policies to create."
65+
)
4766

4867

4968
@gql_pydantic_input(
@@ -54,15 +73,17 @@ class AdminBulkCreateAppConfigPolicyInputGQL(PydanticInputMixin[AdminBulkCreateI
5473
name="AdminBulkUpdateAppConfigPolicyInput",
5574
)
5675
class AdminBulkUpdateAppConfigPolicyInputGQL(PydanticInputMixin[AdminBulkUpdateInputDTO]):
57-
items: list[AdminAppConfigPolicyItemInputGQL] = gql_field(description="Policies to update.")
76+
items: list[AdminAppConfigPolicyUpdateItemInputGQL] = gql_field(
77+
description="Policies to update."
78+
)
5879

5980

6081
@gql_pydantic_input(
6182
BackendAIGQLMeta(
6283
added_version=NEXT_RELEASE_VERSION,
63-
description="Admin bulk purge input for app-config policies (keyed on `config_name`).",
84+
description="Admin bulk purge input for app-config policies (keyed on row id).",
6485
),
6586
name="AdminBulkPurgeAppConfigPolicyInput",
6687
)
6788
class AdminBulkPurgeAppConfigPolicyInputGQL(PydanticInputMixin[AdminBulkPurgeInputDTO]):
68-
config_names: list[str] = gql_field(description="`config_name`s to purge.")
89+
ids: list[UUID] = gql_field(description="Policy row ids to purge.")

src/ai/backend/manager/api/gql/app_config_policy/types/bulk_payloads.py

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@
22

33
from __future__ import annotations
44

5+
from uuid import UUID
6+
57
from ai.backend.common.dto.manager.v2.app_config_policy.response import (
68
AdminBulkCreateAppConfigPoliciesPayload as AdminBulkCreatePayloadDTO,
79
)
@@ -34,7 +36,6 @@
3436
)
3537
class AppConfigPolicyBulkErrorGQL(PydanticOutputMixin[AppConfigPolicyBulkErrorDTO]):
3638
index: int = gql_field(description="Original position in the input list.")
37-
config_name: str = gql_field(description="`config_name` of the failed row.")
3839
message: str = gql_field(description="Reason for the failure.")
3940

4041

@@ -73,7 +74,7 @@ class AdminBulkUpdateAppConfigPoliciesPayloadGQL(PydanticOutputMixin[AdminBulkUp
7374
name="AdminBulkPurgeAppConfigPoliciesPayload",
7475
)
7576
class AdminBulkPurgeAppConfigPoliciesPayloadGQL(PydanticOutputMixin[AdminBulkPurgePayloadDTO]):
76-
purged_config_names: list[str] = gql_field(
77-
description="`config_name`s of policies actually removed (absent names no-oped).",
77+
purged_ids: list[UUID] = gql_field(
78+
description="Ids of policies actually removed (absent ids no-oped).",
7879
)
7980
failed: list[AppConfigPolicyBulkErrorGQL] = gql_field(description="Per-item failures.")

0 commit comments

Comments
 (0)