diff --git a/src/legacy/core_plugins/kibana/public/dashboard/migrations/migrations_730.test.ts b/src/legacy/core_plugins/kibana/public/dashboard/migrations/migrations_730.test.ts index 52182ee0be0b1..dfeeb2a486a54 100644 --- a/src/legacy/core_plugins/kibana/public/dashboard/migrations/migrations_730.test.ts +++ b/src/legacy/core_plugins/kibana/public/dashboard/migrations/migrations_730.test.ts @@ -17,11 +17,13 @@ * under the License. */ +import { migrations } from '../../../migrations/'; import { migrations730 } from './migrations_730'; import { DashboardDoc700To720, DashboardDoc730ToLatest, RawSavedDashboardPanel730ToLatest, + DashboardDocPre700, } from './types'; const mockLogger = { @@ -36,6 +38,7 @@ test('dashboard migration 7.3.0 migrates filters to query on search source', () type: 'dashboard', references: [], attributes: { + title: 'hi', useMargins: true, description: '', uiStateJSON: '{}', @@ -52,22 +55,55 @@ test('dashboard migration 7.3.0 migrates filters to query on search source', () const newDoc = migrations730(doc, mockLogger); expect(newDoc).toMatchInlineSnapshot(` -Object { - "attributes": Object { - "description": "", - "kibanaSavedObjectMeta": Object { - "searchSourceJSON": "{\\"filter\\":[],\\"highlightAll\\":true,\\"version\\":true,\\"query\\":{\\"query\\":\\"n: 6\\",\\"language\\":\\"lucene\\"}}", + Object { + "attributes": Object { + "description": "", + "kibanaSavedObjectMeta": Object { + "searchSourceJSON": "{\\"filter\\":[],\\"highlightAll\\":true,\\"version\\":true,\\"query\\":{\\"query\\":\\"n: 6\\",\\"language\\":\\"lucene\\"}}", + }, + "panelsJSON": "[{\\"id\\":\\"1\\",\\"type\\":\\"visualization\\",\\"foo\\":true},{\\"id\\":\\"2\\",\\"type\\":\\"visualization\\",\\"bar\\":true}]", + "timeRestore": false, + "title": "hi", + "useMargins": true, + "version": 1, + }, + "id": "1", + "references": Array [], + "type": "dashboard", + } + `); +}); + +// See https://github.com/elastic/kibana/issues/41240 - this can happen. +test('dashboard migration 7.3.0 does not migrate filters to query on search source when there is no query string property', () => { + const doc: DashboardDocPre700 = { + id: 'AWviOturFv4p9HkVSIgn', + type: 'dashboard', + attributes: { + title: 'all_the_viz', + description: '', + panelsJSON: + '[{"col":1,"columns":["_source"],"id":"AWviL7GTFv4p9HkVSIf8","panelIndex":1,"row":1,"size_x":6,"size_y":3,"sort":["@timestamp","desc"],"type":"search"},{"col":7,"id":"AWviMFurFv4p9HkVSIf9","panelIndex":2,"row":1,"size_x":6,"size_y":3,"type":"visualization"},{"col":1,"id":"AWviMOBlFv4p9HkVSIf-","panelIndex":3,"row":4,"size_x":6,"size_y":3,"type":"visualization"},{"col":7,"id":"AWviMZ6SFv4p9HkVSIf_","panelIndex":4,"row":4,"size_x":6,"size_y":3,"type":"visualization"},{"col":1,"id":"AWviMqdpFv4p9HkVSIgK","panelIndex":5,"row":7,"size_x":6,"size_y":3,"type":"visualization"},{"col":7,"id":"AWviM0kxFv4p9HkVSIga","panelIndex":6,"row":7,"size_x":6,"size_y":3,"type":"visualization"},{"col":1,"id":"AWviM_UOFv4p9HkVSIgb","panelIndex":7,"row":10,"size_x":6,"size_y":3,"type":"visualization"},{"col":7,"id":"AWviNMDaFv4p9HkVSIgc","panelIndex":8,"row":10,"size_x":6,"size_y":3,"type":"visualization"},{"col":1,"id":"AWviNR7vFv4p9HkVSIgd","panelIndex":9,"row":13,"size_x":6,"size_y":3,"type":"visualization"},{"col":7,"id":"AWviNcPPFv4p9HkVSIge","panelIndex":10,"row":13,"size_x":6,"size_y":3,"type":"visualization"},{"col":1,"id":"AWviNu5XFv4p9HkVSIgf","panelIndex":11,"row":16,"size_x":6,"size_y":3,"type":"visualization"},{"col":7,"id":"AWviN5pxFv4p9HkVSIgg","panelIndex":12,"row":16,"size_x":6,"size_y":3,"type":"visualization"},{"col":1,"id":"AWviN_qeFv4p9HkVSIgh","panelIndex":13,"row":19,"size_x":6,"size_y":3,"type":"visualization"},{"col":7,"id":"AWviOI-XFv4p9HkVSIgi","panelIndex":14,"row":19,"size_x":6,"size_y":3,"type":"visualization"},{"col":1,"id":"AWviOP2GFv4p9HkVSIgj","panelIndex":15,"row":22,"size_x":6,"size_y":3,"type":"visualization"},{"col":7,"id":"AWviOYpkFv4p9HkVSIgk","panelIndex":16,"row":22,"size_x":6,"size_y":3,"type":"visualization"},{"col":1,"id":"AWviOilNFv4p9HkVSIgl","panelIndex":17,"row":25,"size_x":6,"size_y":3,"type":"visualization"},{"col":7,"id":"AWviOpW1Fv4p9HkVSIgm","panelIndex":18,"row":25,"size_x":6,"size_y":3,"type":"visualization"}]', + optionsJSON: '{"darkTheme":false}', + uiStateJSON: + '{"P-9":{"vis":{"params":{"sort":{"columnIndex":null,"direction":null}}}},"P-3":{"vis":{"defaultColors":{"0 - 88":"rgb(247,252,245)","88 - 175":"rgb(199,233,192)","175 - 263":"rgb(116,196,118)","263 - 350":"rgb(35,139,69)"}}},"P-10":{"vis":{"defaultColors":{"0 - 50":"rgb(0,104,55)","50 - 75":"rgb(255,255,190)","75 - 100":"rgb(165,0,38)"}}},"P-11":{"vis":{"defaultColors":{"0 - 100":"rgb(0,104,55)"}}},"P-12":{"vis":{"defaultColors":{"0 - 100":"rgb(0,104,55)"}}}}', + version: 1, + timeRestore: false, + kibanaSavedObjectMeta: { + searchSourceJSON: + '{"filter":[{"query":{"match_all":{}}}],"highlightAll":true,"version":true}', + }, }, - "panelsJSON": "[{\\"id\\":\\"1\\",\\"type\\":\\"visualization\\",\\"foo\\":true},{\\"id\\":\\"2\\",\\"type\\":\\"visualization\\",\\"bar\\":true}]", - "timeRestore": false, - "useMargins": true, - "version": 1, - }, - "id": "1", - "references": Array [], - "type": "dashboard", -} -`); + }; + + const doc700: DashboardDoc700To720 = migrations.dashboard['7.0.0'](doc, mockLogger); + const newDoc = migrations.dashboard['7.3.0'](doc700, mockLogger); + + const parsedSearchSource = JSON.parse(newDoc.attributes.kibanaSavedObjectMeta.searchSourceJSON); + expect(parsedSearchSource.filter.length).toBe(1); + expect(parsedSearchSource.query.query).toBe(''); + + expect(newDoc.attributes.uiStateJSON).toBeUndefined(); }); test('dashboard migration 7.3.0 migrates panels', () => { @@ -76,6 +112,7 @@ test('dashboard migration 7.3.0 migrates panels', () => { type: 'dashboard', references: [], attributes: { + title: 'hi', useMargins: true, description: '', uiStateJSON: '{}', diff --git a/src/legacy/core_plugins/kibana/public/dashboard/migrations/migrations_730.ts b/src/legacy/core_plugins/kibana/public/dashboard/migrations/migrations_730.ts index b786ee90dc6f8..ee28643f36446 100644 --- a/src/legacy/core_plugins/kibana/public/dashboard/migrations/migrations_730.ts +++ b/src/legacy/core_plugins/kibana/public/dashboard/migrations/migrations_730.ts @@ -42,7 +42,9 @@ export function migrations730( moveFiltersToQuery(searchSource) ); } catch (e) { - logger.warning(`Exception @ migrations730 while trying to migrate query filters! ${e}`); + logger.warning( + `Exception @ migrations730 while trying to migrate query filters!\nError:${e}\nSearchSource JSON:\n${doc.attributes.kibanaSavedObjectMeta.searchSourceJSON}` + ); return doc; } @@ -55,7 +57,12 @@ export function migrations730( try { const panels = JSON.parse(doc.attributes.panelsJSON); doc.attributes.panelsJSON = JSON.stringify( - migratePanelsTo730(panels, '7.3.0', doc.attributes.useMargins, uiState) + migratePanelsTo730( + panels, + '7.3.0', + doc.attributes.useMargins === undefined ? true : doc.attributes.useMargins, + uiState + ) ); delete doc.attributes.uiStateJSON; diff --git a/src/legacy/core_plugins/kibana/public/dashboard/migrations/move_filters_to_query.ts b/src/legacy/core_plugins/kibana/public/dashboard/migrations/move_filters_to_query.ts index 1ccebbe5758fc..c99f3efbbf632 100644 --- a/src/legacy/core_plugins/kibana/public/dashboard/migrations/move_filters_to_query.ts +++ b/src/legacy/core_plugins/kibana/public/dashboard/migrations/move_filters_to_query.ts @@ -41,7 +41,9 @@ export interface SearchSource730 { } function isQueryFilter(filter: Filter | { query: unknown }): filter is Pre600FilterQuery { - return filter.query && !(filter as Filter).meta; + return ( + filter.query && !(filter as Filter).meta && (filter as Pre600FilterQuery).query.query_string + ); } export function moveFiltersToQuery( diff --git a/src/legacy/core_plugins/kibana/public/dashboard/migrations/types.ts b/src/legacy/core_plugins/kibana/public/dashboard/migrations/types.ts index b2d70602b6f3b..17398a9e828f4 100644 --- a/src/legacy/core_plugins/kibana/public/dashboard/migrations/types.ts +++ b/src/legacy/core_plugins/kibana/public/dashboard/migrations/types.ts @@ -31,7 +31,9 @@ interface DashboardAttributes extends SavedObjectAttributes { description: string; version: number; timeRestore: boolean; - useMargins: boolean; + useMargins?: boolean; + title: string; + optionsJSON?: string; } export type DashboardAttributes730ToLatest = DashboardAttributes; @@ -42,7 +44,9 @@ interface DashboardAttributesTo720 extends SavedObjectAttributes { uiStateJSON: string; version: number; timeRestore: boolean; - useMargins: boolean; + useMargins?: boolean; + title: string; + optionsJSON?: string; } export type DashboardDoc730ToLatest = Doc<DashboardAttributes>;