Merge pull request #15084 from grafana/fix/explore-datasource-change

Update datasource before the loading has started
This commit is contained in:
Torkel Ödegaard 2019-01-28 17:55:33 +01:00 committed by GitHub
commit 8510f0cd11
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 64 additions and 34 deletions

View File

@ -45,7 +45,6 @@ interface ExploreProps {
datasourceLoading: boolean | null; datasourceLoading: boolean | null;
datasourceMissing: boolean; datasourceMissing: boolean;
exploreId: ExploreId; exploreId: ExploreId;
initialDatasource?: string;
initialQueries: DataQuery[]; initialQueries: DataQuery[];
initializeExplore: typeof initializeExplore; initializeExplore: typeof initializeExplore;
initialized: boolean; initialized: boolean;
@ -251,7 +250,6 @@ function mapStateToProps(state: StoreState, { exploreId }) {
datasourceInstance, datasourceInstance,
datasourceLoading, datasourceLoading,
datasourceMissing, datasourceMissing,
initialDatasource,
initialQueries, initialQueries,
initialized, initialized,
range, range,
@ -266,7 +264,6 @@ function mapStateToProps(state: StoreState, { exploreId }) {
datasourceInstance, datasourceInstance,
datasourceLoading, datasourceLoading,
datasourceMissing, datasourceMissing,
initialDatasource,
initialQueries, initialQueries,
initialized, initialized,
range, range,

View File

@ -1,6 +1,6 @@
// Types // Types
import { Emitter } from 'app/core/core'; import { Emitter } from 'app/core/core';
import { RawTimeRange, TimeRange, DataQuery, DataSourceSelectItem } from '@grafana/ui/src/types'; import { RawTimeRange, TimeRange, DataQuery, DataSourceSelectItem, DataSourceApi } from '@grafana/ui/src/types';
import { import {
ExploreId, ExploreId,
ExploreItemState, ExploreItemState,
@ -41,6 +41,7 @@ export enum ActionTypes {
ToggleGraph = 'explore/TOGGLE_GRAPH', ToggleGraph = 'explore/TOGGLE_GRAPH',
ToggleLogs = 'explore/TOGGLE_LOGS', ToggleLogs = 'explore/TOGGLE_LOGS',
ToggleTable = 'explore/TOGGLE_TABLE', ToggleTable = 'explore/TOGGLE_TABLE',
UpdateDatasourceInstance = 'explore/UPDATE_DATASOURCE_INSTANCE',
ResetExplore = 'explore/RESET_EXPLORE', ResetExplore = 'explore/RESET_EXPLORE',
} }
@ -100,7 +101,6 @@ export interface InitializeExploreAction {
payload: { payload: {
exploreId: ExploreId; exploreId: ExploreId;
containerWidth: number; containerWidth: number;
datasource: string;
eventBridge: Emitter; eventBridge: Emitter;
exploreDatasources: DataSourceSelectItem[]; exploreDatasources: DataSourceSelectItem[];
queries: DataQuery[]; queries: DataQuery[];
@ -124,7 +124,7 @@ export interface LoadDatasourcePendingAction {
type: ActionTypes.LoadDatasourcePending; type: ActionTypes.LoadDatasourcePending;
payload: { payload: {
exploreId: ExploreId; exploreId: ExploreId;
datasourceName: string; requestedDatasourceName: string;
}; };
} }
@ -142,7 +142,6 @@ export interface LoadDatasourceSuccessAction {
StartPage?: any; StartPage?: any;
datasourceInstance: any; datasourceInstance: any;
history: HistoryItem[]; history: HistoryItem[];
initialDatasource: string;
initialQueries: DataQuery[]; initialQueries: DataQuery[];
logsHighlighterExpressions?: any[]; logsHighlighterExpressions?: any[];
showingStartPage: boolean; showingStartPage: boolean;
@ -271,6 +270,14 @@ export interface ToggleLogsAction {
}; };
} }
export interface UpdateDatasourceInstanceAction {
type: ActionTypes.UpdateDatasourceInstance;
payload: {
exploreId: ExploreId;
datasourceInstance: DataSourceApi;
};
}
export interface ResetExploreAction { export interface ResetExploreAction {
type: ActionTypes.ResetExplore; type: ActionTypes.ResetExplore;
payload: {}; payload: {};
@ -304,4 +311,5 @@ export type Action =
| ToggleGraphAction | ToggleGraphAction
| ToggleLogsAction | ToggleLogsAction
| ToggleTableAction | ToggleTableAction
| UpdateDatasourceInstanceAction
| ResetExploreAction; | ResetExploreAction;

View File

@ -4,6 +4,8 @@ import { ThunkAction } from 'redux-thunk';
// Services & Utils // Services & Utils
import store from 'app/core/store'; import store from 'app/core/store';
import { getDatasourceSrv } from 'app/features/plugins/datasource_srv';
import { Emitter } from 'app/core/core';
import { import {
LAST_USED_DATASOURCE_KEY, LAST_USED_DATASOURCE_KEY,
clearQueryKeys, clearQueryKeys,
@ -21,8 +23,14 @@ import { updateLocation } from 'app/core/actions';
// Types // Types
import { StoreState } from 'app/types'; import { StoreState } from 'app/types';
import { DataQuery, DataSourceSelectItem, QueryHint } from '@grafana/ui/src/types'; import {
import { getDatasourceSrv } from 'app/features/plugins/datasource_srv'; RawTimeRange,
TimeRange,
DataSourceApi,
DataQuery,
DataSourceSelectItem,
QueryHint,
} from '@grafana/ui/src/types';
import { import {
ExploreId, ExploreId,
ExploreUrlState, ExploreUrlState,
@ -32,8 +40,6 @@ import {
QueryTransaction, QueryTransaction,
} from 'app/types/explore'; } from 'app/types/explore';
import { Emitter } from 'app/core/core';
import { RawTimeRange, TimeRange, DataSourceApi } from '@grafana/ui';
import { import {
Action as ThunkableAction, Action as ThunkableAction,
ActionTypes, ActionTypes,
@ -46,6 +52,7 @@ import {
LoadDatasourceSuccessAction, LoadDatasourceSuccessAction,
QueryTransactionStartAction, QueryTransactionStartAction,
ScanStopAction, ScanStopAction,
UpdateDatasourceInstanceAction,
} from './actionTypes'; } from './actionTypes';
type ThunkResult<R> = ThunkAction<R, StoreState, undefined, ThunkableAction>; type ThunkResult<R> = ThunkAction<R, StoreState, undefined, ThunkableAction>;
@ -64,6 +71,7 @@ export function addQueryRow(exploreId: ExploreId, index: number): AddQueryRowAct
export function changeDatasource(exploreId: ExploreId, datasource: string): ThunkResult<void> { export function changeDatasource(exploreId: ExploreId, datasource: string): ThunkResult<void> {
return async dispatch => { return async dispatch => {
const instance = await getDatasourceSrv().get(datasource); const instance = await getDatasourceSrv().get(datasource);
dispatch(updateDatasourceInstance(exploreId, instance));
dispatch(loadDatasource(exploreId, instance)); dispatch(loadDatasource(exploreId, instance));
}; };
} }
@ -136,7 +144,7 @@ export function highlightLogsExpression(exploreId: ExploreId, expressions: strin
*/ */
export function initializeExplore( export function initializeExplore(
exploreId: ExploreId, exploreId: ExploreId,
datasource: string, datasourceName: string,
queries: DataQuery[], queries: DataQuery[],
range: RawTimeRange, range: RawTimeRange,
containerWidth: number, containerWidth: number,
@ -156,7 +164,7 @@ export function initializeExplore(
payload: { payload: {
exploreId, exploreId,
containerWidth, containerWidth,
datasource, datasourceName,
eventBridge, eventBridge,
exploreDatasources, exploreDatasources,
queries, queries,
@ -166,9 +174,9 @@ export function initializeExplore(
if (exploreDatasources.length >= 1) { if (exploreDatasources.length >= 1) {
let instance; let instance;
if (datasource) { if (datasourceName) {
try { try {
instance = await getDatasourceSrv().get(datasource); instance = await getDatasourceSrv().get(datasourceName);
} catch (error) { } catch (error) {
console.error(error); console.error(error);
} }
@ -177,6 +185,7 @@ export function initializeExplore(
if (!instance) { if (!instance) {
instance = await getDatasourceSrv().get(); instance = await getDatasourceSrv().get();
} }
dispatch(updateDatasourceInstance(exploreId, instance));
dispatch(loadDatasource(exploreId, instance)); dispatch(loadDatasource(exploreId, instance));
} else { } else {
dispatch(loadDatasourceMissing(exploreId)); dispatch(loadDatasourceMissing(exploreId));
@ -215,11 +224,11 @@ export const loadDatasourceMissing = (exploreId: ExploreId): LoadDatasourceMissi
/** /**
* Start the async process of loading a datasource to display a loading indicator * Start the async process of loading a datasource to display a loading indicator
*/ */
export const loadDatasourcePending = (exploreId: ExploreId, datasourceName: string): LoadDatasourcePendingAction => ({ export const loadDatasourcePending = (exploreId: ExploreId, requestedDatasourceName: string): LoadDatasourcePendingAction => ({
type: ActionTypes.LoadDatasourcePending, type: ActionTypes.LoadDatasourcePending,
payload: { payload: {
exploreId, exploreId,
datasourceName, requestedDatasourceName,
}, },
}); });
@ -252,7 +261,6 @@ export const loadDatasourceSuccess = (
StartPage, StartPage,
datasourceInstance: instance, datasourceInstance: instance,
history, history,
initialDatasource: instance.name,
initialQueries: queries, initialQueries: queries,
showingStartPage: Boolean(StartPage), showingStartPage: Boolean(StartPage),
supportsGraph, supportsGraph,
@ -262,6 +270,22 @@ export const loadDatasourceSuccess = (
}; };
}; };
/**
* Updates datasource instance before datasouce loading has started
*/
export function updateDatasourceInstance(
exploreId: ExploreId,
instance: DataSourceApi
): UpdateDatasourceInstanceAction {
return {
type: ActionTypes.UpdateDatasourceInstance,
payload: {
exploreId,
datasourceInstance: instance,
},
};
}
/** /**
* Main action to asynchronously load a datasource. Dispatches lots of smaller actions for feedback. * Main action to asynchronously load a datasource. Dispatches lots of smaller actions for feedback.
*/ */

View File

@ -24,6 +24,7 @@ export const makeExploreItemState = (): ExploreItemState => ({
StartPage: undefined, StartPage: undefined,
containerWidth: 0, containerWidth: 0,
datasourceInstance: null, datasourceInstance: null,
requestedDatasourceName: null,
datasourceError: null, datasourceError: null,
datasourceLoading: null, datasourceLoading: null,
datasourceMissing: false, datasourceMissing: false,
@ -162,20 +163,28 @@ export const itemReducer = (state, action: Action): ExploreItemState => {
} }
case ActionTypes.InitializeExplore: { case ActionTypes.InitializeExplore: {
const { containerWidth, datasource, eventBridge, exploreDatasources, queries, range } = action.payload; const { containerWidth, eventBridge, exploreDatasources, queries, range } = action.payload;
return { return {
...state, ...state,
containerWidth, containerWidth,
eventBridge, eventBridge,
exploreDatasources, exploreDatasources,
range, range,
initialDatasource: datasource,
initialQueries: queries, initialQueries: queries,
initialized: true, initialized: true,
modifiedQueries: queries.slice(), modifiedQueries: queries.slice(),
}; };
} }
case ActionTypes.UpdateDatasourceInstance: {
const { datasourceInstance } = action.payload;
return {
...state,
datasourceInstance,
datasourceName: datasourceInstance.name,
};
}
case ActionTypes.LoadDatasourceFailure: { case ActionTypes.LoadDatasourceFailure: {
return { ...state, datasourceError: action.payload.error, datasourceLoading: false }; return { ...state, datasourceError: action.payload.error, datasourceLoading: false };
} }
@ -185,7 +194,7 @@ export const itemReducer = (state, action: Action): ExploreItemState => {
} }
case ActionTypes.LoadDatasourcePending: { case ActionTypes.LoadDatasourcePending: {
return { ...state, datasourceLoading: true, requestedDatasourceName: action.payload.datasourceName }; return { ...state, datasourceLoading: true, requestedDatasourceName: action.payload.requestedDatasourceName };
} }
case ActionTypes.LoadDatasourceSuccess: { case ActionTypes.LoadDatasourceSuccess: {
@ -194,7 +203,6 @@ export const itemReducer = (state, action: Action): ExploreItemState => {
StartPage, StartPage,
datasourceInstance, datasourceInstance,
history, history,
initialDatasource,
initialQueries, initialQueries,
showingStartPage, showingStartPage,
supportsGraph, supportsGraph,
@ -209,7 +217,6 @@ export const itemReducer = (state, action: Action): ExploreItemState => {
StartPage, StartPage,
datasourceInstance, datasourceInstance,
history, history,
initialDatasource,
initialQueries, initialQueries,
showingStartPage, showingStartPage,
supportsGraph, supportsGraph,

View File

@ -110,7 +110,11 @@ export interface ExploreItemState {
/** /**
* Datasource instance that has been selected. Datasource-specific logic can be run on this object. * Datasource instance that has been selected. Datasource-specific logic can be run on this object.
*/ */
datasourceInstance: DataSourceApi; datasourceInstance: DataSourceApi | null;
/**
* Current data source name or null if default
*/
requestedDatasourceName: string | null;
/** /**
* Error to be shown when datasource loading or testing failed. * Error to be shown when datasource loading or testing failed.
*/ */
@ -139,10 +143,6 @@ export interface ExploreItemState {
* History of recent queries. Datasource-specific and initialized via localStorage. * History of recent queries. Datasource-specific and initialized via localStorage.
*/ */
history: HistoryItem[]; history: HistoryItem[];
/**
* Initial datasource for this Explore, e.g., set via URL.
*/
initialDatasource?: string;
/** /**
* Initial queries for this Explore, e.g., set via URL. Each query will be * Initial queries for this Explore, e.g., set via URL. Each query will be
* converted to a query row. Query edits should be tracked in `modifiedQueries` though. * converted to a query row. Query edits should be tracked in `modifiedQueries` though.
@ -181,12 +181,6 @@ export interface ExploreItemState {
* when query rows are removed. * when query rows are removed.
*/ */
queryTransactions: QueryTransaction[]; queryTransactions: QueryTransaction[];
/**
* Tracks datasource when selected in the datasource selector.
* Allows the selection to be discarded if something went wrong during the asynchronous
* loading of the datasource.
*/
requestedDatasourceName?: string;
/** /**
* Time range for this Explore. Managed by the time picker and used by all query runs. * Time range for this Explore. Managed by the time picker and used by all query runs.
*/ */