DataSourceApi: convert interface to abstract class (#16979)

* DataSourceApi as class

* add diff signature

* Prometheus: moved directUrl to jsonData
This commit is contained in:
Ryan McKinley
2019-05-10 02:37:43 -07:00
committed by Torkel Ödegaard
parent 5573d28582
commit 1d7bb2a763
21 changed files with 188 additions and 125 deletions

View File

@@ -2,11 +2,13 @@ import { stackdriverUnitMappings } from './constants';
import appEvents from 'app/core/app_events';
import _ from 'lodash';
import StackdriverMetricFindQuery from './StackdriverMetricFindQuery';
import { StackdriverQuery, MetricDescriptor } from './types';
import { DataSourceApi, DataQueryRequest } from '@grafana/ui/src/types';
import { StackdriverQuery, MetricDescriptor, StackdriverOptions } from './types';
import { DataSourceApi, DataQueryRequest, DataSourceInstanceSettings, ScopedVars } from '@grafana/ui/src/types';
import { BackendSrv } from 'app/core/services/backend_srv';
import { TemplateSrv } from 'app/features/templating/template_srv';
import { TimeSrv } from 'app/features/dashboard/services/TimeSrv';
export default class StackdriverDatasource implements DataSourceApi<StackdriverQuery> {
id: number;
export default class StackdriverDatasource extends DataSourceApi<StackdriverQuery, StackdriverOptions> {
url: string;
baseUrl: string;
projectName: string;
@@ -15,10 +17,15 @@ export default class StackdriverDatasource implements DataSourceApi<StackdriverQ
metricTypes: any[];
/** @ngInject */
constructor(instanceSettings, private backendSrv, private templateSrv, private timeSrv) {
constructor(
instanceSettings: DataSourceInstanceSettings<StackdriverOptions>,
private backendSrv: BackendSrv,
private templateSrv: TemplateSrv,
private timeSrv: TimeSrv
) {
super(instanceSettings);
this.baseUrl = `/stackdriver/`;
this.url = instanceSettings.url;
this.id = instanceSettings.id;
this.projectName = instanceSettings.jsonData.defaultProject || '';
this.authenticationType = instanceSettings.jsonData.authenticationType || 'jwt';
this.metricTypes = [];
@@ -62,7 +69,7 @@ export default class StackdriverDatasource implements DataSourceApi<StackdriverQ
}
}
interpolateFilters(filters: string[], scopedVars: object) {
interpolateFilters(filters: string[], scopedVars: ScopedVars) {
return (filters || []).map(f => {
return this.templateSrv.replace(f, scopedVars || {}, 'regex');
});

View File

@@ -3,26 +3,30 @@ import { metricDescriptors } from './testData';
import { TemplateSrv } from 'app/features/templating/template_srv';
import { CustomVariable } from 'app/features/templating/all';
import { toUtc } from '@grafana/ui/src/utils/moment_wrapper';
import { DataSourceInstanceSettings } from '@grafana/ui';
import { StackdriverOptions } from '../types';
import { BackendSrv } from 'app/core/services/backend_srv';
import { TimeSrv } from 'app/features/dashboard/services/TimeSrv';
describe('StackdriverDataSource', () => {
const instanceSettings = {
const instanceSettings = ({
jsonData: {
defaultProject: 'testproject',
},
};
} as unknown) as DataSourceInstanceSettings<StackdriverOptions>;
const templateSrv = new TemplateSrv();
const timeSrv = {};
const timeSrv = {} as TimeSrv;
describe('when performing testDataSource', () => {
describe('and call to stackdriver api succeeds', () => {
let ds;
let result;
beforeEach(async () => {
const backendSrv = {
const backendSrv = ({
async datasourceRequest() {
return Promise.resolve({ status: 200 });
},
};
} as unknown) as BackendSrv;
ds = new StackdriverDataSource(instanceSettings, backendSrv, templateSrv, timeSrv);
result = await ds.testDatasource();
});
@@ -35,9 +39,9 @@ describe('StackdriverDataSource', () => {
let ds;
let result;
beforeEach(async () => {
const backendSrv = {
const backendSrv = ({
datasourceRequest: async () => Promise.resolve({ status: 200, data: metricDescriptors }),
};
} as unknown) as BackendSrv;
ds = new StackdriverDataSource(instanceSettings, backendSrv, templateSrv, timeSrv);
result = await ds.testDatasource();
});
@@ -50,7 +54,7 @@ describe('StackdriverDataSource', () => {
let ds;
let result;
beforeEach(async () => {
const backendSrv = {
const backendSrv = ({
datasourceRequest: async () =>
Promise.reject({
statusText: 'Bad Request',
@@ -58,7 +62,7 @@ describe('StackdriverDataSource', () => {
error: { code: 400, message: 'Field interval.endTime had an invalid value' },
},
}),
};
} as unknown) as BackendSrv;
ds = new StackdriverDataSource(instanceSettings, backendSrv, templateSrv, timeSrv);
result = await ds.testDatasource();
});
@@ -103,9 +107,9 @@ describe('StackdriverDataSource', () => {
};
beforeEach(() => {
const backendSrv = {
const backendSrv = ({
datasourceRequest: async () => Promise.resolve({ status: 200, data: response }),
};
} as unknown) as BackendSrv;
ds = new StackdriverDataSource(instanceSettings, backendSrv, templateSrv, timeSrv);
});
@@ -122,7 +126,7 @@ describe('StackdriverDataSource', () => {
let ds;
let result;
beforeEach(async () => {
const backendSrv = {
const backendSrv = ({
async datasourceRequest() {
return Promise.resolve({
data: {
@@ -139,7 +143,7 @@ describe('StackdriverDataSource', () => {
},
});
},
};
} as unknown) as BackendSrv;
ds = new StackdriverDataSource(instanceSettings, backendSrv, templateSrv, timeSrv);
result = await ds.getMetricTypes();
});
@@ -155,12 +159,14 @@ describe('StackdriverDataSource', () => {
});
});
const noopBackendSrv = ({} as unknown) as BackendSrv;
describe('when interpolating a template variable for the filter', () => {
let interpolated;
describe('and is single value variable', () => {
beforeEach(() => {
const filterTemplateSrv = initTemplateSrv('filtervalue1');
const ds = new StackdriverDataSource(instanceSettings, {}, filterTemplateSrv, timeSrv);
const ds = new StackdriverDataSource(instanceSettings, noopBackendSrv, filterTemplateSrv, timeSrv);
interpolated = ds.interpolateFilters(['resource.label.zone', '=~', '${test}'], {});
});
@@ -173,7 +179,7 @@ describe('StackdriverDataSource', () => {
describe('and is multi value variable', () => {
beforeEach(() => {
const filterTemplateSrv = initTemplateSrv(['filtervalue1', 'filtervalue2'], true);
const ds = new StackdriverDataSource(instanceSettings, {}, filterTemplateSrv, timeSrv);
const ds = new StackdriverDataSource(instanceSettings, noopBackendSrv, filterTemplateSrv, timeSrv);
interpolated = ds.interpolateFilters(['resource.label.zone', '=~', '[[test]]'], {});
});
@@ -189,7 +195,7 @@ describe('StackdriverDataSource', () => {
describe('and is single value variable', () => {
beforeEach(() => {
const groupByTemplateSrv = initTemplateSrv('groupby1');
const ds = new StackdriverDataSource(instanceSettings, {}, groupByTemplateSrv, timeSrv);
const ds = new StackdriverDataSource(instanceSettings, noopBackendSrv, groupByTemplateSrv, timeSrv);
interpolated = ds.interpolateGroupBys(['[[test]]'], {});
});
@@ -202,7 +208,7 @@ describe('StackdriverDataSource', () => {
describe('and is multi value variable', () => {
beforeEach(() => {
const groupByTemplateSrv = initTemplateSrv(['groupby1', 'groupby2'], true);
const ds = new StackdriverDataSource(instanceSettings, {}, groupByTemplateSrv, timeSrv);
const ds = new StackdriverDataSource(instanceSettings, noopBackendSrv, groupByTemplateSrv, timeSrv);
interpolated = ds.interpolateGroupBys(['[[test]]'], {});
});
@@ -217,7 +223,7 @@ describe('StackdriverDataSource', () => {
describe('unit parsing', () => {
let ds, res;
beforeEach(() => {
ds = new StackdriverDataSource(instanceSettings, {}, templateSrv, timeSrv);
ds = new StackdriverDataSource(instanceSettings, noopBackendSrv, templateSrv, timeSrv);
});
describe('when theres only one target', () => {
describe('and the stackdriver unit doesnt have a corresponding grafana unit', () => {

View File

@@ -1,4 +1,4 @@
import { DataQuery } from '@grafana/ui/src/types';
import { DataQuery, DataSourceJsonData } from '@grafana/ui/src/types';
export enum MetricFindQueryTypes {
Services = 'services',
@@ -40,6 +40,11 @@ export interface StackdriverQuery extends DataQuery {
view?: string;
}
export interface StackdriverOptions extends DataSourceJsonData {
defaultProject?: string;
authenticationType?: string;
}
export interface AnnotationTarget {
defaultProject: string;
metricType: string;