diff --git a/.buildkite/pipelines/es_serverless/verify_es_serverless_image.yml b/.buildkite/pipelines/es_serverless/verify_es_serverless_image.yml index 45fbea65038f6..9da1582959a65 100644 --- a/.buildkite/pipelines/es_serverless/verify_es_serverless_image.yml +++ b/.buildkite/pipelines/es_serverless/verify_es_serverless_image.yml @@ -82,22 +82,6 @@ steps: - exit_status: '*' limit: 1 - - command: .buildkite/scripts/steps/test/scout_uiam_tests.sh - label: 'Scout UIAM Tests' - agents: - image: family/kibana-ubuntu-2404 - imageProject: elastic-images-prod - provider: gcp - machineType: n2-standard-4 - diskSizeGb: 115 - timeout_in_minutes: 15 - depends_on: - - build - retry: - automatic: - - exit_status: '*' - limit: 1 - - command: .buildkite/scripts/steps/functional/security_serverless_entity_analytics.sh label: 'Serverless Entity Analytics - Security Solution Cypress Tests' if: "build.env('SKIP_CYPRESS') != '1' && build.env('SKIP_CYPRESS') != 'true'" diff --git a/.buildkite/pipelines/on_merge.yml b/.buildkite/pipelines/on_merge.yml index e99874c7f7e8f..17795085b45fb 100644 --- a/.buildkite/pipelines/on_merge.yml +++ b/.buildkite/pipelines/on_merge.yml @@ -217,22 +217,6 @@ steps: - exit_status: '*' limit: 1 - - command: .buildkite/scripts/steps/test/scout_uiam_tests.sh - label: 'Scout UIAM Tests' - agents: - image: family/kibana-ubuntu-2404 - imageProject: elastic-images-prod - provider: gcp - machineType: n2-standard-4 - diskSizeGb: 105 - timeout_in_minutes: 15 - depends_on: - - build - retry: - automatic: - - exit_status: '*' - limit: 1 - - command: .buildkite/scripts/steps/functional/security_serverless_entity_analytics.sh label: 'Serverless Entity Analytics - Security Cypress Tests' agents: diff --git a/.buildkite/pipelines/pull_request/scout_uiam_tests.yml b/.buildkite/pipelines/pull_request/scout_uiam_tests.yml deleted file mode 100644 index 2a5a7b502d7de..0000000000000 --- a/.buildkite/pipelines/pull_request/scout_uiam_tests.yml +++ /dev/null @@ -1,20 +0,0 @@ -steps: - - command: .buildkite/scripts/steps/test/scout_uiam_tests.sh - label: 'Scout UIAM Tests' - agents: - machineType: n2-standard-4 - preemptible: true - spotZones: us-central1-f,us-central1-c,us-central1-b,us-central1-a - timeout_in_minutes: 15 - depends_on: - - build - - quick_checks - - checks - - linting - - linting_with_types - - check_types - - check_oas_snapshot - retry: - automatic: - - exit_status: '*' - limit: 1 diff --git a/.buildkite/scout_ci_config.yml b/.buildkite/scout_ci_config.yml index f5321446eeb2b..685772c2e44a0 100644 --- a/.buildkite/scout_ci_config.yml +++ b/.buildkite/scout_ci_config.yml @@ -3,9 +3,13 @@ plugins: enabled: - apm - console + - cloud_security_posture - discover_enhanced + - entity_store + - fleet - index_management - infra + - lens - maps - observability - observability_onboarding @@ -13,16 +17,14 @@ plugins: - profiling - search_getting_started - search_homepage + - security - security_solution - slo - spaces - streams - streams_app - - workflows_extensions - transform - - fleet - - entity_store - - lens + - workflows_extensions disabled: packages: @@ -31,3 +33,7 @@ packages: disabled: - kbn-scout # Internal scout tests are run in advance to validate Scout integrity (see .buildkite/scripts/steps/test/scout_test_run_builder.sh) - kbn-scout-release-testing # Release tests will run separately as part of the release process + +# Define test configs to be excluded from automatic discovery & execution in CI environment (process.env.CI=true) +excluded_configs: + - x-pack/solutions/security/plugins/cloud_security_posture/test/scout_cspm_agentless/ui/parallel.playwright.config.ts diff --git a/.buildkite/scripts/pipelines/pull_request/pipeline.ts b/.buildkite/scripts/pipelines/pull_request/pipeline.ts index 324254786ccfe..f1ffb60fee94d 100644 --- a/.buildkite/scripts/pipelines/pull_request/pipeline.ts +++ b/.buildkite/scripts/pipelines/pull_request/pipeline.ts @@ -73,9 +73,6 @@ const SKIPPABLE_PR_MATCHERS = prConfig.skip_ci_on_only_changed!.map((r) => new R pipeline.push(getPipeline('.buildkite/pipelines/pull_request/scout_tests.yml')); - // A temporary pipeline for UIAM tests that should be removed when the main Scout pipeline supports custom configs. - pipeline.push(getPipeline('.buildkite/pipelines/pull_request/scout_uiam_tests.yml')); - if (await doAnyChangesMatch([/^src\/platform\/packages\/private\/kbn-handlebars/])) { pipeline.push(getPipeline('.buildkite/pipelines/pull_request/kbn_handlebars.yml')); } diff --git a/.buildkite/scripts/steps/test/scout_test_run_builder.sh b/.buildkite/scripts/steps/test/scout_test_run_builder.sh index 885053c2aea5c..c43a0f9d0aa2e 100755 --- a/.buildkite/scripts/steps/test/scout_test_run_builder.sh +++ b/.buildkite/scripts/steps/test/scout_test_run_builder.sh @@ -11,7 +11,7 @@ echo '--- Update Scout Test Config Manifests' node scripts/scout.js update-test-config-manifests echo '--- Discover Playwright Configs and upload to Buildkite artifacts' -node scripts/scout discover-playwright-configs --save +node scripts/scout discover-playwright-configs --include-custom-servers --save cp .scout/test_configs/scout_playwright_configs.json scout_playwright_configs.json buildkite-agent artifact upload "scout_playwright_configs.json" diff --git a/.buildkite/scripts/steps/test/scout_uiam_tests.sh b/.buildkite/scripts/steps/test/scout_uiam_tests.sh deleted file mode 100755 index 113e1f12842b1..0000000000000 --- a/.buildkite/scripts/steps/test/scout_uiam_tests.sh +++ /dev/null @@ -1,10 +0,0 @@ -#!/usr/bin/env bash - -set -euo pipefail - -source .buildkite/scripts/steps/functional/common.sh - -echo '--- Running Scout UIAM Integration Tests' -node scripts/scout.js run-tests --serverless security --config x-pack/platform/plugins/shared/security/test/scout_uiam_local/api/parallel.playwright.config.ts --kibana-install-dir "$KIBANA_BUILD_LOCATION" - -source .buildkite/scripts/steps/test/scout_upload_report_events.sh diff --git a/src/platform/packages/private/kbn-scout-info/src/paths.ts b/src/platform/packages/private/kbn-scout-info/src/paths.ts index 38d753907590c..7faaa46bc4fa3 100644 --- a/src/platform/packages/private/kbn-scout-info/src/paths.ts +++ b/src/platform/packages/private/kbn-scout-info/src/paths.ts @@ -7,8 +7,8 @@ * License v3.0 only", or the "Server Side Public License, v 1". */ -import path from 'node:path'; import { REPO_ROOT } from '@kbn/repo-info'; +import path from 'node:path'; export const SCOUT_OUTPUT_ROOT = path.resolve(REPO_ROOT, '.scout'); @@ -33,7 +33,7 @@ export const SCOUT_PLAYWRIGHT_CONFIGS_PATH = path.resolve( ); export const TESTABLE_COMPONENT_SCOUT_ROOT_PATH_GLOB = - '{src/platform,x-pack/**}/{plugins,packages}/**/test/scout'; + '{src/platform,x-pack/**}/{plugins,packages}/**/test/scout{_*,}'; export const TESTABLE_COMPONENT_SCOUT_ROOT_PATH_REGEX = new RegExp( `(?:src|x-pack)` + diff --git a/src/platform/packages/shared/kbn-scout/src/cli/config_discovery.test.ts b/src/platform/packages/shared/kbn-scout/src/cli/config_discovery.test.ts index 6260eaef5988f..992314e7ca6c6 100644 --- a/src/platform/packages/shared/kbn-scout/src/cli/config_discovery.test.ts +++ b/src/platform/packages/shared/kbn-scout/src/cli/config_discovery.test.ts @@ -11,7 +11,10 @@ import type { FlagsReader } from '@kbn/dev-cli-runner'; import type { ScoutTestableModuleWithConfigs } from '@kbn/scout-reporting/src/registry'; import type { ToolingLog } from '@kbn/tooling-log'; import fs from 'fs'; -import { filterModulesByScoutCiConfig } from '../tests_discovery/search_configs'; +import { + filterModulesByScoutCiConfig, + getScoutCiExcludedConfigs, +} from '../tests_discovery/search_configs'; import type { ModuleDiscoveryInfo } from './config_discovery'; import { runDiscoverPlaywrightConfigs } from './config_discovery'; @@ -49,6 +52,7 @@ jest.mock('@kbn/scout-info', () => ({ jest.mock('../tests_discovery/search_configs', () => ({ filterModulesByScoutCiConfig: jest.fn(), + getScoutCiExcludedConfigs: jest.fn(), })); jest.mock('@kbn/scout-reporting/src/registry', () => { @@ -126,6 +130,7 @@ describe('runDiscoverPlaywrightConfigs', () => { flagsReader.arrayOfStrings.mockReturnValue([]); (filterModulesByScoutCiConfig as jest.Mock).mockReturnValue(mockFilteredModules); + (getScoutCiExcludedConfigs as jest.Mock).mockReturnValue([]); // Default mock modules mockTestableModules.modules = [ @@ -320,6 +325,149 @@ describe('runDiscoverPlaywrightConfigs', () => { expect(foundMessage![0]).toContain('1 package(s)'); // packageA }); + it('includes custom-server configs alongside defaults when "include-custom-servers" is true', () => { + flagsReader.enum.mockReturnValue('all'); + flagsReader.boolean.mockImplementation((flag) => flag === 'include-custom-servers'); + + mockTestableModules.modules = [ + { + name: 'pluginCustom', + group: 'groupCustom', + type: 'plugin' as const, + visibility: 'private' as const, + root: 'x-pack/platform/plugins/private/pluginCustom', + configs: [ + { + path: 'x-pack/platform/plugins/private/pluginCustom/test/scout_custom/config.playwright.config.ts', + category: 'ui', + type: 'playwright', + manifest: { + path: 'x-pack/platform/plugins/private/pluginCustom/test/scout_custom/config.playwright.config.ts', + exists: true, + lastModified: '2024-01-01T00:00:00Z', + sha1: 'custom123', + tests: [ + { + id: 'customTest1', + title: 'Custom Test 1', + expectedStatus: 'passed', + location: { file: 'custom.spec.ts', line: 1, column: 1 }, + tags: ['@ess'], + }, + ], + }, + }, + { + path: 'x-pack/platform/plugins/private/pluginCustom/config.playwright.config.ts', + category: 'ui', + type: 'playwright', + manifest: { + path: 'x-pack/platform/plugins/private/pluginCustom/config.playwright.config.ts', + exists: true, + lastModified: '2024-01-01T00:00:00Z', + sha1: 'normal456', + tests: [ + { + id: 'normalTest1', + title: 'Normal Test 1', + expectedStatus: 'passed', + location: { file: 'normal.spec.ts', line: 1, column: 1 }, + tags: ['@ess'], + }, + ], + }, + }, + ], + }, + ]; + + runDiscoverPlaywrightConfigs(flagsReader, log); + + const infoCalls = log.info.mock.calls; + const configLogs = infoCalls.filter((call) => call[0].startsWith('- ')); + expect(configLogs.length).toBeGreaterThan(0); + expect(configLogs.some((call) => call[0].includes('/test/scout_custom/'))).toBe(true); + expect( + configLogs.some((call) => call[0].includes('/pluginCustom/config.playwright.config.ts')) + ).toBe(true); + }); + + it('excludes configs listed in scout_ci_config.yml when running in CI', () => { + const originalCi = process.env.CI; + process.env.CI = 'true'; + + flagsReader.enum.mockReturnValue('all'); + flagsReader.boolean.mockImplementation((flag) => flag === 'include-custom-servers'); + + const excludedConfigPath = + 'x-pack/solutions/security/plugins/cloud_security_posture/test/scout_cspm_agentless/ui/parallel.playwright.config.ts'; + + (getScoutCiExcludedConfigs as jest.Mock).mockReturnValue([excludedConfigPath]); + + mockTestableModules.modules = [ + { + name: 'pluginCspm', + group: 'security', + type: 'plugin' as const, + visibility: 'private' as const, + root: 'x-pack/solutions/security/plugins/cloud_security_posture', + configs: [ + { + path: excludedConfigPath, + category: 'ui', + type: 'playwright', + manifest: { + path: excludedConfigPath, + exists: true, + lastModified: '2024-01-01T00:00:00Z', + sha1: 'exclude123', + tests: [ + { + id: 'excludedTest', + title: 'Excluded Test', + expectedStatus: 'passed', + location: { file: 'excluded.spec.ts', line: 1, column: 1 }, + tags: ['@ess'], + }, + ], + }, + }, + { + path: 'x-pack/solutions/security/plugins/cloud_security_posture/test/scout/ui/config.playwright.config.ts', + category: 'ui', + type: 'playwright', + manifest: { + path: 'x-pack/solutions/security/plugins/cloud_security_posture/test/scout/ui/config.playwright.config.ts', + exists: true, + lastModified: '2024-01-01T00:00:00Z', + sha1: 'include456', + tests: [ + { + id: 'includedTest', + title: 'Included Test', + expectedStatus: 'passed', + location: { file: 'included.spec.ts', line: 1, column: 1 }, + tags: ['@ess'], + }, + ], + }, + }, + ], + }, + ]; + + runDiscoverPlaywrightConfigs(flagsReader, log); + + const infoCalls = log.info.mock.calls; + const configLogs = infoCalls.filter((call) => call[0].startsWith('- ')); + expect(configLogs.some((call) => call[0].includes(excludedConfigPath))).toBe(false); + expect( + configLogs.some((call) => call[0].includes('/test/scout/ui/config.playwright.config.ts')) + ).toBe(true); + + process.env.CI = originalCi; + }); + it('filters config tags to only include cross tags', () => { flagsReader.enum.mockReturnValue('ech'); // ESS_ONLY = ['@ess'] flagsReader.boolean.mockReturnValue(false); diff --git a/src/platform/packages/shared/kbn-scout/src/cli/config_discovery.ts b/src/platform/packages/shared/kbn-scout/src/cli/config_discovery.ts index 57d59cc2815dd..88eb7366a2808 100644 --- a/src/platform/packages/shared/kbn-scout/src/cli/config_discovery.ts +++ b/src/platform/packages/shared/kbn-scout/src/cli/config_discovery.ts @@ -12,7 +12,10 @@ import { SCOUT_PLAYWRIGHT_CONFIGS_PATH } from '@kbn/scout-info'; import { testableModules } from '@kbn/scout-reporting/src/registry'; import type { ToolingLog } from '@kbn/tooling-log'; import { saveFlattenedConfigGroups, saveModuleDiscoveryInfo } from '../tests_discovery/file_utils'; -import { filterModulesByScoutCiConfig } from '../tests_discovery/search_configs'; +import { + filterModulesByScoutCiConfig, + getScoutCiExcludedConfigs, +} from '../tests_discovery/search_configs'; import { collectUniqueTags, getServerRunFlagsFromTags, @@ -82,6 +85,45 @@ const filterModulesByTargetTags = ( .filter((module) => module.configs.length > 0); }; +const CUSTOM_SERVERS_PATH_PATTERN = /\/test\/scout_[^/]+/; + +const filterModulesByCustomServerPaths = ( + modules: ModuleDiscoveryInfo[], + includeCustomServers: boolean +): ModuleDiscoveryInfo[] => { + if (includeCustomServers) { + return modules; + } + + return modules + .map((module) => ({ + ...module, + configs: module.configs.filter((config) => { + const isCustomServerConfig = CUSTOM_SERVERS_PATH_PATTERN.test(config.path); + return !isCustomServerConfig; + }), + })) + .filter((module) => module.configs.length > 0); +}; + +const filterModulesByExcludedConfigPaths = ( + modules: ModuleDiscoveryInfo[], + excludedConfigPaths: string[] +): ModuleDiscoveryInfo[] => { + if (excludedConfigPaths.length === 0) { + return modules; + } + + const excludedSet = new Set(excludedConfigPaths); + + return modules + .map((module) => ({ + ...module, + configs: module.configs.filter((config) => !excludedSet.has(config.path)), + })) + .filter((module) => module.configs.length > 0); +}; + // Logs discovered modules in non-flattened format const logDiscoveredModules = (modules: ModuleDiscoveryInfo[], log: ToolingLog): void => { const { plugins: pluginCount, packages: packageCount } = countModulesByType(modules); @@ -203,16 +245,24 @@ export const runDiscoverPlaywrightConfigs = (flagsReader: FlagsReader, log: Tool const target = (flagsReader.enum('target', TARGET_TYPES) || 'all') as TargetType; const targetTags = getTestTagsForTarget(target); const flatten = flagsReader.boolean('flatten'); + const includeCustomServers = flagsReader.boolean('include-custom-servers'); // Build initial module discovery info const modulesWithTests = buildModuleDiscoveryInfo(); // Filter modules by target tags and compute server run flags - const filteredModules = filterModulesByTargetTags(modulesWithTests, targetTags); + const filteredModulesByTags = filterModulesByTargetTags(modulesWithTests, targetTags); + const filteredModules = filterModulesByCustomServerPaths( + filteredModulesByTags, + includeCustomServers + ); + const filteredModulesWithExcludedConfigs = process.env.CI + ? filterModulesByExcludedConfigPaths(filteredModules, getScoutCiExcludedConfigs()) + : filteredModules; // Handle output based on flatten flag if (flatten) { - handleFlattenedOutput(filteredModules, flagsReader, log); + handleFlattenedOutput(filteredModulesWithExcludedConfigs, flagsReader, log); } else { - handleNonFlattenedOutput(filteredModules, flagsReader, log); + handleNonFlattenedOutput(filteredModulesWithExcludedConfigs, flagsReader, log); } }; @@ -242,14 +292,15 @@ export const discoverPlaywrightConfigsCmd: Command = { validate against CI configuration, or save filtered results to a file. Options: - --target Filter configs by deployment target: - - 'all': deployment-agnostic tags (default) - - 'mki': serverless-only tags - - 'ech': stateful-only tags - --validate Validate that all discovered modules are registered in Scout CI config - --save Validate and save enabled modules to '${SCOUT_PLAYWRIGHT_CONFIGS_PATH}' - --flatten Output configs in flattened format grouped by mode, group, and scout command - (useful for Cloud test execution) + --target Filter configs by deployment target: + - 'all': deployment-agnostic tags (default) + - 'mki': serverless-only tags + - 'ech': stateful-only tags + --include-custom-servers Include configs under 'test/scout_*' paths for custom server setups + --validate Validate that all discovered modules are registered in Scout CI config + --save Validate and save enabled modules to '${SCOUT_PLAYWRIGHT_CONFIGS_PATH}' + --flatten Output configs in flattened format grouped by mode, group, and scout command + (useful for Cloud test execution) Examples: # Discover all deployment-agnostic configs @@ -258,6 +309,9 @@ export const discoverPlaywrightConfigsCmd: Command = { # Discover serverless-only configs node scripts/scout discover-playwright-configs --target mki + # Discover local custom-server configs only + node scripts/scout discover-playwright-configs --include-custom-servers + # Validate discovered configs against CI configuration node scripts/scout discover-playwright-configs --validate @@ -269,8 +323,14 @@ export const discoverPlaywrightConfigsCmd: Command = { `, flags: { string: ['target'], - boolean: ['save', 'validate', 'flatten'], - default: { target: 'all', save: false, validate: false, flatten: false }, + boolean: ['save', 'validate', 'flatten', 'include-custom-servers'], + default: { + target: 'all', + save: false, + validate: false, + flatten: false, + 'include-custom-servers': false, + }, }, run: ({ flagsReader, log }) => { runDiscoverPlaywrightConfigs(flagsReader, log); diff --git a/src/platform/packages/shared/kbn-scout/src/tests_discovery/search_configs.ts b/src/platform/packages/shared/kbn-scout/src/tests_discovery/search_configs.ts index 36b9d6c0ee5d0..b17c0320d4b83 100644 --- a/src/platform/packages/shared/kbn-scout/src/tests_discovery/search_configs.ts +++ b/src/platform/packages/shared/kbn-scout/src/tests_discovery/search_configs.ts @@ -15,6 +15,29 @@ import yaml from 'js-yaml'; import path from 'path'; import type { ModuleDiscoveryInfo } from './types'; +interface ScoutCiConfig { + plugins: { + enabled?: string[]; + disabled?: string[]; + }; + packages: { + enabled?: string[]; + disabled?: string[]; + }; + excluded_configs?: string[]; +} + +const readScoutCiConfig = (): ScoutCiConfig => { + const scoutCiConfigRelPath = path.join('.buildkite', 'scout_ci_config.yml'); + const scoutCiConfigPath = path.resolve(REPO_ROOT, scoutCiConfigRelPath); + return yaml.load(fs.readFileSync(scoutCiConfigPath, 'utf8')) as ScoutCiConfig; +}; + +export const getScoutCiExcludedConfigs = (): string[] => { + const ciConfig = readScoutCiConfig(); + return ciConfig.excluded_configs ?? []; +}; + /** * Filters modules based on Scout CI configuration. * Validates that all modules are registered in the CI config ('scout_ci_config.yml') and @@ -30,17 +53,7 @@ export const filterModulesByScoutCiConfig = ( modulesWithTests: ModuleDiscoveryInfo[] ): ModuleDiscoveryInfo[] => { const scoutCiConfigRelPath = path.join('.buildkite', 'scout_ci_config.yml'); - const scoutCiConfigPath = path.resolve(REPO_ROOT, scoutCiConfigRelPath); - const ciConfig = yaml.load(fs.readFileSync(scoutCiConfigPath, 'utf8')) as { - plugins: { - enabled?: string[]; - disabled?: string[]; - }; - packages: { - enabled?: string[]; - disabled?: string[]; - }; - }; + const ciConfig = readScoutCiConfig(); const enabledPlugins = new Set(ciConfig.plugins.enabled || []); const disabledPlugins = new Set(ciConfig.plugins.disabled || []); diff --git a/x-pack/platform/plugins/shared/security/test/scout_uiam_local/.meta/api/parallel.json b/x-pack/platform/plugins/shared/security/test/scout_uiam_local/.meta/api/parallel.json new file mode 100644 index 0000000000000..17e5cde7ed25a --- /dev/null +++ b/x-pack/platform/plugins/shared/security/test/scout_uiam_local/.meta/api/parallel.json @@ -0,0 +1,71 @@ +{ + "lastModified": "2026-02-02T17:19:55.576Z", + "sha1": "06e425ce97a8f9970c1acac6bba67f1e3e7bc521", + "tests": [ + { + "id": "a0d24173047b2e4-f5d34cb95fb2e09", + "title": "Create new UIAM session should be able to authenticate as UIAM user", + "expectedStatus": "passed", + "tags": [ + "@svlSecurity" + ], + "location": { + "file": "x-pack/platform/plugins/shared/security/test/scout_uiam_local/api/parallel_tests/uiam_create_session.spec.ts", + "line": 13, + "column": 10 + } + }, + { + "id": "a2e99e58c5b1cc7-0cf9fedf6f86f59", + "title": "[NON-MKI] Invalidate UIAM session UIAM session tokens should not be usable after logging out", + "expectedStatus": "passed", + "tags": [ + "@svlSecurity" + ], + "location": { + "file": "x-pack/platform/plugins/shared/security/test/scout_uiam_local/api/parallel_tests/uiam_invalidate_session.spec.ts", + "line": 65, + "column": 10 + } + }, + { + "id": "1e3fcf6c9db6e26-d57ad83f33154d2", + "title": "[NON-MKI] Refresh UIAM session should be able to authenticate as UIAM user even if the access token has expired", + "expectedStatus": "passed", + "tags": [ + "@svlSecurity" + ], + "location": { + "file": "x-pack/platform/plugins/shared/security/test/scout_uiam_local/api/parallel_tests/uiam_refresh_session.spec.ts", + "line": 46, + "column": 10 + } + }, + { + "id": "1e3fcf6c9db6e26-123fa16328f07b4", + "title": "[NON-MKI] Refresh UIAM session should be able to authenticate as UIAM user when the tokens are refreshed concurrently", + "expectedStatus": "passed", + "tags": [ + "@svlSecurity" + ], + "location": { + "file": "x-pack/platform/plugins/shared/security/test/scout_uiam_local/api/parallel_tests/uiam_refresh_session.spec.ts", + "line": 70, + "column": 10 + } + }, + { + "id": "1e3fcf6c9db6e26-69b150baffe6b8c", + "title": "[NON-MKI] Refresh UIAM session should fail if both access and refresh tokens have expired", + "expectedStatus": "passed", + "tags": [ + "@svlSecurity" + ], + "location": { + "file": "x-pack/platform/plugins/shared/security/test/scout_uiam_local/api/parallel_tests/uiam_refresh_session.spec.ts", + "line": 100, + "column": 10 + } + } + ] +} \ No newline at end of file diff --git a/x-pack/solutions/observability/plugins/apm/test/scout_react_flow_service_map/.meta/ui/parallel.json b/x-pack/solutions/observability/plugins/apm/test/scout_react_flow_service_map/.meta/ui/parallel.json new file mode 100644 index 0000000000000..f8c4d7761f6a6 --- /dev/null +++ b/x-pack/solutions/observability/plugins/apm/test/scout_react_flow_service_map/.meta/ui/parallel.json @@ -0,0 +1,90 @@ +{ + "lastModified": "2026-02-02T17:20:08.659Z", + "sha1": "398f5bea606c0592ce82d46c0f3a6eec762b55e8", + "tests": [ + { + "id": "f1638ceb5181f0e-4166cca575a1e11", + "title": "Ingest data to Elasticsearch for React Flow Service Map tests", + "expectedStatus": "passed", + "tags": [ + "@ess", + "@svlOblt" + ], + "location": { + "file": "x-pack/solutions/observability/plugins/apm/test/scout_react_flow_service_map/ui/parallel_tests/global.setup.ts", + "line": 14, + "column": 16 + } + }, + { + "id": "7143508568be1fb-68a707a25cb8968", + "title": "React Flow Service Map renders service map with controls", + "expectedStatus": "passed", + "tags": [ + "@ess", + "@svlOblt" + ], + "location": { + "file": "x-pack/solutions/observability/plugins/apm/test/scout_react_flow_service_map/ui/parallel_tests/service_map/react_flow_service_map.spec.ts", + "line": 30, + "column": 7 + } + }, + { + "id": "7143508568be1fb-ea6a47168b42ca1", + "title": "React Flow Service Map shows popover when clicking on a service node", + "expectedStatus": "passed", + "tags": [ + "@ess", + "@svlOblt" + ], + "location": { + "file": "x-pack/solutions/observability/plugins/apm/test/scout_react_flow_service_map/ui/parallel_tests/service_map/react_flow_service_map.spec.ts", + "line": 66, + "column": 7 + } + }, + { + "id": "7143508568be1fb-9d2cbecfb46f50c", + "title": "React Flow Service Map dismisses popover when clicking outside", + "expectedStatus": "passed", + "tags": [ + "@ess", + "@svlOblt" + ], + "location": { + "file": "x-pack/solutions/observability/plugins/apm/test/scout_react_flow_service_map/ui/parallel_tests/service_map/react_flow_service_map.spec.ts", + "line": 87, + "column": 7 + } + }, + { + "id": "7143508568be1fb-a0273ef0cf0793c", + "title": "React Flow Service Map shows popover when clicking on an edge", + "expectedStatus": "passed", + "tags": [ + "@ess", + "@svlOblt" + ], + "location": { + "file": "x-pack/solutions/observability/plugins/apm/test/scout_react_flow_service_map/ui/parallel_tests/service_map/react_flow_service_map.spec.ts", + "line": 104, + "column": 7 + } + }, + { + "id": "7143508568be1fb-a76716e7ffd48b5", + "title": "React Flow Service Map shows popover when clicking on a dependency node", + "expectedStatus": "passed", + "tags": [ + "@ess", + "@svlOblt" + ], + "location": { + "file": "x-pack/solutions/observability/plugins/apm/test/scout_react_flow_service_map/ui/parallel_tests/service_map/react_flow_service_map.spec.ts", + "line": 119, + "column": 7 + } + } + ] +} \ No newline at end of file diff --git a/x-pack/solutions/security/plugins/cloud_security_posture/test/scout_cspm_agentless/.meta/ui/parallel.json b/x-pack/solutions/security/plugins/cloud_security_posture/test/scout_cspm_agentless/.meta/ui/parallel.json new file mode 100644 index 0000000000000..f30037d7211f2 --- /dev/null +++ b/x-pack/solutions/security/plugins/cloud_security_posture/test/scout_cspm_agentless/.meta/ui/parallel.json @@ -0,0 +1,129 @@ +{ + "lastModified": "2026-02-02T17:20:21.254Z", + "sha1": "57010dd991222326376b56d731e50da23b96cc36", + "tests": [ + { + "id": "8f4537eda390f03-adcaac7d214a25d", + "title": "Agentless CSPM setup", + "expectedStatus": "passed", + "tags": [], + "location": { + "file": "x-pack/solutions/security/plugins/cloud_security_posture/test/scout_cspm_agentless/ui/parallel_tests/global.setup.ts", + "line": 10, + "column": 16 + } + }, + { + "id": "26d589e9786832f-03d0a81ba02016d", + "title": "Cloud Connectors - Create New AWS CSPM - Create organization account with new cloud connector", + "expectedStatus": "passed", + "tags": [ + "@ess", + "@svlSecurity" + ], + "location": { + "file": "x-pack/solutions/security/plugins/cloud_security_posture/test/scout_cspm_agentless/ui/parallel_tests/cloud_connectors/create_cloud_connector.spec.ts", + "line": 43, + "column": 12 + } + }, + { + "id": "26d589e9786832f-85ed66dd234cfc9", + "title": "Cloud Connectors - Create New Azure CSPM - Create organization account with new cloud connector", + "expectedStatus": "passed", + "tags": [ + "@ess", + "@svlSecurity" + ], + "location": { + "file": "x-pack/solutions/security/plugins/cloud_security_posture/test/scout_cspm_agentless/ui/parallel_tests/cloud_connectors/create_cloud_connector.spec.ts", + "line": 123, + "column": 12 + } + }, + { + "id": "31de5c91ecd6d17-a344a06af83e0b4", + "title": "Cloud Connectors - Reuse Existing Connector AWS CSPM - Request includes cloud_connector_id when reusing existing connector", + "expectedStatus": "passed", + "tags": [ + "@ess", + "@svlSecurity" + ], + "location": { + "file": "x-pack/solutions/security/plugins/cloud_security_posture/test/scout_cspm_agentless/ui/parallel_tests/cloud_connectors/reuse_cloud_connector.spec.ts", + "line": 102, + "column": 14 + } + }, + { + "id": "31de5c91ecd6d17-d879b0d55485d71", + "title": "Cloud Connectors - Reuse Existing Connector Azure CSPM - Request includes cloud_connector_id when reusing existing connector", + "expectedStatus": "passed", + "tags": [ + "@ess", + "@svlSecurity" + ], + "location": { + "file": "x-pack/solutions/security/plugins/cloud_security_posture/test/scout_cspm_agentless/ui/parallel_tests/cloud_connectors/reuse_cloud_connector.spec.ts", + "line": 203, + "column": 14 + } + }, + { + "id": "c7b3a308493a884-cab5e835bd674d0", + "title": "Cloud Connectors - Switch Setup Technology AWS CSPM - Switch FROM cloud connectors to direct access keys", + "expectedStatus": "passed", + "tags": [ + "@ess", + "@svlSecurity" + ], + "location": { + "file": "x-pack/solutions/security/plugins/cloud_security_posture/test/scout_cspm_agentless/ui/parallel_tests/cloud_connectors/switch_setup_technology.spec.ts", + "line": 40, + "column": 14 + } + }, + { + "id": "c7b3a308493a884-cb5b751f0cc9de9", + "title": "Cloud Connectors - Switch Setup Technology Azure CSPM - Switch FROM cloud connectors to service principal with client secret", + "expectedStatus": "passed", + "tags": [ + "@ess", + "@svlSecurity" + ], + "location": { + "file": "x-pack/solutions/security/plugins/cloud_security_posture/test/scout_cspm_agentless/ui/parallel_tests/cloud_connectors/switch_setup_technology.spec.ts", + "line": 115, + "column": 14 + } + }, + { + "id": "c7b3a308493a884-b729d903f170e0e", + "title": "Cloud Connectors - Switch Setup Technology AWS CSPM - Switch FROM cloud connectors to agent-based", + "expectedStatus": "passed", + "tags": [ + "@ess", + "@svlSecurity" + ], + "location": { + "file": "x-pack/solutions/security/plugins/cloud_security_posture/test/scout_cspm_agentless/ui/parallel_tests/cloud_connectors/switch_setup_technology.spec.ts", + "line": 183, + "column": 14 + } + }, + { + "id": "c7b3a308493a884-ef101053fab7327", + "title": "Cloud Connectors - Switch Setup Technology Azure CSPM - Switch FROM cloud connectors to agent-based", + "expectedStatus": "passed", + "tags": [ + "@ess", + "@svlSecurity" + ], + "location": { + "file": "x-pack/solutions/security/plugins/cloud_security_posture/test/scout_cspm_agentless/ui/parallel_tests/cloud_connectors/switch_setup_technology.spec.ts", + "line": 261, + "column": 14 + } + } + ] +} \ No newline at end of file