diff --git a/x-pack/solutions/security/plugins/security_solution/public/app/components/top_values_popover/top_values_popover.tsx b/x-pack/solutions/security/plugins/security_solution/public/app/components/top_values_popover/top_values_popover.tsx index 43e73f5c3d3a5..c0efa559f6666 100644 --- a/x-pack/solutions/security/plugins/security_solution/public/app/components/top_values_popover/top_values_popover.tsx +++ b/x-pack/solutions/security/plugins/security_solution/public/app/components/top_values_popover/top_values_popover.tsx @@ -16,7 +16,7 @@ import { useKibana } from '../../../common/lib/kibana'; export const TopValuesPopover = React.memo(() => { const { pathname } = useLocation(); - const { browserFields, indexPattern } = useSourcererDataView(getScopeFromPath(pathname)); + const { browserFields, sourcererDataView } = useSourcererDataView(getScopeFromPath(pathname)); const { services: { topValuesPopover }, } = useKibana(); @@ -43,7 +43,7 @@ export const TopValuesPopover = React.memo(() => { field={data.fieldName} scopeId={data.scopeId} toggleTopN={onClose} - indexPattern={indexPattern} + dataViewSpec={sourcererDataView} browserFields={browserFields} /> diff --git a/x-pack/solutions/security/plugins/security_solution/public/attack_discovery/pages/index.tsx b/x-pack/solutions/security/plugins/security_solution/public/attack_discovery/pages/index.tsx index 1b107bd63d2ff..4b4d63342a1ad 100644 --- a/x-pack/solutions/security/plugins/security_solution/public/attack_discovery/pages/index.tsx +++ b/x-pack/solutions/security/plugins/security_solution/public/attack_discovery/pages/index.tsx @@ -189,18 +189,18 @@ const AttackDiscoveryPageComponent: React.FC = () => { const pageTitle = useMemo(() => , []); - const { indexPattern } = useSourcererDataView(); + const { sourcererDataView } = useSourcererDataView(); // filterQuery is the combined search bar query and filters in ES format: const [filterQuery, kqlError] = useMemo( () => convertToBuildEsQuery({ config: getEsQueryConfig(uiSettings), - indexPattern, + dataViewSpec: sourcererDataView, queries: [query ?? getDefaultQuery()], // <-- search bar query filters: filters ?? [], // <-- search bar filters }), - [filters, indexPattern, query, uiSettings] + [filters, sourcererDataView, query, uiSettings] ); // renders a toast if the filter query is invalid: diff --git a/x-pack/solutions/security/plugins/security_solution/public/attack_discovery/pages/settings_flyout/schedule/create_flyout/index.tsx b/x-pack/solutions/security/plugins/security_solution/public/attack_discovery/pages/settings_flyout/schedule/create_flyout/index.tsx index 138b3a5bcc3d6..1fe95ff8f04dc 100644 --- a/x-pack/solutions/security/plugins/security_solution/public/attack_discovery/pages/settings_flyout/schedule/create_flyout/index.tsx +++ b/x-pack/solutions/security/plugins/security_solution/public/attack_discovery/pages/settings_flyout/schedule/create_flyout/index.tsx @@ -45,7 +45,7 @@ export const CreateFlyout: React.FC = React.memo(({ onClose }) => { http, }); - const { indexPattern } = useSourcererDataView(); + const { sourcererDataView } = useSourcererDataView(); const { mutateAsync: createAttackDiscoverySchedule, isLoading: isLoadingQuery } = useCreateAttackDiscoverySchedule(); @@ -62,7 +62,7 @@ export const CreateFlyout: React.FC = React.memo(({ onClose }) => { scheduleData, alertsIndexPattern ?? '', connector, - indexPattern, + sourcererDataView, uiSettings ); await createAttackDiscoverySchedule({ scheduleToCreate }); @@ -76,7 +76,7 @@ export const CreateFlyout: React.FC = React.memo(({ onClose }) => { alertsIndexPattern, createAttackDiscoverySchedule, onClose, - indexPattern, + sourcererDataView, uiSettings, ] ); diff --git a/x-pack/solutions/security/plugins/security_solution/public/attack_discovery/pages/settings_flyout/schedule/details_flyout/index.tsx b/x-pack/solutions/security/plugins/security_solution/public/attack_discovery/pages/settings_flyout/schedule/details_flyout/index.tsx index 523eceb1ab957..f97d5df36f1c3 100644 --- a/x-pack/solutions/security/plugins/security_solution/public/attack_discovery/pages/settings_flyout/schedule/details_flyout/index.tsx +++ b/x-pack/solutions/security/plugins/security_solution/public/attack_discovery/pages/settings_flyout/schedule/details_flyout/index.tsx @@ -64,7 +64,7 @@ export const DetailsFlyout: React.FC = React.memo(({ scheduleId, onClose id: scheduleId, }); - const { indexPattern } = useSourcererDataView(); + const { sourcererDataView } = useSourcererDataView(); const [isEditing, setIsEditing] = useState(false); @@ -83,7 +83,7 @@ export const DetailsFlyout: React.FC = React.memo(({ scheduleId, onClose scheduleData, alertsIndexPattern ?? '', connector, - indexPattern, + sourcererDataView, uiSettings ); await updateAttackDiscoverySchedule({ id: scheduleId, scheduleToUpdate }); @@ -95,7 +95,7 @@ export const DetailsFlyout: React.FC = React.memo(({ scheduleId, onClose [ aiConnectors, uiSettings, - indexPattern, + sourcererDataView, scheduleId, alertsIndexPattern, updateAttackDiscoverySchedule, diff --git a/x-pack/solutions/security/plugins/security_solution/public/attack_discovery/pages/settings_flyout/schedule/utils/convert_form_data.test.ts b/x-pack/solutions/security/plugins/security_solution/public/attack_discovery/pages/settings_flyout/schedule/utils/convert_form_data.test.ts index 9bea1b8c1edfa..7b3e62fca8fc4 100644 --- a/x-pack/solutions/security/plugins/security_solution/public/attack_discovery/pages/settings_flyout/schedule/utils/convert_form_data.test.ts +++ b/x-pack/solutions/security/plugins/security_solution/public/attack_discovery/pages/settings_flyout/schedule/utils/convert_form_data.test.ts @@ -6,8 +6,8 @@ */ import type { IUiSettingsClient } from '@kbn/core/public'; +import type { DataViewSpec } from '@kbn/data-plugin/common'; import type { AIConnector } from '@kbn/elastic-assistant'; -import type { DataViewBase } from '@kbn/es-query'; import { convertFormDataInBaseSchedule } from './convert_form_data'; import { convertToBuildEsQuery } from '../../../../../common/lib/kuery'; @@ -47,7 +47,7 @@ describe('convertFormDataInBaseSchedule', () => { }, '.alert-*', {} as AIConnector, - {} as DataViewBase, + {} as DataViewSpec, { get: jest.fn(), } as unknown as IUiSettingsClient diff --git a/x-pack/solutions/security/plugins/security_solution/public/attack_discovery/pages/settings_flyout/schedule/utils/convert_form_data.ts b/x-pack/solutions/security/plugins/security_solution/public/attack_discovery/pages/settings_flyout/schedule/utils/convert_form_data.ts index 8879c0f35b443..7d54801b6478b 100644 --- a/x-pack/solutions/security/plugins/security_solution/public/attack_discovery/pages/settings_flyout/schedule/utils/convert_form_data.ts +++ b/x-pack/solutions/security/plugins/security_solution/public/attack_discovery/pages/settings_flyout/schedule/utils/convert_form_data.ts @@ -6,9 +6,9 @@ */ import type { IUiSettingsClient } from '@kbn/core/public'; +import type { DataViewSpec } from '@kbn/data-plugin/common'; import { getEsQueryConfig } from '@kbn/data-plugin/common'; import type { AIConnector } from '@kbn/elastic-assistant'; -import type { DataViewBase } from '@kbn/es-query'; import { convertToBuildEsQuery } from '../../../../../common/lib/kuery'; import type { AttackDiscoveryScheduleSchema } from '../edit_form/types'; @@ -19,14 +19,14 @@ export const convertFormDataInBaseSchedule = ( scheduleData: AttackDiscoveryScheduleSchema, alertsIndexPattern: string, connector: AIConnector, - indexPattern: DataViewBase, + dataViewSpec: DataViewSpec, uiSettings: IUiSettingsClient ) => { const alertsSelectionSettings = scheduleData.alertsSelectionSettings; const [filterQuery, kqlError] = convertToBuildEsQuery({ config: getEsQueryConfig(uiSettings), - indexPattern, + dataViewSpec, queries: [alertsSelectionSettings.query], filters: alertsSelectionSettings.filters, }); diff --git a/x-pack/solutions/security/plugins/security_solution/public/common/components/events_viewer/index.tsx b/x-pack/solutions/security/plugins/security_solution/public/common/components/events_viewer/index.tsx index 21b7f7b6fec24..e97aa6aca1bf2 100644 --- a/x-pack/solutions/security/plugins/security_solution/public/common/components/events_viewer/index.tsx +++ b/x-pack/solutions/security/plugins/security_solution/public/common/components/events_viewer/index.tsx @@ -145,9 +145,8 @@ const StatefulEventsViewerComponent: React.FC) => { const isEditMode = node != null; - const { indexPattern } = useSourcererDataView(SourcererScopeName.default); + const { sourcererDataView } = useSourcererDataView(SourcererScopeName.default); const { unifiedSearch: { ui: { FiltersBuilderLazy }, @@ -400,7 +400,7 @@ const InsightEditorComponent = ({ ); }, [labelController.field.value, providers, dataView]); const filtersStub = useMemo(() => { - const index = indexPattern && indexPattern.getName ? indexPattern.getName() : '*'; + const index = sourcererDataView.name ?? '*'; return [ { $state: { @@ -414,7 +414,7 @@ const InsightEditorComponent = ({ }, }, ]; - }, [indexPattern]); + }, [sourcererDataView]); const isPlatinum = useLicense().isAtLeast('platinum'); return ( diff --git a/x-pack/solutions/security/plugins/security_solution/public/common/components/markdown_editor/plugins/insight/use_insight_query.ts b/x-pack/solutions/security/plugins/security_solution/public/common/components/markdown_editor/plugins/insight/use_insight_query.ts index 43323a6b62f7a..a0c36f072566b 100644 --- a/x-pack/solutions/security/plugins/security_solution/public/common/components/markdown_editor/plugins/insight/use_insight_query.ts +++ b/x-pack/solutions/security/plugins/security_solution/public/common/components/markdown_editor/plugins/insight/use_insight_query.ts @@ -41,7 +41,7 @@ export const useInsightQuery = ({ }: UseInsightQuery): UseInsightQueryResult => { const { uiSettings } = useKibana().services; const esQueryConfig = useMemo(() => getEsQueryConfig(uiSettings), [uiSettings]); - const { browserFields, selectedPatterns, indexPattern, dataViewId } = useSourcererDataView( + const { browserFields, selectedPatterns, sourcererDataView, dataViewId } = useSourcererDataView( SourcererScopeName.timeline ); const [hasError, setHasError] = useState(false); @@ -51,7 +51,7 @@ export const useInsightQuery = ({ const parsedCombinedQueries = combineQueries({ config: esQueryConfig, dataProviders, - indexPattern, + dataViewSpec: sourcererDataView, browserFields, filters, kqlQuery: { @@ -66,7 +66,7 @@ export const useInsightQuery = ({ setHasError(true); return null; } - }, [browserFields, dataProviders, esQueryConfig, hasError, indexPattern, filters]); + }, [browserFields, dataProviders, esQueryConfig, hasError, sourcererDataView, filters]); const [dataLoadingState, { events, totalCount }] = useTimelineEvents({ dataViewId, diff --git a/x-pack/solutions/security/plugins/security_solution/public/common/components/top_n/index.test.tsx b/x-pack/solutions/security/plugins/security_solution/public/common/components/top_n/index.test.tsx index 996bd61116cbd..c680ae5a87dfe 100644 --- a/x-pack/solutions/security/plugins/security_solution/public/common/components/top_n/index.test.tsx +++ b/x-pack/solutions/security/plugins/security_solution/public/common/components/top_n/index.test.tsx @@ -11,7 +11,7 @@ import { TableId } from '@kbn/securitysolution-data-table'; import { TimelineId } from '../../../../common/types/timeline'; import { mockBrowserFields } from '../../containers/source/mock'; -import { mockGlobalState, TestProviders, mockIndexPattern, createMockStore } from '../../mock'; +import { mockGlobalState, TestProviders, createMockStore, mockDataViewSpec } from '../../mock'; import type { State } from '../../store'; import { TopN } from './top_n'; import { detectionAlertsTables } from './helpers'; @@ -153,7 +153,7 @@ const store = createMockStore(state); const testProps = { browserFields: mockBrowserFields, field, - indexPattern: mockIndexPattern, + indexPattern: mockDataViewSpec, scopeId: TableId.hostsPageEvents, toggleTopN: jest.fn(), onFilterAdded: jest.fn(), diff --git a/x-pack/solutions/security/plugins/security_solution/public/common/components/top_n/index.tsx b/x-pack/solutions/security/plugins/security_solution/public/common/components/top_n/index.tsx index ace1210eb5b5a..7cf729e3bc457 100644 --- a/x-pack/solutions/security/plugins/security_solution/public/common/components/top_n/index.tsx +++ b/x-pack/solutions/security/plugins/security_solution/public/common/components/top_n/index.tsx @@ -9,8 +9,8 @@ import React, { useMemo } from 'react'; import type { ConnectedProps } from 'react-redux'; import { connect } from 'react-redux'; -import type { DataViewBase, Filter, Query } from '@kbn/es-query'; -import { getEsQueryConfig } from '@kbn/data-plugin/common'; +import type { Filter, Query } from '@kbn/es-query'; +import { type DataViewSpec, getEsQueryConfig } from '@kbn/data-plugin/common'; import { isActiveTimeline } from '../../../helpers'; import { InputsModelId } from '../../store/inputs/constants'; import { useGlobalTime } from '../../containers/use_global_time'; @@ -77,7 +77,7 @@ const connector = connect(makeMapStateToProps); export interface OwnProps { browserFields: BrowserFields; field: string; - indexPattern: DataViewBase; + dataViewSpec?: DataViewSpec; scopeId?: string; toggleTopN: () => void; onFilterAdded?: () => void; @@ -96,7 +96,7 @@ const StatefulTopNComponent: React.FC = ({ browserFields, dataProviders, field, - indexPattern, + dataViewSpec, globalFilters = EMPTY_FILTERS, globalQuery = EMPTY_QUERY, kqlMode, @@ -119,7 +119,7 @@ const StatefulTopNComponent: React.FC = ({ config: getEsQueryConfig(uiSettings), dataProviders, filters: activeTimelineFilters, - indexPattern, + dataViewSpec, kqlMode, kqlQuery: { language: 'kuery', @@ -133,7 +133,7 @@ const StatefulTopNComponent: React.FC = ({ uiSettings, dataProviders, activeTimelineFilters, - indexPattern, + dataViewSpec, kqlMode, activeTimelineKqlQueryExpression, ] @@ -152,7 +152,7 @@ const StatefulTopNComponent: React.FC = ({ field={field as AlertsStackByField} filters={isActiveTimeline(scopeId ?? '') ? EMPTY_FILTERS : globalFilters} from={isActiveTimeline(scopeId ?? '') ? activeTimelineFrom : from} - indexPattern={indexPattern} + dataViewSpec={dataViewSpec} options={options} paddingSize={paddingSize} query={isActiveTimeline(scopeId ?? '') ? EMPTY_QUERY : globalQuery} diff --git a/x-pack/solutions/security/plugins/security_solution/public/common/components/top_n/top_n.test.tsx b/x-pack/solutions/security/plugins/security_solution/public/common/components/top_n/top_n.test.tsx index e30566432005a..949786a08da0a 100644 --- a/x-pack/solutions/security/plugins/security_solution/public/common/components/top_n/top_n.test.tsx +++ b/x-pack/solutions/security/plugins/security_solution/public/common/components/top_n/top_n.test.tsx @@ -8,7 +8,7 @@ import React from 'react'; import { screen, render, waitFor, fireEvent } from '@testing-library/react'; -import { TestProviders, mockIndexPattern } from '../../mock'; +import { TestProviders, mockDataViewSpec } from '../../mock'; import { allEvents, defaultOptions } from './helpers'; import type { Props as TopNProps } from './top_n'; @@ -105,7 +105,7 @@ describe('TopN', () => { field, filters: [], from: '2020-04-14T00:31:47.695Z', - indexPattern: mockIndexPattern, + dataViewSpec: mockDataViewSpec, options: defaultOptions, query, setAbsoluteRangeDatePickerTarget: InputsModelId.global, diff --git a/x-pack/solutions/security/plugins/security_solution/public/common/components/top_n/top_n.tsx b/x-pack/solutions/security/plugins/security_solution/public/common/components/top_n/top_n.tsx index b2cd50ef5bc85..861d1f4a408b3 100644 --- a/x-pack/solutions/security/plugins/security_solution/public/common/components/top_n/top_n.tsx +++ b/x-pack/solutions/security/plugins/security_solution/public/common/components/top_n/top_n.tsx @@ -9,7 +9,8 @@ import { EuiButtonIcon, EuiSuperSelect, useEuiTheme } from '@elastic/eui'; import React, { useCallback, useEffect, useMemo, useState } from 'react'; import { css } from '@emotion/react'; -import type { DataViewBase, Filter, Query } from '@kbn/es-query'; +import type { Filter, Query } from '@kbn/es-query'; +import type { DataViewSpec } from '@kbn/data-plugin/common'; import type { GlobalTimeArgs } from '../../containers/use_global_time'; import { EventsByDataset } from '../../../overview/components/events_by_dataset'; import { SignalsByCategory } from '../../../overview/components/signals_by_category'; @@ -51,7 +52,7 @@ export interface Props extends Pick = ({ filters, field, from, - indexPattern, + dataViewSpec, options, paddingSize, query, @@ -122,7 +123,7 @@ const TopNComponent: React.FC = ({ filters={applicableFilters} from={from} headerChildren={headerChildren} - indexPattern={indexPattern} + dataViewSpec={dataViewSpec} onlyField={field} paddingSize={paddingSize} query={query} diff --git a/x-pack/solutions/security/plugins/security_solution/public/common/components/visualization_actions/lens_attributes/common/alerts/alerts_by_status_donut.test.ts b/x-pack/solutions/security/plugins/security_solution/public/common/components/visualization_actions/lens_attributes/common/alerts/alerts_by_status_donut.test.ts index 30054587a8ed1..f1d52d290fb74 100644 --- a/x-pack/solutions/security/plugins/security_solution/public/common/components/visualization_actions/lens_attributes/common/alerts/alerts_by_status_donut.test.ts +++ b/x-pack/solutions/security/plugins/security_solution/public/common/components/visualization_actions/lens_attributes/common/alerts/alerts_by_status_donut.test.ts @@ -21,6 +21,7 @@ jest.mock('../../../../../../sourcerer/containers', () => ({ dataViewId: 'security-solution-my-test', indicesExist: true, selectedPatterns: ['signal-index'], + sourcererDataView: {}, }), })); diff --git a/x-pack/solutions/security/plugins/security_solution/public/common/components/visualization_actions/lens_attributes/common/alerts/alerts_histogram.test.ts b/x-pack/solutions/security/plugins/security_solution/public/common/components/visualization_actions/lens_attributes/common/alerts/alerts_histogram.test.ts index f68717092b72b..a05fddd839d85 100644 --- a/x-pack/solutions/security/plugins/security_solution/public/common/components/visualization_actions/lens_attributes/common/alerts/alerts_histogram.test.ts +++ b/x-pack/solutions/security/plugins/security_solution/public/common/components/visualization_actions/lens_attributes/common/alerts/alerts_histogram.test.ts @@ -21,6 +21,7 @@ jest.mock('../../../../../../sourcerer/containers', () => ({ dataViewId: 'security-solution-my-test', indicesExist: true, selectedPatterns: ['signal-index'], + sourcererDataView: {}, }), })); diff --git a/x-pack/solutions/security/plugins/security_solution/public/common/components/visualization_actions/lens_attributes/common/alerts/alerts_table.test.ts b/x-pack/solutions/security/plugins/security_solution/public/common/components/visualization_actions/lens_attributes/common/alerts/alerts_table.test.ts index a82cb1a1bb49a..b223656afbdf2 100644 --- a/x-pack/solutions/security/plugins/security_solution/public/common/components/visualization_actions/lens_attributes/common/alerts/alerts_table.test.ts +++ b/x-pack/solutions/security/plugins/security_solution/public/common/components/visualization_actions/lens_attributes/common/alerts/alerts_table.test.ts @@ -29,6 +29,7 @@ jest.mock('../../../../../../sourcerer/containers', () => ({ dataViewId: 'security-solution-my-test', indicesExist: true, selectedPatterns: ['signal-index'], + sourcererDataView: {}, }), })); diff --git a/x-pack/solutions/security/plugins/security_solution/public/common/components/visualization_actions/lens_attributes/common/alerts/rule_preview.test.ts b/x-pack/solutions/security/plugins/security_solution/public/common/components/visualization_actions/lens_attributes/common/alerts/rule_preview.test.ts index 5362805422c61..6126439e6a7bc 100644 --- a/x-pack/solutions/security/plugins/security_solution/public/common/components/visualization_actions/lens_attributes/common/alerts/rule_preview.test.ts +++ b/x-pack/solutions/security/plugins/security_solution/public/common/components/visualization_actions/lens_attributes/common/alerts/rule_preview.test.ts @@ -24,6 +24,7 @@ jest.mock('../../../../../../sourcerer/containers', () => ({ dataViewId: 'security-solution-my-test', indicesExist: true, selectedPatterns: ['signal-index'], + sourcererDataView: {}, }), })); diff --git a/x-pack/solutions/security/plugins/security_solution/public/common/components/visualization_actions/lens_attributes/common/authentication.test.ts b/x-pack/solutions/security/plugins/security_solution/public/common/components/visualization_actions/lens_attributes/common/authentication.test.ts index f69138a99c330..5776dba728ea7 100644 --- a/x-pack/solutions/security/plugins/security_solution/public/common/components/visualization_actions/lens_attributes/common/authentication.test.ts +++ b/x-pack/solutions/security/plugins/security_solution/public/common/components/visualization_actions/lens_attributes/common/authentication.test.ts @@ -21,6 +21,7 @@ jest.mock('../../../../../sourcerer/containers', () => ({ selectedPatterns: ['auditbeat-mytest-*'], dataViewId: 'security-solution-my-test', indicesExist: true, + sourcererDataView: {}, }), })); diff --git a/x-pack/solutions/security/plugins/security_solution/public/common/components/visualization_actions/lens_attributes/common/event.test.ts b/x-pack/solutions/security/plugins/security_solution/public/common/components/visualization_actions/lens_attributes/common/event.test.ts index e045c5893888c..1f2d248697405 100644 --- a/x-pack/solutions/security/plugins/security_solution/public/common/components/visualization_actions/lens_attributes/common/event.test.ts +++ b/x-pack/solutions/security/plugins/security_solution/public/common/components/visualization_actions/lens_attributes/common/event.test.ts @@ -27,6 +27,7 @@ jest.mock('../../../../../sourcerer/containers', () => ({ selectedPatterns: ['auditbeat-mytest-*'], dataViewId: 'security-solution-my-test', indicesExist: true, + sourcererDataView: {}, }), })); diff --git a/x-pack/solutions/security/plugins/security_solution/public/common/components/visualization_actions/lens_attributes/common/external_alert.test.ts b/x-pack/solutions/security/plugins/security_solution/public/common/components/visualization_actions/lens_attributes/common/external_alert.test.ts index b3504eb3d9c87..af1f84911a675 100644 --- a/x-pack/solutions/security/plugins/security_solution/public/common/components/visualization_actions/lens_attributes/common/external_alert.test.ts +++ b/x-pack/solutions/security/plugins/security_solution/public/common/components/visualization_actions/lens_attributes/common/external_alert.test.ts @@ -21,6 +21,7 @@ jest.mock('../../../../../sourcerer/containers', () => ({ selectedPatterns: ['auditbeat-mytest-*'], dataViewId: 'security-solution-my-test', indicesExist: true, + sourcererDataView: {}, }), })); diff --git a/x-pack/solutions/security/plugins/security_solution/public/common/components/visualization_actions/lens_attributes/hosts/kpi_host_area.test.ts b/x-pack/solutions/security/plugins/security_solution/public/common/components/visualization_actions/lens_attributes/hosts/kpi_host_area.test.ts index 13b48c40cf9f9..d0732ce14129a 100644 --- a/x-pack/solutions/security/plugins/security_solution/public/common/components/visualization_actions/lens_attributes/hosts/kpi_host_area.test.ts +++ b/x-pack/solutions/security/plugins/security_solution/public/common/components/visualization_actions/lens_attributes/hosts/kpi_host_area.test.ts @@ -17,6 +17,7 @@ jest.mock('../../../../../sourcerer/containers', () => ({ selectedPatterns: ['auditbeat-mytest-*'], dataViewId: 'security-solution-my-test', indicesExist: true, + sourcererDataView: {}, }), })); diff --git a/x-pack/solutions/security/plugins/security_solution/public/common/components/visualization_actions/lens_attributes/hosts/kpi_host_metric.test.ts b/x-pack/solutions/security/plugins/security_solution/public/common/components/visualization_actions/lens_attributes/hosts/kpi_host_metric.test.ts index 13409c5392f88..fc8742494a54e 100644 --- a/x-pack/solutions/security/plugins/security_solution/public/common/components/visualization_actions/lens_attributes/hosts/kpi_host_metric.test.ts +++ b/x-pack/solutions/security/plugins/security_solution/public/common/components/visualization_actions/lens_attributes/hosts/kpi_host_metric.test.ts @@ -17,6 +17,7 @@ jest.mock('../../../../../sourcerer/containers', () => ({ selectedPatterns: ['auditbeat-mytest-*'], dataViewId: 'security-solution-my-test', indicesExist: true, + sourcererDataView: {}, }), })); diff --git a/x-pack/solutions/security/plugins/security_solution/public/common/components/visualization_actions/lens_attributes/hosts/kpi_unique_ips_area.test.ts b/x-pack/solutions/security/plugins/security_solution/public/common/components/visualization_actions/lens_attributes/hosts/kpi_unique_ips_area.test.ts index b53f01755dfbf..ce3eedb6359b9 100644 --- a/x-pack/solutions/security/plugins/security_solution/public/common/components/visualization_actions/lens_attributes/hosts/kpi_unique_ips_area.test.ts +++ b/x-pack/solutions/security/plugins/security_solution/public/common/components/visualization_actions/lens_attributes/hosts/kpi_unique_ips_area.test.ts @@ -17,6 +17,7 @@ jest.mock('../../../../../sourcerer/containers', () => ({ selectedPatterns: ['auditbeat-mytest-*'], dataViewId: 'security-solution-my-test', indicesExist: true, + sourcererDataView: {}, }), })); diff --git a/x-pack/solutions/security/plugins/security_solution/public/common/components/visualization_actions/lens_attributes/hosts/kpi_unique_ips_bar.test.ts b/x-pack/solutions/security/plugins/security_solution/public/common/components/visualization_actions/lens_attributes/hosts/kpi_unique_ips_bar.test.ts index 19a396ffd5769..c611024df3064 100644 --- a/x-pack/solutions/security/plugins/security_solution/public/common/components/visualization_actions/lens_attributes/hosts/kpi_unique_ips_bar.test.ts +++ b/x-pack/solutions/security/plugins/security_solution/public/common/components/visualization_actions/lens_attributes/hosts/kpi_unique_ips_bar.test.ts @@ -17,6 +17,7 @@ jest.mock('../../../../../sourcerer/containers', () => ({ selectedPatterns: ['auditbeat-mytest-*'], dataViewId: 'security-solution-my-test', indicesExist: true, + sourcererDataView: {}, }), })); diff --git a/x-pack/solutions/security/plugins/security_solution/public/common/components/visualization_actions/lens_attributes/hosts/kpi_unique_ips_destination_metric.test.ts b/x-pack/solutions/security/plugins/security_solution/public/common/components/visualization_actions/lens_attributes/hosts/kpi_unique_ips_destination_metric.test.ts index 363232041f8d6..ecac8666e22c2 100644 --- a/x-pack/solutions/security/plugins/security_solution/public/common/components/visualization_actions/lens_attributes/hosts/kpi_unique_ips_destination_metric.test.ts +++ b/x-pack/solutions/security/plugins/security_solution/public/common/components/visualization_actions/lens_attributes/hosts/kpi_unique_ips_destination_metric.test.ts @@ -17,6 +17,7 @@ jest.mock('../../../../../sourcerer/containers', () => ({ selectedPatterns: ['auditbeat-mytest-*'], dataViewId: 'security-solution-my-test', indicesExist: true, + sourcererDataView: {}, }), })); diff --git a/x-pack/solutions/security/plugins/security_solution/public/common/components/visualization_actions/lens_attributes/hosts/kpi_unique_ips_source_metric.test.ts b/x-pack/solutions/security/plugins/security_solution/public/common/components/visualization_actions/lens_attributes/hosts/kpi_unique_ips_source_metric.test.ts index bda4593ce90e7..19ee1df315909 100644 --- a/x-pack/solutions/security/plugins/security_solution/public/common/components/visualization_actions/lens_attributes/hosts/kpi_unique_ips_source_metric.test.ts +++ b/x-pack/solutions/security/plugins/security_solution/public/common/components/visualization_actions/lens_attributes/hosts/kpi_unique_ips_source_metric.test.ts @@ -17,6 +17,7 @@ jest.mock('../../../../../sourcerer/containers', () => ({ selectedPatterns: ['auditbeat-mytest-*'], dataViewId: 'security-solution-my-test', indicesExist: true, + sourcererDataView: {}, }), })); diff --git a/x-pack/solutions/security/plugins/security_solution/public/common/components/visualization_actions/lens_attributes/network/dns_top_domains.test.ts b/x-pack/solutions/security/plugins/security_solution/public/common/components/visualization_actions/lens_attributes/network/dns_top_domains.test.ts index 0a2cbe4c55c25..92888224f8705 100644 --- a/x-pack/solutions/security/plugins/security_solution/public/common/components/visualization_actions/lens_attributes/network/dns_top_domains.test.ts +++ b/x-pack/solutions/security/plugins/security_solution/public/common/components/visualization_actions/lens_attributes/network/dns_top_domains.test.ts @@ -23,6 +23,7 @@ jest.mock('../../../../../sourcerer/containers', () => ({ selectedPatterns: ['auditbeat-mytest-*'], dataViewId: 'security-solution-my-test', indicesExist: true, + sourcererDataView: {}, }), })); diff --git a/x-pack/solutions/security/plugins/security_solution/public/common/components/visualization_actions/lens_attributes/network/kpi_dns_queries.test.ts b/x-pack/solutions/security/plugins/security_solution/public/common/components/visualization_actions/lens_attributes/network/kpi_dns_queries.test.ts index 7c624375668ba..bf3cb88bf00d2 100644 --- a/x-pack/solutions/security/plugins/security_solution/public/common/components/visualization_actions/lens_attributes/network/kpi_dns_queries.test.ts +++ b/x-pack/solutions/security/plugins/security_solution/public/common/components/visualization_actions/lens_attributes/network/kpi_dns_queries.test.ts @@ -17,6 +17,7 @@ jest.mock('../../../../../sourcerer/containers', () => ({ selectedPatterns: ['auditbeat-mytest-*'], dataViewId: 'security-solution-my-test', indicesExist: true, + sourcererDataView: {}, }), })); diff --git a/x-pack/solutions/security/plugins/security_solution/public/common/components/visualization_actions/lens_attributes/network/kpi_network_events.test.ts b/x-pack/solutions/security/plugins/security_solution/public/common/components/visualization_actions/lens_attributes/network/kpi_network_events.test.ts index 07a85aa8627b6..7742d5658b239 100644 --- a/x-pack/solutions/security/plugins/security_solution/public/common/components/visualization_actions/lens_attributes/network/kpi_network_events.test.ts +++ b/x-pack/solutions/security/plugins/security_solution/public/common/components/visualization_actions/lens_attributes/network/kpi_network_events.test.ts @@ -17,6 +17,7 @@ jest.mock('../../../../../sourcerer/containers', () => ({ selectedPatterns: ['auditbeat-mytest-*'], dataViewId: 'security-solution-my-test', indicesExist: true, + sourcererDataView: {}, }), })); diff --git a/x-pack/solutions/security/plugins/security_solution/public/common/components/visualization_actions/lens_attributes/network/kpi_tls_handshakes.test.ts b/x-pack/solutions/security/plugins/security_solution/public/common/components/visualization_actions/lens_attributes/network/kpi_tls_handshakes.test.ts index 8006583b9bac0..6148350b83edd 100644 --- a/x-pack/solutions/security/plugins/security_solution/public/common/components/visualization_actions/lens_attributes/network/kpi_tls_handshakes.test.ts +++ b/x-pack/solutions/security/plugins/security_solution/public/common/components/visualization_actions/lens_attributes/network/kpi_tls_handshakes.test.ts @@ -17,6 +17,7 @@ jest.mock('../../../../../sourcerer/containers', () => ({ selectedPatterns: ['auditbeat-mytest-*'], dataViewId: 'security-solution-my-test', indicesExist: true, + sourcererDataView: {}, }), })); diff --git a/x-pack/solutions/security/plugins/security_solution/public/common/components/visualization_actions/lens_attributes/network/kpi_unique_flow_ids.test.ts b/x-pack/solutions/security/plugins/security_solution/public/common/components/visualization_actions/lens_attributes/network/kpi_unique_flow_ids.test.ts index 50924694f5e04..29af131cec384 100644 --- a/x-pack/solutions/security/plugins/security_solution/public/common/components/visualization_actions/lens_attributes/network/kpi_unique_flow_ids.test.ts +++ b/x-pack/solutions/security/plugins/security_solution/public/common/components/visualization_actions/lens_attributes/network/kpi_unique_flow_ids.test.ts @@ -17,6 +17,7 @@ jest.mock('../../../../../sourcerer/containers', () => ({ selectedPatterns: ['auditbeat-mytest-*'], dataViewId: 'security-solution-my-test', indicesExist: true, + sourcererDataView: {}, }), })); diff --git a/x-pack/solutions/security/plugins/security_solution/public/common/components/visualization_actions/lens_attributes/network/kpi_unique_private_ips_area.test.ts b/x-pack/solutions/security/plugins/security_solution/public/common/components/visualization_actions/lens_attributes/network/kpi_unique_private_ips_area.test.ts index 6219ef94fcb3d..d76cbc72b26d2 100644 --- a/x-pack/solutions/security/plugins/security_solution/public/common/components/visualization_actions/lens_attributes/network/kpi_unique_private_ips_area.test.ts +++ b/x-pack/solutions/security/plugins/security_solution/public/common/components/visualization_actions/lens_attributes/network/kpi_unique_private_ips_area.test.ts @@ -17,6 +17,7 @@ jest.mock('../../../../../sourcerer/containers', () => ({ selectedPatterns: ['auditbeat-mytest-*'], dataViewId: 'security-solution-my-test', indicesExist: true, + sourcererDataView: {}, }), })); diff --git a/x-pack/solutions/security/plugins/security_solution/public/common/components/visualization_actions/lens_attributes/network/kpi_unique_private_ips_bar.test.ts b/x-pack/solutions/security/plugins/security_solution/public/common/components/visualization_actions/lens_attributes/network/kpi_unique_private_ips_bar.test.ts index 7b930e8326d63..2c2707755c28d 100644 --- a/x-pack/solutions/security/plugins/security_solution/public/common/components/visualization_actions/lens_attributes/network/kpi_unique_private_ips_bar.test.ts +++ b/x-pack/solutions/security/plugins/security_solution/public/common/components/visualization_actions/lens_attributes/network/kpi_unique_private_ips_bar.test.ts @@ -21,6 +21,7 @@ jest.mock('../../../../../sourcerer/containers', () => ({ selectedPatterns: ['auditbeat-mytest-*'], dataViewId: 'security-solution-my-test', indicesExist: true, + sourcererDataView: {}, }), })); diff --git a/x-pack/solutions/security/plugins/security_solution/public/common/components/visualization_actions/lens_attributes/network/kpi_unique_private_ips_destination_metric.test.ts b/x-pack/solutions/security/plugins/security_solution/public/common/components/visualization_actions/lens_attributes/network/kpi_unique_private_ips_destination_metric.test.ts index c966ed160e6f6..22996f32df705 100644 --- a/x-pack/solutions/security/plugins/security_solution/public/common/components/visualization_actions/lens_attributes/network/kpi_unique_private_ips_destination_metric.test.ts +++ b/x-pack/solutions/security/plugins/security_solution/public/common/components/visualization_actions/lens_attributes/network/kpi_unique_private_ips_destination_metric.test.ts @@ -17,6 +17,7 @@ jest.mock('../../../../../sourcerer/containers', () => ({ selectedPatterns: ['auditbeat-mytest-*'], dataViewId: 'security-solution-my-test', indicesExist: true, + sourcererDataView: {}, }), })); diff --git a/x-pack/solutions/security/plugins/security_solution/public/common/components/visualization_actions/lens_attributes/network/kpi_unique_private_ips_source_metric.test.ts b/x-pack/solutions/security/plugins/security_solution/public/common/components/visualization_actions/lens_attributes/network/kpi_unique_private_ips_source_metric.test.ts index 55e6c45df163a..1749a43bb6bb9 100644 --- a/x-pack/solutions/security/plugins/security_solution/public/common/components/visualization_actions/lens_attributes/network/kpi_unique_private_ips_source_metric.test.ts +++ b/x-pack/solutions/security/plugins/security_solution/public/common/components/visualization_actions/lens_attributes/network/kpi_unique_private_ips_source_metric.test.ts @@ -17,6 +17,7 @@ jest.mock('../../../../../sourcerer/containers', () => ({ selectedPatterns: ['auditbeat-mytest-*'], dataViewId: 'security-solution-my-test', indicesExist: true, + sourcererDataView: {}, }), })); diff --git a/x-pack/solutions/security/plugins/security_solution/public/common/components/visualization_actions/lens_attributes/users/kpi_total_users_area.test.ts b/x-pack/solutions/security/plugins/security_solution/public/common/components/visualization_actions/lens_attributes/users/kpi_total_users_area.test.ts index ec67b468dced3..a6e623227dff2 100644 --- a/x-pack/solutions/security/plugins/security_solution/public/common/components/visualization_actions/lens_attributes/users/kpi_total_users_area.test.ts +++ b/x-pack/solutions/security/plugins/security_solution/public/common/components/visualization_actions/lens_attributes/users/kpi_total_users_area.test.ts @@ -17,6 +17,7 @@ jest.mock('../../../../../sourcerer/containers', () => ({ selectedPatterns: ['auditbeat-mytest-*'], dataViewId: 'security-solution-my-test', indicesExist: true, + sourcererDataView: {}, }), })); diff --git a/x-pack/solutions/security/plugins/security_solution/public/common/components/visualization_actions/lens_attributes/users/kpi_total_users_metric.test.ts b/x-pack/solutions/security/plugins/security_solution/public/common/components/visualization_actions/lens_attributes/users/kpi_total_users_metric.test.ts index 974b56537d559..9a63bb90b6987 100644 --- a/x-pack/solutions/security/plugins/security_solution/public/common/components/visualization_actions/lens_attributes/users/kpi_total_users_metric.test.ts +++ b/x-pack/solutions/security/plugins/security_solution/public/common/components/visualization_actions/lens_attributes/users/kpi_total_users_metric.test.ts @@ -17,6 +17,7 @@ jest.mock('../../../../../sourcerer/containers', () => ({ selectedPatterns: ['auditbeat-mytest-*'], dataViewId: 'security-solution-my-test', indicesExist: true, + sourcererDataView: {}, }), })); diff --git a/x-pack/solutions/security/plugins/security_solution/public/common/components/visualization_actions/lens_attributes/users/kpi_user_authentication_metric_failure.test.ts b/x-pack/solutions/security/plugins/security_solution/public/common/components/visualization_actions/lens_attributes/users/kpi_user_authentication_metric_failure.test.ts index 2f8d5816c7460..c88bc1f92e424 100644 --- a/x-pack/solutions/security/plugins/security_solution/public/common/components/visualization_actions/lens_attributes/users/kpi_user_authentication_metric_failure.test.ts +++ b/x-pack/solutions/security/plugins/security_solution/public/common/components/visualization_actions/lens_attributes/users/kpi_user_authentication_metric_failure.test.ts @@ -17,6 +17,7 @@ jest.mock('../../../../../sourcerer/containers', () => ({ selectedPatterns: ['auditbeat-mytest-*'], dataViewId: 'security-solution-my-test', indicesExist: true, + sourcererDataView: {}, }), })); diff --git a/x-pack/solutions/security/plugins/security_solution/public/common/components/visualization_actions/lens_attributes/users/kpi_user_authentications_area.test.ts b/x-pack/solutions/security/plugins/security_solution/public/common/components/visualization_actions/lens_attributes/users/kpi_user_authentications_area.test.ts index 06364e6cc592d..5e83a5f6760c7 100644 --- a/x-pack/solutions/security/plugins/security_solution/public/common/components/visualization_actions/lens_attributes/users/kpi_user_authentications_area.test.ts +++ b/x-pack/solutions/security/plugins/security_solution/public/common/components/visualization_actions/lens_attributes/users/kpi_user_authentications_area.test.ts @@ -22,6 +22,7 @@ jest.mock('../../../../../sourcerer/containers', () => ({ selectedPatterns: ['auditbeat-mytest-*'], dataViewId: 'security-solution-my-test', indicesExist: true, + sourcererDataView: {}, }), })); diff --git a/x-pack/solutions/security/plugins/security_solution/public/common/components/visualization_actions/lens_attributes/users/kpi_user_authentications_bar.test.ts b/x-pack/solutions/security/plugins/security_solution/public/common/components/visualization_actions/lens_attributes/users/kpi_user_authentications_bar.test.ts index e351c6d80d560..f94e4bb2e4e0b 100644 --- a/x-pack/solutions/security/plugins/security_solution/public/common/components/visualization_actions/lens_attributes/users/kpi_user_authentications_bar.test.ts +++ b/x-pack/solutions/security/plugins/security_solution/public/common/components/visualization_actions/lens_attributes/users/kpi_user_authentications_bar.test.ts @@ -22,6 +22,7 @@ jest.mock('../../../../../sourcerer/containers', () => ({ selectedPatterns: ['auditbeat-mytest-*'], dataViewId: 'security-solution-my-test', indicesExist: true, + sourcererDataView: {}, }), })); diff --git a/x-pack/solutions/security/plugins/security_solution/public/common/components/visualization_actions/lens_attributes/users/kpi_user_authentications_metric_success.test.ts b/x-pack/solutions/security/plugins/security_solution/public/common/components/visualization_actions/lens_attributes/users/kpi_user_authentications_metric_success.test.ts index 86a224e523758..c9304a02e8478 100644 --- a/x-pack/solutions/security/plugins/security_solution/public/common/components/visualization_actions/lens_attributes/users/kpi_user_authentications_metric_success.test.ts +++ b/x-pack/solutions/security/plugins/security_solution/public/common/components/visualization_actions/lens_attributes/users/kpi_user_authentications_metric_success.test.ts @@ -17,6 +17,7 @@ jest.mock('../../../../../sourcerer/containers', () => ({ selectedPatterns: ['auditbeat-mytest-*'], dataViewId: 'security-solution-my-test', indicesExist: true, + sourcererDataView: {}, }), })); diff --git a/x-pack/solutions/security/plugins/security_solution/public/common/components/visualization_actions/use_lens_attributes.test.tsx b/x-pack/solutions/security/plugins/security_solution/public/common/components/visualization_actions/use_lens_attributes.test.tsx index 4b80337f79c11..0bdf666c72e0c 100644 --- a/x-pack/solutions/security/plugins/security_solution/public/common/components/visualization_actions/use_lens_attributes.test.tsx +++ b/x-pack/solutions/security/plugins/security_solution/public/common/components/visualization_actions/use_lens_attributes.test.tsx @@ -43,6 +43,7 @@ describe('useLensAttributes', () => { dataViewId: 'security-solution-default', indicesExist: true, selectedPatterns: ['auditbeat-*'], + sourcererDataView: {}, }); (useRouteSpy as jest.Mock).mockReturnValue([ { @@ -245,6 +246,7 @@ describe('useLensAttributes', () => { dataViewId: 'security-solution-default', indicesExist: false, selectedPatterns: ['auditbeat-*'], + sourcererDataView: {}, }); const { result } = renderHook( () => @@ -263,6 +265,7 @@ describe('useLensAttributes', () => { dataViewId: 'security-solution-default', indicesExist: false, selectedPatterns: ['auditbeat-*'], + sourcererDataView: {}, }); const { result } = renderHook( () => @@ -281,6 +284,7 @@ describe('useLensAttributes', () => { dataViewId: 'security-solution-default', indicesExist: false, selectedPatterns: ['auditbeat-*'], + sourcererDataView: {}, }); const { result } = renderHook( () => @@ -302,6 +306,7 @@ describe('useLensAttributes', () => { dataViewId: 'security-solution-default', indicesExist: false, selectedPatterns: ['auditbeat-*'], + sourcererDataView: {}, }); const { result } = renderHook( () => diff --git a/x-pack/solutions/security/plugins/security_solution/public/common/lib/kuery/index.test.ts b/x-pack/solutions/security/plugins/security_solution/public/common/lib/kuery/index.test.ts index 095f49d2f1e0e..98c59d415d447 100644 --- a/x-pack/solutions/security/plugins/security_solution/public/common/lib/kuery/index.test.ts +++ b/x-pack/solutions/security/plugins/security_solution/public/common/lib/kuery/index.test.ts @@ -8,7 +8,7 @@ import expect from '@kbn/expect'; import type { DataProvider } from '../../../../common/types/timeline'; import { convertToBuildEsQuery, buildGlobalQuery } from '.'; -import { mockIndexPattern } from '../../mock'; +import { mockDataViewSpec } from '../../mock'; describe('convertToBuildEsQuery', () => { /** @@ -61,7 +61,7 @@ describe('convertToBuildEsQuery', () => { const [converted, _] = convertToBuildEsQuery({ config, queries: queryWithNestedFields, - indexPattern: mockIndexPattern, + dataViewSpec: mockDataViewSpec, filters, }); @@ -176,7 +176,7 @@ describe('convertToBuildEsQuery', () => { const [converted, _] = convertToBuildEsQuery({ config: configWithOverride, queries: queryWithNestedFields, - indexPattern: mockIndexPattern, + dataViewSpec: mockDataViewSpec, filters, }); diff --git a/x-pack/solutions/security/plugins/security_solution/public/common/lib/kuery/index.ts b/x-pack/solutions/security/plugins/security_solution/public/common/lib/kuery/index.ts index b3f98a8483f30..ac66e8f051b2e 100644 --- a/x-pack/solutions/security/plugins/security_solution/public/common/lib/kuery/index.ts +++ b/x-pack/solutions/security/plugins/security_solution/public/common/lib/kuery/index.ts @@ -14,6 +14,7 @@ import { } from '@kbn/es-query'; import { get, isEmpty } from 'lodash/fp'; import memoizeOne from 'memoize-one'; +import type { DataViewSpec } from '@kbn/data-plugin/common'; import { prepareKQLParam } from '../../../../common/utils/kql'; import type { BrowserFields } from '../../../../common/search_strategy'; import type { DataProvider, DataProvidersAnd } from '../../../../common/types'; @@ -29,7 +30,7 @@ export type PrimitiveOrArrayOfPrimitives = export interface CombineQueries { config: EsQueryConfig; dataProviders: DataProvider[]; - indexPattern: DataViewBase; + dataViewSpec?: DataViewSpec; browserFields: BrowserFields; filters: Filter[]; kqlQuery: Query; @@ -199,14 +200,18 @@ export const isDataProviderEmpty = (dataProviders: DataProvider[]) => { return isEmpty(dataProviders) || isEmpty(dataProviders.filter((d) => d.enabled === true)); }; +export const dataViewSpecToViewBase = (dataViewSpec?: DataViewSpec): DataViewBase => { + return { title: dataViewSpec?.title || '', fields: Object.values(dataViewSpec?.fields || {}) }; +}; + export const convertToBuildEsQuery = ({ config, - indexPattern, + dataViewSpec, queries, filters, }: { config: EsQueryConfig; - indexPattern: DataViewBase | undefined; + dataViewSpec: DataViewSpec | undefined; queries: Query[]; filters: Filter[]; }): [string, undefined] | [undefined, Error] => { @@ -214,7 +219,7 @@ export const convertToBuildEsQuery = ({ return [ JSON.stringify( buildEsQuery( - indexPattern, + dataViewSpecToViewBase(dataViewSpec), queries, filters.filter((f) => f.meta.disabled === false), { @@ -240,7 +245,7 @@ export interface CombinedQuery { export const combineQueries = ({ config, dataProviders = [], - indexPattern, + dataViewSpec, browserFields, filters = [], kqlQuery, @@ -253,7 +258,7 @@ export const combineQueries = ({ const [filterQuery, kqlError] = convertToBuildEsQuery({ config, queries: [kuery], - indexPattern, + dataViewSpec, filters, }); @@ -281,7 +286,7 @@ export const combineQueries = ({ const [filterQuery, kqlError] = convertToBuildEsQuery({ config, queries: [kuery], - indexPattern, + dataViewSpec, filters, }); diff --git a/x-pack/solutions/security/plugins/security_solution/public/common/mock/index_pattern.ts b/x-pack/solutions/security/plugins/security_solution/public/common/mock/index_pattern.ts index cc04177139a89..ec042d0b01e2d 100644 --- a/x-pack/solutions/security/plugins/security_solution/public/common/mock/index_pattern.ts +++ b/x-pack/solutions/security/plugins/security_solution/public/common/mock/index_pattern.ts @@ -110,3 +110,8 @@ export const mockIndexPattern: SecuritySolutionDataViewBase = { }; export const mockIndexNames = ['filebeat-*', 'auditbeat-*', 'packetbeat-*']; + +export const mockDataViewSpec = { + fields: Object.fromEntries(mockIndexPattern.fields.map((f) => [f.name, f])), + title: 'filebeat-*,auditbeat-*,packetbeat-*', +}; diff --git a/x-pack/solutions/security/plugins/security_solution/public/detection_engine/rule_details_ui/pages/rule_details/execution_log_table/execution_log_table.test.tsx b/x-pack/solutions/security/plugins/security_solution/public/detection_engine/rule_details_ui/pages/rule_details/execution_log_table/execution_log_table.test.tsx index e17c441f9eb28..9a9cb57713359 100644 --- a/x-pack/solutions/security/plugins/security_solution/public/detection_engine/rule_details_ui/pages/rule_details/execution_log_table/execution_log_table.test.tsx +++ b/x-pack/solutions/security/plugins/security_solution/public/detection_engine/rule_details_ui/pages/rule_details/execution_log_table/execution_log_table.test.tsx @@ -47,11 +47,11 @@ const coreStart = coreMock.createStart(); const mockUseSourcererDataView = useSourcererDataView as jest.Mock; mockUseSourcererDataView.mockReturnValue({ - indexPattern: { fields: [] }, missingPatterns: {}, selectedPatterns: {}, scopeSelectedPatterns: {}, loading: false, + sourcererDataView: {}, }); const mockUseRuleExecutionEvents = useExecutionResults as jest.Mock; diff --git a/x-pack/solutions/security/plugins/security_solution/public/detection_engine/rule_details_ui/pages/rule_details/execution_log_table/execution_log_table.tsx b/x-pack/solutions/security/plugins/security_solution/public/detection_engine/rule_details_ui/pages/rule_details/execution_log_table/execution_log_table.tsx index c50223c2b51c7..296323213a6db 100644 --- a/x-pack/solutions/security/plugins/security_solution/public/detection_engine/rule_details_ui/pages/rule_details/execution_log_table/execution_log_table.tsx +++ b/x-pack/solutions/security/plugins/security_solution/public/detection_engine/rule_details_ui/pages/rule_details/execution_log_table/execution_log_table.tsx @@ -37,6 +37,7 @@ import type { AnalyticsServiceStart } from '@kbn/core-analytics-browser'; import type { I18nStart } from '@kbn/core-i18n-browser'; import type { ThemeServiceStart } from '@kbn/core-theme-browser'; +import { dataViewSpecToViewBase } from '../../../../../common/lib/kuery'; import { InputsModelId } from '../../../../../common/store/inputs/constants'; import { @@ -160,7 +161,7 @@ const ExecutionLogTableComponent: React.FC = ({ } = useRuleDetailsContext(); // Index for `add filter` action and toasts for errors - const { indexPattern } = useSourcererDataView(SourcererScopeName.detections); + const { sourcererDataView } = useSourcererDataView(SourcererScopeName.detections); const { addError, addSuccess, remove } = useAppToasts(); // QueryString, Filters, and TimeRange state @@ -233,9 +234,10 @@ const ExecutionLogTableComponent: React.FC = ({ const maxEvents = events?.total ?? 0; // Cache UUID field from data view as it can be expensive to iterate all data view fields - const uuidDataViewField = useMemo(() => { - return indexPattern.fields.find((f) => f.name === EXECUTION_UUID_FIELD_NAME); - }, [indexPattern]); + const uuidDataViewField = useMemo( + () => sourcererDataView.fields?.[EXECUTION_UUID_FIELD_NAME], + [sourcererDataView] + ); // Callbacks const onTableChangeCallback = useCallback( @@ -300,12 +302,18 @@ const ExecutionLogTableComponent: React.FC = ({ const onFilterByExecutionIdCallback = useCallback( (executionId: string, executionStart: string) => { - if (uuidDataViewField != null) { + const dataViewAsViewBase = dataViewSpecToViewBase(sourcererDataView); + + if ( + uuidDataViewField != null && + typeof uuidDataViewField !== 'undefined' && + dataViewAsViewBase + ) { // Update cached global query state with current state as a rollback point cachedGlobalQueryState.current = { filters, query, timerange }; // Create filter & daterange constraints const filter = buildFilter( - indexPattern, + dataViewAsViewBase, uuidDataViewField, FILTERS.PHRASE, false, @@ -351,18 +359,18 @@ const ExecutionLogTableComponent: React.FC = ({ } }, [ - addError, - addSuccess, - dispatch, - filterManager, + uuidDataViewField, filters, - indexPattern, query, - resetGlobalQueryState, - selectAlertsTab, timerange, - uuidDataViewField, + sourcererDataView, + dispatch, + filterManager, + selectAlertsTab, + addSuccess, + resetGlobalQueryState, startServices, + addError, ] ); diff --git a/x-pack/solutions/security/plugins/security_solution/public/detections/components/alert_summary/table/table.tsx b/x-pack/solutions/security/plugins/security_solution/public/detections/components/alert_summary/table/table.tsx index 15bed1a7bc5dc..9371168ac76ac 100644 --- a/x-pack/solutions/security/plugins/security_solution/public/detections/components/alert_summary/table/table.tsx +++ b/x-pack/solutions/security/plugins/security_solution/public/detections/components/alert_summary/table/table.tsx @@ -217,7 +217,7 @@ export const Table = memo(({ dataView, groupingFilters, packages, ruleResponse } const combinedQuery = combineQueries({ config: getEsQueryConfig(uiSettings), dataProviders: [], - indexPattern: dataView, + dataViewSpec, browserFields, filters, kqlQuery: globalQuery, @@ -234,7 +234,7 @@ export const Table = memo(({ dataView, groupingFilters, packages, ruleResponse } } catch { return { bool: {} }; } - }, [browserFields, dataView, filters, globalQuery, uiSettings]); + }, [browserFields, dataViewSpec, filters, globalQuery, uiSettings]); const renderAdditionalToolbarControls = useCallback( () => , diff --git a/x-pack/solutions/security/plugins/security_solution/public/detections/components/alerts_kpis/chart_panels/index.test.tsx b/x-pack/solutions/security/plugins/security_solution/public/detections/components/alerts_kpis/chart_panels/index.test.tsx index 668f323d147cb..38d68f2af0ad6 100644 --- a/x-pack/solutions/security/plugins/security_solution/public/detections/components/alerts_kpis/chart_panels/index.test.tsx +++ b/x-pack/solutions/security/plugins/security_solution/public/detections/components/alerts_kpis/chart_panels/index.test.tsx @@ -156,6 +156,7 @@ describe('ChartPanels', () => { indicesExist: true, indexPattern: {}, browserFields: mockBrowserFields, + sourcererDataView: {}, }); (useAlertsLocalStorage as jest.Mock).mockReturnValue({ diff --git a/x-pack/solutions/security/plugins/security_solution/public/detections/components/alerts_table/additional_toolbar_controls.test.tsx b/x-pack/solutions/security/plugins/security_solution/public/detections/components/alerts_table/additional_toolbar_controls.test.tsx index 968a1b6d03214..5bb2587cc1159 100644 --- a/x-pack/solutions/security/plugins/security_solution/public/detections/components/alerts_table/additional_toolbar_controls.test.tsx +++ b/x-pack/solutions/security/plugins/security_solution/public/detections/components/alerts_table/additional_toolbar_controls.test.tsx @@ -73,6 +73,7 @@ describe('AdditionalToolbarControls', () => { (useSourcererDataView as jest.Mock).mockReturnValue({ ...sourcererDataView, selectedPatterns: ['myFakebeat-*'], + sourcererDataView: {}, }); }); diff --git a/x-pack/solutions/security/plugins/security_solution/public/detections/components/alerts_table/alerts_grouping.test.tsx b/x-pack/solutions/security/plugins/security_solution/public/detections/components/alerts_table/alerts_grouping.test.tsx index b0c1647b94dfc..5fdcab41988ee 100644 --- a/x-pack/solutions/security/plugins/security_solution/public/detections/components/alerts_table/alerts_grouping.test.tsx +++ b/x-pack/solutions/security/plugins/security_solution/public/detections/components/alerts_table/alerts_grouping.test.tsx @@ -174,6 +174,7 @@ describe('GroupedAlertsTable', () => { (useSourcererDataView as jest.Mock).mockReturnValue({ ...sourcererDataView, selectedPatterns: ['myFakebeat-*'], + sourcererDataView: {}, }); mockUseQueryAlerts.mockImplementation((i) => { if (i.skip) { diff --git a/x-pack/solutions/security/plugins/security_solution/public/detections/components/alerts_table/alerts_sub_grouping.tsx b/x-pack/solutions/security/plugins/security_solution/public/detections/components/alerts_table/alerts_sub_grouping.tsx index d23074e04ebef..b40518524fb86 100644 --- a/x-pack/solutions/security/plugins/security_solution/public/detections/components/alerts_table/alerts_sub_grouping.tsx +++ b/x-pack/solutions/security/plugins/security_solution/public/detections/components/alerts_table/alerts_sub_grouping.tsx @@ -98,15 +98,15 @@ export const GroupedSubLevelComponent: React.FC = ({ const { services: { uiSettings }, } = useKibana(); - const { browserFields, indexPattern } = useSourcererDataView(SourcererScopeName.detections); + const { browserFields, sourcererDataView } = useSourcererDataView(SourcererScopeName.detections); const getGlobalQuery = useCallback( (customFilters: Filter[]) => { - if (browserFields != null && indexPattern != null) { + if (browserFields != null && sourcererDataView) { return combineQueries({ config: getEsQueryConfig(uiSettings), dataProviders: [], - indexPattern, + dataViewSpec: sourcererDataView, browserFields, filters: [ ...defaultFilters, @@ -127,10 +127,10 @@ export const GroupedSubLevelComponent: React.FC = ({ from, globalFilters, globalQuery, - indexPattern, parentGroupingFilter, to, uiSettings, + sourcererDataView, ] ); diff --git a/x-pack/solutions/security/plugins/security_solution/public/detections/components/alerts_table/index.tsx b/x-pack/solutions/security/plugins/security_solution/public/detections/components/alerts_table/index.tsx index 54afb95b93199..4572a7a924c4b 100644 --- a/x-pack/solutions/security/plugins/security_solution/public/detections/components/alerts_table/index.tsx +++ b/x-pack/solutions/security/plugins/security_solution/public/detections/components/alerts_table/index.tsx @@ -185,11 +185,7 @@ const DetectionEngineAlertsTableComponent: FC { - if (browserFields != null && indexPatterns != null) { + if (browserFields != null && sourcererDataView) { return combineQueries({ config: getEsQueryConfig(uiSettings), dataProviders: [], - indexPattern: indexPatterns, + dataViewSpec: sourcererDataView, browserFields, filters: [...allFilters], kqlQuery: globalQuery, @@ -231,7 +227,7 @@ const DetectionEngineAlertsTableComponent: FC { if (!combinedQuery) return ''; @@ -128,7 +127,7 @@ export const useAddBulkToTimelineAction = ({ sort: timelineQuerySortField, indexNames: selectedPatterns, filterQuery, - runtimeMappings: sourcererDataView?.runtimeFieldMap as RunTimeMappings, + runtimeMappings: sourcererDataView.runtimeFieldMap as RunTimeMappings, limit: Math.min(BULK_ADD_TO_TIMELINE_LIMIT, totalCount), timerangeKind: 'absolute', }); diff --git a/x-pack/solutions/security/plugins/security_solution/public/detections/components/detection_engine_filters/detection_engine_filters.test.tsx b/x-pack/solutions/security/plugins/security_solution/public/detections/components/detection_engine_filters/detection_engine_filters.test.tsx index 82d6a4726dbc2..d9683d9de1b04 100644 --- a/x-pack/solutions/security/plugins/security_solution/public/detections/components/detection_engine_filters/detection_engine_filters.test.tsx +++ b/x-pack/solutions/security/plugins/security_solution/public/detections/components/detection_engine_filters/detection_engine_filters.test.tsx @@ -72,9 +72,9 @@ describe('DetectionEngineFilters', () => { }, timeRange: { from: 'now-15m', to: 'now' }, onInit: jest.fn(), - indexPattern: { + dataViewSpec: { title: 'mock-title', - fields: [], + fields: {}, }, }; diff --git a/x-pack/solutions/security/plugins/security_solution/public/detections/components/detection_engine_filters/detection_engine_filters.tsx b/x-pack/solutions/security/plugins/security_solution/public/detections/components/detection_engine_filters/detection_engine_filters.tsx index 5e5f3418b3e2b..5a01ea1f939d2 100644 --- a/x-pack/solutions/security/plugins/security_solution/public/detections/components/detection_engine_filters/detection_engine_filters.tsx +++ b/x-pack/solutions/security/plugins/security_solution/public/detections/components/detection_engine_filters/detection_engine_filters.tsx @@ -13,21 +13,24 @@ import type { AlertFilterControlsProps } from '@kbn/alerts-ui-shared/src/alert_f import { AlertFilterControls } from '@kbn/alerts-ui-shared/src/alert_filter_controls'; import { useHistory } from 'react-router-dom'; import { SECURITY_SOLUTION_RULE_TYPE_IDS } from '@kbn/securitysolution-rules'; +import type { DataViewSpec } from '@kbn/data-plugin/common'; import { useKibana } from '../../../common/lib/kibana'; import { DEFAULT_DETECTION_PAGE_FILTERS } from '../../../../common/constants'; import { URL_PARAM_KEY } from '../../../common/hooks/use_url_state'; import { useSpaceId } from '../../../common/hooks/use_space_id'; -import type { SecuritySolutionDataViewBase } from '../../../common/types'; import { SECURITY_ALERT_DATA_VIEW } from '../../constants'; export type DetectionEngineFiltersProps = Pick< AlertFilterControlsProps, 'filters' | 'onFiltersChange' | 'query' | 'timeRange' | 'onInit' > & { - indexPattern?: SecuritySolutionDataViewBase; + dataViewSpec?: DataViewSpec; }; -export const DetectionEngineFilters = ({ indexPattern, ...props }: DetectionEngineFiltersProps) => { +export const DetectionEngineFilters = ({ + dataViewSpec: indexPattern, + ...props +}: DetectionEngineFiltersProps) => { const { http, notifications, dataViews } = useKibana().services; const spaceId = useSpaceId(); const history = useHistory(); diff --git a/x-pack/solutions/security/plugins/security_solution/public/detections/configurations/security_solution_detections/render_cell_value.test.tsx b/x-pack/solutions/security/plugins/security_solution/public/detections/configurations/security_solution_detections/render_cell_value.test.tsx index 45cb2e1efb909..6edad541d10c7 100644 --- a/x-pack/solutions/security/plugins/security_solution/public/detections/configurations/security_solution_detections/render_cell_value.test.tsx +++ b/x-pack/solutions/security/plugins/security_solution/public/detections/configurations/security_solution_detections/render_cell_value.test.tsx @@ -28,6 +28,7 @@ jest.mock('../../../sourcerer/containers', () => ({ defaultIndex: 'defaultIndex', loading: false, indicesExist: true, + sourcererDataView: {}, }), })); jest.mock('../../../common/components/guided_onboarding_tour/tour_step'); diff --git a/x-pack/solutions/security/plugins/security_solution/public/detections/containers/detection_engine/rules/use_rule_from_timeline.test.ts b/x-pack/solutions/security/plugins/security_solution/public/detections/containers/detection_engine/rules/use_rule_from_timeline.test.ts index 2c5fad7aa06d0..7ed32f777a5d7 100644 --- a/x-pack/solutions/security/plugins/security_solution/public/detections/containers/detection_engine/rules/use_rule_from_timeline.test.ts +++ b/x-pack/solutions/security/plugins/security_solution/public/detections/containers/detection_engine/rules/use_rule_from_timeline.test.ts @@ -112,6 +112,7 @@ describe('useRuleFromTimeline', () => { ...mockSourcererScope, dataViewId: 'custom-data-view-id', selectedPatterns: ['awesome-*'], + sourcererDataView: {}, }); }); diff --git a/x-pack/solutions/security/plugins/security_solution/public/detections/pages/alerts/detection_engine.test.tsx b/x-pack/solutions/security/plugins/security_solution/public/detections/pages/alerts/detection_engine.test.tsx index 304050e6262df..79ea0b2974b43 100644 --- a/x-pack/solutions/security/plugins/security_solution/public/detections/pages/alerts/detection_engine.test.tsx +++ b/x-pack/solutions/security/plugins/security_solution/public/detections/pages/alerts/detection_engine.test.tsx @@ -196,7 +196,6 @@ describe('DetectionEnginePageComponent', () => { ]); (useSourcererDataView as jest.Mock).mockReturnValue({ indicesExist: true, - indexPattern: {}, browserFields: mockBrowserFields, sourcererDataView: { fields: {}, diff --git a/x-pack/solutions/security/plugins/security_solution/public/detections/pages/alerts/detection_engine.tsx b/x-pack/solutions/security/plugins/security_solution/public/detections/pages/alerts/detection_engine.tsx index d2d13f47932e6..322394081ed99 100644 --- a/x-pack/solutions/security/plugins/security_solution/public/detections/pages/alerts/detection_engine.tsx +++ b/x-pack/solutions/security/plugins/security_solution/public/detections/pages/alerts/detection_engine.tsx @@ -161,7 +161,6 @@ const DetectionEnginePageComponent: React.FC = () const sourcererDataView = useSourcererDataView(SourcererScopeName.detections); const sourcererDataViewSpec: DataViewSpec = sourcererDataView.sourcererDataView as DataViewSpec; const isLoadingIndexPattern = sourcererDataView.loading; - const indexPattern = sourcererDataView.indexPattern; const { formatUrl } = useFormatUrl(SecurityPageName.rules); @@ -427,7 +426,7 @@ const DetectionEnginePageComponent: React.FC = () query={query} timeRange={pageFiltersTimerange} onInit={setDetectionPageFilterHandler} - indexPattern={indexPattern} + dataViewSpec={sourcererDataViewSpec} /> ({ selectedPatterns: ['auditbeat-mytest-*'], dataViewId: 'security-solution-my-test', indicesExist: true, + sourcererDataView: {}, }), })); diff --git a/x-pack/solutions/security/plugins/security_solution/public/entity_analytics/lens_attributes/risk_score_over_time_area.test.ts b/x-pack/solutions/security/plugins/security_solution/public/entity_analytics/lens_attributes/risk_score_over_time_area.test.ts index d6607034bbf92..b0396ab2a43d9 100644 --- a/x-pack/solutions/security/plugins/security_solution/public/entity_analytics/lens_attributes/risk_score_over_time_area.test.ts +++ b/x-pack/solutions/security/plugins/security_solution/public/entity_analytics/lens_attributes/risk_score_over_time_area.test.ts @@ -17,6 +17,7 @@ jest.mock('../../sourcerer/containers', () => ({ selectedPatterns: ['auditbeat-mytest-*'], dataViewId: 'security-solution-my-test', indicesExist: true, + sourcererDataView: {}, }), })); diff --git a/x-pack/solutions/security/plugins/security_solution/public/entity_analytics/lens_attributes/risk_score_summary.test.ts b/x-pack/solutions/security/plugins/security_solution/public/entity_analytics/lens_attributes/risk_score_summary.test.ts index dd154d17b82db..516ad4bef5695 100644 --- a/x-pack/solutions/security/plugins/security_solution/public/entity_analytics/lens_attributes/risk_score_summary.test.ts +++ b/x-pack/solutions/security/plugins/security_solution/public/entity_analytics/lens_attributes/risk_score_summary.test.ts @@ -19,6 +19,7 @@ jest.mock('../../sourcerer/containers', () => ({ selectedPatterns: ['auditbeat-mytest-*'], dataViewId: 'security-solution-my-test', indicesExist: true, + sourcererDataView: {}, }), })); diff --git a/x-pack/solutions/security/plugins/security_solution/public/explore/hosts/pages/details/details_tabs.test.tsx b/x-pack/solutions/security/plugins/security_solution/public/explore/hosts/pages/details/details_tabs.test.tsx index 9e0797cab6caf..327db18136542 100644 --- a/x-pack/solutions/security/plugins/security_solution/public/explore/hosts/pages/details/details_tabs.test.tsx +++ b/x-pack/solutions/security/plugins/security_solution/public/explore/hosts/pages/details/details_tabs.test.tsx @@ -12,6 +12,7 @@ import useResizeObserver from 'use-resize-observer/polyfilled'; import { createMockStore, + mockDataViewSpec, mockGlobalState, mockIndexPattern, TestProviders, @@ -162,7 +163,7 @@ describe('body', () => { setQuery={jest.fn()} hostDetailsPagePath={hostDetailsPagePath} indexNames={[]} - indexPattern={mockIndexPattern} + dataViewSpec={mockDataViewSpec} type={HostsType.details} hostDetailsFilter={mockHostDetailsPageFilters} filterQuery={filterQuery} @@ -181,34 +182,32 @@ describe('body', () => { startDate: '2020-07-07T08:20:18.966Z', type: 'details', indexPattern: { - fields: [ - { name: '@timestamp', searchable: true, type: 'date', aggregatable: true }, - { name: '@version', searchable: true, type: 'string', aggregatable: true }, - { name: 'agent.ephemeral_id', searchable: true, type: 'string', aggregatable: true }, - { name: 'agent.hostname', searchable: true, type: 'string', aggregatable: true }, - { name: 'agent.id', searchable: true, type: 'string', aggregatable: true }, - { name: 'agent.test1', searchable: true, type: 'string', aggregatable: true }, - { name: 'agent.test2', searchable: true, type: 'string', aggregatable: true }, - { name: 'agent.test3', searchable: true, type: 'string', aggregatable: true }, - { name: 'agent.test4', searchable: true, type: 'string', aggregatable: true }, - { name: 'agent.test5', searchable: true, type: 'string', aggregatable: true }, - { name: 'agent.test6', searchable: true, type: 'string', aggregatable: true }, - { name: 'agent.test7', searchable: true, type: 'string', aggregatable: true }, - { name: 'agent.test8', searchable: true, type: 'string', aggregatable: true }, - { name: 'host.name', searchable: true, type: 'string', aggregatable: true }, - { + fields: { + '@timestamp': { searchable: true, type: 'date', aggregatable: true }, + '@version': { searchable: true, type: 'string', aggregatable: true }, + 'agent.ephemeral_id': { searchable: true, type: 'string', aggregatable: true }, + 'agent.hostname': { searchable: true, type: 'string', aggregatable: true }, + 'agent.id': { searchable: true, type: 'string', aggregatable: true }, + 'agent.test1': { searchable: true, type: 'string', aggregatable: true }, + 'agent.test2': { searchable: true, type: 'string', aggregatable: true }, + 'agent.test3': { searchable: true, type: 'string', aggregatable: true }, + 'agent.test4': { searchable: true, type: 'string', aggregatable: true }, + 'agent.test5': { searchable: true, type: 'string', aggregatable: true }, + 'agent.test6': { searchable: true, type: 'string', aggregatable: true }, + 'agent.test7': { searchable: true, type: 'string', aggregatable: true }, + 'agent.test8': { searchable: true, type: 'string', aggregatable: true }, + 'host.name': { searchable: true, type: 'string', aggregatable: true }, + 'nestedField.firstAttributes': { aggregatable: false, - name: 'nestedField.firstAttributes', searchable: true, type: 'string', }, - { + 'nestedField.secondAttributes': { aggregatable: false, - name: 'nestedField.secondAttributes', searchable: true, type: 'string', }, - ], + }, title: 'filebeat-*,auditbeat-*,packetbeat-*', }, hostName: 'host-1', diff --git a/x-pack/solutions/security/plugins/security_solution/public/explore/hosts/pages/details/details_tabs.tsx b/x-pack/solutions/security/plugins/security_solution/public/explore/hosts/pages/details/details_tabs.tsx index e64ec9d16002d..228e1a9663e27 100644 --- a/x-pack/solutions/security/plugins/security_solution/public/explore/hosts/pages/details/details_tabs.tsx +++ b/x-pack/solutions/security/plugins/security_solution/public/explore/hosts/pages/details/details_tabs.tsx @@ -29,7 +29,7 @@ export const HostDetailsTabs = React.memo( detailName, filterQuery, indexNames, - indexPattern, + dataViewSpec: indexPattern, hostDetailsPagePath, hostDetailsFilter, }) => { diff --git a/x-pack/solutions/security/plugins/security_solution/public/explore/hosts/pages/details/index.tsx b/x-pack/solutions/security/plugins/security_solution/public/explore/hosts/pages/details/index.tsx index 4bcf8fd5d2382..0cd908909ef0c 100644 --- a/x-pack/solutions/security/plugins/security_solution/public/explore/hosts/pages/details/index.tsx +++ b/x-pack/solutions/security/plugins/security_solution/public/explore/hosts/pages/details/index.tsx @@ -21,6 +21,7 @@ import { buildEsQuery } from '@kbn/es-query'; import { getEsQueryConfig } from '@kbn/data-plugin/common'; import { dataTableSelectors, tableDefaults, TableId } from '@kbn/securitysolution-data-table'; import type { NarrowDateRange } from '../../../../common/components/ml/types'; +import { dataViewSpecToViewBase } from '../../../../common/lib/kuery'; import { useCalculateEntityRiskScore } from '../../../../entity_analytics/api/hooks/use_calculate_entity_risk_score'; import { useAssetCriticalityData, @@ -129,8 +130,7 @@ const HostDetailsComponent: React.FC = ({ detailName, hostDeta [dispatch] ); - const { indexPattern, indicesExist, selectedPatterns, sourcererDataView } = - useSourcererDataView(); + const { indicesExist, selectedPatterns, sourcererDataView } = useSourcererDataView(); const [loading, { inspect, hostDetails: hostOverview, id, refetch }] = useHostDetails({ endDate: to, startDate: from, @@ -143,7 +143,7 @@ const HostDetailsComponent: React.FC = ({ detailName, hostDeta try { return [ buildEsQuery( - indexPattern, + dataViewSpecToViewBase(sourcererDataView), [query], [...hostDetailsPageFilters, ...globalFilters], getEsQueryConfig(uiSettings) @@ -152,7 +152,7 @@ const HostDetailsComponent: React.FC = ({ detailName, hostDeta } catch (e) { return [undefined, e]; } - }, [globalFilters, indexPattern, query, uiSettings, hostDetailsPageFilters]); + }, [sourcererDataView, query, hostDetailsPageFilters, globalFilters, uiSettings]); const stringifiedAdditionalFilters = JSON.stringify(rawFilteredQuery); useInvalidFilterQuery({ @@ -318,7 +318,7 @@ const HostDetailsComponent: React.FC = ({ detailName, hostDeta setQuery={setQuery} filterQuery={stringifiedAdditionalFilters} hostDetailsPagePath={hostDetailsPagePath} - indexPattern={indexPattern} + dataViewSpec={sourcererDataView} /> diff --git a/x-pack/solutions/security/plugins/security_solution/public/explore/hosts/pages/details/types.ts b/x-pack/solutions/security/plugins/security_solution/public/explore/hosts/pages/details/types.ts index dc5b3baccdc5c..fe23a0485dac8 100644 --- a/x-pack/solutions/security/plugins/security_solution/public/explore/hosts/pages/details/types.ts +++ b/x-pack/solutions/security/plugins/security_solution/public/explore/hosts/pages/details/types.ts @@ -5,7 +5,8 @@ * 2.0. */ -import type { DataViewBase, Filter } from '@kbn/es-query'; +import type { Filter } from '@kbn/es-query'; +import type { DataViewSpec } from '@kbn/data-plugin/common'; import type { HostsTableType } from '../../store/model'; import type { HostsQueryProps } from '../types'; import type { NavTab } from '../../../../common/components/navigation/types'; @@ -40,6 +41,6 @@ export type HostDetailsTabsProps = HostBodyComponentDispatchProps & indexNames: string[]; hostDetailsFilter: Filter[]; filterQuery?: string; - indexPattern: DataViewBase; + dataViewSpec?: DataViewSpec; type: hostsModel.HostsType; }; diff --git a/x-pack/solutions/security/plugins/security_solution/public/explore/hosts/pages/hosts.tsx b/x-pack/solutions/security/plugins/security_solution/public/explore/hosts/pages/hosts.tsx index 4f1b221a6f61e..505da737e1c40 100644 --- a/x-pack/solutions/security/plugins/security_solution/public/explore/hosts/pages/hosts.tsx +++ b/x-pack/solutions/security/plugins/security_solution/public/explore/hosts/pages/hosts.tsx @@ -105,27 +105,26 @@ const HostsComponent = () => { return globalFilters; }, [globalFilters, severitySelection, tabName]); - const { indicesExist, indexPattern, selectedPatterns, sourcererDataView } = - useSourcererDataView(); + const { indicesExist, selectedPatterns, sourcererDataView } = useSourcererDataView(); const [globalFilterQuery, kqlError] = useMemo( () => convertToBuildEsQuery({ config: getEsQueryConfig(uiSettings), - indexPattern, + dataViewSpec: sourcererDataView, queries: [query], filters: globalFilters, }), - [globalFilters, indexPattern, uiSettings, query] + [globalFilters, sourcererDataView, uiSettings, query] ); const [tabsFilterQuery] = useMemo( () => convertToBuildEsQuery({ config: getEsQueryConfig(uiSettings), - indexPattern, + dataViewSpec: sourcererDataView, queries: [query], filters: tabsFilters, }), - [indexPattern, query, tabsFilters, uiSettings] + [sourcererDataView, query, tabsFilters, uiSettings] ); useInvalidFilterQuery({ diff --git a/x-pack/solutions/security/plugins/security_solution/public/explore/network/components/network_top_countries_table/columns.tsx b/x-pack/solutions/security/plugins/security_solution/public/explore/network/components/network_top_countries_table/columns.tsx index 5530b1eb0a1c7..eb1ae639c32f1 100644 --- a/x-pack/solutions/security/plugins/security_solution/public/explore/network/components/network_top_countries_table/columns.tsx +++ b/x-pack/solutions/security/plugins/security_solution/public/explore/network/components/network_top_countries_table/columns.tsx @@ -8,7 +8,6 @@ import { get } from 'lodash/fp'; import numeral from '@elastic/numeral'; import React from 'react'; -import type { DataViewBase } from '@kbn/es-query'; import { SecurityCellActions, CellActionsMode, @@ -45,7 +44,6 @@ export type NetworkTopCountriesColumnsNetworkDetails = [ ]; export const getNetworkTopCountriesColumns = ( - indexPattern: DataViewBase, flowTarget: FlowTargetSourceDest, type: networkModel.NetworkType, tableId: string @@ -149,12 +147,11 @@ export const getNetworkTopCountriesColumns = ( ]; export const getCountriesColumnsCurated = ( - indexPattern: DataViewBase, flowTarget: FlowTargetSourceDest, type: networkModel.NetworkType, tableId: string ): NetworkTopCountriesColumns | NetworkTopCountriesColumnsNetworkDetails => { - const columns = getNetworkTopCountriesColumns(indexPattern, flowTarget, type, tableId); + const columns = getNetworkTopCountriesColumns(flowTarget, type, tableId); // Columns to exclude from host details pages if (type === networkModel.NetworkType.details) { diff --git a/x-pack/solutions/security/plugins/security_solution/public/explore/network/components/network_top_countries_table/index.tsx b/x-pack/solutions/security/plugins/security_solution/public/explore/network/components/network_top_countries_table/index.tsx index 3f34d79775f6f..0bee284e5f0e3 100644 --- a/x-pack/solutions/security/plugins/security_solution/public/explore/network/components/network_top_countries_table/index.tsx +++ b/x-pack/solutions/security/plugins/security_solution/public/explore/network/components/network_top_countries_table/index.tsx @@ -9,7 +9,6 @@ import { last } from 'lodash/fp'; import React, { useCallback, useMemo } from 'react'; import { useDispatch } from 'react-redux'; import deepEqual from 'fast-deep-equal'; -import type { DataViewBase } from '@kbn/es-query'; import { networkActions, networkModel, networkSelectors } from '../../store'; import type { NetworkTopCountriesEdges, SortField } from '../../../../../common/search_strategy'; @@ -31,7 +30,6 @@ interface NetworkTopCountriesTableProps { fakeTotalCount: number; flowTargeted: FlowTargetSourceDest; id: string; - indexPattern: DataViewBase; isInspect: boolean; loading: boolean; loadPage: (newActivePage: number) => void; @@ -59,7 +57,6 @@ const NetworkTopCountriesTableComponent: React.FC fakeTotalCount, flowTargeted, id, - indexPattern, isInspect, loading, loadPage, @@ -152,8 +149,8 @@ const NetworkTopCountriesTableComponent: React.FC ); const columns = useMemo( - () => getCountriesColumnsCurated(indexPattern, flowTargeted, type, NetworkTopCountriesTableId), - [indexPattern, flowTargeted, type] + () => getCountriesColumnsCurated(flowTargeted, type, NetworkTopCountriesTableId), + [flowTargeted, type] ); return ( diff --git a/x-pack/solutions/security/plugins/security_solution/public/explore/network/pages/details/index.test.tsx b/x-pack/solutions/security/plugins/security_solution/public/explore/network/pages/details/index.test.tsx index ae9a18c41ae19..58be0687c62e0 100644 --- a/x-pack/solutions/security/plugins/security_solution/public/explore/network/pages/details/index.test.tsx +++ b/x-pack/solutions/security/plugins/security_solution/public/explore/network/pages/details/index.test.tsx @@ -125,6 +125,7 @@ describe('Network Details', () => { (useSourcererDataView as jest.Mock).mockReturnValue({ indicesExist: false, indexPattern: {}, + sourcererDataView: {}, }); global.fetch = jest.fn().mockImplementationOnce(() => Promise.resolve({ @@ -145,6 +146,7 @@ describe('Network Details', () => { (useSourcererDataView as jest.Mock).mockReturnValue({ indicesExist: true, indexPattern: {}, + sourcererDataView: {}, }); (useParams as jest.Mock).mockReturnValue({ detailName: ip, @@ -165,6 +167,7 @@ describe('Network Details', () => { (useSourcererDataView as jest.Mock).mockReturnValue({ indicesExist: true, indexPattern: {}, + sourcererDataView: {}, }); (useParams as jest.Mock).mockReturnValue({ detailName: ip, @@ -187,6 +190,7 @@ describe('Network Details', () => { (useSourcererDataView as jest.Mock).mockReturnValue({ indicesExist: false, indexPattern: {}, + sourcererDataView: {}, }); (useParams as jest.Mock).mockReturnValue({ detailName: ip, diff --git a/x-pack/solutions/security/plugins/security_solution/public/explore/network/pages/details/index.tsx b/x-pack/solutions/security/plugins/security_solution/public/explore/network/pages/details/index.tsx index 63fd139e69d96..edd3888953575 100644 --- a/x-pack/solutions/security/plugins/security_solution/public/explore/network/pages/details/index.tsx +++ b/x-pack/solutions/security/plugins/security_solution/public/explore/network/pages/details/index.tsx @@ -13,6 +13,7 @@ import { EuiFlexGroup, EuiFlexItem, EuiHorizontalRule, EuiSpacer } from '@elasti import { getEsQueryConfig } from '@kbn/data-plugin/common'; import { buildEsQuery } from '@kbn/es-query'; +import { dataViewSpecToViewBase } from '../../../../common/lib/kuery'; import { AlertsByStatus } from '../../../../overview/components/detection_response/alerts_by_status'; import { useSignalIndex } from '../../../../detections/containers/detection_engine/alerts/use_signal_index'; import { InputsModelId } from '../../../../common/store/inputs/constants'; @@ -105,8 +106,7 @@ const NetworkDetailsComponent: React.FC = () => { dispatch(setNetworkDetailsTablesActivePageToZero()); }, [detailName, dispatch]); - const { indicesExist, indexPattern, selectedPatterns, sourcererDataView } = - useSourcererDataView(); + const { indicesExist, selectedPatterns, sourcererDataView } = useSourcererDataView(); const ip = decodeIpv6(detailName); const networkDetailsFilter = useMemo(() => getNetworkDetailsPageFilter(ip), [ip]); @@ -115,7 +115,7 @@ const NetworkDetailsComponent: React.FC = () => { try { return [ buildEsQuery( - indexPattern, + dataViewSpecToViewBase(sourcererDataView), [query], [...networkDetailsFilter, ...globalFilters], getEsQueryConfig(uiSettings) @@ -124,7 +124,7 @@ const NetworkDetailsComponent: React.FC = () => { } catch (e) { return [undefined, e]; } - }, [globalFilters, indexPattern, networkDetailsFilter, query, uiSettings]); + }, [globalFilters, networkDetailsFilter, query, sourcererDataView, uiSettings]); const additionalFilters = useMemo( () => (rawFilteredQuery ? [rawFilteredQuery] : []), @@ -167,6 +167,10 @@ const NetworkDetailsComponent: React.FC = () => { [detailName, flowTarget] ); + const indexPattern = useMemo(() => { + return dataViewSpecToViewBase(sourcererDataView); + }, [sourcererDataView]); + return (
{indicesExist ? ( diff --git a/x-pack/solutions/security/plugins/security_solution/public/explore/network/pages/navigation/countries_query_tab_body.tsx b/x-pack/solutions/security/plugins/security_solution/public/explore/network/pages/navigation/countries_query_tab_body.tsx index e7c378f19768b..cd19ab18956c5 100644 --- a/x-pack/solutions/security/plugins/security_solution/public/explore/network/pages/navigation/countries_query_tab_body.tsx +++ b/x-pack/solutions/security/plugins/security_solution/public/explore/network/pages/navigation/countries_query_tab_body.tsx @@ -56,7 +56,6 @@ export const CountriesQueryTabBody = ({ fakeTotalCount={getOr(50, 'fakeTotalCount', pageInfo)} flowTargeted={flowTarget} id={id} - indexPattern={indexPattern} inspect={inspect} isInspect={isInspected} loading={loading} diff --git a/x-pack/solutions/security/plugins/security_solution/public/explore/network/pages/navigation/network_routes.tsx b/x-pack/solutions/security/plugins/security_solution/public/explore/network/pages/navigation/network_routes.tsx index ca9d7d4a7b085..6e49c65454239 100644 --- a/x-pack/solutions/security/plugins/security_solution/public/explore/network/pages/navigation/network_routes.tsx +++ b/x-pack/solutions/security/plugins/security_solution/public/explore/network/pages/navigation/network_routes.tsx @@ -5,12 +5,13 @@ * 2.0. */ -import React from 'react'; +import React, { useMemo } from 'react'; import { Routes, Route } from '@kbn/shared-ux-router'; import { EuiFlexItem, EuiSpacer } from '@elastic/eui'; import { TableId } from '@kbn/securitysolution-data-table'; +import { dataViewSpecToViewBase } from '../../../../common/lib/kuery'; import { FlowTargetSourceDest } from '../../../../../common/search_strategy/security_solution/network'; import { @@ -30,7 +31,9 @@ import { NetworkRouteType } from './types'; import { NETWORK_PATH } from '../../../../../common/constants'; export const NetworkRoutes = React.memo( - ({ type, to, filterQuery, isInitializing, from, indexPattern, indexNames, setQuery }) => { + ({ type, to, filterQuery, isInitializing, from, dataViewSpec, indexNames, setQuery }) => { + const index = useMemo(() => dataViewSpecToViewBase(dataViewSpec), [dataViewSpec]); + const networkAnomaliesFilterQuery = { bool: { should: [ @@ -61,7 +64,7 @@ export const NetworkRoutes = React.memo( const tabProps = { ...commonProps, - indexPattern, + indexPattern: index, }; const anomaliesProps = { diff --git a/x-pack/solutions/security/plugins/security_solution/public/explore/network/pages/navigation/types.ts b/x-pack/solutions/security/plugins/security_solution/public/explore/network/pages/navigation/types.ts index 2ed0756634707..339ad2fc71acc 100644 --- a/x-pack/solutions/security/plugins/security_solution/public/explore/network/pages/navigation/types.ts +++ b/x-pack/solutions/security/plugins/security_solution/public/explore/network/pages/navigation/types.ts @@ -5,9 +5,10 @@ * 2.0. */ -import type { DataViewBase } from '@kbn/es-query'; import type { Optional } from 'utility-types'; +import type { DataViewBase } from '@kbn/es-query'; +import type { DataViewSpec } from '@kbn/data-plugin/common'; import type { ESTermQuery } from '../../../../../common/typed_json'; import type { NavTab } from '../../../../common/components/navigation/types'; @@ -45,7 +46,7 @@ export type HttpQueryTabBodyProps = QueryTabBodyProps; export type NetworkRoutesProps = GlobalTimeArgs & { type: networkModel.NetworkType; filterQuery?: string | ESTermQuery; - indexPattern: DataViewBase; + dataViewSpec: DataViewSpec; indexNames: string[]; }; diff --git a/x-pack/solutions/security/plugins/security_solution/public/explore/network/pages/network.test.tsx b/x-pack/solutions/security/plugins/security_solution/public/explore/network/pages/network.test.tsx index acecfe9001a62..c80fb0997609c 100644 --- a/x-pack/solutions/security/plugins/security_solution/public/explore/network/pages/network.test.tsx +++ b/x-pack/solutions/security/plugins/security_solution/public/explore/network/pages/network.test.tsx @@ -227,6 +227,7 @@ describe('Network page - rendering', () => { selectedPatterns: [], indicesExist: true, indexPattern: { fields: [], title: 'title' }, + sourcererDataView: {}, }); const myStore = createMockStore(); render( diff --git a/x-pack/solutions/security/plugins/security_solution/public/explore/network/pages/network.tsx b/x-pack/solutions/security/plugins/security_solution/public/explore/network/pages/network.tsx index ef525e41a54d9..93e8b231d67cd 100644 --- a/x-pack/solutions/security/plugins/security_solution/public/explore/network/pages/network.tsx +++ b/x-pack/solutions/security/plugins/security_solution/public/explore/network/pages/network.tsx @@ -88,8 +88,7 @@ const NetworkComponent = React.memo( return globalFilters; }, [tabName, globalFilters]); - const { indicesExist, indexPattern, selectedPatterns, sourcererDataView } = - useSourcererDataView(); + const { indicesExist, selectedPatterns, sourcererDataView } = useSourcererDataView(); const onSkipFocusBeforeEventsTable = useCallback(() => { containerElement.current @@ -117,14 +116,14 @@ const NetworkComponent = React.memo( const [filterQuery, kqlError] = convertToBuildEsQuery({ config: getEsQueryConfig(kibana.services.uiSettings), - indexPattern, + dataViewSpec: sourcererDataView, queries: [query], filters: globalFilters, }); const [tabsFilterQuery] = convertToBuildEsQuery({ config: getEsQueryConfig(kibana.services.uiSettings), - indexPattern, + dataViewSpec: sourcererDataView, queries: [query], filters: tabsFilters, }); @@ -175,7 +174,7 @@ const NetworkComponent = React.memo( - {capabilitiesFetched && !isInitializing ? ( + {capabilitiesFetched && !isInitializing && sourcererDataView ? ( <> @@ -187,7 +186,7 @@ const NetworkComponent = React.memo( filterQuery={tabsFilterQuery} from={from} isInitializing={isInitializing} - indexPattern={indexPattern} + dataViewSpec={sourcererDataView} indexNames={selectedPatterns} setQuery={setQuery} type={networkModel.NetworkType.page} diff --git a/x-pack/solutions/security/plugins/security_solution/public/explore/users/pages/details/index.tsx b/x-pack/solutions/security/plugins/security_solution/public/explore/users/pages/details/index.tsx index 5f184a80574ef..8d86a92894231 100644 --- a/x-pack/solutions/security/plugins/security_solution/public/explore/users/pages/details/index.tsx +++ b/x-pack/solutions/security/plugins/security_solution/public/explore/users/pages/details/index.tsx @@ -21,6 +21,7 @@ import type { Filter } from '@kbn/es-query'; import { buildEsQuery } from '@kbn/es-query'; import { dataTableSelectors, TableId } from '@kbn/securitysolution-data-table'; import { LastEventIndexKey } from '@kbn/timelines-plugin/common'; +import { dataViewSpecToViewBase } from '../../../../common/lib/kuery'; import { useCalculateEntityRiskScore } from '../../../../entity_analytics/api/hooks/use_calculate_entity_risk_score'; import { useAssetCriticalityData, @@ -116,14 +117,13 @@ const UsersDetailsComponent: React.FC = ({ [detailName] ); - const { indicesExist, indexPattern, selectedPatterns, sourcererDataView } = - useSourcererDataView(); + const { indicesExist, selectedPatterns, sourcererDataView } = useSourcererDataView(); const [rawFilteredQuery, kqlError] = useMemo(() => { try { return [ buildEsQuery( - indexPattern, + dataViewSpecToViewBase(sourcererDataView), [query], [...usersDetailsPageFilters, ...globalFilters], getEsQueryConfig(uiSettings) @@ -132,7 +132,7 @@ const UsersDetailsComponent: React.FC = ({ } catch (e) { return [undefined, e]; } - }, [globalFilters, indexPattern, query, uiSettings, usersDetailsPageFilters]); + }, [globalFilters, sourcererDataView, query, uiSettings, usersDetailsPageFilters]); const stringifiedAdditionalFilters = JSON.stringify(rawFilteredQuery); useInvalidFilterQuery({ @@ -292,7 +292,7 @@ const UsersDetailsComponent: React.FC = ({ filterQuery={stringifiedAdditionalFilters} from={from} indexNames={selectedPatterns} - indexPattern={indexPattern} + dataViewSpec={sourcererDataView} isInitializing={isInitializing} userDetailFilter={usersDetailsPageFilters} setQuery={setQuery} diff --git a/x-pack/solutions/security/plugins/security_solution/public/explore/users/pages/details/types.ts b/x-pack/solutions/security/plugins/security_solution/public/explore/users/pages/details/types.ts index 002d1339a1898..8b531af663990 100644 --- a/x-pack/solutions/security/plugins/security_solution/public/explore/users/pages/details/types.ts +++ b/x-pack/solutions/security/plugins/security_solution/public/explore/users/pages/details/types.ts @@ -7,7 +7,8 @@ import type { ActionCreator } from 'typescript-fsa'; -import type { DataViewBase, Filter, Query } from '@kbn/es-query'; +import { type DataViewSpec } from '@kbn/data-plugin/common'; +import type { Filter, Query } from '@kbn/es-query'; import type { UsersQueryProps } from '../types'; import type { NavTab } from '../../../../common/components/navigation/types'; @@ -47,6 +48,6 @@ export type UsersDetailsTabsProps = UserBodyComponentDispatchProps & indexNames: string[]; userDetailFilter: Filter[]; filterQuery?: string; - indexPattern: DataViewBase; + dataViewSpec?: DataViewSpec; type: usersModel.UsersType; }; diff --git a/x-pack/solutions/security/plugins/security_solution/public/explore/users/pages/users.tsx b/x-pack/solutions/security/plugins/security_solution/public/explore/users/pages/users.tsx index 2078fd9e90979..c141ed7f06cf9 100644 --- a/x-pack/solutions/security/plugins/security_solution/public/explore/users/pages/users.tsx +++ b/x-pack/solutions/security/plugins/security_solution/public/explore/users/pages/users.tsx @@ -99,27 +99,26 @@ const UsersComponent = () => { return globalFilters; }, [severitySelection, tabName, globalFilters]); - const { indicesExist, indexPattern, selectedPatterns, sourcererDataView } = - useSourcererDataView(); + const { indicesExist, selectedPatterns, sourcererDataView } = useSourcererDataView(); const [globalFiltersQuery, kqlError] = useMemo( () => convertToBuildEsQuery({ config: getEsQueryConfig(uiSettings), - indexPattern, + dataViewSpec: sourcererDataView, queries: [query], filters: globalFilters, }), - [globalFilters, indexPattern, uiSettings, query] + [globalFilters, sourcererDataView, uiSettings, query] ); const [tabsFilterQuery] = useMemo( () => convertToBuildEsQuery({ config: getEsQueryConfig(uiSettings), - indexPattern, + dataViewSpec: sourcererDataView, queries: [query], filters: tabsFilters, }), - [indexPattern, query, tabsFilters, uiSettings] + [sourcererDataView, query, tabsFilters, uiSettings] ); useInvalidFilterQuery({ diff --git a/x-pack/solutions/security/plugins/security_solution/public/flyout/document_details/left/components/entities_details.test.tsx b/x-pack/solutions/security/plugins/security_solution/public/flyout/document_details/left/components/entities_details.test.tsx index d9d468649a221..f79dfcec7b27b 100644 --- a/x-pack/solutions/security/plugins/security_solution/public/flyout/document_details/left/components/entities_details.test.tsx +++ b/x-pack/solutions/security/plugins/security_solution/public/flyout/document_details/left/components/entities_details.test.tsx @@ -65,7 +65,9 @@ jest.mock('../../../../helper_hooks', () => ({ })); jest.mock('../../../../sourcerer/containers', () => ({ - useSourcererDataView: jest.fn().mockReturnValue({ selectedPatterns: ['index'] }), + useSourcererDataView: jest + .fn() + .mockReturnValue({ selectedPatterns: ['index'], sourcererDataView: {} }), })); jest.mock('../../../../common/components/ml/anomaly/anomaly_table_provider', () => ({ diff --git a/x-pack/solutions/security/plugins/security_solution/public/flyout/document_details/left/components/host_details.test.tsx b/x-pack/solutions/security/plugins/security_solution/public/flyout/document_details/left/components/host_details.test.tsx index b35a22d6e1d54..86d04a9c94a77 100644 --- a/x-pack/solutions/security/plugins/security_solution/public/flyout/document_details/left/components/host_details.test.tsx +++ b/x-pack/solutions/security/plugins/security_solution/public/flyout/document_details/left/components/host_details.test.tsx @@ -84,7 +84,9 @@ jest.mock('../../../../helper_hooks', () => ({ })); jest.mock('../../../../sourcerer/containers', () => ({ - useSourcererDataView: jest.fn().mockReturnValue({ selectedPatterns: ['index'] }), + useSourcererDataView: jest + .fn() + .mockReturnValue({ selectedPatterns: ['index'], sourcererDataView: {} }), })); jest.mock('../../../../common/components/ml/anomaly/anomaly_table_provider', () => ({ diff --git a/x-pack/solutions/security/plugins/security_solution/public/flyout/document_details/left/components/session_view.test.tsx b/x-pack/solutions/security/plugins/security_solution/public/flyout/document_details/left/components/session_view.test.tsx index d46bad45e8a43..5ec4f6f478912 100644 --- a/x-pack/solutions/security/plugins/security_solution/public/flyout/document_details/left/components/session_view.test.tsx +++ b/x-pack/solutions/security/plugins/security_solution/public/flyout/document_details/left/components/session_view.test.tsx @@ -88,8 +88,7 @@ describe('', () => { loading: false, indicesExist: true, selectedPatterns: ['index'], - indexPattern: { fields: [], title: '' }, - sourcererDataView: undefined, + sourcererDataView: {}, }); }); it('renders session view correctly', () => { diff --git a/x-pack/solutions/security/plugins/security_solution/public/flyout/document_details/left/components/user_details.test.tsx b/x-pack/solutions/security/plugins/security_solution/public/flyout/document_details/left/components/user_details.test.tsx index 2ba6345cb1663..993e9101ba0f0 100644 --- a/x-pack/solutions/security/plugins/security_solution/public/flyout/document_details/left/components/user_details.test.tsx +++ b/x-pack/solutions/security/plugins/security_solution/public/flyout/document_details/left/components/user_details.test.tsx @@ -76,7 +76,9 @@ jest.mock('../../../../common/components/ml/hooks/use_ml_capabilities'); const mockUseMlUserPermissions = useMlCapabilities as jest.Mock; jest.mock('../../../../sourcerer/containers', () => ({ - useSourcererDataView: jest.fn().mockReturnValue({ selectedPatterns: ['index'] }), + useSourcererDataView: jest + .fn() + .mockReturnValue({ selectedPatterns: ['index'], sourcererDataView: {} }), })); jest.mock('../../../../common/components/ml/anomaly/anomaly_table_provider', () => ({ diff --git a/x-pack/solutions/security/plugins/security_solution/public/flyout/document_details/left/hooks/use_threat_intelligence_details.test.ts b/x-pack/solutions/security/plugins/security_solution/public/flyout/document_details/left/hooks/use_threat_intelligence_details.test.ts index 522fd74765fd8..75b76adae787d 100644 --- a/x-pack/solutions/security/plugins/security_solution/public/flyout/document_details/left/hooks/use_threat_intelligence_details.test.ts +++ b/x-pack/solutions/security/plugins/security_solution/public/flyout/document_details/left/hooks/use_threat_intelligence_details.test.ts @@ -50,8 +50,7 @@ describe('useThreatIntelligenceDetails', () => { loading: false, indicesExist: true, selectedPatterns: [], - indexPattern: { fields: [], title: '' }, - sourcererDataView: undefined, + sourcererDataView: {}, }); jest diff --git a/x-pack/solutions/security/plugins/security_solution/public/flyout/document_details/left/hooks/use_threat_intelligence_details.ts b/x-pack/solutions/security/plugins/security_solution/public/flyout/document_details/left/hooks/use_threat_intelligence_details.ts index a7b8256b502f5..7826d98b65a3a 100644 --- a/x-pack/solutions/security/plugins/security_solution/public/flyout/document_details/left/hooks/use_threat_intelligence_details.ts +++ b/x-pack/solutions/security/plugins/security_solution/public/flyout/document_details/left/hooks/use_threat_intelligence_details.ts @@ -71,7 +71,7 @@ export const useThreatIntelligenceDetails = (): ThreatIntelligenceDetailsResult const [isEventDataLoading, eventData] = useTimelineEventsDetails({ indexName, eventId, - runtimeMappings: sourcererDataView.sourcererDataView?.runtimeFieldMap as RunTimeMappings, + runtimeMappings: sourcererDataView.sourcererDataView.runtimeFieldMap as RunTimeMappings, skip: !eventId, }); diff --git a/x-pack/solutions/security/plugins/security_solution/public/flyout/document_details/shared/hooks/use_event_details.test.tsx b/x-pack/solutions/security/plugins/security_solution/public/flyout/document_details/shared/hooks/use_event_details.test.tsx index 6e4cab20f013c..4582469fbd9cc 100644 --- a/x-pack/solutions/security/plugins/security_solution/public/flyout/document_details/shared/hooks/use_event_details.test.tsx +++ b/x-pack/solutions/security/plugins/security_solution/public/flyout/document_details/shared/hooks/use_event_details.test.tsx @@ -53,6 +53,7 @@ describe('useEventDetails', () => { (useSourcererDataView as jest.Mock).mockReturnValue({ browserFields: {}, indexPattern: {}, + sourcererDataView: {}, }); (useTimelineEventsDetails as jest.Mock).mockReturnValue([false, [], {}, {}, jest.fn()]); jest.mocked(useGetFieldsData).mockReturnValue({ getFieldsData: (field: string) => field }); @@ -63,7 +64,6 @@ describe('useEventDetails', () => { expect(hookResult.result.current.dataAsNestedObject).toEqual({}); expect(hookResult.result.current.dataFormattedForFieldBrowser).toEqual([]); expect(hookResult.result.current.getFieldsData('test')).toEqual('test'); - expect(hookResult.result.current.indexPattern).toEqual({}); expect(hookResult.result.current.loading).toEqual(false); expect(hookResult.result.current.refetchFlyoutData()).toEqual(undefined); expect(hookResult.result.current.searchHit).toEqual({}); diff --git a/x-pack/solutions/security/plugins/security_solution/public/flyout/document_details/shared/hooks/use_event_details.ts b/x-pack/solutions/security/plugins/security_solution/public/flyout/document_details/shared/hooks/use_event_details.ts index 40acb8690ce64..3c2f4b7acb745 100644 --- a/x-pack/solutions/security/plugins/security_solution/public/flyout/document_details/shared/hooks/use_event_details.ts +++ b/x-pack/solutions/security/plugins/security_solution/public/flyout/document_details/shared/hooks/use_event_details.ts @@ -8,7 +8,6 @@ import type { BrowserFields, TimelineEventsDetailsItem } from '@kbn/timelines-plugin/common'; import type { EcsSecurityExtension as Ecs } from '@kbn/securitysolution-ecs'; import { SecurityPageName } from '@kbn/security-solution-navigation'; -import type { DataViewBase } from '@kbn/es-query'; import { DEFAULT_ALERTS_INDEX, DEFAULT_PREVIEW_INDEX } from '../../../../../common/constants'; import type { RunTimeMappings } from '../../../../../common/api/search_strategy'; import { useSpaceId } from '../../../../common/hooks/use_space_id'; @@ -63,10 +62,6 @@ export interface UseEventDetailsResult { * Retrieves searchHit values for the provided field */ getFieldsData: GetFieldsData; - /** - * Index pattern for rule details - */ - indexPattern: DataViewBase; /** * Whether the data is loading */ @@ -102,7 +97,7 @@ export const useEventDetails = ({ useTimelineEventsDetails({ indexName: eventIndex, eventId: eventId ?? '', - runtimeMappings: sourcererDataView?.sourcererDataView?.runtimeFieldMap as RunTimeMappings, + runtimeMappings: sourcererDataView.sourcererDataView.runtimeFieldMap as RunTimeMappings, skip: !eventId, }); const { getFieldsData } = useGetFieldsData({ fieldsData: searchHit?.fields }); @@ -112,7 +107,6 @@ export const useEventDetails = ({ dataAsNestedObject, dataFormattedForFieldBrowser, getFieldsData, - indexPattern: sourcererDataView.indexPattern, loading, refetchFlyoutData, searchHit, diff --git a/x-pack/solutions/security/plugins/security_solution/public/flyout/network_details/components/network_details.tsx b/x-pack/solutions/security/plugins/security_solution/public/flyout/network_details/components/network_details.tsx index 2e9a99683902f..4d6f85c7012da 100644 --- a/x-pack/solutions/security/plugins/security_solution/public/flyout/network_details/components/network_details.tsx +++ b/x-pack/solutions/security/plugins/security_solution/public/flyout/network_details/components/network_details.tsx @@ -73,10 +73,10 @@ export const NetworkDetails = ({ ip, flowTarget }: NetworkDetailsProps) => { services: { uiSettings }, } = useKibana(); - const { indicesExist, indexPattern, selectedPatterns } = useSourcererDataView(); + const { indicesExist, sourcererDataView, selectedPatterns } = useSourcererDataView(); const [filterQuery, kqlError] = convertToBuildEsQuery({ config: getEsQueryConfig(uiSettings), - indexPattern, + dataViewSpec: sourcererDataView, queries: [query], filters, }); diff --git a/x-pack/solutions/security/plugins/security_solution/public/kubernetes/pages/index.tsx b/x-pack/solutions/security/plugins/security_solution/public/kubernetes/pages/index.tsx index c2d84e543dc0f..55c8a4472379b 100644 --- a/x-pack/solutions/security/plugins/security_solution/public/kubernetes/pages/index.tsx +++ b/x-pack/solutions/security/plugins/security_solution/public/kubernetes/pages/index.tsx @@ -25,12 +25,13 @@ import { convertToBuildEsQuery } from '../../common/lib/kuery'; import { useInvalidFilterQuery } from '../../common/hooks/use_invalid_filter_query'; import { SessionsView } from '../../common/components/sessions_viewer'; import { kubernetesSessionsHeaders } from './constants'; +import { dataViewSpecToIndexPattern } from './utils/data_view_spec_to_index_pattern'; export const KubernetesContainer = React.memo(() => { const { kubernetesSecurity, uiSettings } = useKibana().services; const { globalFullScreen } = useGlobalFullScreen(); - const { indexPattern, sourcererDataView, dataViewId } = useSourcererDataView(); + const { sourcererDataView, dataViewId } = useSourcererDataView(); const { from, to } = useGlobalTime(); const getGlobalFiltersQuerySelector = useMemo( @@ -45,11 +46,11 @@ export const KubernetesContainer = React.memo(() => { () => convertToBuildEsQuery({ config: getEsQueryConfig(uiSettings), - indexPattern, + dataViewSpec: sourcererDataView, queries: [query], filters, }), - [filters, indexPattern, uiSettings, query] + [filters, sourcererDataView, uiSettings, query] ); useInvalidFilterQuery({ @@ -84,7 +85,7 @@ export const KubernetesContainer = React.memo(() => { ), - indexPattern, + indexPattern: dataViewSpecToIndexPattern(sourcererDataView), globalFilter: { filterQuery, startDate: from, diff --git a/x-pack/solutions/security/plugins/security_solution/public/kubernetes/pages/utils/data_view_spec_to_index_pattern.ts b/x-pack/solutions/security/plugins/security_solution/public/kubernetes/pages/utils/data_view_spec_to_index_pattern.ts new file mode 100644 index 0000000000000..f4cb604ec3d8f --- /dev/null +++ b/x-pack/solutions/security/plugins/security_solution/public/kubernetes/pages/utils/data_view_spec_to_index_pattern.ts @@ -0,0 +1,15 @@ +/* + * 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 type { DataViewSpec } from '@kbn/data-plugin/common'; +import type { IndexPattern } from '@kbn/kubernetes-security-plugin/public/types'; + +export const dataViewSpecToIndexPattern = ( + dataViewSpec?: DataViewSpec +): IndexPattern | undefined => { + return dataViewSpec as IndexPattern | undefined; +}; diff --git a/x-pack/solutions/security/plugins/security_solution/public/overview/components/event_counts/index.test.tsx b/x-pack/solutions/security/plugins/security_solution/public/overview/components/event_counts/index.test.tsx index 843c5250bf26c..f061ead1073ae 100644 --- a/x-pack/solutions/security/plugins/security_solution/public/overview/components/event_counts/index.test.tsx +++ b/x-pack/solutions/security/plugins/security_solution/public/overview/components/event_counts/index.test.tsx @@ -8,7 +8,7 @@ import { render } from '@testing-library/react'; import React from 'react'; -import { mockIndexPattern, TestProviders } from '../../../common/mock'; +import { mockDataViewSpec, TestProviders } from '../../../common/mock'; import { OverviewHost } from '../overview_host'; import { OverviewNetwork } from '../overview_network'; @@ -35,7 +35,7 @@ describe('EventCounts', () => { filters: [], from, indexNames: [], - indexPattern: mockIndexPattern, + dataViewSpec: mockDataViewSpec, setQuery: jest.fn(), to, query: { diff --git a/x-pack/solutions/security/plugins/security_solution/public/overview/components/event_counts/index.tsx b/x-pack/solutions/security/plugins/security_solution/public/overview/components/event_counts/index.tsx index 34692b8cc12d3..3f20d3365537f 100644 --- a/x-pack/solutions/security/plugins/security_solution/public/overview/components/event_counts/index.tsx +++ b/x-pack/solutions/security/plugins/security_solution/public/overview/components/event_counts/index.tsx @@ -8,8 +8,8 @@ import { EuiFlexGroup, EuiFlexItem } from '@elastic/eui'; import React, { useMemo } from 'react'; -import type { DataViewBase, Filter, Query } from '@kbn/es-query'; -import { getEsQueryConfig } from '@kbn/data-plugin/common'; +import type { Filter, Query } from '@kbn/es-query'; +import { type DataViewSpec, getEsQueryConfig } from '@kbn/data-plugin/common'; import { ID as OverviewHostQueryId } from '../../containers/overview_host'; import { OverviewHost } from '../overview_host'; import { OverviewNetwork } from '../overview_network'; @@ -26,7 +26,7 @@ import { SecurityPageName } from '../../../../common/constants'; interface Props extends Pick { filters: Filter[]; indexNames: string[]; - indexPattern: DataViewBase; + dataViewSpec?: DataViewSpec; query: Query; } @@ -34,7 +34,7 @@ const EventCountsComponent: React.FC = ({ filters, from, indexNames, - indexPattern, + dataViewSpec, query, setQuery, to, @@ -45,22 +45,22 @@ const EventCountsComponent: React.FC = ({ () => convertToBuildEsQuery({ config: getEsQueryConfig(uiSettings), - indexPattern, + dataViewSpec, queries: [query], filters: [...filters, ...fieldNameExistsFilter(SecurityPageName.hosts)], }), - [filters, indexPattern, query, uiSettings] + [dataViewSpec, filters, query, uiSettings] ); const [networkFilterQuery] = useMemo( () => convertToBuildEsQuery({ config: getEsQueryConfig(uiSettings), - indexPattern, + dataViewSpec, queries: [query], filters: [...filters, ...sourceOrDestinationIpExistsFilter], }), - [filters, indexPattern, uiSettings, query] + [uiSettings, dataViewSpec, query, filters] ); useInvalidFilterQuery({ diff --git a/x-pack/solutions/security/plugins/security_solution/public/overview/components/events_by_dataset/index.tsx b/x-pack/solutions/security/plugins/security_solution/public/overview/components/events_by_dataset/index.tsx index f53e552c7537c..a37e6adda8ad5 100644 --- a/x-pack/solutions/security/plugins/security_solution/public/overview/components/events_by_dataset/index.tsx +++ b/x-pack/solutions/security/plugins/security_solution/public/overview/components/events_by_dataset/index.tsx @@ -9,9 +9,10 @@ import { Position } from '@elastic/charts'; import numeral from '@elastic/numeral'; import React, { useEffect, useMemo, useCallback } from 'react'; -import type { DataViewBase, Filter, Query } from '@kbn/es-query'; +import type { Filter, Query } from '@kbn/es-query'; import styled from '@emotion/styled'; import { EuiButton } from '@elastic/eui'; +import type { DataViewSpec } from '@kbn/data-plugin/common'; import { getEsQueryConfig } from '@kbn/data-plugin/common'; import { DEFAULT_NUMBER_FORMAT, APP_UI_ID } from '../../../../common/constants'; import { SHOWING, UNIT } from '../../../common/components/events_viewer/translations'; @@ -46,7 +47,7 @@ interface Props extends Pick { filterQuery?: string; filters: Filter[]; headerChildren?: React.ReactNode; - indexPattern: DataViewBase; + dataViewSpec?: DataViewSpec; onlyField?: string; paddingSize?: 's' | 'm' | 'l' | 'none'; query: Query; @@ -76,7 +77,7 @@ const EventsByDatasetComponent: React.FC = ({ filters, from, headerChildren, - indexPattern, + dataViewSpec, onlyField, paddingSize, query, @@ -129,13 +130,13 @@ const EventsByDatasetComponent: React.FC = ({ if (filterQueryFromProps == null) { return convertToBuildEsQuery({ config: getEsQueryConfig(kibana.services.uiSettings), - indexPattern, + dataViewSpec, queries: [query], filters, }); } return [filterQueryFromProps]; - }, [filterQueryFromProps, kibana, indexPattern, query, filters]); + }, [filterQueryFromProps, kibana.services.uiSettings, dataViewSpec, query, filters]); useInvalidFilterQuery({ id: uniqueQueryId, diff --git a/x-pack/solutions/security/plugins/security_solution/public/overview/pages/overview.tsx b/x-pack/solutions/security/plugins/security_solution/public/overview/pages/overview.tsx index 6bee36dfdbb6f..ea1f5321a87db 100644 --- a/x-pack/solutions/security/plugins/security_solution/public/overview/pages/overview.tsx +++ b/x-pack/solutions/security/plugins/security_solution/public/overview/pages/overview.tsx @@ -50,8 +50,7 @@ const OverviewComponent = () => { const filters = useDeepEqualSelector(getGlobalFiltersQuerySelector); const { from, deleteQuery, setQuery, to } = useGlobalTime(); - const { indicesExist, sourcererDataView, indexPattern, selectedPatterns } = - useSourcererDataView(); + const { indicesExist, sourcererDataView, selectedPatterns } = useSourcererDataView(); const endpointMetadataIndex = useMemo(() => { return [ENDPOINT_METADATA_INDEX]; @@ -114,7 +113,7 @@ const OverviewComponent = () => { deleteQuery={deleteQuery} filters={filters} from={from} - indexPattern={indexPattern} + dataViewSpec={sourcererDataView} query={query} queryType="overview" to={to} @@ -126,7 +125,7 @@ const OverviewComponent = () => { filters={filters} from={from} indexNames={selectedPatterns} - indexPattern={indexPattern} + dataViewSpec={sourcererDataView} query={query} setQuery={setQuery} to={to} diff --git a/x-pack/solutions/security/plugins/security_solution/public/sourcerer/components/alerts_sourcerer.test.tsx b/x-pack/solutions/security/plugins/security_solution/public/sourcerer/components/alerts_sourcerer.test.tsx index 60bbe58824e41..619f7e91eae82 100644 --- a/x-pack/solutions/security/plugins/security_solution/public/sourcerer/components/alerts_sourcerer.test.tsx +++ b/x-pack/solutions/security/plugins/security_solution/public/sourcerer/components/alerts_sourcerer.test.tsx @@ -72,6 +72,7 @@ describe('sourcerer on alerts page or rules details page', () => { (useSourcererDataView as jest.Mock).mockReturnValue({ ...sourcererDataView, indicesExist: true, + sourcererDataView: {}, }); render( diff --git a/x-pack/solutions/security/plugins/security_solution/public/sourcerer/components/index.tsx b/x-pack/solutions/security/plugins/security_solution/public/sourcerer/components/index.tsx index 8b45d96669793..ad5a939b69995 100644 --- a/x-pack/solutions/security/plugins/security_solution/public/sourcerer/components/index.tsx +++ b/x-pack/solutions/security/plugins/security_solution/public/sourcerer/components/index.tsx @@ -152,8 +152,8 @@ export const Sourcerer = React.memo(({ scope: scopeId } const { indicesExist, loading, sourcererDataView } = useSourcererDataView(scopeId); const activePatterns = useMemo( - () => (sourcererDataView?.title || '')?.split(',').filter(Boolean) as string[], - [sourcererDataView?.title] + () => (sourcererDataView.title || '')?.split(',').filter(Boolean) as string[], + [sourcererDataView.title] ); const [missingPatterns, setMissingPatterns] = useState( diff --git a/x-pack/solutions/security/plugins/security_solution/public/sourcerer/components/sourcerer_integration.test.tsx b/x-pack/solutions/security/plugins/security_solution/public/sourcerer/components/sourcerer_integration.test.tsx index d43a3a47ed267..5f21a814da363 100644 --- a/x-pack/solutions/security/plugins/security_solution/public/sourcerer/components/sourcerer_integration.test.tsx +++ b/x-pack/solutions/security/plugins/security_solution/public/sourcerer/components/sourcerer_integration.test.tsx @@ -72,6 +72,7 @@ const patternListNoSignals = sortWithExcludesAtEnd( const sourcererDataView = { indicesExist: true, loading: false, + sourcererDataView: {}, }; describe('Sourcerer integration tests', () => { diff --git a/x-pack/solutions/security/plugins/security_solution/public/sourcerer/components/timeline_sourcerer.test.tsx b/x-pack/solutions/security/plugins/security_solution/public/sourcerer/components/timeline_sourcerer.test.tsx index ff86241164631..35a26856f4930 100644 --- a/x-pack/solutions/security/plugins/security_solution/public/sourcerer/components/timeline_sourcerer.test.tsx +++ b/x-pack/solutions/security/plugins/security_solution/public/sourcerer/components/timeline_sourcerer.test.tsx @@ -56,6 +56,7 @@ const { id } = mockGlobalState.sourcerer.defaultDataView; const sourcererDataView = { indicesExist: true, loading: false, + sourcererDataView: {}, }; describe('timeline sourcerer', () => { diff --git a/x-pack/solutions/security/plugins/security_solution/public/sourcerer/components/use_get_sourcerer_data_view.test.ts b/x-pack/solutions/security/plugins/security_solution/public/sourcerer/components/use_get_sourcerer_data_view.test.ts index 977ee35310031..bf687fa361db5 100644 --- a/x-pack/solutions/security/plugins/security_solution/public/sourcerer/components/use_get_sourcerer_data_view.test.ts +++ b/x-pack/solutions/security/plugins/security_solution/public/sourcerer/components/use_get_sourcerer_data_view.test.ts @@ -37,7 +37,7 @@ describe('useGetScopedSourcererDataView', () => { it('should return undefined when no spec is provided', () => { mockGetSourcererDataView.mockReturnValueOnce({ ...mockSourcererScope, - sourcererDataView: undefined, + sourcererDataView: {}, }); const { result } = renderHookCustom({ sourcererScope: SourcererScopeName.timeline }); expect(result.current).toBeUndefined(); @@ -45,7 +45,7 @@ describe('useGetScopedSourcererDataView', () => { it('should return undefined when no spec is provided and should update the return when spec is updated to correct value', () => { mockGetSourcererDataView.mockReturnValueOnce({ ...mockSourcererScope, - sourcererDataView: undefined, + sourcererDataView: {}, }); const { rerender, result } = renderHookCustom({ sourcererScope: SourcererScopeName.timeline }); expect(result.current).toBeUndefined(); diff --git a/x-pack/solutions/security/plugins/security_solution/public/sourcerer/components/use_get_sourcerer_data_view.tsx b/x-pack/solutions/security/plugins/security_solution/public/sourcerer/components/use_get_sourcerer_data_view.tsx index 869b9d68e27ac..52b5ca9717e8d 100644 --- a/x-pack/solutions/security/plugins/security_solution/public/sourcerer/components/use_get_sourcerer_data_view.tsx +++ b/x-pack/solutions/security/plugins/security_solution/public/sourcerer/components/use_get_sourcerer_data_view.tsx @@ -30,7 +30,7 @@ export const useGetScopedSourcererDataView = ({ const { sourcererDataView } = useSourcererDataView(sourcererScope); const dataView = useMemo(() => { - if (sourcererDataView) { + if (Object.keys(sourcererDataView).length) { return new DataView({ spec: sourcererDataView, fieldFormats }); } else { return undefined; diff --git a/x-pack/solutions/security/plugins/security_solution/public/sourcerer/containers/hooks.test.tsx b/x-pack/solutions/security/plugins/security_solution/public/sourcerer/containers/hooks.test.tsx index c1c6c46b4cd92..e74a117403f8c 100644 --- a/x-pack/solutions/security/plugins/security_solution/public/sourcerer/containers/hooks.test.tsx +++ b/x-pack/solutions/security/plugins/security_solution/public/sourcerer/containers/hooks.test.tsx @@ -649,7 +649,6 @@ describe('Sourcerer Hooks', () => { '-filebeat-*', '-packetbeat-*', ]); - expect(result.current.indexPattern).toHaveProperty('getName'); }); }); @@ -658,7 +657,7 @@ describe('Sourcerer Hooks', () => { wrapper: StoreProvider, }); - expect(result.current.sourcererDataView?.title).toBe( + expect(result.current.sourcererDataView.title).toBe( 'apm-*-transaction*,auditbeat-*,endgame-*,filebeat-*,logs-*,packetbeat-*,traces-apm*,winlogbeat-*,-*elastic-cloud-logs-*' ); @@ -675,8 +674,8 @@ describe('Sourcerer Hooks', () => { rerender(); - expect(result.current.sourcererDataView?.title).toBe(testPatterns.join(',')); - expect(result.current.sourcererDataView?.name).toBe(testPatterns.join(',')); + expect(result.current.sourcererDataView.title).toBe(testPatterns.join(',')); + expect(result.current.sourcererDataView.name).toBe(testPatterns.join(',')); }); }); }); diff --git a/x-pack/solutions/security/plugins/security_solution/public/sourcerer/containers/index.tsx b/x-pack/solutions/security/plugins/security_solution/public/sourcerer/containers/index.tsx index 621141cccfb26..ba4e0eced4dd3 100644 --- a/x-pack/solutions/security/plugins/security_solution/public/sourcerer/containers/index.tsx +++ b/x-pack/solutions/security/plugins/security_solution/public/sourcerer/containers/index.tsx @@ -7,6 +7,7 @@ import { useCallback, useEffect, useMemo, useState } from 'react'; import { useSelector } from 'react-redux'; +import type { FieldSpec } from '@kbn/data-plugin/common'; import { sourcererSelectors } from '../store'; import type { SelectedDataView, SourcererDataView, RunTimeMappings } from '../store/model'; import { SourcererScopeName } from '../store/model'; @@ -56,8 +57,7 @@ export const useSourcererDataView = ( id: fetchIndexReturn.dataView?.id ?? null, loading: indexPatternsLoading, patternList: fetchIndexReturn.indexes, - indexFields: fetchIndexReturn.indexPatterns - .fields as SelectedDataView['indexPattern']['fields'], + indexFields: fetchIndexReturn.indexPatterns.fields as FieldSpec[], fields: fetchIndexReturn.dataView?.fields, }), [fetchIndexReturn, indexPatternsLoading] @@ -120,28 +120,12 @@ export const useSourcererDataView = ( () => ({ browserFields: browserFields(), dataViewId: sourcererDataView.id, - indexPattern: { - fields: Object.values(sourcererDataView.fields || {}), - title: selectedPatterns.join(','), - getName: () => selectedPatterns.join(','), - }, indicesExist, loading: loading || sourcererDataView.loading, - // all active & inactive patterns in DATA_VIEW - patternList: sourcererDataView.title.split(','), // selected patterns in DATA_VIEW including filter selectedPatterns, - // if we have to do an update to data view, tell us which patterns are active - ...(legacyPatterns.length > 0 ? { activePatterns: sourcererDataView.patternList } : {}), sourcererDataView: sourcererDataView.dataView, }), - [ - browserFields, - sourcererDataView, - selectedPatterns, - indicesExist, - loading, - legacyPatterns.length, - ] + [browserFields, sourcererDataView, selectedPatterns, indicesExist, loading] ); }; diff --git a/x-pack/solutions/security/plugins/security_solution/public/sourcerer/containers/mocks.ts b/x-pack/solutions/security/plugins/security_solution/public/sourcerer/containers/mocks.ts index 283f41bc8be67..4d331ebab65ff 100644 --- a/x-pack/solutions/security/plugins/security_solution/public/sourcerer/containers/mocks.ts +++ b/x-pack/solutions/security/plugins/security_solution/public/sourcerer/containers/mocks.ts @@ -38,19 +38,6 @@ export const mockSourcererScope: SelectedDataView = { }, }, }, - indexPattern: { - fields: [ - { - aggregatable: false, - esTypes: undefined, - name: '_id', - searchable: true, - subType: undefined, - type: 'string', - }, - ], - title: mockPatterns.join(), - }, sourcererDataView: mockGlobalState.sourcerer.defaultDataView, selectedPatterns: mockPatterns, indicesExist: true, diff --git a/x-pack/solutions/security/plugins/security_solution/public/sourcerer/store/model.ts b/x-pack/solutions/security/plugins/security_solution/public/sourcerer/store/model.ts index 3b3f8c56b261c..807c74a9c3f8f 100644 --- a/x-pack/solutions/security/plugins/security_solution/public/sourcerer/store/model.ts +++ b/x-pack/solutions/security/plugins/security_solution/public/sourcerer/store/model.ts @@ -9,7 +9,6 @@ import type { BrowserFields } from '@kbn/timelines-plugin/common'; import { EMPTY_BROWSER_FIELDS } from '@kbn/timelines-plugin/common'; import type { DataViewSpec } from '@kbn/data-views-plugin/public'; import type { RuntimeFieldSpec, RuntimePrimitiveTypes } from '@kbn/data-views-plugin/common'; -import type { SecuritySolutionDataViewBase } from '../../common/types'; /** Uniquely identifies a Sourcerer Scope */ export enum SourcererScopeName { @@ -88,11 +87,6 @@ export interface SelectedDataView { */ browserFields: BrowserFields; dataViewId: string | null; // null if legacy pre-8.0 timeline - /** - * @deprecated use sourcererDataView - * DataViewBase with enhanced index fields used in timelines - */ - indexPattern: SecuritySolutionDataViewBase; /** do the selected indices exist */ indicesExist: boolean; /** is an update being made to the data view */ @@ -103,7 +97,7 @@ export interface SelectedDataView { * Easier to add this additional data rather than * try to extend the SelectedDataView type from DataView. */ - sourcererDataView: DataViewSpec | undefined; + sourcererDataView: DataViewSpec; } /** diff --git a/x-pack/solutions/security/plugins/security_solution/public/timelines/components/modal/actions/open_timeline_button.test.tsx b/x-pack/solutions/security/plugins/security_solution/public/timelines/components/modal/actions/open_timeline_button.test.tsx index e36d1ba83f2fc..9ce4e70ce2edd 100644 --- a/x-pack/solutions/security/plugins/security_solution/public/timelines/components/modal/actions/open_timeline_button.test.tsx +++ b/x-pack/solutions/security/plugins/security_solution/public/timelines/components/modal/actions/open_timeline_button.test.tsx @@ -63,7 +63,11 @@ describe('OpenTimelineButton', () => { it('should open the modal after clicking on the button', async () => { (useParams as jest.Mock).mockReturnValue({ tabName: TimelineTypeEnum.template }); (useStartTransaction as jest.Mock).mockReturnValue({ startTransaction: jest.fn() }); - (useSourcererDataView as jest.Mock).mockReturnValue({ dataViewId: '', selectedPatterns: [] }); + (useSourcererDataView as jest.Mock).mockReturnValue({ + dataViewId: '', + selectedPatterns: [], + sourcererDataView: {}, + }); (useTimelineStatus as jest.Mock).mockReturnValue({ timelineStatus: 'active', templateTimelineFilter: null, diff --git a/x-pack/solutions/security/plugins/security_solution/public/timelines/components/modal/header/index.test.tsx b/x-pack/solutions/security/plugins/security_solution/public/timelines/components/modal/header/index.test.tsx index 1816fb47a102a..793cd12f99451 100644 --- a/x-pack/solutions/security/plugins/security_solution/public/timelines/components/modal/header/index.test.tsx +++ b/x-pack/solutions/security/plugins/security_solution/public/timelines/components/modal/header/index.test.tsx @@ -59,6 +59,7 @@ describe('TimelineModalHeader', () => { (useSourcererDataView as jest.Mock).mockReturnValue({ browserFields: {}, indexPattern: { fields: [], title: '' }, + sourcererDataView: {}, }); const { getByTestId, getByText } = renderTimelineModalHeader(); @@ -78,6 +79,7 @@ describe('TimelineModalHeader', () => { (useSourcererDataView as jest.Mock).mockReturnValue({ browserFields: {}, indexPattern: { fields: [], title: '' }, + sourcererDataView: {}, }); (useKibana as jest.Mock).mockReturnValue({ services: { @@ -107,6 +109,7 @@ describe('TimelineModalHeader', () => { (useSourcererDataView as jest.Mock).mockReturnValue({ browserFields: {}, indexPattern: { fields: [], title: '' }, + sourcererDataView: {}, }); const spy = jest.spyOn(timelineActions, 'showTimeline'); diff --git a/x-pack/solutions/security/plugins/security_solution/public/timelines/components/modal/header/index.tsx b/x-pack/solutions/security/plugins/security_solution/public/timelines/components/modal/header/index.tsx index 9477bef2b2904..88d959a1804e9 100644 --- a/x-pack/solutions/security/plugins/security_solution/public/timelines/components/modal/header/index.tsx +++ b/x-pack/solutions/security/plugins/security_solution/public/timelines/components/modal/header/index.tsx @@ -70,7 +70,7 @@ interface FlyoutHeaderPanelProps { export const TimelineModalHeader = React.memo( ({ timelineId, openToggleRef }) => { const dispatch = useDispatch(); - const { browserFields, indexPattern } = useSourcererDataView(SourcererScopeName.timeline); + const { browserFields, sourcererDataView } = useSourcererDataView(SourcererScopeName.timeline); const { cases, uiSettings } = useKibana().services; const esQueryConfig = useMemo(() => getEsQueryConfig(uiSettings), [uiSettings]); const userCasesPermissions = useMemo(() => cases.helpers.canUseCases([APP_ID]), [cases]); @@ -88,13 +88,21 @@ export const TimelineModalHeader = React.memo( combineQueries({ config: esQueryConfig, dataProviders, - indexPattern, + dataViewSpec: sourcererDataView, browserFields, filters: filters ? filters : [], kqlQuery: kqlQueryObj, kqlMode, }), - [browserFields, dataProviders, esQueryConfig, filters, indexPattern, kqlMode, kqlQueryObj] + [ + browserFields, + dataProviders, + esQueryConfig, + filters, + kqlMode, + kqlQueryObj, + sourcererDataView, + ] ); const isInspectDisabled = !isDataInTimeline || combinedQueries?.filterQuery === undefined; diff --git a/x-pack/solutions/security/plugins/security_solution/public/timelines/components/timeline/kpi/kpi_container.tsx b/x-pack/solutions/security/plugins/security_solution/public/timelines/components/timeline/kpi/kpi_container.tsx index 47d79c1ba71c3..6b95b0ac1cf63 100644 --- a/x-pack/solutions/security/plugins/security_solution/public/timelines/components/timeline/kpi/kpi_container.tsx +++ b/x-pack/solutions/security/plugins/security_solution/public/timelines/components/timeline/kpi/kpi_container.tsx @@ -32,7 +32,7 @@ interface KpiExpandedProps { } export const TimelineKpisContainer = ({ timelineId }: KpiExpandedProps) => { - const { browserFields, indexPattern, selectedPatterns } = useSourcererDataView( + const { browserFields, sourcererDataView, selectedPatterns } = useSourcererDataView( SourcererScopeName.timeline ); @@ -82,13 +82,13 @@ export const TimelineKpisContainer = ({ timelineId }: KpiExpandedProps) => { combineQueries({ config: esQueryConfig, dataProviders, - indexPattern, + dataViewSpec: sourcererDataView, browserFields, filters: filters ? filters : [], kqlQuery, kqlMode, }), - [browserFields, dataProviders, esQueryConfig, filters, indexPattern, kqlMode, kqlQuery] + [browserFields, dataProviders, esQueryConfig, filters, sourcererDataView, kqlMode, kqlQuery] ); const isBlankTimeline: boolean = useMemo( diff --git a/x-pack/solutions/security/plugins/security_solution/public/timelines/components/timeline/query_bar/index.tsx b/x-pack/solutions/security/plugins/security_solution/public/timelines/components/timeline/query_bar/index.tsx index 3ac5ba0cb5ac8..1bb39aa4796d2 100644 --- a/x-pack/solutions/security/plugins/security_solution/public/timelines/components/timeline/query_bar/index.tsx +++ b/x-pack/solutions/security/plugins/security_solution/public/timelines/components/timeline/query_bar/index.tsx @@ -17,7 +17,10 @@ import { InputsModelId } from '../../../../common/store/inputs/constants'; import { useSourcererDataView } from '../../../../sourcerer/containers'; import { SourcererScopeName } from '../../../../sourcerer/store/model'; -import { convertKueryToElasticSearchQuery } from '../../../../common/lib/kuery'; +import { + convertKueryToElasticSearchQuery, + dataViewSpecToViewBase, +} from '../../../../common/lib/kuery'; import type { KqlMode } from '../../../store/model'; import { useSavedQueryServices } from '../../../../common/utils/saved_query_services'; import type { DispatchUpdateReduxTime } from '../../../../common/components/super_date_picker'; @@ -107,7 +110,7 @@ export const QueryBarTimeline = memo( const [dateRangeTo, setDateRangTo] = useState( toStr != null ? toStr : new Date(to).toISOString() ); - const { browserFields, indexPattern } = useSourcererDataView(SourcererScopeName.timeline); + const { browserFields, sourcererDataView } = useSourcererDataView(SourcererScopeName.timeline); const [savedQuery, setSavedQuery] = useState(undefined); const [filterQueryConverted, setFilterQueryConverted] = useState({ query: filterQuery != null ? filterQuery.expression : '', @@ -115,6 +118,11 @@ export const QueryBarTimeline = memo( }); const queryBarFilters = useMemo(() => getNonDropAreaFilters(filters), [filters]); + const indexPattern = useMemo( + () => dataViewSpecToViewBase(sourcererDataView), + [sourcererDataView] + ); + const [dataProvidersDsl, setDataProvidersDsl] = useState( convertKueryToElasticSearchQuery(buildGlobalQuery(dataProviders, browserFields), indexPattern) ); @@ -259,6 +267,10 @@ export const QueryBarTimeline = memo( [dataProvidersDsl, savedQueryId, savedQueryServices] ); + if (!indexPattern) { + return null; + } + return ( ( services: { data }, } = useKibana(); - const { indexPattern } = useSourcererDataView(SourcererScopeName.timeline); + const { sourcererDataView } = useSourcererDataView(SourcererScopeName.timeline); const getIsDataProviderVisible = useMemo( () => timelineSelectors.dataProviderVisibilitySelector(), @@ -86,25 +86,22 @@ const StatefulSearchOrFilterComponent = React.memo( useEffect(() => { let dv: DataView; - if (isDataView(indexPattern)) { - setDataView(indexPattern); - } else if (!filterQuery) { - const createDataView = async () => { - try { - dv = await data.dataViews.create({ title: indexPattern.title }); - setDataView(dv); - } catch (error) { - addError(error, { title: i18n.ERROR_PROCESSING_INDEX_PATTERNS }); - } - }; - createDataView(); - } + const createDataView = async () => { + try { + dv = await data.dataViews.create(sourcererDataView); + setDataView(dv); + } catch (error) { + addError(error, { title: i18n.ERROR_PROCESSING_INDEX_PATTERNS }); + } + }; + createDataView(); + return () => { if (dv?.id) { data.dataViews.clearInstanceCache(dv?.id); } }; - }, [data.dataViews, indexPattern, filterQuery, addError]); + }, [data.dataViews, filterQuery, addError, sourcererDataView]); const arrDataView = useMemo(() => (dataView != null ? [dataView] : []), [dataView]); diff --git a/x-pack/solutions/security/plugins/security_solution/public/timelines/components/timeline/tabs/pinned/index.tsx b/x-pack/solutions/security/plugins/security_solution/public/timelines/components/timeline/tabs/pinned/index.tsx index a9d08764779f5..33e1807f90686 100644 --- a/x-pack/solutions/security/plugins/security_solution/public/timelines/components/timeline/tabs/pinned/index.tsx +++ b/x-pack/solutions/security/plugins/security_solution/public/timelines/components/timeline/tabs/pinned/index.tsx @@ -148,7 +148,7 @@ export const PinnedTabContentComponent: React.FC = ({ fields: timelineQueryFields, limit: itemsPerPage, filterQuery, - runtimeMappings: sourcererDataView?.runtimeFieldMap as RunTimeMappings, + runtimeMappings: sourcererDataView.runtimeFieldMap as RunTimeMappings, skip: filterQuery === '', startDate: '', sort: timelineQuerySortField, diff --git a/x-pack/solutions/security/plugins/security_solution/public/timelines/components/timeline/tabs/query/events_count.tsx b/x-pack/solutions/security/plugins/security_solution/public/timelines/components/timeline/tabs/query/events_count.tsx index 89d886108d777..1734e38f5828d 100644 --- a/x-pack/solutions/security/plugins/security_solution/public/timelines/components/timeline/tabs/query/events_count.tsx +++ b/x-pack/solutions/security/plugins/security_solution/public/timelines/components/timeline/tabs/query/events_count.tsx @@ -90,7 +90,6 @@ export const TimelineQueryTabEventsCountComponent: React.FC<{ timelineId: string browserFields, dataViewId, loading: loadingSourcerer, - indexPattern, // important to get selectedPatterns from useSourcererDataView // in order to include the exclude filters in the search that are not stored in the timeline selectedPatterns, @@ -117,13 +116,13 @@ export const TimelineQueryTabEventsCountComponent: React.FC<{ timelineId: string return combineQueries({ config: esQueryConfig, dataProviders, - indexPattern, + dataViewSpec: sourcererDataView, browserFields, filters, kqlQuery, kqlMode, }); - }, [esQueryConfig, dataProviders, indexPattern, browserFields, filters, kqlQuery, kqlMode]); + }, [esQueryConfig, dataProviders, sourcererDataView, browserFields, filters, kqlQuery, kqlMode]); useInvalidFilterQuery({ id: timelineId, diff --git a/x-pack/solutions/security/plugins/security_solution/public/timelines/components/timeline/tabs/query/index.tsx b/x-pack/solutions/security/plugins/security_solution/public/timelines/components/timeline/tabs/query/index.tsx index e8f9fa7c04196..c3dcc91077201 100644 --- a/x-pack/solutions/security/plugins/security_solution/public/timelines/components/timeline/tabs/query/index.tsx +++ b/x-pack/solutions/security/plugins/security_solution/public/timelines/components/timeline/tabs/query/index.tsx @@ -87,7 +87,6 @@ export const QueryTabContentComponent: React.FC = ({ browserFields, dataViewId, loading: loadingSourcerer, - indexPattern, // important to get selectedPatterns from useSourcererDataView // in order to include the exclude filters in the search that are not stored in the timeline selectedPatterns, @@ -127,13 +126,13 @@ export const QueryTabContentComponent: React.FC = ({ return combineQueries({ config: esQueryConfig, dataProviders, - indexPattern, + dataViewSpec: sourcererDataView, browserFields, filters, kqlQuery, kqlMode, }); - }, [esQueryConfig, dataProviders, indexPattern, browserFields, filters, kqlQuery, kqlMode]); + }, [esQueryConfig, dataProviders, sourcererDataView, browserFields, filters, kqlQuery, kqlMode]); useInvalidFilterQuery({ id: timelineId, diff --git a/x-pack/solutions/security/plugins/security_solution/public/timelines/pages/timelines_page.test.tsx b/x-pack/solutions/security/plugins/security_solution/public/timelines/pages/timelines_page.test.tsx index ba975711debc5..ae82e2a381010 100644 --- a/x-pack/solutions/security/plugins/security_solution/public/timelines/pages/timelines_page.test.tsx +++ b/x-pack/solutions/security/plugins/security_solution/public/timelines/pages/timelines_page.test.tsx @@ -32,6 +32,7 @@ describe('TimelinesPage', () => { it('should render landing page if no indicesExist', () => { (useSourcererDataView as unknown as jest.Mock).mockReturnValue({ indicesExist: false, + sourcererDataView: {}, }); (useUserPrivileges as jest.Mock).mockReturnValue({ timelinePrivileges: { @@ -49,6 +50,7 @@ describe('TimelinesPage', () => { it('should show the correct elements if user has crud', () => { (useSourcererDataView as unknown as jest.Mock).mockReturnValue({ indicesExist: true, + sourcererDataView: {}, }); (useUserPrivileges as jest.Mock).mockReturnValue({ timelinePrivileges: { diff --git a/x-pack/solutions/security/plugins/threat_intelligence/public/containers/field_types_provider.tsx b/x-pack/solutions/security/plugins/threat_intelligence/public/containers/field_types_provider.tsx index bff41a2a4ef01..ef3c72cd0ba0d 100644 --- a/x-pack/solutions/security/plugins/threat_intelligence/public/containers/field_types_provider.tsx +++ b/x-pack/solutions/security/plugins/threat_intelligence/public/containers/field_types_provider.tsx @@ -16,16 +16,18 @@ export const FieldTypesContext = createContext> = ({ children }) => { - const { indexPattern } = useSourcererDataView(); + const { + sourcererDataView: { fields = {} }, + } = useSourcererDataView(); // field name to field type map to allow the cell_renderer to format dates const fieldTypes: FieldTypesContextValue = useMemo( () => - indexPattern.fields.reduce((acc, field) => { + Object.values(fields).reduce((acc, field) => { acc[field.name] = field.type; return acc; }, {} as FieldTypesContextValue), - [indexPattern.fields] + [fields] ); return {children}; diff --git a/x-pack/solutions/security/plugins/threat_intelligence/public/modules/indicators/components/barchart/field_selector.stories.tsx b/x-pack/solutions/security/plugins/threat_intelligence/public/modules/indicators/components/barchart/field_selector.stories.tsx index d6e620430962b..f8f9bbf513422 100644 --- a/x-pack/solutions/security/plugins/threat_intelligence/public/modules/indicators/components/barchart/field_selector.stories.tsx +++ b/x-pack/solutions/security/plugins/threat_intelligence/public/modules/indicators/components/barchart/field_selector.stories.tsx @@ -7,24 +7,10 @@ import React from 'react'; import type { StoryFn } from '@storybook/react'; -import { DataView, DataViewField } from '@kbn/data-views-plugin/common'; import { EuiComboBoxOptionOption } from '@elastic/eui'; import { RawIndicatorFieldId } from '../../../../../common/types/indicator'; import { IndicatorsFieldSelector } from './field_selector'; -const mockIndexPattern: DataView = { - fields: [ - { - name: '@timestamp', - type: 'date', - } as DataViewField, - { - name: 'threat.feed.name', - type: 'string', - } as DataViewField, - ], -} as DataView; - export default { component: IndicatorsFieldSelector, title: 'IndicatorsFieldSelector', @@ -33,7 +19,6 @@ export default { export const Default: StoryFn = () => { return ( ) => window.alert(`${label} selected`) } @@ -44,7 +29,6 @@ export const Default: StoryFn = () => { export const WithDefaultValue: StoryFn = () => { return ( ) => window.alert(`${label} selected`) } @@ -54,5 +38,5 @@ export const WithDefaultValue: StoryFn = () => { }; export const NoData: StoryFn = () => { - return {}} />; + return {}} />; }; diff --git a/x-pack/solutions/security/plugins/threat_intelligence/public/modules/indicators/components/barchart/field_selector.test.tsx b/x-pack/solutions/security/plugins/threat_intelligence/public/modules/indicators/components/barchart/field_selector.test.tsx index afb47dbfbedd5..880d242c74bbf 100644 --- a/x-pack/solutions/security/plugins/threat_intelligence/public/modules/indicators/components/barchart/field_selector.test.tsx +++ b/x-pack/solutions/security/plugins/threat_intelligence/public/modules/indicators/components/barchart/field_selector.test.tsx @@ -7,31 +7,16 @@ import React from 'react'; import { render } from '@testing-library/react'; -import { DataView, DataViewField } from '@kbn/data-views-plugin/common'; import { TestProvidersComponent } from '../../../../mocks/test_providers'; import { IndicatorsFieldSelector } from './field_selector'; import { EuiComboBoxOptionOption } from '@elastic/eui'; import { DROPDOWN_TEST_ID } from './test_ids'; -const mockIndexPattern: DataView = { - fields: [ - { - name: '@timestamp', - type: 'date', - } as DataViewField, - { - name: 'threat.feed.name', - type: 'string', - } as DataViewField, - ], -} as DataView; - describe('', () => { it('should handle empty array of indexPatterns', () => { const { getByTestId } = render( ) => console.log(value)} /> @@ -45,7 +30,6 @@ describe('', () => { const { getByTestId } = render( ) => console.log(value)} /> diff --git a/x-pack/solutions/security/plugins/threat_intelligence/public/modules/indicators/components/barchart/field_selector.tsx b/x-pack/solutions/security/plugins/threat_intelligence/public/modules/indicators/components/barchart/field_selector.tsx index cceccc918ba37..c6d8fa096d675 100644 --- a/x-pack/solutions/security/plugins/threat_intelligence/public/modules/indicators/components/barchart/field_selector.tsx +++ b/x-pack/solutions/security/plugins/threat_intelligence/public/modules/indicators/components/barchart/field_selector.tsx @@ -7,16 +7,15 @@ import React, { memo, useCallback, useMemo, useState } from 'react'; import { EuiComboBox } from '@elastic/eui'; -import { DataViewField } from '@kbn/data-views-plugin/common'; +import { FieldSpec } from '@kbn/data-views-plugin/common'; import { EuiComboBoxOptionOption } from '@elastic/eui/src/components/combo_box/types'; -import { SecuritySolutionDataViewBase } from '../../../../types'; import { RawIndicatorFieldId } from '../../../../../common/types/indicator'; import { useStyles } from './styles'; import { DROPDOWN_TEST_ID } from './test_ids'; import { COMBOBOX_PREPEND_LABEL } from './translations'; +import { useCurrentDataViewFields } from '../../hooks/use_current_data_view_fields'; export interface IndicatorsFieldSelectorProps { - indexPattern: SecuritySolutionDataViewBase; valueChange: (value: EuiComboBoxOptionOption) => void; defaultStackByValue?: RawIndicatorFieldId; } @@ -25,10 +24,12 @@ const DEFAULT_STACK_BY_VALUE = RawIndicatorFieldId.Feed; const COMBOBOX_SINGLE_SELECTION = { asPlainText: true }; export const IndicatorsFieldSelector = memo( - ({ indexPattern, valueChange, defaultStackByValue = DEFAULT_STACK_BY_VALUE }) => { + ({ valueChange, defaultStackByValue = DEFAULT_STACK_BY_VALUE }) => { + const rawFields = useCurrentDataViewFields(); + const styles = useStyles(); - const defaultStackByValueInfo = indexPattern.fields.find( - (f: DataViewField) => f.name === defaultStackByValue + const defaultStackByValueInfo = rawFields.find( + (f: FieldSpec) => f.name === defaultStackByValue ); const [selectedField, setSelectedField] = useState>>([ { @@ -38,13 +39,11 @@ export const IndicatorsFieldSelector = memo( ]); const fields: Array> = useMemo( () => - indexPattern - ? indexPattern.fields.map((f: DataViewField) => ({ - label: f.name, - value: f.type, - })) - : [], - [indexPattern] + rawFields.map((f: FieldSpec) => ({ + label: f.name, + value: f.type, + })), + [rawFields] ); const selectedFieldChange = useCallback( diff --git a/x-pack/solutions/security/plugins/threat_intelligence/public/modules/indicators/components/barchart/wrapper.stories.tsx b/x-pack/solutions/security/plugins/threat_intelligence/public/modules/indicators/components/barchart/wrapper.stories.tsx index c817070dd5ed5..bfbe15b40cbf6 100644 --- a/x-pack/solutions/security/plugins/threat_intelligence/public/modules/indicators/components/barchart/wrapper.stories.tsx +++ b/x-pack/solutions/security/plugins/threat_intelligence/public/modules/indicators/components/barchart/wrapper.stories.tsx @@ -10,7 +10,6 @@ import React from 'react'; import { MemoryRouter } from 'react-router-dom'; import { of } from 'rxjs'; import type { StoryObj } from '@storybook/react'; -import { DataView, DataViewField } from '@kbn/data-views-plugin/common'; import { TimeRange } from '@kbn/es-query'; import { DataPublicPluginStart } from '@kbn/data-plugin/public'; import { IUiSettingsClient } from '@kbn/core/public'; @@ -28,19 +27,6 @@ export default { const mockTimeRange: TimeRange = { from: '', to: '' }; -const mockIndexPattern: DataView = { - fields: [ - { - name: '@timestamp', - type: 'date', - } as DataViewField, - { - name: 'threat.feed.name', - type: 'string', - } as DataViewField, - ], -} as DataView; - const validDate: string = '1 Jan 2022 00:00:00 GMT'; const numberOfDays: number = 1; const aggregation1: Aggregation = { @@ -139,7 +125,6 @@ export const Default: StoryObj = { series={[]} field={mockField} onFieldChange={mockOnFieldChange} - indexPattern={mockIndexPattern} /> ); @@ -167,7 +152,6 @@ export const InitialLoad: StoryObj = { isFetching={false} field={mockField} onFieldChange={mockOnFieldChange} - indexPattern={mockIndexPattern} /> ); @@ -218,7 +202,6 @@ export const UpdatingData: StoryObj = { isFetching={true} field={mockField} onFieldChange={mockOnFieldChange} - indexPattern={mockIndexPattern} /> ); diff --git a/x-pack/solutions/security/plugins/threat_intelligence/public/modules/indicators/components/barchart/wrapper.test.tsx b/x-pack/solutions/security/plugins/threat_intelligence/public/modules/indicators/components/barchart/wrapper.test.tsx index ce393de12c32f..58c4fe6bd7bd9 100644 --- a/x-pack/solutions/security/plugins/threat_intelligence/public/modules/indicators/components/barchart/wrapper.test.tsx +++ b/x-pack/solutions/security/plugins/threat_intelligence/public/modules/indicators/components/barchart/wrapper.test.tsx @@ -8,7 +8,6 @@ import React from 'react'; import { render } from '@testing-library/react'; import { TimeRange } from '@kbn/es-query'; -import { DataView, DataViewField } from '@kbn/data-views-plugin/common'; import { TestProvidersComponent } from '../../../../mocks/test_providers'; import { IndicatorsBarChartWrapper } from './wrapper'; import { @@ -21,19 +20,6 @@ import { DROPDOWN_TEST_ID } from './test_ids'; jest.mock('../../../query_bar/hooks/use_filters'); -const mockIndexPattern: DataView = { - fields: [ - { - name: '@timestamp', - type: 'date', - } as DataViewField, - { - name: 'threat.feed.name', - type: 'string', - } as DataViewField, - ], -} as DataView; - const mockTimeRange: TimeRange = { from: '', to: '' }; const mockField = { label: 'host.name', value: 'string' }; @@ -47,7 +33,6 @@ describe('', () => { series={[]} field={mockField} onFieldChange={jest.fn()} - indexPattern={mockIndexPattern} timeRange={mockTimeRange} isFetching={false} isLoading={false} @@ -70,7 +55,6 @@ describe('', () => { series={[]} field={mockField} onFieldChange={jest.fn()} - indexPattern={mockIndexPattern} timeRange={mockTimeRange} isFetching={false} isLoading={true} @@ -92,7 +76,6 @@ describe('', () => { series={[]} field={mockField} onFieldChange={jest.fn()} - indexPattern={mockIndexPattern} timeRange={mockTimeRange} isFetching={true} isLoading={false} diff --git a/x-pack/solutions/security/plugins/threat_intelligence/public/modules/indicators/components/barchart/wrapper.tsx b/x-pack/solutions/security/plugins/threat_intelligence/public/modules/indicators/components/barchart/wrapper.tsx index 1a2f04f59cb85..7df328e04bb94 100644 --- a/x-pack/solutions/security/plugins/threat_intelligence/public/modules/indicators/components/barchart/wrapper.tsx +++ b/x-pack/solutions/security/plugins/threat_intelligence/public/modules/indicators/components/barchart/wrapper.tsx @@ -18,7 +18,6 @@ import { import { FormattedMessage } from '@kbn/i18n-react'; import { TimeRange } from '@kbn/es-query'; import { TimeRangeBounds } from '@kbn/data-plugin/common'; -import { SecuritySolutionDataViewBase } from '../../../../types'; import { RawIndicatorFieldId } from '../../../../../common/types/indicator'; import { IndicatorsFieldSelector } from './field_selector'; import { IndicatorsBarChart } from './barchart'; @@ -36,10 +35,6 @@ export interface IndicatorsBarChartWrapperProps { * From and to values received from the KQL bar and passed down to the hook to query data. */ timeRange?: TimeRange; - /** - * List of fields coming from the Security Solution sourcerer data view, passed down to the {@link IndicatorsFieldSelector} to populate the dropdown. - */ - indexPattern: SecuritySolutionDataViewBase; series: ChartSeries[]; @@ -61,7 +56,7 @@ export interface IndicatorsBarChartWrapperProps { * and handles retrieving aggregated indicator data. */ export const IndicatorsBarChartWrapper = memo( - ({ timeRange, indexPattern, isLoading, isFetching, series, dateRange, field, onFieldChange }) => { + ({ timeRange, isLoading, isFetching, series, dateRange, field, onFieldChange }) => { if (isLoading) { return ( @@ -89,7 +84,6 @@ export const IndicatorsBarChartWrapper = memo( diff --git a/x-pack/solutions/security/plugins/threat_intelligence/public/modules/indicators/components/table/table.stories.tsx b/x-pack/solutions/security/plugins/threat_intelligence/public/modules/indicators/components/table/table.stories.tsx index 579f409fc94e6..da44f8bd7513e 100644 --- a/x-pack/solutions/security/plugins/threat_intelligence/public/modules/indicators/components/table/table.stories.tsx +++ b/x-pack/solutions/security/plugins/threat_intelligence/public/modules/indicators/components/table/table.stories.tsx @@ -6,7 +6,6 @@ */ import React from 'react'; -import { DataView } from '@kbn/data-views-plugin/common'; import { mockIndicatorsFiltersContext } from '../../../../mocks/mock_indicators_filters_context'; import { StoryProvidersComponent } from '../../../../mocks/story_providers'; import { generateMockIndicator, Indicator } from '../../../../../common/types/indicator'; @@ -19,8 +18,6 @@ export default { title: 'IndicatorsTable', }; -const mockIndexPattern: DataView = undefined as unknown as DataView; - const stub = () => void 0; const columnSettings = { @@ -54,7 +51,6 @@ export function IndicatorsFullyLoaded() { onChangePage={stub} onChangeItemsPerPage={stub} indicatorCount={indicatorsFixture.length * 2} - indexPattern={mockIndexPattern} columnSettings={columnSettings} /> @@ -77,7 +73,6 @@ export function FirstLoad() { onChangeItemsPerPage={stub} indicatorCount={0} isLoading={true} - indexPattern={mockIndexPattern} columnSettings={columnSettings} /> @@ -103,7 +98,6 @@ export function DataUpdateInProgress() { onChangePage={stub} onChangeItemsPerPage={stub} indicatorCount={indicatorsFixture.length * 2} - indexPattern={mockIndexPattern} columnSettings={columnSettings} /> @@ -126,7 +120,6 @@ export function WithNoIndicators() { onChangeItemsPerPage={stub} indicatorCount={0} isLoading={false} - indexPattern={mockIndexPattern} columnSettings={columnSettings} /> diff --git a/x-pack/solutions/security/plugins/threat_intelligence/public/modules/indicators/components/table/table.test.tsx b/x-pack/solutions/security/plugins/threat_intelligence/public/modules/indicators/components/table/table.test.tsx index 2a2f9e61852be..86196706c882e 100644 --- a/x-pack/solutions/security/plugins/threat_intelligence/public/modules/indicators/components/table/table.test.tsx +++ b/x-pack/solutions/security/plugins/threat_intelligence/public/modules/indicators/components/table/table.test.tsx @@ -11,7 +11,6 @@ import { IndicatorsTable, IndicatorsTableProps } from './table'; import { TestProvidersComponent } from '../../../../mocks/test_providers'; import { generateMockIndicator, Indicator } from '../../../../../common/types/indicator'; import { BUTTON_TEST_ID, TABLE_UPDATE_PROGRESS_TEST_ID } from './test_ids'; -import { SecuritySolutionDataViewBase } from '../../../../types'; import { INDICATORS_FLYOUT_TITLE_TEST_ID } from '../flyout/test_ids'; const stub = () => {}; @@ -24,7 +23,6 @@ const tableProps: IndicatorsTableProps = { indicatorCount: 0, isLoading: false, browserFields: {}, - indexPattern: { fields: [], title: '' } as SecuritySolutionDataViewBase, columnSettings: { columnVisibility: { visibleColumns: [], diff --git a/x-pack/solutions/security/plugins/threat_intelligence/public/modules/indicators/components/table/table.tsx b/x-pack/solutions/security/plugins/threat_intelligence/public/modules/indicators/components/table/table.tsx index 9b64090048bb9..b4578d4423478 100644 --- a/x-pack/solutions/security/plugins/threat_intelligence/public/modules/indicators/components/table/table.tsx +++ b/x-pack/solutions/security/plugins/threat_intelligence/public/modules/indicators/components/table/table.tsx @@ -25,7 +25,7 @@ import { import { CellActions } from './cell_actions'; import { cellPopoverRendererFactory } from './cell_popover_renderer'; import { cellRendererFactory } from './cell_renderer'; -import { BrowserFields, SecuritySolutionDataViewBase } from '../../../../types'; +import { BrowserFields } from '../../../../types'; import { Indicator, RawIndicatorFieldId } from '../../../../../common/types/indicator'; import { EmptyState } from '../../../../components/empty_state'; import { IndicatorsTableContext, IndicatorsTableContextValue } from '../../hooks/use_table_context'; @@ -51,7 +51,6 @@ export interface IndicatorsTableProps { */ isLoading?: boolean; isFetching?: boolean; - indexPattern: SecuritySolutionDataViewBase; browserFields: BrowserFields; columnSettings: ColumnSettingsValue; } diff --git a/x-pack/solutions/security/plugins/threat_intelligence/public/modules/indicators/hooks/use_current_data_view_fields.test.ts b/x-pack/solutions/security/plugins/threat_intelligence/public/modules/indicators/hooks/use_current_data_view_fields.test.ts new file mode 100644 index 0000000000000..fe0407137907a --- /dev/null +++ b/x-pack/solutions/security/plugins/threat_intelligence/public/modules/indicators/hooks/use_current_data_view_fields.test.ts @@ -0,0 +1,35 @@ +/* + * 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 { renderHook } from '@testing-library/react'; +import { useCurrentDataViewFields } from './use_current_data_view_fields'; +import { useSourcererDataView } from './use_sourcerer_data_view'; + +jest.mock('./use_sourcerer_data_view'); + +describe('useFields', () => { + it('should return fields from sourcererDataView', () => { + const mockFields = { field1: {}, field2: {} }; + (useSourcererDataView as jest.Mock).mockReturnValue({ + sourcererDataView: { fields: mockFields }, + }); + + const { result } = renderHook(() => useCurrentDataViewFields()); + + expect(result.current).toEqual(Object.values(mockFields)); + }); + + it('should return an empty array if fields are undefined', () => { + (useSourcererDataView as jest.Mock).mockReturnValue({ + sourcererDataView: { fields: undefined }, + }); + + const { result } = renderHook(() => useCurrentDataViewFields()); + + expect(result.current).toEqual([]); + }); +}); diff --git a/x-pack/solutions/security/plugins/threat_intelligence/public/modules/indicators/hooks/use_current_data_view_fields.ts b/x-pack/solutions/security/plugins/threat_intelligence/public/modules/indicators/hooks/use_current_data_view_fields.ts new file mode 100644 index 0000000000000..e332dae52fac1 --- /dev/null +++ b/x-pack/solutions/security/plugins/threat_intelligence/public/modules/indicators/hooks/use_current_data_view_fields.ts @@ -0,0 +1,19 @@ +/* + * 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 { useMemo } from 'react'; +import { FieldSpec } from '@kbn/data-views-plugin/common'; +import { useSourcererDataView } from './use_sourcerer_data_view'; + +/** + * Custom hook to retrieve fields from the sourcerer data view. + */ +export const useCurrentDataViewFields = (): FieldSpec[] => { + const { sourcererDataView } = useSourcererDataView(); + + return useMemo(() => Object.values(sourcererDataView.fields ?? {}), [sourcererDataView.fields]); +}; diff --git a/x-pack/solutions/security/plugins/threat_intelligence/public/modules/indicators/hooks/use_sourcerer_data_view.ts b/x-pack/solutions/security/plugins/threat_intelligence/public/modules/indicators/hooks/use_sourcerer_data_view.ts index d2e12d545036c..e5998c00c99fe 100644 --- a/x-pack/solutions/security/plugins/threat_intelligence/public/modules/indicators/hooks/use_sourcerer_data_view.ts +++ b/x-pack/solutions/security/plugins/threat_intelligence/public/modules/indicators/hooks/use_sourcerer_data_view.ts @@ -7,7 +7,6 @@ import { useMemo } from 'react'; import { RawIndicatorFieldId } from '../../../../common/types/indicator'; -import { SecuritySolutionDataViewBase } from '../../../types'; import { useSecurityContext } from '../../../hooks/use_security_context'; import { DESCRIPTION } from './translations'; @@ -27,17 +26,6 @@ const indicatorNameField = { export const useSourcererDataView = () => { const { sourcererDataView } = useSecurityContext(); - const updatedPattern = useMemo(() => { - const fields = [...sourcererDataView.indexPattern.fields, indicatorNameField]; - - return { - ...sourcererDataView.indexPattern, - fields, - } as SecuritySolutionDataViewBase; - }, [sourcererDataView.indexPattern]); - - const indexPatterns = useMemo(() => [updatedPattern], [updatedPattern]); - const browserFields = useMemo(() => { const { threat = { fields: {} } } = sourcererDataView.browserFields; @@ -55,10 +43,9 @@ export const useSourcererDataView = () => { return useMemo( () => ({ ...sourcererDataView, - indexPatterns, - indexPattern: updatedPattern, browserFields, + patternList: sourcererDataView.selectedPatterns, }), - [browserFields, indexPatterns, sourcererDataView, updatedPattern] + [browserFields, sourcererDataView] ); }; diff --git a/x-pack/solutions/security/plugins/threat_intelligence/public/modules/indicators/pages/indicators.tsx b/x-pack/solutions/security/plugins/threat_intelligence/public/modules/indicators/pages/indicators.tsx index f2a7b566bd5d6..8e5321aab5a2e 100644 --- a/x-pack/solutions/security/plugins/threat_intelligence/public/modules/indicators/pages/indicators.tsx +++ b/x-pack/solutions/security/plugins/threat_intelligence/public/modules/indicators/pages/indicators.tsx @@ -37,7 +37,7 @@ const IndicatorsPageProviders: FC> = ({ children }) = const IndicatorsPageContent: VFC = () => { const { blockListIndicatorValue } = useBlockListContext(); - const { browserFields, indexPattern, sourcererDataView } = useSourcererDataView(); + const { sourcererDataView, browserFields } = useSourcererDataView(); const columnSettings = useColumnSettings(); @@ -91,7 +91,6 @@ const IndicatorsPageContent: VFC = () => { dateRange={dateRange} series={series} timeRange={timeRange} - indexPattern={indexPattern} field={selectedField} onFieldChange={onFieldChange} isFetching={isFetchingAggregatedIndicators} @@ -100,7 +99,6 @@ const IndicatorsPageContent: VFC = () => { ; -} - // eslint-disable-next-line @typescript-eslint/no-empty-interface export interface ThreatIntelligencePluginSetup {} @@ -65,8 +56,7 @@ export interface LicenseAware { export type BrowserFields = Readonly>>; export interface SelectedDataView { - sourcererDataView: DataViewSpec | undefined; - indexPattern: SecuritySolutionDataViewBase; + sourcererDataView: DataViewSpec; browserFields: BrowserFields; selectedPatterns: string[]; loading: boolean;