Public Dashboards: Query Caching (#51403)

* passes id and uid to PublicDashboardDatasource

* betterer results

* If for a public dashboard, return the PublicDashboardDataSource first or else getDatasourceSrv.get() will fail bc of no authed user.

Added some unit tests for resolving the uid from the many possible datasource types.

* updates betterer

* Exports DashboardService. Adds method to DashboardService to build anonymous user for use with public dashboards where there is no authed user. Adds method on dashboard_queries to get all dashboard uids from a dashboard.

* refactors to get unique datasource uids

* Adds tests for getting all unique datasource uids off a dashboard

* adds test for building anonymous user with read and query actions that are scoped to each datasource uid in the dashboard

* updates casing of DashboardService

* updates test case to have additional panel with a different datasource

* gives default interval to public dashboard data source
This commit is contained in:
owensmallwood
2022-07-06 12:42:39 -06:00
committed by GitHub
parent 9941e06e22
commit 0b4af38bfa
30 changed files with 353 additions and 68 deletions
@@ -483,7 +483,6 @@ export interface DataQueryRequest<TQuery extends DataQuery = DataQuery> {
timeInfo?: string; // The query time description (blue text in the upper right)
panelId?: number;
dashboardId?: number;
// Temporary prop for public dashboards, to be replaced by publicAccessKey
publicDashboardAccessToken?: string;
// Request Timing
@@ -1,9 +1,14 @@
import { of } from 'rxjs';
import { BackendSrv, BackendSrvRequest } from 'src/services';
import { DataQueryRequest, DataSourceRef } from '@grafana/data';
import { DataQueryRequest, DataSourceInstanceSettings, DataSourceRef } from '@grafana/data';
import { PublicDashboardDataSource } from '../../../../public/app/features/dashboard/services/PublicDashboardDataSource';
import {
PUBLIC_DATASOURCE,
PublicDashboardDataSource,
} from '../../../../public/app/features/dashboard/services/PublicDashboardDataSource';
import { DataSourceWithBackend } from './DataSourceWithBackend';
const mockDatasourceRequest = jest.fn();
@@ -28,7 +33,7 @@ describe('PublicDashboardDatasource', () => {
mockDatasourceRequest.mockReset();
mockDatasourceRequest.mockReturnValue(Promise.resolve({}));
const ds = new PublicDashboardDataSource();
const ds = new PublicDashboardDataSource('public');
const panelId = 1;
const publicDashboardAccessToken = 'abc123';
@@ -47,4 +52,27 @@ describe('PublicDashboardDatasource', () => {
`/api/public/dashboards/${publicDashboardAccessToken}/panels/${panelId}/query`
);
});
test('returns public datasource uid when datasource passed in is null', () => {
let ds = new PublicDashboardDataSource(null);
expect(ds.uid).toBe(PUBLIC_DATASOURCE);
});
test('returns datasource when datasource passed in is a string', () => {
let ds = new PublicDashboardDataSource('theDatasourceUid');
expect(ds.uid).toBe('theDatasourceUid');
});
test('returns datasource uid when datasource passed in is a DataSourceRef implementation', () => {
const datasource = { type: 'datasource', uid: 'abc123' };
let ds = new PublicDashboardDataSource(datasource);
expect(ds.uid).toBe('abc123');
});
test('returns datasource uid when datasource passed in is a DatasourceApi instance', () => {
const settings: DataSourceInstanceSettings = { id: 1, uid: 'abc123' } as DataSourceInstanceSettings;
const datasource = new DataSourceWithBackend(settings);
let ds = new PublicDashboardDataSource(datasource);
expect(ds.uid).toBe('abc123');
});
});