Skip to content

Commit

Permalink
Merge branch '8.17' into update-bundled-packages-20250217145440
Browse files Browse the repository at this point in the history
  • Loading branch information
juliaElastic authored Feb 18, 2025
2 parents eed56f4 + ff21da4 commit 7073b06
Show file tree
Hide file tree
Showing 13 changed files with 117 additions and 123 deletions.
4 changes: 2 additions & 2 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -1261,7 +1261,7 @@
"rxjs": "^7.8.1",
"safe-squel": "^5.12.5",
"seedrandom": "^3.0.5",
"semver": "^7.6.3",
"semver": "^7.7.1",
"set-value": "^4.1.0",
"snakecase-keys": "^8.0.0",
"source-map-support": "^0.5.19",
Expand Down Expand Up @@ -1679,7 +1679,7 @@
"babel-plugin-styled-components": "^2.1.4",
"babel-plugin-transform-react-remove-prop-types": "^0.4.24",
"babel-plugin-transform-typescript-metadata": "^0.3.2",
"backport": "^9.6.4",
"backport": "^9.6.6",
"blob-polyfill": "^7.0.20220408",
"buildkite-test-collector": "^1.7.0",
"callsites": "^3.1.0",
Expand Down
1 change: 1 addition & 0 deletions x-pack/plugins/integration_assistant/common/constants.ts
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,7 @@ export enum GenerationErrorCode {
UNSUPPORTED_LOG_SAMPLES_FORMAT = 'unsupported-log-samples-format',
UNPARSEABLE_CSV_DATA = 'unparseable-csv-data',
CEF_ERROR = 'cef-not-supported',
BUILD_INTEGRATION_ERROR = 'build-integration-error',
}

// Size limits
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -232,6 +232,12 @@ export const GENERATION_ERROR_TRANSLATION: Record<
defaultMessage:
'CEF format detected. Please decode the CEF logs into JSON format using filebeat decode_cef processor.',
}),
[GenerationErrorCode.BUILD_INTEGRATION_ERROR]: i18n.translate(
'xpack.integrationAssistant.errors.buildIntegrationError',
{
defaultMessage: 'An error occurred while building the integration package. Please try again.',
}
),
[GenerationErrorCode.UNPARSEABLE_CSV_DATA]: (attributes) => {
if (
attributes.underlyingMessages !== undefined &&
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -85,7 +85,7 @@ describe('EcsGraph', () => {
throw Error(`getEcsGraph threw an error: ${error}`);
}

expect(response.results).toStrictEqual(ecsMappingExpectedResults);
expect(response.results).toEqual(ecsMappingExpectedResults);

// Check if the functions were called
expect(handleEcsMapping).toHaveBeenCalled();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ import { createFieldMapping } from './fields';
import { createPipeline } from './pipeline';
import { createReadme } from './readme_files';
import { Field, flattenObjectsList } from '../util/samples';
import { BuildIntegrationError } from '../lib/errors/build_integration_error';

const initialVersion = '1.0.0';

Expand All @@ -36,46 +37,57 @@ export async function buildPackage(integration: Integration): Promise<Buffer> {
configureNunjucks();

if (!isValidName(integration.name)) {
throw new Error(
throw new BuildIntegrationError(
`Invalid integration name: ${integration.name}, Should only contain letters, numbers and underscores`
);
}

const workingDir = joinPath(getDataPath(), `integration-assistant-${generateUniqueId()}`);
const packageDirectoryName = `${integration.name}-${initialVersion}`;
const packageDir = createDirectories(workingDir, integration, packageDirectoryName);

const dataStreamsDir = joinPath(packageDir, 'data_stream');
const fieldsPerDatastream = integration.dataStreams.map((dataStream) => {
const dataStreamName = dataStream.name;
if (!isValidName(dataStreamName)) {
throw new Error(
`Invalid datastream name: ${dataStreamName}, Should only contain letters, numbers and underscores`
try {
const packageDirectoryName = `${integration.name}-${initialVersion}`;
const packageDir = createDirectories(workingDir, integration, packageDirectoryName);

const dataStreamsDir = joinPath(packageDir, 'data_stream');
const fieldsPerDatastream = integration.dataStreams.map((dataStream) => {
const dataStreamName = dataStream.name;
if (!isValidName(dataStreamName)) {
throw new Error(
`Invalid datastream name: ${dataStreamName}, Should only contain letters, numbers and underscores`
);
}
const specificDataStreamDir = joinPath(dataStreamsDir, dataStreamName);

const dataStreamFields = createDataStream(
integration.name,
specificDataStreamDir,
dataStream
);
createAgentInput(specificDataStreamDir, dataStream.inputTypes);
createPipeline(specificDataStreamDir, dataStream.pipeline);
const fields = createFieldMapping(
integration.name,
dataStreamName,
specificDataStreamDir,
dataStream.docs
);
}
const specificDataStreamDir = joinPath(dataStreamsDir, dataStreamName);

const dataStreamFields = createDataStream(integration.name, specificDataStreamDir, dataStream);
createAgentInput(specificDataStreamDir, dataStream.inputTypes);
createPipeline(specificDataStreamDir, dataStream.pipeline);
const fields = createFieldMapping(
integration.name,
dataStreamName,
specificDataStreamDir,
dataStream.docs
);

return {
datastream: dataStreamName,
fields: mergeAndSortFields(fields, dataStreamFields),
};
});
return {
datastream: dataStreamName,
fields: mergeAndSortFields(fields, dataStreamFields),
};
});

createReadme(packageDir, integration.name, fieldsPerDatastream);
const zipBuffer = await createZipArchive(integration, workingDir, packageDirectoryName);
removeDirSync(workingDir);
return zipBuffer;
createReadme(packageDir, integration.name, fieldsPerDatastream);
const zipBuffer = await createZipArchive(integration, workingDir, packageDirectoryName);
removeDirSync(workingDir);
return zipBuffer;
} catch (error) {
throw new BuildIntegrationError('Building the Integration failed');
} finally {
removeDirSync(workingDir);
}
}

export function isValidName(input: string): boolean {
return input.length > 0 && NAME_REGEX_PATTERN.test(input);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -85,17 +85,6 @@ describe('createDataStream', () => {
// dataStream files
expect(copySync).toHaveBeenCalledWith(expect.any(String), `${dataStreamPath}/fields`);

// test files
expect(ensureDirSync).toHaveBeenCalledWith(`${dataStreamPath}/_dev/test/pipeline`);
expect(copySync).toHaveBeenCalledWith(
expect.any(String),
`${dataStreamPath}/_dev/test/pipeline/test-common-config.yml`
);
expect(createSync).toHaveBeenCalledWith(
`${dataStreamPath}/_dev/test/pipeline/test-${packageName}-datastream-1.log`,
samples
);

// // Manifest files
expect(createSync).toHaveBeenCalledWith(`${dataStreamPath}/manifest.yml`, undefined);
expect(render).toHaveBeenCalledWith(`filestream_manifest.yml.njk`, expect.anything());
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,8 +27,6 @@ export function createDataStream(

ensureDirSync(specificDataStreamDir);
const fields = createDataStreamFolders(specificDataStreamDir, pipelineDir);
createPipelineTests(specificDataStreamDir, dataStream.rawSamples, packageName, dataStreamName);

const dataStreams: string[] = [];
for (const inputType of dataStream.inputTypes) {
let mappedValues = {
Expand Down Expand Up @@ -103,27 +101,3 @@ function loadFieldsFromFiles(sourcePath: string, files: string[]): Field[] {
return safeLoad(content) as Field[];
});
}

function createPipelineTests(
specificDataStreamDir: string,
rawSamples: string[],
packageName: string,
dataStreamName: string
): void {
const pipelineTestTemplatesDir = joinPath(__dirname, '../templates/pipeline_tests');
const pipelineTestsDir = joinPath(specificDataStreamDir, '_dev/test/pipeline');
ensureDirSync(pipelineTestsDir);
const items = listDirSync(pipelineTestTemplatesDir);
for (const item of items) {
const s = joinPath(pipelineTestTemplatesDir, item);
const d = joinPath(pipelineTestsDir, item.replaceAll('_', '-'));
copySync(s, d);
}
const formattedPackageName = packageName.replace(/_/g, '-');
const formattedDataStreamName = dataStreamName.replace(/_/g, '-');
const testFileName = joinPath(
pipelineTestsDir,
`test-${formattedPackageName}-${formattedDataStreamName}.log`
);
createSync(testFileName, rawSamples.join('\n'));
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
/*
* 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 { KibanaResponseFactory } from '@kbn/core/server';
import { ErrorThatHandlesItsOwnResponse } from './types';
import { GenerationErrorCode } from '../../../common/constants';

export class BuildIntegrationError extends Error implements ErrorThatHandlesItsOwnResponse {
private readonly errorCode: GenerationErrorCode = GenerationErrorCode.BUILD_INTEGRATION_ERROR;

public sendResponse(res: KibanaResponseFactory) {
return res.badRequest({
body: { message: this.message, attributes: { errorCode: this.errorCode } },
});
}
}
68 changes: 33 additions & 35 deletions x-pack/plugins/integration_assistant/server/util/samples.ts
Original file line number Diff line number Diff line change
Expand Up @@ -153,20 +153,46 @@ export function generateFields(mergedDocs: string): string {
return yaml.safeDump(fieldsStructure, { sortKeys: false });
}

export function isObject(value: any): boolean {
return typeof value === 'object' && value !== null;
}

export function isEmptyValue(value: unknown): boolean {
if (value == null) return true;
if (isObject(value)) {
if (Array.isArray(value)) return value.length === 0;
return value && Object.keys(value).length === 0;
}
return false;
}

export function isUnsafeProperty(key: string, obj: Record<string, any>): boolean {
return (
key === '__proto__' || key === 'constructor' || key === 'prototype' || !Object.hasOwn(obj, key)
);
}

export function merge(
target: Record<string, any>,
source: Record<string, any>
): Record<string, unknown> {
const filteredTarget = filterOwnProperties(target);
const filteredTarget = Object.create(null);

for (const [key, targetValue] of Object.entries(target)) {
if (!isUnsafeProperty(key, target)) {
filteredTarget[key] = targetValue;
}
}

for (const [key, sourceValue] of Object.entries(source)) {
if (!isBuiltInProperties(key, source)) {
if (!isUnsafeProperty(key, source)) {
const targetValue = filteredTarget[key];

if (Array.isArray(sourceValue)) {
// Directly assign arrays
filteredTarget[key] = sourceValue;
} else if (isObject(sourceValue) && !Array.isArray(targetValue)) {
filteredTarget[key] = [...sourceValue];
} else if (isObject(sourceValue) && !Array.isArray(sourceValue)) {
if (!isObject(targetValue) || isEmptyValue(targetValue)) {
filteredTarget[key] = merge({}, sourceValue);
filteredTarget[key] = merge(Object.create(null), sourceValue);
} else {
filteredTarget[key] = merge(targetValue, sourceValue);
}
Expand All @@ -178,36 +204,8 @@ export function merge(
}
}
}
return filteredTarget;
}

function isEmptyValue(value: unknown): boolean {
if (value == null) return true;
if (isObject(value)) {
if (Array.isArray(value)) return value.length === 0;
return value && Object.keys(value).length === 0;
}
return false;
}

function isObject(value: any): boolean {
return typeof value === 'object' && value !== null;
}

function isBuiltInProperties(key: string, obj: Record<string, any>): boolean {
return key === 'constructor' || !Object.prototype.hasOwnProperty.call(obj, key);
}

function filterOwnProperties(obj: Record<string, any>): Record<string, any> {
const ownProps: Record<string, any> = {};

for (const key of Object.getOwnPropertyNames(obj)) {
if (!isBuiltInProperties(key, obj)) {
ownProps[key] = (obj as any)[key];
}
}

return ownProps;
return filteredTarget;
}

export function mergeSamples(objects: any[]): string {
Expand Down
2 changes: 1 addition & 1 deletion x-pack/plugins/translations/translations/fr-FR.json
Original file line number Diff line number Diff line change
Expand Up @@ -26400,9 +26400,9 @@
"xpack.lens.app.settingsAriaLabel": "Ouvrir le menu de paramètres Lens",
"xpack.lens.app.share.defaultDashboardTitle": "Visualisation Lens [{date}]",
"xpack.lens.app.shareButtonDisabledWarning": "La visualisation ne comprend aucune donnée à partager.",
"xpack.lens.app.shareModal.title": "Partager cette visualisation Lens",
"xpack.lens.app.shareModal.draftModeCallout.link.warning": "Copiez le lien afin d’obtenir un lien temporaire. Enregistrez la visualisation Lens pour créer un lien permanent.",
"xpack.lens.app.shareModal.draftModeCallout.title": "Modifications non enregistrées",
"xpack.lens.app.shareModal.title": "Partager cette visualisation Lens",
"xpack.lens.app.shareTitle": "Partager",
"xpack.lens.app.shareTitleAria": "Partager la visualisation",
"xpack.lens.app.showUnderlyingDataMultipleLayers": "Impossible d’afficher les données sous-jacentes pour les visualisations avec plusieurs calques.",
Expand Down
2 changes: 1 addition & 1 deletion x-pack/plugins/translations/translations/ja-JP.json
Original file line number Diff line number Diff line change
Expand Up @@ -26372,9 +26372,9 @@
"xpack.lens.app.settingsAriaLabel": "Lens設定メニューを開く",
"xpack.lens.app.share.defaultDashboardTitle": "Lensビジュアライゼーション[{date}]",
"xpack.lens.app.shareButtonDisabledWarning": "ビジュアライゼーションには共有するデータがありません。",
"xpack.lens.app.shareModal.title": "このLensビジュアライゼーションを共有",
"xpack.lens.app.shareModal.draftModeCallout.link.warning": "リンクをコピーして、一時リンクを取得します。Lensビジュアライゼーションを保存して、永続リンクを作成します。",
"xpack.lens.app.shareModal.draftModeCallout.title": "保存されていない変更",
"xpack.lens.app.shareModal.title": "このLensビジュアライゼーションを共有",
"xpack.lens.app.shareTitle": "共有",
"xpack.lens.app.shareTitleAria": "ビジュアライゼーションを共有",
"xpack.lens.app.showUnderlyingDataMultipleLayers": "複数レイヤーのビジュアライゼーションでは、基本データを表示できません",
Expand Down
2 changes: 1 addition & 1 deletion x-pack/plugins/translations/translations/zh-CN.json
Original file line number Diff line number Diff line change
Expand Up @@ -26429,9 +26429,9 @@
"xpack.lens.app.settingsAriaLabel": "打开 Lens 设置菜单",
"xpack.lens.app.share.defaultDashboardTitle": "Lens 可视化 [{date}]",
"xpack.lens.app.shareButtonDisabledWarning": "此可视化没有可共享的数据。",
"xpack.lens.app.shareModal.title": "共享此 Lens 可视化",
"xpack.lens.app.shareModal.draftModeCallout.link.warning": "复制链接以获取临时链接。保存 Lens 可视化以创建永久链接。",
"xpack.lens.app.shareModal.draftModeCallout.title": "未保存的更改",
"xpack.lens.app.shareModal.title": "共享此 Lens 可视化",
"xpack.lens.app.shareTitle": "共享",
"xpack.lens.app.shareTitleAria": "共享可视化",
"xpack.lens.app.showUnderlyingDataMultipleLayers": "无法显示具有多个图层的可视化的底层数据",
Expand Down
22 changes: 8 additions & 14 deletions yarn.lock
Original file line number Diff line number Diff line change
Expand Up @@ -14149,10 +14149,10 @@ babel-runtime@6.x, babel-runtime@^6.26.0:
core-js "^2.4.0"
regenerator-runtime "^0.11.0"

backport@^9.6.4:
version "9.6.4"
resolved "https://registry.yarnpkg.com/backport/-/backport-9.6.4.tgz#ea45ab97f32ebca1564269f92a6fc56eda703cdc"
integrity sha512-cTaItWSGoO33vOD/br/Di2KFesgHyE6UWuc0GN0IiFk13UqEadeURq3UOQptARyQC3Nz56Us5QYNJ3E5L61zYg==
backport@^9.6.6:
version "9.6.6"
resolved "https://registry.yarnpkg.com/backport/-/backport-9.6.6.tgz#ab7d0a1720eb5cd3ccef51cd79f1872bb9ed409c"
integrity sha512-X/2vWZNZP5wvbfWaxtLsXSbnOxANgoCh84IZavTS2X2/6X/si3cpUL0ky1fh+70bK5O8PI+3Fopp5srmeqHB1g==
dependencies:
"@octokit/rest" "^19.0.7"
axios "^1.6.2"
Expand Down Expand Up @@ -20964,11 +20964,6 @@ ip-regex@^4.1.0:
resolved "https://registry.yarnpkg.com/ip-regex/-/ip-regex-4.3.0.tgz#687275ab0f57fa76978ff8f4dddc8a23d5990db5"
integrity sha512-B9ZWJxHHOHUhUjCPrMpLD4xEq35bUTClHM1S6CBU5ixQnkZmwipwgc96vAd7AAGM9TGHvJR+Uss+/Ak6UphK+Q==

ip@^1.1.8:
version "1.1.9"
resolved "https://registry.yarnpkg.com/ip/-/ip-1.1.9.tgz#8dfbcc99a754d07f425310b86a99546b1151e396"
integrity sha512-cyRxvOEpNHNtchU3Ln9KC/auJgup87llfQpQ+t5ghoC/UhL16SWzbueiCsdTnWmqAWl7LadfuwhlqmtOaqMHdQ==

ip@^2.0.0:
version "2.0.1"
resolved "https://registry.yarnpkg.com/ip/-/ip-2.0.1.tgz#e8f3595d33a3ea66490204234b77636965307105"
Expand Down Expand Up @@ -25574,7 +25569,6 @@ pac-resolver@^7.0.1:
integrity sha512-5NPgf87AT2STgwa2ntRMr45jTKrYBGkVU36yT0ig/n/GMAa3oPqhZfIQ2kMEimReg0+t9kZViDVZ83qfVUlckg==
dependencies:
degenerator "^5.0.0"
ip "^1.1.8"
netmask "^2.0.2"

package-hash@^4.0.0:
Expand Down Expand Up @@ -28930,10 +28924,10 @@ semver@^6.0.0, semver@^6.1.0, semver@^6.1.2, semver@^6.3.0, semver@^6.3.1:
resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4"
integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==

semver@^7.3.2, semver@^7.3.4, semver@^7.3.5, semver@^7.3.7, semver@^7.5.0, semver@^7.5.2, semver@^7.5.3, semver@^7.5.4, semver@^7.6.2, semver@^7.6.3:
version "7.6.3"
resolved "https://registry.yarnpkg.com/semver/-/semver-7.6.3.tgz#980f7b5550bc175fb4dc09403085627f9eb33143"
integrity sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==
semver@^7.3.2, semver@^7.3.4, semver@^7.3.5, semver@^7.3.7, semver@^7.5.0, semver@^7.5.2, semver@^7.5.3, semver@^7.5.4, semver@^7.6.2, semver@^7.6.3, semver@^7.7.1:
version "7.7.1"
resolved "https://registry.yarnpkg.com/semver/-/semver-7.7.1.tgz#abd5098d82b18c6c81f6074ff2647fd3e7220c9f"
integrity sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==

send@0.19.0:
version "0.19.0"
Expand Down

0 comments on commit 7073b06

Please sign in to comment.