mirror of
https://github.com/grafana/grafana.git
synced 2025-02-25 18:55:37 -06:00
Dashboard: Migration [Panel Edit] Missing Query Editor when datasource is not found (#86789)
* Return default datasource if datasource is not found * Set query runner datasource state to default, else refreshing will not work
This commit is contained in:
parent
a8424f4831
commit
de589b98c7
@ -1,7 +1,7 @@
|
|||||||
import { map, of } from 'rxjs';
|
import { map, of } from 'rxjs';
|
||||||
|
|
||||||
import { DataQueryRequest, DataSourceApi, DataSourceInstanceSettings, LoadingState, PanelData } from '@grafana/data';
|
import { DataQueryRequest, DataSourceApi, DataSourceInstanceSettings, LoadingState, PanelData } from '@grafana/data';
|
||||||
import { locationService } from '@grafana/runtime';
|
import { config, locationService } from '@grafana/runtime';
|
||||||
import { SceneQueryRunner, VizPanel } from '@grafana/scenes';
|
import { SceneQueryRunner, VizPanel } from '@grafana/scenes';
|
||||||
import { DataQuery, DataSourceJsonData, DataSourceRef } from '@grafana/schema';
|
import { DataQuery, DataSourceJsonData, DataSourceRef } from '@grafana/schema';
|
||||||
import { getDashboardSrv } from 'app/features/dashboard/services/DashboardSrv';
|
import { getDashboardSrv } from 'app/features/dashboard/services/DashboardSrv';
|
||||||
@ -75,6 +75,18 @@ const ds3Mock: DataSourceApi = {
|
|||||||
},
|
},
|
||||||
} as DataSourceApi<DataQuery, DataSourceJsonData, {}>;
|
} as DataSourceApi<DataQuery, DataSourceJsonData, {}>;
|
||||||
|
|
||||||
|
const defaultDsMock: DataSourceApi = {
|
||||||
|
meta: {
|
||||||
|
id: 'grafana-testdata-datasource',
|
||||||
|
},
|
||||||
|
name: 'grafana-testdata-datasource',
|
||||||
|
type: 'grafana-testdata-datasource',
|
||||||
|
uid: 'gdev-testdata',
|
||||||
|
getRef: () => {
|
||||||
|
return { type: 'grafana-testdata-datasource', uid: 'gdev-testdata' };
|
||||||
|
},
|
||||||
|
} as DataSourceApi<DataQuery, DataSourceJsonData, {}>;
|
||||||
|
|
||||||
const instance1SettingsMock = {
|
const instance1SettingsMock = {
|
||||||
id: 1,
|
id: 1,
|
||||||
uid: 'gdev-testdata',
|
uid: 'gdev-testdata',
|
||||||
@ -124,6 +136,7 @@ jest.mock('@grafana/runtime', () => ({
|
|||||||
getDataSourceSrv: () => ({
|
getDataSourceSrv: () => ({
|
||||||
get: async (ref: DataSourceRef) => {
|
get: async (ref: DataSourceRef) => {
|
||||||
// Mocking the build in Grafana data source to avoid annotations data layer errors.
|
// Mocking the build in Grafana data source to avoid annotations data layer errors.
|
||||||
|
|
||||||
if (ref.uid === '-- Grafana --') {
|
if (ref.uid === '-- Grafana --') {
|
||||||
return grafanaDs;
|
return grafanaDs;
|
||||||
}
|
}
|
||||||
@ -140,7 +153,8 @@ jest.mock('@grafana/runtime', () => ({
|
|||||||
return ds3Mock;
|
return ds3Mock;
|
||||||
}
|
}
|
||||||
|
|
||||||
return null;
|
// if datasource is not found, return default datasource
|
||||||
|
return defaultDsMock;
|
||||||
},
|
},
|
||||||
getInstanceSettings: (ref: DataSourceRef) => {
|
getInstanceSettings: (ref: DataSourceRef) => {
|
||||||
if (ref.uid === 'gdev-testdata') {
|
if (ref.uid === 'gdev-testdata') {
|
||||||
@ -151,12 +165,17 @@ jest.mock('@grafana/runtime', () => ({
|
|||||||
return instance2SettingsMock;
|
return instance2SettingsMock;
|
||||||
}
|
}
|
||||||
|
|
||||||
return null;
|
// if datasource is not found, return default instance settings
|
||||||
|
return instance1SettingsMock;
|
||||||
},
|
},
|
||||||
}),
|
}),
|
||||||
locationService: {
|
locationService: {
|
||||||
partial: jest.fn(),
|
partial: jest.fn(),
|
||||||
},
|
},
|
||||||
|
config: {
|
||||||
|
...jest.requireActual('@grafana/runtime').config,
|
||||||
|
defaultDatasource: 'gdev-testdata',
|
||||||
|
},
|
||||||
}));
|
}));
|
||||||
|
|
||||||
describe('VizPanelManager', () => {
|
describe('VizPanelManager', () => {
|
||||||
@ -350,6 +369,21 @@ describe('VizPanelManager', () => {
|
|||||||
datasourceUid: 'gdev-testdata',
|
datasourceUid: 'gdev-testdata',
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it('should load default datasource if the datasource passed is not found', async () => {
|
||||||
|
const { vizPanelManager } = setupTest('panel-6');
|
||||||
|
vizPanelManager.activate();
|
||||||
|
await Promise.resolve();
|
||||||
|
|
||||||
|
expect(vizPanelManager.queryRunner.state.datasource).toEqual({
|
||||||
|
uid: 'abc',
|
||||||
|
type: 'datasource',
|
||||||
|
});
|
||||||
|
|
||||||
|
expect(config.defaultDatasource).toBe('gdev-testdata');
|
||||||
|
expect(vizPanelManager.state.datasource).toEqual(defaultDsMock);
|
||||||
|
expect(vizPanelManager.state.dsSettings).toEqual(instance1SettingsMock);
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
describe('data source change', () => {
|
describe('data source change', () => {
|
||||||
|
@ -154,6 +154,24 @@ export class VizPanelManager extends SceneObjectBase<VizPanelManagerState> {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
|
//set default datasource if we fail to load the datasource
|
||||||
|
const datasource = await getDataSourceSrv().get(config.defaultDatasource);
|
||||||
|
const dsSettings = getDataSourceSrv().getInstanceSettings(config.defaultDatasource);
|
||||||
|
|
||||||
|
if (datasource && dsSettings) {
|
||||||
|
this.setState({
|
||||||
|
datasource,
|
||||||
|
dsSettings,
|
||||||
|
});
|
||||||
|
|
||||||
|
this.queryRunner.setState({
|
||||||
|
datasource: {
|
||||||
|
uid: dsSettings.uid,
|
||||||
|
type: dsSettings.type,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
console.error(err);
|
console.error(err);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -410,6 +410,94 @@ export const panelWithNoDataSource = {
|
|||||||
title: 'Panel with no data source',
|
title: 'Panel with no data source',
|
||||||
type: 'timeseries',
|
type: 'timeseries',
|
||||||
};
|
};
|
||||||
|
|
||||||
|
export const panelWithDataSourceNotFound = {
|
||||||
|
datasource: {
|
||||||
|
type: 'datasource',
|
||||||
|
uid: 'abc',
|
||||||
|
},
|
||||||
|
fieldConfig: {
|
||||||
|
defaults: {
|
||||||
|
color: {
|
||||||
|
mode: 'palette-classic',
|
||||||
|
},
|
||||||
|
custom: {
|
||||||
|
axisBorderShow: false,
|
||||||
|
axisCenteredZero: false,
|
||||||
|
axisColorMode: 'text',
|
||||||
|
axisLabel: '',
|
||||||
|
axisPlacement: 'auto',
|
||||||
|
barAlignment: 0,
|
||||||
|
drawStyle: 'line',
|
||||||
|
fillOpacity: 0,
|
||||||
|
gradientMode: 'none',
|
||||||
|
hideFrom: {
|
||||||
|
legend: false,
|
||||||
|
tooltip: false,
|
||||||
|
viz: false,
|
||||||
|
},
|
||||||
|
insertNulls: false,
|
||||||
|
lineInterpolation: 'linear',
|
||||||
|
lineWidth: 1,
|
||||||
|
pointSize: 5,
|
||||||
|
scaleDistribution: {
|
||||||
|
type: 'linear',
|
||||||
|
},
|
||||||
|
showPoints: 'auto',
|
||||||
|
spanNulls: false,
|
||||||
|
stacking: {
|
||||||
|
group: 'A',
|
||||||
|
mode: 'none',
|
||||||
|
},
|
||||||
|
thresholdsStyle: {
|
||||||
|
mode: 'off',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
mappings: [],
|
||||||
|
thresholds: {
|
||||||
|
mode: 'absolute',
|
||||||
|
steps: [
|
||||||
|
{
|
||||||
|
color: 'green',
|
||||||
|
value: null,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
color: 'red',
|
||||||
|
value: 80,
|
||||||
|
},
|
||||||
|
],
|
||||||
|
},
|
||||||
|
},
|
||||||
|
overrides: [],
|
||||||
|
},
|
||||||
|
gridPos: {
|
||||||
|
h: 8,
|
||||||
|
w: 12,
|
||||||
|
x: 0,
|
||||||
|
y: 0,
|
||||||
|
},
|
||||||
|
id: 6,
|
||||||
|
options: {
|
||||||
|
legend: {
|
||||||
|
calcs: [],
|
||||||
|
displayMode: 'list',
|
||||||
|
placement: 'bottom',
|
||||||
|
showLegend: true,
|
||||||
|
},
|
||||||
|
tooltip: {
|
||||||
|
mode: 'single',
|
||||||
|
sort: 'none',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
targets: [
|
||||||
|
{
|
||||||
|
refId: 'A',
|
||||||
|
},
|
||||||
|
],
|
||||||
|
title: 'Panel with no data source',
|
||||||
|
type: 'timeseries',
|
||||||
|
};
|
||||||
|
|
||||||
export const testDashboard = {
|
export const testDashboard = {
|
||||||
annotations: {
|
annotations: {
|
||||||
list: [
|
list: [
|
||||||
@ -439,6 +527,7 @@ export const testDashboard = {
|
|||||||
panelWithDashboardQuery,
|
panelWithDashboardQuery,
|
||||||
panelWithDashboardQueryAndTransformations,
|
panelWithDashboardQueryAndTransformations,
|
||||||
panelWithNoDataSource,
|
panelWithNoDataSource,
|
||||||
|
panelWithDataSourceNotFound,
|
||||||
],
|
],
|
||||||
refresh: '',
|
refresh: '',
|
||||||
schemaVersion: 39,
|
schemaVersion: 39,
|
||||||
|
Loading…
Reference in New Issue
Block a user