diff --git a/packages/kbn-es-archiver/src/lib/archives/parse.test.ts b/packages/kbn-es-archiver/src/lib/archives/parse.test.ts index f12a9a25caf0c..ae8fc7216ba27 100644 --- a/packages/kbn-es-archiver/src/lib/archives/parse.test.ts +++ b/packages/kbn-es-archiver/src/lib/archives/parse.test.ts @@ -9,7 +9,12 @@ import Stream, { PassThrough, Readable, Writable, Transform } from 'stream'; import { createGzip } from 'zlib'; -import { createConcatStream, createListStream, createPromiseFromStreams } from '@kbn/utils'; +import { + createConcatStream, + createListStream, + createPromiseFromStreams, + kibanaPackageJson, +} from '@kbn/utils'; import { createParseArchiveStreams } from './parse'; @@ -54,6 +59,17 @@ describe('esArchiver createParseArchiveStreams', () => { expect(output).toEqual([{ a: 1 }, 1]); }); + it('replaces $KIBANA_PACKAGE_VERSION with the current kibana version', async () => { + const output = await createPromiseFromStreams([ + createListStream([ + Buffer.from('{"$KIBANA'), + Buffer.from('_PACKAGE_VERSION": "enabled"}'), + ]), + ...createParseArchiveStreams({ gzip: false }), + ]); + return expect(output).toEqual({ [kibanaPackageJson.version]: 'enabled' }); + }); + it('provides each JSON object as soon as it is parsed', async () => { let onReceived: (resolved: any) => void; const receivedPromise = new Promise((resolve) => (onReceived = resolve)); @@ -74,11 +90,13 @@ describe('esArchiver createParseArchiveStreams', () => { createConcatStream([]), ] as [Readable, ...Writable[]]); - input.write(Buffer.from('{"a": 1}\n\n{"a":')); + // before emitting a result, the buffer waits until it at least receives toReplace.length bytes + // so we need a long second object to ensure that the first gets emitted. + input.write(Buffer.from('{"a": 1}\n\n{"propertyNameLongerThanToReplace":')); expect(await receivedPromise).toEqual({ a: 1 }); input.write(Buffer.from('2}')); input.end(); - expect(await finalPromise).toEqual([{ a: 1 }, { a: 2 }]); + expect(await finalPromise).toEqual([{ a: 1 }, { propertyNameLongerThanToReplace: 2 }]); }); }); @@ -136,6 +154,18 @@ describe('esArchiver createParseArchiveStreams', () => { expect(output).toEqual([{ a: 1 }, { a: 2 }]); }); + + it('replaces $KIBANA_PACKAGE_VERSION with the current kibana version', async () => { + const output = await createPromiseFromStreams([ + createListStream([ + Buffer.from('{"$KIBANA_PACKAGE'), + Buffer.from('_VERSION": "enabled"}'), + ]), + createGzip(), + ...createParseArchiveStreams({ gzip: true }), + ]); + return expect(output).toEqual({ [kibanaPackageJson.version]: 'enabled' }); + }); }); it('parses blank files', async () => { diff --git a/packages/kbn-es-archiver/src/lib/archives/parse.ts b/packages/kbn-es-archiver/src/lib/archives/parse.ts index e13f5667c6aee..a2657fbd661ad 100644 --- a/packages/kbn-es-archiver/src/lib/archives/parse.ts +++ b/packages/kbn-es-archiver/src/lib/archives/parse.ts @@ -13,6 +13,7 @@ import { createSplitStream, createReplaceStream, createMapStream, + kibanaPackageJson, } from '@kbn/utils'; import { RECORD_SEPARATOR } from './constants'; @@ -21,6 +22,7 @@ export function createParseArchiveStreams({ gzip = false } = {}) { return [ gzip ? createGunzip() : new PassThrough(), createReplaceStream('\r\n', '\n'), + createReplaceStream('$KIBANA_PACKAGE_VERSION', kibanaPackageJson.version), createSplitStream(RECORD_SEPARATOR), createFilterStream((l) => !!l.match(/[^\s]/)), createMapStream((json) => JSON.parse(json.trim())), diff --git a/x-pack/test/functional/es_archives/saved_objects_management/spaces_integration/mappings.json b/x-pack/test/functional/es_archives/saved_objects_management/spaces_integration/mappings.json index 617c1f3b50566..036dd7fad63f8 100644 --- a/x-pack/test/functional/es_archives/saved_objects_management/spaces_integration/mappings.json +++ b/x-pack/test/functional/es_archives/saved_objects_management/spaces_integration/mappings.json @@ -2,10 +2,10 @@ "type": "index", "value": { "aliases": { - ".kibana_8.0.0": {}, + ".kibana_$KIBANA_PACKAGE_VERSION": {}, ".kibana": {} }, - "index": ".kibana_8.0.0_001", + "index": ".kibana_$KIBANA_PACKAGE_VERSION_001", "mappings": { "dynamic": "false", "properties": { diff --git a/x-pack/test/saved_object_api_integration/common/fixtures/es_archiver/saved_objects/spaces/mappings.json b/x-pack/test/saved_object_api_integration/common/fixtures/es_archiver/saved_objects/spaces/mappings.json index 9e50f96296a94..12606562ab33b 100644 --- a/x-pack/test/saved_object_api_integration/common/fixtures/es_archiver/saved_objects/spaces/mappings.json +++ b/x-pack/test/saved_object_api_integration/common/fixtures/es_archiver/saved_objects/spaces/mappings.json @@ -2,10 +2,10 @@ "type": "index", "value": { "aliases": { - ".kibana_8.0.0": {}, + ".kibana_$KIBANA_PACKAGE_VERSION": {}, ".kibana": {} }, - "index": ".kibana_8.0.0_001", + "index": ".kibana_$KIBANA_PACKAGE_VERSION_001", "mappings": { "dynamic": "false", "properties": { diff --git a/x-pack/test/spaces_api_integration/common/fixtures/es_archiver/saved_objects/spaces/mappings.json b/x-pack/test/spaces_api_integration/common/fixtures/es_archiver/saved_objects/spaces/mappings.json index 4d83411bc4840..3ef2af5f9cf7d 100644 --- a/x-pack/test/spaces_api_integration/common/fixtures/es_archiver/saved_objects/spaces/mappings.json +++ b/x-pack/test/spaces_api_integration/common/fixtures/es_archiver/saved_objects/spaces/mappings.json @@ -2,10 +2,10 @@ "type": "index", "value": { "aliases": { - ".kibana_8.0.0": {}, + ".kibana_$KIBANA_PACKAGE_VERSION": {}, ".kibana": {} }, - "index": ".kibana_8.0.0_001", + "index": ".kibana_$KIBANA_PACKAGE_VERSION_001", "mappings": { "dynamic": "false" },