[Cloud Security] Change update dataview (#183789)

## Summary

Removing Update logic for Findings table from Client Side as well as
overriding table column name
This commit is contained in:
Rickyanto Ang 2024-05-22 14:10:38 -07:00 committed by GitHub
parent 3deea5cf8f
commit 9cb7940601
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
14 changed files with 48 additions and 181 deletions

View file

@ -0,0 +1,29 @@
/*
* 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 { useQuery } from '@tanstack/react-query';
import { useKibana } from '@kbn/kibana-react-plugin/public';
import { CspClientPluginStartDeps } from '../../types';
/**
* Hook to retrieve a Data View by it's Index Pattern title
*/
export const useDataView = (indexPattern: string) => {
const {
data: { dataViews },
} = useKibana<CspClientPluginStartDeps>().services;
return useQuery(['useDataView', indexPattern], async () => {
const [dataView] = await dataViews.find(indexPattern);
if (!dataView) {
throw new Error(`Data view not found [${indexPattern}]`);
}
return dataView;
});
};

View file

@ -1,120 +0,0 @@
/*
* 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 { useQuery } from '@tanstack/react-query';
import { useKibana } from '@kbn/kibana-react-plugin/public';
import type { DataView } from '@kbn/data-plugin/common';
import { i18n } from '@kbn/i18n';
import {
LATEST_FINDINGS_INDEX_PATTERN,
LATEST_VULNERABILITIES_INDEX_PATTERN,
} from '../../../common/constants';
import { CspClientPluginStartDeps } from '../../types';
/**
* TODO: Remove this static labels once https://github.com/elastic/kibana/issues/172615 is resolved
*/
const cloudSecurityFieldLabels: Record<string, string> = {
'result.evaluation': i18n.translate(
'xpack.csp.findings.findingsTable.findingsTableColumn.resultColumnLabel',
{ defaultMessage: 'Result' }
),
'resource.id': i18n.translate(
'xpack.csp.findings.findingsTable.findingsTableColumn.resourceIdColumnLabel',
{ defaultMessage: 'Resource ID' }
),
'resource.name': i18n.translate(
'xpack.csp.findings.findingsTable.findingsTableColumn.resourceNameColumnLabel',
{ defaultMessage: 'Resource Name' }
),
'resource.sub_type': i18n.translate(
'xpack.csp.findings.findingsTable.findingsTableColumn.resourceTypeColumnLabel',
{ defaultMessage: 'Resource Type' }
),
'rule.benchmark.rule_number': i18n.translate(
'xpack.csp.findings.findingsTable.findingsTableColumn.ruleNumberColumnLabel',
{ defaultMessage: 'Rule Number' }
),
'rule.name': i18n.translate(
'xpack.csp.findings.findingsTable.findingsTableColumn.ruleNameColumnLabel',
{ defaultMessage: 'Rule Name' }
),
'rule.section': i18n.translate(
'xpack.csp.findings.findingsTable.findingsTableColumn.ruleSectionColumnLabel',
{ defaultMessage: 'CIS Section' }
),
'@timestamp': i18n.translate(
'xpack.csp.findings.findingsTable.findingsTableColumn.lastCheckedColumnLabel',
{ defaultMessage: 'Last Checked' }
),
'vulnerability.id': i18n.translate(
'xpack.csp.findings.findingsTable.findingsTableColumn.vulnerabilityIdColumnLabel',
{ defaultMessage: 'Vulnerability' }
),
'vulnerability.score.base': i18n.translate(
'xpack.csp.findings.findingsTable.findingsTableColumn.vulnerabilityScoreColumnLabel',
{ defaultMessage: 'CVSS' }
),
'vulnerability.severity': i18n.translate(
'xpack.csp.findings.findingsTable.findingsTableColumn.vulnerabilitySeverityColumnLabel',
{ defaultMessage: 'Severity' }
),
'package.name': i18n.translate(
'xpack.csp.findings.findingsTable.findingsTableColumn.packageNameColumnLabel',
{ defaultMessage: 'Package' }
),
'package.version': i18n.translate(
'xpack.csp.findings.findingsTable.findingsTableColumn.packageVersionColumnLabel',
{ defaultMessage: 'Version' }
),
'package.fixed_version': i18n.translate(
'xpack.csp.findings.findingsTable.findingsTableColumn.packageFixedVersionColumnLabel',
{ defaultMessage: 'Fix Version' }
),
} as const;
/**
* TODO: use perfected kibana data views
*/
export const useLatestFindingsDataView = (dataView: string) => {
const {
data: { dataViews },
} = useKibana<CspClientPluginStartDeps>().services;
const findDataView = async (): Promise<DataView> => {
const [dataViewObj] = await dataViews.find(dataView);
if (!dataViewObj) {
throw new Error(`Data view not found [Name: {${dataView}}]`);
}
/**
* TODO: Remove this update logic once https://github.com/elastic/kibana/issues/172615 is resolved
*/
if (
dataView === LATEST_FINDINGS_INDEX_PATTERN ||
dataView === LATEST_VULNERABILITIES_INDEX_PATTERN
) {
let shouldUpdate = false;
Object.entries(cloudSecurityFieldLabels).forEach(([field, label]) => {
if (
!dataViewObj.getFieldAttrs()[field]?.customLabel ||
dataViewObj.getFieldAttrs()[field]?.customLabel === field
) {
dataViewObj.setFieldCustomLabel(field, label);
shouldUpdate = true;
}
});
if (shouldUpdate) {
await dataViews.updateSavedObject(dataViewObj);
}
}
return dataViewObj;
};
return useQuery([`useDataView-${dataView}`], findDataView);
};

View file

@ -33,8 +33,8 @@ jest.mock('./use_kibana', () => ({
},
}),
}));
jest.mock('../api/use_latest_findings_data_view', () => ({
useLatestFindingsDataView: jest.fn().mockReturnValue({
jest.mock('../api/use_data_view', () => ({
useDataView: jest.fn().mockReturnValue({
status: 'success',
data: {
id: 'data-view-id',

View file

@ -15,7 +15,7 @@ import {
import { findingsNavigation } from '../navigation/constants';
import { encodeQuery } from '../navigation/query_utils';
import { useKibana } from './use_kibana';
import { useLatestFindingsDataView } from '../api/use_latest_findings_data_view';
import { useDataView } from '../api/use_data_view';
interface NegatedValue {
value: string | number;
@ -77,12 +77,12 @@ const useNavigate = (pathname: string, dataViewId = SECURITY_DEFAULT_DATA_VIEW_I
};
export const useNavigateFindings = () => {
const { data } = useLatestFindingsDataView(LATEST_FINDINGS_INDEX_PATTERN);
const { data } = useDataView(LATEST_FINDINGS_INDEX_PATTERN);
return useNavigate(findingsNavigation.findings_default.path, data?.id);
};
export const useNavigateFindingsByResource = () => {
const { data } = useLatestFindingsDataView(LATEST_FINDINGS_INDEX_PATTERN);
const { data } = useDataView(LATEST_FINDINGS_INDEX_PATTERN);
return useNavigate(findingsNavigation.findings_by_resource.path, data?.id);
};

View file

@ -8,7 +8,7 @@ import React from 'react';
import Chance from 'chance';
import type { UseQueryResult } from '@tanstack/react-query';
import { of } from 'rxjs';
import { useLatestFindingsDataView } from '../../common/api/use_latest_findings_data_view';
import { useDataView } from '../../common/api/use_data_view';
import { Configurations } from './configurations';
import { TestProvider } from '../../test/test_provider';
import { dataPluginMock } from '@kbn/data-plugin/public/mocks';
@ -27,7 +27,7 @@ import { expectIdsInDoc } from '../../test/utils';
import { PACKAGE_NOT_INSTALLED_TEST_SUBJECT } from '../../components/cloud_posture_page';
import { useLicenseManagementLocatorApi } from '../../common/api/use_license_management_locator_api';
jest.mock('../../common/api/use_latest_findings_data_view');
jest.mock('../../common/api/use_data_view');
jest.mock('../../common/api/use_setup_status_api');
jest.mock('../../common/api/use_license_management_locator_api');
jest.mock('../../common/hooks/use_subscription_status');
@ -197,7 +197,7 @@ describe('<Findings />', () => {
}));
(source.fetch$ as jest.Mock).mockReturnValue(of({ rawResponse: { hits: { hits: [] } } }));
(useLatestFindingsDataView as jest.Mock).mockReturnValue({
(useDataView as jest.Mock).mockReturnValue({
status: 'success',
data: createStubDataView({
spec: {

View file

@ -12,14 +12,14 @@ import { LATEST_FINDINGS_INDEX_PATTERN } from '../../../common/constants';
import { useCspSetupStatusApi } from '../../common/api/use_setup_status_api';
import { NoFindingsStates } from '../../components/no_findings_states';
import { CloudPosturePage } from '../../components/cloud_posture_page';
import { useLatestFindingsDataView } from '../../common/api/use_latest_findings_data_view';
import { useDataView } from '../../common/api/use_data_view';
import { cloudPosturePages, findingsNavigation } from '../../common/navigation/constants';
import { LatestFindingsContainer } from './latest_findings/latest_findings_container';
import { DataViewContext } from '../../common/contexts/data_view_context';
export const Configurations = () => {
const location = useLocation();
const dataViewQuery = useLatestFindingsDataView(LATEST_FINDINGS_INDEX_PATTERN);
const dataViewQuery = useDataView(LATEST_FINDINGS_INDEX_PATTERN);
const { data: getSetupStatus } = useCspSetupStatusApi();
const hasConfigurationFindings =
getSetupStatus?.kspm.status === 'indexed' || getSetupStatus?.cspm.status === 'indexed';

View file

@ -28,7 +28,7 @@ import {
LATEST_FINDINGS_INDEX_DEFAULT_NS,
LATEST_FINDINGS_INDEX_PATTERN,
} from '../../../../common/constants';
import { useLatestFindingsDataView } from '../../../common/api/use_latest_findings_data_view';
import { useDataView } from '../../../common/api/use_data_view';
import { useKibana } from '../../../common/hooks/use_kibana';
import { CspFinding } from '../../../../common/schemas/csp_finding';
import { CisKubernetesIcons, CodeBlock, CspFlyoutMarkdown } from './findings_flyout';
@ -178,7 +178,7 @@ export const OverviewTab = ({
ruleFlyoutLink: string;
}) => {
const { discover } = useKibana().services;
const latestFindingsDataView = useLatestFindingsDataView(LATEST_FINDINGS_INDEX_PATTERN);
const latestFindingsDataView = useDataView(LATEST_FINDINGS_INDEX_PATTERN);
const discoverIndexLink = useMemo(
() =>

View file

@ -11,12 +11,12 @@ import { NoVulnerabilitiesStates } from '../../components/no_vulnerabilities_sta
import { useCspSetupStatusApi } from '../../common/api/use_setup_status_api';
import { CloudPosturePage } from '../../components/cloud_posture_page';
import { findingsNavigation } from '../../common/navigation/constants';
import { useLatestFindingsDataView } from '../../common/api/use_latest_findings_data_view';
import { useDataView } from '../../common/api/use_data_view';
import { LatestVulnerabilitiesContainer } from './latest_vulnerabilities_container';
import { DataViewContext } from '../../common/contexts/data_view_context';
export const Vulnerabilities = () => {
const dataViewQuery = useLatestFindingsDataView(LATEST_VULNERABILITIES_INDEX_PATTERN);
const dataViewQuery = useDataView(LATEST_VULNERABILITIES_INDEX_PATTERN);
const getSetupStatus = useCspSetupStatusApi();

View file

@ -13,7 +13,7 @@ import {
VULN_MGMT_POLICY_TEMPLATE,
} from '../../../common/constants';
import { useCspSetupStatusApi } from '../../common/api/use_setup_status_api';
import { useLatestFindingsDataView } from '../../common/api/use_latest_findings_data_view';
import { useDataView } from '../../common/api/use_data_view';
import { useSubscriptionStatus } from '../../common/hooks/use_subscription_status';
import { createReactQueryResponse } from '../../test/fixtures/react_query';
import { useCISIntegrationPoliciesLink } from '../../common/navigation/use_navigate_to_cis_integration_policies';
@ -28,7 +28,7 @@ import { TestProvider } from '../../test/test_provider';
import { useLicenseManagementLocatorApi } from '../../common/api/use_license_management_locator_api';
import { createStubDataView } from '@kbn/data-views-plugin/common/stubs';
jest.mock('../../common/api/use_latest_findings_data_view');
jest.mock('../../common/api/use_data_view');
jest.mock('../../common/api/use_setup_status_api');
jest.mock('../../common/api/use_license_management_locator_api');
jest.mock('../../common/hooks/use_subscription_status');
@ -54,7 +54,7 @@ beforeEach(() => {
})
);
(useLatestFindingsDataView as jest.Mock).mockReturnValue({
(useDataView as jest.Mock).mockReturnValue({
status: 'success',
data: createStubDataView({
spec: {

View file

@ -32,7 +32,7 @@ import { VULNERABILITY_DASHBOARD_CONTAINER } from '../compliance_dashboard/test_
import { useVulnerabilityDashboardApi } from '../../common/api/use_vulnerability_dashboard_api';
import { mockCnvmDashboardData } from './_mocks_/vulnerability_dashboard.mock';
jest.mock('../../common/api/use_latest_findings_data_view');
jest.mock('../../common/api/use_data_view');
jest.mock('../../common/api/use_setup_status_api');
jest.mock('../../common/api/use_license_management_locator_api');
jest.mock('../../common/hooks/use_subscription_status');

View file

@ -12926,20 +12926,6 @@
"xpack.csp.findings.findingsFlyout.ruleTab.tagsTitle": "Balises",
"xpack.csp.findings.findingsFlyout.ruleTabTitle": "Règle",
"xpack.csp.findings.findingsFlyout.tableTabTitle": "Tableau",
"xpack.csp.findings.findingsTable.findingsTableColumn.lastCheckedColumnLabel": "Dernière vérification",
"xpack.csp.findings.findingsTable.findingsTableColumn.packageFixedVersionColumnLabel": "Version du correctif",
"xpack.csp.findings.findingsTable.findingsTableColumn.packageNameColumnLabel": "Pack",
"xpack.csp.findings.findingsTable.findingsTableColumn.packageVersionColumnLabel": "Version",
"xpack.csp.findings.findingsTable.findingsTableColumn.resourceIdColumnLabel": "ID ressource",
"xpack.csp.findings.findingsTable.findingsTableColumn.resourceNameColumnLabel": "Nom de ressource",
"xpack.csp.findings.findingsTable.findingsTableColumn.resourceTypeColumnLabel": "Type de ressource",
"xpack.csp.findings.findingsTable.findingsTableColumn.resultColumnLabel": "Résultat",
"xpack.csp.findings.findingsTable.findingsTableColumn.ruleNameColumnLabel": "Nom de règle",
"xpack.csp.findings.findingsTable.findingsTableColumn.ruleNumberColumnLabel": "Numéro de règle",
"xpack.csp.findings.findingsTable.findingsTableColumn.ruleSectionColumnLabel": "Section CIS",
"xpack.csp.findings.findingsTable.findingsTableColumn.vulnerabilityIdColumnLabel": "Vulnérabilité",
"xpack.csp.findings.findingsTable.findingsTableColumn.vulnerabilityScoreColumnLabel": "CVSS",
"xpack.csp.findings.findingsTable.findingsTableColumn.vulnerabilitySeverityColumnLabel": "Sévérité",
"xpack.csp.findings.gcpIntegration.gcpInputText.credentialFileText": "Chemin vers le fichier JSON qui contient les informations d'identification et la clé utilisés pour souscrire",
"xpack.csp.findings.gcpIntegration.gcpInputText.credentialJSONText": "Blob JSON qui contient les informations d'identification et la clé utilisées pour souscrire",
"xpack.csp.findings.gcpIntegration.gcpInputText.credentialSelectBoxTitle": "Informations d'identification",

View file

@ -12906,20 +12906,6 @@
"xpack.csp.findings.findingsFlyout.ruleTab.tagsTitle": "タグ",
"xpack.csp.findings.findingsFlyout.ruleTabTitle": "ルール",
"xpack.csp.findings.findingsFlyout.tableTabTitle": "表",
"xpack.csp.findings.findingsTable.findingsTableColumn.lastCheckedColumnLabel": "最終確認",
"xpack.csp.findings.findingsTable.findingsTableColumn.packageFixedVersionColumnLabel": "修正バージョン",
"xpack.csp.findings.findingsTable.findingsTableColumn.packageNameColumnLabel": "パッケージ",
"xpack.csp.findings.findingsTable.findingsTableColumn.packageVersionColumnLabel": "バージョン",
"xpack.csp.findings.findingsTable.findingsTableColumn.resourceIdColumnLabel": "リソースID",
"xpack.csp.findings.findingsTable.findingsTableColumn.resourceNameColumnLabel": "リソース名",
"xpack.csp.findings.findingsTable.findingsTableColumn.resourceTypeColumnLabel": "リソースタイプ",
"xpack.csp.findings.findingsTable.findingsTableColumn.resultColumnLabel": "結果",
"xpack.csp.findings.findingsTable.findingsTableColumn.ruleNameColumnLabel": "ルール名",
"xpack.csp.findings.findingsTable.findingsTableColumn.ruleNumberColumnLabel": "ルール番号",
"xpack.csp.findings.findingsTable.findingsTableColumn.ruleSectionColumnLabel": "CISセクション",
"xpack.csp.findings.findingsTable.findingsTableColumn.vulnerabilityIdColumnLabel": "脆弱性",
"xpack.csp.findings.findingsTable.findingsTableColumn.vulnerabilityScoreColumnLabel": "CVSS",
"xpack.csp.findings.findingsTable.findingsTableColumn.vulnerabilitySeverityColumnLabel": "深刻度",
"xpack.csp.findings.gcpIntegration.gcpInputText.credentialFileText": "サブスクライブに使用される資格情報とキーを含むJSONファイルへのパス",
"xpack.csp.findings.gcpIntegration.gcpInputText.credentialJSONText": "サブスクライブに使用される資格情報とキーを含むJSON blob",
"xpack.csp.findings.gcpIntegration.gcpInputText.credentialSelectBoxTitle": "資格情報",

View file

@ -12932,20 +12932,6 @@
"xpack.csp.findings.findingsFlyout.ruleTab.tagsTitle": "标签",
"xpack.csp.findings.findingsFlyout.ruleTabTitle": "规则",
"xpack.csp.findings.findingsFlyout.tableTabTitle": "表",
"xpack.csp.findings.findingsTable.findingsTableColumn.lastCheckedColumnLabel": "上次检查时间",
"xpack.csp.findings.findingsTable.findingsTableColumn.packageFixedVersionColumnLabel": "修复版本",
"xpack.csp.findings.findingsTable.findingsTableColumn.packageNameColumnLabel": "软件包",
"xpack.csp.findings.findingsTable.findingsTableColumn.packageVersionColumnLabel": "版本",
"xpack.csp.findings.findingsTable.findingsTableColumn.resourceIdColumnLabel": "资源 ID",
"xpack.csp.findings.findingsTable.findingsTableColumn.resourceNameColumnLabel": "资源名称",
"xpack.csp.findings.findingsTable.findingsTableColumn.resourceTypeColumnLabel": "资源类型",
"xpack.csp.findings.findingsTable.findingsTableColumn.resultColumnLabel": "结果",
"xpack.csp.findings.findingsTable.findingsTableColumn.ruleNameColumnLabel": "规则名称",
"xpack.csp.findings.findingsTable.findingsTableColumn.ruleNumberColumnLabel": "规则编号",
"xpack.csp.findings.findingsTable.findingsTableColumn.ruleSectionColumnLabel": "CIS 部分",
"xpack.csp.findings.findingsTable.findingsTableColumn.vulnerabilityIdColumnLabel": "漏洞",
"xpack.csp.findings.findingsTable.findingsTableColumn.vulnerabilityScoreColumnLabel": "CVSS",
"xpack.csp.findings.findingsTable.findingsTableColumn.vulnerabilitySeverityColumnLabel": "严重性",
"xpack.csp.findings.gcpIntegration.gcpInputText.credentialFileText": "包含用于订阅的凭据和密钥的 JSON 文件的路径",
"xpack.csp.findings.gcpIntegration.gcpInputText.credentialJSONText": "包含用于订阅的凭据和密钥的 JSON Blob",
"xpack.csp.findings.gcpIntegration.gcpInputText.credentialSelectBoxTitle": "凭据",

View file

@ -403,7 +403,7 @@ export default function ({ getPageObjects, getService }: FtrProviderContext) {
await groupSelector.setValue('Resource');
// Filter bar uses the field's customLabel in the DataView
await filterBar.addFilter({ field: 'Rule Name', operation: 'is', value: ruleName1 });
await filterBar.addFilter({ field: 'rule.name', operation: 'is', value: ruleName1 });
expect(await filterBar.hasFilter('rule.name', ruleName1)).to.be(true);
const grouping = await findings.findingsGrouping();