Dashboard: Fix Core Panel Migrations - table panel (#102146)
*add the automigrate logic to the dashboard migrator * Add unit tests to the dashboard migrator version 24
This commit is contained in:
@@ -2450,6 +2450,121 @@ describe('when migrating time_options in timepicker', () => {
|
|||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
describe('when migrating table panels at schema version 24', () => {
|
||||||
|
let model: DashboardModel;
|
||||||
|
|
||||||
|
beforeEach(() => {
|
||||||
|
config.featureToggles.autoMigrateOldPanels = true;
|
||||||
|
});
|
||||||
|
|
||||||
|
afterEach(() => {
|
||||||
|
config.featureToggles.autoMigrateOldPanels = false;
|
||||||
|
model = new DashboardModel({
|
||||||
|
panels: [],
|
||||||
|
schemaVersion: 23,
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should migrate Angular table to table and set autoMigrateFrom', () => {
|
||||||
|
model = new DashboardModel({
|
||||||
|
panels: [
|
||||||
|
{
|
||||||
|
id: 1,
|
||||||
|
type: 'table',
|
||||||
|
// @ts-expect-error
|
||||||
|
legend: true,
|
||||||
|
styles: [{ thresholds: ['10', '20', '30'] }, { thresholds: ['100', '200', '300'] }],
|
||||||
|
targets: [{ refId: 'A' }, {}],
|
||||||
|
},
|
||||||
|
],
|
||||||
|
schemaVersion: 23,
|
||||||
|
});
|
||||||
|
|
||||||
|
// Verify the panel was migrated to table, yes this is intentional
|
||||||
|
// when autoMigrateOldPanels is enabled, we should migrate to table
|
||||||
|
// and add the autoMigrateFrom property
|
||||||
|
expect(model.panels[0].type).toBe('table');
|
||||||
|
// Verify autoMigrateFrom was set
|
||||||
|
expect(model.panels[0].autoMigrateFrom).toBe('table-old');
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should migrate Angular table to table-old when autoMigrateOldPanels is disabled ', () => {
|
||||||
|
config.featureToggles.autoMigrateOldPanels = false;
|
||||||
|
model = new DashboardModel({
|
||||||
|
panels: [
|
||||||
|
{
|
||||||
|
id: 1,
|
||||||
|
type: 'table',
|
||||||
|
// @ts-expect-error
|
||||||
|
legend: true,
|
||||||
|
styles: [{ thresholds: ['10', '20', '30'] }, { thresholds: ['100', '200', '300'] }],
|
||||||
|
targets: [{ refId: 'A' }, {}],
|
||||||
|
},
|
||||||
|
],
|
||||||
|
schemaVersion: 23,
|
||||||
|
});
|
||||||
|
|
||||||
|
// Verify the panel was migrated to table, yes this is intentional
|
||||||
|
// when autoMigrateOldPanels is enabled, we should migrate to table
|
||||||
|
// and add the autoMigrateFrom property
|
||||||
|
expect(model.panels[0].type).toBe('table-old');
|
||||||
|
// Verify autoMigrateFrom was set
|
||||||
|
expect(model.panels[0].autoMigrateFrom).toBe(undefined);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should not migrate Angular table without styles', () => {
|
||||||
|
model = new DashboardModel({
|
||||||
|
panels: [
|
||||||
|
{
|
||||||
|
id: 1,
|
||||||
|
type: 'table',
|
||||||
|
// No styles property
|
||||||
|
},
|
||||||
|
],
|
||||||
|
schemaVersion: 23,
|
||||||
|
});
|
||||||
|
|
||||||
|
// Verify the panel was not migrated
|
||||||
|
expect(model.panels[0].type).toBe('table');
|
||||||
|
expect(model.panels[0].autoMigrateFrom).toBeUndefined();
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should not migrate React table (table2)', () => {
|
||||||
|
model = new DashboardModel({
|
||||||
|
panels: [
|
||||||
|
{
|
||||||
|
id: 1,
|
||||||
|
type: 'table2',
|
||||||
|
},
|
||||||
|
],
|
||||||
|
schemaVersion: 23,
|
||||||
|
});
|
||||||
|
|
||||||
|
// Verify the panel was not migrated
|
||||||
|
expect(model.panels[0].type).toBe('table2');
|
||||||
|
expect(model.panels[0].autoMigrateFrom).toBeUndefined();
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should not migrate non-table panels when autoMigrateOldPanels is disabled', () => {
|
||||||
|
// disable autoMigrateOldPanels
|
||||||
|
config.featureToggles.autoMigrateOldPanels = false;
|
||||||
|
model = new DashboardModel({
|
||||||
|
panels: [
|
||||||
|
{
|
||||||
|
id: 1,
|
||||||
|
type: 'grafana-worldmap-panel',
|
||||||
|
title: 'world map panel',
|
||||||
|
},
|
||||||
|
],
|
||||||
|
schemaVersion: 23,
|
||||||
|
});
|
||||||
|
|
||||||
|
// Verify the panel was not migrated
|
||||||
|
expect(model.panels[0].type).toBe('grafana-worldmap-panel');
|
||||||
|
expect(model.panels[0].autoMigrateFrom).toBeUndefined();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
function createRow(options: any, panelDescriptions: any[]) {
|
function createRow(options: any, panelDescriptions: any[]) {
|
||||||
const PANEL_HEIGHT_STEP = GRID_CELL_HEIGHT + GRID_CELL_VMARGIN;
|
const PANEL_HEIGHT_STEP = GRID_CELL_HEIGHT + GRID_CELL_VMARGIN;
|
||||||
const { collapse, showTitle, title, repeat, repeatIteration } = options;
|
const { collapse, showTitle, title, repeat, repeatIteration } = options;
|
||||||
|
|||||||
@@ -65,6 +65,7 @@ import {
|
|||||||
|
|
||||||
import { DashboardModel } from './DashboardModel';
|
import { DashboardModel } from './DashboardModel';
|
||||||
import { PanelModel } from './PanelModel';
|
import { PanelModel } from './PanelModel';
|
||||||
|
import { getPanelPluginToMigrateTo } from './getPanelPluginToMigrateTo';
|
||||||
|
|
||||||
standardEditorsRegistry.setInit(getAllOptionEditors);
|
standardEditorsRegistry.setInit(getAllOptionEditors);
|
||||||
standardFieldConfigEditorRegistry.setInit(getAllStandardFieldConfigs);
|
standardFieldConfigEditorRegistry.setInit(getAllStandardFieldConfigs);
|
||||||
@@ -626,6 +627,14 @@ export class DashboardMigrator {
|
|||||||
return panel;
|
return panel;
|
||||||
}
|
}
|
||||||
panel.type = wasAngularTable ? 'table-old' : 'table';
|
panel.type = wasAngularTable ? 'table-old' : 'table';
|
||||||
|
// Hacky way to call the automigrate feature
|
||||||
|
if (panel.type === 'table-old') {
|
||||||
|
const newType = getPanelPluginToMigrateTo(panel);
|
||||||
|
if (newType) {
|
||||||
|
panel.autoMigrateFrom = panel.type;
|
||||||
|
panel.type = newType;
|
||||||
|
}
|
||||||
|
}
|
||||||
return panel;
|
return panel;
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user