From 99610e040fe020dafe064420253441148f9394ed Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Torkel=20=C3=96degaard?= Date: Wed, 7 Nov 2018 11:14:39 -0800 Subject: [PATCH] fixed exporter bug missing adding requires for datasources only used via data source variable, fixes #13891 --- .../app/features/dashboard/export/exporter.ts | 33 ++++++++++++------- .../features/dashboard/specs/exporter.test.ts | 14 ++++++-- 2 files changed, 34 insertions(+), 13 deletions(-) diff --git a/public/app/features/dashboard/export/exporter.ts b/public/app/features/dashboard/export/exporter.ts index d0802be72db..7aecb5c384f 100644 --- a/public/app/features/dashboard/export/exporter.ts +++ b/public/app/features/dashboard/export/exporter.ts @@ -29,19 +29,36 @@ export class DashboardExporter { } const templateizeDatasourceUsage = obj => { + let datasource = obj.datasource; + let datasourceVariable = null; + // ignore data source properties that contain a variable - if (obj.datasource && obj.datasource.indexOf('$') === 0) { - if (variableLookup[obj.datasource.substring(1)]) { - return; + if (datasource && datasource.indexOf('$') === 0) { + datasourceVariable = variableLookup[datasource.substring(1)]; + if (datasourceVariable && datasourceVariable.current) { + datasource = datasourceVariable.current.value; } } promises.push( - this.datasourceSrv.get(obj.datasource).then(ds => { + this.datasourceSrv.get(datasource).then(ds => { if (ds.meta.builtIn) { return; } + // add data source type to require list + requires['datasource' + ds.meta.id] = { + type: 'datasource', + id: ds.meta.id, + name: ds.meta.name, + version: ds.meta.info.version || '1.0.0', + }; + + // if used via variable we can skip templatizing usage + if (datasourceVariable) { + return; + } + const refName = 'DS_' + ds.name.replace(' ', '_').toUpperCase(); datasources[refName] = { name: refName, @@ -51,14 +68,8 @@ export class DashboardExporter { pluginId: ds.meta.id, pluginName: ds.meta.name, }; - obj.datasource = '${' + refName + '}'; - requires['datasource' + ds.meta.id] = { - type: 'datasource', - id: ds.meta.id, - name: ds.meta.name, - version: ds.meta.info.version || '1.0.0', - }; + obj.datasource = '${' + refName + '}'; }) ); }; diff --git a/public/app/features/dashboard/specs/exporter.test.ts b/public/app/features/dashboard/specs/exporter.test.ts index f21e151f3dd..eac6b0b272a 100644 --- a/public/app/features/dashboard/specs/exporter.test.ts +++ b/public/app/features/dashboard/specs/exporter.test.ts @@ -32,8 +32,8 @@ describe('given dashboard with repeated panels', () => { { name: 'ds', type: 'datasource', - query: 'testdb', - current: { value: 'prod', text: 'prod' }, + query: 'other2', + current: { value: 'other2', text: 'other2' }, options: [], }, ], @@ -205,6 +205,11 @@ describe('given dashboard with repeated panels', () => { expect(variable.options[0].text).toBe('${VAR_PREFIX}'); expect(variable.options[0].value).toBe('${VAR_PREFIX}'); }); + + it('should add datasources only use via datasource variable to requires', () => { + const require = _.find(exported.__requires, { name: 'OtherDB_2' }); + expect(require.id).toBe('other2'); + }); }); // Stub responses @@ -219,6 +224,11 @@ stubs['other'] = { meta: { id: 'other', info: { version: '1.2.1' }, name: 'OtherDB' }, }; +stubs['other2'] = { + name: 'other2', + meta: { id: 'other2', info: { version: '1.2.1' }, name: 'OtherDB_2' }, +}; + stubs['-- Mixed --'] = { name: 'mixed', meta: {