From c1220342a632027a623be4ecbf8186f487f37bc8 Mon Sep 17 00:00:00 2001 From: Bryce Buchanan <75274611+bryce-b@users.noreply.github.com> Date: Fri, 21 Feb 2025 01:06:22 -0800 Subject: [PATCH] [8.17] Added versioning to inventory_view_saved_object (#207007) (#211634) # Backport This will backport the following commits from `main` to `8.17`: - [Added versioning to inventory_view_saved_object (#207007)](https://github.com/elastic/kibana/pull/207007) ### Questions ? Please refer to the [Backport tool documentation](https://github.com/sorenlouv/backport) --- .../check_registered_types.test.ts | 2 +- .../inventory_view_saved_object.test.ts | 61 +++++++++++++++++++ .../inventory_view_saved_object.ts | 33 ++++++++++ .../infra/tsconfig.json | 3 +- 4 files changed, 97 insertions(+), 2 deletions(-) create mode 100644 x-pack/plugins/observability_solution/infra/server/saved_objects/inventory_view/inventory_view_saved_object.test.ts diff --git a/src/core/server/integration_tests/ci_checks/saved_objects/check_registered_types.test.ts b/src/core/server/integration_tests/ci_checks/saved_objects/check_registered_types.test.ts index f2d04330faedc..fbc95036afe5c 100644 --- a/src/core/server/integration_tests/ci_checks/saved_objects/check_registered_types.test.ts +++ b/src/core/server/integration_tests/ci_checks/saved_objects/check_registered_types.test.ts @@ -126,7 +126,7 @@ describe('checking migration metadata changes on all registered SO types', () => "ingest-outputs": "daafff49255ab700e07491376fe89f04fc998b91", "ingest-package-policies": "53a94064674835fdb35e5186233bcd7052eabd22", "ingest_manager_settings": "111a616eb72627c002029c19feb9e6c439a10505", - "inventory-view": "b8683c8e352a286b4aca1ab21003115a4800af83", + "inventory-view": "fd2b7fe713956f261018dded00d8f8c986417763", "kql-telemetry": "93c1d16c1a0dfca9c8842062cf5ef8f62ae401ad", "legacy-url-alias": "9b8cca3fbb2da46fd12823d3cd38fdf1c9f24bc8", "lens": "5cfa2c52b979b4f8df56dd13c477e152183468b9", diff --git a/x-pack/plugins/observability_solution/infra/server/saved_objects/inventory_view/inventory_view_saved_object.test.ts b/x-pack/plugins/observability_solution/infra/server/saved_objects/inventory_view/inventory_view_saved_object.test.ts new file mode 100644 index 0000000000000..af29eb91b5f8e --- /dev/null +++ b/x-pack/plugins/observability_solution/infra/server/saved_objects/inventory_view/inventory_view_saved_object.test.ts @@ -0,0 +1,61 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ +import { + createModelVersionTestMigrator, + type ModelVersionTestMigrator, +} from '@kbn/core-test-helpers-model-versions'; + +import { inventoryViewSavedObjectType } from './inventory_view_saved_object'; + +describe('invetoryViewSavedObject model version transformation', () => { + let migrator: ModelVersionTestMigrator; + beforeEach(() => { + migrator = createModelVersionTestMigrator({ type: inventoryViewSavedObjectType }); + }); + + describe('model veresion 2', () => { + const inventoryViewV2 = { + id: 'someId', + type: 'inventory-view', + attributes: { + metric: { type: 'cpu' }, + sort: { by: 'name', direction: 'desc' }, + groupBy: [], + nodeType: 'host', + view: 'map', + customOptions: [], + customMetrics: [], + boundsOverride: { min: 0, max: 1 }, + autoBounds: true, + accountId: '', + region: '', + autoReload: false, + filterQuery: { expression: '', kind: 'kuery' }, + legend: { palette: 'cool', reverseColors: false, steps: 18 }, + timelineOpen: false, + name: 'test', + }, + references: [], + }; + + it('should clamp legend.steps to 18 when converting from v1 to v2', () => { + const inventoryViewV1 = JSON.parse(JSON.stringify(inventoryViewV2)); + inventoryViewV1.attributes.legend.steps = 20; + const migrated = migrator.migrate({ + document: { + ...inventoryViewV1, + attributes: { + ...inventoryViewV1.attributes, + }, + }, + fromVersion: 1, + toVersion: 2, + }); + expect(migrated.attributes).toEqual(inventoryViewV2.attributes); + }); + }); +}); diff --git a/x-pack/plugins/observability_solution/infra/server/saved_objects/inventory_view/inventory_view_saved_object.ts b/x-pack/plugins/observability_solution/infra/server/saved_objects/inventory_view/inventory_view_saved_object.ts index f9c4c4d354024..5cbe9a876e222 100644 --- a/x-pack/plugins/observability_solution/infra/server/saved_objects/inventory_view/inventory_view_saved_object.ts +++ b/x-pack/plugins/observability_solution/infra/server/saved_objects/inventory_view/inventory_view_saved_object.ts @@ -5,6 +5,7 @@ * 2.0. */ +import { schema } from '@kbn/config-schema'; import { fold } from 'fp-ts/lib/Either'; import { pipe } from 'fp-ts/lib/pipeable'; import type { SavedObject, SavedObjectsType } from '@kbn/core/server'; @@ -21,6 +22,11 @@ const getInventoryViewTitle = (savedObject: SavedObject) => ) ); +const schemaV1 = schema.object({}, { unknowns: 'allow' }); +const schemaV2 = schema.object({ + legend: schema.object({ steps: schema.number({ max: 18, min: 2 }) }), +}); + export const inventoryViewSavedObjectType: SavedObjectsType = { name: inventoryViewSavedObjectName, hidden: false, @@ -36,4 +42,31 @@ export const inventoryViewSavedObjectType: SavedObjectsType = { dynamic: false, properties: {}, }, + modelVersions: { + 1: { + changes: [], + schemas: { + create: schemaV1, + }, + }, + 2: { + changes: [ + { + type: 'unsafe_transform', + transformFn: (document) => { + if (document.attributes.legend.steps > 18) { + document.attributes.legend.steps = 18; + } else if (document.attributes.legend.steps < 2) { + document.attributes.legend.steps = 2; + } + return { document }; + }, + }, + ], + schemas: { + forwardCompatibility: schemaV2.extends({}, { unknowns: 'ignore' }), + create: schemaV2, + }, + }, + }, }; diff --git a/x-pack/plugins/observability_solution/infra/tsconfig.json b/x-pack/plugins/observability_solution/infra/tsconfig.json index 1e130261d5346..068d06a3ee579 100644 --- a/x-pack/plugins/observability_solution/infra/tsconfig.json +++ b/x-pack/plugins/observability_solution/infra/tsconfig.json @@ -117,7 +117,8 @@ "@kbn/entities-schema", "@kbn/zod", "@kbn/observability-utils-server", - "@kbn/observability-utils-common" + "@kbn/observability-utils-common", + "@kbn/core-test-helpers-model-versions" ], "exclude": ["target/**/*"] }