From 30c8ac7108fc7224a9a6b76ac65c03e117332823 Mon Sep 17 00:00:00 2001 From: Alexa V <239999+axelavargas@users.noreply.github.com> Date: Wed, 29 Jan 2025 10:13:56 +0100 Subject: [PATCH] Dashboard: Schema V2 - Remove Dashboard id from spec (#99590) * Dashboard: Schema V2 - Remove Dashboard id from spec * Fix issue with dashboard id used in examples and serializers for schema v2 * Fix snapshot test --- .../schema/dashboard/v2alpha0/dashboard.schema.cue | 8 ++------ .../src/schema/dashboard/v2alpha0/examples.ts | 1 - .../src/schema/dashboard/v2alpha0/types.gen.ts | 3 --- public/app/features/apiserver/types.ts | 2 -- .../dashboard-scene/saving/SaveDashboardAsForm.tsx | 2 +- .../serialization/DashboardSceneSerializer.test.ts | 2 -- .../serialization/DashboardSceneSerializer.ts | 1 - .../transformSceneToSaveModelSchemaV2.test.ts.snap | 1 - .../transformSaveModelSchemaV2ToScene.ts | 8 +++++--- .../transformSceneToSaveModelSchemaV2.ts | 1 - .../dashboard/api/ResponseTransformers.test.ts | 7 +++++-- .../features/dashboard/api/ResponseTransformers.ts | 12 +++++++++--- 12 files changed, 22 insertions(+), 26 deletions(-) diff --git a/packages/grafana-schema/src/schema/dashboard/v2alpha0/dashboard.schema.cue b/packages/grafana-schema/src/schema/dashboard/v2alpha0/dashboard.schema.cue index 4b52f6757b4..5f164f1aded 100644 --- a/packages/grafana-schema/src/schema/dashboard/v2alpha0/dashboard.schema.cue +++ b/packages/grafana-schema/src/schema/dashboard/v2alpha0/dashboard.schema.cue @@ -5,10 +5,6 @@ import ( ) DashboardV2Spec: { - // Unique numeric identifier for the dashboard. - // `id` is internal to a specific Grafana instance. `uid` should be used to identify a dashboard across Grafana instances. - id?: int64 - // Title of dashboard. title: string @@ -43,7 +39,7 @@ DashboardV2Spec: { // Configured template variables. variables: [...VariableKind] - elements: [ElementReference.name]: Element + elements: [ElementReference.name]: Element annotations: [...AnnotationQueryKind] @@ -68,7 +64,7 @@ LibraryPanelSpec: { id: number // Title for the library panel in the dashboard title: string - + libraryPanel: LibraryPanelRef } diff --git a/packages/grafana-schema/src/schema/dashboard/v2alpha0/examples.ts b/packages/grafana-schema/src/schema/dashboard/v2alpha0/examples.ts index b96fbd6f362..ed513da75c4 100644 --- a/packages/grafana-schema/src/schema/dashboard/v2alpha0/examples.ts +++ b/packages/grafana-schema/src/schema/dashboard/v2alpha0/examples.ts @@ -1,7 +1,6 @@ import { DashboardV2Spec } from './types.gen'; export const handyTestingSchema: DashboardV2Spec = { - id: 1, title: 'Default Dashboard', description: 'This is a default dashboard', cursorSync: 'Off', diff --git a/packages/grafana-schema/src/schema/dashboard/v2alpha0/types.gen.ts b/packages/grafana-schema/src/schema/dashboard/v2alpha0/types.gen.ts index bd6dba3279d..7b7ef1cda07 100644 --- a/packages/grafana-schema/src/schema/dashboard/v2alpha0/types.gen.ts +++ b/packages/grafana-schema/src/schema/dashboard/v2alpha0/types.gen.ts @@ -4,9 +4,6 @@ import * as common from '@grafana/schema'; export interface DashboardV2Spec { - // Unique numeric identifier for the dashboard. - // `id` is internal to a specific Grafana instance. `uid` should be used to identify a dashboard across Grafana instances. - id?: number; // Title of dashboard. title: string; // Description of dashboard. diff --git a/public/app/features/apiserver/types.ts b/public/app/features/apiserver/types.ts index 95953d209bc..9290ac779c2 100644 --- a/public/app/features/apiserver/types.ts +++ b/public/app/features/apiserver/types.ts @@ -42,7 +42,6 @@ export const AnnoKeyFolderId = 'grafana.app/folderId'; export const AnnoKeyFolderUrl = 'grafana.app/folderUrl'; export const AnnoKeyMessage = 'grafana.app/message'; export const AnnoKeySlug = 'grafana.app/slug'; -export const AnnoKeyDashboardId = 'grafana.app/dashboardId'; // Identify where values came from export const AnnoKeyRepoName = 'grafana.app/repoName'; @@ -66,7 +65,6 @@ type GrafanaAnnotations = { [AnnoKeyUpdatedBy]?: string; [AnnoKeyFolder]?: string; [AnnoKeySlug]?: string; - [AnnoKeyDashboardId]?: number; [AnnoKeyRepoName]?: string; [AnnoKeyRepoPath]?: string; diff --git a/public/app/features/dashboard-scene/saving/SaveDashboardAsForm.tsx b/public/app/features/dashboard-scene/saving/SaveDashboardAsForm.tsx index 39dc0bca90a..e21fbeb4e8f 100644 --- a/public/app/features/dashboard-scene/saving/SaveDashboardAsForm.tsx +++ b/public/app/features/dashboard-scene/saving/SaveDashboardAsForm.tsx @@ -138,7 +138,7 @@ export function SaveDashboardAsForm({ dashboard, changeInfo }: Props) { // Old folder picker fields value={formValues.folder?.uid} initialTitle={defaultValues!.folder!.title} - dashboardId={changedSaveModel.id ?? undefined} + dashboardId={dashboard.state.id ?? undefined} enableCreateNew /> diff --git a/public/app/features/dashboard-scene/serialization/DashboardSceneSerializer.test.ts b/public/app/features/dashboard-scene/serialization/DashboardSceneSerializer.test.ts index cc9bbea4cc6..0844b4c454e 100644 --- a/public/app/features/dashboard-scene/serialization/DashboardSceneSerializer.test.ts +++ b/public/app/features/dashboard-scene/serialization/DashboardSceneSerializer.test.ts @@ -627,7 +627,6 @@ describe('DashboardSceneSerializer', () => { expect(saveAsModel).toMatchObject({ title: baseOptions.title, description: baseOptions.description, - id: undefined, editable: true, annotations: [], cursorSync: 'Off', @@ -801,7 +800,6 @@ describe('DashboardSceneSerializer', () => { expect(serializer.initialSaveModel).toEqual({ ...saveModel, - id: response.id, }); }); diff --git a/public/app/features/dashboard-scene/serialization/DashboardSceneSerializer.ts b/public/app/features/dashboard-scene/serialization/DashboardSceneSerializer.ts index b185047241c..f1fae45ce02 100644 --- a/public/app/features/dashboard-scene/serialization/DashboardSceneSerializer.ts +++ b/public/app/features/dashboard-scene/serialization/DashboardSceneSerializer.ts @@ -172,7 +172,6 @@ export class V2DashboardSerializer onSaveComplete(saveModel: DashboardV2Spec, result: SaveDashboardResponseDTO): void { this.initialSaveModel = { ...saveModel, - id: result.id, }; } diff --git a/public/app/features/dashboard-scene/serialization/__snapshots__/transformSceneToSaveModelSchemaV2.test.ts.snap b/public/app/features/dashboard-scene/serialization/__snapshots__/transformSceneToSaveModelSchemaV2.test.ts.snap index dcd651aa5f7..3ba7caea2c7 100644 --- a/public/app/features/dashboard-scene/serialization/__snapshots__/transformSceneToSaveModelSchemaV2.test.ts.snap +++ b/public/app/features/dashboard-scene/serialization/__snapshots__/transformSceneToSaveModelSchemaV2.test.ts.snap @@ -89,7 +89,6 @@ exports[`transformSceneToSaveModelSchemaV2 should transform scene to save model }, }, }, - "id": 1, "layout": { "kind": "GridLayout", "spec": { diff --git a/public/app/features/dashboard-scene/serialization/transformSaveModelSchemaV2ToScene.ts b/public/app/features/dashboard-scene/serialization/transformSaveModelSchemaV2ToScene.ts index a78771340ff..579f74b44d3 100644 --- a/public/app/features/dashboard-scene/serialization/transformSaveModelSchemaV2ToScene.ts +++ b/public/app/features/dashboard-scene/serialization/transformSaveModelSchemaV2ToScene.ts @@ -59,6 +59,7 @@ import { AnnoKeyUpdatedBy, AnnoKeyUpdatedTimestamp, AnnoKeyDashboardIsSnapshot, + DeprecatedInternalId, } from 'app/features/apiserver/types'; import { DashboardWithAccessInfo } from 'app/features/dashboard/api/types'; import { MIXED_DATASOURCE_NAME } from 'app/plugins/datasource/mixed/MixedDataSource'; @@ -125,6 +126,7 @@ export function transformSaveModelSchemaV2ToScene(dto: DashboardWithAccessInfo = { //dashboard settings - id: oldDash.id ? oldDash.id : undefined, title: oldDash.title, description: oldDash.description ?? '', cursorSync: getCursorSync(oldDash), diff --git a/public/app/features/dashboard/api/ResponseTransformers.test.ts b/public/app/features/dashboard/api/ResponseTransformers.test.ts index 1209f884b47..95034c757ac 100644 --- a/public/app/features/dashboard/api/ResponseTransformers.test.ts +++ b/public/app/features/dashboard/api/ResponseTransformers.test.ts @@ -4,11 +4,11 @@ import { handyTestingSchema } from '@grafana/schema/dist/esm/schema/dashboard/v2 import { AnnoKeyCreatedBy, AnnoKeyDashboardGnetId, - AnnoKeyDashboardId, AnnoKeyFolder, AnnoKeySlug, AnnoKeyUpdatedBy, AnnoKeyUpdatedTimestamp, + DeprecatedInternalId, } from 'app/features/apiserver/types'; import { getDefaultDataSourceRef } from 'app/features/dashboard-scene/serialization/transformSceneToSaveModelSchemaV2'; import { @@ -353,6 +353,9 @@ describe('ResponseTransformers', () => { [AnnoKeyFolder]: 'folder1', [AnnoKeySlug]: 'dashboard-slug', }, + labels: { + [DeprecatedInternalId]: 123, + }, }, }; @@ -366,8 +369,8 @@ describe('ResponseTransformers', () => { expect(transformed.metadata.annotations?.[AnnoKeyUpdatedTimestamp]).toEqual('2023-01-02T00:00:00Z'); expect(transformed.metadata.annotations?.[AnnoKeyFolder]).toEqual('folder1'); expect(transformed.metadata.annotations?.[AnnoKeySlug]).toEqual('dashboard-slug'); - expect(transformed.metadata.annotations?.[AnnoKeyDashboardId]).toBe(123); expect(transformed.metadata.annotations?.[AnnoKeyDashboardGnetId]).toBe('something-like-a-uid'); + expect(transformed.metadata.labels?.[DeprecatedInternalId]).toBe(123); // Spec const spec = transformed.spec; diff --git a/public/app/features/dashboard/api/ResponseTransformers.ts b/public/app/features/dashboard/api/ResponseTransformers.ts index 695157f5c6c..fa352b029c7 100644 --- a/public/app/features/dashboard/api/ResponseTransformers.ts +++ b/public/app/features/dashboard/api/ResponseTransformers.ts @@ -39,13 +39,13 @@ import { DashboardLink, DataTransformerConfig } from '@grafana/schema/src/raw/da import { AnnoKeyCreatedBy, AnnoKeyDashboardGnetId, - AnnoKeyDashboardId, AnnoKeyDashboardIsSnapshot, AnnoKeyDashboardSnapshotOriginalUrl, AnnoKeyFolder, AnnoKeySlug, AnnoKeyUpdatedBy, AnnoKeyUpdatedTimestamp, + DeprecatedInternalId, } from 'app/features/apiserver/types'; import { TypedVariableModelV2 } from 'app/features/dashboard-scene/serialization/transformSaveModelSchemaV2ToScene'; import { getDefaultDataSourceRef } from 'app/features/dashboard-scene/serialization/transformSceneToSaveModelSchemaV2'; @@ -91,6 +91,7 @@ export function ensureV2Response( let accessMeta: DashboardWithAccessInfo['access']; let annotationsMeta: DashboardWithAccessInfo['metadata']['annotations']; + let labelsMeta: DashboardWithAccessInfo['metadata']['labels']; let creationTimestamp; if (isDashboardResource(dto)) { @@ -101,11 +102,13 @@ export function ensureV2Response( [AnnoKeyUpdatedTimestamp]: dto.metadata.annotations?.[AnnoKeyUpdatedTimestamp], [AnnoKeyFolder]: dto.metadata.annotations?.[AnnoKeyFolder], [AnnoKeySlug]: dto.metadata.annotations?.[AnnoKeySlug], - [AnnoKeyDashboardId]: dashboard.id ?? undefined, [AnnoKeyDashboardGnetId]: dashboard.gnetId ?? undefined, [AnnoKeyDashboardIsSnapshot]: dto.metadata.annotations?.[AnnoKeyDashboardIsSnapshot], }; creationTimestamp = dto.metadata.creationTimestamp; + labelsMeta = { + [DeprecatedInternalId]: dto.metadata.labels?.[DeprecatedInternalId], + }; } else { accessMeta = { url: dto.meta.url, @@ -124,11 +127,13 @@ export function ensureV2Response( [AnnoKeyUpdatedTimestamp]: dto.meta.updated, [AnnoKeyFolder]: dto.meta.folderUid, [AnnoKeySlug]: dto.meta.slug, - [AnnoKeyDashboardId]: dashboard.id ?? undefined, [AnnoKeyDashboardGnetId]: dashboard.gnetId ?? undefined, [AnnoKeyDashboardIsSnapshot]: dto.meta.isSnapshot, }; creationTimestamp = dto.meta.created; + labelsMeta = { + [DeprecatedInternalId]: dashboard.id ?? undefined, + }; } if (annotationsMeta?.[AnnoKeyDashboardIsSnapshot]) { @@ -171,6 +176,7 @@ export function ensureV2Response( name: dashboard.uid, resourceVersion: dashboard.version?.toString() || '0', annotations: annotationsMeta, + labels: labelsMeta, }, spec, access: accessMeta,