E2C: Remove mock api (#86043)

This commit is contained in:
Josh Hunt
2024-04-12 13:26:13 +01:00
committed by GitHub
parent aba15646b6
commit 3b4983695e
4 changed files with 4 additions and 275 deletions
-2
View File
@@ -17,7 +17,6 @@ import foldersReducers from 'app/features/folders/state/reducers';
import invitesReducers from 'app/features/invites/state/reducers';
import importDashboardReducers from 'app/features/manage-dashboards/state/reducers';
import { cloudMigrationAPI } from 'app/features/migrate-to-cloud/api';
import { migrateToCloudMockAPI } from 'app/features/migrate-to-cloud/mockAPI';
import organizationReducers from 'app/features/org/state/reducers';
import panelsReducers from 'app/features/panel/state/reducers';
import { reducer as pluginsReducer } from 'app/features/plugins/admin/state/reducer';
@@ -57,7 +56,6 @@ const rootReducers = {
[alertingApi.reducerPath]: alertingApi.reducer,
[publicDashboardApi.reducerPath]: publicDashboardApi.reducer,
[browseDashboardsAPI.reducerPath]: browseDashboardsAPI.reducer,
[migrateToCloudMockAPI.reducerPath]: migrateToCloudMockAPI.reducer,
[cloudMigrationAPI.reducerPath]: cloudMigrationAPI.reducer,
};
@@ -1,229 +0,0 @@
import { BaseQueryFn, createApi } from '@reduxjs/toolkit/query/react';
import { lastValueFrom } from 'rxjs';
import { BackendSrvRequest, getBackendSrv } from '@grafana/runtime';
interface RequestOptions extends BackendSrvRequest {
manageError?: (err: unknown) => { error: unknown };
showErrorAlert?: boolean;
}
function createBackendSrvBaseQuery({ baseURL }: { baseURL: string }): BaseQueryFn<RequestOptions> {
async function backendSrvBaseQuery(requestOptions: RequestOptions) {
try {
const { data: responseData, ...meta } = await lastValueFrom(
getBackendSrv().fetch({
...requestOptions,
url: baseURL + requestOptions.url,
showErrorAlert: requestOptions.showErrorAlert,
})
);
return { data: responseData, meta };
} catch (error) {
return requestOptions.manageError ? requestOptions.manageError(error) : { error };
}
}
return backendSrvBaseQuery;
}
interface MigrateToCloudStatusDTO {
enabled: boolean;
stackURL?: string;
}
interface CreateMigrationTokenResponseDTO {
token: string;
}
export interface ConnectStackDTOMock {
stackURL: string;
token: string;
}
type MigrationResourceStatus = 'not-migrated' | 'migrated' | 'migrating' | 'failed';
export interface MigrationResourceDatasource {
uid: string;
status: MigrationResourceStatus;
statusMessage?: string;
type: 'datasource';
resource: {
uid: string;
name: string;
type: string;
icon?: string;
};
}
export interface MigrationResourceDashboard {
uid: string;
status: MigrationResourceStatus;
statusMessage?: string;
type: 'dashboard';
resource: {
uid: string;
name: string;
};
}
export type MigrationResourceDTOMock = MigrationResourceDatasource | MigrationResourceDashboard;
const mockApplications = ['auth-service', 'web server', 'backend'];
const mockEnvs = ['DEV', 'PROD'];
const mockRoles = ['db', 'load-balancer', 'server', 'logs'];
const mockDataSources = ['Prometheus', 'Loki', 'AWS Athena', 'AWS Cloudwatch', 'InfluxDB', 'Elasticsearch'];
const mockDataSourceMetadata: Record<string, { image: string }> = {
Prometheus: {
image: 'https://grafana.com/api/plugins/prometheus/versions/5.0.0/logos/small',
},
Loki: {
image: 'https://grafana.com/api/plugins/loki/versions/5.0.0/logos/small',
},
'AWS Athena': {
image: 'https://grafana.com/api/plugins/grafana-athena-datasource/versions/2.13.5/logos/small',
},
'AWS Cloudwatch': {
image: 'https://grafana.com/api/plugins/computest-cloudwatchalarm-datasource/versions/2.0.0/logos/small',
},
InfluxDB: {
image: 'https://grafana.com/api/plugins/influxdb/versions/5.0.0/logos/small',
},
Elasticsearch: {
image: 'https://grafana.com/api/plugins/elasticsearch/versions/5.0.0/logos/small',
},
};
const mockMigrationResources: MigrationResourceDTOMock[] = Array.from({ length: 500 }).map((_, index) => {
const dataSource = mockDataSources[index % mockDataSources.length];
const environment = mockEnvs[index % mockEnvs.length];
const application = mockApplications[index % mockApplications.length];
const role = mockRoles[index % mockRoles.length];
return {
status: 'not-migrated',
type: 'datasource',
uid: index.toString(16),
resource: {
uid: `${application}-${environment}-${role}-${index}`,
name: `${application} ${environment} ${role}`,
icon: mockDataSourceMetadata[dataSource]?.image,
type: dataSource,
},
};
});
mockMigrationResources[0].status = 'migrated';
mockMigrationResources[1].status = 'failed';
mockMigrationResources[1].statusMessage = `Source map error: Error: request failed with status 404
Resource URL: http://localhost:3000/public/build/app.f4d0c6a0daa6a5b14892.js
Source Map URL: app.f4d0c6a0daa6a5b14892.js.map`;
mockMigrationResources[2].status = 'migrated';
mockMigrationResources[3].status = 'migrated';
mockMigrationResources[4].status = 'migrating';
mockMigrationResources[5].status = 'migrating';
// TODO remove these mock properties/functions
const queryParams = new URLSearchParams(window.location.search);
const MOCK_DELAY_MS = 1000;
const MOCK_TOKEN = 'TODO_thisWillBeABigLongToken';
let HAS_MIGRATION_TOKEN = false;
let HAS_STACK_DETAILS = !!queryParams.get('mockStackURL');
let STACK_URL: string | undefined = queryParams.get('mockStackURL') || undefined;
function dataWithMockDelay<T>(data: T): Promise<{ data: T }> {
return new Promise((resolve) => {
setTimeout(() => {
resolve({ data });
}, MOCK_DELAY_MS);
});
}
export const migrateToCloudMockAPI = createApi({
tagTypes: ['migrationToken', 'stackDetails', 'resource'],
reducerPath: 'migrateToCloudMockAPI',
baseQuery: createBackendSrvBaseQuery({ baseURL: '/api' }),
endpoints: (builder) => ({
// TODO :)
getStatus: builder.query<MigrateToCloudStatusDTO, void>({
providesTags: ['stackDetails'],
queryFn: () => {
const responseData: MigrateToCloudStatusDTO = { enabled: HAS_STACK_DETAILS };
if (STACK_URL) {
responseData.stackURL = STACK_URL;
}
return dataWithMockDelay(responseData);
},
}),
connectStack: builder.mutation<void, ConnectStackDTOMock>({
invalidatesTags: ['stackDetails'],
queryFn: async ({ stackURL }) => {
HAS_STACK_DETAILS = true;
STACK_URL = stackURL;
return dataWithMockDelay(undefined);
},
}),
disconnectStack: builder.mutation<void, void>({
invalidatesTags: ['stackDetails'],
queryFn: async () => {
HAS_STACK_DETAILS = false;
return dataWithMockDelay(undefined);
},
}),
createMigrationToken: builder.mutation<CreateMigrationTokenResponseDTO, void>({
invalidatesTags: ['migrationToken'],
queryFn: async () => {
HAS_MIGRATION_TOKEN = true;
return dataWithMockDelay({ token: MOCK_TOKEN });
},
}),
deleteMigrationToken: builder.mutation<void, void>({
invalidatesTags: ['migrationToken'],
queryFn: async () => {
HAS_MIGRATION_TOKEN = false;
return dataWithMockDelay(undefined);
},
}),
hasMigrationToken: builder.query<boolean, void>({
providesTags: ['migrationToken'],
queryFn: async () => {
return dataWithMockDelay(HAS_MIGRATION_TOKEN);
},
}),
startMigration: builder.mutation<void, void>({
queryFn: async () => {
return dataWithMockDelay(undefined);
},
}),
listResources: builder.query<MigrationResourceDTOMock[], void>({
providesTags: ['resource'],
queryFn: async () => {
return dataWithMockDelay(mockMigrationResources);
},
}),
}),
});
export const {
useGetStatusQuery: useGetStatusQueryMock,
useConnectStackMutation: useConnectStackMutationMock,
useDisconnectStackMutation: useDisconnectStackMutationMock,
useCreateMigrationTokenMutation: useCreateMigrationTokenMutationMock,
useDeleteMigrationTokenMutation: useDeleteMigrationTokenMutationMock,
useHasMigrationTokenQuery: useHasMigrationTokenQueryMock,
useListResourcesQuery: useListResourcesQueryMock,
useStartMigrationMutation: useStartMigrationMutationMock,
} = migrateToCloudMockAPI;
@@ -3,15 +3,15 @@ import React, { useCallback } from 'react';
import { Alert, ConfirmModal, Stack } from '@grafana/ui';
import { Trans, t } from 'app/core/internationalization';
import { useDisconnectStackMutationMock } from '../mockAPI';
interface Props {
isOpen: boolean;
onDismiss: () => void;
}
export const DisconnectModal = ({ isOpen, onDismiss }: Props) => {
const [disconnectStack, { isLoading, isError }] = useDisconnectStackMutationMock();
const disconnectStack = useCallback(() => ({}), []);
const isLoading = false;
const isError = false;
const handleConfirm = useCallback(async () => {
const resp = await disconnectStack();
+1 -41
View File
@@ -4,7 +4,6 @@ import { setupListeners } from '@reduxjs/toolkit/query';
import { browseDashboardsAPI } from 'app/features/browse-dashboards/api/browseDashboardsAPI';
import { publicDashboardApi } from 'app/features/dashboard/api/publicDashboardApi';
import { cloudMigrationAPI } from 'app/features/migrate-to-cloud/api';
import { migrateToCloudMockAPI } from 'app/features/migrate-to-cloud/mockAPI';
import { StoreState } from 'app/types/store';
import { buildInitialState } from '../core/reducers/navModel';
@@ -31,8 +30,7 @@ export function configureStore(initialState?: Partial<StoreState>) {
alertingApi.middleware,
publicDashboardApi.middleware,
browseDashboardsAPI.middleware,
cloudMigrationAPI.middleware,
migrateToCloudMockAPI.middleware
cloudMigrationAPI.middleware
),
devTools: process.env.NODE_ENV !== 'production',
preloadedState: {
@@ -50,41 +48,3 @@ export function configureStore(initialState?: Partial<StoreState>) {
export type RootState = ReturnType<ReturnType<typeof configureStore>['getState']>;
export type AppDispatch = ReturnType<typeof configureStore>['dispatch'];
/*
function getActionsToIgnoreSerializableCheckOn() {
return [
'dashboard/setPanelAngularComponent',
'dashboard/panelModelAndPluginReady',
'dashboard/dashboardInitCompleted',
'plugins/panelPluginLoaded',
'explore/initializeExplore',
'explore/changeRange',
'explore/updateDatasourceInstance',
'explore/queryStoreSubscription',
'explore/queryStreamUpdated',
];
}
function getPathsToIgnoreMutationAndSerializableCheckOn() {
return [
'plugins.panels',
'dashboard.panels',
'dashboard.getModel',
'payload.plugin',
'panelEditorNew.getPanel',
'panelEditorNew.getSourcePanel',
'panelEditorNew.getData',
'explore.left.queryResponse',
'explore.right.queryResponse',
'explore.left.datasourceInstance',
'explore.right.datasourceInstance',
'explore.left.range',
'explore.left.eventBridge',
'explore.right.eventBridge',
'explore.right.range',
'explore.left.querySubscription',
'explore.right.querySubscription',
];
}
*/