From eb7dd8e377c19524788e3532214f10c4cd354267 Mon Sep 17 00:00:00 2001 From: Josh Myers Date: Thu, 17 Jun 2021 07:33:36 +0100 Subject: [PATCH] Dashboard: protect against missing overrides section (#35577) * Protect against missing overrides section We are using grafonnet-lib to generate dashboards. These dashboards do not contain any `override` keys in `fieldConfig` by default and that is causing this DashboardMigrator script to blow up when trying to import the dashboards, see [1]. In Grafana v7, an empty overrides is automatically added but using grafonnet-lib, it isn't possible to set an empty overrides attribute e.g. [2] requires matcher/properties to be set. Setting to null ends up giving me [3], which causes the panel to not be displayed. [1] ``` initDashboard.ts:137 TypeError: t.overrides is not iterable at v.w (DashboardMigrator.ts:960) at v.updateSchema (DashboardMigrator.ts:672) at D.updateSchema (DashboardModel.ts:993) at new D (DashboardModel.ts:156) at initDashboard.ts:134 ``` [2] https://github.com/grafana/grafonnet-lib/blob/master/grafonnet/stat_panel.libsonnet#L150-L164 [3] ``` "fieldConfig": { "defaults": { "links": [ ], "mappings": [ ], "thresholds": { "mode": "absolute", "steps": [ { "color": "red", "value": 0 }, { "color": "orange", "value": 1 }, { "color": "green", "value": 3 } ] }, "unit": "none" }, "overrides": [ { } ] }, ``` * Update public/app/features/dashboard/state/DashboardMigrator.ts Co-authored-by: Marcus Andersson --- .../app/features/dashboard/state/DashboardMigrator.ts | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/public/app/features/dashboard/state/DashboardMigrator.ts b/public/app/features/dashboard/state/DashboardMigrator.ts index 7c0acd29ff3..7a09a5e357b 100644 --- a/public/app/features/dashboard/state/DashboardMigrator.ts +++ b/public/app/features/dashboard/state/DashboardMigrator.ts @@ -957,10 +957,13 @@ function upgradeValueMappingsForPanel(panel: PanelModel) { fieldConfig.defaults.mappings = upgradeValueMappings(fieldConfig.defaults.mappings, fieldConfig.defaults.thresholds); - for (const override of fieldConfig.overrides) { - for (const prop of override.properties) { - if (prop.id === 'mappings') { - prop.value = upgradeValueMappings(prop.value); + // Protect against no overrides + if (Array.isArray(fieldConfig.overrides)) { + for (const override of fieldConfig.overrides) { + for (const prop of override.properties) { + if (prop.id === 'mappings') { + prop.value = upgradeValueMappings(prop.value); + } } } }