diff --git a/x-pack/plugins/security_solution/common/endpoint/data_loaders/index_endpoint_fleet_actions.ts b/x-pack/plugins/security_solution/common/endpoint/data_loaders/index_endpoint_fleet_actions.ts index 3d4783f924bfd8..48587055a8988f 100644 --- a/x-pack/plugins/security_solution/common/endpoint/data_loaders/index_endpoint_fleet_actions.ts +++ b/x-pack/plugins/security_solution/common/endpoint/data_loaders/index_endpoint_fleet_actions.ts @@ -32,6 +32,9 @@ export interface IndexedEndpointAndFleetActionsForHostResponse { endpointActionResponsesIndex: string; } +export interface IndexEndpointAndFleetActionsForHostOptions { + numResponseActions?: number; +} /** * Indexes a random number of Endpoint (via Fleet) Actions for a given host * (NOTE: ensure that fleet is setup first before calling this loading function) @@ -43,11 +46,13 @@ export interface IndexedEndpointAndFleetActionsForHostResponse { export const indexEndpointAndFleetActionsForHost = async ( esClient: Client, endpointHost: HostMetadata, - fleetActionGenerator: FleetActionGenerator = defaultFleetActionGenerator + fleetActionGenerator: FleetActionGenerator = defaultFleetActionGenerator, + options: IndexEndpointAndFleetActionsForHostOptions = {} ): Promise => { const ES_INDEX_OPTIONS = { headers: { 'X-elastic-product-origin': 'fleet' } }; const agentId = endpointHost.elastic.agent.id; - const total = fleetActionGenerator.randomN(5) + 11; // generate at least 11 actions + const actionsCount = options.numResponseActions ?? 1; + const total = fleetActionGenerator.randomN(5) + actionsCount; const response: IndexedEndpointAndFleetActionsForHostResponse = { actions: [], actionResponses: [], diff --git a/x-pack/plugins/security_solution/common/endpoint/data_loaders/index_endpoint_hosts.ts b/x-pack/plugins/security_solution/common/endpoint/data_loaders/index_endpoint_hosts.ts index 684694bdb5c9ab..c467735fdb3273 100644 --- a/x-pack/plugins/security_solution/common/endpoint/data_loaders/index_endpoint_hosts.ts +++ b/x-pack/plugins/security_solution/common/endpoint/data_loaders/index_endpoint_hosts.ts @@ -26,6 +26,7 @@ import type { import { deleteIndexedEndpointAndFleetActions, indexEndpointAndFleetActionsForHost, + type IndexEndpointAndFleetActionsForHostOptions, } from './index_endpoint_fleet_actions'; import type { @@ -88,6 +89,7 @@ export async function indexEndpointHostDocs({ enrollFleet, generator, withResponseActions = true, + numResponseActions, }: { numDocs: number; client: Client; @@ -99,6 +101,7 @@ export async function indexEndpointHostDocs({ enrollFleet: boolean; generator: EndpointDocGenerator; withResponseActions?: boolean; + numResponseActions?: IndexEndpointAndFleetActionsForHostOptions['numResponseActions']; }): Promise { const timeBetweenDocs = 6 * 3600 * 1000; // 6 hours between metadata documents const timestamp = new Date().getTime(); @@ -198,7 +201,10 @@ export async function indexEndpointHostDocs({ const actionsResponse = await indexEndpointAndFleetActionsForHost( client, hostMetadata, - undefined + undefined, + { + numResponseActions, + } ); mergeAndAppendArrays(response, actionsResponse); } diff --git a/x-pack/plugins/security_solution/common/endpoint/index_data.ts b/x-pack/plugins/security_solution/common/endpoint/index_data.ts index db5039e5a72f03..2ad264ab14b914 100644 --- a/x-pack/plugins/security_solution/common/endpoint/index_data.ts +++ b/x-pack/plugins/security_solution/common/endpoint/index_data.ts @@ -64,7 +64,8 @@ export async function indexHostsAndAlerts( fleet: boolean, options: TreeOptions = {}, DocGenerator: typeof EndpointDocGenerator = EndpointDocGenerator, - withResponseActions = true + withResponseActions = true, + numResponseActions?: number ): Promise { const random = seedrandom(seed); const epmEndpointPackage = await getEndpointPackageInfo(kbnClient); @@ -117,6 +118,7 @@ export async function indexHostsAndAlerts( enrollFleet: fleet, generator, withResponseActions, + numResponseActions, }); mergeAndAppendArrays(response, indexedHosts); diff --git a/x-pack/plugins/security_solution/public/management/cypress/e2e/mocked_data/reponse_actions_history.cy.ts b/x-pack/plugins/security_solution/public/management/cypress/e2e/mocked_data/reponse_actions_history.cy.ts index adc0478a3b333b..a93562cd57785e 100644 --- a/x-pack/plugins/security_solution/public/management/cypress/e2e/mocked_data/reponse_actions_history.cy.ts +++ b/x-pack/plugins/security_solution/public/management/cypress/e2e/mocked_data/reponse_actions_history.cy.ts @@ -14,7 +14,7 @@ describe('Response actions history page', () => { // let actionData: ReturnTypeFromChainable; before(() => { - indexEndpointHosts().then((indexEndpoints) => { + indexEndpointHosts({ numResponseActions: 11 }).then((indexEndpoints) => { endpointData = indexEndpoints; }); }); diff --git a/x-pack/plugins/security_solution/public/management/cypress/support/data_loaders.ts b/x-pack/plugins/security_solution/public/management/cypress/support/data_loaders.ts index a219bbf37d274d..7f678c29f3888e 100644 --- a/x-pack/plugins/security_solution/public/management/cypress/support/data_loaders.ts +++ b/x-pack/plugins/security_solution/public/management/cypress/support/data_loaders.ts @@ -114,7 +114,14 @@ export const dataLoaders = ( indexEndpointHosts: async (options: IndexEndpointHostsCyTaskOptions = {}) => { const { kbnClient, esClient } = await stackServicesPromise; - const { count: numHosts, version, os, isolation, withResponseActions } = options; + const { + count: numHosts, + version, + os, + isolation, + withResponseActions, + numResponseActions, + } = options; return cyLoadEndpointDataHandler(esClient, kbnClient, { numHosts, @@ -122,6 +129,7 @@ export const dataLoaders = ( os, isolation, withResponseActions, + numResponseActions, }); }, diff --git a/x-pack/plugins/security_solution/public/management/cypress/support/plugin_handlers/endpoint_data_loader.ts b/x-pack/plugins/security_solution/public/management/cypress/support/plugin_handlers/endpoint_data_loader.ts index 9d0f5ac135d5d1..5f50eacff76c6a 100644 --- a/x-pack/plugins/security_solution/public/management/cypress/support/plugin_handlers/endpoint_data_loader.ts +++ b/x-pack/plugins/security_solution/public/management/cypress/support/plugin_handlers/endpoint_data_loader.ts @@ -37,6 +37,7 @@ export interface CyLoadEndpointDataOptions generatorSeed: string; waitUntilTransformed: boolean; withResponseActions: boolean; + numResponseActions?: number; isolation: boolean; bothIsolatedAndNormalEndpoints?: boolean; } @@ -63,6 +64,7 @@ export const cyLoadEndpointDataHandler = async ( os, withResponseActions, isolation, + numResponseActions, } = options; const DocGenerator = EndpointDocGenerator.custom({ @@ -91,7 +93,8 @@ export const cyLoadEndpointDataHandler = async ( enableFleetIntegration, undefined, DocGenerator, - withResponseActions + withResponseActions, + numResponseActions ); if (waitUntilTransformed) { diff --git a/x-pack/plugins/security_solution/public/management/cypress/types.ts b/x-pack/plugins/security_solution/public/management/cypress/types.ts index 97d635a3b68408..6c8bc8a04bed34 100644 --- a/x-pack/plugins/security_solution/public/management/cypress/types.ts +++ b/x-pack/plugins/security_solution/public/management/cypress/types.ts @@ -42,7 +42,7 @@ export type ReturnTypeFromChainable = C extends Cyp : never; export type IndexEndpointHostsCyTaskOptions = Partial< - { count: number; withResponseActions: boolean } & Pick< + { count: number; withResponseActions: boolean; numResponseActions?: number } & Pick< CyLoadEndpointDataOptions, 'version' | 'os' | 'isolation' >