diff --git a/public/app/features/dashboard/components/DashExportModal/DashboardExporter.test.ts b/public/app/features/dashboard/components/DashExportModal/DashboardExporter.test.ts index 9917955f6f6..15b958bc505 100644 --- a/public/app/features/dashboard/components/DashExportModal/DashboardExporter.test.ts +++ b/public/app/features/dashboard/components/DashExportModal/DashboardExporter.test.ts @@ -1,10 +1,11 @@ import { find } from 'lodash'; -import { DataSourceInstanceSettings, DataSourceRef, PanelPluginMeta } from '@grafana/data'; -import { Dashboard, ThresholdsMode } from '@grafana/schema'; +import { DataSourceInstanceSettings, DataSourceRef, PanelPluginMeta, TypedVariableModel } from '@grafana/data'; +import { Dashboard, DashboardCursorSync, ThresholdsMode } from '@grafana/schema'; import config from 'app/core/config'; import { LibraryElementKind } from '../../../library-panels/types'; +import { DashboardJson } from '../../../manage-dashboards/types'; import { variableAdapters } from '../../../variables/adapters'; import { createConstantVariableAdapter } from '../../../variables/constant/adapter'; import { createDataSourceVariableAdapter } from '../../../variables/datasource/adapter'; @@ -94,6 +95,54 @@ it('handles a default datasource in a template variable', async () => { expect(exported.templating.list[0].datasource.uid).toBe('${DS_GFDB}'); }); +it('do not expose datasource name and id in a in a template variable of type datasource', async () => { + const dashboard: Dashboard = { + title: 'My dashboard', + revision: 1, + editable: false, + graphTooltip: DashboardCursorSync.Off, + schemaVersion: 1, + timepicker: { hidden: true }, + timezone: '', + panels: [ + { + id: 1, + type: 'timeseries', + title: 'My panel title', + gridPos: { x: 0, y: 0, w: 1, h: 1 }, + }, + ], + templating: { + list: [ + { + current: { + selected: false, + text: 'my-prometheus-datasource', + value: 'my-prometheus-datasource-uid', + }, + hide: 0, + includeAll: false, + multi: false, + name: 'query1', + options: [], + query: 'prometheus', + refresh: 1, + regex: '', + skipUrlSync: false, + type: 'datasource', + }, + ], + }, + }; + const dashboardModel = new DashboardModel(dashboard, undefined, { + getVariablesFromState: () => dashboard.templating!.list! as TypedVariableModel[], + }); + const exporter = new DashboardExporter(); + const exported = (await exporter.makeExportable(dashboardModel)) as DashboardJson; + const value = exported?.templating?.list ? exported?.templating?.list[0].current : ''; + expect(value).toEqual({}); +}); + it('replaces datasource ref in library panel', async () => { const dashboard: Dashboard = { editable: true, diff --git a/public/app/features/dashboard/components/DashExportModal/DashboardExporter.ts b/public/app/features/dashboard/components/DashExportModal/DashboardExporter.ts index 6ae2611f63c..165c7742a30 100644 --- a/public/app/features/dashboard/components/DashExportModal/DashboardExporter.ts +++ b/public/app/features/dashboard/components/DashExportModal/DashboardExporter.ts @@ -9,7 +9,8 @@ import { variableRegex } from 'app/features/variables/utils'; import { isPanelModelLibraryPanel } from '../../../library-panels/guard'; import { LibraryElementKind } from '../../../library-panels/types'; -import { isConstant, isQuery } from '../../../variables/guard'; +import { DashboardJson } from '../../../manage-dashboards/types'; +import { isConstant } from '../../../variables/guard'; import { DashboardModel } from '../../state/DashboardModel'; import { GridPos } from '../../state/PanelModel'; @@ -224,12 +225,14 @@ export class DashboardExporter { // templatize template vars for (const variable of saveModel.getVariables()) { - if (isQuery(variable)) { + if (variable.type === 'query') { await templateizeDatasourceUsage(variable); variable.options = []; variable.current = {} as unknown as VariableOption; variable.refresh = variable.refresh !== VariableRefresh.never ? variable.refresh : VariableRefresh.onDashboardLoad; + } else if (variable.type === 'datasource') { + variable.current = {}; } } @@ -292,7 +295,7 @@ export class DashboardExporter { ); // make inputs and requires a top thing - const newObj: ExternalDashboard = defaults( + const newObj: DashboardJson = defaults( { __inputs: inputs, __elements,