[8.6] [Cloud Posture] update data views spaces (#148093)

# Backport

This will backport the following commits from `main` to `8.6`:
- [[Cloud Posture] update data views
spaces](https://github.com/elastic/kibana/pull/148087)

<!--- Backport version: 8.9.7 -->

### Questions ?
Please refer to the [Backport tool
documentation](https://github.com/sqren/backport)

<!--BACKPORT [{"author":{"name":"Ido
Cohen","email":"90558359+CohenIdo@users.noreply.github.com"},"sourceCommit":{"committedDate":"2022-12-26T13:08:50Z","message":"[Cloud
Posture] update data views
spaces","sha":"4cd9246639cf67b7e3d85ab8a966add8deffacde","branchLabelMapping":{"^v8.7.0$":"main","^v(\\d+).(\\d+).\\d+$":"$1.$2"}},"sourcePullRequest":{"labels":["release_note:skip","ReleaseStatus","v8.6.0","v8.7.0"],"number":148087,"url":"https://github.com/elastic/kibana/pull/148087","mergeCommit":{"message":"[Cloud
Posture] update data views
spaces","sha":"4cd9246639cf67b7e3d85ab8a966add8deffacde"}},"sourceBranch":"main","suggestedTargetBranches":["8.6"],"targetPullRequestStates":[{"branch":"8.6","label":"v8.6.0","labelRegex":"^v(\\d+).(\\d+).\\d+$","isSourceBranch":false,"state":"NOT_CREATED"},{"branch":"main","label":"v8.7.0","labelRegex":"^v8.7.0$","isSourceBranch":true,"state":"MERGED","url":"https://github.com/elastic/kibana/pull/148087","number":148087,"mergeCommit":{"message":"[Cloud
Posture] update data views
spaces","sha":"4cd9246639cf67b7e3d85ab8a966add8deffacde"}}]}]
BACKPORT-->

Co-authored-by: Ido Cohen <90558359+CohenIdo@users.noreply.github.com>
This commit is contained in:
Kibana Machine 2022-12-26 09:13:47 -05:00 committed by GitHub
parent 6a5d6d96a5
commit b4a10d4356
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 88 additions and 2 deletions

View file

@ -55,6 +55,18 @@ describe('create CSP rules with post package create callback', () => {
it('should create stateful rules based on rule template', async () => {
const mockPackagePolicy = createPackagePolicyMock();
mockPackagePolicy.package!.name = CLOUD_SECURITY_POSTURE_PACKAGE_NAME;
mockSoClient.find.mockResolvedValueOnce({
saved_objects: [
{
type: 'index-pattern',
title: 'cloud_security_posture-41308bcdaaf665761478bb6f0d745a5c',
namespaces: ['default'],
},
],
pit_id: undefined,
} as unknown as SavedObjectsFindResponse);
mockSoClient.find.mockResolvedValueOnce({
saved_objects: [
{
@ -83,6 +95,17 @@ describe('create CSP rules with post package create callback', () => {
it('validate that all rules templates are fetched', async () => {
const mockPackagePolicy = createPackagePolicyMock();
mockPackagePolicy.package!.name = CLOUD_SECURITY_POSTURE_PACKAGE_NAME;
mockSoClient.find.mockResolvedValueOnce({
saved_objects: [
{
type: 'index-pattern',
title: 'cloud_security_posture-41308bcdaaf665761478bb6f0d745a5c',
namespaces: ['default'],
},
],
pit_id: undefined,
} as unknown as SavedObjectsFindResponse);
mockSoClient.find.mockResolvedValueOnce({
saved_objects: [
{
@ -93,11 +116,58 @@ describe('create CSP rules with post package create callback', () => {
],
pit_id: undefined,
} as unknown as SavedObjectsFindResponse);
await onPackagePolicyPostCreateCallback(logger, mockPackagePolicy, mockSoClient);
expect(mockSoClient.find.mock.calls[0][0]).toMatchObject({ perPage: 10000 });
expect(mockSoClient.find.mock.calls[1][0]).toMatchObject({ perPage: 10000 });
});
it.each([
['cloud_security_posture-41308bcdaaf665761478bb6f0d55555', ['default']],
['cloud_security_posture-41308bcdaaf665761478bb6f0d88888', ['foo']],
])(
'validate that all index pattern are available cross spaces',
async (id: string, namespaces: string[]) => {
const mockPackagePolicy = createPackagePolicyMock();
mockPackagePolicy.package!.name = CLOUD_SECURITY_POSTURE_PACKAGE_NAME;
mockSoClient.find.mockResolvedValueOnce({
saved_objects: [
{
type: 'index-pattern',
id,
namespaces,
},
],
pit_id: undefined,
} as unknown as SavedObjectsFindResponse);
mockSoClient.find.mockResolvedValueOnce({
saved_objects: [
{
type: 'csp-rule-template',
title: 'csp_rule_template-41308bcdaaf665761478bb6f0d745a5c',
attributes: { ...ruleAttributes },
},
],
pit_id: undefined,
} as unknown as SavedObjectsFindResponse);
await onPackagePolicyPostCreateCallback(logger, mockPackagePolicy, mockSoClient);
expect(mockSoClient.updateObjectsSpaces).toHaveBeenCalled();
expect(mockSoClient.updateObjectsSpaces).lastCalledWith(
[
{
id,
type: 'index-pattern',
},
],
['*'],
[]
);
}
);
it('validate that all rules templates are deleted', async () => {
savedObjectRepositoryMock = savedObjectsRepositoryMock.create();
const mockDeletePackagePolicy = deletePackagePolicyMock();

View file

@ -18,6 +18,7 @@ import {
PackagePolicyInput,
} from '@kbn/fleet-plugin/common';
import { DeepReadonly } from 'utility-types';
import { DataViewSavedObjectAttrs } from '@kbn/data-views-plugin/common';
import { createCspRuleSearchFilterByPackagePolicy } from '../../common/utils/helpers';
import {
CLOUD_SECURITY_POSTURE_PACKAGE_NAME,
@ -53,8 +54,9 @@ export const onPackagePolicyPostCreateCallback = async (
packagePolicy: PackagePolicy,
savedObjectsClient: SavedObjectsClientContract
): Promise<void> => {
const benchmarkType = getBenchmarkInputType(packagePolicy.inputs);
addDataViewToAllSpaces(savedObjectsClient);
const benchmarkType = getBenchmarkInputType(packagePolicy.inputs);
// Create csp-rules from the generic asset
const existingRuleTemplates: SavedObjectsFindResponse<CspRuleTemplate> =
await savedObjectsClient.find({
@ -83,6 +85,20 @@ export const onPackagePolicyPostCreateCallback = async (
}
};
async function addDataViewToAllSpaces(savedObjectsClient: SavedObjectsClientContract) {
const cspmDataViews = await savedObjectsClient.find<DataViewSavedObjectAttrs>({
type: 'index-pattern',
fields: ['title'],
search: CLOUD_SECURITY_POSTURE_PACKAGE_NAME + '*',
searchFields: ['title'],
perPage: 100,
});
cspmDataViews.saved_objects.forEach((dataView) => {
savedObjectsClient.updateObjectsSpaces([{ id: dataView.id, type: 'index-pattern' }], ['*'], []);
});
}
/**
* Callback to handle deletion of PackagePolicies in Fleet
*/