Skip to content

Commit ad0eff1

Browse files
jopemachineclaude
andcommitted
refactor(BA-5837): align cache-aware admin_repo with Updater/Purger pattern
The Valkey cache wrapper added in this PR re-introduced the `(key, spec)` and `(key)` signatures on `db_source.update` / `db_source.purge`. Switch the cache-aware admin_repository over to the Updater/Purger pattern from BA-5827 while keeping the merged- view cache-invalidation hooks intact. Also rename the residual `extra_config` / `extraConfig` references in the GQL types and schema dump to `config` for consistency with the column rename. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
1 parent 4e7ff23 commit ad0eff1

5 files changed

Lines changed: 36 additions & 18 deletions

File tree

docs/manager/graphql-reference/supergraph.graphql

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -199,7 +199,7 @@ input AdminAppConfigFragmentItemInput
199199
key: AppConfigFragmentKeyInput!
200200

201201
"""Raw configuration payload."""
202-
extraConfig: JSON!
202+
config: JSON!
203203
}
204204

205205
"""Added in UNRELEASED. Per-item input for admin bulk create / update."""
@@ -1082,7 +1082,7 @@ type AppConfigFragment
10821082
name: String!
10831083

10841084
"""Raw configuration payload, or null."""
1085-
extraConfig: JSON
1085+
config: JSON
10861086

10871087
"""Creation timestamp."""
10881088
createdAt: DateTime!
@@ -11568,7 +11568,7 @@ input MyAppConfigFragmentItemInput
1156811568
name: String!
1156911569

1157011570
"""Raw configuration payload."""
11571-
extraConfig: JSON!
11571+
config: JSON!
1157211572
}
1157311573

1157411574
"""

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

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -151,7 +151,7 @@ input AdminAppConfigFragmentItemInput {
151151
key: AppConfigFragmentKeyInput!
152152

153153
"""Raw configuration payload."""
154-
extraConfig: JSON!
154+
config: JSON!
155155
}
156156

157157
"""Added in UNRELEASED. Per-item input for admin bulk create / update."""
@@ -762,7 +762,7 @@ type AppConfigFragment {
762762
name: String!
763763

764764
"""Raw configuration payload, or null."""
765-
extraConfig: JSON
765+
config: JSON
766766

767767
"""Creation timestamp."""
768768
createdAt: DateTime!
@@ -7450,7 +7450,7 @@ input MyAppConfigFragmentItemInput {
74507450
name: String!
74517451

74527452
"""Raw configuration payload."""
7453-
extraConfig: JSON!
7453+
config: JSON!
74547454
}
74557455

74567456
"""

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@
4646
)
4747
class AdminAppConfigFragmentItemInputGQL(PydanticInputMixin[AdminItemInputDTO]):
4848
key: AppConfigFragmentKeyInputGQL = gql_field(description="Natural-key identifier.")
49-
extra_config: dict[str, Any] = gql_field(description="Raw configuration payload.")
49+
config: dict[str, Any] = gql_field(description="Raw configuration payload.")
5050

5151

5252
@gql_pydantic_input(
@@ -91,7 +91,7 @@ class AdminBulkPurgeAppConfigFragmentInputGQL(PydanticInputMixin[AdminBulkPurgeI
9191
)
9292
class MyAppConfigFragmentItemInputGQL(PydanticInputMixin[MyItemInputDTO]):
9393
name: str = gql_field(description="Policy name.")
94-
extra_config: dict[str, Any] = gql_field(description="Raw configuration payload.")
94+
config: dict[str, Any] = gql_field(description="Raw configuration payload.")
9595

9696

9797
@gql_pydantic_input(

src/ai/backend/manager/api/gql/app_config_fragment/types/node.py

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -41,8 +41,6 @@ class AppConfigFragmentGQL(PydanticOutputMixin[AppConfigFragmentNode]):
4141
scope_type: AppConfigScopeType = gql_field(description="Scope type.")
4242
scope_id: str = gql_field(description="Scope id.")
4343
name: str = gql_field(description="Policy name (FK to app_config_policies).")
44-
extra_config: dict[str, Any] | None = gql_field(
45-
description="Raw configuration payload, or null."
46-
)
44+
config: dict[str, Any] | None = gql_field(description="Raw configuration payload, or null.")
4745
created_at: datetime = gql_field(description="Creation timestamp.")
4846
updated_at: datetime | None = gql_field(description="Last update timestamp.")

src/ai/backend/manager/repositories/app_config_fragment/admin_repository.py

Lines changed: 27 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -116,19 +116,39 @@ async def update(
116116
key: AppConfigFragmentKey,
117117
config: Mapping[str, Any],
118118
) -> AppConfigFragmentData:
119-
"""Update a fragment by natural key. Raises
120-
``AppConfigFragmentNotFound`` when missing."""
121-
spec = AppConfigFragmentUpdaterSpec(extra_config=extra_config)
122-
result = await self._db_source.update(key, spec)
119+
"""Update a fragment by natural key. Resolves the natural key
120+
to the row's UUID, builds an ``Updater``, and delegates to the
121+
DB source. Raises :class:`AppConfigFragmentNotFound` when the
122+
row is missing (or vanishes between resolve and write)."""
123+
pk_value = await self._db_source.resolve_pk_by_key(key)
124+
if pk_value is None:
125+
raise _missing(key)
126+
updater: Updater[AppConfigFragmentRow] = Updater(
127+
spec=AppConfigFragmentUpdaterSpec(config=config),
128+
pk_value=pk_value,
129+
)
130+
result = await self._db_source.update(updater)
131+
if result is None:
132+
raise _missing(key)
123133
await self._invalidate(key)
124134
return result
125135

126136
@app_config_fragment_admin_repository_resilience.apply()
127137
async def purge(self, key: AppConfigFragmentKey) -> bool:
128-
result = await self._db_source.purge(key)
129-
if result:
138+
"""Delete a fragment by natural key. Resolves the natural key,
139+
builds a ``Purger``, delegates to the DB source, and (on a
140+
real removal) invalidates the merged-view cache."""
141+
pk_value = await self._db_source.resolve_pk_by_key(key)
142+
if pk_value is None:
143+
return False
144+
purger: Purger[AppConfigFragmentRow] = Purger(
145+
row_class=AppConfigFragmentRow,
146+
pk_value=pk_value,
147+
)
148+
removed = await self._db_source.purge(purger)
149+
if removed:
130150
await self._invalidate(key)
131-
return result
151+
return removed
132152

133153
async def _invalidate(self, key: AppConfigFragmentKey) -> None:
134154
if self._cache_source is None:

0 commit comments

Comments
 (0)