diff --git a/public/app/features/dashboard-scene/saving/SaveDashboardForm.tsx b/public/app/features/dashboard-scene/saving/SaveDashboardForm.tsx index 97e7df9fcf3..22d0244f42d 100644 --- a/public/app/features/dashboard-scene/saving/SaveDashboardForm.tsx +++ b/public/app/features/dashboard-scene/saving/SaveDashboardForm.tsx @@ -33,7 +33,7 @@ export function SaveDashboardForm({ dashboard, drawer, changeInfo }: Props) { // we need to set the uid here in order to save the dashboard // in schema v2 we don't have the uid in the spec k8s: { - ...dashboard.state.meta.k8s, + ...dashboard.serializer.getK8SMetadata(), }, }); const { t } = useTranslate(); diff --git a/public/app/features/dashboard-scene/serialization/DashboardSceneSerializer.ts b/public/app/features/dashboard-scene/serialization/DashboardSceneSerializer.ts index fc1083b9a0d..121a3a4cca2 100644 --- a/public/app/features/dashboard-scene/serialization/DashboardSceneSerializer.ts +++ b/public/app/features/dashboard-scene/serialization/DashboardSceneSerializer.ts @@ -1,6 +1,6 @@ import { Dashboard } from '@grafana/schema'; import { Spec as DashboardV2Spec } from '@grafana/schema/dist/esm/schema/dashboard/v2alpha1/types.spec.gen'; -import { AnnoKeyDashboardSnapshotOriginalUrl } from 'app/features/apiserver/types'; +import { AnnoKeyDashboardSnapshotOriginalUrl, ObjectMeta } from 'app/features/apiserver/types'; import { DashboardWithAccessInfo } from 'app/features/dashboard/api/types'; import { isDashboardV2Spec } from 'app/features/dashboard/api/utils'; import { SaveDashboardAsOptions } from 'app/features/dashboard/components/SaveDashboard/types'; @@ -56,6 +56,7 @@ export interface DashboardSceneSerializerLike Map; getDSReferencesMapping: () => DSReferencesMapping; makeExportableExternally: (s: DashboardScene) => Promise; + getK8SMetadata: () => Partial | undefined; } interface DashboardTrackingInfo { @@ -178,6 +179,17 @@ export class V1DashboardSerializer uid: result.uid, version: result.version, }; + this.metadata = { + ...this.metadata, + k8s: { + ...this.metadata?.k8s, + generation: result.version, + }, + }; + } + + getK8SMetadata() { + return this.metadata?.k8s; } getTrackingInformation(): DashboardTrackingInfo | undefined { @@ -376,6 +388,16 @@ export class V2DashboardSerializer this.initialSaveModel = { ...saveModel, }; + if (this.metadata) { + this.metadata = { + ...this.metadata, + generation: result.version, + }; + } + } + + getK8SMetadata() { + return this.metadata; } getTrackingInformation(s: DashboardScene): DashboardTrackingInfo | undefined { diff --git a/public/app/features/dashboard/api/v1.ts b/public/app/features/dashboard/api/v1.ts index 752f3e2b102..708f52e2061 100644 --- a/public/app/features/dashboard/api/v1.ts +++ b/public/app/features/dashboard/api/v1.ts @@ -69,6 +69,8 @@ export class K8sDashboardAPI implements DashboardAPI { // as we implement the necessary backend conversions, we will drop this query param if (dashboard.uid) { obj.metadata.name = dashboard.uid; + // remove resource version when updating + delete obj.metadata.resourceVersion; return this.client.update(obj, { fieldValidation: 'Ignore' }).then((v) => this.asSaveDashboardResponseDTO(v)); } obj.metadata.annotations = {