feat: update controls in the admin, release token scope, build info in CI images [CI]

The versions page shows each node's update state with update buttons, API
tokens get a release scope that can only register releases (used by CI), and
the CI image and release builds now pass the tag, commit and build time.
This commit is contained in:
justme committed 2026-10-06 22:57:04 +08:00
1 parent 8dd3209a65
commit d449e50791
17 files changed
+470 -141

No files matched your search

+209 -1
View File
@@ -310,6 +310,24 @@ export interface paths {
patch?: never;
trace?: never;
};
"/api/admin/releases": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
/** The latest signed release manifest of each component */
get: operations["releases_list"];
put?: never;
/** Register a CI-signed release manifest; online nodes get it right away (their updaters verify the signature). Admin or release tokens */
post: operations["releases_publish"];
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/api/admin/auth/logout": {
parameters: {
query?: never;
@@ -806,7 +824,7 @@ export interface paths {
path?: never;
cookie?: never;
};
/** Version, tag, commit and build time of the backend and every agent and probe */
/** Version, tag, commit, build time and update state of the backend and every agent and probe */
get: operations["build_info_get"];
put?: never;
post?: never;
@@ -816,6 +834,23 @@ export interface paths {
patch?: never;
trace?: never;
};
"/api/admin/nodes/{id}/update": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
get?: never;
put?: never;
/** Ask an online agent or probe to install the release it has been offered */
post: operations["nodes_update"];
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/healthz": {
parameters: {
query?: never;
@@ -1277,6 +1312,7 @@ export interface components {
tag: null | string;
commit: null | string;
built_at: null | string;
update?: null | components["schemas"]["NodeUpdateDto"];
};
NodeInfoDto: {
id: string;
@@ -1290,6 +1326,15 @@ export interface components {
version?: null | string;
tag?: null | string;
};
NodeUpdateDto: {
state: string;
current_digest: null | string;
available_tag: null | string;
available_version: null | string;
error: null | string;
/** Format: date-time */
at: unknown;
};
OverviewDto: {
range: string;
/** Format: date-time */
@@ -1367,6 +1412,10 @@ export interface components {
items: components["schemas"]["RawChunkMetaDto"][];
next_cursor: null | string;
};
PageDtoOfReleaseDto: {
items: components["schemas"]["ReleaseDto"][];
next_cursor: null | string;
};
PageDtoOfSettingDto: {
items: components["schemas"]["SettingDto"][];
next_cursor: null | string;
@@ -1465,6 +1514,10 @@ export interface components {
[key: string]: string[];
};
};
PublishReleaseRequest: {
manifest: null | string;
signature: null | string;
};
RawChunkMetaDto: {
chunk_id: string;
agent_id: string;
@@ -1500,6 +1553,14 @@ export interface components {
id: string;
reason: string;
};
ReleaseDto: {
component: string;
/** Format: int64 */
seq: number | string;
tag: string;
version: string;
digest: string;
};
ScoreDto: {
/** Format: double */
score: null | number | string;
@@ -2473,6 +2534,104 @@ export interface operations {
};
};
};
releases_list: {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
requestBody?: never;
responses: {
/** @description OK */
200: {
headers: {
[name: string]: unknown;
};
content: {
"application/json": components["schemas"]["PageDtoOfReleaseDto"];
};
};
/** @description Unauthorized */
401: {
headers: {
[name: string]: unknown;
};
content: {
"application/problem+json": components["schemas"]["ProblemDto"];
};
};
/** @description Forbidden */
403: {
headers: {
[name: string]: unknown;
};
content: {
"application/problem+json": components["schemas"]["ProblemDto"];
};
};
};
};
releases_publish: {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
requestBody: {
content: {
"application/json": components["schemas"]["PublishReleaseRequest"];
};
};
responses: {
/** @description Created */
201: {
headers: {
[name: string]: unknown;
};
content: {
"application/json": components["schemas"]["ReleaseDto"];
};
};
/** @description Bad Request */
400: {
headers: {
[name: string]: unknown;
};
content: {
"application/problem+json": components["schemas"]["ProblemDto"];
};
};
/** @description Unauthorized */
401: {
headers: {
[name: string]: unknown;
};
content: {
"application/problem+json": components["schemas"]["ProblemDto"];
};
};
/** @description Forbidden */
403: {
headers: {
[name: string]: unknown;
};
content: {
"application/problem+json": components["schemas"]["ProblemDto"];
};
};
/** @description Conflict */
409: {
headers: {
[name: string]: unknown;
};
content: {
"application/problem+json": components["schemas"]["ProblemDto"];
};
};
};
};
auth_logout: {
parameters: {
query?: never;
@@ -4552,6 +4711,55 @@ export interface operations {
};
};
};
nodes_update: {
parameters: {
query?: never;
header?: never;
path: {
id: string;
};
cookie?: never;
};
requestBody?: never;
responses: {
/** @description No Content */
204: {
headers: {
[name: string]: unknown;
};
content: {
"application/json": unknown;
};
};
/** @description Unauthorized */
401: {
headers: {
[name: string]: unknown;
};
content: {
"application/problem+json": components["schemas"]["ProblemDto"];
};
};
/** @description Forbidden */
403: {
headers: {
[name: string]: unknown;
};
content: {
"application/problem+json": components["schemas"]["ProblemDto"];
};
};
/** @description Conflict */
409: {
headers: {
[name: string]: unknown;
};
content: {
"application/problem+json": components["schemas"]["ProblemDto"];
};
};
};
};
health_get: {
parameters: {
query?: never;
+2
View File
@@ -17,6 +17,8 @@ export type AboutDto = Narrow<S['AboutDto']>
export type BuildDto = Narrow<S['BuildDto']>
export type BuildInfoDto = Narrow<S['BuildInfoDto']>
export type NodeBuildDto = Narrow<S['NodeBuildDto']>
export type NodeUpdateDto = Narrow<S['NodeUpdateDto']>
export type ReleaseDto = Narrow<S['ReleaseDto']>
export type OverviewDto = Narrow<S['OverviewDto']>
export type OverviewLineDto = Narrow<S['OverviewLineDto']>
export type SeriesDto = Narrow<S['SeriesDto']>