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:
@@ -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();
|
||||
|
||||
Reference in New Issue
Block a user