From 97f111ba3b942ebcdb9ee861ef8e1ecef0c8d0d5 Mon Sep 17 00:00:00 2001 From: mohamedhamed-ahmed Date: Sat, 24 Jan 2026 00:19:17 +0100 Subject: [PATCH] [Dataset quality] configuring dockerized package registry in tests (#250040) ## Summary We have been dealing with a lot of flakiness in our tests due to package registry not being available, this PR changes the package registery being used to the dockerized one in Dataset Quality. As well as centralizing its usage in kbn-test package so that it can later on be used from a central place by other teams instead of duplicating it in every test suite. This is work continuation for [[Dataset quality] configuring dockerized package registry in tests](https://github.com/elastic/kibana/pull/234891). (cherry picked from commit 890247929ccd1b7d40d2e88eccd14ea9267af063) --- .../packages/shared/kbn-test/index.ts | 11 +++--- .../lib/docker_servers/index.ts | 1 + .../docker_servers/package_registry/index.ts | 39 +++++++++++++++++++ .../package_registry_config.yml | 2 + .../plugins/shared/dataset_quality/README.md | 2 +- .../feature_flag.serverless.config.base.ts | 24 +----------- .../feature_flag.stateful.config.base.ts | 24 ++---------- .../fixtures/package_registry_config.yml | 2 - .../default_configs/serverless.config.base.ts | 25 +----------- .../default_configs/stateful.config.base.ts | 25 ++---------- .../dataset_quality_details.ts | 24 ++++++------ .../test/functional/config.base.ts | 13 ++++++- .../dataset_quality_details.ts | 25 ++++++------ 13 files changed, 93 insertions(+), 124 deletions(-) create mode 100644 src/platform/packages/shared/kbn-test/src/functional_test_runner/lib/docker_servers/package_registry/index.ts create mode 100644 src/platform/packages/shared/kbn-test/src/functional_test_runner/lib/docker_servers/package_registry/package_registry_config.yml delete mode 100644 x-pack/platform/test/api_integration_deployment_agnostic/default_configs/fixtures/package_registry_config.yml diff --git a/src/platform/packages/shared/kbn-test/index.ts b/src/platform/packages/shared/kbn-test/index.ts index 97785c7ced4e1..75b7d30b7f31f 100644 --- a/src/platform/packages/shared/kbn-test/index.ts +++ b/src/platform/packages/shared/kbn-test/index.ts @@ -82,9 +82,8 @@ export * from './src/find_test_plugin_paths'; export { getDockerFileMountPath } from '@kbn/es'; -// Docker image to use for Fleet API integration tests. -// This image comes from the latest successful build of https://buildkite.com/elastic/kibana-package-registry-promote -// which is promoted after acceptance tests succeed against docker.elastic.co/package-registry/distribution:lite -export const fleetPackageRegistryDockerImage = - process.env.FLEET_PACKAGE_REGISTRY_DOCKER_IMAGE || - 'docker.elastic.co/kibana-ci/package-registry-distribution:lite'; +export { + fleetPackageRegistryDockerImage, + packageRegistryDocker, + dockerRegistryPort, +} from './src/functional_test_runner'; diff --git a/src/platform/packages/shared/kbn-test/src/functional_test_runner/lib/docker_servers/index.ts b/src/platform/packages/shared/kbn-test/src/functional_test_runner/lib/docker_servers/index.ts index 87469dea1fefc..43da3f1dc618c 100644 --- a/src/platform/packages/shared/kbn-test/src/functional_test_runner/lib/docker_servers/index.ts +++ b/src/platform/packages/shared/kbn-test/src/functional_test_runner/lib/docker_servers/index.ts @@ -9,3 +9,4 @@ export * from './docker_servers_service'; export * from './define_docker_servers_config'; +export * from './package_registry'; diff --git a/src/platform/packages/shared/kbn-test/src/functional_test_runner/lib/docker_servers/package_registry/index.ts b/src/platform/packages/shared/kbn-test/src/functional_test_runner/lib/docker_servers/package_registry/index.ts new file mode 100644 index 0000000000000..589e76fbf0b21 --- /dev/null +++ b/src/platform/packages/shared/kbn-test/src/functional_test_runner/lib/docker_servers/package_registry/index.ts @@ -0,0 +1,39 @@ +/* + * 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", the "GNU Affero General Public License v3.0 only", and the "Server Side + * Public License v 1"; you may not use this file except in compliance with, at + * your election, the "Elastic License 2.0", the "GNU Affero General Public + * License v3.0 only", or the "Server Side Public License, v 1". + */ + +import { join } from 'path'; + +// Docker image to use for Fleet API integration tests. +// This image comes from the latest successful build of https://buildkite.com/elastic/kibana-package-registry-promote +// which is promoted after acceptance tests succeed against docker.elastic.co/package-registry/distribution:lite +export const fleetPackageRegistryDockerImage = + process.env.FLEET_PACKAGE_REGISTRY_DOCKER_IMAGE || + 'docker.elastic.co/kibana-ci/package-registry-distribution:lite'; + +const packageRegistryConfig = join(__dirname, './package_registry_config.yml'); +const dockerArgs: string[] = ['-v', `${packageRegistryConfig}:/package-registry/config.yml`]; + +/** + * This is used by CI to set the docker registry port + * you can also define this environment variable locally when running tests which + * will spin up a local docker package registry locally for you + * if this is defined it takes precedence over the `packageRegistryOverride` variable + */ +export const dockerRegistryPort: string | undefined = process.env.FLEET_PACKAGE_REGISTRY_PORT; + +export const packageRegistryDocker = { + enabled: !!dockerRegistryPort, + image: fleetPackageRegistryDockerImage, + portInContainer: 8080, + port: dockerRegistryPort, + args: dockerArgs, + waitForLogLine: 'package manifests loaded', + waitForLogLineTimeoutMs: 60 * 4 * 1000, // 4 minutes + preferCached: true, +}; diff --git a/src/platform/packages/shared/kbn-test/src/functional_test_runner/lib/docker_servers/package_registry/package_registry_config.yml b/src/platform/packages/shared/kbn-test/src/functional_test_runner/lib/docker_servers/package_registry/package_registry_config.yml new file mode 100644 index 0000000000000..a6c51976af986 --- /dev/null +++ b/src/platform/packages/shared/kbn-test/src/functional_test_runner/lib/docker_servers/package_registry/package_registry_config.yml @@ -0,0 +1,2 @@ +package_paths: + - /packages/package-storage \ No newline at end of file diff --git a/x-pack/platform/plugins/shared/dataset_quality/README.md b/x-pack/platform/plugins/shared/dataset_quality/README.md index 18351597a3064..6b61fa64ae74c 100755 --- a/x-pack/platform/plugins/shared/dataset_quality/README.md +++ b/x-pack/platform/plugins/shared/dataset_quality/README.md @@ -78,7 +78,7 @@ node x-pack/platform/plugins/shared/dataset_quality/scripts/api --runner --grep- For tests using package registry we have enabled a configuration that uses a dockerized lite version to execute the tests in the CI, this will reduce the flakyness of them when calling the real endpoint. -To be able to run this version locally you must have a docker daemon running in your systema and set `FLEET_PACKAGE_REGISTRY_PORT` env var. In order to set this variable execute +To be able to run this version locally you must have a docker daemon running in your system and set `FLEET_PACKAGE_REGISTRY_PORT` env var. In order to set this variable execute ``` export set FLEET_PACKAGE_REGISTRY_PORT=12345 diff --git a/x-pack/platform/test/api_integration_deployment_agnostic/default_configs/feature_flag.serverless.config.base.ts b/x-pack/platform/test/api_integration_deployment_agnostic/default_configs/feature_flag.serverless.config.base.ts index d9b89d58aee08..c9d98f8710686 100644 --- a/x-pack/platform/test/api_integration_deployment_agnostic/default_configs/feature_flag.serverless.config.base.ts +++ b/x-pack/platform/test/api_integration_deployment_agnostic/default_configs/feature_flag.serverless.config.base.ts @@ -5,11 +5,10 @@ * 2.0. */ import type { FtrConfigProviderContext, Config } from '@kbn/test'; -import { fleetPackageRegistryDockerImage, defineDockerServersConfig } from '@kbn/test'; +import { defineDockerServersConfig, packageRegistryDocker, dockerRegistryPort } from '@kbn/test'; import { ScoutTestRunConfigCategory } from '@kbn/scout-info'; import type { ServerlessProjectType } from '@kbn/es'; -import path from 'path'; import type { DeploymentAgnosticCommonServices } from '../services'; import { services } from '../services'; import { LOCAL_PRODUCT_DOC_PATH } from './common_paths'; @@ -58,22 +57,12 @@ export function createServerlessFeatureFlagTestConfig ) { return async ({ readConfigFile }: FtrConfigProviderContext): Promise => { - const packageRegistryConfig = path.join(__dirname, './fixtures/package_registry_config.yml'); - const dockerArgs: string[] = ['-v', `${packageRegistryConfig}:/package-registry/config.yml`]; let kbnServerArgs: string[] = []; if (options.kbnServerArgs) { kbnServerArgs = await updateKbnServerArguments(options.kbnServerArgs); } - /** - * This is used by CI to set the docker registry port - * you can also define this environment variable locally when running tests which - * will spin up a local docker package registry locally for you - * if this is defined it takes precedence over the `packageRegistryOverride` variable - */ - const dockerRegistryPort: string | undefined = process.env.FLEET_PACKAGE_REGISTRY_PORT; - const svlSharedConfig = await readConfigFile( require.resolve('../../serverless/shared/config.base.ts') ); @@ -87,16 +76,7 @@ export function createServerlessFeatureFlagTestConfig { await PageObjects.observabilityLogsExplorer.uninstallPackage(apachePkg); - await PageObjects.observabilityLogsExplorer.uninstallPackage(bitbucketPkg); + await PageObjects.observabilityLogsExplorer.uninstallPackage(fleetServerPkg); await synthtrace.clean(); await synthtrace.deleteIndexTemplate(IndexTemplateName.Synht2); await synthtrace.deleteComponentTemplate('synth.2@custom'); @@ -374,7 +374,7 @@ export default function ({ getService, getPageObjects }: DatasetQualityFtrProvid it('should hide integration dashboard for integrations without dashboards', async () => { await PageObjects.datasetQuality.navigateToDetails({ - dataStream: bitbucketAuditDataStreamName, + dataStream: fleetServerOutputHealthDataStreamName, }); await PageObjects.datasetQuality.openIntegrationActionsMenu(); @@ -388,7 +388,7 @@ export default function ({ getService, getPageObjects }: DatasetQualityFtrProvid it('should navigate to integration overview page on clicking integration overview action', async () => { await PageObjects.datasetQuality.navigateToDetails({ - dataStream: bitbucketAuditDataStreamName, + dataStream: fleetServerOutputHealthDataStreamName, }); await PageObjects.datasetQuality.openIntegrationActionsMenu(); @@ -402,7 +402,7 @@ export default function ({ getService, getPageObjects }: DatasetQualityFtrProvid const currentUrl = await browser.getCurrentUrl(); const parsedUrl = new URL(currentUrl); - expect(parsedUrl.pathname).to.contain('/app/integrations/detail/atlassian_bitbucket'); + expect(parsedUrl.pathname).to.contain('/app/integrations/detail/fleet_server'); }); }); diff --git a/x-pack/solutions/observability/test/functional/config.base.ts b/x-pack/solutions/observability/test/functional/config.base.ts index b7b0615acd4ef..262d4725a7c30 100644 --- a/x-pack/solutions/observability/test/functional/config.base.ts +++ b/x-pack/solutions/observability/test/functional/config.base.ts @@ -7,8 +7,9 @@ import { ScoutTestRunConfigCategory } from '@kbn/scout-info'; import type { FtrConfigProviderContext } from '@kbn/test'; -import { services } from './services'; +import { defineDockerServersConfig, dockerRegistryPort, packageRegistryDocker } from '@kbn/test'; import { pageObjects } from './page_objects'; +import { services } from './services'; export async function getFunctionalConfig({ readConfigFile }: FtrConfigProviderContext) { const xPackPlatformFunctionalTestsConfig = await readConfigFile( @@ -21,13 +22,21 @@ export async function getFunctionalConfig({ readConfigFile }: FtrConfigProviderC pageObjects, testConfigCategory: ScoutTestRunConfigCategory.UI_TEST, servers: xPackPlatformFunctionalTestsConfig.get('servers'), + dockerServers: defineDockerServersConfig({ + registry: packageRegistryDocker, + }), security: xPackPlatformFunctionalTestsConfig.get('security'), junit: { reportName: 'X-Pack Observability Functional UI Tests', }, kbnTestServer: { ...xPackPlatformFunctionalTestsConfig.get('kbnTestServer'), - serverArgs: [...xPackPlatformFunctionalTestsConfig.get('kbnTestServer.serverArgs')], + serverArgs: [ + ...xPackPlatformFunctionalTestsConfig.get('kbnTestServer.serverArgs'), + ...(dockerRegistryPort + ? [`--xpack.fleet.registryUrl=http://localhost:${dockerRegistryPort}`] + : []), + ], }, esTestCluster: { ...xPackPlatformFunctionalTestsConfig.get('esTestCluster'), diff --git a/x-pack/solutions/observability/test/serverless/functional/test_suites/dataset_quality/dataset_quality_details.ts b/x-pack/solutions/observability/test/serverless/functional/test_suites/dataset_quality/dataset_quality_details.ts index 7068d2bb08ad0..eb85d35d73b58 100644 --- a/x-pack/solutions/observability/test/serverless/functional/test_suites/dataset_quality/dataset_quality_details.ts +++ b/x-pack/solutions/observability/test/serverless/functional/test_suites/dataset_quality/dataset_quality_details.ts @@ -46,11 +46,11 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { version: '1.14.0', }; - const bitbucketDatasetName = 'atlassian_bitbucket.audit'; - const bitbucketAuditDataStreamName = `logs-${bitbucketDatasetName}-${defaultNamespace}`; - const bitbucketPkg = { - name: 'atlassian_bitbucket', - version: '1.14.0', + const fleetServerDatasetName = 'fleet_server.output_health'; + const fleetServerOutputHealthDataStreamName = `logs-${fleetServerDatasetName}-${defaultNamespace}`; + const fleetServerPkg = { + name: 'fleet_server', + version: '1.6.0', }; const regularDatasetName = datasetNames[0]; @@ -63,8 +63,8 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { // Install Apache Integration and ingest logs for it await PageObjects.observabilityLogsExplorer.installPackage(apachePkg); - // Install Bitbucket Integration (package which does not has Dashboards) and ingest logs for it - await PageObjects.observabilityLogsExplorer.installPackage(bitbucketPkg); + // Install fleet server Integration (package which does not has Dashboards) and ingest logs for it + await PageObjects.observabilityLogsExplorer.installPackage(fleetServerPkg); await synthtrace.index([ // Ingest basic logs @@ -91,7 +91,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { isMalformed: true, }), // Index logs for Bitbucket integration - getLogsForDataset({ to, count: 10, dataset: bitbucketDatasetName }), + getLogsForDataset({ to, count: 10, dataset: fleetServerDatasetName }), ]); await PageObjects.svlCommonPage.loginAsViewer(); @@ -99,7 +99,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { after(async () => { await PageObjects.observabilityLogsExplorer.uninstallPackage(apachePkg); - await PageObjects.observabilityLogsExplorer.uninstallPackage(bitbucketPkg); + await PageObjects.observabilityLogsExplorer.uninstallPackage(fleetServerPkg); await synthtrace.clean(); }); @@ -227,7 +227,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { it('should hide integration dashboard for integrations without dashboards', async () => { await PageObjects.datasetQuality.navigateToDetails({ - dataStream: bitbucketAuditDataStreamName, + dataStream: fleetServerOutputHealthDataStreamName, }); await PageObjects.datasetQuality.openIntegrationActionsMenu(); @@ -241,7 +241,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { it('Should navigate to integration overview page on clicking integration overview action', async () => { await PageObjects.datasetQuality.navigateToDetails({ - dataStream: bitbucketAuditDataStreamName, + dataStream: fleetServerOutputHealthDataStreamName, }); await PageObjects.datasetQuality.openIntegrationActionsMenu(); @@ -254,8 +254,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { await retry.tryForTime(5000, async () => { const currentUrl = await browser.getCurrentUrl(); const parsedUrl = new URL(currentUrl); - - expect(parsedUrl.pathname).to.contain('/app/integrations/detail/atlassian_bitbucket'); + expect(parsedUrl.pathname).to.contain('/app/integrations/detail/fleet_server'); }); });