From 21ef159c08b77b5c58e76caabb537d8ef99e2cca Mon Sep 17 00:00:00 2001 From: Alex Drankou Date: Mon, 15 Jun 2026 11:54:05 +0200 Subject: [PATCH] feat(dashboard-api): include build resources in /builds response MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Add cpuCount, memoryMB, diskSizeMB, and envdVersion to ListedBuild so the dashboard can render per-build resources. All fields already live on env_builds, so this is select + map only — no migration. - spec: extend ListedBuild (diskSizeMB/envdVersion nullable) - queries: select vcpu, ram_mb, total_disk_size_mb, envd_version in all four get_builds_paginated variants - handler: map the new fields through listBuildRow into ListedBuild - regenerate sqlc + oapi --- .../dashboard-api/internal/api/api.gen.go | 151 ++++++++++-------- .../internal/handlers/builds_list.go | 94 +++++++---- .../queries/builds/get_builds_paginated.sql | 16 ++ .../db/queries/get_builds_paginated.sql.go | 104 ++++++++---- spec/openapi-dashboard.yml | 21 +++ 5 files changed, 254 insertions(+), 132 deletions(-) diff --git a/packages/dashboard-api/internal/api/api.gen.go b/packages/dashboard-api/internal/api/api.gen.go index dfb028466a..ba93e5abd9 100644 --- a/packages/dashboard-api/internal/api/api.gen.go +++ b/packages/dashboard-api/internal/api/api.gen.go @@ -285,15 +285,27 @@ type HealthResponse struct { // ListedBuild defines model for ListedBuild. type ListedBuild struct { + // CpuCount CPU cores configured for the build. + CpuCount int64 `json:"cpuCount"` + // CreatedAt Build creation timestamp in RFC3339 format. CreatedAt time.Time `json:"createdAt"` + // DiskSizeMB Disk size in MiB configured for the build, if recorded. + DiskSizeMB *int64 `json:"diskSizeMB"` + + // EnvdVersion envd version the build was created with, if recorded. + EnvdVersion *string `json:"envdVersion"` + // FinishedAt Build completion timestamp in RFC3339 format, if finished. FinishedAt *time.Time `json:"finishedAt"` // Id Identifier of the build. Id openapi_types.UUID `json:"id"` + // MemoryMB Memory in MiB configured for the build. + MemoryMB int64 `json:"memoryMB"` + // Status Build status mapped for dashboard clients. Status BuildStatus `json:"status"` @@ -1318,75 +1330,76 @@ func RegisterHandlersWithOptions(router gin.IRouter, si ServerInterface, options // const string: with thousands of chunks the chained `+` fold is several // times slower for the Go compiler than parsing a slice literal. var swaggerSpec = []string{ - "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", } // decodeSpec returns the embedded OpenAPI spec as raw JSON bytes, diff --git a/packages/dashboard-api/internal/handlers/builds_list.go b/packages/dashboard-api/internal/handlers/builds_list.go index 3fa70337cf..654bc998a7 100644 --- a/packages/dashboard-api/internal/handlers/builds_list.go +++ b/packages/dashboard-api/internal/handlers/builds_list.go @@ -72,6 +72,10 @@ func (s *APIStore) GetBuilds(c *gin.Context, params api.GetBuildsParams) { StatusMessage: dashboardutils.MapBuildStatusMessageFromDBStatusGroup(row.StatusGroup, row.Reason), CreatedAt: row.CreatedAt, FinishedAt: row.FinishedAt, + CpuCount: row.Vcpu, + MemoryMB: row.RamMb, + DiskSizeMB: row.TotalDiskSizeMb, + EnvdVersion: row.EnvdVersion, }) } @@ -89,13 +93,17 @@ func (s *APIStore) GetBuilds(c *gin.Context, params api.GetBuildsParams) { } type listBuildRow struct { - ID uuid.UUID - StatusGroup dbtypes.BuildStatusGroup - Reason dbtypes.BuildReason - CreatedAt time.Time - FinishedAt *time.Time - TemplateID string - TemplateAlias string + ID uuid.UUID + StatusGroup dbtypes.BuildStatusGroup + Reason dbtypes.BuildReason + CreatedAt time.Time + FinishedAt *time.Time + Vcpu int64 + RamMb int64 + TotalDiskSizeMb *int64 + EnvdVersion *string + TemplateID string + TemplateAlias string } func (s *APIStore) listBuildRows( @@ -238,13 +246,17 @@ func mapBuildRows(rows []queries.GetTeamBuildsPageRow) []listBuildRow { out := make([]listBuildRow, 0, len(rows)) for _, row := range rows { out = append(out, listBuildRow{ - ID: row.ID, - StatusGroup: row.StatusGroup, - Reason: row.Reason, - CreatedAt: row.CreatedAt, - FinishedAt: row.FinishedAt, - TemplateID: row.TemplateID, - TemplateAlias: row.TemplateAlias, + ID: row.ID, + StatusGroup: row.StatusGroup, + Reason: row.Reason, + CreatedAt: row.CreatedAt, + FinishedAt: row.FinishedAt, + Vcpu: row.Vcpu, + RamMb: row.RamMb, + TotalDiskSizeMb: row.TotalDiskSizeMb, + EnvdVersion: row.EnvdVersion, + TemplateID: row.TemplateID, + TemplateAlias: row.TemplateAlias, }) } @@ -255,13 +267,17 @@ func mapBuildRowsByBuildID(rows []queries.GetTeamBuildsPageByBuildIDRow) []listB out := make([]listBuildRow, 0, len(rows)) for _, row := range rows { out = append(out, listBuildRow{ - ID: row.ID, - StatusGroup: row.StatusGroup, - Reason: row.Reason, - CreatedAt: row.CreatedAt, - FinishedAt: row.FinishedAt, - TemplateID: row.TemplateID, - TemplateAlias: row.TemplateAlias, + ID: row.ID, + StatusGroup: row.StatusGroup, + Reason: row.Reason, + CreatedAt: row.CreatedAt, + FinishedAt: row.FinishedAt, + Vcpu: row.Vcpu, + RamMb: row.RamMb, + TotalDiskSizeMb: row.TotalDiskSizeMb, + EnvdVersion: row.EnvdVersion, + TemplateID: row.TemplateID, + TemplateAlias: row.TemplateAlias, }) } @@ -272,13 +288,17 @@ func mapBuildRowsByTemplateID(rows []queries.GetTeamBuildsPageByTemplateIDRow) [ out := make([]listBuildRow, 0, len(rows)) for _, row := range rows { out = append(out, listBuildRow{ - ID: row.ID, - StatusGroup: row.StatusGroup, - Reason: row.Reason, - CreatedAt: row.CreatedAt, - FinishedAt: row.FinishedAt, - TemplateID: row.TemplateID, - TemplateAlias: row.TemplateAlias, + ID: row.ID, + StatusGroup: row.StatusGroup, + Reason: row.Reason, + CreatedAt: row.CreatedAt, + FinishedAt: row.FinishedAt, + Vcpu: row.Vcpu, + RamMb: row.RamMb, + TotalDiskSizeMb: row.TotalDiskSizeMb, + EnvdVersion: row.EnvdVersion, + TemplateID: row.TemplateID, + TemplateAlias: row.TemplateAlias, }) } @@ -289,13 +309,17 @@ func mapBuildRowsByTemplateAlias(rows []queries.GetTeamBuildsPageByTemplateAlias out := make([]listBuildRow, 0, len(rows)) for _, row := range rows { out = append(out, listBuildRow{ - ID: row.ID, - StatusGroup: row.StatusGroup, - Reason: row.Reason, - CreatedAt: row.CreatedAt, - FinishedAt: row.FinishedAt, - TemplateID: row.TemplateID, - TemplateAlias: row.TemplateAlias, + ID: row.ID, + StatusGroup: row.StatusGroup, + Reason: row.Reason, + CreatedAt: row.CreatedAt, + FinishedAt: row.FinishedAt, + Vcpu: row.Vcpu, + RamMb: row.RamMb, + TotalDiskSizeMb: row.TotalDiskSizeMb, + EnvdVersion: row.EnvdVersion, + TemplateID: row.TemplateID, + TemplateAlias: row.TemplateAlias, }) } diff --git a/packages/db/queries/builds/get_builds_paginated.sql b/packages/db/queries/builds/get_builds_paginated.sql index c8cc151f9c..830fca09ab 100644 --- a/packages/db/queries/builds/get_builds_paginated.sql +++ b/packages/db/queries/builds/get_builds_paginated.sql @@ -5,6 +5,10 @@ SELECT b.reason, b.created_at, b.finished_at, + b.vcpu, + b.ram_mb, + b.total_disk_size_mb, + b.envd_version, eba.env_id AS template_id, COALESCE(ea.alias, '') AS template_alias FROM public.env_builds b @@ -38,6 +42,10 @@ SELECT b.reason, b.created_at, b.finished_at, + b.vcpu, + b.ram_mb, + b.total_disk_size_mb, + b.envd_version, eba.env_id AS template_id, COALESCE(ea.alias, '') AS template_alias FROM public.env_builds b @@ -72,6 +80,10 @@ SELECT b.reason, b.created_at, b.finished_at, + b.vcpu, + b.ram_mb, + b.total_disk_size_mb, + b.envd_version, eba.env_id AS template_id, COALESCE(ea.alias, '') AS template_alias FROM public.env_builds b @@ -106,6 +118,10 @@ SELECT b.reason, b.created_at, b.finished_at, + b.vcpu, + b.ram_mb, + b.total_disk_size_mb, + b.envd_version, eba.env_id AS template_id, COALESCE(ea.alias, '') AS template_alias FROM public.env_builds b diff --git a/packages/db/queries/get_builds_paginated.sql.go b/packages/db/queries/get_builds_paginated.sql.go index bd4e3451e8..04a8afe005 100644 --- a/packages/db/queries/get_builds_paginated.sql.go +++ b/packages/db/queries/get_builds_paginated.sql.go @@ -20,6 +20,10 @@ SELECT b.reason, b.created_at, b.finished_at, + b.vcpu, + b.ram_mb, + b.total_disk_size_mb, + b.envd_version, eba.env_id AS template_id, COALESCE(ea.alias, '') AS template_alias FROM public.env_builds b @@ -56,13 +60,17 @@ type GetTeamBuildsPageParams struct { } type GetTeamBuildsPageRow struct { - ID uuid.UUID - StatusGroup types.BuildStatusGroup - Reason types.BuildReason - CreatedAt time.Time - FinishedAt *time.Time - TemplateID string - TemplateAlias string + ID uuid.UUID + StatusGroup types.BuildStatusGroup + Reason types.BuildReason + CreatedAt time.Time + FinishedAt *time.Time + Vcpu int64 + RamMb int64 + TotalDiskSizeMb *int64 + EnvdVersion *string + TemplateID string + TemplateAlias string } func (q *Queries) GetTeamBuildsPage(ctx context.Context, arg GetTeamBuildsPageParams) ([]GetTeamBuildsPageRow, error) { @@ -86,6 +94,10 @@ func (q *Queries) GetTeamBuildsPage(ctx context.Context, arg GetTeamBuildsPagePa &i.Reason, &i.CreatedAt, &i.FinishedAt, + &i.Vcpu, + &i.RamMb, + &i.TotalDiskSizeMb, + &i.EnvdVersion, &i.TemplateID, &i.TemplateAlias, ); err != nil { @@ -106,6 +118,10 @@ SELECT b.reason, b.created_at, b.finished_at, + b.vcpu, + b.ram_mb, + b.total_disk_size_mb, + b.envd_version, eba.env_id AS template_id, COALESCE(ea.alias, '') AS template_alias FROM public.env_builds b @@ -144,13 +160,17 @@ type GetTeamBuildsPageByBuildIDParams struct { } type GetTeamBuildsPageByBuildIDRow struct { - ID uuid.UUID - StatusGroup types.BuildStatusGroup - Reason types.BuildReason - CreatedAt time.Time - FinishedAt *time.Time - TemplateID string - TemplateAlias string + ID uuid.UUID + StatusGroup types.BuildStatusGroup + Reason types.BuildReason + CreatedAt time.Time + FinishedAt *time.Time + Vcpu int64 + RamMb int64 + TotalDiskSizeMb *int64 + EnvdVersion *string + TemplateID string + TemplateAlias string } func (q *Queries) GetTeamBuildsPageByBuildID(ctx context.Context, arg GetTeamBuildsPageByBuildIDParams) ([]GetTeamBuildsPageByBuildIDRow, error) { @@ -175,6 +195,10 @@ func (q *Queries) GetTeamBuildsPageByBuildID(ctx context.Context, arg GetTeamBui &i.Reason, &i.CreatedAt, &i.FinishedAt, + &i.Vcpu, + &i.RamMb, + &i.TotalDiskSizeMb, + &i.EnvdVersion, &i.TemplateID, &i.TemplateAlias, ); err != nil { @@ -195,6 +219,10 @@ SELECT b.reason, b.created_at, b.finished_at, + b.vcpu, + b.ram_mb, + b.total_disk_size_mb, + b.envd_version, eba.env_id AS template_id, COALESCE(ea.alias, '') AS template_alias FROM public.env_builds b @@ -238,13 +266,17 @@ type GetTeamBuildsPageByTemplateAliasParams struct { } type GetTeamBuildsPageByTemplateAliasRow struct { - ID uuid.UUID - StatusGroup types.BuildStatusGroup - Reason types.BuildReason - CreatedAt time.Time - FinishedAt *time.Time - TemplateID string - TemplateAlias string + ID uuid.UUID + StatusGroup types.BuildStatusGroup + Reason types.BuildReason + CreatedAt time.Time + FinishedAt *time.Time + Vcpu int64 + RamMb int64 + TotalDiskSizeMb *int64 + EnvdVersion *string + TemplateID string + TemplateAlias string } func (q *Queries) GetTeamBuildsPageByTemplateAlias(ctx context.Context, arg GetTeamBuildsPageByTemplateAliasParams) ([]GetTeamBuildsPageByTemplateAliasRow, error) { @@ -269,6 +301,10 @@ func (q *Queries) GetTeamBuildsPageByTemplateAlias(ctx context.Context, arg GetT &i.Reason, &i.CreatedAt, &i.FinishedAt, + &i.Vcpu, + &i.RamMb, + &i.TotalDiskSizeMb, + &i.EnvdVersion, &i.TemplateID, &i.TemplateAlias, ); err != nil { @@ -289,6 +325,10 @@ SELECT b.reason, b.created_at, b.finished_at, + b.vcpu, + b.ram_mb, + b.total_disk_size_mb, + b.envd_version, eba.env_id AS template_id, COALESCE(ea.alias, '') AS template_alias FROM public.env_builds b @@ -327,13 +367,17 @@ type GetTeamBuildsPageByTemplateIDParams struct { } type GetTeamBuildsPageByTemplateIDRow struct { - ID uuid.UUID - StatusGroup types.BuildStatusGroup - Reason types.BuildReason - CreatedAt time.Time - FinishedAt *time.Time - TemplateID string - TemplateAlias string + ID uuid.UUID + StatusGroup types.BuildStatusGroup + Reason types.BuildReason + CreatedAt time.Time + FinishedAt *time.Time + Vcpu int64 + RamMb int64 + TotalDiskSizeMb *int64 + EnvdVersion *string + TemplateID string + TemplateAlias string } func (q *Queries) GetTeamBuildsPageByTemplateID(ctx context.Context, arg GetTeamBuildsPageByTemplateIDParams) ([]GetTeamBuildsPageByTemplateIDRow, error) { @@ -358,6 +402,10 @@ func (q *Queries) GetTeamBuildsPageByTemplateID(ctx context.Context, arg GetTeam &i.Reason, &i.CreatedAt, &i.FinishedAt, + &i.Vcpu, + &i.RamMb, + &i.TotalDiskSizeMb, + &i.EnvdVersion, &i.TemplateID, &i.TemplateAlias, ); err != nil { diff --git a/spec/openapi-dashboard.yml b/spec/openapi-dashboard.yml index 94594e0bb4..0fbf9f57b1 100644 --- a/spec/openapi-dashboard.yml +++ b/spec/openapi-dashboard.yml @@ -351,6 +351,10 @@ components: - statusMessage - createdAt - finishedAt + - cpuCount + - memoryMB + - diskSizeMB + - envdVersion properties: id: type: string @@ -377,6 +381,23 @@ components: format: date-time nullable: true description: Build completion timestamp in RFC3339 format, if finished. + cpuCount: + type: integer + format: int64 + description: CPU cores configured for the build. + memoryMB: + type: integer + format: int64 + description: Memory in MiB configured for the build. + diskSizeMB: + type: integer + format: int64 + nullable: true + description: Disk size in MiB configured for the build, if recorded. + envdVersion: + type: string + nullable: true + description: envd version the build was created with, if recorded. BuildsListResponse: type: object