mirror of
https://github.com/grafana/grafana.git
synced 2025-02-25 18:55:37 -06:00
Explore: Load default data source in Explore when the provided source does not exist (#32992)
* Fallback to default data source in Explore and use uid for history uid is used to allow changing the name of the datasource and preserve history * Remove redundant console logs
This commit is contained in:
parent
db29a8a8de
commit
da03175d0b
@ -127,7 +127,7 @@ export const changeDedupStrategy = (
|
|||||||
*/
|
*/
|
||||||
export function initializeExplore(
|
export function initializeExplore(
|
||||||
exploreId: ExploreId,
|
exploreId: ExploreId,
|
||||||
datasourceName: string,
|
datasourceNameOrUid: string,
|
||||||
queries: DataQuery[],
|
queries: DataQuery[],
|
||||||
range: TimeRange,
|
range: TimeRange,
|
||||||
containerWidth: number,
|
containerWidth: number,
|
||||||
@ -141,7 +141,7 @@ export function initializeExplore(
|
|||||||
|
|
||||||
if (exploreDatasources.length >= 1) {
|
if (exploreDatasources.length >= 1) {
|
||||||
const orgId = getState().user.orgId;
|
const orgId = getState().user.orgId;
|
||||||
const loadResult = await loadAndInitDatasource(orgId, datasourceName);
|
const loadResult = await loadAndInitDatasource(orgId, datasourceNameOrUid);
|
||||||
instance = loadResult.instance;
|
instance = loadResult.instance;
|
||||||
history = loadResult.history;
|
history = loadResult.history;
|
||||||
}
|
}
|
||||||
|
49
public/app/features/explore/state/utils.test.ts
Normal file
49
public/app/features/explore/state/utils.test.ts
Normal file
@ -0,0 +1,49 @@
|
|||||||
|
import { lastUsedDatasourceKeyForOrgId } from '../../../core/utils/explore';
|
||||||
|
|
||||||
|
const dataSourceMock = {
|
||||||
|
get: jest.fn(),
|
||||||
|
};
|
||||||
|
jest.mock('app/features/plugins/datasource_srv', () => ({
|
||||||
|
getDatasourceSrv: jest.fn(() => dataSourceMock),
|
||||||
|
}));
|
||||||
|
|
||||||
|
const storeMock = {
|
||||||
|
getObject: jest.fn().mockReturnValue([]),
|
||||||
|
set: jest.fn(),
|
||||||
|
};
|
||||||
|
jest.mock('app/core/store', () => storeMock);
|
||||||
|
|
||||||
|
import { loadAndInitDatasource } from './utils';
|
||||||
|
|
||||||
|
const DEFAULT_DATASOURCE = { uid: 'abc123', name: 'Default' };
|
||||||
|
const TEST_DATASOURCE = { uid: 'def789', name: 'Test' };
|
||||||
|
|
||||||
|
describe('loadAndInitDatasource', () => {
|
||||||
|
beforeEach(() => {
|
||||||
|
jest.clearAllMocks();
|
||||||
|
});
|
||||||
|
|
||||||
|
it('falls back to default datasource if the provided one was not found', async () => {
|
||||||
|
dataSourceMock.get.mockRejectedValueOnce(new Error('Datasource not found'));
|
||||||
|
dataSourceMock.get.mockResolvedValue(DEFAULT_DATASOURCE);
|
||||||
|
|
||||||
|
const { instance } = await loadAndInitDatasource(1, 'Unknown');
|
||||||
|
|
||||||
|
expect(dataSourceMock.get).toBeCalledTimes(2);
|
||||||
|
expect(dataSourceMock.get).toBeCalledWith('Unknown');
|
||||||
|
expect(dataSourceMock.get).toBeCalledWith();
|
||||||
|
expect(instance).toMatchObject(DEFAULT_DATASOURCE);
|
||||||
|
expect(storeMock.set).toBeCalledWith(lastUsedDatasourceKeyForOrgId(1), DEFAULT_DATASOURCE.uid);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('saves last loaded data source uid', async () => {
|
||||||
|
dataSourceMock.get.mockResolvedValue(TEST_DATASOURCE);
|
||||||
|
|
||||||
|
const { instance } = await loadAndInitDatasource(1, 'Test');
|
||||||
|
|
||||||
|
expect(dataSourceMock.get).toBeCalledTimes(1);
|
||||||
|
expect(dataSourceMock.get).toBeCalledWith('Test');
|
||||||
|
expect(instance).toMatchObject(TEST_DATASOURCE);
|
||||||
|
expect(storeMock.set).toBeCalledWith(lastUsedDatasourceKeyForOrgId(1), TEST_DATASOURCE.uid);
|
||||||
|
});
|
||||||
|
});
|
@ -63,7 +63,15 @@ export async function loadAndInitDatasource(
|
|||||||
orgId: number,
|
orgId: number,
|
||||||
datasourceName?: string
|
datasourceName?: string
|
||||||
): Promise<{ history: HistoryItem[]; instance: DataSourceApi }> {
|
): Promise<{ history: HistoryItem[]; instance: DataSourceApi }> {
|
||||||
const instance = await getDatasourceSrv().get(datasourceName);
|
let instance;
|
||||||
|
try {
|
||||||
|
instance = await getDatasourceSrv().get(datasourceName);
|
||||||
|
} catch (error) {
|
||||||
|
// Falling back to the default data source in case the provided data source was not found.
|
||||||
|
// It may happen if last used data source or the data source provided in the URL has been
|
||||||
|
// removed or it is not provisioned anymore.
|
||||||
|
instance = await getDatasourceSrv().get();
|
||||||
|
}
|
||||||
if (instance.init) {
|
if (instance.init) {
|
||||||
try {
|
try {
|
||||||
instance.init();
|
instance.init();
|
||||||
@ -77,7 +85,7 @@ export async function loadAndInitDatasource(
|
|||||||
const history = store.getObject(historyKey, []);
|
const history = store.getObject(historyKey, []);
|
||||||
// Save last-used datasource
|
// Save last-used datasource
|
||||||
|
|
||||||
store.set(lastUsedDatasourceKeyForOrgId(orgId), instance.name);
|
store.set(lastUsedDatasourceKeyForOrgId(orgId), instance.uid);
|
||||||
return { history, instance };
|
return { history, instance };
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user