[Fleet] Fix Install with streaming to save readme and icons (#199727)

This commit is contained in:
Nicolas Chaulet 2024-11-12 11:21:22 -05:00 committed by GitHub
parent 49a16accbf
commit 839a9759ea
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 86 additions and 9 deletions

View file

@ -42,6 +42,30 @@ const mockedRemoveArchiveEntries = removeArchiveEntries as jest.MockedFunction<
let soClient: jest.Mocked<SavedObjectsClientContract>;
let esClient: jest.Mocked<ElasticsearchClient>;
const assetsMap = new Map([
[
'endpoint-0.16.0-dev.0/elasticsearch/transform/metadata_current/default.json',
Buffer.from('{"content": "data"}'),
],
['security_detection_engine-8.16.1/LICENSE.txt', Buffer.from('{"content": "data"}')],
['security_detection_engine-8.16.1/NOTICE.txt', Buffer.from('{"content": "data"}')],
['security_detection_engine-8.16.1/changelog.yml', Buffer.from('{"content": "data"}')],
['security_detection_engine-8.16.1/manifest.yml', Buffer.from('{"content": "data"}')],
['security_detection_engine-8.16.1/docs/README.md', Buffer.from('{"content": "data"}')],
[
'security_detection_engine-8.16.1/img/security-logo-color-64px.svg',
Buffer.from('{"content": "data"}'),
],
[
'security_detection_engine-8.16.1/kibana/security_rule/000047bb-b27a-47ec-8b62-ef1a5d2c9e19_208.json',
Buffer.from('{"content": "data"}'),
],
[
'security_detection_engine-8.16.1/kibana/security_rule/000047bb-b27a-47ec-8b62-ef1a5d2c9e19_209.json',
Buffer.from('{"content": "data"}'),
],
]);
const packageInstallContext = {
packageInfo: {
title: 'title',
@ -56,13 +80,8 @@ const packageInstallContext = {
owner: { github: 'elastic/fleet' },
} as any,
paths: ['some/path/1', 'some/path/2'],
assetsMap: new Map([
[
'endpoint-0.16.0-dev.0/elasticsearch/transform/metadata_current/default.json',
Buffer.from('{"content": "data"}'),
],
]),
archiveIterator: createArchiveIteratorFromMap(new Map()),
assetsMap,
archiveIterator: createArchiveIteratorFromMap(assetsMap),
};
const getMockInstalledPackageSo = (
installedEs: EsAssetReference[] = []
@ -196,6 +215,63 @@ describe('stepSaveArchiveEntries', () => {
],
});
});
it('should save package icons, readme, and changelog but not Kibana assets with useStreaming:true ', async () => {
jest.mocked(mockedSaveArchiveEntriesFromAssetsMap).mockResolvedValue({
saved_objects: [
{
id: 'test',
attributes: {
package_name: 'test-package',
package_version: '1.0.0',
install_source: 'registry',
asset_path: 'some/path',
media_type: '',
data_utf8: '',
data_base64: '',
},
type: '',
references: [],
},
],
});
await stepSaveArchiveEntries({
savedObjectsClient: soClient,
// @ts-ignore
savedObjectsImporter: jest.fn(),
esClient,
logger: loggerMock.create(),
packageInstallContext,
installedPkg,
installType: 'update',
installSource: 'registry',
spaceId: DEFAULT_SPACE_ID,
useStreaming: true,
esReferences: [
{
id: 'something',
type: ElasticsearchAssetType.ilmPolicy,
},
],
});
expect(
[
...(jest
.mocked(mockedSaveArchiveEntriesFromAssetsMap)
.mock.lastCall?.[0].assetsMap?.keys() ?? []),
].sort()
).toMatchInlineSnapshot(`
Array [
"endpoint-0.16.0-dev.0/elasticsearch/transform/metadata_current/default.json",
"security_detection_engine-8.16.1/LICENSE.txt",
"security_detection_engine-8.16.1/NOTICE.txt",
"security_detection_engine-8.16.1/changelog.yml",
"security_detection_engine-8.16.1/docs/README.md",
"security_detection_engine-8.16.1/img/security-logo-color-64px.svg",
"security_detection_engine-8.16.1/manifest.yml",
]
`);
});
});
describe('cleanupArchiveEntriesStep', () => {

View file

@ -14,7 +14,7 @@ import { withPackageSpan } from '../../utils';
import type { InstallContext } from '../_state_machine_package_install';
import { INSTALL_STATES } from '../../../../../../common/types';
import { MANIFEST_NAME } from '../../../archive/parse';
import { isKibanaAssetType } from '../../../kibana/assets/install';
export async function stepSaveArchiveEntries(context: InstallContext) {
const { packageInstallContext, savedObjectsClient, installSource, useStreaming } = context;
@ -28,7 +28,8 @@ export async function stepSaveArchiveEntries(context: InstallContext) {
if (useStreaming) {
assetsMap = new Map();
await archiveIterator.traverseEntries(async (entry) => {
if (entry.path.endsWith(MANIFEST_NAME)) {
// Skip only kibana assets type
if (!isKibanaAssetType(entry.path)) {
assetsMap.set(entry.path, entry.buffer);
}
});