mirror of
https://github.com/grafana/grafana.git
synced 2025-02-25 18:55:37 -06:00
DataSources: Patch legacy instances so they have the required properties and functions (#41594)
* DataSources: Patch legacy instances so they have the required properties and functions * Missed setting components
This commit is contained in:
@@ -205,11 +205,8 @@ abstract class DataSourceApi<
|
||||
this.name = instanceSettings.name;
|
||||
this.id = instanceSettings.id;
|
||||
this.type = instanceSettings.type;
|
||||
this.meta = {} as DataSourcePluginMeta;
|
||||
this.meta = instanceSettings.meta;
|
||||
this.uid = instanceSettings.uid;
|
||||
if (!this.uid) {
|
||||
this.uid = this.name; // Internal datasources do not have a UID (-- Grafana --)
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
|
@@ -144,13 +144,13 @@ export class DatasourceSrv implements DataSourceService {
|
||||
}
|
||||
|
||||
// find the metadata
|
||||
const dsConfig = this.settingsMapByUid[key] ?? this.settingsMapByName[key] ?? this.settingsMapById[key];
|
||||
if (!dsConfig) {
|
||||
const instanceSettings = this.settingsMapByUid[key] ?? this.settingsMapByName[key] ?? this.settingsMapById[key];
|
||||
if (!instanceSettings) {
|
||||
return Promise.reject({ message: `Datasource ${key} was not found` });
|
||||
}
|
||||
|
||||
try {
|
||||
const dsPlugin = await importDataSourcePlugin(dsConfig.meta);
|
||||
const dsPlugin = await importDataSourcePlugin(instanceSettings.meta);
|
||||
// check if its in cache now
|
||||
if (this.datasources[key]) {
|
||||
return this.datasources[key];
|
||||
@@ -162,21 +162,31 @@ export class DatasourceSrv implements DataSourceService {
|
||||
|
||||
if (useAngular) {
|
||||
instance = getLegacyAngularInjector().instantiate(dsPlugin.DataSourceClass, {
|
||||
instanceSettings: dsConfig,
|
||||
instanceSettings,
|
||||
});
|
||||
} else {
|
||||
instance = new dsPlugin.DataSourceClass(dsConfig);
|
||||
instance = new dsPlugin.DataSourceClass(instanceSettings);
|
||||
}
|
||||
|
||||
instance.components = dsPlugin.components;
|
||||
instance.meta = dsConfig.meta;
|
||||
|
||||
// Some old plugins does not extend DataSourceApi so we need to manually patch them
|
||||
if (!(instance instanceof DataSourceApi)) {
|
||||
const anyInstance = instance as any;
|
||||
anyInstance.name = instanceSettings.name;
|
||||
anyInstance.id = instanceSettings.id;
|
||||
anyInstance.type = instanceSettings.type;
|
||||
anyInstance.meta = instanceSettings.meta;
|
||||
anyInstance.uid = instanceSettings.uid;
|
||||
(instance as any).getRef = DataSourceApi.prototype.getRef;
|
||||
}
|
||||
|
||||
// store in instance cache
|
||||
this.datasources[key] = instance;
|
||||
this.datasources[instance.uid] = instance;
|
||||
return instance;
|
||||
} catch (err) {
|
||||
appEvents.emit(AppEvents.alertError, [dsConfig.name + ' plugin failed', err.toString()]);
|
||||
appEvents.emit(AppEvents.alertError, [instanceSettings.name + ' plugin failed', err.toString()]);
|
||||
return Promise.reject({ message: `Datasource: ${key} was not found` });
|
||||
}
|
||||
}
|
||||
|
@@ -1,5 +1,5 @@
|
||||
import { DatasourceSrv } from 'app/features/plugins/datasource_srv';
|
||||
import { DataSourceInstanceSettings, DataSourcePlugin } from '@grafana/data';
|
||||
import { DataSourceApi, DataSourceInstanceSettings, DataSourcePlugin, DataSourcePluginMeta } from '@grafana/data';
|
||||
|
||||
// Datasource variable $datasource with current value 'BBB'
|
||||
const templateSrv: any = {
|
||||
@@ -31,7 +31,7 @@ class TestDataSource {
|
||||
}
|
||||
|
||||
jest.mock('../plugin_loader', () => ({
|
||||
importDataSourcePlugin: () => {
|
||||
importDataSourcePlugin: (meta: DataSourcePluginMeta) => {
|
||||
return Promise.resolve(new DataSourcePlugin(TestDataSource as any));
|
||||
},
|
||||
}));
|
||||
@@ -115,6 +115,15 @@ describe('datasource_srv', () => {
|
||||
expect(dsByUid.meta).toBe(dsByName.meta);
|
||||
expect(dsByUid).toBe(dsByName);
|
||||
});
|
||||
|
||||
it('should patch legacy datasources', async () => {
|
||||
expect(TestDataSource instanceof DataSourceApi).toBe(false);
|
||||
const instance = await dataSourceSrv.get('mmm');
|
||||
expect(instance.name).toBe('mmm');
|
||||
expect(instance.type).toBe('test-db');
|
||||
expect(instance.uid).toBe('uid-code-mmm');
|
||||
expect(instance.getRef()).toEqual({ type: 'test-db', uid: 'uid-code-mmm' });
|
||||
});
|
||||
});
|
||||
|
||||
describe('when getting instance settings', () => {
|
||||
|
Reference in New Issue
Block a user