DataSourceSrv: Look up data source by uid and name transparently (#29449)

* Datasources: Look up data source by uid or name transparently

* comment tweak

* Removed config

* fixed type issues

* Initialize datasource srv

* Added deprecation notice

* Renamed getSettingsFor to getInstanceSettings

* fixed ts issue
This commit is contained in:
Torkel Ödegaard
2020-12-01 15:17:33 +01:00
committed by GitHub
parent b7aa6fed1d
commit 38caa80acd
9 changed files with 177 additions and 112 deletions
@@ -17,6 +17,7 @@ export interface DataSourceSrv {
/**
* Returns metadata based on UID.
* @deprecated use getInstanceSettings
*/
getDataSourceSettingsByUid(uid: string): DataSourceInstanceSettings | undefined;
@@ -29,6 +30,11 @@ export interface DataSourceSrv {
* Get all data sources except for internal ones that usually should not be listed like mixed data source.
*/
getExternal(): DataSourceInstanceSettings[];
/**
* Get settings and plugin metadata by name or uid
*/
getInstanceSettings(nameOrUid: string | null | undefined): DataSourceInstanceSettings | undefined;
}
let singletonInstance: DataSourceSrv;
@@ -19,19 +19,10 @@ const backendSrv = ({
jest.mock('../services', () => ({
getBackendSrv: () => backendSrv,
}));
jest.mock('..', () => ({
config: {
bootData: {
user: {
orgId: 77,
},
},
datasources: {
sample: {
id: 8674,
},
},
getDataSourceSrv: () => {
return {
getInstanceSettings: () => ({ id: 8674 }),
};
},
}));
@@ -46,6 +37,7 @@ describe('DataSourceWithBackend', () => {
mockDatasourceRequest.mockReset();
mockDatasourceRequest.mockReturnValue(Promise.resolve({}));
const ds = new MyDataSource(settings);
ds.query({
maxDataPoints: 10,
intervalMs: 5000,
@@ -64,7 +56,6 @@ describe('DataSourceWithBackend', () => {
"datasourceId": 1234,
"intervalMs": 5000,
"maxDataPoints": 10,
"orgId": 77,
"refId": "A",
},
Object {
@@ -72,7 +63,6 @@ describe('DataSourceWithBackend', () => {
"datasourceId": 8674,
"intervalMs": 5000,
"maxDataPoints": 10,
"orgId": 77,
"refId": "B",
},
],
@@ -9,8 +9,7 @@ import {
} from '@grafana/data';
import { Observable, of } from 'rxjs';
import { map, catchError } from 'rxjs/operators';
import { config } from '..';
import { getBackendSrv } from '../services';
import { getBackendSrv, getDataSourceSrv } from '../services';
import { toDataQueryResponse } from './queryResponse';
const ExpressionDatasourceID = '__expr__';
@@ -57,34 +56,37 @@ export class DataSourceWithBackend<
*/
query(request: DataQueryRequest<TQuery>): Observable<DataQueryResponse> {
const { intervalMs, maxDataPoints, range, requestId } = request;
const orgId = config.bootData.user.orgId;
let targets = request.targets;
if (this.filterQuery) {
targets = targets.filter(q => this.filterQuery!(q));
}
const queries = targets.map(q => {
let datasourceId = this.id;
if (q.datasource === ExpressionDatasourceID) {
return {
...q,
datasourceId,
orgId,
};
}
if (q.datasource) {
const dsName = q.datasource === 'default' ? config.defaultDatasource : q.datasource;
const ds = config.datasources[dsName];
const ds = getDataSourceSrv().getInstanceSettings(q.datasource);
if (!ds) {
throw new Error('Unknown Datasource: ' + q.datasource);
}
datasourceId = ds.id;
}
return {
...this.applyTemplateVariables(q, request.scopedVars),
datasourceId,
intervalMs,
maxDataPoints,
orgId,
};
});
@@ -93,9 +95,8 @@ export class DataSourceWithBackend<
return of({ data: [] });
}
const body: any = {
queries,
};
const body: any = { queries };
if (range) {
body.range = range;
body.from = range.from.valueOf().toString();