From 6657b9d856ef7c9055634635b058ca040d101328 Mon Sep 17 00:00:00 2001 From: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> Date: Wed, 18 Dec 2024 06:20:58 +1100 Subject: [PATCH 01/23] [8.x] [Fleet] Remove adopted showDevToolRequest feature flag (#204586) (#204618) --- .../fleet/common/experimental_features.ts | 1 - .../hooks/devtools_request.tsx | 8 +--- .../components/settings/index.tsx | 42 +++++++++---------- .../components/create_agent_policy.tsx | 36 +++++++--------- 4 files changed, 36 insertions(+), 51 deletions(-) diff --git a/x-pack/plugins/fleet/common/experimental_features.ts b/x-pack/plugins/fleet/common/experimental_features.ts index 1c42bf3ab2afe..1cf35952904aa 100644 --- a/x-pack/plugins/fleet/common/experimental_features.ts +++ b/x-pack/plugins/fleet/common/experimental_features.ts @@ -10,7 +10,6 @@ export type ExperimentalFeatures = typeof allowedExperimentalValues; const _allowedExperimentalValues = { createPackagePolicyMultiPageLayout: true, packageVerification: true, - showDevtoolsRequest: true, diagnosticFileUploadEnabled: true, displayAgentMetrics: true, showIntegrationsSubcategories: true, diff --git a/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/create_package_policy_page/single_page_layout/hooks/devtools_request.tsx b/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/create_package_policy_page/single_page_layout/hooks/devtools_request.tsx index 91ca089f2ffe3..81f2304efee99 100644 --- a/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/create_package_policy_page/single_page_layout/hooks/devtools_request.tsx +++ b/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/create_package_policy_page/single_page_layout/hooks/devtools_request.tsx @@ -11,7 +11,6 @@ import { i18n } from '@kbn/i18n'; import { omit } from 'lodash'; import { set } from '@kbn/safer-lodash-set'; -import { ExperimentalFeaturesService } from '../../../../../services'; import { generateCreatePackagePolicyDevToolsRequest, generateCreateAgentPolicyDevToolsRequest, @@ -39,12 +38,7 @@ export function useDevToolsRequest({ packageInfo?: PackageInfo; packagePolicyId?: string; }) { - const { showDevtoolsRequest: isShowDevtoolRequestExperimentEnabled } = - ExperimentalFeaturesService.get(); - - const showDevtoolsRequest = - !HIDDEN_API_REFERENCE_PACKAGES.includes(packageInfo?.name ?? '') && - isShowDevtoolRequestExperimentEnabled; + const showDevtoolsRequest = !HIDDEN_API_REFERENCE_PACKAGES.includes(packageInfo?.name ?? ''); const [devtoolRequest, devtoolRequestDescription] = useMemo(() => { if (selectedPolicyTab === SelectedPolicyTab.NEW) { diff --git a/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/details_page/components/settings/index.tsx b/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/details_page/components/settings/index.tsx index 990e787efc0a3..98bad982c35ff 100644 --- a/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/details_page/components/settings/index.tsx +++ b/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/details_page/components/settings/index.tsx @@ -40,7 +40,6 @@ import { ConfirmDeployAgentPolicyModal, } from '../../../components'; import { DevtoolsRequestFlyoutButton } from '../../../../../components'; -import { ExperimentalFeaturesService } from '../../../../../services'; import { generateUpdateAgentPolicyDevToolsRequest } from '../../../services'; import { UNKNOWN_SPACE } from '../../../../../../../../common/constants'; @@ -155,7 +154,6 @@ export const SettingsView = memo<{ agentPolicy: AgentPolicy }>( setIsLoading(false); }; - const { showDevtoolsRequest } = ExperimentalFeaturesService.get(); const devtoolRequest = useMemo( () => generateUpdateAgentPolicyDevToolsRequest( @@ -235,28 +233,26 @@ export const SettingsView = memo<{ agentPolicy: AgentPolicy }>( /> - {showDevtoolsRequest ? ( - - 0 || - hasAdvancedSettingsErrors || - hasInvalidSpaceError + + 0 || + hasAdvancedSettingsErrors || + hasInvalidSpaceError + } + btnProps={{ + color: 'text', + }} + description={i18n.translate( + 'xpack.fleet.editAgentPolicy.devtoolsRequestDescription', + { + defaultMessage: 'This Kibana request updates an agent policy.', } - btnProps={{ - color: 'text', - }} - description={i18n.translate( - 'xpack.fleet.editAgentPolicy.devtoolsRequestDescription', - { - defaultMessage: 'This Kibana request updates an agent policy.', - } - )} - request={devtoolRequest} - /> - - ) : null} + )} + request={devtoolRequest} + /> + = ({ /> ); - const { showDevtoolsRequest } = ExperimentalFeaturesService.get(); const agentPolicyContent = useMemo( () => generateCreateAgentPolicyDevToolsRequest(agentPolicy, withSysMonitoring), [agentPolicy, withSysMonitoring] @@ -128,25 +126,23 @@ export const CreateAgentPolicyFlyout: React.FunctionComponent = ({ - {showDevtoolsRequest ? ( - - 0 || - hasAdvancedSettingsErrors || - hasInvalidSpaceError + + 0 || + hasAdvancedSettingsErrors || + hasInvalidSpaceError + } + description={i18n.translate( + 'xpack.fleet.createAgentPolicy.devtoolsRequestDescription', + { + defaultMessage: 'This Kibana request creates a new agent policy.', } - description={i18n.translate( - 'xpack.fleet.createAgentPolicy.devtoolsRequestDescription', - { - defaultMessage: 'This Kibana request creates a new agent policy.', - } - )} - request={agentPolicyContent} - /> - - ) : null} + )} + request={agentPolicyContent} + /> + Date: Wed, 18 Dec 2024 06:29:29 +1100 Subject: [PATCH 02/23] [8.x] [Observability] Update required field from 'score' to 'scores' (#203584) (#204614) --- .../server/utils/recall/score_suggestions.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/x-pack/platform/plugins/shared/observability_solution/observability_ai_assistant/server/utils/recall/score_suggestions.ts b/x-pack/platform/plugins/shared/observability_solution/observability_ai_assistant/server/utils/recall/score_suggestions.ts index 7d1a19463cceb..b57e5928ce0ba 100644 --- a/x-pack/platform/plugins/shared/observability_solution/observability_ai_assistant/server/utils/recall/score_suggestions.ts +++ b/x-pack/platform/plugins/shared/observability_solution/observability_ai_assistant/server/utils/recall/score_suggestions.ts @@ -102,7 +102,7 @@ export async function scoreSuggestions({ type: 'string', }, }, - required: ['score'], + required: ['scores'], } as const, }; From 4f1b9b2ea97d7bf03a3c21377c5d04795673b7f2 Mon Sep 17 00:00:00 2001 From: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> Date: Wed, 18 Dec 2024 06:29:41 +1100 Subject: [PATCH 03/23] [8.x] Fix code scanning alert no. 494: Incomplete string escaping or encoding (#204528) (#204616) # Backport This will backport the following commits from `main` to `8.x`: - [Fix code scanning alert no. 494: Incomplete string escaping or encoding (#204528)](https://github.com/elastic/kibana/pull/204528) ### Questions ? Please refer to the [Backport tool documentation](https://github.com/sqren/backport) Co-authored-by: Faisal Kanout --- .../public/components/rule_condition_chart/helpers.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/x-pack/solutions/observability/plugins/observability/public/components/rule_condition_chart/helpers.ts b/x-pack/solutions/observability/plugins/observability/public/components/rule_condition_chart/helpers.ts index 30663d02cda72..775da2fc1c805 100644 --- a/x-pack/solutions/observability/plugins/observability/public/components/rule_condition_chart/helpers.ts +++ b/x-pack/solutions/observability/plugins/observability/public/components/rule_condition_chart/helpers.ts @@ -18,7 +18,7 @@ export const getLensOperationFromRuleMetric = (metric: GenericMetric): LensOpera const { aggType, field, filter = '' } = metric; let operation: string = aggType; const operationArgs: string[] = []; - const escapedFilter = filter.replace(/'/g, "\\'"); + const escapedFilter = filter.replace(/\\/g, '\\\\').replace(/'/g, "\\'"); if (aggType === Aggregators.RATE) { return { From f77fc58383202e136095d7a6ab011b95bd53b540 Mon Sep 17 00:00:00 2001 From: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> Date: Wed, 18 Dec 2024 06:29:59 +1100 Subject: [PATCH 04/23] [8.x] Fix share modal copy embed code (#204584) (#204623) # Backport This will backport the following commits from `main` to `8.x`: - [Fix share modal copy embed code (#204584)](https://github.com/elastic/kibana/pull/204584) ### Questions ? Please refer to the [Backport tool documentation](https://github.com/sqren/backport) ","sha":"effd84dc41c702b0a82631ee5777fed7f14dfb61","branchLabelMapping":{"^v9.0.0$":"main","^v8.18.0$":"8.x","^v(\\d+).(\\d+).\\d+$":"$1.$2"}},"sourcePullRequest":{"labels":["release_note:skip","v9.0.0","Team:SharedUX","backport:prev-major"],"title":"Fix share modal copy embed code","number":204584,"url":"https://github.com/elastic/kibana/pull/204584","mergeCommit":{"message":"Fix share modal copy embed code (#204584)\n\n## Summary\r\n\r\nCloses https://github.com/elastic/kibana/issues/204312\r\n\r\nThis PR removes an unnecessary function, that causes an infinite render\r\nloop for visualisations.\r\n\r\n\r\n## After\r\n\r\n\r\nhttps://github.com/user-attachments/assets/259d238b-c1cf-4d74-bfca-1a6440d0f5cd\r\n\r\n## How to test\r\n- From the left side nav, click the `Visualize Library` menu item,\r\nattempt to create a legacy visualisation, any one of choice and attempt\r\nsharing said created visualisation clicking the copy embed code should\r\nnot result in any error but rather copy the embed code with the visual\r\nfeedback.\r\n\r\n","sha":"effd84dc41c702b0a82631ee5777fed7f14dfb61"}},"sourceBranch":"main","suggestedTargetBranches":[],"targetPullRequestStates":[{"branch":"main","label":"v9.0.0","branchLabelMappingKey":"^v9.0.0$","isSourceBranch":true,"state":"MERGED","url":"https://github.com/elastic/kibana/pull/204584","number":204584,"mergeCommit":{"message":"Fix share modal copy embed code (#204584)\n\n## Summary\r\n\r\nCloses https://github.com/elastic/kibana/issues/204312\r\n\r\nThis PR removes an unnecessary function, that causes an infinite render\r\nloop for visualisations.\r\n\r\n\r\n## After\r\n\r\n\r\nhttps://github.com/user-attachments/assets/259d238b-c1cf-4d74-bfca-1a6440d0f5cd\r\n\r\n## How to test\r\n- From the left side nav, click the `Visualize Library` menu item,\r\nattempt to create a legacy visualisation, any one of choice and attempt\r\nsharing said created visualisation clicking the copy embed code should\r\nnot result in any error but rather copy the embed code with the visual\r\nfeedback.\r\n\r\n","sha":"effd84dc41c702b0a82631ee5777fed7f14dfb61"}}]}] BACKPORT--> Co-authored-by: Eyo O. Eyo <7893459+eokoneyo@users.noreply.github.com> --- .../tabs/embed/embed_content.test.tsx | 7 +--- .../components/tabs/embed/embed_content.tsx | 6 ---- .../public/components/tabs/embed/index.tsx | 34 +------------------ 3 files changed, 2 insertions(+), 45 deletions(-) diff --git a/src/plugins/share/public/components/tabs/embed/embed_content.test.tsx b/src/plugins/share/public/components/tabs/embed/embed_content.test.tsx index ee9fdf01588df..edbb9ebb47995 100644 --- a/src/plugins/share/public/components/tabs/embed/embed_content.test.tsx +++ b/src/plugins/share/public/components/tabs/embed/embed_content.test.tsx @@ -18,12 +18,7 @@ describe('Share modal embed content tab', () => { beforeEach(() => { component = mountWithIntl( - jest.fn()} - shareableUrl="/home#/" - /> + ); }); diff --git a/src/plugins/share/public/components/tabs/embed/embed_content.tsx b/src/plugins/share/public/components/tabs/embed/embed_content.tsx index 5a9163097c8dc..a3bc6048e64e5 100644 --- a/src/plugins/share/public/components/tabs/embed/embed_content.tsx +++ b/src/plugins/share/public/components/tabs/embed/embed_content.tsx @@ -34,7 +34,6 @@ type EmbedProps = Pick< | 'objectType' | 'isDirty' > & { - setIsNotSaved: () => void; objectConfig?: ShareContextObjectTypeConfig; }; @@ -55,7 +54,6 @@ export const EmbedContent = ({ shareableUrl, objectType, objectConfig = {}, - setIsNotSaved, isDirty, }: EmbedProps) => { const isMounted = useMountedState(); @@ -67,10 +65,6 @@ export const EmbedContent = ({ const [anonymousAccessParameters] = useState(null); const [usePublicUrl] = useState(false); - useEffect(() => { - if (objectType !== 'dashboard') setIsNotSaved(); - }, [url, setIsNotSaved, objectType]); - const makeUrlEmbeddable = useCallback((tempUrl: string): string => { const embedParam = '?embed=true'; const urlHasQueryString = tempUrl.indexOf('?') !== -1; diff --git a/src/plugins/share/public/components/tabs/embed/index.tsx b/src/plugins/share/public/components/tabs/embed/index.tsx index 44d61833268cd..3c74ce3fe0b13 100644 --- a/src/plugins/share/public/components/tabs/embed/index.tsx +++ b/src/plugins/share/public/components/tabs/embed/index.tsx @@ -8,35 +8,13 @@ */ import { i18n } from '@kbn/i18n'; -import React, { useCallback } from 'react'; +import React from 'react'; import { type IModalTabDeclaration } from '@kbn/shared-ux-tabbed-modal'; import { EmbedContent } from './embed_content'; import { useShareTabsContext } from '../../context'; -const EMBED_TAB_ACTIONS = { - SET_EMBED_URL: 'SET_EMBED_URL', - SET_IS_NOT_SAVED: 'SET_IS_NOT_SAVED', -}; - type IEmbedTab = IModalTabDeclaration<{ url: string; isNotSaved: boolean }>; -const embedTabReducer: IEmbedTab['reducer'] = (state = { url: '', isNotSaved: false }, action) => { - switch (action.type) { - case EMBED_TAB_ACTIONS.SET_IS_NOT_SAVED: - return { - ...state, - isNotSaved: action.payload, - }; - case EMBED_TAB_ACTIONS.SET_IS_NOT_SAVED: - return { - ...state, - isNotSaved: action.payload, - }; - default: - return state; - } -}; - const EmbedTabContent: NonNullable = ({ state, dispatch }) => { const { embedUrlParamExtensions, @@ -47,13 +25,6 @@ const EmbedTabContent: NonNullable = ({ state, dispatch }) isDirty, } = useShareTabsContext()!; - const setIsNotSaved = useCallback(() => { - dispatch({ - type: EMBED_TAB_ACTIONS.SET_IS_NOT_SAVED, - payload: objectType === 'dashboard' ? isDirty : false, - }); - }, [dispatch, objectType, isDirty]); - return ( = ({ state, dispatch }) shareableUrl, objectType, objectConfig: objectTypeMeta?.config?.embed, - isNotSaved: state?.isNotSaved, - setIsNotSaved, isDirty, }} /> @@ -75,6 +44,5 @@ export const embedTab: IEmbedTab = { name: i18n.translate('share.contextMenu.embedCodeTab', { defaultMessage: 'Embed', }), - reducer: embedTabReducer, content: EmbedTabContent, }; From 7b31a48940e883acf5fae88ab6272b3b84e92641 Mon Sep 17 00:00:00 2001 From: Tim Sullivan Date: Tue, 17 Dec 2024 12:31:57 -0700 Subject: [PATCH 05/23] [8.x/Docs/Reporting] Update guidance for xpack.reporting.roles.enabled (#203703) ## Summary The purpose of this PR is to clarify the 8.x documentation of `xpack.reporting.roles.enabled`, and to focus on wording that encourages users to set `xpack.reporting.roles.enabled: false` as a way to take advantage of a newer access control model and grant users the least amount of privilege they need. This adds more explain to what the `xpack.reporting.roles.enabled` setting actually does, and explain that these concerns are specific to 8.x. --------- Co-authored-by: Clint Andrew Hall Co-authored-by: Jean-Louis Leysens --- docs/settings/reporting-settings.asciidoc | 24 ++++++++++++++++------- docs/setup/configuring-reporting.asciidoc | 10 +++++++--- 2 files changed, 24 insertions(+), 10 deletions(-) diff --git a/docs/settings/reporting-settings.asciidoc b/docs/settings/reporting-settings.asciidoc index 49aa22de9fd35..9dd84ce14a56b 100644 --- a/docs/settings/reporting-settings.asciidoc +++ b/docs/settings/reporting-settings.asciidoc @@ -68,17 +68,27 @@ are allowed to generate reports. [NOTE] ============================================================================ -The `xpack.reporting.roles` settings are for a deprecated system of access control in Reporting. Turning off -this feature allows API keys to generate reports, and allows reporting access through {kib} application -privileges. We recommend that you explicitly turn off reporting's deprecated access control feature by adding -`xpack.reporting.roles.enabled: false` to kibana.yml. This will enable you to create custom roles that provide -application privileges for reporting, as described in <>. + +In version 9.0, the `xpack.reporting.roles.enabled` setting will be ignored. {kib} will only use the access control model based on application +privileges, and the built-in `reporting_user` role will have the necessary privileges to generate reports everywhere that Reporting is supported in +{kib} as of version 9.0. We still recommend that you create custom roles with granular application privileges, in order to grant the least amount of +privilege that users need. ============================================================================ [[xpack-reporting-roles-enabled]] `xpack.reporting.roles.enabled`:: -deprecated:[7.14.0,The default for this setting will be `false` in an upcoming version of {kib}.] Sets access -control to a set of assigned reporting roles, specified by `xpack.reporting.roles.allow`. Defaults to `true`. +deprecated:[7.14.0,This setting will be ignored in an upcoming version of {kib}.] Sets access +control to allow users to generate reports when they are assigned the built-in `reporting_user` +role. This also grants privileges to users that have a role from a set of assigned reporting +roles, specified by `xpack.reporting.roles.allow`. Defaults to `true`. `xpack.reporting.roles.allow`:: deprecated:[7.14.0] In addition to superusers, specifies the roles that can generate reports using the diff --git a/docs/setup/configuring-reporting.asciidoc b/docs/setup/configuring-reporting.asciidoc index 61ef028d1504f..990e814267ae6 100644 --- a/docs/setup/configuring-reporting.asciidoc +++ b/docs/setup/configuring-reporting.asciidoc @@ -35,16 +35,20 @@ to enable the {kib} server to have screenshotting capabilities. [float] [[grant-user-access]] === Grant users access to reporting -When security is enabled, you grant users access to {report-features} with <>, which allow you to create custom roles that control the spaces and applications where users generate reports. +When security is enabled, the preferred method to grant users access to {report-features} is with <>. This will allow you to create custom roles that control the spaces and applications where users may generate reports. -. Enable application privileges in Reporting. To enable, turn off the default user access control features in `kibana.yml`: +. We recommend you explicitly opt-out of the default access control model, which will enable application privileges in Reporting. To do this, change a setting that controls the Reporting access control model in `kibana.yml`: + [source,yaml] ------------------------------------ xpack.reporting.roles.enabled: false ------------------------------------ + -NOTE: If you use the default settings, you can still create a custom role that grants reporting privileges. The default role is `reporting_user`. This behavior is being deprecated and does not allow application-level access controls for {report-features}, and does not allow API keys or authentication tokens to authorize report generation. Refer to <> for information and caveats about the deprecated access control features. +NOTE: In Kibana 8.x versions, the default `xpack.reporting.roles.enabled: true` setting uses an older access control model separate from {kib} application +privileges. The default model grants users with the built-in `reporting_user` role access to create any type of report in Kibana. Since the default model +is not based on {kib} application privileges, users that do not have permission to create reports will see {report-features} in Kibana, but will receive an +error if they attempt to request a report. The default model also does not allow API keys or authentication tokens to authorize report generation. Refer to +<> for information and caveats about the `xpack.reporting.roles.enabled` settings. . Create the reporting role. From 0bdde5725da2e6a15902ec4c43add5a346d68993 Mon Sep 17 00:00:00 2001 From: Shahzad Date: Tue, 17 Dec 2024 20:32:39 +0100 Subject: [PATCH 06/23] [8.x] [Obs UX Management] Migrate leftover code owner !! (#203814) (#203997) # Backport This will backport the following commits from `main` to `8.x`: - [[Obs UX Management] Migrate leftover code owner !! (#203814)](https://github.com/elastic/kibana/pull/203814) ### Questions ? Please refer to the [Backport tool documentation](https://github.com/sqren/backport) --- .github/CODEOWNERS | 2 +- x-pack/solutions/observability/plugins/ux/kibana.jsonc | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index d2243943f7365..79ca8aec8a9ba 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -1010,7 +1010,7 @@ x-pack/test/security_api_integration/plugins/user_profiles_consumer @elastic/kib packages/kbn-utility-types @elastic/kibana-core packages/kbn-utility-types-jest @elastic/kibana-operations packages/kbn-utils @elastic/kibana-operations -x-pack/solutions/observability/plugins/ux @elastic/obs-ux-infra_services-team +x-pack/solutions/observability/plugins/ux @elastic/obs-ux-management-team examples/v8_profiler_examples @elastic/response-ops packages/kbn-validate-next-docs-cli @elastic/kibana-operations src/plugins/vis_default_editor @elastic/kibana-visualizations diff --git a/x-pack/solutions/observability/plugins/ux/kibana.jsonc b/x-pack/solutions/observability/plugins/ux/kibana.jsonc index f2770a896d89b..6626a9e414612 100644 --- a/x-pack/solutions/observability/plugins/ux/kibana.jsonc +++ b/x-pack/solutions/observability/plugins/ux/kibana.jsonc @@ -2,7 +2,7 @@ "type": "plugin", "id": "@kbn/ux-plugin", "owner": [ - "@elastic/obs-ux-infra_services-team" + "@elastic/obs-ux-management-team" ], "group": "observability", "visibility": "private", @@ -46,4 +46,4 @@ "maps" ] } -} \ No newline at end of file +} From 7f08a31738b8a85d7e14a9c8260cea693b771f1a Mon Sep 17 00:00:00 2001 From: Lisa Cawley Date: Tue, 17 Dec 2024 11:32:49 -0800 Subject: [PATCH 07/23] [8.x] [DOCS] Add case subfeature privileges (#204295) (#204447) # Backport This will backport the following commits from `main` to `8.x`: - [[DOCS] Add case subfeature privileges (#204295)](https://github.com/elastic/kibana/pull/204295) ### Questions ? Please refer to the [Backport tool documentation](https://github.com/sqren/backport) --- docs/management/cases/setup-cases.asciidoc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/management/cases/setup-cases.asciidoc b/docs/management/cases/setup-cases.asciidoc index b15d3c884bf79..90c6bd29be561 100644 --- a/docs/management/cases/setup-cases.asciidoc +++ b/docs/management/cases/setup-cases.asciidoc @@ -24,7 +24,7 @@ The *{connectors-feature}* feature privilege is required to create, add, delete, and modify case connectors and to send updates to external systems. By default, `All` for the *Cases* feature includes authority to delete cases -and comments and edit case settings unless you customize the sub-feature privileges. +and comments, edit case settings, add case comments and attachments, and re-open cases unless you customize the sub-feature privileges. ==== | Give assignee access to cases @@ -41,7 +41,7 @@ This privilege is also required to add <> to rul | Give view-only access to cases a| `Read` for the *Cases* feature under *Management*. -NOTE: By default, `Read` for the *Cases* feature does not include authority to delete cases and comments or edit case settings. You can grant this authority by customizing the sub-feature privileges. +NOTE: You can customize sub-feature privileges for deleting cases and comments, editing case settings, adding case comments and attachments, and re-opening cases. | Revoke all access to cases | `None` for the *Cases* feature under *Management*. From 0862bdef389a109568535fc1a6ab35388045b227 Mon Sep 17 00:00:00 2001 From: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> Date: Wed, 18 Dec 2024 06:33:00 +1100 Subject: [PATCH 08/23] [8.x] [Embeddables Rebuild] Make Serialize Function Synchronous (#203662) (#204470) # Backport This will backport the following commits from `main` to `8.x`: - [[Embeddables Rebuild] Make Serialize Function Synchronous (#203662)](https://github.com/elastic/kibana/pull/203662) ### Questions ? Please refer to the [Backport tool documentation](https://github.com/sqren/backport) Co-authored-by: Devon Thomson --- .../react_control_example.tsx | 4 +- .../page_api.ts | 5 +- .../state_management_example.tsx | 9 +- .../saved_book/create_saved_book_action.tsx | 23 ++-- .../saved_book/saved_book_editor.tsx | 107 +++++++++++------- .../saved_book/saved_book_library.ts | 2 +- .../saved_book_react_embeddable.tsx | 19 ++-- examples/embeddable_examples/tsconfig.json | 1 - .../interfaces/serialized_state.ts | 3 +- .../presentation_containers/tsconfig.json | 1 - src/plugins/controls/public/controls/types.ts | 8 +- .../copy_to_dashboard_modal.tsx | 4 +- .../public/dashboard_api/get_dashboard_api.ts | 10 +- .../public/dashboard_api/panels_manager.ts | 60 ++++------ .../dashboard/public/dashboard_api/types.ts | 2 +- .../get_search_embeddable_factory.tsx | 5 +- .../discover/public/embeddable/types.ts | 7 +- .../utils/serialization_utils.test.ts | 23 ++-- .../embeddable/utils/serialization_utils.ts | 15 +-- .../react_embeddable_renderer.tsx | 12 +- .../public/embeddable/links_embeddable.tsx | 2 +- 21 files changed, 156 insertions(+), 166 deletions(-) diff --git a/examples/controls_example/public/app/react_control_example/react_control_example.tsx b/examples/controls_example/public/app/react_control_example/react_control_example.tsx index 30111c21f1927..b6cb97720d79b 100644 --- a/examples/controls_example/public/app/react_control_example/react_control_example.tsx +++ b/examples/controls_example/public/app/react_control_example/react_control_example.tsx @@ -371,10 +371,10 @@ export const ReactControlExample = ({ { + onClick={() => { if (controlGroupApi) { saveNotification$.next(); - setControlGroupSerializedState(await controlGroupApi.serializeState()); + setControlGroupSerializedState(controlGroupApi.serializeState()); } }} > diff --git a/examples/embeddable_examples/public/app/presentation_container_example/page_api.ts b/examples/embeddable_examples/public/app/presentation_container_example/page_api.ts index 59f06847a1538..c08ba7a499b98 100644 --- a/examples/embeddable_examples/public/app/presentation_container_example/page_api.ts +++ b/examples/embeddable_examples/public/app/presentation_container_example/page_api.ts @@ -9,7 +9,6 @@ import { BehaviorSubject, Subject, combineLatest, map, merge } from 'rxjs'; import { v4 as generateId } from 'uuid'; -import { asyncForEach } from '@kbn/std'; import { TimeRange } from '@kbn/es-query'; import { PanelPackage, @@ -146,14 +145,14 @@ export function getPageApi() { }, onSave: async () => { const panelsState: LastSavedState['panelsState'] = []; - await asyncForEach(panels$.value, async ({ id, type }) => { + panels$.value.forEach(({ id, type }) => { try { const childApi = children$.value[id]; if (apiHasSerializableState(childApi)) { panelsState.push({ id, type, - panelState: await childApi.serializeState(), + panelState: childApi.serializeState(), }); } } catch (error) { diff --git a/examples/embeddable_examples/public/app/state_management_example/state_management_example.tsx b/examples/embeddable_examples/public/app/state_management_example/state_management_example.tsx index a3dcd06618155..18ff194769b3d 100644 --- a/examples/embeddable_examples/public/app/state_management_example/state_management_example.tsx +++ b/examples/embeddable_examples/public/app/state_management_example/state_management_example.tsx @@ -21,7 +21,6 @@ import { UiActionsStart } from '@kbn/ui-actions-plugin/public'; import { ViewMode } from '@kbn/presentation-publishing'; import { ReactEmbeddableRenderer } from '@kbn/embeddable-plugin/public'; import { BehaviorSubject, Subject } from 'rxjs'; -import useMountedState from 'react-use/lib/useMountedState'; import { SAVED_BOOK_ID } from '../../react_embeddables/saved_book/constants'; import { BookApi, @@ -32,7 +31,6 @@ import { lastSavedStateSessionStorage } from './last_saved_state'; import { unsavedChangesSessionStorage } from './unsaved_changes'; export const StateManagementExample = ({ uiActions }: { uiActions: UiActionsStart }) => { - const isMounted = useMountedState(); const saveNotification$ = useMemo(() => { return new Subject(); }, []); @@ -123,16 +121,13 @@ export const StateManagementExample = ({ uiActions }: { uiActions: UiActionsStar { + onClick={() => { if (!bookApi) { return; } setIsSaving(true); - const bookSerializedState = await bookApi.serializeState(); - if (!isMounted()) { - return; - } + const bookSerializedState = bookApi.serializeState(); lastSavedStateSessionStorage.save(bookSerializedState); saveNotification$.next(); // signals embeddable unsaved change tracking to update last saved state setHasUnsavedChanges(false); diff --git a/examples/embeddable_examples/public/react_embeddables/saved_book/create_saved_book_action.tsx b/examples/embeddable_examples/public/react_embeddables/saved_book/create_saved_book_action.tsx index dfcff31dd8a8d..09f0e30f4a6ec 100644 --- a/examples/embeddable_examples/public/react_embeddables/saved_book/create_saved_book_action.tsx +++ b/examples/embeddable_examples/public/react_embeddables/saved_book/create_saved_book_action.tsx @@ -11,7 +11,7 @@ import { CoreStart } from '@kbn/core/public'; import { i18n } from '@kbn/i18n'; import { apiCanAddNewPanel } from '@kbn/presentation-containers'; import { EmbeddableApiContext } from '@kbn/presentation-publishing'; -import { IncompatibleActionError, ADD_PANEL_TRIGGER } from '@kbn/ui-actions-plugin/public'; +import { ADD_PANEL_TRIGGER, IncompatibleActionError } from '@kbn/ui-actions-plugin/public'; import { UiActionsPublicStart } from '@kbn/ui-actions-plugin/public/plugin'; import { embeddableExamplesGrouping } from '../embeddable_examples_grouping'; import { @@ -21,7 +21,6 @@ import { } from './book_state'; import { ADD_SAVED_BOOK_ACTION_ID, SAVED_BOOK_ID } from './constants'; import { openSavedBookEditor } from './saved_book_editor'; -import { saveBookAttributes } from './saved_book_library'; import { BookRuntimeState } from './types'; export const registerCreateSavedBookAction = (uiActions: UiActionsPublicStart, core: CoreStart) => { @@ -36,19 +35,17 @@ export const registerCreateSavedBookAction = (uiActions: UiActionsPublicStart, c if (!apiCanAddNewPanel(embeddable)) throw new IncompatibleActionError(); const newPanelStateManager = stateManagerFromAttributes(defaultBookAttributes); - const { addToLibrary } = await openSavedBookEditor(newPanelStateManager, true, core, { - parentApi: embeddable, + const { savedBookId } = await openSavedBookEditor({ + attributesManager: newPanelStateManager, + parent: embeddable, + isCreate: true, + core, }); - const initialState: BookRuntimeState = await (async () => { - const bookAttributes = serializeBookAttributes(newPanelStateManager); - // if we're adding this to the library, we only need to return the by reference state. - if (addToLibrary) { - const savedBookId = await saveBookAttributes(undefined, bookAttributes); - return { savedBookId, ...bookAttributes }; - } - return bookAttributes; - })(); + const bookAttributes = serializeBookAttributes(newPanelStateManager); + const initialState: BookRuntimeState = savedBookId + ? { savedBookId, ...bookAttributes } + : { ...bookAttributes }; embeddable.addNewPanel({ panelType: SAVED_BOOK_ID, diff --git a/examples/embeddable_examples/public/react_embeddables/saved_book/saved_book_editor.tsx b/examples/embeddable_examples/public/react_embeddables/saved_book/saved_book_editor.tsx index c73b6e0bc3bda..0222e682b7b0d 100644 --- a/examples/embeddable_examples/public/react_embeddables/saved_book/saved_book_editor.tsx +++ b/examples/embeddable_examples/public/react_embeddables/saved_book/saved_book_editor.tsx @@ -27,26 +27,32 @@ import { OverlayRef } from '@kbn/core-mount-utils-browser'; import { i18n } from '@kbn/i18n'; import { tracksOverlays } from '@kbn/presentation-containers'; import { - apiHasParentApi, + apiHasInPlaceLibraryTransforms, apiHasUniqueId, useBatchedOptionalPublishingSubjects, } from '@kbn/presentation-publishing'; import { toMountPoint } from '@kbn/react-kibana-mount'; -import React from 'react'; +import React, { useState } from 'react'; import { serializeBookAttributes } from './book_state'; -import { BookAttributesManager } from './types'; +import { BookApi, BookAttributesManager } from './types'; +import { saveBookAttributes } from './saved_book_library'; -export const openSavedBookEditor = ( - attributesManager: BookAttributesManager, - isCreate: boolean, - core: CoreStart, - api: unknown -): Promise<{ addToLibrary: boolean }> => { +export const openSavedBookEditor = ({ + attributesManager, + isCreate, + core, + parent, + api, +}: { + attributesManager: BookAttributesManager; + isCreate: boolean; + core: CoreStart; + parent?: unknown; + api?: BookApi; +}): Promise<{ savedBookId?: string }> => { return new Promise((resolve) => { const closeOverlay = (overlayRef: OverlayRef) => { - if (apiHasParentApi(api) && tracksOverlays(api.parentApi)) { - api.parentApi.clearOverlays(); - } + if (tracksOverlays(parent)) parent.clearOverlays(); overlayRef.close(); }; @@ -54,8 +60,9 @@ export const openSavedBookEditor = ( const overlay = core.overlays.openFlyout( toMountPoint( { // set the state back to the initial state and reject attributesManager.authorName.next(initialState.authorName); @@ -64,16 +71,23 @@ export const openSavedBookEditor = ( attributesManager.numberOfPages.next(initialState.numberOfPages); closeOverlay(overlay); }} - onSubmit={(addToLibrary: boolean) => { + onSubmit={async (addToLibrary: boolean) => { + const savedBookId = addToLibrary + ? await saveBookAttributes( + apiHasInPlaceLibraryTransforms(api) ? api.libraryId$.value : undefined, + serializeBookAttributes(attributesManager) + ) + : undefined; + closeOverlay(overlay); - resolve({ addToLibrary }); + resolve({ savedBookId }); }} />, core ), { type: isCreate ? 'overlay' : 'push', - size: isCreate ? 'm' : 's', + size: 'm', onClose: () => closeOverlay(overlay), } ); @@ -83,9 +97,7 @@ export const openSavedBookEditor = ( * if our parent needs to know about the overlay, notify it. This allows the parent to close the overlay * when navigating away, or change certain behaviors based on the overlay being open. */ - if (apiHasParentApi(api) && tracksOverlays(api.parentApi)) { - api.parentApi.openOverlay(overlay, overlayOptions); - } + if (tracksOverlays(parent)) parent.openOverlay(overlay, overlayOptions); }); }; @@ -94,19 +106,24 @@ export const SavedBookEditor = ({ isCreate, onSubmit, onCancel, + api, }: { attributesManager: BookAttributesManager; isCreate: boolean; - onSubmit: (addToLibrary: boolean) => void; + onSubmit: (addToLibrary: boolean) => Promise; onCancel: () => void; + api?: BookApi; }) => { - const [addToLibrary, setAddToLibrary] = React.useState(false); - const [authorName, synopsis, bookTitle, numberOfPages] = useBatchedOptionalPublishingSubjects( - attributesManager.authorName, - attributesManager.bookSynopsis, - attributesManager.bookTitle, - attributesManager.numberOfPages - ); + const [libraryId, authorName, synopsis, bookTitle, numberOfPages] = + useBatchedOptionalPublishingSubjects( + api?.libraryId$, + attributesManager.authorName, + attributesManager.bookSynopsis, + attributesManager.bookTitle, + attributesManager.numberOfPages + ); + const [addToLibrary, setAddToLibrary] = useState(Boolean(libraryId)); + const [saving, setSaving] = useState(false); return ( <> @@ -130,6 +147,7 @@ export const SavedBookEditor = ({ })} > attributesManager.authorName.next(e.target.value)} /> @@ -140,6 +158,7 @@ export const SavedBookEditor = ({ })} > attributesManager.bookTitle.next(e.target.value)} /> @@ -150,6 +169,7 @@ export const SavedBookEditor = ({ })} > attributesManager.numberOfPages.next(+e.target.value)} /> @@ -160,6 +180,7 @@ export const SavedBookEditor = ({ })} > attributesManager.bookSynopsis.next(e.target.value)} /> @@ -168,7 +189,7 @@ export const SavedBookEditor = ({ - + {i18n.translate('embeddableExamples.savedBook.editor.cancel', { defaultMessage: 'Discard changes', })} @@ -176,19 +197,25 @@ export const SavedBookEditor = ({ - {isCreate && ( - - setAddToLibrary(!addToLibrary)} - /> - - )} - onSubmit(addToLibrary)} fill> + setAddToLibrary(!addToLibrary)} + /> + + + { + setSaving(true); + onSubmit(addToLibrary); + }} + fill + > {isCreate ? i18n.translate('embeddableExamples.savedBook.editor.create', { defaultMessage: 'Create book', diff --git a/examples/embeddable_examples/public/react_embeddables/saved_book/saved_book_library.ts b/examples/embeddable_examples/public/react_embeddables/saved_book/saved_book_library.ts index 3d989debf7092..ef22750d94578 100644 --- a/examples/embeddable_examples/public/react_embeddables/saved_book/saved_book_library.ts +++ b/examples/embeddable_examples/public/react_embeddables/saved_book/saved_book_library.ts @@ -23,7 +23,7 @@ export const saveBookAttributes = async ( maybeId?: string, attributes?: BookAttributes ): Promise => { - await new Promise((r) => setTimeout(r, 100)); // simulate save to network. + await new Promise((r) => setTimeout(r, 500)); // simulate save to network. const id = maybeId ?? v4(); storage.set(id, attributes); return id; diff --git a/examples/embeddable_examples/public/react_embeddables/saved_book/saved_book_react_embeddable.tsx b/examples/embeddable_examples/public/react_embeddables/saved_book/saved_book_react_embeddable.tsx index 58f0f4de8555c..74cd81cf51bde 100644 --- a/examples/embeddable_examples/public/react_embeddables/saved_book/saved_book_react_embeddable.tsx +++ b/examples/embeddable_examples/public/react_embeddables/saved_book/saved_book_react_embeddable.tsx @@ -81,14 +81,22 @@ export const getSavedBookEmbeddableFactory = (core: CoreStart) => { { ...titlesApi, onEdit: async () => { - openSavedBookEditor(bookAttributesManager, false, core, api); + openSavedBookEditor({ + attributesManager: bookAttributesManager, + parent: api.parentApi, + isCreate: false, + core, + api, + }).then((result) => { + savedBookId$.next(result.savedBookId); + }); }, isEditingEnabled: () => true, getTypeDisplayName: () => i18n.translate('embeddableExamples.savedbook.editBook.displayName', { defaultMessage: 'book', }), - serializeState: async () => { + serializeState: () => { if (!Boolean(savedBookId$.value)) { // if this book is currently by value, we serialize the entire state. const bookByValueState: BookByValueSerializedState = { @@ -98,16 +106,11 @@ export const getSavedBookEmbeddableFactory = (core: CoreStart) => { return { rawState: bookByValueState }; } - // if this book is currently by reference, we serialize the reference and write to the external store. + // if this book is currently by reference, we serialize the reference only. const bookByReferenceState: BookByReferenceSerializedState = { savedBookId: savedBookId$.value!, ...serializeTitles(), }; - - await saveBookAttributes( - savedBookId$.value, - serializeBookAttributes(bookAttributesManager) - ); return { rawState: bookByReferenceState }; }, diff --git a/examples/embeddable_examples/tsconfig.json b/examples/embeddable_examples/tsconfig.json index 8f59132f05fbc..d7aa8342de0c1 100644 --- a/examples/embeddable_examples/tsconfig.json +++ b/examples/embeddable_examples/tsconfig.json @@ -40,7 +40,6 @@ "@kbn/kibana-utils-plugin", "@kbn/core-mount-utils-browser", "@kbn/react-kibana-mount", - "@kbn/std", "@kbn/shared-ux-router" ] } diff --git a/packages/presentation/presentation_containers/interfaces/serialized_state.ts b/packages/presentation/presentation_containers/interfaces/serialized_state.ts index 21011d46b2402..0368bd751ce78 100644 --- a/packages/presentation/presentation_containers/interfaces/serialized_state.ts +++ b/packages/presentation/presentation_containers/interfaces/serialized_state.ts @@ -8,7 +8,6 @@ */ import type { Reference } from '@kbn/content-management-utils'; -import type { MaybePromise } from '@kbn/utility-types'; /** * A package containing the serialized Embeddable state, with references extracted. When saving Embeddables using any @@ -24,7 +23,7 @@ export interface HasSerializableState { * Serializes all state into a format that can be saved into * some external store. The opposite of `deserialize` in the {@link ReactEmbeddableFactory} */ - serializeState: () => MaybePromise>; + serializeState: () => SerializedPanelState; } export const apiHasSerializableState = (api: unknown | null): api is HasSerializableState => { diff --git a/packages/presentation/presentation_containers/tsconfig.json b/packages/presentation/presentation_containers/tsconfig.json index 15fe397861700..8e25a7b80c6e2 100644 --- a/packages/presentation/presentation_containers/tsconfig.json +++ b/packages/presentation/presentation_containers/tsconfig.json @@ -10,6 +10,5 @@ "@kbn/presentation-publishing", "@kbn/core-mount-utils-browser", "@kbn/content-management-utils", - "@kbn/utility-types", ] } diff --git a/src/plugins/controls/public/controls/types.ts b/src/plugins/controls/public/controls/types.ts index dd5d38e96346b..8cc33b3513263 100644 --- a/src/plugins/controls/public/controls/types.ts +++ b/src/plugins/controls/public/controls/types.ts @@ -9,7 +9,7 @@ import { BehaviorSubject } from 'rxjs'; -import { SerializedPanelState } from '@kbn/presentation-containers'; +import { HasSerializableState } from '@kbn/presentation-containers'; import { PanelCompatibleComponent } from '@kbn/presentation-panel-plugin/public/panel_component/types'; import { HasParentApi, @@ -39,16 +39,12 @@ export type DefaultControlApi = PublishesDataLoading & CanClearSelections & HasType & HasUniqueId & + HasSerializableState & HasParentApi & { setDataLoading: (loading: boolean) => void; setBlockingError: (error: Error | undefined) => void; grow: PublishingSubject; width: PublishingSubject; - - // Can not use HasSerializableState interface - // HasSerializableState types serializeState as function returning 'MaybePromise' - // Controls serializeState is sync - serializeState: () => SerializedPanelState; }; export type ControlApiRegistration = Omit< diff --git a/src/plugins/dashboard/public/dashboard_actions/copy_to_dashboard_modal.tsx b/src/plugins/dashboard/public/dashboard_actions/copy_to_dashboard_modal.tsx index 66b0ed367481d..858b241ad7e5c 100644 --- a/src/plugins/dashboard/public/dashboard_actions/copy_to_dashboard_modal.tsx +++ b/src/plugins/dashboard/public/dashboard_actions/copy_to_dashboard_modal.tsx @@ -50,9 +50,9 @@ export function CopyToDashboardModal({ api, closeModal }: CopyToDashboardModalPr const dashboardId = api.parentApi.savedObjectId.value; - const onSubmit = useCallback(async () => { + const onSubmit = useCallback(() => { const dashboard = api.parentApi; - const panelToCopy = await dashboard.getDashboardPanelFromId(api.uuid); + const panelToCopy = dashboard.getDashboardPanelFromId(api.uuid); const runtimeSnapshot = apiHasSnapshottableState(api) ? api.snapshotRuntimeState() : undefined; if (!panelToCopy && !runtimeSnapshot) { diff --git a/src/plugins/dashboard/public/dashboard_api/get_dashboard_api.ts b/src/plugins/dashboard/public/dashboard_api/get_dashboard_api.ts index f545f5c95ee67..5fcb6522b0152 100644 --- a/src/plugins/dashboard/public/dashboard_api/get_dashboard_api.ts +++ b/src/plugins/dashboard/public/dashboard_api/get_dashboard_api.ts @@ -108,8 +108,8 @@ export function getDashboardApi({ viewModeManager, unifiedSearchManager, }); - async function getState() { - const { panels, references: panelReferences } = await panelsManager.internalApi.getState(); + function getState() { + const { panels, references: panelReferences } = panelsManager.internalApi.getState(); const dashboardState: DashboardState = { ...settingsManager.internalApi.getState(), ...unifiedSearchManager.internalApi.getState(), @@ -121,7 +121,7 @@ export function getDashboardApi({ let controlGroupReferences: Reference[] | undefined; if (controlGroupApi) { const { rawState: controlGroupSerializedState, references: extractedReferences } = - await controlGroupApi.serializeState(); + controlGroupApi.serializeState(); controlGroupReferences = extractedReferences; dashboardState.controlGroupInput = controlGroupSerializedState; } @@ -174,7 +174,7 @@ export function getDashboardApi({ isManaged, lastSavedId: savedObjectId$.value, viewMode: viewModeManager.api.viewMode.value, - ...(await getState()), + ...getState(), }); if (saveResult) { @@ -197,7 +197,7 @@ export function getDashboardApi({ }, runQuickSave: async () => { if (isManaged) return; - const { controlGroupReferences, dashboardState, panelReferences } = await getState(); + const { controlGroupReferences, dashboardState, panelReferences } = getState(); const saveResult = await getDashboardContentManagementService().saveDashboardState({ controlGroupReferences, currentState: dashboardState, diff --git a/src/plugins/dashboard/public/dashboard_api/panels_manager.ts b/src/plugins/dashboard/public/dashboard_api/panels_manager.ts index 4f082d1c0484f..5188a604631b4 100644 --- a/src/plugins/dashboard/public/dashboard_api/panels_manager.ts +++ b/src/plugins/dashboard/public/dashboard_api/panels_manager.ts @@ -13,11 +13,7 @@ import { v4 } from 'uuid'; import { asyncForEach } from '@kbn/std'; import type { Reference } from '@kbn/content-management-utils'; import { METRIC_TYPE } from '@kbn/analytics'; -import { - PanelPackage, - SerializedPanelState, - apiHasSerializableState, -} from '@kbn/presentation-containers'; +import { PanelPackage, apiHasSerializableState } from '@kbn/presentation-containers'; import { DefaultEmbeddableApi, EmbeddablePackageState, @@ -32,7 +28,6 @@ import { getPanelTitle, stateHasTitles, } from '@kbn/presentation-publishing'; -import { cloneDeep } from 'lodash'; import { apiHasSnapshottableState } from '@kbn/presentation-containers/interfaces/serialized_state'; import { i18n } from '@kbn/i18n'; import { coreServices, usageCollectionService } from '../services/kibana_services'; @@ -156,13 +151,11 @@ export function initializePanelsManager( }); } - async function getDashboardPanelFromId(panelId: string) { + function getDashboardPanelFromId(panelId: string) { const panel = panels$.value[panelId]; const child = children$.value[panelId]; if (!child || !panel) throw new PanelNotFoundError(); - const serialized = apiHasSerializableState(child) - ? await child.serializeState() - : { rawState: {} }; + const serialized = apiHasSerializableState(child) ? child.serializeState() : { rawState: {} }; return { type: panel.type, explicitInput: { ...panel.explicitInput, ...serialized.rawState }, @@ -181,7 +174,7 @@ export function initializePanelsManager( return titles; } - async function duplicateReactEmbeddableInput( + function duplicateReactEmbeddableInput( childApi: unknown, panelToClone: DashboardPanelState, panelTitles: string[] @@ -198,7 +191,7 @@ export function initializePanelsManager( * use in-place library transforms */ if (apiHasLibraryTransforms(childApi)) { - const byValueSerializedState = await childApi.getByValueState(); + const byValueSerializedState = childApi.getByValueState(); if (panelToClone.references) { pushReferences(prefixReferencesFromPanel(id, panelToClone.references)); } @@ -284,9 +277,9 @@ export function initializePanelsManager( canRemovePanels: () => trackPanel.expandedPanelId.value === undefined, children$, duplicatePanel: async (idToDuplicate: string) => { - const panelToClone = await getDashboardPanelFromId(idToDuplicate); + const panelToClone = getDashboardPanelFromId(idToDuplicate); - const duplicatedPanelState = await duplicateReactEmbeddableInput( + const duplicatedPanelState = duplicateReactEmbeddableInput( children$.value[idToDuplicate], panelToClone, await getPanelTitles() @@ -414,36 +407,23 @@ export function initializePanelsManager( } if (resetChangedPanelCount) children$.next(currentChildren); }, - getState: async (): Promise<{ + getState: (): { panels: DashboardState['panels']; references: Reference[]; - }> => { + } => { const references: Reference[] = []; - const panels = cloneDeep(panels$.value); - - const serializePromises: Array< - Promise<{ uuid: string; serialized: SerializedPanelState }> - > = []; - for (const uuid of Object.keys(panels)) { - const api = children$.value[uuid]; - - if (apiHasSerializableState(api)) { - serializePromises.push( - (async () => { - const serialized = await api.serializeState(); - return { uuid, serialized }; - })() - ); - } - } - const serializeResults = await Promise.all(serializePromises); - for (const result of serializeResults) { - panels[result.uuid].explicitInput = { ...result.serialized.rawState, id: result.uuid }; - references.push( - ...prefixReferencesFromPanel(result.uuid, result.serialized.references ?? []) - ); - } + const panels = Object.keys(panels$.value).reduce((acc, id) => { + const childApi = children$.value[id]; + const serializeResult = apiHasSerializableState(childApi) + ? childApi.serializeState() + : { rawState: {} }; + acc[id] = { ...panels$.value[id], explicitInput: { ...serializeResult.rawState, id } }; + + references.push(...prefixReferencesFromPanel(id, serializeResult.references ?? [])); + + return acc; + }, {} as DashboardPanelMap); return { panels, references }; }, diff --git a/src/plugins/dashboard/public/dashboard_api/types.ts b/src/plugins/dashboard/public/dashboard_api/types.ts index 81dce821c0c10..b27f88a02aec9 100644 --- a/src/plugins/dashboard/public/dashboard_api/types.ts +++ b/src/plugins/dashboard/public/dashboard_api/types.ts @@ -145,7 +145,7 @@ export type DashboardApi = CanExpandPanels & fullScreenMode$: PublishingSubject; focusedPanelId$: PublishingSubject; forceRefresh: () => void; - getDashboardPanelFromId: (id: string) => Promise; + getDashboardPanelFromId: (id: string) => DashboardPanelState; getSettings: () => DashboardSettings; hasOverlays$: PublishingSubject; hasUnsavedChanges$: PublishingSubject; diff --git a/src/plugins/discover/public/embeddable/get_search_embeddable_factory.tsx b/src/plugins/discover/public/embeddable/get_search_embeddable_factory.tsx index c1b5cf9f7695f..1f97e2de66390 100644 --- a/src/plugins/discover/public/embeddable/get_search_embeddable_factory.tsx +++ b/src/plugins/discover/public/embeddable/get_search_embeddable_factory.tsx @@ -20,6 +20,7 @@ import { i18n } from '@kbn/i18n'; import { KibanaContextProvider } from '@kbn/kibana-react-plugin/public'; import { FetchContext, + getUnchangingComparator, initializeTimeRange, initializeTitles, useBatchedPublishingSubjects, @@ -186,7 +187,7 @@ export const getSearchEmbeddableFactory = ({ defaultPanelTitle$.next(undefined); defaultPanelDescription$.next(undefined); }, - serializeState: async () => + serializeState: () => serializeState({ uuid, initialState, @@ -194,7 +195,6 @@ export const getSearchEmbeddableFactory = ({ serializeTitles, serializeTimeRange: timeRange.serialize, savedObjectId: savedObjectId$.getValue(), - discoverServices, }), getInspectorAdapters: () => searchEmbeddable.stateManager.inspectorAdapters.getValue(), }, @@ -202,6 +202,7 @@ export const getSearchEmbeddableFactory = ({ ...titleComparators, ...timeRange.comparators, ...searchEmbeddable.comparators, + rawSavedObjectAttributes: getUnchangingComparator(), savedObjectId: [savedObjectId$, (value) => savedObjectId$.next(value)], savedObjectTitle: [defaultPanelTitle$, (value) => defaultPanelTitle$.next(value)], savedObjectDescription: [ diff --git a/src/plugins/discover/public/embeddable/types.ts b/src/plugins/discover/public/embeddable/types.ts index 94d0b10cc3f64..0443801ec7245 100644 --- a/src/plugins/discover/public/embeddable/types.ts +++ b/src/plugins/discover/public/embeddable/types.ts @@ -68,9 +68,13 @@ export interface NonPersistedDisplayOptions { enableFilters?: boolean; } +export type EditableSavedSearchAttributes = Partial< + Pick +>; + export type SearchEmbeddableSerializedState = SerializedTitles & SerializedTimeRange & - Partial> & { + EditableSavedSearchAttributes & { // by value attributes?: SavedSearchAttributes & { references: SavedSearch['references'] }; // by reference @@ -81,6 +85,7 @@ export type SearchEmbeddableSerializedState = SerializedTitles & export type SearchEmbeddableRuntimeState = SearchEmbeddableSerializedAttributes & SerializedTitles & SerializedTimeRange & { + rawSavedObjectAttributes?: EditableSavedSearchAttributes; savedObjectTitle?: string; savedObjectId?: string; savedObjectDescription?: string; diff --git a/src/plugins/discover/public/embeddable/utils/serialization_utils.test.ts b/src/plugins/discover/public/embeddable/utils/serialization_utils.test.ts index c91aacb89aff6..2a7a23b3600a7 100644 --- a/src/plugins/discover/public/embeddable/utils/serialization_utils.test.ts +++ b/src/plugins/discover/public/embeddable/utils/serialization_utils.test.ts @@ -121,7 +121,6 @@ describe('Serialization utils', () => { savedSearch, serializeTitles: jest.fn(), serializeTimeRange: jest.fn(), - discoverServices: discoverServiceMock, }); expect(serializedState).toEqual({ @@ -148,19 +147,16 @@ describe('Serialization utils', () => { searchSource, }; - beforeAll(() => { - discoverServiceMock.savedSearch.get = jest.fn().mockResolvedValue(savedSearch); - }); - - test('equal state', async () => { - const serializedState = await serializeState({ + test('equal state', () => { + const serializedState = serializeState({ uuid, - initialState: {}, + initialState: { + rawSavedObjectAttributes: savedSearch, + }, savedSearch, serializeTitles: jest.fn(), serializeTimeRange: jest.fn(), savedObjectId: 'test-id', - discoverServices: discoverServiceMock, }); expect(serializedState).toEqual({ @@ -171,15 +167,16 @@ describe('Serialization utils', () => { }); }); - test('overwrite state', async () => { - const serializedState = await serializeState({ + test('overwrite state', () => { + const serializedState = serializeState({ uuid, - initialState: {}, + initialState: { + rawSavedObjectAttributes: savedSearch, + }, savedSearch: { ...savedSearch, sampleSize: 500, sort: [['order_date', 'asc']] }, serializeTitles: jest.fn(), serializeTimeRange: jest.fn(), savedObjectId: 'test-id', - discoverServices: discoverServiceMock, }); expect(serializedState).toEqual({ diff --git a/src/plugins/discover/public/embeddable/utils/serialization_utils.ts b/src/plugins/discover/public/embeddable/utils/serialization_utils.ts index f193d52054a3c..397d078dba3e3 100644 --- a/src/plugins/discover/public/embeddable/utils/serialization_utils.ts +++ b/src/plugins/discover/public/embeddable/utils/serialization_utils.ts @@ -43,6 +43,7 @@ export const deserializeState = async ({ const { get } = discoverServices.savedSearch; const so = await get(savedObjectId, true); + const rawSavedObjectAttributes = pick(so, EDITABLE_SAVED_SEARCH_KEYS); const savedObjectOverride = pick(serializedState.rawState, EDITABLE_SAVED_SEARCH_KEYS); return { // ignore the time range from the saved object - only global time range + panel time range matter @@ -53,6 +54,9 @@ export const deserializeState = async ({ // Overwrite SO state with dashboard state for title, description, columns, sort, etc. ...panelState, ...savedObjectOverride, + + // back up the original saved object attributes for comparison + rawSavedObjectAttributes, }; } else { // by value @@ -72,14 +76,13 @@ export const deserializeState = async ({ } }; -export const serializeState = async ({ +export const serializeState = ({ uuid, initialState, savedSearch, serializeTitles, serializeTimeRange, savedObjectId, - discoverServices, }: { uuid: string; initialState: SearchEmbeddableRuntimeState; @@ -87,19 +90,17 @@ export const serializeState = async ({ serializeTitles: () => SerializedTitles; serializeTimeRange: () => SerializedTimeRange; savedObjectId?: string; - discoverServices: DiscoverServices; -}): Promise> => { +}): SerializedPanelState => { const searchSource = savedSearch.searchSource; const { searchSourceJSON, references: originalReferences } = searchSource.serialize(); const savedSearchAttributes = toSavedSearchAttributes(savedSearch, searchSourceJSON); if (savedObjectId) { - const { get } = discoverServices.savedSearch; - const so = await get(savedObjectId); + const editableAttributesBackup = initialState.rawSavedObjectAttributes ?? {}; // only save the current state that is **different** than the saved object state const overwriteState = EDITABLE_SAVED_SEARCH_KEYS.reduce((prev, key) => { - if (deepEqual(savedSearchAttributes[key], so[key])) { + if (deepEqual(savedSearchAttributes[key], editableAttributesBackup[key])) { return prev; } return { ...prev, [key]: savedSearchAttributes[key] }; diff --git a/src/plugins/embeddable/public/react_embeddable_system/react_embeddable_renderer.tsx b/src/plugins/embeddable/public/react_embeddable_system/react_embeddable_renderer.tsx index a9c4821d71a53..2119e6de03a8a 100644 --- a/src/plugins/embeddable/public/react_embeddable_system/react_embeddable_renderer.tsx +++ b/src/plugins/embeddable/public/react_embeddable_system/react_embeddable_renderer.tsx @@ -18,7 +18,7 @@ import { import { PresentationPanel, PresentationPanelProps } from '@kbn/presentation-panel-plugin/public'; import { ComparatorDefinition, StateComparators } from '@kbn/presentation-publishing'; import React, { useEffect, useImperativeHandle, useMemo, useRef } from 'react'; -import { BehaviorSubject, combineLatest, debounceTime, skip, Subscription, switchMap } from 'rxjs'; +import { BehaviorSubject, combineLatest, debounceTime, map, skip, Subscription } from 'rxjs'; import { v4 as generateId } from 'uuid'; import { getReactEmbeddableFactory } from './react_embeddable_registry'; import { @@ -142,15 +142,7 @@ export const ReactEmbeddableRenderer = < .pipe( skip(1), debounceTime(ON_STATE_CHANGE_DEBOUNCE), - switchMap(() => { - const isAsync = - apiRegistration.serializeState.prototype?.name === 'AsyncFunction'; - return isAsync - ? (apiRegistration.serializeState() as Promise< - SerializedPanelState - >) - : Promise.resolve(apiRegistration.serializeState()); - }) + map(() => apiRegistration.serializeState()) ) .subscribe((nextSerializedState) => { onAnyStateChange(nextSerializedState); diff --git a/src/plugins/links/public/embeddable/links_embeddable.tsx b/src/plugins/links/public/embeddable/links_embeddable.tsx index 685f0a6c46a3b..a1bff3702c6ce 100644 --- a/src/plugins/links/public/embeddable/links_embeddable.tsx +++ b/src/plugins/links/public/embeddable/links_embeddable.tsx @@ -121,7 +121,7 @@ export const getLinksEmbeddableFactory = () => { delete snapshot.savedObjectId; return snapshot; }, - serializeState: async (): Promise> => { + serializeState: (): SerializedPanelState => { if (savedObjectId$.value !== undefined) { const linksByReferenceState: LinksByReferenceSerializedState = { savedObjectId: savedObjectId$.value, From 1c7e33a4c7f23aaa9ad8c9ab482aa18d605f7678 Mon Sep 17 00:00:00 2001 From: Dzmitry Lemechko Date: Tue, 17 Dec 2024 20:33:36 +0100 Subject: [PATCH 09/23] [8.x] [kbn-scout] initial package implementation (playwright-test POC) (#194006) (#204572) # Backport This will backport the following commits from `main` to `8.x`: - [[kbn-scout] initial package implementation (playwright-test POC) (#194006)](https://github.com/elastic/kibana/pull/194006) ### Questions ? Please refer to the [Backport tool documentation](https://github.com/sqren/backport) --------- Co-authored-by: kibanamachine <42973632+kibanamachine@users.noreply.github.com> --- .github/CODEOWNERS | 1 + .gitignore | 2 + package.json | 1 + .../kbn-repo-source-classifier/src/config.ts | 1 + packages/kbn-scout/README.md | 9 + packages/kbn-scout/index.ts | 19 ++ packages/kbn-scout/jest.config.js | 14 ++ packages/kbn-scout/kibana.jsonc | 6 + packages/kbn-scout/package.json | 6 + packages/kbn-scout/src/cli/index.ts | 11 + packages/kbn-scout/src/cli/run_tests_cli.ts | 39 ++++ .../kbn-scout/src/cli/start_servers_cli.ts | 34 +++ packages/kbn-scout/src/common/constants.ts | 16 ++ packages/kbn-scout/src/common/index.ts | 12 ++ .../kbn-scout/src/common/services/clients.ts | 58 +++++ .../kbn-scout/src/common/services/config.ts | 29 +++ .../src/common/services/es_archiver.ts | 28 +++ .../kbn-scout/src/common/services/index.ts | 17 ++ .../src/common/services/kibana_url.ts | 73 +++++++ .../kbn-scout/src/common/services/logger.ts | 19 ++ .../src/common/services/saml_auth.ts | 71 ++++++ packages/kbn-scout/src/common/utils/index.ts | 20 ++ packages/kbn-scout/src/config/config.ts | 138 ++++++++++++ packages/kbn-scout/src/config/constants.ts | 22 ++ .../kbn-scout/src/config/get_config_file.ts | 26 +++ packages/kbn-scout/src/config/index.ts | 13 ++ .../src/config/loader/config_load.ts | 27 +++ packages/kbn-scout/src/config/schema/index.ts | 10 + .../kbn-scout/src/config/schema/schema.ts | 139 ++++++++++++ .../config/serverless/es.serverless.config.ts | 26 +++ .../serverless/oblt.serverless.config.ts | 32 +++ .../resources/package_registry_config.yml | 2 + .../serverless/security.serverless.config.ts | 30 +++ .../serverless/serverless.base.config.ts | 157 ++++++++++++++ .../src/config/stateful/base.config.ts | 204 ++++++++++++++++++ .../src/config/stateful/stateful.config.ts | 13 ++ packages/kbn-scout/src/config/utils.ts | 68 ++++++ .../kbn-scout/src/playwright/config/index.ts | 75 +++++++ packages/kbn-scout/src/playwright/expect.ts | 13 ++ .../src/playwright/fixtures/index.ts | 25 +++ .../playwright/fixtures/test/browser_auth.ts | 48 +++++ .../src/playwright/fixtures/test/index.ts | 19 ++ .../src/playwright/fixtures/test/page.ts | 86 ++++++++ .../playwright/fixtures/test/page_objects.ts | 20 ++ .../src/playwright/fixtures/types/index.ts | 11 + .../playwright/fixtures/types/test_scope.ts | 67 ++++++ .../playwright/fixtures/types/worker_scope.ts | 40 ++++ .../src/playwright/fixtures/worker/index.ts | 84 ++++++++ packages/kbn-scout/src/playwright/index.ts | 22 ++ .../playwright/page_objects/date_picker.ts | 41 ++++ .../playwright/page_objects/discover_app.ts | 18 ++ .../src/playwright/page_objects/index.ts | 32 +++ .../playwright/page_objects/utils/index.ts | 39 ++++ .../src/playwright/runner/config_validator.ts | 46 ++++ .../kbn-scout/src/playwright/runner/flags.ts | 52 +++++ .../kbn-scout/src/playwright/runner/index.ts | 12 ++ .../src/playwright/runner/run_tests.ts | 84 ++++++++ .../kbn-scout/src/playwright/types/index.ts | 24 +++ .../kbn-scout/src/playwright/utils/index.ts | 10 + packages/kbn-scout/src/servers/flags.ts | 55 +++++ packages/kbn-scout/src/servers/index.ts | 15 ++ .../src/servers/run_elasticsearch.ts | 194 +++++++++++++++++ .../src/servers/run_kibana_server.ts | 135 ++++++++++++ .../kbn-scout/src/servers/start_servers.ts | 63 ++++++ packages/kbn-scout/src/types/cli.d.ts | 14 ++ packages/kbn-scout/src/types/config.d.ts | 34 +++ packages/kbn-scout/src/types/index.ts | 12 ++ packages/kbn-scout/src/types/servers.d.ts | 26 +++ packages/kbn-scout/tsconfig.json | 31 +++ packages/kbn-test/index.ts | 14 +- .../src/functional_test_runner/index.ts | 1 + .../lib/config/run_check_ftr_configs_cli.ts | 5 + .../src/functional_tests/lib/index.ts | 8 + scripts/scout_start_servers.js | 11 + scripts/scout_test.js | 11 + tsconfig.base.json | 2 + x-pack/.gitignore | 1 + .../plugins/discover_enhanced/tsconfig.json | 3 +- .../discover_enhanced/ui_tests/README.md | 17 ++ .../ui_tests/fixtures/index.ts | 41 ++++ .../ui_tests/fixtures/page_objects/demo.ts | 16 ++ .../ui_tests/fixtures/page_objects/index.ts | 8 + .../ui_tests/playwright.config.ts | 13 ++ .../ui_tests/tests/value_suggestions.spec.ts | 56 +++++ .../value_suggestions_non_time_based.spec.ts | 44 ++++ yarn.lock | 4 + 86 files changed, 3092 insertions(+), 3 deletions(-) create mode 100644 packages/kbn-scout/README.md create mode 100644 packages/kbn-scout/index.ts create mode 100644 packages/kbn-scout/jest.config.js create mode 100644 packages/kbn-scout/kibana.jsonc create mode 100644 packages/kbn-scout/package.json create mode 100644 packages/kbn-scout/src/cli/index.ts create mode 100644 packages/kbn-scout/src/cli/run_tests_cli.ts create mode 100644 packages/kbn-scout/src/cli/start_servers_cli.ts create mode 100644 packages/kbn-scout/src/common/constants.ts create mode 100644 packages/kbn-scout/src/common/index.ts create mode 100644 packages/kbn-scout/src/common/services/clients.ts create mode 100644 packages/kbn-scout/src/common/services/config.ts create mode 100644 packages/kbn-scout/src/common/services/es_archiver.ts create mode 100644 packages/kbn-scout/src/common/services/index.ts create mode 100644 packages/kbn-scout/src/common/services/kibana_url.ts create mode 100644 packages/kbn-scout/src/common/services/logger.ts create mode 100644 packages/kbn-scout/src/common/services/saml_auth.ts create mode 100644 packages/kbn-scout/src/common/utils/index.ts create mode 100644 packages/kbn-scout/src/config/config.ts create mode 100644 packages/kbn-scout/src/config/constants.ts create mode 100644 packages/kbn-scout/src/config/get_config_file.ts create mode 100644 packages/kbn-scout/src/config/index.ts create mode 100644 packages/kbn-scout/src/config/loader/config_load.ts create mode 100644 packages/kbn-scout/src/config/schema/index.ts create mode 100644 packages/kbn-scout/src/config/schema/schema.ts create mode 100644 packages/kbn-scout/src/config/serverless/es.serverless.config.ts create mode 100644 packages/kbn-scout/src/config/serverless/oblt.serverless.config.ts create mode 100644 packages/kbn-scout/src/config/serverless/resources/package_registry_config.yml create mode 100644 packages/kbn-scout/src/config/serverless/security.serverless.config.ts create mode 100644 packages/kbn-scout/src/config/serverless/serverless.base.config.ts create mode 100644 packages/kbn-scout/src/config/stateful/base.config.ts create mode 100644 packages/kbn-scout/src/config/stateful/stateful.config.ts create mode 100644 packages/kbn-scout/src/config/utils.ts create mode 100644 packages/kbn-scout/src/playwright/config/index.ts create mode 100644 packages/kbn-scout/src/playwright/expect.ts create mode 100644 packages/kbn-scout/src/playwright/fixtures/index.ts create mode 100644 packages/kbn-scout/src/playwright/fixtures/test/browser_auth.ts create mode 100644 packages/kbn-scout/src/playwright/fixtures/test/index.ts create mode 100644 packages/kbn-scout/src/playwright/fixtures/test/page.ts create mode 100644 packages/kbn-scout/src/playwright/fixtures/test/page_objects.ts create mode 100644 packages/kbn-scout/src/playwright/fixtures/types/index.ts create mode 100644 packages/kbn-scout/src/playwright/fixtures/types/test_scope.ts create mode 100644 packages/kbn-scout/src/playwright/fixtures/types/worker_scope.ts create mode 100644 packages/kbn-scout/src/playwright/fixtures/worker/index.ts create mode 100644 packages/kbn-scout/src/playwright/index.ts create mode 100644 packages/kbn-scout/src/playwright/page_objects/date_picker.ts create mode 100644 packages/kbn-scout/src/playwright/page_objects/discover_app.ts create mode 100644 packages/kbn-scout/src/playwright/page_objects/index.ts create mode 100644 packages/kbn-scout/src/playwright/page_objects/utils/index.ts create mode 100644 packages/kbn-scout/src/playwright/runner/config_validator.ts create mode 100644 packages/kbn-scout/src/playwright/runner/flags.ts create mode 100644 packages/kbn-scout/src/playwright/runner/index.ts create mode 100644 packages/kbn-scout/src/playwright/runner/run_tests.ts create mode 100644 packages/kbn-scout/src/playwright/types/index.ts create mode 100644 packages/kbn-scout/src/playwright/utils/index.ts create mode 100644 packages/kbn-scout/src/servers/flags.ts create mode 100644 packages/kbn-scout/src/servers/index.ts create mode 100644 packages/kbn-scout/src/servers/run_elasticsearch.ts create mode 100644 packages/kbn-scout/src/servers/run_kibana_server.ts create mode 100644 packages/kbn-scout/src/servers/start_servers.ts create mode 100644 packages/kbn-scout/src/types/cli.d.ts create mode 100644 packages/kbn-scout/src/types/config.d.ts create mode 100644 packages/kbn-scout/src/types/index.ts create mode 100644 packages/kbn-scout/src/types/servers.d.ts create mode 100644 packages/kbn-scout/tsconfig.json create mode 100644 scripts/scout_start_servers.js create mode 100644 scripts/scout_test.js create mode 100644 x-pack/plugins/discover_enhanced/ui_tests/README.md create mode 100644 x-pack/plugins/discover_enhanced/ui_tests/fixtures/index.ts create mode 100644 x-pack/plugins/discover_enhanced/ui_tests/fixtures/page_objects/demo.ts create mode 100644 x-pack/plugins/discover_enhanced/ui_tests/fixtures/page_objects/index.ts create mode 100644 x-pack/plugins/discover_enhanced/ui_tests/playwright.config.ts create mode 100644 x-pack/plugins/discover_enhanced/ui_tests/tests/value_suggestions.spec.ts create mode 100644 x-pack/plugins/discover_enhanced/ui_tests/tests/value_suggestions_non_time_based.spec.ts diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index 79ca8aec8a9ba..fca1fc525d4a1 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -777,6 +777,7 @@ src/plugins/saved_objects_tagging_oss @elastic/appex-sharedux x-pack/plugins/saved_objects_tagging @elastic/appex-sharedux packages/kbn-saved-search-component @elastic/obs-ux-logs-team src/plugins/saved_search @elastic/kibana-data-discovery +packages/kbn-scout @elastic/appex-qa examples/screenshot_mode_example @elastic/appex-sharedux src/plugins/screenshot_mode @elastic/appex-sharedux x-pack/examples/screenshotting_example @elastic/appex-sharedux diff --git a/.gitignore b/.gitignore index e947104f8fb24..18382409725a1 100644 --- a/.gitignore +++ b/.gitignore @@ -143,6 +143,8 @@ x-pack/test/security_api_integration/plugins/audit_log/audit.log .ftr role_users.json +# ignore Scout temp directory +.scout .devcontainer/.env diff --git a/package.json b/package.json index e096679254a36..bdf610f919466 100644 --- a/package.json +++ b/package.json @@ -1494,6 +1494,7 @@ "@kbn/repo-path": "link:packages/kbn-repo-path", "@kbn/repo-source-classifier": "link:packages/kbn-repo-source-classifier", "@kbn/repo-source-classifier-cli": "link:packages/kbn-repo-source-classifier-cli", + "@kbn/scout": "link:packages/kbn-scout", "@kbn/security-api-integration-helpers": "link:x-pack/test/security_api_integration/packages/helpers", "@kbn/serverless-storybook-config": "link:packages/serverless/storybook/config", "@kbn/some-dev-log": "link:packages/kbn-some-dev-log", diff --git a/packages/kbn-repo-source-classifier/src/config.ts b/packages/kbn-repo-source-classifier/src/config.ts index e6f8465a54ad5..08240db981694 100644 --- a/packages/kbn-repo-source-classifier/src/config.ts +++ b/packages/kbn-repo-source-classifier/src/config.ts @@ -58,5 +58,6 @@ export const TEST_DIR = new Set([ 'storybook', '.storybook', 'integration_tests', + 'ui_tests', ...RANDOM_TEST_FILE_NAMES, ]); diff --git a/packages/kbn-scout/README.md b/packages/kbn-scout/README.md new file mode 100644 index 0000000000000..4449bdf966200 --- /dev/null +++ b/packages/kbn-scout/README.md @@ -0,0 +1,9 @@ +# @kbn/scout + +The package is designed to streamline the setup and execution of Playwright tests for Kibana. It consolidates server management and testing capabilities by wrapping both the Kibana/Elasticsearch server launcher and the Playwright test runner. It includes: + + - core test and worker-scoped fixtures for reliable setup across test suites + - page objects combined into the fixture for for core Kibana apps UI interactions + - configurations for seamless test execution in both local and CI environments + +This package aims to simplify test setup and enhance modularity, making it easier to create, run, and maintain deployment-agnostic tests, that are located in the plugin they actually test. diff --git a/packages/kbn-scout/index.ts b/packages/kbn-scout/index.ts new file mode 100644 index 0000000000000..2cbf98d96a8e0 --- /dev/null +++ b/packages/kbn-scout/index.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", the "GNU Affero General Public License v3.0 only", and the "Server Side + * Public License v 1"; you may not use this file except in compliance with, at + * your election, the "Elastic License 2.0", the "GNU Affero General Public + * License v3.0 only", or the "Server Side Public License, v 1". + */ + +export { startServersCli, runTestsCli } from './src/cli'; +export { expect, test, createPlaywrightConfig, createLazyPageObject } from './src/playwright'; +export type { + ScoutPage, + ScoutPlaywrightOptions, + ScoutTestOptions, + PageObjects, + ScoutTestFixtures, + ScoutWorkerFixtures, +} from './src/playwright'; diff --git a/packages/kbn-scout/jest.config.js b/packages/kbn-scout/jest.config.js new file mode 100644 index 0000000000000..0e1493f115c12 --- /dev/null +++ b/packages/kbn-scout/jest.config.js @@ -0,0 +1,14 @@ +/* + * 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", the "GNU Affero General Public License v3.0 only", and the "Server Side + * Public License v 1"; you may not use this file except in compliance with, at + * your election, the "Elastic License 2.0", the "GNU Affero General Public + * License v3.0 only", or the "Server Side Public License, v 1". + */ + +module.exports = { + preset: '@kbn/test/jest_node', + rootDir: '../..', + roots: ['/packages/kbn-scout'], +}; diff --git a/packages/kbn-scout/kibana.jsonc b/packages/kbn-scout/kibana.jsonc new file mode 100644 index 0000000000000..c35c71e9793d8 --- /dev/null +++ b/packages/kbn-scout/kibana.jsonc @@ -0,0 +1,6 @@ +{ + "type": "test-helper", + "id": "@kbn/scout", + "owner": "@elastic/appex-qa", + "devOnly": true +} diff --git a/packages/kbn-scout/package.json b/packages/kbn-scout/package.json new file mode 100644 index 0000000000000..fb362e66af2e9 --- /dev/null +++ b/packages/kbn-scout/package.json @@ -0,0 +1,6 @@ +{ + "name": "@kbn/scout", + "private": true, + "version": "1.0.0", + "license": "Elastic License 2.0 OR AGPL-3.0-only OR SSPL-1.0" +} \ No newline at end of file diff --git a/packages/kbn-scout/src/cli/index.ts b/packages/kbn-scout/src/cli/index.ts new file mode 100644 index 0000000000000..f30b384f351d9 --- /dev/null +++ b/packages/kbn-scout/src/cli/index.ts @@ -0,0 +1,11 @@ +/* + * 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", the "GNU Affero General Public License v3.0 only", and the "Server Side + * Public License v 1"; you may not use this file except in compliance with, at + * your election, the "Elastic License 2.0", the "GNU Affero General Public + * License v3.0 only", or the "Server Side Public License, v 1". + */ + +export { runTestsCli } from './run_tests_cli'; +export { startServersCli } from './start_servers_cli'; diff --git a/packages/kbn-scout/src/cli/run_tests_cli.ts b/packages/kbn-scout/src/cli/run_tests_cli.ts new file mode 100644 index 0000000000000..913f09a310a63 --- /dev/null +++ b/packages/kbn-scout/src/cli/run_tests_cli.ts @@ -0,0 +1,39 @@ +/* + * 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", the "GNU Affero General Public License v3.0 only", and the "Server Side + * Public License v 1"; you may not use this file except in compliance with, at + * your election, the "Elastic License 2.0", the "GNU Affero General Public + * License v3.0 only", or the "Server Side Public License, v 1". + */ + +import { run } from '@kbn/dev-cli-runner'; +import { initLogsDir } from '@kbn/test'; +import { TEST_FLAG_OPTIONS, parseTestFlags, runTests } from '../playwright/runner'; + +/** + * Start servers and run the tests + */ +export function runTestsCli() { + run( + async ({ flagsReader, log }) => { + const options = await parseTestFlags(flagsReader); + + if (options.logsDir) { + initLogsDir(log, options.logsDir); + } + + await runTests(log, options); + }, + { + description: `Run Scout UI Tests`, + usage: ` + Usage: + node scripts/scout_test --help + node scripts/scout_test --stateful --config + node scripts/scout_test --serverless=es --headed --config + `, + flags: TEST_FLAG_OPTIONS, + } + ); +} diff --git a/packages/kbn-scout/src/cli/start_servers_cli.ts b/packages/kbn-scout/src/cli/start_servers_cli.ts new file mode 100644 index 0000000000000..3006f87f5ba57 --- /dev/null +++ b/packages/kbn-scout/src/cli/start_servers_cli.ts @@ -0,0 +1,34 @@ +/* + * 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", the "GNU Affero General Public License v3.0 only", and the "Server Side + * Public License v 1"; you may not use this file except in compliance with, at + * your election, the "Elastic License 2.0", the "GNU Affero General Public + * License v3.0 only", or the "Server Side Public License, v 1". + */ + +import { run } from '@kbn/dev-cli-runner'; + +import { initLogsDir } from '@kbn/test'; + +import { startServers, parseServerFlags, SERVER_FLAG_OPTIONS } from '../servers'; + +/** + * Start servers + */ +export function startServersCli() { + run( + async ({ flagsReader: flags, log }) => { + const options = parseServerFlags(flags); + + if (options.logsDir) { + initLogsDir(log, options.logsDir); + } + + await startServers(log, options); + }, + { + flags: SERVER_FLAG_OPTIONS, + } + ); +} diff --git a/packages/kbn-scout/src/common/constants.ts b/packages/kbn-scout/src/common/constants.ts new file mode 100644 index 0000000000000..bf5c6fb181cd7 --- /dev/null +++ b/packages/kbn-scout/src/common/constants.ts @@ -0,0 +1,16 @@ +/* + * 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", the "GNU Affero General Public License v3.0 only", and the "Server Side + * Public License v 1"; you may not use this file except in compliance with, at + * your election, the "Elastic License 2.0", the "GNU Affero General Public + * License v3.0 only", or the "Server Side Public License, v 1". + */ + +import { Role } from '@kbn/test/src/auth/types'; + +export const PROJECT_DEFAULT_ROLES = new Map([ + ['es', 'developer'], + ['security', 'editor'], + ['oblt', 'editor'], +]); diff --git a/packages/kbn-scout/src/common/index.ts b/packages/kbn-scout/src/common/index.ts new file mode 100644 index 0000000000000..7ff3c1ea52358 --- /dev/null +++ b/packages/kbn-scout/src/common/index.ts @@ -0,0 +1,12 @@ +/* + * 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", the "GNU Affero General Public License v3.0 only", and the "Server Side + * Public License v 1"; you may not use this file except in compliance with, at + * your election, the "Elastic License 2.0", the "GNU Affero General Public + * License v3.0 only", or the "Server Side Public License, v 1". + */ + +export * from './services'; +export * from './constants'; +export * from './utils'; diff --git a/packages/kbn-scout/src/common/services/clients.ts b/packages/kbn-scout/src/common/services/clients.ts new file mode 100644 index 0000000000000..3a0dcf8bfe320 --- /dev/null +++ b/packages/kbn-scout/src/common/services/clients.ts @@ -0,0 +1,58 @@ +/* + * 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", the "GNU Affero General Public License v3.0 only", and the "Server Side + * Public License v 1"; you may not use this file except in compliance with, at + * your election, the "Elastic License 2.0", the "GNU Affero General Public + * License v3.0 only", or the "Server Side Public License, v 1". + */ + +import { KbnClient, createEsClientForTesting } from '@kbn/test'; +import type { ToolingLog } from '@kbn/tooling-log'; +import { ScoutServerConfig } from '../../types'; +import { serviceLoadedMsg } from '../../playwright/utils'; + +interface ClientOptions { + serviceName: string; + url: string; + username: string; + password: string; + log: ToolingLog; +} + +function createClientUrlWithAuth({ serviceName, url, username, password, log }: ClientOptions) { + const clientUrl = new URL(url); + clientUrl.username = username; + clientUrl.password = password; + + log.debug(serviceLoadedMsg(`${serviceName}client`)); + return clientUrl.toString(); +} + +export function createEsClient(config: ScoutServerConfig, log: ToolingLog) { + const { username, password } = config.auth; + const elasticsearchUrl = createClientUrlWithAuth({ + serviceName: 'Es', + url: config.hosts.elasticsearch, + username, + password, + log, + }); + + return createEsClientForTesting({ + esUrl: elasticsearchUrl, + authOverride: { username, password }, + }); +} + +export function createKbnClient(config: ScoutServerConfig, log: ToolingLog) { + const kibanaUrl = createClientUrlWithAuth({ + serviceName: 'Kbn', + url: config.hosts.kibana, + username: config.auth.username, + password: config.auth.password, + log, + }); + + return new KbnClient({ log, url: kibanaUrl }); +} diff --git a/packages/kbn-scout/src/common/services/config.ts b/packages/kbn-scout/src/common/services/config.ts new file mode 100644 index 0000000000000..fe8e932194d91 --- /dev/null +++ b/packages/kbn-scout/src/common/services/config.ts @@ -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", the "GNU Affero General Public License v3.0 only", and the "Server Side + * Public License v 1"; you may not use this file except in compliance with, at + * your election, the "Elastic License 2.0", the "GNU Affero General Public + * License v3.0 only", or the "Server Side Public License, v 1". + */ + +import path from 'path'; +import fs from 'fs'; +import { ToolingLog } from '@kbn/tooling-log'; +import { ScoutServerConfig } from '../../types'; +import { serviceLoadedMsg } from '../../playwright/utils'; + +export function createScoutConfig(configDir: string, configName: string, log: ToolingLog) { + if (!configDir || !fs.existsSync(configDir)) { + throw new Error(`Directory with servers configuration is missing`); + } + + const configPath = path.join(configDir, `${configName}.json`); + log.info(`Reading test servers confiuration from file: ${configPath}`); + + const config = JSON.parse(fs.readFileSync(configPath, 'utf-8')) as ScoutServerConfig; + + log.debug(serviceLoadedMsg('config')); + + return config; +} diff --git a/packages/kbn-scout/src/common/services/es_archiver.ts b/packages/kbn-scout/src/common/services/es_archiver.ts new file mode 100644 index 0000000000000..38b86d800459f --- /dev/null +++ b/packages/kbn-scout/src/common/services/es_archiver.ts @@ -0,0 +1,28 @@ +/* + * 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", the "GNU Affero General Public License v3.0 only", and the "Server Side + * Public License v 1"; you may not use this file except in compliance with, at + * your election, the "Elastic License 2.0", the "GNU Affero General Public + * License v3.0 only", or the "Server Side Public License, v 1". + */ + +import { Client } from '@elastic/elasticsearch'; +import { EsArchiver } from '@kbn/es-archiver'; +import { REPO_ROOT } from '@kbn/repo-info'; +import type { KbnClient } from '@kbn/test'; +import type { ToolingLog } from '@kbn/tooling-log'; +import { serviceLoadedMsg } from '../../playwright/utils'; + +export function createEsArchiver(esClient: Client, kbnClient: KbnClient, log: ToolingLog) { + const esArchiver = new EsArchiver({ + log, + client: esClient, + kbnClient, + baseDir: REPO_ROOT, + }); + + log.debug(serviceLoadedMsg('esArchiver')); + + return esArchiver; +} diff --git a/packages/kbn-scout/src/common/services/index.ts b/packages/kbn-scout/src/common/services/index.ts new file mode 100644 index 0000000000000..6368e613c0284 --- /dev/null +++ b/packages/kbn-scout/src/common/services/index.ts @@ -0,0 +1,17 @@ +/* + * 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", the "GNU Affero General Public License v3.0 only", and the "Server Side + * Public License v 1"; you may not use this file except in compliance with, at + * your election, the "Elastic License 2.0", the "GNU Affero General Public + * License v3.0 only", or the "Server Side Public License, v 1". + */ + +export { createEsClient, createKbnClient } from './clients'; +export { createScoutConfig } from './config'; +export { createEsArchiver } from './es_archiver'; +export { createKbnUrl } from './kibana_url'; +export { createSamlSessionManager } from './saml_auth'; +export { createLogger } from './logger'; + +export type { KibanaUrl } from './kibana_url'; diff --git a/packages/kbn-scout/src/common/services/kibana_url.ts b/packages/kbn-scout/src/common/services/kibana_url.ts new file mode 100644 index 0000000000000..cbfab5dc90796 --- /dev/null +++ b/packages/kbn-scout/src/common/services/kibana_url.ts @@ -0,0 +1,73 @@ +/* + * 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", the "GNU Affero General Public License v3.0 only", and the "Server Side + * Public License v 1"; you may not use this file except in compliance with, at + * your election, the "Elastic License 2.0", the "GNU Affero General Public + * License v3.0 only", or the "Server Side Public License, v 1". + */ + +import type { ToolingLog } from '@kbn/tooling-log'; +import { ScoutServerConfig } from '../../types'; +import { serviceLoadedMsg } from '../../playwright/utils'; + +export interface PathOptions { + /** + * Query string parameters + */ + params?: Record; + /** + * The hash value of the URL + */ + hash?: string; +} + +export class KibanaUrl { + #baseUrl: URL; + + constructor(baseUrl: URL) { + this.#baseUrl = baseUrl; + } + + /** + * Get an absolute URL based on Kibana's URL + * @param rel relative url, resolved relative to Kibana's url + * @param options optional modifications to apply to the URL + */ + get(rel?: string, options?: PathOptions) { + const url = new URL(rel ?? '/', this.#baseUrl); + + if (options?.params) { + for (const [key, value] of Object.entries(options.params)) { + url.searchParams.set(key, value); + } + } + + if (options?.hash !== undefined) { + url.hash = options.hash; + } + + return url.href; + } + + /** + * Get the URL for an app + * @param appName name of the app to get the URL for + * @param options optional modifications to apply to the URL + */ + app(appName: string, options?: PathOptions) { + return this.get(`/app/${appName}`, options); + } + + toString() { + return this.#baseUrl.href; + } +} + +export function createKbnUrl(scoutConfig: ScoutServerConfig, log: ToolingLog) { + const kbnUrl = new KibanaUrl(new URL(scoutConfig.hosts.kibana)); + + log.debug(serviceLoadedMsg('kbnUrl')); + + return kbnUrl; +} diff --git a/packages/kbn-scout/src/common/services/logger.ts b/packages/kbn-scout/src/common/services/logger.ts new file mode 100644 index 0000000000000..4ab39ba7dec68 --- /dev/null +++ b/packages/kbn-scout/src/common/services/logger.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", the "GNU Affero General Public License v3.0 only", and the "Server Side + * Public License v 1"; you may not use this file except in compliance with, at + * your election, the "Elastic License 2.0", the "GNU Affero General Public + * License v3.0 only", or the "Server Side Public License, v 1". + */ + +import { ToolingLog } from '@kbn/tooling-log'; +import { serviceLoadedMsg } from '../../playwright/utils'; + +export function createLogger() { + const log = new ToolingLog({ level: 'verbose', writeTo: process.stdout }); + + log.debug(serviceLoadedMsg('logger')); + + return log; +} diff --git a/packages/kbn-scout/src/common/services/saml_auth.ts b/packages/kbn-scout/src/common/services/saml_auth.ts new file mode 100644 index 0000000000000..e3dbd47fc8c90 --- /dev/null +++ b/packages/kbn-scout/src/common/services/saml_auth.ts @@ -0,0 +1,71 @@ +/* + * 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", the "GNU Affero General Public License v3.0 only", and the "Server Side + * Public License v 1"; you may not use this file except in compliance with, at + * your election, the "Elastic License 2.0", the "GNU Affero General Public + * License v3.0 only", or the "Server Side Public License, v 1". + */ + +import path from 'path'; +import { URL } from 'url'; +import { + SERVERLESS_ROLES_ROOT_PATH, + STATEFUL_ROLES_ROOT_PATH, + readRolesDescriptorsFromResource, +} from '@kbn/es'; +import { REPO_ROOT } from '@kbn/repo-info'; +import { HostOptions, SamlSessionManager } from '@kbn/test'; +import { ToolingLog } from '@kbn/tooling-log'; +import { ScoutServerConfig } from '../../types'; +import { Protocol } from '../../playwright/types'; +import { serviceLoadedMsg } from '../../playwright/utils'; + +const getResourceDirPath = (config: ScoutServerConfig) => { + return config.serverless + ? path.resolve(SERVERLESS_ROLES_ROOT_PATH, config.projectType!) + : path.resolve(REPO_ROOT, STATEFUL_ROLES_ROOT_PATH); +}; + +const createKibanaHostOptions = (config: ScoutServerConfig): HostOptions => { + const kibanaUrl = new URL(config.hosts.kibana); + kibanaUrl.username = config.auth.username; + kibanaUrl.password = config.auth.password; + + return { + protocol: kibanaUrl.protocol.replace(':', '') as Protocol, + hostname: kibanaUrl.hostname, + port: Number(kibanaUrl.port), + username: kibanaUrl.username, + password: kibanaUrl.password, + }; +}; + +export const createSamlSessionManager = ( + config: ScoutServerConfig, + log: ToolingLog +): SamlSessionManager => { + const resourceDirPath = getResourceDirPath(config); + const rolesDefinitionPath = path.resolve(resourceDirPath, 'roles.yml'); + + const supportedRoleDescriptors = readRolesDescriptorsFromResource(rolesDefinitionPath) as Record< + string, + unknown + >; + const supportedRoles = Object.keys(supportedRoleDescriptors); + + const sessionManager = new SamlSessionManager({ + hostOptions: createKibanaHostOptions(config), + log, + isCloud: config.isCloud, + supportedRoles: { + roles: supportedRoles, + sourcePath: rolesDefinitionPath, + }, + cloudUsersFilePath: config.cloudUsersFilePath, + }); + + log.debug(serviceLoadedMsg('samlAuth')); + + return sessionManager; +}; diff --git a/packages/kbn-scout/src/common/utils/index.ts b/packages/kbn-scout/src/common/utils/index.ts new file mode 100644 index 0000000000000..0ab702b0cdfde --- /dev/null +++ b/packages/kbn-scout/src/common/utils/index.ts @@ -0,0 +1,20 @@ +/* + * 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", the "GNU Affero General Public License v3.0 only", and the "Server Side + * Public License v 1"; you may not use this file except in compliance with, at + * your election, the "Elastic License 2.0", the "GNU Affero General Public + * License v3.0 only", or the "Server Side Public License, v 1". + */ + +import { ToolingLog } from '@kbn/tooling-log'; +import * as Rx from 'rxjs'; + +export async function silence(log: ToolingLog, milliseconds: number) { + await Rx.firstValueFrom( + log.getWritten$().pipe( + Rx.startWith(null), + Rx.switchMap(() => Rx.timer(milliseconds)) + ) + ); +} diff --git a/packages/kbn-scout/src/config/config.ts b/packages/kbn-scout/src/config/config.ts new file mode 100644 index 0000000000000..a316aac61d69e --- /dev/null +++ b/packages/kbn-scout/src/config/config.ts @@ -0,0 +1,138 @@ +/* + * 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", the "GNU Affero General Public License v3.0 only", and the "Server Side + * Public License v 1"; you may not use this file except in compliance with, at + * your election, the "Elastic License 2.0", the "GNU Affero General Public + * License v3.0 only", or the "Server Side Public License, v 1". + */ + +import { Schema } from 'joi'; +import * as Url from 'url'; +import Path from 'path'; +import { cloneDeepWith, get, has, toPath } from 'lodash'; +import { REPO_ROOT } from '@kbn/repo-info'; +import { schema } from './schema'; +import { ScoutServerConfig } from '../types'; +import { formatCurrentDate, getProjectType } from './utils'; + +const $values = Symbol('values'); + +export class Config { + private [$values]: Record; + + constructor(data: Record) { + const { error, value } = schema.validate(data, { + abortEarly: false, + }); + + if (error) { + throw error; + } + + this[$values] = value; + } + + public has(key: string | string[]) { + function recursiveHasCheck( + remainingPath: string[], + values: Record, + childSchema: any + ): boolean { + if (!childSchema.$_terms.keys && !childSchema.$_terms.patterns) { + return false; + } + + // normalize child and pattern checks so we can iterate the checks in a single loop + const checks: Array<{ test: (k: string) => boolean; schema: Schema }> = [ + // match children first, they have priority + ...(childSchema.$_terms.keys || []).map((child: { key: string; schema: Schema }) => ({ + test: (k: string) => child.key === k, + schema: child.schema, + })), + + // match patterns on any key that doesn't match an explicit child + ...(childSchema.$_terms.patterns || []).map((pattern: { regex: RegExp; rule: Schema }) => ({ + test: (k: string) => pattern.regex.test(k) && has(values, k), + schema: pattern.rule, + })), + ]; + + for (const check of checks) { + if (!check.test(remainingPath[0])) { + continue; + } + + if (remainingPath.length > 1) { + return recursiveHasCheck( + remainingPath.slice(1), + get(values, remainingPath[0]), + check.schema + ); + } + + return true; + } + + return false; + } + + const path = toPath(key); + if (!path.length) { + return true; + } + return recursiveHasCheck(path, this[$values], schema); + } + + public get(key: string | string[], defaultValue?: any) { + if (!this.has(key)) { + throw new Error(`Unknown config key "${key}"`); + } + + return cloneDeepWith(get(this[$values], key, defaultValue), (v) => { + if (typeof v === 'function') { + return v; + } + }); + } + + public getAll() { + return cloneDeepWith(this[$values], (v) => { + if (typeof v === 'function') { + return v; + } + }); + } + + public getTestServersConfig(): ScoutServerConfig { + return { + serverless: this.get('serverless'), + projectType: this.get('serverless') + ? getProjectType(this.get('kbnTestServer.serverArgs')) + : undefined, + isCloud: false, + cloudUsersFilePath: Path.resolve(REPO_ROOT, '.ftr', 'role_users.json'), + hosts: { + kibana: Url.format({ + protocol: this.get('servers.kibana.protocol'), + hostname: this.get('servers.kibana.hostname'), + port: this.get('servers.kibana.port'), + }), + elasticsearch: Url.format({ + protocol: this.get('servers.elasticsearch.protocol'), + hostname: this.get('servers.elasticsearch.hostname'), + port: this.get('servers.elasticsearch.port'), + }), + }, + auth: { + username: this.get('servers.kibana.username'), + password: this.get('servers.kibana.password'), + }, + + metadata: { + generatedOn: formatCurrentDate(), + config: this.getAll(), + }, + }; + } +} diff --git a/packages/kbn-scout/src/config/constants.ts b/packages/kbn-scout/src/config/constants.ts new file mode 100644 index 0000000000000..c1593f23b35ee --- /dev/null +++ b/packages/kbn-scout/src/config/constants.ts @@ -0,0 +1,22 @@ +/* + * 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", the "GNU Affero General Public License v3.0 only", and the "Server Side + * Public License v 1"; you may not use this file except in compliance with, at + * your election, the "Elastic License 2.0", the "GNU Affero General Public + * License v3.0 only", or the "Server Side Public License, v 1". + */ + +import { resolve } from 'path'; +import { REPO_ROOT } from '@kbn/repo-info'; + +const SECURITY_TEST_PATH = resolve(REPO_ROOT, 'x-pack/test/security_api_integration'); + +export const SAML_IDP_PLUGIN_PATH = resolve(SECURITY_TEST_PATH, 'plugins/saml_provider'); + +export const STATEFUL_IDP_METADATA_PATH = resolve( + SECURITY_TEST_PATH, + 'packages/helpers/saml/idp_metadata_mock_idp.xml' +); +export const SERVERLESS_IDP_METADATA_PATH = resolve(SAML_IDP_PLUGIN_PATH, 'metadata.xml'); +export const JWKS_PATH = resolve(SECURITY_TEST_PATH, 'packages/helpers/oidc/jwks.json'); diff --git a/packages/kbn-scout/src/config/get_config_file.ts b/packages/kbn-scout/src/config/get_config_file.ts new file mode 100644 index 0000000000000..5976db1265797 --- /dev/null +++ b/packages/kbn-scout/src/config/get_config_file.ts @@ -0,0 +1,26 @@ +/* + * 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", the "GNU Affero General Public License v3.0 only", and the "Server Side + * Public License v 1"; you may not use this file except in compliance with, at + * your election, the "Elastic License 2.0", the "GNU Affero General Public + * License v3.0 only", or the "Server Side Public License, v 1". + */ + +import path from 'path'; +import { CliSupportedServerModes } from '../types'; + +export const getConfigFilePath = (config: CliSupportedServerModes): string => { + if (config === 'stateful') { + return path.join(__dirname, 'stateful', 'stateful.config.ts'); + } + + const [mode, type] = config.split('='); + if (mode !== 'serverless' || !type) { + throw new Error( + `Invalid config format: ${config}. Expected "stateful" or "serverless=".` + ); + } + + return path.join(__dirname, 'serverless', `${type}.serverless.config.ts`); +}; diff --git a/packages/kbn-scout/src/config/index.ts b/packages/kbn-scout/src/config/index.ts new file mode 100644 index 0000000000000..969edbe8e4483 --- /dev/null +++ b/packages/kbn-scout/src/config/index.ts @@ -0,0 +1,13 @@ +/* + * 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", the "GNU Affero General Public License v3.0 only", and the "Server Side + * Public License v 1"; you may not use this file except in compliance with, at + * your election, the "Elastic License 2.0", the "GNU Affero General Public + * License v3.0 only", or the "Server Side Public License, v 1". + */ + +export { loadConfig } from './loader/config_load'; +export { getConfigFilePath } from './get_config_file'; +export { loadServersConfig } from './utils'; +export type { Config } from './config'; diff --git a/packages/kbn-scout/src/config/loader/config_load.ts b/packages/kbn-scout/src/config/loader/config_load.ts new file mode 100644 index 0000000000000..5ef4b88b4cf1a --- /dev/null +++ b/packages/kbn-scout/src/config/loader/config_load.ts @@ -0,0 +1,27 @@ +/* + * 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", the "GNU Affero General Public License v3.0 only", and the "Server Side + * Public License v 1"; you may not use this file except in compliance with, at + * your election, the "Elastic License 2.0", the "GNU Affero General Public + * License v3.0 only", or the "Server Side Public License, v 1". + */ + +import path from 'path'; +import { ToolingLog } from '@kbn/tooling-log'; +import { Config } from '../config'; + +export const loadConfig = async (configPath: string, log: ToolingLog): Promise => { + try { + const absolutePath = path.resolve(configPath); + const configModule = await import(absolutePath); + + if (configModule.servers) { + return new Config(configModule.servers); + } else { + throw new Error(`No 'servers' found in the config file at path: ${absolutePath}`); + } + } catch (error) { + throw new Error(`Failed to load config from ${configPath}: ${error.message}`); + } +}; diff --git a/packages/kbn-scout/src/config/schema/index.ts b/packages/kbn-scout/src/config/schema/index.ts new file mode 100644 index 0000000000000..7fa3cbc65f29f --- /dev/null +++ b/packages/kbn-scout/src/config/schema/index.ts @@ -0,0 +1,10 @@ +/* + * 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", the "GNU Affero General Public License v3.0 only", and the "Server Side + * Public License v 1"; you may not use this file except in compliance with, at + * your election, the "Elastic License 2.0", the "GNU Affero General Public + * License v3.0 only", or the "Server Side Public License, v 1". + */ + +export { schema } from './schema'; diff --git a/packages/kbn-scout/src/config/schema/schema.ts b/packages/kbn-scout/src/config/schema/schema.ts new file mode 100644 index 0000000000000..86add154cc661 --- /dev/null +++ b/packages/kbn-scout/src/config/schema/schema.ts @@ -0,0 +1,139 @@ +/* + * 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", the "GNU Affero General Public License v3.0 only", and the "Server Side + * Public License v 1"; you may not use this file except in compliance with, at + * your election, the "Elastic License 2.0", the "GNU Affero General Public + * License v3.0 only", or the "Server Side Public License, v 1". + */ + +import Joi from 'joi'; + +const maybeRequireKeys = (keys: string[], schemas: Record) => { + if (!keys.length) { + return schemas; + } + + const withRequires: Record = {}; + for (const [key, schema] of Object.entries(schemas)) { + withRequires[key] = keys.includes(key) ? schema.required() : schema; + } + return withRequires; +}; + +const urlPartsSchema = ({ requiredKeys }: { requiredKeys?: string[] } = {}) => + Joi.object() + .keys( + maybeRequireKeys(requiredKeys ?? [], { + protocol: Joi.string().valid('http', 'https').default('http'), + hostname: Joi.string().hostname().default('localhost'), + port: Joi.number(), + auth: Joi.string().regex(/^[^:]+:.+$/, 'username and password separated by a colon'), + username: Joi.string(), + password: Joi.string(), + pathname: Joi.string().regex(/^\//, 'start with a /'), + hash: Joi.string().regex(/^\//, 'start with a /'), + certificateAuthorities: Joi.array().items(Joi.binary()).optional(), + }) + ) + .default(); + +const requiredWhenEnabled = (schema: Joi.Schema) => { + return Joi.when('enabled', { + is: true, + then: schema.required(), + otherwise: schema.optional(), + }); +}; + +const dockerServerSchema = () => + Joi.object() + .keys({ + enabled: Joi.boolean().required(), + image: requiredWhenEnabled(Joi.string()), + port: requiredWhenEnabled(Joi.number()), + portInContainer: requiredWhenEnabled(Joi.number()), + waitForLogLine: Joi.alternatives(Joi.object().instance(RegExp), Joi.string()).optional(), + waitForLogLineTimeoutMs: Joi.number().integer().optional(), + waitFor: Joi.func().optional(), + args: Joi.array().items(Joi.string()).optional(), + }) + .default(); + +export const schema = Joi.object() + .keys({ + serverless: Joi.boolean().default(false), + servers: Joi.object() + .keys({ + kibana: urlPartsSchema(), + elasticsearch: urlPartsSchema({ + requiredKeys: ['port'], + }), + fleetserver: urlPartsSchema(), + }) + .default(), + + esTestCluster: Joi.object() + .keys({ + license: Joi.valid('basic', 'trial', 'gold').default('basic'), + from: Joi.string().default('snapshot'), + serverArgs: Joi.array().items(Joi.string()).default([]), + esJavaOpts: Joi.string(), + dataArchive: Joi.string(), + ssl: Joi.boolean().default(false), + ccs: Joi.object().keys({ + remoteClusterUrl: Joi.string().uri({ + scheme: /https?/, + }), + }), + files: Joi.array().items(Joi.string()), + }) + .default(), + + esServerlessOptions: Joi.object() + .keys({ + host: Joi.string().ip(), + resources: Joi.array().items(Joi.string()).default([]), + }) + .default(), + + kbnTestServer: Joi.object() + .keys({ + buildArgs: Joi.array(), + sourceArgs: Joi.array(), + serverArgs: Joi.array(), + installDir: Joi.string(), + useDedicatedTaskRunner: Joi.boolean().default(false), + /** Options for how FTR should execute and interact with Kibana */ + runOptions: Joi.object() + .keys({ + /** + * Log message to wait for before initiating tests, defaults to waiting for Kibana status to be `available`. + * Note that this log message must not be filtered out by the current logging config, for example by the + * log level. If needed, you can adjust the logging level via `kbnTestServer.serverArgs`. + */ + wait: Joi.object() + .regex() + .default(/Kibana is now available/), + + /** + * Does this test config only work when run against source? + */ + alwaysUseSource: Joi.boolean().default(false), + }) + .default(), + env: Joi.object().unknown().default(), + delayShutdown: Joi.number(), + }) + .default(), + + // settings for the kibanaServer.uiSettings module + uiSettings: Joi.object() + .keys({ + defaults: Joi.object().unknown(true), + }) + .default(), + + dockerServers: Joi.object().pattern(Joi.string(), dockerServerSchema()).default(), + }) + .default(); diff --git a/packages/kbn-scout/src/config/serverless/es.serverless.config.ts b/packages/kbn-scout/src/config/serverless/es.serverless.config.ts new file mode 100644 index 0000000000000..89e27b4e877e0 --- /dev/null +++ b/packages/kbn-scout/src/config/serverless/es.serverless.config.ts @@ -0,0 +1,26 @@ +/* + * 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", the "GNU Affero General Public License v3.0 only", and the "Server Side + * Public License v 1"; you may not use this file except in compliance with, at + * your election, the "Elastic License 2.0", the "GNU Affero General Public + * License v3.0 only", or the "Server Side Public License, v 1". + */ + +import { ScoutLoaderConfig } from '../../types'; +import { defaultConfig } from './serverless.base.config'; + +export const servers: ScoutLoaderConfig = { + ...defaultConfig, + esTestCluster: { + ...defaultConfig.esTestCluster, + serverArgs: [...defaultConfig.esTestCluster.serverArgs], + }, + kbnTestServer: { + serverArgs: [ + ...defaultConfig.kbnTestServer.serverArgs, + '--serverless=es', + '--coreApp.allowDynamicConfigOverrides=true', + ], + }, +}; diff --git a/packages/kbn-scout/src/config/serverless/oblt.serverless.config.ts b/packages/kbn-scout/src/config/serverless/oblt.serverless.config.ts new file mode 100644 index 0000000000000..3f283f140479e --- /dev/null +++ b/packages/kbn-scout/src/config/serverless/oblt.serverless.config.ts @@ -0,0 +1,32 @@ +/* + * 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", the "GNU Affero General Public License v3.0 only", and the "Server Side + * Public License v 1"; you may not use this file except in compliance with, at + * your election, the "Elastic License 2.0", the "GNU Affero General Public + * License v3.0 only", or the "Server Side Public License, v 1". + */ + +import { defaultConfig } from './serverless.base.config'; +import { ScoutLoaderConfig } from '../../types'; + +export const servers: ScoutLoaderConfig = { + ...defaultConfig, + esTestCluster: { + ...defaultConfig.esTestCluster, + serverArgs: [ + ...defaultConfig.esTestCluster.serverArgs, + 'xpack.apm_data.enabled=true', + // for ML, data frame analytics are not part of this project type + 'xpack.ml.dfa.enabled=false', + ], + }, + kbnTestServer: { + serverArgs: [ + ...defaultConfig.kbnTestServer.serverArgs, + '--serverless=oblt', + '--coreApp.allowDynamicConfigOverrides=true', + '--xpack.uptime.service.manifestUrl=mockDevUrl', + ], + }, +}; diff --git a/packages/kbn-scout/src/config/serverless/resources/package_registry_config.yml b/packages/kbn-scout/src/config/serverless/resources/package_registry_config.yml new file mode 100644 index 0000000000000..1885fa5c2ebe5 --- /dev/null +++ b/packages/kbn-scout/src/config/serverless/resources/package_registry_config.yml @@ -0,0 +1,2 @@ +package_paths: + - /packages/package-storage diff --git a/packages/kbn-scout/src/config/serverless/security.serverless.config.ts b/packages/kbn-scout/src/config/serverless/security.serverless.config.ts new file mode 100644 index 0000000000000..f1fa4f53f8988 --- /dev/null +++ b/packages/kbn-scout/src/config/serverless/security.serverless.config.ts @@ -0,0 +1,30 @@ +/* + * 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", the "GNU Affero General Public License v3.0 only", and the "Server Side + * Public License v 1"; you may not use this file except in compliance with, at + * your election, the "Elastic License 2.0", the "GNU Affero General Public + * License v3.0 only", or the "Server Side Public License, v 1". + */ + +import { ScoutLoaderConfig } from '../../types'; +import { defaultConfig } from './serverless.base.config'; + +export const servers: ScoutLoaderConfig = { + ...defaultConfig, + esTestCluster: { + ...defaultConfig.esTestCluster, + serverArgs: [ + ...defaultConfig.esTestCluster.serverArgs, + 'xpack.security.authc.api_key.cache.max_keys=70000', + ], + }, + kbnTestServer: { + serverArgs: [ + ...defaultConfig.kbnTestServer.serverArgs, + '--serverless=security', + '--coreApp.allowDynamicConfigOverrides=true', + `--xpack.task_manager.unsafe.exclude_task_types=${JSON.stringify(['Fleet-Metrics-Task'])}`, + ], + }, +}; diff --git a/packages/kbn-scout/src/config/serverless/serverless.base.config.ts b/packages/kbn-scout/src/config/serverless/serverless.base.config.ts new file mode 100644 index 0000000000000..8b4852f9c9e62 --- /dev/null +++ b/packages/kbn-scout/src/config/serverless/serverless.base.config.ts @@ -0,0 +1,157 @@ +/* + * 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", the "GNU Affero General Public License v3.0 only", and the "Server Side + * Public License v 1"; you may not use this file except in compliance with, at + * your election, the "Elastic License 2.0", the "GNU Affero General Public + * License v3.0 only", or the "Server Side Public License, v 1". + */ + +import { resolve, join } from 'path'; +import { format as formatUrl } from 'url'; +import Fs from 'fs'; + +import { CA_CERT_PATH, kibanaDevServiceAccount } from '@kbn/dev-utils'; +import { defineDockerServersConfig, getDockerFileMountPath } from '@kbn/test'; +import { MOCK_IDP_REALM_NAME } from '@kbn/mock-idp-utils'; + +import { dockerImage } from '@kbn/test-suites-xpack/fleet_api_integration/config.base'; +import { REPO_ROOT } from '@kbn/repo-info'; +import { ScoutLoaderConfig } from '../../types'; +import { SAML_IDP_PLUGIN_PATH, SERVERLESS_IDP_METADATA_PATH, JWKS_PATH } from '../constants'; + +const packageRegistryConfig = join(__dirname, './package_registry_config.yml'); +const dockerArgs: string[] = ['-v', `${packageRegistryConfig}:/package-registry/config.yml`]; + +/** + * This is used by CI to set the docker registry port + * you can also define this environment variable locally when running tests which + * will spin up a local docker package registry locally for you + * if this is defined it takes precedence over the `packageRegistryOverride` variable + */ +const dockerRegistryPort: string | undefined = process.env.FLEET_PACKAGE_REGISTRY_PORT; + +const servers = { + elasticsearch: { + protocol: 'https', + hostname: 'localhost', + port: 9220, + username: 'elastic_serverless', + password: 'changeme', + certificateAuthorities: [Fs.readFileSync(CA_CERT_PATH)], + }, + kibana: { + protocol: 'http', + hostname: 'localhost', + port: 5620, + username: 'elastic_serverless', + password: 'changeme', + }, +}; + +export const defaultConfig: ScoutLoaderConfig = { + serverless: true, + servers, + dockerServers: defineDockerServersConfig({ + registry: { + enabled: !!dockerRegistryPort, + image: dockerImage, + portInContainer: 8080, + port: dockerRegistryPort, + args: dockerArgs, + waitForLogLine: 'package manifests loaded', + waitForLogLineTimeoutMs: 60 * 2 * 1000, // 2 minutes + }, + }), + esTestCluster: { + from: 'serverless', + files: [SERVERLESS_IDP_METADATA_PATH, JWKS_PATH], + serverArgs: [ + 'xpack.security.authc.realms.file.file1.order=-100', + `xpack.security.authc.realms.native.native1.enabled=false`, + `xpack.security.authc.realms.native.native1.order=-97`, + + 'xpack.security.authc.realms.jwt.jwt1.allowed_audiences=elasticsearch', + `xpack.security.authc.realms.jwt.jwt1.allowed_issuer=https://kibana.elastic.co/jwt/`, + `xpack.security.authc.realms.jwt.jwt1.allowed_signature_algorithms=[RS256]`, + `xpack.security.authc.realms.jwt.jwt1.allowed_subjects=elastic-agent`, + `xpack.security.authc.realms.jwt.jwt1.claims.principal=sub`, + 'xpack.security.authc.realms.jwt.jwt1.client_authentication.type=shared_secret', + 'xpack.security.authc.realms.jwt.jwt1.order=-98', + `xpack.security.authc.realms.jwt.jwt1.pkc_jwkset_path=${getDockerFileMountPath(JWKS_PATH)}`, + `xpack.security.authc.realms.jwt.jwt1.token_type=access_token`, + ], + ssl: true, // SSL is required for SAML realm + }, + kbnTestServer: { + buildArgs: [], + env: { + KBN_PATH_CONF: resolve(REPO_ROOT, 'config'), + }, + sourceArgs: ['--no-base-path', '--env.name=development'], + serverArgs: [ + `--server.restrictInternalApis=true`, + `--server.port=${servers.kibana.port}`, + '--status.allowAnonymous=true', + `--migrations.zdt.runOnRoles=${JSON.stringify(['ui'])}`, + // We shouldn't embed credentials into the URL since Kibana requests to Elasticsearch should + // either include `kibanaServerTestUser` credentials, or credentials provided by the test + // user, or none at all in case anonymous access is used. + `--elasticsearch.hosts=${formatUrl( + Object.fromEntries( + Object.entries(servers.elasticsearch).filter(([key]) => key.toLowerCase() !== 'auth') + ) + )}`, + `--elasticsearch.serviceAccountToken=${kibanaDevServiceAccount.token}`, + `--elasticsearch.ssl.certificateAuthorities=${CA_CERT_PATH}`, + '--telemetry.sendUsageTo=staging', + `--logging.appenders.deprecation=${JSON.stringify({ + type: 'console', + layout: { + type: 'json', + }, + })}`, + `--logging.loggers=${JSON.stringify([ + { + name: 'elasticsearch.deprecation', + level: 'all', + appenders: ['deprecation'], + }, + ])}`, + // Add meta info to the logs so FTR logs are more actionable + `--logging.appenders.default=${JSON.stringify({ + type: 'console', + layout: { + type: 'pattern', + pattern: '[%date][%level][%logger] %message %meta', + }, + })}`, + `--logging.appenders.console=${JSON.stringify({ + type: 'console', + layout: { + type: 'pattern', + pattern: '[%date][%level][%logger] %message %meta', + }, + })}`, + // This ensures that we register the Security SAML API endpoints. + // In the real world the SAML config is injected by control plane. + `--plugin-path=${SAML_IDP_PLUGIN_PATH}`, + '--xpack.cloud.id=ftr_fake_cloud_id', + // Ensure that SAML is used as the default authentication method whenever a user navigates to Kibana. In other + // words, Kibana should attempt to authenticate the user using the provider with the lowest order if the Login + // Selector is disabled (which is how Serverless Kibana is configured). By declaring `cloud-basic` with a higher + // order, we indicate that basic authentication can still be used, but only if explicitly requested when the + // user navigates to `/login` page directly and enters username and password in the login form. + '--xpack.security.authc.selector.enabled=false', + `--xpack.security.authc.providers=${JSON.stringify({ + saml: { 'cloud-saml-kibana': { order: 0, realm: MOCK_IDP_REALM_NAME } }, + basic: { 'cloud-basic': { order: 1 } }, + })}`, + '--xpack.encryptedSavedObjects.encryptionKey="wuGNaIhoMpk5sO4UBxgr3NyW1sFcLgIf"', + `--server.publicBaseUrl=${servers.kibana.protocol}://${servers.kibana.hostname}:${servers.kibana.port}`, + // configure security reponse header report-to settings to mimic MKI configuration + `--csp.report_to=${JSON.stringify(['violations-endpoint'])}`, + `--permissionsPolicy.report_to=${JSON.stringify(['violations-endpoint'])}`, + ], + }, +}; diff --git a/packages/kbn-scout/src/config/stateful/base.config.ts b/packages/kbn-scout/src/config/stateful/base.config.ts new file mode 100644 index 0000000000000..a2d6f1e0fa6eb --- /dev/null +++ b/packages/kbn-scout/src/config/stateful/base.config.ts @@ -0,0 +1,204 @@ +/* + * 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", the "GNU Affero General Public License v3.0 only", and the "Server Side + * Public License v 1"; you may not use this file except in compliance with, at + * your election, the "Elastic License 2.0", the "GNU Affero General Public + * License v3.0 only", or the "Server Side Public License, v 1". + */ + +import { join } from 'path'; +import { format as formatUrl } from 'url'; + +import { + MOCK_IDP_ENTITY_ID, + MOCK_IDP_ATTRIBUTE_PRINCIPAL, + MOCK_IDP_ATTRIBUTE_ROLES, + MOCK_IDP_ATTRIBUTE_EMAIL, + MOCK_IDP_ATTRIBUTE_NAME, +} from '@kbn/mock-idp-utils'; +import { defineDockerServersConfig } from '@kbn/test'; +import path from 'path'; + +import { MOCK_IDP_REALM_NAME } from '@kbn/mock-idp-utils'; + +import { dockerImage } from '@kbn/test-suites-xpack/fleet_api_integration/config.base'; +import { REPO_ROOT } from '@kbn/repo-info'; +import { STATEFUL_ROLES_ROOT_PATH } from '@kbn/es'; +import type { ScoutLoaderConfig } from '../../types'; +import { SAML_IDP_PLUGIN_PATH, STATEFUL_IDP_METADATA_PATH } from '../constants'; + +const packageRegistryConfig = join(__dirname, './package_registry_config.yml'); +const dockerArgs: string[] = ['-v', `${packageRegistryConfig}:/package-registry/config.yml`]; + +/** + * This is used by CI to set the docker registry port + * you can also define this environment variable locally when running tests which + * will spin up a local docker package registry locally for you + * if this is defined it takes precedence over the `packageRegistryOverride` variable + */ +const dockerRegistryPort: string | undefined = process.env.FLEET_PACKAGE_REGISTRY_PORT; + +// if config is executed on CI or locally +const isRunOnCI = process.env.CI; + +const servers = { + elasticsearch: { + protocol: 'http', + hostname: 'localhost', + port: 9220, + username: 'kibana_system', + password: 'changeme', + }, + kibana: { + protocol: 'http', + hostname: 'localhost', + port: 5620, + username: 'elastic', + password: 'changeme', + }, +}; + +const kbnUrl = `${servers.kibana.protocol}://${servers.kibana.hostname}:${servers.kibana.port}`; + +export const defaultConfig: ScoutLoaderConfig = { + servers, + dockerServers: defineDockerServersConfig({ + registry: { + enabled: !!dockerRegistryPort, + image: dockerImage, + portInContainer: 8080, + port: dockerRegistryPort, + args: dockerArgs, + waitForLogLine: 'package manifests loaded', + waitForLogLineTimeoutMs: 60 * 2 * 1000, // 2 minutes + }, + }), + esTestCluster: { + from: 'snapshot', + license: 'trial', + files: [ + // Passing the roles that are equivalent to the ones we have in serverless + path.resolve(REPO_ROOT, STATEFUL_ROLES_ROOT_PATH, 'roles.yml'), + ], + serverArgs: [ + 'path.repo=/tmp/', + 'path.repo=/tmp/repo,/tmp/repo_1,/tmp/repo_2,/tmp/cloud-snapshots/', + 'node.attr.name=apiIntegrationTestNode', + 'xpack.security.authc.api_key.enabled=true', + 'xpack.security.authc.token.enabled=true', + `xpack.security.authc.realms.saml.${MOCK_IDP_REALM_NAME}.order=0`, + `xpack.security.authc.realms.saml.${MOCK_IDP_REALM_NAME}.idp.metadata.path=${STATEFUL_IDP_METADATA_PATH}`, + `xpack.security.authc.realms.saml.${MOCK_IDP_REALM_NAME}.idp.entity_id=${MOCK_IDP_ENTITY_ID}`, + `xpack.security.authc.realms.saml.${MOCK_IDP_REALM_NAME}.sp.entity_id=${kbnUrl}`, + `xpack.security.authc.realms.saml.${MOCK_IDP_REALM_NAME}.sp.acs=${kbnUrl}/api/security/saml/callback`, + `xpack.security.authc.realms.saml.${MOCK_IDP_REALM_NAME}.sp.logout=${kbnUrl}/logout`, + `xpack.security.authc.realms.saml.${MOCK_IDP_REALM_NAME}.attributes.principal=${MOCK_IDP_ATTRIBUTE_PRINCIPAL}`, + `xpack.security.authc.realms.saml.${MOCK_IDP_REALM_NAME}.attributes.groups=${MOCK_IDP_ATTRIBUTE_ROLES}`, + `xpack.security.authc.realms.saml.${MOCK_IDP_REALM_NAME}.attributes.name=${MOCK_IDP_ATTRIBUTE_NAME}`, + `xpack.security.authc.realms.saml.${MOCK_IDP_REALM_NAME}.attributes.mail=${MOCK_IDP_ATTRIBUTE_EMAIL}`, + ], + ssl: false, + }, + kbnTestServer: { + buildArgs: [], + env: {}, + sourceArgs: ['--no-base-path', '--env.name=development'], + serverArgs: [ + `--server.port=${servers.kibana.port}`, + '--status.allowAnonymous=true', + // We shouldn't embed credentials into the URL since Kibana requests to Elasticsearch should + // either include `kibanaServerTestUser` credentials, or credentials provided by the test + // user, or none at all in case anonymous access is used. + `--elasticsearch.hosts=${formatUrl( + Object.fromEntries( + Object.entries(servers.elasticsearch).filter(([key]) => key.toLowerCase() !== 'auth') + ) + )}`, + `--elasticsearch.username=${servers.elasticsearch.username}`, + `--elasticsearch.password=${servers.elasticsearch.password}`, + // Needed for async search functional tests to introduce a delay + `--data.search.aggs.shardDelay.enabled=true`, + `--data.query.timefilter.minRefreshInterval=1000`, + `--security.showInsecureClusterWarning=false`, + '--telemetry.banner=false', + '--telemetry.optIn=false', + // These are *very* important to have them pointing to staging + '--telemetry.sendUsageTo=staging', + `--server.maxPayload=1679958`, + // newsfeed mock service + `--plugin-path=${path.join(REPO_ROOT, 'test', 'common', 'plugins', 'newsfeed')}`, + // otel mock service + `--plugin-path=${path.join(REPO_ROOT, 'test', 'common', 'plugins', 'otel_metrics')}`, + `--newsfeed.service.urlRoot=${kbnUrl}`, + `--newsfeed.service.pathTemplate=/api/_newsfeed-FTS-external-service-simulators/kibana/v{VERSION}.json`, + `--logging.appenders.deprecation=${JSON.stringify({ + type: 'console', + layout: { + type: 'json', + }, + })}`, + `--logging.loggers=${JSON.stringify([ + { + name: 'elasticsearch.deprecation', + level: 'all', + appenders: ['deprecation'], + }, + ])}`, + // Add meta info to the logs so FTR logs are more actionable + `--logging.appenders.default=${JSON.stringify({ + type: 'console', + layout: { + type: 'pattern', + pattern: '[%date][%level][%logger] %message %meta', + }, + })}`, + `--logging.appenders.console=${JSON.stringify({ + type: 'console', + layout: { + type: 'pattern', + pattern: '[%date][%level][%logger] %message %meta', + }, + })}`, + // x-pack/test/functional/config.base.js + '--status.allowAnonymous=true', + '--server.uuid=5b2de169-2785-441b-ae8c-186a1936b17d', + '--xpack.maps.showMapsInspectorAdapter=true', + '--xpack.maps.preserveDrawingBuffer=true', + '--xpack.security.encryptionKey="wuGNaIhoMpk5sO4UBxgr3NyW1sFcLgIf"', // server restarts should not invalidate active sessions + '--xpack.encryptedSavedObjects.encryptionKey="DkdXazszSCYexXqz4YktBGHCRkV6hyNK"', + '--xpack.discoverEnhanced.actions.exploreDataInContextMenu.enabled=true', + '--savedObjects.maxImportPayloadBytes=10485760', // for OSS test management/_import_objects, + '--savedObjects.allowHttpApiAccess=false', // override default to not allow hiddenFromHttpApis saved objects access to the http APIs see https://github.com/elastic/dev/issues/2200 + // explicitly disable internal API restriction. See https://github.com/elastic/kibana/issues/163654 + '--server.restrictInternalApis=false', + // disable fleet task that writes to metrics.fleet_server.* data streams, impacting functional tests + `--xpack.task_manager.unsafe.exclude_task_types=${JSON.stringify(['Fleet-Metrics-Task'])}`, + // x-pack/test/api_integration/config.ts + '--xpack.security.session.idleTimeout=3600000', // 1 hour + '--telemetry.optIn=true', + '--xpack.fleet.agents.pollingRequestTimeout=5000', // 5 seconds + '--xpack.ruleRegistry.write.enabled=true', + '--xpack.ruleRegistry.write.enabled=true', + '--xpack.ruleRegistry.write.cache.enabled=false', + '--monitoring_collection.opentelemetry.metrics.prometheus.enabled=true', + // SAML configuration + ...(isRunOnCI ? [] : ['--mock_idp_plugin.enabled=true']), + // This ensures that we register the Security SAML API endpoints. + // In the real world the SAML config is injected by control plane. + `--plugin-path=${SAML_IDP_PLUGIN_PATH}`, + '--xpack.cloud.id=ftr_fake_cloud_id', + // Ensure that SAML is used as the default authentication method whenever a user navigates to Kibana. In other + // words, Kibana should attempt to authenticate the user using the provider with the lowest order if the Login + // Selector is disabled (replicating Serverless configuration). By declaring `cloud-basic` with a higher + // order, we indicate that basic authentication can still be used, but only if explicitly requested when the + // user navigates to `/login` page directly and enters username and password in the login form. + '--xpack.security.authc.selector.enabled=false', + `--xpack.security.authc.providers=${JSON.stringify({ + saml: { 'cloud-saml-kibana': { order: 0, realm: MOCK_IDP_REALM_NAME } }, + basic: { 'cloud-basic': { order: 1 } }, + })}`, + `--server.publicBaseUrl=${kbnUrl}`, + ], + }, +}; diff --git a/packages/kbn-scout/src/config/stateful/stateful.config.ts b/packages/kbn-scout/src/config/stateful/stateful.config.ts new file mode 100644 index 0000000000000..e67419c21fb37 --- /dev/null +++ b/packages/kbn-scout/src/config/stateful/stateful.config.ts @@ -0,0 +1,13 @@ +/* + * 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", the "GNU Affero General Public License v3.0 only", and the "Server Side + * Public License v 1"; you may not use this file except in compliance with, at + * your election, the "Elastic License 2.0", the "GNU Affero General Public + * License v3.0 only", or the "Server Side Public License, v 1". + */ + +import { ScoutLoaderConfig } from '../../types'; +import { defaultConfig } from './base.config'; + +export const servers: ScoutLoaderConfig = defaultConfig; diff --git a/packages/kbn-scout/src/config/utils.ts b/packages/kbn-scout/src/config/utils.ts new file mode 100644 index 0000000000000..61bdc1b7b81ac --- /dev/null +++ b/packages/kbn-scout/src/config/utils.ts @@ -0,0 +1,68 @@ +/* + * 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", the "GNU Affero General Public License v3.0 only", and the "Server Side + * Public License v 1"; you may not use this file except in compliance with, at + * your election, the "Elastic License 2.0", the "GNU Affero General Public + * License v3.0 only", or the "Server Side Public License, v 1". + */ + +import * as Fs from 'fs'; +import getopts from 'getopts'; +import path from 'path'; +import { ToolingLog } from '@kbn/tooling-log'; +import { ServerlessProjectType } from '@kbn/es'; +import { REPO_ROOT } from '@kbn/repo-info'; +import { CliSupportedServerModes, ScoutServerConfig } from '../types'; +import { getConfigFilePath } from './get_config_file'; +import { loadConfig } from './loader/config_load'; + +export const formatCurrentDate = () => { + const now = new Date(); + + const format = (num: number, length: number) => String(num).padStart(length, '0'); + + return ( + `${format(now.getDate(), 2)}/${format(now.getMonth() + 1, 2)}/${now.getFullYear()} ` + + `${format(now.getHours(), 2)}:${format(now.getMinutes(), 2)}:${format(now.getSeconds(), 2)}.` + + `${format(now.getMilliseconds(), 3)}` + ); +}; + +const saveTestServersConfigOnDisk = (testServersConfig: ScoutServerConfig, log: ToolingLog) => { + const configDirPath = path.resolve(REPO_ROOT, '.scout', 'servers'); + const configFilePath = path.join(configDirPath, `local.json`); + + try { + const jsonData = JSON.stringify(testServersConfig, null, 2); + + if (!Fs.existsSync(configDirPath)) { + log.debug(`scout: creating configuration directory: ${configDirPath}`); + Fs.mkdirSync(configDirPath, { recursive: true }); + } + + Fs.writeFileSync(configFilePath, jsonData, 'utf-8'); + log.info(`scout: Test server configuration saved at ${configFilePath}`); + } catch (error) { + log.error(`scout: Failed to save test server configuration - ${error.message}`); + throw new Error(`Failed to save test server configuration at ${configFilePath}`); + } +}; + +export async function loadServersConfig(mode: CliSupportedServerModes, log: ToolingLog) { + // get path to one of the predefined config files + const configPath = getConfigFilePath(mode); + // load config that is compatible with kbn-test input format + const config = await loadConfig(configPath, log); + // construct config for Playwright Test + const scoutServerConfig = config.getTestServersConfig(); + // save test config to the file + saveTestServersConfigOnDisk(scoutServerConfig, log); + + return config; +} + +export const getProjectType = (kbnServerArgs: string[]) => { + const options = getopts(kbnServerArgs); + return options.serverless as ServerlessProjectType; +}; diff --git a/packages/kbn-scout/src/playwright/config/index.ts b/packages/kbn-scout/src/playwright/config/index.ts new file mode 100644 index 0000000000000..62f5261c08e25 --- /dev/null +++ b/packages/kbn-scout/src/playwright/config/index.ts @@ -0,0 +1,75 @@ +/* + * 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", the "GNU Affero General Public License v3.0 only", and the "Server Side + * Public License v 1"; you may not use this file except in compliance with, at + * your election, the "Elastic License 2.0", the "GNU Affero General Public + * License v3.0 only", or the "Server Side Public License, v 1". + */ + +import { defineConfig, PlaywrightTestConfig, devices } from '@playwright/test'; +import * as Path from 'path'; +import { REPO_ROOT } from '@kbn/repo-info'; +import { ScoutPlaywrightOptions, ScoutTestOptions, VALID_CONFIG_MARKER } from '../types'; + +export function createPlaywrightConfig(options: ScoutPlaywrightOptions): PlaywrightTestConfig { + return defineConfig({ + testDir: options.testDir, + /* Run tests in files in parallel */ + fullyParallel: false, + /* Fail the build on CI if you accidentally left test.only in the source code. */ + forbidOnly: !!process.env.CI, + /* Retry on CI only */ + retries: process.env.CI ? 2 : 0, + /* Opt out of parallel tests on CI. */ + workers: options.workers ?? 1, + /* Reporter to use. See https://playwright.dev/docs/test-reporters */ + reporter: [ + ['html', { outputFolder: './output/reports', open: 'never' }], // HTML report configuration + ['json', { outputFile: './output/reports/test-results.json' }], // JSON report + ], + /* Shared settings for all the projects below. See https://playwright.dev/docs/api/class-testoptions. */ + use: { + serversConfigDir: Path.resolve(REPO_ROOT, '.scout', 'servers'), + [VALID_CONFIG_MARKER]: true, + /* Base URL to use in actions like `await page.goto('/')`. */ + // baseURL: 'http://127.0.0.1:3000', + + /* Collect trace when retrying the failed test. See https://playwright.dev/docs/trace-viewer */ + trace: 'on-first-retry', + screenshot: 'only-on-failure', + // video: 'retain-on-failure', + // storageState: './output/reports/state.json', // Store session state (like cookies) + }, + + // Timeout for each test, includes test, hooks and fixtures + timeout: 60000, + + // Timeout for each assertion + expect: { + timeout: 10000, + }, + + outputDir: './output/test-artifacts', // For other test artifacts (screenshots, videos, traces) + + /* Configure projects for major browsers */ + projects: [ + { + name: 'chromium', + use: { ...devices['Desktop Chrome'] }, + }, + + // { + // name: 'firefox', + // use: { ...devices['Desktop Firefox'] }, + // }, + ], + + /* Run your local dev server before starting the tests */ + // webServer: { + // command: 'npm run start', + // url: 'http://127.0.0.1:3000', + // reuseExistingServer: !process.env.CI, + // }, + }); +} diff --git a/packages/kbn-scout/src/playwright/expect.ts b/packages/kbn-scout/src/playwright/expect.ts new file mode 100644 index 0000000000000..a75e30adf2631 --- /dev/null +++ b/packages/kbn-scout/src/playwright/expect.ts @@ -0,0 +1,13 @@ +/* + * 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", the "GNU Affero General Public License v3.0 only", and the "Server Side + * Public License v 1"; you may not use this file except in compliance with, at + * your election, the "Elastic License 2.0", the "GNU Affero General Public + * License v3.0 only", or the "Server Side Public License, v 1". + */ + +import { test } from '@playwright/test'; + +// Export `expect` to avoid importing from Playwright directly +export const expect = test.expect; diff --git a/packages/kbn-scout/src/playwright/fixtures/index.ts b/packages/kbn-scout/src/playwright/fixtures/index.ts new file mode 100644 index 0000000000000..348b581005994 --- /dev/null +++ b/packages/kbn-scout/src/playwright/fixtures/index.ts @@ -0,0 +1,25 @@ +/* + * 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", the "GNU Affero General Public License v3.0 only", and the "Server Side + * Public License v 1"; you may not use this file except in compliance with, at + * your election, the "Elastic License 2.0", the "GNU Affero General Public + * License v3.0 only", or the "Server Side Public License, v 1". + */ + +import { mergeTests } from '@playwright/test'; + +import { scoutWorkerFixtures } from './worker'; +import { scoutTestFixtures } from './test'; + +export const scoutCoreFixtures = mergeTests(scoutWorkerFixtures, scoutTestFixtures); + +export type { + ScoutTestFixtures, + ScoutWorkerFixtures, + ScoutPage, + Client, + KbnClient, + KibanaUrl, + ToolingLog, +} from './types'; diff --git a/packages/kbn-scout/src/playwright/fixtures/test/browser_auth.ts b/packages/kbn-scout/src/playwright/fixtures/test/browser_auth.ts new file mode 100644 index 0000000000000..5faa1b5392d96 --- /dev/null +++ b/packages/kbn-scout/src/playwright/fixtures/test/browser_auth.ts @@ -0,0 +1,48 @@ +/* + * 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", the "GNU Affero General Public License v3.0 only", and the "Server Side + * Public License v 1"; you may not use this file except in compliance with, at + * your election, the "Elastic License 2.0", the "GNU Affero General Public + * License v3.0 only", or the "Server Side Public License, v 1". + */ + +import { test as base } from '@playwright/test'; +import { PROJECT_DEFAULT_ROLES } from '../../../common'; +import { LoginFixture, ScoutWorkerFixtures } from '../types'; +import { serviceLoadedMsg } from '../../utils'; + +type LoginFunction = (role: string) => Promise; + +export const browserAuthFixture = base.extend<{ browserAuth: LoginFixture }, ScoutWorkerFixtures>({ + browserAuth: async ({ log, context, samlAuth, config }, use) => { + const setSessionCookie = async (cookieValue: string) => { + await context.clearCookies(); + await context.addCookies([ + { + name: 'sid', + value: cookieValue, + path: '/', + domain: 'localhost', + }, + ]); + }; + + const loginAs: LoginFunction = async (role) => { + const cookie = await samlAuth.getInteractiveUserSessionCookieWithRoleScope(role); + await setSessionCookie(cookie); + }; + + const loginAsAdmin = () => loginAs('admin'); + const loginAsViewer = () => loginAs('viewer'); + const loginAsPrivilegedUser = () => { + const roleName = config.serverless + ? PROJECT_DEFAULT_ROLES.get(config.projectType!)! + : 'editor'; + return loginAs(roleName); + }; + + log.debug(serviceLoadedMsg('browserAuth')); + await use({ loginAsAdmin, loginAsViewer, loginAsPrivilegedUser }); + }, +}); diff --git a/packages/kbn-scout/src/playwright/fixtures/test/index.ts b/packages/kbn-scout/src/playwright/fixtures/test/index.ts new file mode 100644 index 0000000000000..41bfedcf39dc7 --- /dev/null +++ b/packages/kbn-scout/src/playwright/fixtures/test/index.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", the "GNU Affero General Public License v3.0 only", and the "Server Side + * Public License v 1"; you may not use this file except in compliance with, at + * your election, the "Elastic License 2.0", the "GNU Affero General Public + * License v3.0 only", or the "Server Side Public License, v 1". + */ + +import { mergeTests } from '@playwright/test'; +import { browserAuthFixture } from './browser_auth'; +import { scoutPageFixture } from './page'; +import { pageObjectsFixture } from './page_objects'; + +export const scoutTestFixtures = mergeTests( + browserAuthFixture, + scoutPageFixture, + pageObjectsFixture +); diff --git a/packages/kbn-scout/src/playwright/fixtures/test/page.ts b/packages/kbn-scout/src/playwright/fixtures/test/page.ts new file mode 100644 index 0000000000000..1631bac71ac2c --- /dev/null +++ b/packages/kbn-scout/src/playwright/fixtures/test/page.ts @@ -0,0 +1,86 @@ +/* + * 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", the "GNU Affero General Public License v3.0 only", and the "Server Side + * Public License v 1"; you may not use this file except in compliance with, at + * your election, the "Elastic License 2.0", the "GNU Affero General Public + * License v3.0 only", or the "Server Side Public License, v 1". + */ + +import { Page, test as base } from '@playwright/test'; +import { subj } from '@kbn/test-subj-selector'; +import { ScoutPage, KibanaUrl, ScoutTestFixtures, ScoutWorkerFixtures } from '../types'; + +/** + * Instead of defining each method individually, we use a list of method names and loop through them, creating methods dynamically. + * All methods must have 'selector: string' as the first argument + */ +function extendPageWithTestSubject(page: Page) { + const methods: Array = [ + 'check', + 'click', + 'dblclick', + 'fill', + 'focus', + 'getAttribute', + 'hover', + 'isEnabled', + 'innerText', + 'isChecked', + 'isHidden', + 'locator', + ]; + + const extendedMethods: Partial> = {}; + + for (const method of methods) { + extendedMethods[method] = (...args: any[]) => { + const selector = args[0]; + const testSubjSelector = subj(selector); + return (page[method] as Function)(testSubjSelector, ...args.slice(1)); + }; + } + + return extendedMethods as Record; +} + +/** + * Extends the 'page' fixture with Kibana-specific functionality + * + * 1. Allow calling methods with simplified 'data-test-subj' selectors. + * Instead of manually constructing 'data-test-subj' selectors, this extension provides a `testSubj` object on the page + * Supported methods include `click`, `check`, `fill`, and others that interact with `data-test-subj`. + * + * Example Usage: + * + * ```typescript + * // Without `testSubj` extension: + * await page.locator('[data-test-subj="foo"][data-test-subj="bar"]').click(); + * + * // With `testSubj` extension: + * await page.testSubj.click('foo & bar'); + * ``` + * + * 2. Navigate to Kibana apps by using 'kbnUrl' fixture + * + * Example Usage: + * + * ```typescript + * // Navigate to '/app/discover' + * await page.gotoApp('discover); + * ``` + */ +export const scoutPageFixture = base.extend({ + page: async ( + { page, kbnUrl }: { page: Page; kbnUrl: KibanaUrl }, + use: (extendedPage: ScoutPage) => Promise + ) => { + const extendedPage = page as ScoutPage; + // Extend page with '@kbn/test-subj-selector' support + extendedPage.testSubj = extendPageWithTestSubject(page); + // Method to navigate to specific Kibana apps + extendedPage.gotoApp = (appName: string) => page.goto(kbnUrl.app(appName)); + + await use(extendedPage); + }, +}); diff --git a/packages/kbn-scout/src/playwright/fixtures/test/page_objects.ts b/packages/kbn-scout/src/playwright/fixtures/test/page_objects.ts new file mode 100644 index 0000000000000..ed142b48b3f9a --- /dev/null +++ b/packages/kbn-scout/src/playwright/fixtures/test/page_objects.ts @@ -0,0 +1,20 @@ +/* + * 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", the "GNU Affero General Public License v3.0 only", and the "Server Side + * Public License v 1"; you may not use this file except in compliance with, at + * your election, the "Elastic License 2.0", the "GNU Affero General Public + * License v3.0 only", or the "Server Side Public License, v 1". + */ + +import { test as base } from '@playwright/test'; +import { ScoutTestFixtures, ScoutWorkerFixtures } from '../types'; +import { createCorePageObjects } from '../../page_objects'; + +export const pageObjectsFixture = base.extend({ + pageObjects: async ({ page }, use) => { + const corePageObjects = createCorePageObjects(page); + + await use(corePageObjects); + }, +}); diff --git a/packages/kbn-scout/src/playwright/fixtures/types/index.ts b/packages/kbn-scout/src/playwright/fixtures/types/index.ts new file mode 100644 index 0000000000000..4a23d4c5ce936 --- /dev/null +++ b/packages/kbn-scout/src/playwright/fixtures/types/index.ts @@ -0,0 +1,11 @@ +/* + * 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", the "GNU Affero General Public License v3.0 only", and the "Server Side + * Public License v 1"; you may not use this file except in compliance with, at + * your election, the "Elastic License 2.0", the "GNU Affero General Public + * License v3.0 only", or the "Server Side Public License, v 1". + */ + +export * from './test_scope'; +export * from './worker_scope'; diff --git a/packages/kbn-scout/src/playwright/fixtures/types/test_scope.ts b/packages/kbn-scout/src/playwright/fixtures/types/test_scope.ts new file mode 100644 index 0000000000000..2808381f0f6be --- /dev/null +++ b/packages/kbn-scout/src/playwright/fixtures/types/test_scope.ts @@ -0,0 +1,67 @@ +/* + * 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", the "GNU Affero General Public License v3.0 only", and the "Server Side + * Public License v 1"; you may not use this file except in compliance with, at + * your election, the "Elastic License 2.0", the "GNU Affero General Public + * License v3.0 only", or the "Server Side Public License, v 1". + */ + +import { Page } from 'playwright/test'; +import { PageObjects } from '../../page_objects'; + +export interface ScoutTestFixtures { + browserAuth: LoginFixture; + page: ScoutPage; + pageObjects: PageObjects; +} + +export interface LoginFixture { + loginAsViewer: () => Promise; + loginAsAdmin: () => Promise; + loginAsPrivilegedUser: () => Promise; +} + +export type ScoutPage = Page & { + gotoApp: (appName: string, options?: Parameters[1]) => ReturnType; + testSubj: { + check: (selector: string, options?: Parameters[1]) => ReturnType; + click: (selector: string, options?: Parameters[1]) => ReturnType; + dblclick: ( + selector: string, + options?: Parameters[1] + ) => ReturnType; + fill: ( + selector: string, + value: string, + options?: Parameters[2] + ) => ReturnType; + focus: (selector: string, options?: Parameters[1]) => ReturnType; + getAttribute: ( + selector: string, + name: string, + options?: Parameters[2] + ) => ReturnType; + hover: (selector: string, options?: Parameters[1]) => ReturnType; + innerText: ( + selector: string, + options?: Parameters[1] + ) => ReturnType; + isEnabled: ( + selector: string, + options?: Parameters[1] + ) => ReturnType; + isChecked: ( + selector: string, + options?: Parameters[1] + ) => ReturnType; + isHidden: ( + selector: string, + options?: Parameters[1] + ) => ReturnType; + locator: ( + selector: string, + options?: Parameters[1] + ) => ReturnType; + }; +}; diff --git a/packages/kbn-scout/src/playwright/fixtures/types/worker_scope.ts b/packages/kbn-scout/src/playwright/fixtures/types/worker_scope.ts new file mode 100644 index 0000000000000..c9424dc0f5970 --- /dev/null +++ b/packages/kbn-scout/src/playwright/fixtures/types/worker_scope.ts @@ -0,0 +1,40 @@ +/* + * 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", the "GNU Affero General Public License v3.0 only", and the "Server Side + * Public License v 1"; you may not use this file except in compliance with, at + * your election, the "Elastic License 2.0", the "GNU Affero General Public + * License v3.0 only", or the "Server Side Public License, v 1". + */ + +import type { KbnClient, SamlSessionManager } from '@kbn/test'; +import type { ToolingLog } from '@kbn/tooling-log'; +import type { Client } from '@elastic/elasticsearch'; +import { LoadActionPerfOptions } from '@kbn/es-archiver'; +import { IndexStats } from '@kbn/es-archiver/src/lib/stats'; + +import { ScoutServerConfig } from '../../../types'; +import { KibanaUrl } from '../../../common/services/kibana_url'; + +interface EsArchiverFixture { + loadIfNeeded: ( + name: string, + performance?: LoadActionPerfOptions | undefined + ) => Promise>; +} + +export interface ScoutWorkerFixtures { + log: ToolingLog; + config: ScoutServerConfig; + kbnUrl: KibanaUrl; + esClient: Client; + kbnClient: KbnClient; + esArchiver: EsArchiverFixture; + samlAuth: SamlSessionManager; +} + +// re-export to import types from '@kbn-scout' +export type { KbnClient, SamlSessionManager } from '@kbn/test'; +export type { ToolingLog } from '@kbn/tooling-log'; +export type { Client } from '@elastic/elasticsearch'; +export type { KibanaUrl } from '../../../common/services/kibana_url'; diff --git a/packages/kbn-scout/src/playwright/fixtures/worker/index.ts b/packages/kbn-scout/src/playwright/fixtures/worker/index.ts new file mode 100644 index 0000000000000..c61d9755c44db --- /dev/null +++ b/packages/kbn-scout/src/playwright/fixtures/worker/index.ts @@ -0,0 +1,84 @@ +/* + * 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", the "GNU Affero General Public License v3.0 only", and the "Server Side + * Public License v 1"; you may not use this file except in compliance with, at + * your election, the "Elastic License 2.0", the "GNU Affero General Public + * License v3.0 only", or the "Server Side Public License, v 1". + */ + +import { test as base } from '@playwright/test'; + +import { LoadActionPerfOptions } from '@kbn/es-archiver'; +import { + createKbnUrl, + createEsArchiver, + createEsClient, + createKbnClient, + createLogger, + createSamlSessionManager, + createScoutConfig, +} from '../../../common/services'; +import { ScoutWorkerFixtures } from '../types/worker_scope'; +import { ScoutTestOptions } from '../../types'; + +export const scoutWorkerFixtures = base.extend<{}, ScoutWorkerFixtures>({ + log: [ + ({}, use) => { + use(createLogger()); + }, + { scope: 'worker' }, + ], + + config: [ + ({ log }, use, testInfo) => { + const configName = 'local'; + const projectUse = testInfo.project.use as ScoutTestOptions; + const serversConfigDir = projectUse.serversConfigDir; + const configInstance = createScoutConfig(serversConfigDir, configName, log); + + use(configInstance); + }, + { scope: 'worker' }, + ], + + kbnUrl: [ + ({ config, log }, use) => { + use(createKbnUrl(config, log)); + }, + { scope: 'worker' }, + ], + + esClient: [ + ({ config, log }, use) => { + use(createEsClient(config, log)); + }, + { scope: 'worker' }, + ], + + kbnClient: [ + ({ log, config }, use) => { + use(createKbnClient(config, log)); + }, + { scope: 'worker' }, + ], + + esArchiver: [ + ({ log, esClient, kbnClient }, use) => { + const esArchiverInstance = createEsArchiver(esClient, kbnClient, log); + // to speedup test execution we only allow to ingest the data indexes and only if index doesn't exist + const loadIfNeeded = async (name: string, performance?: LoadActionPerfOptions | undefined) => + esArchiverInstance!.loadIfNeeded(name, performance); + + use({ loadIfNeeded }); + }, + { scope: 'worker' }, + ], + + samlAuth: [ + ({ log, config }, use) => { + use(createSamlSessionManager(config, log)); + }, + { scope: 'worker' }, + ], +}); diff --git a/packages/kbn-scout/src/playwright/index.ts b/packages/kbn-scout/src/playwright/index.ts new file mode 100644 index 0000000000000..66c80f0068f06 --- /dev/null +++ b/packages/kbn-scout/src/playwright/index.ts @@ -0,0 +1,22 @@ +/* + * 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", the "GNU Affero General Public License v3.0 only", and the "Server Side + * Public License v 1"; you may not use this file except in compliance with, at + * your election, the "Elastic License 2.0", the "GNU Affero General Public + * License v3.0 only", or the "Server Side Public License, v 1". + */ + +import { mergeTests } from 'playwright/test'; +import { scoutCoreFixtures } from './fixtures'; + +// Scout core fixtures: worker & test scope +export const test = mergeTests(scoutCoreFixtures); + +export { createPlaywrightConfig } from './config'; +export { createLazyPageObject } from './page_objects/utils'; +export { expect } from './expect'; + +export type { ScoutPlaywrightOptions, ScoutTestOptions } from './types'; +export type { PageObjects } from './page_objects'; +export type { ScoutTestFixtures, ScoutWorkerFixtures, ScoutPage } from './fixtures'; diff --git a/packages/kbn-scout/src/playwright/page_objects/date_picker.ts b/packages/kbn-scout/src/playwright/page_objects/date_picker.ts new file mode 100644 index 0000000000000..08b724a956a3d --- /dev/null +++ b/packages/kbn-scout/src/playwright/page_objects/date_picker.ts @@ -0,0 +1,41 @@ +/* + * 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", the "GNU Affero General Public License v3.0 only", and the "Server Side + * Public License v 1"; you may not use this file except in compliance with, at + * your election, the "Elastic License 2.0", the "GNU Affero General Public + * License v3.0 only", or the "Server Side Public License, v 1". + */ + +import { ScoutPage } from '../fixtures/types'; +import { expect } from '..'; + +export class DatePicker { + constructor(private readonly page: ScoutPage) {} + + async setAbsoluteRange({ from, to }: { from: string; to: string }) { + await this.page.testSubj.click('superDatePickerShowDatesButton'); + // we start with end date + await this.page.testSubj.click('superDatePickerendDatePopoverButton'); + await this.page.testSubj.click('superDatePickerAbsoluteTab'); + const inputFrom = this.page.testSubj.locator('superDatePickerAbsoluteDateInput'); + await inputFrom.clear(); + await inputFrom.fill(to); + await this.page.testSubj.click('parseAbsoluteDateFormat'); + await this.page.testSubj.click('superDatePickerendDatePopoverButton'); + // and later change start date + await this.page.testSubj.click('superDatePickerstartDatePopoverButton'); + await this.page.testSubj.click('superDatePickerAbsoluteTab'); + const inputTo = this.page.testSubj.locator('superDatePickerAbsoluteDateInput'); + await inputTo.clear(); + await inputTo.fill(from); + await this.page.testSubj.click('parseAbsoluteDateFormat'); + await this.page.keyboard.press('Escape'); + + await expect(this.page.testSubj.locator('superDatePickerstartDatePopoverButton')).toHaveText( + from + ); + await expect(this.page.testSubj.locator('superDatePickerendDatePopoverButton')).toHaveText(to); + await this.page.testSubj.click('querySubmitButton'); + } +} diff --git a/packages/kbn-scout/src/playwright/page_objects/discover_app.ts b/packages/kbn-scout/src/playwright/page_objects/discover_app.ts new file mode 100644 index 0000000000000..e4abbf252ae31 --- /dev/null +++ b/packages/kbn-scout/src/playwright/page_objects/discover_app.ts @@ -0,0 +1,18 @@ +/* + * 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", the "GNU Affero General Public License v3.0 only", and the "Server Side + * Public License v 1"; you may not use this file except in compliance with, at + * your election, the "Elastic License 2.0", the "GNU Affero General Public + * License v3.0 only", or the "Server Side Public License, v 1". + */ + +import { ScoutPage } from '../fixtures/types'; + +export class DiscoverApp { + constructor(private readonly page: ScoutPage) {} + + async goto() { + await this.page.gotoApp('discover'); + } +} diff --git a/packages/kbn-scout/src/playwright/page_objects/index.ts b/packages/kbn-scout/src/playwright/page_objects/index.ts new file mode 100644 index 0000000000000..fb90dfea38ff8 --- /dev/null +++ b/packages/kbn-scout/src/playwright/page_objects/index.ts @@ -0,0 +1,32 @@ +/* + * 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", the "GNU Affero General Public License v3.0 only", and the "Server Side + * Public License v 1"; you may not use this file except in compliance with, at + * your election, the "Elastic License 2.0", the "GNU Affero General Public + * License v3.0 only", or the "Server Side Public License, v 1". + */ + +import { ScoutPage } from '../fixtures/types'; +import { DatePicker } from './date_picker'; +import { DiscoverApp } from './discover_app'; +import { createLazyPageObject } from './utils'; + +export interface PageObjects { + datePicker: DatePicker; + discover: DiscoverApp; +} + +/** + * Creates a set of core page objects, each lazily instantiated on first access. + * + * @param page - `ScoutPage` instance used for initializing page objects. + * @returns An object containing lazy-loaded core page objects. + */ +export function createCorePageObjects(page: ScoutPage): PageObjects { + return { + datePicker: createLazyPageObject(DatePicker, page), + discover: createLazyPageObject(DiscoverApp, page), + // Add new page objects here + }; +} diff --git a/packages/kbn-scout/src/playwright/page_objects/utils/index.ts b/packages/kbn-scout/src/playwright/page_objects/utils/index.ts new file mode 100644 index 0000000000000..5593a324a274f --- /dev/null +++ b/packages/kbn-scout/src/playwright/page_objects/utils/index.ts @@ -0,0 +1,39 @@ +/* + * 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", the "GNU Affero General Public License v3.0 only", and the "Server Side + * Public License v 1"; you may not use this file except in compliance with, at + * your election, the "Elastic License 2.0", the "GNU Affero General Public + * License v3.0 only", or the "Server Side Public License, v 1". + */ + +import { ScoutPage } from '../../fixtures/types'; + +/** + * Creates a lazily instantiated proxy for a Page Object class, deferring the creation of the instance until + * a property or method is accessed. It helps avoiding instantiation of page objects that may not be used + * in certain test scenarios. + * + * @param PageObjectClass - The page object class to be instantiated lazily. + * @param scoutPage - ScoutPage instance, that extendes the Playwright `page` fixture and passed to the page object class constructor. + * @param constructorArgs - Additional arguments to be passed to the page object class constructor. + * @returns A proxy object that behaves like an instance of the page object class, instantiating it on demand. + */ +export function createLazyPageObject( + PageObjectClass: new (page: ScoutPage, ...args: any[]) => T, + scoutPage: ScoutPage, + ...constructorArgs: any[] +): T { + let instance: T | null = null; + return new Proxy({} as T, { + get(_, prop: string | symbol) { + if (!instance) { + instance = new PageObjectClass(scoutPage, ...constructorArgs); + } + if (typeof prop === 'symbol' || !(prop in instance)) { + return undefined; + } + return instance[prop as keyof T]; + }, + }); +} diff --git a/packages/kbn-scout/src/playwright/runner/config_validator.ts b/packages/kbn-scout/src/playwright/runner/config_validator.ts new file mode 100644 index 0000000000000..a066a6dfba30c --- /dev/null +++ b/packages/kbn-scout/src/playwright/runner/config_validator.ts @@ -0,0 +1,46 @@ +/* + * 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", the "GNU Affero General Public License v3.0 only", and the "Server Side + * Public License v 1"; you may not use this file except in compliance with, at + * your election, the "Elastic License 2.0", the "GNU Affero General Public + * License v3.0 only", or the "Server Side Public License, v 1". + */ + +import * as Fs from 'fs'; +import { REPO_ROOT } from '@kbn/repo-info'; +import { PlaywrightTestConfig } from 'playwright/test'; +import path from 'path'; +import { createFlagError } from '@kbn/dev-cli-errors'; +import { ScoutTestOptions, VALID_CONFIG_MARKER } from '../types'; + +export async function validatePlaywrightConfig(configPath: string) { + const fullPath = path.resolve(REPO_ROOT, configPath); + + // Check if the path exists and has a .ts extension + if (!configPath || !Fs.existsSync(fullPath) || !configPath.endsWith('.ts')) { + throw createFlagError( + `Path to a valid TypeScript config file is required: --config ` + ); + } + + // Dynamically import the file to check for a default export + const configModule = await import(fullPath); + const config = configModule.default as PlaywrightTestConfig; + + // Check if the config's 'use' property has the valid marker + if (!config?.use?.[VALID_CONFIG_MARKER]) { + throw createFlagError( + `The config file at "${configPath}" must be created with "createPlaywrightConfig" from '@kbn/scout' package:\n +export default createPlaywrightConfig({ + testDir: './tests', +});` + ); + } + + if (!config.testDir) { + throw createFlagError( + `The config file at "${configPath}" must export a valid Playwright configuration with "testDir" property.` + ); + } +} diff --git a/packages/kbn-scout/src/playwright/runner/flags.ts b/packages/kbn-scout/src/playwright/runner/flags.ts new file mode 100644 index 0000000000000..7d39d821705c1 --- /dev/null +++ b/packages/kbn-scout/src/playwright/runner/flags.ts @@ -0,0 +1,52 @@ +/* + * 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", the "GNU Affero General Public License v3.0 only", and the "Server Side + * Public License v 1"; you may not use this file except in compliance with, at + * your election, the "Elastic License 2.0", the "GNU Affero General Public + * License v3.0 only", or the "Server Side Public License, v 1". + */ + +import { FlagOptions, FlagsReader } from '@kbn/dev-cli-runner'; +import { createFlagError } from '@kbn/dev-cli-errors'; +import { SERVER_FLAG_OPTIONS, parseServerFlags } from '../../servers'; +import { CliSupportedServerModes } from '../../types'; +import { validatePlaywrightConfig } from './config_validator'; + +export interface RunTestsOptions { + configPath: string; + headed: boolean; + mode: CliSupportedServerModes; + esFrom: 'serverless' | 'source' | 'snapshot' | undefined; + installDir: string | undefined; + logsDir: string | undefined; +} + +export const TEST_FLAG_OPTIONS: FlagOptions = { + ...SERVER_FLAG_OPTIONS, + boolean: [...(SERVER_FLAG_OPTIONS.boolean || []), 'headed'], + string: [...(SERVER_FLAG_OPTIONS.string || []), 'config'], + default: { headed: false }, + help: `${SERVER_FLAG_OPTIONS.help} + --config Playwright config file path + --headed Run Playwright with browser head + `, +}; + +export async function parseTestFlags(flags: FlagsReader) { + const options = parseServerFlags(flags); + const configPath = flags.string('config'); + const headed = flags.boolean('headed'); + + if (!configPath) { + throw createFlagError(`Path to playwright config is required: --config `); + } + + await validatePlaywrightConfig(configPath); + + return { + ...options, + configPath, + headed, + }; +} diff --git a/packages/kbn-scout/src/playwright/runner/index.ts b/packages/kbn-scout/src/playwright/runner/index.ts new file mode 100644 index 0000000000000..2e24f2d2d3039 --- /dev/null +++ b/packages/kbn-scout/src/playwright/runner/index.ts @@ -0,0 +1,12 @@ +/* + * 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", the "GNU Affero General Public License v3.0 only", and the "Server Side + * Public License v 1"; you may not use this file except in compliance with, at + * your election, the "Elastic License 2.0", the "GNU Affero General Public + * License v3.0 only", or the "Server Side Public License, v 1". + */ + +export { runTests } from './run_tests'; +export { parseTestFlags, TEST_FLAG_OPTIONS } from './flags'; +export type { RunTestsOptions } from './flags'; diff --git a/packages/kbn-scout/src/playwright/runner/run_tests.ts b/packages/kbn-scout/src/playwright/runner/run_tests.ts new file mode 100644 index 0000000000000..a5d8aa137dbfd --- /dev/null +++ b/packages/kbn-scout/src/playwright/runner/run_tests.ts @@ -0,0 +1,84 @@ +/* + * 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", the "GNU Affero General Public License v3.0 only", and the "Server Side + * Public License v 1"; you may not use this file except in compliance with, at + * your election, the "Elastic License 2.0", the "GNU Affero General Public + * License v3.0 only", or the "Server Side Public License, v 1". + */ + +import { resolve } from 'path'; + +import { ToolingLog } from '@kbn/tooling-log'; +import { withProcRunner } from '@kbn/dev-proc-runner'; +import { getTimeReporter } from '@kbn/ci-stats-reporter'; +import { REPO_ROOT } from '@kbn/repo-info'; +import { runElasticsearch, runKibanaServer } from '../../servers'; +import { loadServersConfig } from '../../config'; +import { silence } from '../../common'; +import { RunTestsOptions } from './flags'; +import { getExtraKbnOpts } from '../../servers/run_kibana_server'; + +export async function runTests(log: ToolingLog, options: RunTestsOptions) { + const runStartTime = Date.now(); + const reportTime = getTimeReporter(log, 'scripts/scout_test'); + + const config = await loadServersConfig(options.mode, log); + const playwrightConfigPath = options.configPath; + + await withProcRunner(log, async (procs) => { + const abortCtrl = new AbortController(); + + const onEarlyExit = (msg: string) => { + log.error(msg); + abortCtrl.abort(); + }; + + let shutdownEs; + + try { + shutdownEs = await runElasticsearch({ + onEarlyExit, + config, + log, + esFrom: options.esFrom, + logsDir: options.logsDir, + }); + + await runKibanaServer({ + procs, + onEarlyExit, + config, + installDir: options.installDir, + extraKbnOpts: getExtraKbnOpts(options.installDir, config.get('serverless')), + }); + + // wait for 5 seconds + await silence(log, 5000); + + // Running 'npx playwright test --config=${playwrightConfigPath}' + await procs.run(`playwright`, { + cmd: resolve(REPO_ROOT, './node_modules/.bin/playwright'), + args: ['test', `--config=${playwrightConfigPath}`, ...(options.headed ? ['--headed'] : [])], + cwd: resolve(REPO_ROOT), + env: { + ...process.env, + }, + wait: true, + }); + } finally { + try { + await procs.stop('kibana'); + } finally { + if (shutdownEs) { + await shutdownEs(); + } + } + } + + reportTime(runStartTime, 'ready', { + success: true, + ...options, + }); + }); +} diff --git a/packages/kbn-scout/src/playwright/types/index.ts b/packages/kbn-scout/src/playwright/types/index.ts new file mode 100644 index 0000000000000..c8d0087d62438 --- /dev/null +++ b/packages/kbn-scout/src/playwright/types/index.ts @@ -0,0 +1,24 @@ +/* + * 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", the "GNU Affero General Public License v3.0 only", and the "Server Side + * Public License v 1"; you may not use this file except in compliance with, at + * your election, the "Elastic License 2.0", the "GNU Affero General Public + * License v3.0 only", or the "Server Side Public License, v 1". + */ + +import { PlaywrightTestConfig, PlaywrightTestOptions } from 'playwright/test'; + +export type Protocol = 'http' | 'https'; + +export const VALID_CONFIG_MARKER = Symbol('validConfig'); + +export interface ScoutTestOptions extends PlaywrightTestOptions { + serversConfigDir: string; + [VALID_CONFIG_MARKER]: boolean; +} + +export interface ScoutPlaywrightOptions extends Pick { + testDir: string; + workers?: 1 | 2; +} diff --git a/packages/kbn-scout/src/playwright/utils/index.ts b/packages/kbn-scout/src/playwright/utils/index.ts new file mode 100644 index 0000000000000..6100cffc2f2c8 --- /dev/null +++ b/packages/kbn-scout/src/playwright/utils/index.ts @@ -0,0 +1,10 @@ +/* + * 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", the "GNU Affero General Public License v3.0 only", and the "Server Side + * Public License v 1"; you may not use this file except in compliance with, at + * your election, the "Elastic License 2.0", the "GNU Affero General Public + * License v3.0 only", or the "Server Side Public License, v 1". + */ + +export const serviceLoadedMsg = (name: string) => `scout service loaded: ${name}`; diff --git a/packages/kbn-scout/src/servers/flags.ts b/packages/kbn-scout/src/servers/flags.ts new file mode 100644 index 0000000000000..7f372d72e2d7c --- /dev/null +++ b/packages/kbn-scout/src/servers/flags.ts @@ -0,0 +1,55 @@ +/* + * 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", the "GNU Affero General Public License v3.0 only", and the "Server Side + * Public License v 1"; you may not use this file except in compliance with, at + * your election, the "Elastic License 2.0", the "GNU Affero General Public + * License v3.0 only", or the "Server Side Public License, v 1". + */ + +import { v4 as uuidV4 } from 'uuid'; +import { resolve } from 'path'; +import { FlagsReader, FlagOptions } from '@kbn/dev-cli-runner'; +import { createFlagError } from '@kbn/dev-cli-errors'; +import { REPO_ROOT } from '@kbn/repo-info'; +import { CliSupportedServerModes } from '../types'; + +export type StartServerOptions = ReturnType; + +export const SERVER_FLAG_OPTIONS: FlagOptions = { + string: ['serverless', 'esFrom', 'kibana-install-dir'], + boolean: ['stateful', 'logToFile'], + help: ` + --stateful Start Elasticsearch and Kibana with default ESS configuration + --serverless Start Elasticsearch and Kibana with serverless project configuration: es | oblt | security + --esFrom Build Elasticsearch from source or run snapshot or serverless. Default: $TEST_ES_FROM or "snapshot" + --kibana-install-dir Run Kibana from existing install directory instead of from source + --logToFile Write the log output from Kibana/ES to files instead of to stdout + `, +}; + +export function parseServerFlags(flags: FlagsReader) { + const serverlessType = flags.enum('serverless', ['es', 'oblt', 'security']); + const isStateful = flags.boolean('stateful'); + + if (!(serverlessType || isStateful) || (serverlessType && isStateful)) { + throw createFlagError(`Expected exactly one of --serverless= or --stateful flag`); + } + + const mode: CliSupportedServerModes = serverlessType + ? `serverless=${serverlessType}` + : 'stateful'; + + const esFrom = flags.enum('esFrom', ['source', 'snapshot', 'serverless']); + const installDir = flags.string('kibana-install-dir'); + const logsDir = flags.boolean('logToFile') + ? resolve(REPO_ROOT, 'data/ftr_servers_logs', uuidV4()) + : undefined; + + return { + mode, + esFrom, + installDir, + logsDir, + }; +} diff --git a/packages/kbn-scout/src/servers/index.ts b/packages/kbn-scout/src/servers/index.ts new file mode 100644 index 0000000000000..9d19f18f2974e --- /dev/null +++ b/packages/kbn-scout/src/servers/index.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", the "GNU Affero General Public License v3.0 only", and the "Server Side + * Public License v 1"; you may not use this file except in compliance with, at + * your election, the "Elastic License 2.0", the "GNU Affero General Public + * License v3.0 only", or the "Server Side Public License, v 1". + */ + +export { parseServerFlags, SERVER_FLAG_OPTIONS } from './flags'; +export { startServers } from './start_servers'; +export { runKibanaServer } from './run_kibana_server'; +export { runElasticsearch } from './run_elasticsearch'; + +export type { StartServerOptions } from './flags'; diff --git a/packages/kbn-scout/src/servers/run_elasticsearch.ts b/packages/kbn-scout/src/servers/run_elasticsearch.ts new file mode 100644 index 0000000000000..5406f755f5d72 --- /dev/null +++ b/packages/kbn-scout/src/servers/run_elasticsearch.ts @@ -0,0 +1,194 @@ +/* + * 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", the "GNU Affero General Public License v3.0 only", and the "Server Side + * Public License v 1"; you may not use this file except in compliance with, at + * your election, the "Elastic License 2.0", the "GNU Affero General Public + * License v3.0 only", or the "Server Side Public License, v 1". + */ + +import Url from 'url'; +import { resolve } from 'path'; +import type { ToolingLog } from '@kbn/tooling-log'; +import { REPO_ROOT } from '@kbn/repo-info'; +import type { ArtifactLicense, ServerlessProjectType } from '@kbn/es'; +import { isServerlessProjectType, extractAndArchiveLogs } from '@kbn/es/src/utils'; +import { createTestEsCluster, esTestConfig } from '@kbn/test'; +import { Config } from '../config'; + +interface RunElasticsearchOptions { + log: ToolingLog; + esFrom?: string; + esServerlessImage?: string; + config: Config; + onEarlyExit?: (msg: string) => void; + logsDir?: string; + name?: string; +} + +type EsConfig = ReturnType; + +function getEsConfig({ + config, + esFrom = config.get('esTestCluster.from'), + esServerlessImage, +}: RunElasticsearchOptions) { + const ssl = !!config.get('esTestCluster.ssl'); + const license: ArtifactLicense = config.get('esTestCluster.license'); + const esArgs: string[] = config.get('esTestCluster.serverArgs'); + const esJavaOpts: string | undefined = config.get('esTestCluster.esJavaOpts'); + const isSecurityEnabled = esArgs.includes('xpack.security.enabled=true'); + + const port: number | undefined = config.get('servers.elasticsearch.port'); + + const password: string | undefined = isSecurityEnabled + ? 'changeme' + : config.get('servers.elasticsearch.password'); + + const dataArchive: string | undefined = config.get('esTestCluster.dataArchive'); + const serverless: boolean = config.get('serverless'); + const files: string[] | undefined = config.get('esTestCluster.files'); + + const esServerlessOptions = serverless + ? getESServerlessOptions(esServerlessImage, config) + : undefined; + + return { + ssl, + license, + esArgs, + esJavaOpts, + isSecurityEnabled, + esFrom, + esServerlessOptions, + port, + password, + dataArchive, + serverless, + files, + }; +} + +export async function runElasticsearch( + options: RunElasticsearchOptions +): Promise<() => Promise> { + const { log, logsDir, name } = options; + const config = getEsConfig(options); + + const node = await startEsNode({ + log, + name: name ?? 'scout', + logsDir, + config, + }); + return async () => { + await node.cleanup(); + await extractAndArchiveLogs({ outputFolder: logsDir, log }); + }; +} + +async function startEsNode({ + log, + name, + config, + onEarlyExit, + logsDir, +}: { + log: ToolingLog; + name: string; + config: EsConfig & { transportPort?: number }; + onEarlyExit?: (msg: string) => void; + logsDir?: string; +}) { + const cluster = createTestEsCluster({ + clusterName: `cluster-${name}`, + esArgs: config.esArgs, + esFrom: config.esFrom, + esServerlessOptions: config.esServerlessOptions, + esJavaOpts: config.esJavaOpts, + license: config.license, + password: config.password, + port: config.port, + ssl: config.ssl, + log, + writeLogsToPath: logsDir ? resolve(logsDir, `es-cluster-${name}.log`) : undefined, + basePath: resolve(REPO_ROOT, '.es'), + nodes: [ + { + name, + dataArchive: config.dataArchive, + }, + ], + transportPort: config.transportPort, + onEarlyExit, + serverless: config.serverless, + files: config.files, + }); + + await cluster.start(); + + return cluster; +} + +interface EsServerlessOptions { + projectType: ServerlessProjectType; + host?: string; + resources: string[]; + kibanaUrl: string; + tag?: string; + image?: string; +} + +function getESServerlessOptions( + esServerlessImageFromArg: string | undefined, + config: Config +): EsServerlessOptions { + const esServerlessImageUrlOrTag = + esServerlessImageFromArg || + esTestConfig.getESServerlessImage() || + (config.has('esTestCluster.esServerlessImage') && + config.get('esTestCluster.esServerlessImage')); + const serverlessResources: string[] = + (config.has('esServerlessOptions.resources') && config.get('esServerlessOptions.resources')) || + []; + const serverlessHost: string | undefined = + config.has('esServerlessOptions.host') && config.get('esServerlessOptions.host'); + + const kbnServerArgs = + (config.has('kbnTestServer.serverArgs') && + (config.get('kbnTestServer.serverArgs') as string[])) || + []; + + const projectType = kbnServerArgs + .filter((arg) => arg.startsWith('--serverless')) + .reduce((acc, arg) => { + const match = arg.match(/--serverless[=\s](\w+)/); + return acc + (match ? match[1] : ''); + }, '') as ServerlessProjectType; + + if (!isServerlessProjectType(projectType)) { + throw new Error(`Unsupported serverless projectType: ${projectType}`); + } + + const commonOptions = { + projectType, + host: serverlessHost, + resources: serverlessResources, + kibanaUrl: Url.format({ + protocol: config.get('servers.kibana.protocol'), + hostname: config.get('servers.kibana.hostname'), + port: config.get('servers.kibana.port'), + }), + }; + + if (esServerlessImageUrlOrTag) { + return { + ...commonOptions, + ...(esServerlessImageUrlOrTag.includes(':') + ? { image: esServerlessImageUrlOrTag } + : { tag: esServerlessImageUrlOrTag }), + }; + } + + return commonOptions; +} diff --git a/packages/kbn-scout/src/servers/run_kibana_server.ts b/packages/kbn-scout/src/servers/run_kibana_server.ts new file mode 100644 index 0000000000000..1363b8daaa906 --- /dev/null +++ b/packages/kbn-scout/src/servers/run_kibana_server.ts @@ -0,0 +1,135 @@ +/* + * 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", the "GNU Affero General Public License v3.0 only", and the "Server Side + * Public License v 1"; you may not use this file except in compliance with, at + * your election, the "Elastic License 2.0", the "GNU Affero General Public + * License v3.0 only", or the "Server Side Public License, v 1". + */ + +import Path from 'path'; +import Os from 'os'; +import { v4 as uuidv4 } from 'uuid'; +import type { ProcRunner } from '@kbn/dev-proc-runner'; +import { REPO_ROOT } from '@kbn/repo-info'; +import { parseRawFlags, getArgValue, remapPluginPaths, DedicatedTaskRunner } from '@kbn/test'; +import { Config } from '../config'; + +export async function runKibanaServer(options: { + procs: ProcRunner; + config: Config; + installDir?: string; + extraKbnOpts?: string[]; + logsDir?: string; + onEarlyExit?: (msg: string) => void; +}) { + const { config, procs } = options; + const runOptions = options.config.get('kbnTestServer.runOptions'); + const installDir = runOptions.alwaysUseSource ? undefined : options.installDir; + const devMode = !installDir; + const useTaskRunner = options.config.get('kbnTestServer.useDedicatedTaskRunner'); + + const procRunnerOpts = { + cwd: installDir || REPO_ROOT, + cmd: installDir + ? process.platform.startsWith('win') + ? Path.resolve(installDir, 'bin/kibana.bat') + : Path.resolve(installDir, 'bin/kibana') + : process.execPath, + env: { + FORCE_COLOR: 1, + ...process.env, + ...options.config.get('kbnTestServer.env'), + }, + wait: runOptions.wait, + onEarlyExit: options.onEarlyExit, + }; + + const prefixArgs = devMode + ? [Path.relative(procRunnerOpts.cwd, Path.resolve(REPO_ROOT, 'scripts/kibana'))] + : []; + + const buildArgs: string[] = config.get('kbnTestServer.buildArgs') || []; + const sourceArgs: string[] = config.get('kbnTestServer.sourceArgs') || []; + const serverArgs: string[] = config.get('kbnTestServer.serverArgs') || []; + + let kbnFlags = parseRawFlags([ + // When installDir is passed, we run from a built version of Kibana which uses different command line + // arguments. If installDir is not passed, we run from source code. + ...(installDir ? [...buildArgs, ...serverArgs] : [...sourceArgs, ...serverArgs]), + + // We also allow passing in extra Kibana server options, tack those on here so they always take precedence + ...(options.extraKbnOpts ?? []), + ]); + + if (installDir) { + kbnFlags = remapPluginPaths(kbnFlags, installDir); + } + + const mainName = useTaskRunner ? 'kbn-ui' : 'kibana'; + const promises = [ + // main process + procs.run(mainName, { + ...procRunnerOpts, + writeLogsToPath: options.logsDir + ? Path.resolve(options.logsDir, `${mainName}.log`) + : undefined, + args: [ + ...prefixArgs, + ...parseRawFlags([ + ...kbnFlags, + ...(!useTaskRunner + ? [] + : [ + '--node.roles=["ui"]', + `--path.data=${Path.resolve(Os.tmpdir(), `scout-ui-${uuidv4()}`)}`, + ]), + ]), + ], + }), + ]; + + if (useTaskRunner) { + const mainUuid = getArgValue(kbnFlags, 'server.uuid'); + + // dedicated task runner + promises.push( + procs.run('kbn-tasks', { + ...procRunnerOpts, + writeLogsToPath: options.logsDir + ? Path.resolve(options.logsDir, 'kbn-tasks.log') + : undefined, + args: [ + ...prefixArgs, + ...parseRawFlags([ + ...kbnFlags, + `--server.port=${DedicatedTaskRunner.getPort(config.get('servers.kibana.port'))}`, + '--node.roles=["background_tasks"]', + `--path.data=${Path.resolve(Os.tmpdir(), `ftr-task-runner-${uuidv4()}`)}`, + ...(typeof mainUuid === 'string' && mainUuid + ? [`--server.uuid=${DedicatedTaskRunner.getUuid(mainUuid)}`] + : []), + ...(devMode ? ['--no-optimizer'] : []), + ]), + ], + }) + ); + } + + await Promise.all(promises); +} + +export function getExtraKbnOpts(installDir: string | undefined, isServerless: boolean) { + if (installDir) { + return []; + } + + return [ + '--dev', + '--no-dev-config', + '--no-dev-credentials', + isServerless + ? '--server.versioned.versionResolution=newest' + : '--server.versioned.versionResolution=oldest', + ]; +} diff --git a/packages/kbn-scout/src/servers/start_servers.ts b/packages/kbn-scout/src/servers/start_servers.ts new file mode 100644 index 0000000000000..32eb2030c978d --- /dev/null +++ b/packages/kbn-scout/src/servers/start_servers.ts @@ -0,0 +1,63 @@ +/* + * 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", the "GNU Affero General Public License v3.0 only", and the "Server Side + * Public License v 1"; you may not use this file except in compliance with, at + * your election, the "Elastic License 2.0", the "GNU Affero General Public + * License v3.0 only", or the "Server Side Public License, v 1". + */ + +import dedent from 'dedent'; + +import { ToolingLog } from '@kbn/tooling-log'; +import { withProcRunner } from '@kbn/dev-proc-runner'; +import { getTimeReporter } from '@kbn/ci-stats-reporter'; +import { runElasticsearch } from './run_elasticsearch'; +import { getExtraKbnOpts, runKibanaServer } from './run_kibana_server'; +import { StartServerOptions } from './flags'; +import { loadServersConfig } from '../config'; +import { silence } from '../common'; + +export async function startServers(log: ToolingLog, options: StartServerOptions) { + const runStartTime = Date.now(); + const reportTime = getTimeReporter(log, 'scripts/scout_start_servers'); + + await withProcRunner(log, async (procs) => { + const config = await loadServersConfig(options.mode, log); + + const shutdownEs = await runElasticsearch({ + config, + log, + esFrom: options.esFrom, + logsDir: options.logsDir, + }); + + await runKibanaServer({ + procs, + config, + installDir: options.installDir, + extraKbnOpts: getExtraKbnOpts(options.installDir, config.get('serverless')), + }); + + reportTime(runStartTime, 'ready', { + success: true, + ...options, + }); + + // wait for 5 seconds of silence before logging the + // success message so that it doesn't get buried + await silence(log, 5000); + + log.success( + '\n\n' + + dedent` + Elasticsearch and Kibana are ready for functional testing. + Use 'npx playwright test --config ' to run tests' + ` + + '\n\n' + ); + + await procs.waitForAllToStop(); + await shutdownEs(); + }); +} diff --git a/packages/kbn-scout/src/types/cli.d.ts b/packages/kbn-scout/src/types/cli.d.ts new file mode 100644 index 0000000000000..9f0d5a2653652 --- /dev/null +++ b/packages/kbn-scout/src/types/cli.d.ts @@ -0,0 +1,14 @@ +/* + * 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", the "GNU Affero General Public License v3.0 only", and the "Server Side + * Public License v 1"; you may not use this file except in compliance with, at + * your election, the "Elastic License 2.0", the "GNU Affero General Public + * License v3.0 only", or the "Server Side Public License, v 1". + */ + +export type CliSupportedServerModes = + | 'stateful' + | 'serverless=es' + | 'serverless=oblt' + | 'serverless=security'; diff --git a/packages/kbn-scout/src/types/config.d.ts b/packages/kbn-scout/src/types/config.d.ts new file mode 100644 index 0000000000000..14cd27b47fde2 --- /dev/null +++ b/packages/kbn-scout/src/types/config.d.ts @@ -0,0 +1,34 @@ +/* + * 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", the "GNU Affero General Public License v3.0 only", and the "Server Side + * Public License v 1"; you may not use this file except in compliance with, at + * your election, the "Elastic License 2.0", the "GNU Affero General Public + * License v3.0 only", or the "Server Side Public License, v 1". + */ + +import { UrlParts } from '@kbn/test'; + +export interface ScoutLoaderConfig { + serverless?: boolean; + servers: { + kibana: UrlParts; + elasticsearch: UrlParts; + fleet?: UrlParts; + }; + dockerServers: any; + esTestCluster: { + from: string; + license?: string; + files: string[]; + serverArgs: string[]; + ssl: boolean; + }; + kbnTestServer: { + env?: any; + buildArgs?: string[]; + sourceArgs?: string[]; + serverArgs: string[]; + useDedicatedTastRunner?: boolean; + }; +} diff --git a/packages/kbn-scout/src/types/index.ts b/packages/kbn-scout/src/types/index.ts new file mode 100644 index 0000000000000..811b63fb1aac3 --- /dev/null +++ b/packages/kbn-scout/src/types/index.ts @@ -0,0 +1,12 @@ +/* + * 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", the "GNU Affero General Public License v3.0 only", and the "Server Side + * Public License v 1"; you may not use this file except in compliance with, at + * your election, the "Elastic License 2.0", the "GNU Affero General Public + * License v3.0 only", or the "Server Side Public License, v 1". + */ + +export * from './config'; +export * from './cli'; +export * from './servers'; diff --git a/packages/kbn-scout/src/types/servers.d.ts b/packages/kbn-scout/src/types/servers.d.ts new file mode 100644 index 0000000000000..587e1d213b9ba --- /dev/null +++ b/packages/kbn-scout/src/types/servers.d.ts @@ -0,0 +1,26 @@ +/* + * 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", the "GNU Affero General Public License v3.0 only", and the "Server Side + * Public License v 1"; you may not use this file except in compliance with, at + * your election, the "Elastic License 2.0", the "GNU Affero General Public + * License v3.0 only", or the "Server Side Public License, v 1". + */ + +import { ServerlessProjectType } from '@kbn/es'; + +export interface ScoutServerConfig { + serverless: boolean; + projectType?: ServerlessProjectType; + isCloud: boolean; + cloudUsersFilePath: string; + hosts: { + kibana: string; + elasticsearch: string; + }; + auth: { + username: string; + password: string; + }; + metadata?: any; +} diff --git a/packages/kbn-scout/tsconfig.json b/packages/kbn-scout/tsconfig.json new file mode 100644 index 0000000000000..35d74c6437618 --- /dev/null +++ b/packages/kbn-scout/tsconfig.json @@ -0,0 +1,31 @@ +{ + "extends": "../../tsconfig.base.json", + "compilerOptions": { + "outDir": "target/types", + "types": [ + "jest", + "node" + ] + }, + "include": [ + "**/*.ts", + ], + "exclude": [ + "target/**/*" + ], + "kbn_references": [ + "@kbn/tooling-log", + "@kbn/dev-cli-runner", + "@kbn/dev-cli-errors", + "@kbn/ci-stats-reporter", + "@kbn/repo-info", + "@kbn/es", + "@kbn/dev-proc-runner", + "@kbn/test", + "@kbn/es-archiver", + "@kbn/dev-utils", + "@kbn/mock-idp-utils", + "@kbn/test-suites-xpack", + "@kbn/test-subj-selector", + ] +} diff --git a/packages/kbn-test/index.ts b/packages/kbn-test/index.ts index 3c03a32efa9ea..eac5c46d62c59 100644 --- a/packages/kbn-test/index.ts +++ b/packages/kbn-test/index.ts @@ -14,9 +14,18 @@ export { startServersCli, startServers } from './src/functional_tests/start_serv // @internal export { runTestsCli, runTests } from './src/functional_tests/run_tests'; +export { + runElasticsearch, + runKibanaServer, + parseRawFlags, + getArgValue, + remapPluginPaths, + getKibanaCliArg, + getKibanaCliLoggers, +} from './src/functional_tests/lib'; + +export { initLogsDir } from './src/functional_tests/lib'; export { SamlSessionManager, type SamlSessionManagerOptions, type HostOptions } from './src/auth'; -export { runElasticsearch, runKibanaServer } from './src/functional_tests/lib'; -export { getKibanaCliArg, getKibanaCliLoggers } from './src/functional_tests/lib/kibana_cli_args'; export type { CreateTestEsClusterOptions, @@ -33,6 +42,7 @@ export { } from './src/es'; export { kbnTestConfig } from './kbn_test_config'; +export type { UrlParts } from './kbn_test_config'; export { kibanaServerTestUser, diff --git a/packages/kbn-test/src/functional_test_runner/index.ts b/packages/kbn-test/src/functional_test_runner/index.ts index 6e781df0a0ea3..6c5641cbe8aab 100644 --- a/packages/kbn-test/src/functional_test_runner/index.ts +++ b/packages/kbn-test/src/functional_test_runner/index.ts @@ -16,6 +16,7 @@ export { Lifecycle, LifecyclePhase, runCheckFtrConfigsCli, + DedicatedTaskRunner, } from './lib'; export { runFtrCli } from './cli'; export * from './lib/docker_servers'; diff --git a/packages/kbn-test/src/functional_test_runner/lib/config/run_check_ftr_configs_cli.ts b/packages/kbn-test/src/functional_test_runner/lib/config/run_check_ftr_configs_cli.ts index f737e380267db..5808c88901b11 100644 --- a/packages/kbn-test/src/functional_test_runner/lib/config/run_check_ftr_configs_cli.ts +++ b/packages/kbn-test/src/functional_test_runner/lib/config/run_check_ftr_configs_cli.ts @@ -50,6 +50,11 @@ export async function runCheckFtrConfigsCli() { return false; } + // playwright config files + if (file.match(/\/ui_tests\/*playwright*.config.ts$/)) { + return false; + } + if (!file.match(/(test|e2e).*config[^\/]*\.(t|j)s$/)) { return false; } diff --git a/packages/kbn-test/src/functional_tests/lib/index.ts b/packages/kbn-test/src/functional_tests/lib/index.ts index 003a675d8421d..23c6ec8331602 100644 --- a/packages/kbn-test/src/functional_tests/lib/index.ts +++ b/packages/kbn-test/src/functional_tests/lib/index.ts @@ -10,3 +10,11 @@ export { runKibanaServer } from './run_kibana_server'; export { runElasticsearch } from './run_elasticsearch'; export * from './run_ftr'; +export { + parseRawFlags, + getArgValue, + remapPluginPaths, + getKibanaCliArg, + getKibanaCliLoggers, +} from './kibana_cli_args'; +export { initLogsDir } from './logs_dir'; diff --git a/scripts/scout_start_servers.js b/scripts/scout_start_servers.js new file mode 100644 index 0000000000000..b93ec0e456454 --- /dev/null +++ b/scripts/scout_start_servers.js @@ -0,0 +1,11 @@ +/* + * 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", the "GNU Affero General Public License v3.0 only", and the "Server Side + * Public License v 1"; you may not use this file except in compliance with, at + * your election, the "Elastic License 2.0", the "GNU Affero General Public + * License v3.0 only", or the "Server Side Public License, v 1". + */ + +require('../src/setup_node_env'); +require('@kbn/scout').startServersCli(); diff --git a/scripts/scout_test.js b/scripts/scout_test.js new file mode 100644 index 0000000000000..8b14ebd33da19 --- /dev/null +++ b/scripts/scout_test.js @@ -0,0 +1,11 @@ +/* + * 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", the "GNU Affero General Public License v3.0 only", and the "Server Side + * Public License v 1"; you may not use this file except in compliance with, at + * your election, the "Elastic License 2.0", the "GNU Affero General Public + * License v3.0 only", or the "Server Side Public License, v 1". + */ + +require('../src/setup_node_env'); +require('@kbn/scout').runTestsCli(); diff --git a/tsconfig.base.json b/tsconfig.base.json index 9c9bf386cfc17..0cccfbf60c761 100644 --- a/tsconfig.base.json +++ b/tsconfig.base.json @@ -1548,6 +1548,8 @@ "@kbn/saved-search-component/*": ["packages/kbn-saved-search-component/*"], "@kbn/saved-search-plugin": ["src/plugins/saved_search"], "@kbn/saved-search-plugin/*": ["src/plugins/saved_search/*"], + "@kbn/scout": ["packages/kbn-scout"], + "@kbn/scout/*": ["packages/kbn-scout/*"], "@kbn/screenshot-mode-example-plugin": ["examples/screenshot_mode_example"], "@kbn/screenshot-mode-example-plugin/*": ["examples/screenshot_mode_example/*"], "@kbn/screenshot-mode-plugin": ["src/plugins/screenshot_mode"], diff --git a/x-pack/.gitignore b/x-pack/.gitignore index 0e0e9aba84467..97efbef318c90 100644 --- a/x-pack/.gitignore +++ b/x-pack/.gitignore @@ -12,3 +12,4 @@ /.env /.kibana-plugin-helpers.dev.* .cache +**/ui_tests/output diff --git a/x-pack/plugins/discover_enhanced/tsconfig.json b/x-pack/plugins/discover_enhanced/tsconfig.json index 72fee12f49c12..79dad79381e97 100644 --- a/x-pack/plugins/discover_enhanced/tsconfig.json +++ b/x-pack/plugins/discover_enhanced/tsconfig.json @@ -3,7 +3,7 @@ "compilerOptions": { "outDir": "target/types", }, - "include": ["*.ts", "common/**/*", "public/**/*", "server/**/*"], + "include": ["*.ts", "common/**/*", "public/**/*", "server/**/*", "ui_tests/**/*"], "kbn_references": [ "@kbn/core", "@kbn/data-plugin", @@ -20,6 +20,7 @@ "@kbn/presentation-publishing", "@kbn/data-views-plugin", "@kbn/unified-search-plugin", + "@kbn/scout", ], "exclude": [ "target/**/*", diff --git a/x-pack/plugins/discover_enhanced/ui_tests/README.md b/x-pack/plugins/discover_enhanced/ui_tests/README.md new file mode 100644 index 0000000000000..8320e9464d9ca --- /dev/null +++ b/x-pack/plugins/discover_enhanced/ui_tests/README.md @@ -0,0 +1,17 @@ +## How to run tests +First start the servers with + +```bash +// ESS +node scripts/scout_start_servers.js --stateful +// Serverless +node scripts/scout_start_servers.js --serverless=es +``` + +Then you can run the tests multiple times in another terminal with: + +```bash +npx playwright test --config x-pack/plugins/discover_enhanced/ui_tests/playwright.config.ts +``` + +Test results are available in `x-pack/plugins/discover_enhanced/ui_tests/output` diff --git a/x-pack/plugins/discover_enhanced/ui_tests/fixtures/index.ts b/x-pack/plugins/discover_enhanced/ui_tests/fixtures/index.ts new file mode 100644 index 0000000000000..b0c5d41692b61 --- /dev/null +++ b/x-pack/plugins/discover_enhanced/ui_tests/fixtures/index.ts @@ -0,0 +1,41 @@ +/* + * 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 { + test as base, + PageObjects, + createLazyPageObject, + ScoutTestFixtures, + ScoutWorkerFixtures, +} from '@kbn/scout'; +import { DemoPage } from './page_objects'; + +interface ExtendedScoutTestFixtures extends ScoutTestFixtures { + pageObjects: PageObjects & { + demo: DemoPage; + }; +} + +export const test = base.extend({ + pageObjects: async ( + { + pageObjects, + page, + }: { + pageObjects: ExtendedScoutTestFixtures['pageObjects']; + page: ExtendedScoutTestFixtures['page']; + }, + use: (pageObjects: ExtendedScoutTestFixtures['pageObjects']) => Promise + ) => { + const extendedPageObjects = { + ...pageObjects, + demo: createLazyPageObject(DemoPage, page), + }; + + await use(extendedPageObjects); + }, +}); diff --git a/x-pack/plugins/discover_enhanced/ui_tests/fixtures/page_objects/demo.ts b/x-pack/plugins/discover_enhanced/ui_tests/fixtures/page_objects/demo.ts new file mode 100644 index 0000000000000..4c65384b9c816 --- /dev/null +++ b/x-pack/plugins/discover_enhanced/ui_tests/fixtures/page_objects/demo.ts @@ -0,0 +1,16 @@ +/* + * 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 { ScoutPage } from '@kbn/scout'; + +export class DemoPage { + constructor(private readonly page: ScoutPage) {} + + async goto() { + this.page.gotoApp('not_implemented'); + } +} diff --git a/x-pack/plugins/discover_enhanced/ui_tests/fixtures/page_objects/index.ts b/x-pack/plugins/discover_enhanced/ui_tests/fixtures/page_objects/index.ts new file mode 100644 index 0000000000000..47afc9c11fe7b --- /dev/null +++ b/x-pack/plugins/discover_enhanced/ui_tests/fixtures/page_objects/index.ts @@ -0,0 +1,8 @@ +/* + * 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. + */ + +export { DemoPage } from './demo'; diff --git a/x-pack/plugins/discover_enhanced/ui_tests/playwright.config.ts b/x-pack/plugins/discover_enhanced/ui_tests/playwright.config.ts new file mode 100644 index 0000000000000..34b370396b67e --- /dev/null +++ b/x-pack/plugins/discover_enhanced/ui_tests/playwright.config.ts @@ -0,0 +1,13 @@ +/* + * 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 { createPlaywrightConfig } from '@kbn/scout'; + +// eslint-disable-next-line import/no-default-export +export default createPlaywrightConfig({ + testDir: './tests', +}); diff --git a/x-pack/plugins/discover_enhanced/ui_tests/tests/value_suggestions.spec.ts b/x-pack/plugins/discover_enhanced/ui_tests/tests/value_suggestions.spec.ts new file mode 100644 index 0000000000000..ff1389e85924e --- /dev/null +++ b/x-pack/plugins/discover_enhanced/ui_tests/tests/value_suggestions.spec.ts @@ -0,0 +1,56 @@ +/* + * 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 { expect } from '@kbn/scout'; +import { test } from '../fixtures'; + +test.describe('Discover app - value suggestions', () => { + test.beforeAll(async ({ esArchiver, kbnClient }) => { + await esArchiver.loadIfNeeded('x-pack/test/functional/es_archives/logstash_functional'); + await kbnClient.importExport.load( + 'x-pack/test/functional/fixtures/kbn_archiver/dashboard_drilldowns/drilldowns' + ); + await kbnClient.uiSettings.update({ + defaultIndex: 'logstash-*', // TODO: investigate why it is required for `node scripts/playwright_test.js` run + 'doc_table:legacy': false, + }); + }); + + test.afterAll(async ({ kbnClient }) => { + await kbnClient.uiSettings.unset('doc_table:legacy'); + await kbnClient.uiSettings.unset('defaultIndex'); + await kbnClient.savedObjects.cleanStandardList(); + }); + + test.beforeEach(async ({ browserAuth, pageObjects }) => { + await browserAuth.loginAsPrivilegedUser(); + await pageObjects.discover.goto(); + }); + + test('dont show up if outside of range', async ({ page, pageObjects }) => { + await pageObjects.datePicker.setAbsoluteRange({ + from: 'Mar 1, 2020 @ 00:00:00.000', + to: 'Nov 1, 2020 @ 00:00:00.000', + }); + + await page.testSubj.fill('queryInput', 'extension.raw : '); + await expect(page.testSubj.locator('autoCompleteSuggestionText')).toHaveCount(0); + }); + + test('show up if in range', async ({ page, pageObjects }) => { + await pageObjects.datePicker.setAbsoluteRange({ + from: 'Sep 19, 2015 @ 06:31:44.000', + to: 'Sep 23, 2015 @ 18:31:44.000', + }); + await page.testSubj.fill('queryInput', 'extension.raw : '); + await expect(page.testSubj.locator('autoCompleteSuggestionText')).toHaveCount(5); + const actualSuggestions = await page.testSubj + .locator('autoCompleteSuggestionText') + .allTextContents(); + expect(actualSuggestions.join(',')).toContain('jpg'); + }); +}); diff --git a/x-pack/plugins/discover_enhanced/ui_tests/tests/value_suggestions_non_time_based.spec.ts b/x-pack/plugins/discover_enhanced/ui_tests/tests/value_suggestions_non_time_based.spec.ts new file mode 100644 index 0000000000000..4ba9450869313 --- /dev/null +++ b/x-pack/plugins/discover_enhanced/ui_tests/tests/value_suggestions_non_time_based.spec.ts @@ -0,0 +1,44 @@ +/* + * 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 { expect } from '@kbn/scout'; +import { test } from '../fixtures'; + +test.describe('Discover app - value suggestions non-time based', () => { + test.beforeAll(async ({ esArchiver, kbnClient }) => { + await esArchiver.loadIfNeeded( + 'test/functional/fixtures/es_archiver/index_pattern_without_timefield' + ); + await kbnClient.importExport.load( + 'test/functional/fixtures/kbn_archiver/index_pattern_without_timefield' + ); + await kbnClient.uiSettings.update({ + defaultIndex: 'without-timefield', + 'doc_table:legacy': false, + }); + }); + + test.afterAll(async ({ kbnClient }) => { + await kbnClient.uiSettings.unset('doc_table:legacy'); + await kbnClient.uiSettings.unset('defaultIndex'); + await kbnClient.savedObjects.cleanStandardList(); + }); + + test.beforeEach(async ({ browserAuth, pageObjects }) => { + await browserAuth.loginAsPrivilegedUser(); + await pageObjects.discover.goto(); + }); + + test('shows all auto-suggest options for a filter in discover context app', async ({ page }) => { + await page.testSubj.fill('queryInput', 'type.keyword : '); + await expect(page.testSubj.locator('autoCompleteSuggestionText')).toHaveCount(1); + const actualSuggestions = await page.testSubj + .locator('autoCompleteSuggestionText') + .allTextContents(); + expect(actualSuggestions.join(',')).toContain('"apache"'); + }); +}); diff --git a/yarn.lock b/yarn.lock index 9c8dffeabaf8d..7e4b0bb56e5ab 100644 --- a/yarn.lock +++ b/yarn.lock @@ -6903,6 +6903,10 @@ version "0.0.0" uid "" +"@kbn/scout@link:packages/kbn-scout": + version "0.0.0" + uid "" + "@kbn/screenshot-mode-example-plugin@link:examples/screenshot_mode_example": version "0.0.0" uid "" From 442d5f2b863967fdca5c2404ff84058e76f3f12c Mon Sep 17 00:00:00 2001 From: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> Date: Wed, 18 Dec 2024 06:34:08 +1100 Subject: [PATCH 10/23] =?UTF-8?q?[8.x]=20[Fleet]=20Bump=20install=20versio?= =?UTF-8?q?n=20after=20removal=20of=20deprecated=20=5Fsource.mode=E2=80=A6?= =?UTF-8?q?=20(#204471)=20(#204604)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit # Backport This will backport the following commits from `main` to `8.x`: - [[Fleet] Bump install version after removal of deprecated _source.mode… (#204471)](https://github.com/elastic/kibana/pull/204471) ### Questions ? Please refer to the [Backport tool documentation](https://github.com/sqren/backport) Co-authored-by: Nicolas Chaulet --- x-pack/plugins/fleet/server/constants/fleet_es_assets.ts | 2 +- .../steps/step_save_system_object.test.ts | 8 +++----- 2 files changed, 4 insertions(+), 6 deletions(-) diff --git a/x-pack/plugins/fleet/server/constants/fleet_es_assets.ts b/x-pack/plugins/fleet/server/constants/fleet_es_assets.ts index 55e6493c77891..f7c824d7d58e3 100644 --- a/x-pack/plugins/fleet/server/constants/fleet_es_assets.ts +++ b/x-pack/plugins/fleet/server/constants/fleet_es_assets.ts @@ -11,7 +11,7 @@ import { getESAssetMetadata } from '../services/epm/elasticsearch/meta'; const meta = getESAssetMetadata(); -export const FLEET_INSTALL_FORMAT_VERSION = '1.3.0'; +export const FLEET_INSTALL_FORMAT_VERSION = '1.4.0'; export const FLEET_AGENT_POLICIES_SCHEMA_VERSION = '1.1.1'; diff --git a/x-pack/plugins/fleet/server/services/epm/packages/install_state_machine/steps/step_save_system_object.test.ts b/x-pack/plugins/fleet/server/services/epm/packages/install_state_machine/steps/step_save_system_object.test.ts index 8d80c236aefb0..c4ae211c58fc5 100644 --- a/x-pack/plugins/fleet/server/services/epm/packages/install_state_machine/steps/step_save_system_object.test.ts +++ b/x-pack/plugins/fleet/server/services/epm/packages/install_state_machine/steps/step_save_system_object.test.ts @@ -13,14 +13,12 @@ import { } from '@kbn/core/server/mocks'; import { DEFAULT_SPACE_ID } from '@kbn/spaces-plugin/common/constants'; +import { FLEET_INSTALL_FORMAT_VERSION } from '../../../../../constants'; import { PACKAGES_SAVED_OBJECT_TYPE } from '../../../../../../common/constants'; - import { appContextService } from '../../../../app_context'; import { createAppContextStartContractMock } from '../../../../../mocks'; - import { auditLoggingService } from '../../../../audit_logging'; import { packagePolicyService } from '../../../../package_policy'; - import { createArchiveIteratorFromMap } from '../../../archive/archive_iterator'; import { stepSaveSystemObject } from './step_save_system_object'; @@ -94,7 +92,7 @@ describe('updateLatestExecutedState', () => { 'epm-packages', 'test-integration', { - install_format_schema_version: '1.3.0', + install_format_schema_version: FLEET_INSTALL_FORMAT_VERSION, install_status: 'installed', install_version: '1.0.0', latest_install_failed_attempts: [], @@ -161,7 +159,7 @@ describe('updateLatestExecutedState', () => { 'epm-packages', 'test-integration', { - install_format_schema_version: '1.3.0', + install_format_schema_version: FLEET_INSTALL_FORMAT_VERSION, install_status: 'installed', install_version: '1.0.0', latest_install_failed_attempts: [], From 34be3d45849ade722fddb57abf43ed312525fa20 Mon Sep 17 00:00:00 2001 From: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> Date: Wed, 18 Dec 2024 06:34:20 +1100 Subject: [PATCH 11/23] [8.x] [Discover] Fix console warning for invalid DOM property (#204417) (#204605) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit # Backport This will backport the following commits from `main` to `8.x`: - [[Discover] Fix console warning for invalid DOM property (#204417)](https://github.com/elastic/kibana/pull/204417) ### Questions ? Please refer to the [Backport tool documentation](https://github.com/sqren/backport) Co-authored-by: Arturo Castillo Delgado --- .../public/components/doc_viewer_flyout/use_flyout_a11y.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/plugins/unified_doc_viewer/public/components/doc_viewer_flyout/use_flyout_a11y.tsx b/src/plugins/unified_doc_viewer/public/components/doc_viewer_flyout/use_flyout_a11y.tsx index 84c47cc4bd063..18cc98fb94b89 100644 --- a/src/plugins/unified_doc_viewer/public/components/doc_viewer_flyout/use_flyout_a11y.tsx +++ b/src/plugins/unified_doc_viewer/public/components/doc_viewer_flyout/use_flyout_a11y.tsx @@ -37,7 +37,7 @@ export const useFlyoutA11y = ({ isXlScreen }: { isXlScreen: boolean }) => { a11yProps: { ref: setFlyoutEl, role: isXlScreen ? 'dialog' : undefined, - tabindex: isXlScreen ? 0 : undefined, + tabIndex: isXlScreen ? 0 : undefined, 'aria-describedby': isXlScreen ? descriptionId : undefined, 'data-no-focus-lock': isXlScreen || undefined, }, From 6d1f500091ce3232983d088b78f8bd07551bada5 Mon Sep 17 00:00:00 2001 From: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> Date: Wed, 18 Dec 2024 06:34:29 +1100 Subject: [PATCH 12/23] [8.x] [ECO][Inventory] Temporary skip Cypress tests (#204578) (#204606) # Backport This will backport the following commits from `main` to `8.x`: - [[ECO][Inventory] Temporary skip Cypress tests (#204578)](https://github.com/elastic/kibana/pull/204578) ### Questions ? Please refer to the [Backport tool documentation](https://github.com/sqren/backport) Co-authored-by: Sergi Romeu --- .../inventory/e2e/cypress/e2e/alert_count/alert_count.cy.ts | 3 ++- .../inventory/e2e/cypress/e2e/home.cy.ts | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/x-pack/plugins/observability_solution/inventory/e2e/cypress/e2e/alert_count/alert_count.cy.ts b/x-pack/plugins/observability_solution/inventory/e2e/cypress/e2e/alert_count/alert_count.cy.ts index ac5fa17ecb08a..b303adc21d1fa 100644 --- a/x-pack/plugins/observability_solution/inventory/e2e/cypress/e2e/alert_count/alert_count.cy.ts +++ b/x-pack/plugins/observability_solution/inventory/e2e/cypress/e2e/alert_count/alert_count.cy.ts @@ -33,7 +33,8 @@ const verifyAlertsTableCount = (alertsCount: string) => { verifyNumber(cy.getByTestSubj('toolbar-alerts-count'), alertsCount); }; -describe('Alert count', () => { +// Temporary skipping those test, will be enabled in the future once we fix them https://github.com/elastic/kibana/issues/204558 +describe.skip('Alert count', () => { beforeEach(() => { cy.loginAsSuperUser(); diff --git a/x-pack/plugins/observability_solution/inventory/e2e/cypress/e2e/home.cy.ts b/x-pack/plugins/observability_solution/inventory/e2e/cypress/e2e/home.cy.ts index c2e7f1232e6aa..57ca19e429a1b 100644 --- a/x-pack/plugins/observability_solution/inventory/e2e/cypress/e2e/home.cy.ts +++ b/x-pack/plugins/observability_solution/inventory/e2e/cypress/e2e/home.cy.ts @@ -11,7 +11,8 @@ import { generateEntities, generateLogs, generateTraces } from './generate_data' const start = '2024-10-16T00:00:00.000Z'; const end = '2024-10-16T00:15:00.000Z'; -describe('Home page', () => { +// Temporary skipping those test, will be enabled in the future once we fix them https://github.com/elastic/kibana/issues/204558 +describe.skip('Home page', () => { beforeEach(() => { cy.loginAsSuperUser(); }); From a01347a20cd670a35b33f91f517cebbff2c7c544 Mon Sep 17 00:00:00 2001 From: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> Date: Wed, 18 Dec 2024 06:34:38 +1100 Subject: [PATCH 13/23] [8.x] [HTTP] Default to `oldest` in dev (#203225) (#204609) # Backport This will backport the following commits from `main` to `8.x`: - [[HTTP] Default to `oldest` in dev (#203225)](https://github.com/elastic/kibana/pull/203225) ### Questions ? Please refer to the [Backport tool documentation](https://github.com/sqren/backport) Co-authored-by: Jean-Louis Leysens --- .../http/core-http-server-internal/src/http_config.test.ts | 4 ++-- .../core/http/core-http-server-internal/src/http_config.ts | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/core/http/core-http-server-internal/src/http_config.test.ts b/packages/core/http/core-http-server-internal/src/http_config.test.ts index bf9ea2fe53875..47c10ae661af1 100644 --- a/packages/core/http/core-http-server-internal/src/http_config.test.ts +++ b/packages/core/http/core-http-server-internal/src/http_config.test.ts @@ -517,9 +517,9 @@ describe('versioned', () => { ).toThrow(/failed validation/); }); - it('defaults version resolution "none" when in dev', () => { + it('defaults version resolution "oldest" when in dev', () => { expect(config.schema.validate({}, { dev: true })).toMatchObject({ - versioned: { versionResolution: 'none' }, + versioned: { versionResolution: 'oldest' }, }); }); }); diff --git a/packages/core/http/core-http-server-internal/src/http_config.ts b/packages/core/http/core-http-server-internal/src/http_config.ts index d4560febb6f26..faaba5275f95a 100644 --- a/packages/core/http/core-http-server-internal/src/http_config.ts +++ b/packages/core/http/core-http-server-internal/src/http_config.ts @@ -216,7 +216,7 @@ const configSchema = schema.object( * Which handler resolution algo to use for public routes: "newest" or "oldest". * * @note Internal routes always require a version to be specified. - * @note in development we have an additional option "none" which is also the default in dev. + * @note in development we have an additional option "none". * This prevents any fallbacks and requires that a version specified. * Useful for ensuring that a given client always specifies a version. */ @@ -224,7 +224,7 @@ const configSchema = schema.object( schema.contextRef('dev'), true, schema.oneOf([schema.literal('newest'), schema.literal('oldest'), schema.literal('none')], { - defaultValue: 'none', + defaultValue: 'oldest', }), schema.oneOf([schema.literal('newest'), schema.literal('oldest')], { defaultValue: 'oldest', From 046324b342e334393ca666c9cd0e0ed95381c6bf Mon Sep 17 00:00:00 2001 From: Rodney Norris Date: Tue, 17 Dec 2024 14:24:47 -0600 Subject: [PATCH 14/23] [8.x] [Search] Deprecate canDeployEntSearch config value (#204272) (#204585) # Backport This will backport the following commits from `main` to `8.x`: - [[Search] Deprecate canDeployEntSearch config value (#204272)](https://github.com/elastic/kibana/pull/204272) ### Questions ? Please refer to the [Backport tool documentation](https://github.com/sqren/backport) --- .../test_suites/core_plugins/rendering.ts | 1 - .../enterprise_search/common/types/index.ts | 1 - .../native_connector_configuration.tsx | 2 +- .../search_indices/search_indices.tsx | 4 +- .../header_actions/syncs_context_menu.tsx | 4 +- .../enterprise_search_content/index.test.tsx | 9 +- .../enterprise_search_content/index.tsx | 4 +- .../enterprise_search_product_card.test.tsx | 2 +- .../product_selector.test.tsx | 6 +- .../product_selector/product_selector.tsx | 2 +- .../test_helpers/test_utils.test_helper.tsx | 1 - .../enterprise_search/public/plugin.ts | 126 +++++++++--------- .../plugins/enterprise_search/server/index.ts | 3 +- .../server/lib/check_access.test.ts | 1 - .../enterprise_search/server/plugin.ts | 31 ++--- .../utils/search_result_provider.test.ts | 2 - 16 files changed, 87 insertions(+), 112 deletions(-) diff --git a/test/plugin_functional/test_suites/core_plugins/rendering.ts b/test/plugin_functional/test_suites/core_plugins/rendering.ts index 8047994039e71..89c70453a8465 100644 --- a/test/plugin_functional/test_suites/core_plugins/rendering.ts +++ b/test/plugin_functional/test_suites/core_plugins/rendering.ts @@ -128,7 +128,6 @@ export default function ({ getService }: PluginFunctionalProviderContext) { 'data_visualizer.resultLinks.fileBeat.enabled (boolean)', 'dev_tools.deeplinks.navLinkStatus (string?)', 'discover.experimental.enabledProfiles (array?)', - 'enterpriseSearch.canDeployEntSearch (boolean?)', 'enterpriseSearch.host (string?)', 'enterpriseSearch.ui.enabled (boolean?)', 'home.disableWelcomeScreen (boolean?)', diff --git a/x-pack/plugins/enterprise_search/common/types/index.ts b/x-pack/plugins/enterprise_search/common/types/index.ts index 1d9fb9b2cb0c1..364008ef18b49 100644 --- a/x-pack/plugins/enterprise_search/common/types/index.ts +++ b/x-pack/plugins/enterprise_search/common/types/index.ts @@ -62,7 +62,6 @@ export interface Meta { } export interface ClientConfigType { - canDeployEntSearch: boolean; host?: string; ui: { enabled: boolean; diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/connector_detail/native_connector_configuration.tsx b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/connector_detail/native_connector_configuration.tsx index 29a54c913301a..ddf46c9cabdcb 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/connector_detail/native_connector_configuration.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/connector_detail/native_connector_configuration.tsx @@ -114,7 +114,7 @@ export const NativeConnectorConfiguration: React.FC = () => { - {config.host && config.canDeployEntSearch && errorConnectingMessage && ( + {config.host && errorConnectingMessage && ( <> { {productFeatures.hasDefaultIngestPipeline && showDefaultSettingsFlyout && ( setShowDefaultSettingsFlyout(false)} /> )} - {config.host && config.canDeployEntSearch && errorConnectingMessage && ( + {config.host && errorConnectingMessage && ( <> )} - {!config.host && config.canDeployEntSearch && ( + {!config.host && ( <> = ({ disabled = f const shouldShowIncrementalSync = productFeatures.hasIncrementalSyncEnabled && hasIncrementalSyncFeature; - const isEnterpriseSearchNotAvailable = Boolean( - config.host && config.canDeployEntSearch && errorConnectingMessage - ); + const isEnterpriseSearchNotAvailable = Boolean(config.host && errorConnectingMessage); const isSyncsDisabled = (connector?.is_native && isEnterpriseSearchNotAvailable) || ingestionStatus === IngestionStatus.INCOMPLETE || diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/index.test.tsx b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/index.test.tsx index 9fcfe7c7fcfab..fc83af4c1e9c7 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/index.test.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/index.test.tsx @@ -39,20 +39,13 @@ describe('EnterpriseSearchContent', () => { it('renders EnterpriseSearchContentConfigured when config.host is set & available', () => { setMockValues({ - config: { canDeployEntSearch: true, host: 'some.url' }, + config: { host: 'some.url' }, errorConnectingMessage: '', }); const wrapper = shallow(); expect(wrapper.find(EnterpriseSearchContentConfigured)).toHaveLength(1); }); - - it('renders EnterpriseSearchContentConfigured when config.host is not set & Ent Search cannot be deployed', () => { - setMockValues({ config: { canDeployEntSearch: false, host: '' }, errorConnectingMessage: '' }); - const wrapper = shallow(); - - expect(wrapper.find(EnterpriseSearchContentConfigured)).toHaveLength(1); - }); }); describe('EnterpriseSearchContentConfigured', () => { diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/index.tsx b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/index.tsx index 2ec701aa9847b..16a9a763fd192 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/index.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/index.tsx @@ -40,7 +40,7 @@ export const EnterpriseSearchContent: React.FC = (props) => { const incompatibleVersions = isVersionMismatch(enterpriseSearchVersion, kibanaVersion); const showView = () => { - if (config.host && config.canDeployEntSearch && incompatibleVersions) { + if (config.host && incompatibleVersions) { return ( = (props) => { - {config.host && config.canDeployEntSearch && errorConnectingMessage ? ( + {config.host && errorConnectingMessage ? ( ) : ( diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_overview/components/product_selector/enterprise_search_product_card.test.tsx b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_overview/components/product_selector/enterprise_search_product_card.test.tsx index 74be43ab32253..b1c0394e80235 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_overview/components/product_selector/enterprise_search_product_card.test.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_overview/components/product_selector/enterprise_search_product_card.test.tsx @@ -17,7 +17,7 @@ import { WorkplaceSearchProductCard } from './workplace_search_product_card'; describe('EnterpriseSearchProductCard', () => { beforeEach(() => { - setMockValues({ config: { canDeployEntSearch: true, host: 'localhost' } }); + setMockValues({ config: { host: 'localhost' } }); }); it('renders both services with access', () => { diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_overview/components/product_selector/product_selector.test.tsx b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_overview/components/product_selector/product_selector.test.tsx index 70f8412eeb5b4..a84b419382a5e 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_overview/components/product_selector/product_selector.test.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_overview/components/product_selector/product_selector.test.tsx @@ -22,7 +22,7 @@ import { ProductSelector } from '.'; describe('ProductSelector', () => { it('renders the overview page, product cards, & setup guide CTAs with no host set', () => { - setMockValues({ config: { canDeployEntSearch: true, host: '' } }); + setMockValues({ config: { host: '' } }); const wrapper = shallow(); expect(wrapper.find(ElasticsearchProductCard)).toHaveLength(1); @@ -30,7 +30,7 @@ describe('ProductSelector', () => { }); it('renders the trial callout', () => { - setMockValues({ config: { canDeployEntSearch: true, host: 'localhost' } }); + setMockValues({ config: { host: 'localhost' } }); const wrapper = shallow(); expect(wrapper.find(TrialCallout)).toHaveLength(1); @@ -55,7 +55,7 @@ describe('ProductSelector', () => { describe('access checks when host is set', () => { beforeEach(() => { - setMockValues({ config: { canDeployEntSearch: true, host: 'localhost' } }); + setMockValues({ config: { host: 'localhost' } }); }); it('does not render the Setup CTA when there is a host', () => { diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_overview/components/product_selector/product_selector.tsx b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_overview/components/product_selector/product_selector.tsx index 71139a8b36402..9582903071c11 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_overview/components/product_selector/product_selector.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_overview/components/product_selector/product_selector.tsx @@ -121,7 +121,7 @@ export const ProductSelector: React.FC = () => { - {!config.host && config.canDeployEntSearch && ( + {!config.host && ( diff --git a/x-pack/plugins/enterprise_search/public/applications/test_helpers/test_utils.test_helper.tsx b/x-pack/plugins/enterprise_search/public/applications/test_helpers/test_utils.test_helper.tsx index e046bfa904e55..13694a3f7db64 100644 --- a/x-pack/plugins/enterprise_search/public/applications/test_helpers/test_utils.test_helper.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/test_helpers/test_utils.test_helper.tsx @@ -44,7 +44,6 @@ export const mockKibanaProps: KibanaLogicProps = { isCloudEnabled: false, }, config: { - canDeployEntSearch: true, host: 'http://localhost:3002', ui: { enabled: true, diff --git a/x-pack/plugins/enterprise_search/public/plugin.ts b/x-pack/plugins/enterprise_search/public/plugin.ts index dc0062708b942..0b8024a4f2325 100644 --- a/x-pack/plugins/enterprise_search/public/plugin.ts +++ b/x-pack/plugins/enterprise_search/public/plugin.ts @@ -441,55 +441,53 @@ export class EnterpriseSearchPlugin implements Plugin { registerLocators(share!); - if (config.canDeployEntSearch) { - core.application.register({ - appRoute: APP_SEARCH_PLUGIN.URL, - category: DEFAULT_APP_CATEGORIES.enterpriseSearch, - deepLinks: appSearchLinks, - euiIconType: ENTERPRISE_SEARCH_OVERVIEW_PLUGIN.LOGO, - id: APP_SEARCH_PLUGIN.ID, - mount: async (params: AppMountParameters) => { - const kibanaDeps = await this.getKibanaDeps(core, params, cloud); - const { chrome, http } = kibanaDeps.core; - chrome.docTitle.change(APP_SEARCH_PLUGIN.NAME); + core.application.register({ + appRoute: APP_SEARCH_PLUGIN.URL, + category: DEFAULT_APP_CATEGORIES.enterpriseSearch, + deepLinks: appSearchLinks, + euiIconType: ENTERPRISE_SEARCH_OVERVIEW_PLUGIN.LOGO, + id: APP_SEARCH_PLUGIN.ID, + mount: async (params: AppMountParameters) => { + const kibanaDeps = await this.getKibanaDeps(core, params, cloud); + const { chrome, http } = kibanaDeps.core; + chrome.docTitle.change(APP_SEARCH_PLUGIN.NAME); - await this.getInitialData(http); - const pluginData = this.getPluginData(); + await this.getInitialData(http); + const pluginData = this.getPluginData(); - const { renderApp } = await import('./applications'); - const { AppSearch } = await import('./applications/app_search'); + const { renderApp } = await import('./applications'); + const { AppSearch } = await import('./applications/app_search'); - return renderApp(AppSearch, kibanaDeps, pluginData); - }, - title: APP_SEARCH_PLUGIN.NAME, - visibleIn: [], - }); + return renderApp(AppSearch, kibanaDeps, pluginData); + }, + title: APP_SEARCH_PLUGIN.NAME, + visibleIn: [], + }); - core.application.register({ - appRoute: WORKPLACE_SEARCH_PLUGIN.URL, - category: DEFAULT_APP_CATEGORIES.enterpriseSearch, - euiIconType: ENTERPRISE_SEARCH_OVERVIEW_PLUGIN.LOGO, - id: WORKPLACE_SEARCH_PLUGIN.ID, - mount: async (params: AppMountParameters) => { - const kibanaDeps = await this.getKibanaDeps(core, params, cloud); - const { chrome, http } = kibanaDeps.core; - chrome.docTitle.change(WORKPLACE_SEARCH_PLUGIN.NAME); - - // The Workplace Search Personal dashboard needs the chrome hidden. We hide it globally - // here first to prevent a flash of chrome on the Personal dashboard and unhide it for admin routes. - if (this.config.host) chrome.setIsVisible(false); - await this.getInitialData(http); - const pluginData = this.getPluginData(); - - const { renderApp } = await import('./applications'); - const { WorkplaceSearch } = await import('./applications/workplace_search'); - - return renderApp(WorkplaceSearch, kibanaDeps, pluginData); - }, - title: WORKPLACE_SEARCH_PLUGIN.NAME, - visibleIn: [], - }); - } + core.application.register({ + appRoute: WORKPLACE_SEARCH_PLUGIN.URL, + category: DEFAULT_APP_CATEGORIES.enterpriseSearch, + euiIconType: ENTERPRISE_SEARCH_OVERVIEW_PLUGIN.LOGO, + id: WORKPLACE_SEARCH_PLUGIN.ID, + mount: async (params: AppMountParameters) => { + const kibanaDeps = await this.getKibanaDeps(core, params, cloud); + const { chrome, http } = kibanaDeps.core; + chrome.docTitle.change(WORKPLACE_SEARCH_PLUGIN.NAME); + + // The Workplace Search Personal dashboard needs the chrome hidden. We hide it globally + // here first to prevent a flash of chrome on the Personal dashboard and unhide it for admin routes. + if (this.config.host) chrome.setIsVisible(false); + await this.getInitialData(http); + const pluginData = this.getPluginData(); + + const { renderApp } = await import('./applications'); + const { WorkplaceSearch } = await import('./applications/workplace_search'); + + return renderApp(WorkplaceSearch, kibanaDeps, pluginData); + }, + title: WORKPLACE_SEARCH_PLUGIN.NAME, + visibleIn: [], + }); if (plugins.home) { plugins.home.featureCatalogue.registerSolution({ @@ -511,27 +509,25 @@ export class EnterpriseSearchPlugin implements Plugin { title: ANALYTICS_PLUGIN.NAME, }); - if (config.canDeployEntSearch) { - plugins.home.featureCatalogue.register({ - category: 'data', - description: APP_SEARCH_PLUGIN.DESCRIPTION, - icon: 'appSearchApp', - id: APP_SEARCH_PLUGIN.ID, - path: APP_SEARCH_PLUGIN.URL, - showOnHomePage: false, - title: APP_SEARCH_PLUGIN.NAME, - }); + plugins.home.featureCatalogue.register({ + category: 'data', + description: APP_SEARCH_PLUGIN.DESCRIPTION, + icon: 'appSearchApp', + id: APP_SEARCH_PLUGIN.ID, + path: APP_SEARCH_PLUGIN.URL, + showOnHomePage: false, + title: APP_SEARCH_PLUGIN.NAME, + }); - plugins.home.featureCatalogue.register({ - category: 'data', - description: WORKPLACE_SEARCH_PLUGIN.DESCRIPTION, - icon: 'workplaceSearchApp', - id: WORKPLACE_SEARCH_PLUGIN.ID, - path: WORKPLACE_SEARCH_PLUGIN.URL, - showOnHomePage: false, - title: WORKPLACE_SEARCH_PLUGIN.NAME, - }); - } + plugins.home.featureCatalogue.register({ + category: 'data', + description: WORKPLACE_SEARCH_PLUGIN.DESCRIPTION, + icon: 'workplaceSearchApp', + id: WORKPLACE_SEARCH_PLUGIN.ID, + path: WORKPLACE_SEARCH_PLUGIN.URL, + showOnHomePage: false, + title: WORKPLACE_SEARCH_PLUGIN.NAME, + }); plugins.home.featureCatalogue.register({ category: 'data', diff --git a/x-pack/plugins/enterprise_search/server/index.ts b/x-pack/plugins/enterprise_search/server/index.ts index 0aa46826daa5f..2533811cd0946 100644 --- a/x-pack/plugins/enterprise_search/server/index.ts +++ b/x-pack/plugins/enterprise_search/server/index.ts @@ -17,7 +17,6 @@ export const configSchema = schema.object({ accessCheckTimeout: schema.number({ defaultValue: 5000 }), accessCheckTimeoutWarning: schema.number({ defaultValue: 300 }), appsDisabled: schema.boolean({ defaultValue: false }), - canDeployEntSearch: schema.boolean({ defaultValue: true }), customHeaders: schema.maybe(schema.object({}, { unknowns: 'allow' })), enabled: schema.boolean({ defaultValue: true }), hasConnectors: schema.boolean({ defaultValue: true }), @@ -45,8 +44,8 @@ export const configSchema = schema.object({ export type ConfigType = TypeOf; export const config: PluginConfigDescriptor = { + deprecations: ({ unused }) => [unused('canDeployEntSearch', { level: 'warning' })], exposeToBrowser: { - canDeployEntSearch: true, host: true, ui: true, }, diff --git a/x-pack/plugins/enterprise_search/server/lib/check_access.test.ts b/x-pack/plugins/enterprise_search/server/lib/check_access.test.ts index b512bcaf45d49..d199197c908c3 100644 --- a/x-pack/plugins/enterprise_search/server/lib/check_access.test.ts +++ b/x-pack/plugins/enterprise_search/server/lib/check_access.test.ts @@ -51,7 +51,6 @@ describe('checkAccess', () => { request: { auth: { isAuthenticated: true } }, config: { appsDisabled: false, - canDeployEntSearch: true, host: 'http://localhost:3002', }, globalConfigService: new GlobalConfigService(), diff --git a/x-pack/plugins/enterprise_search/server/plugin.ts b/x-pack/plugins/enterprise_search/server/plugin.ts index 6e1016ba8766f..65e3537179f05 100644 --- a/x-pack/plugins/enterprise_search/server/plugin.ts +++ b/x-pack/plugins/enterprise_search/server/plugin.ts @@ -179,7 +179,8 @@ export class EnterpriseSearchPlugin implements Plugin { ENTERPRISE_SEARCH_OVERVIEW_PLUGIN.ID, ENTERPRISE_SEARCH_CONTENT_PLUGIN.ID, ELASTICSEARCH_PLUGIN.ID, - ...(config.canDeployEntSearch ? [APP_SEARCH_PLUGIN.ID, WORKPLACE_SEARCH_PLUGIN.ID] : []), + APP_SEARCH_PLUGIN.ID, + WORKPLACE_SEARCH_PLUGIN.ID, SEARCH_EXPERIENCES_PLUGIN.ID, VECTOR_SEARCH_PLUGIN.ID, SEMANTIC_SEARCH_PLUGIN.ID, @@ -319,12 +320,12 @@ export class EnterpriseSearchPlugin implements Plugin { return { navLinks: { - appSearch: hasAppSearchAccess && config.canDeployEntSearch, - workplaceSearch: hasWorkplaceSearchAccess && config.canDeployEntSearch, + appSearch: hasAppSearchAccess, + workplaceSearch: hasWorkplaceSearchAccess, }, catalogue: { - appSearch: hasAppSearchAccess && config.canDeployEntSearch, - workplaceSearch: hasWorkplaceSearchAccess && config.canDeployEntSearch, + appSearch: hasAppSearchAccess, + workplaceSearch: hasWorkplaceSearchAccess, }, }; }, @@ -349,9 +350,9 @@ export class EnterpriseSearchPlugin implements Plugin { }; registerConfigDataRoute(dependencies); - if (config.canDeployEntSearch) registerAppSearchRoutes(dependencies); + registerAppSearchRoutes(dependencies); registerEnterpriseSearchRoutes(dependencies); - if (config.canDeployEntSearch) registerWorkplaceSearchRoutes(dependencies); + registerWorkplaceSearchRoutes(dependencies); // Enterprise Search Routes if (config.hasConnectors) registerConnectorRoutes(dependencies); if (config.hasWebCrawler) registerCrawlerRoutes(dependencies); @@ -368,10 +369,8 @@ export class EnterpriseSearchPlugin implements Plugin { * Bootstrap the routes, saved objects, and collector for telemetry */ savedObjects.registerType(enterpriseSearchTelemetryType); - if (config.canDeployEntSearch) { - savedObjects.registerType(appSearchTelemetryType); - savedObjects.registerType(workplaceSearchTelemetryType); - } + savedObjects.registerType(appSearchTelemetryType); + savedObjects.registerType(workplaceSearchTelemetryType); let savedObjectsStarted: SavedObjectsServiceStart; void getStartServices().then(([coreStart]) => { @@ -380,10 +379,8 @@ export class EnterpriseSearchPlugin implements Plugin { if (usageCollection) { registerESTelemetryUsageCollector(usageCollection, savedObjectsStarted, this.logger); registerCNTelemetryUsageCollector(usageCollection, this.logger); - if (config.canDeployEntSearch) { - registerASTelemetryUsageCollector(usageCollection, savedObjectsStarted, this.logger); - registerWSTelemetryUsageCollector(usageCollection, savedObjectsStarted, this.logger); - } + registerASTelemetryUsageCollector(usageCollection, savedObjectsStarted, this.logger); + registerWSTelemetryUsageCollector(usageCollection, savedObjectsStarted, this.logger); } }); registerTelemetryRoute({ ...dependencies, getSavedObjectsService: () => savedObjectsStarted }); @@ -419,9 +416,7 @@ export class EnterpriseSearchPlugin implements Plugin { /** * Register a config for the search guide */ - if (config.canDeployEntSearch) { - guidedOnboarding?.registerGuideConfig(appSearchGuideId, appSearchGuideConfig); - } + guidedOnboarding?.registerGuideConfig(appSearchGuideId, appSearchGuideConfig); if (config.hasWebCrawler) { guidedOnboarding?.registerGuideConfig(websiteSearchGuideId, websiteSearchGuideConfig); } diff --git a/x-pack/plugins/enterprise_search/server/utils/search_result_provider.test.ts b/x-pack/plugins/enterprise_search/server/utils/search_result_provider.test.ts index 3e7a0777dad23..b3709df9ef5bd 100644 --- a/x-pack/plugins/enterprise_search/server/utils/search_result_provider.test.ts +++ b/x-pack/plugins/enterprise_search/server/utils/search_result_provider.test.ts @@ -292,7 +292,6 @@ describe('Search search provider', () => { it('does not return results for legacy app search', () => { const searchProvider = getSearchResultProvider( { - canDeployEntSearch: true, hasConnectors: false, hasWebCrawler: false, } as any, @@ -315,7 +314,6 @@ describe('Search search provider', () => { it('does not return results for legacy workplace search', () => { const searchProvider = getSearchResultProvider( { - canDeployEntSearch: true, hasConnectors: false, hasWebCrawler: false, } as any, From abde29912111b33fe0d9f66b4c720523b7f5c9db Mon Sep 17 00:00:00 2001 From: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> Date: Wed, 18 Dec 2024 08:24:27 +1100 Subject: [PATCH 15/23] [8.x] [inference] Add cancelation support for chatComplete and output (#203108) (#204588) # Backport This will backport the following commits from `main` to `8.x`: - [[inference] Add cancelation support for chatComplete and output (#203108)](https://github.com/elastic/kibana/pull/203108) ### Questions ? Please refer to the [Backport tool documentation](https://github.com/sqren/backport) Co-authored-by: Pierre Gayvallet --- .github/CODEOWNERS | 2 +- .../shared/ai-infra/inference-common/index.ts | 3 + .../inference-common/src/chat_complete/api.ts | 4 + .../ai-infra/inference-common/src/errors.ts | 44 ++++ .../inference-common/src/output/api.ts | 5 +- .../plugins/shared/inference/README.md | 69 +++++ .../common/output/create_output_api.test.ts | 22 ++ .../common/output/create_output_api.ts | 3 + .../bedrock/bedrock_claude_adapter.test.ts | 19 ++ .../bedrock/bedrock_claude_adapter.ts | 3 +- .../adapters/gemini/gemini_adapter.test.ts | 19 ++ .../adapters/gemini/gemini_adapter.ts | 3 +- .../adapters/openai/openai_adapter.test.ts | 20 ++ .../adapters/openai/openai_adapter.ts | 12 +- .../server/chat_complete/api.test.mocks.ts | 26 ++ .../server/chat_complete/api.test.ts | 237 ++++++++++++++++++ .../inference/server/chat_complete/api.ts | 35 +-- .../inference/server/chat_complete/types.ts | 1 + .../utils/handle_cancellation.test.ts | 53 ++++ .../utils/handle_cancellation.ts | 39 +++ .../server/chat_complete/utils/index.ts | 3 +- .../chat_complete/utils/inference_executor.ts | 23 +- .../inference/server/routes/chat_complete.ts | 4 + .../inference/server/test_utils/index.ts | 11 + .../server/test_utils/inference_connector.ts | 19 ++ .../test_utils/inference_connector_adapter.ts | 14 ++ .../server/test_utils/inference_executor.ts | 19 ++ 27 files changed, 688 insertions(+), 24 deletions(-) create mode 100644 x-pack/platform/plugins/shared/inference/server/chat_complete/api.test.mocks.ts create mode 100644 x-pack/platform/plugins/shared/inference/server/chat_complete/api.test.ts create mode 100644 x-pack/platform/plugins/shared/inference/server/chat_complete/utils/handle_cancellation.test.ts create mode 100644 x-pack/platform/plugins/shared/inference/server/chat_complete/utils/handle_cancellation.ts create mode 100644 x-pack/platform/plugins/shared/inference/server/test_utils/index.ts create mode 100644 x-pack/platform/plugins/shared/inference/server/test_utils/inference_connector.ts create mode 100644 x-pack/platform/plugins/shared/inference/server/test_utils/inference_connector_adapter.ts create mode 100644 x-pack/platform/plugins/shared/inference/server/test_utils/inference_executor.ts diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index fca1fc525d4a1..385a35c4084d6 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -1424,7 +1424,7 @@ x-pack/test/**/deployment_agnostic/ @elastic/appex-qa #temporarily to monitor te #CC# /x-pack/plugins/global_search_providers/ @elastic/kibana-core # AppEx AI Infra -/x-pack/plugins/inference @elastic/appex-ai-infra @elastic/obs-ai-assistant @elastic/security-generative-ai +/x-pack/platform/plugins/shared/inference @elastic/appex-ai-infra @elastic/obs-ai-assistant @elastic/security-generative-ai /x-pack/test/functional_gen_ai/inference @elastic/appex-ai-infra # AppEx Platform Services Security diff --git a/x-pack/platform/packages/shared/ai-infra/inference-common/index.ts b/x-pack/platform/packages/shared/ai-infra/inference-common/index.ts index 603192fb96db4..134b0f02811fe 100644 --- a/x-pack/platform/packages/shared/ai-infra/inference-common/index.ts +++ b/x-pack/platform/packages/shared/ai-infra/inference-common/index.ts @@ -84,11 +84,14 @@ export { type InferenceTaskErrorEvent, type InferenceTaskInternalError, type InferenceTaskRequestError, + type InferenceTaskAbortedError, createInferenceInternalError, createInferenceRequestError, + createInferenceRequestAbortedError, isInferenceError, isInferenceInternalError, isInferenceRequestError, + isInferenceRequestAbortedError, } from './src/errors'; export { truncateList } from './src/truncate_list'; diff --git a/x-pack/platform/packages/shared/ai-infra/inference-common/src/chat_complete/api.ts b/x-pack/platform/packages/shared/ai-infra/inference-common/src/chat_complete/api.ts index cb91f4e53e8ae..4e29d5f7dad06 100644 --- a/x-pack/platform/packages/shared/ai-infra/inference-common/src/chat_complete/api.ts +++ b/x-pack/platform/packages/shared/ai-infra/inference-common/src/chat_complete/api.ts @@ -93,6 +93,10 @@ export type ChatCompleteOptions< * Function calling mode, defaults to "native". */ functionCalling?: FunctionCallingMode; + /** + * Optional signal that can be used to forcefully abort the request. + */ + abortSignal?: AbortSignal; } & TToolOptions; /** diff --git a/x-pack/platform/packages/shared/ai-infra/inference-common/src/errors.ts b/x-pack/platform/packages/shared/ai-infra/inference-common/src/errors.ts index 5a99adc4321d9..472ed50e231f5 100644 --- a/x-pack/platform/packages/shared/ai-infra/inference-common/src/errors.ts +++ b/x-pack/platform/packages/shared/ai-infra/inference-common/src/errors.ts @@ -13,6 +13,7 @@ import { InferenceTaskEventBase, InferenceTaskEventType } from './inference_task export enum InferenceTaskErrorCode { internalError = 'internalError', requestError = 'requestError', + abortedError = 'requestAborted', } /** @@ -46,16 +47,37 @@ export type InferenceTaskErrorEvent = InferenceTaskEventBase >; +/** + * Inference error thrown when the request was considered invalid. + * + * Some example of reasons for invalid requests would be: + * - no connector matching the provided connectorId + * - invalid connector type for the provided connectorId + */ export type InferenceTaskRequestError = InferenceTaskError< InferenceTaskErrorCode.requestError, { status: number } >; +/** + * Inference error thrown when the request was aborted. + * + * Request abortion occurs when providing an abort signal and firing it + * before the call to the LLM completes. + */ +export type InferenceTaskAbortedError = InferenceTaskError< + InferenceTaskErrorCode.abortedError, + { status: number } +>; + export function createInferenceInternalError( message = 'An internal error occurred', meta?: Record @@ -72,16 +94,38 @@ export function createInferenceRequestError( }); } +export function createInferenceRequestAbortedError(): InferenceTaskAbortedError { + return new InferenceTaskError(InferenceTaskErrorCode.abortedError, 'Request was aborted', { + status: 499, + }); +} + +/** + * Check if the given error is an {@link InferenceTaskError} + */ export function isInferenceError( error: unknown ): error is InferenceTaskError | undefined> { return error instanceof InferenceTaskError; } +/** + * Check if the given error is an {@link InferenceTaskInternalError} + */ export function isInferenceInternalError(error: unknown): error is InferenceTaskInternalError { return isInferenceError(error) && error.code === InferenceTaskErrorCode.internalError; } +/** + * Check if the given error is an {@link InferenceTaskRequestError} + */ export function isInferenceRequestError(error: unknown): error is InferenceTaskRequestError { return isInferenceError(error) && error.code === InferenceTaskErrorCode.requestError; } + +/** + * Check if the given error is an {@link InferenceTaskAbortedError} + */ +export function isInferenceRequestAbortedError(error: unknown): error is InferenceTaskAbortedError { + return isInferenceError(error) && error.code === InferenceTaskErrorCode.abortedError; +} diff --git a/x-pack/platform/packages/shared/ai-infra/inference-common/src/output/api.ts b/x-pack/platform/packages/shared/ai-infra/inference-common/src/output/api.ts index cd90394cd67d3..3ae4a6a07ee29 100644 --- a/x-pack/platform/packages/shared/ai-infra/inference-common/src/output/api.ts +++ b/x-pack/platform/packages/shared/ai-infra/inference-common/src/output/api.ts @@ -96,7 +96,10 @@ export interface OutputOptions< * Defaults to false. */ stream?: TStream; - + /** + * Optional signal that can be used to forcefully abort the request. + */ + abortSignal?: AbortSignal; /** * Optional configuration for retrying the call if an error occurs. */ diff --git a/x-pack/platform/plugins/shared/inference/README.md b/x-pack/platform/plugins/shared/inference/README.md index bba5b4cdcfc27..a52e589a9deab 100644 --- a/x-pack/platform/plugins/shared/inference/README.md +++ b/x-pack/platform/plugins/shared/inference/README.md @@ -221,6 +221,75 @@ const toolCall = toolCalls[0]; // process the tool call and eventually continue the conversation with the LLM ``` +#### Request cancellation + +Request cancellation can be done by passing an abort signal when calling the API. Firing the signal +before the request completes will cause the abortion, and the API call will throw an error. + +```ts +const abortController = new AbortController(); + +const chatResponse = await inferenceClient.chatComplete({ + connectorId: 'some-gen-ai-connector', + abortSignal: abortController.signal, + messages: [{ role: MessageRole.User, content: 'Do something' }], +}); + +// from elsewhere / before the request completes and the promise resolves: + +abortController.abort(); +``` + +The `isInferenceRequestAbortedError` helper function, exposed from `@kbn/inference-common`, can be used easily identify those errors: + +```ts +import { isInferenceRequestAbortedError } from '@kbn/inference-common'; + +try { + const abortController = new AbortController(); + const chatResponse = await inferenceClient.chatComplete({ + connectorId: 'some-gen-ai-connector', + abortSignal: abortController.signal, + messages: [{ role: MessageRole.User, content: 'Do something' }], + }); +} catch(e) { + if(isInferenceRequestAbortedError(e)) { + // request was aborted, do something + } else { + // was another error, do something else + } +} +``` + +The approach is very similar for stream mode: + +```ts +import { isInferenceRequestAbortedError } from '@kbn/inference-common'; + +const abortController = new AbortController(); +const events$ = inferenceClient.chatComplete({ + stream: true, + connectorId: 'some-gen-ai-connector', + abortSignal: abortController.signal, + messages: [{ role: MessageRole.User, content: 'Do something' }], +}); + +events$.subscribe({ + next: (event) => { + // do something + }, + error: (err) => { + if(isInferenceRequestAbortedError(e)) { + // request was aborted, do something + } else { + // was another error, do something else + } + } +}); + +abortController.abort(); +``` + ### `output` API `output` is a wrapper around the `chatComplete` API that is catered towards a specific use case: having the LLM output a structured response, based on a schema. diff --git a/x-pack/platform/plugins/shared/inference/common/output/create_output_api.test.ts b/x-pack/platform/plugins/shared/inference/common/output/create_output_api.test.ts index c65720aae2e48..d29f88009f8e5 100644 --- a/x-pack/platform/plugins/shared/inference/common/output/create_output_api.test.ts +++ b/x-pack/platform/plugins/shared/inference/common/output/create_output_api.test.ts @@ -196,4 +196,26 @@ describe('createOutputApi', () => { ).toThrowError('Retry options are not supported in streaming mode'); }); }); + + it('propagates the abort signal when provided', async () => { + chatComplete.mockResolvedValue(Promise.resolve({ content: 'content', toolCalls: [] })); + + const output = createOutputApi(chatComplete); + + const abortController = new AbortController(); + + await output({ + id: 'id', + connectorId: '.my-connector', + input: 'input message', + abortSignal: abortController.signal, + }); + + expect(chatComplete).toHaveBeenCalledTimes(1); + expect(chatComplete).toHaveBeenCalledWith( + expect.objectContaining({ + abortSignal: abortController.signal, + }) + ); + }); }); diff --git a/x-pack/platform/plugins/shared/inference/common/output/create_output_api.ts b/x-pack/platform/plugins/shared/inference/common/output/create_output_api.ts index 3e65cb283dd45..7cd7e9cad144e 100644 --- a/x-pack/platform/plugins/shared/inference/common/output/create_output_api.ts +++ b/x-pack/platform/plugins/shared/inference/common/output/create_output_api.ts @@ -34,6 +34,7 @@ export function createOutputApi(chatCompleteApi: ChatCompleteAPI) { previousMessages, functionCalling, stream, + abortSignal, retry, }: DefaultOutputOptions): OutputCompositeResponse { if (stream && retry !== undefined) { @@ -52,6 +53,7 @@ export function createOutputApi(chatCompleteApi: ChatCompleteAPI) { connectorId, stream, functionCalling, + abortSignal, system, messages, ...(schema @@ -113,6 +115,7 @@ export function createOutputApi(chatCompleteApi: ChatCompleteAPI) { input, schema, system, + abortSignal, previousMessages: messages.concat( { role: MessageRole.Assistant as const, diff --git a/x-pack/platform/plugins/shared/inference/server/chat_complete/adapters/bedrock/bedrock_claude_adapter.test.ts b/x-pack/platform/plugins/shared/inference/server/chat_complete/adapters/bedrock/bedrock_claude_adapter.test.ts index 565727b7f57fe..c6114c3b09e95 100644 --- a/x-pack/platform/plugins/shared/inference/server/chat_complete/adapters/bedrock/bedrock_claude_adapter.test.ts +++ b/x-pack/platform/plugins/shared/inference/server/chat_complete/adapters/bedrock/bedrock_claude_adapter.test.ts @@ -325,5 +325,24 @@ describe('bedrockClaudeAdapter', () => { expect(tools).toEqual([]); expect(system).toEqual(addNoToolUsageDirective('some system instruction')); }); + + it('propagates the abort signal when provided', () => { + const abortController = new AbortController(); + + bedrockClaudeAdapter.chatComplete({ + logger, + executor: executorMock, + messages: [{ role: MessageRole.User, content: 'question' }], + abortSignal: abortController.signal, + }); + + expect(executorMock.invoke).toHaveBeenCalledTimes(1); + expect(executorMock.invoke).toHaveBeenCalledWith({ + subAction: 'invokeStream', + subActionParams: expect.objectContaining({ + signal: abortController.signal, + }), + }); + }); }); }); diff --git a/x-pack/platform/plugins/shared/inference/server/chat_complete/adapters/bedrock/bedrock_claude_adapter.ts b/x-pack/platform/plugins/shared/inference/server/chat_complete/adapters/bedrock/bedrock_claude_adapter.ts index e73d9c9344c98..e34605a4c96ad 100644 --- a/x-pack/platform/plugins/shared/inference/server/chat_complete/adapters/bedrock/bedrock_claude_adapter.ts +++ b/x-pack/platform/plugins/shared/inference/server/chat_complete/adapters/bedrock/bedrock_claude_adapter.ts @@ -26,7 +26,7 @@ import { processCompletionChunks } from './process_completion_chunks'; import { addNoToolUsageDirective } from './prompts'; export const bedrockClaudeAdapter: InferenceConnectorAdapter = { - chatComplete: ({ executor, system, messages, toolChoice, tools }) => { + chatComplete: ({ executor, system, messages, toolChoice, tools, abortSignal }) => { const noToolUsage = toolChoice === ToolChoiceType.none; const subActionParams = { @@ -36,6 +36,7 @@ export const bedrockClaudeAdapter: InferenceConnectorAdapter = { toolChoice: toolChoiceToBedrock(toolChoice), temperature: 0, stopSequences: ['\n\nHuman:'], + signal: abortSignal, }; return from( diff --git a/x-pack/platform/plugins/shared/inference/server/chat_complete/adapters/gemini/gemini_adapter.test.ts b/x-pack/platform/plugins/shared/inference/server/chat_complete/adapters/gemini/gemini_adapter.test.ts index 95a46f73d5d1f..5024bd1f4c87e 100644 --- a/x-pack/platform/plugins/shared/inference/server/chat_complete/adapters/gemini/gemini_adapter.test.ts +++ b/x-pack/platform/plugins/shared/inference/server/chat_complete/adapters/gemini/gemini_adapter.test.ts @@ -402,5 +402,24 @@ describe('geminiAdapter', () => { expect(tapFn).toHaveBeenCalledWith({ chunk: 1 }); expect(tapFn).toHaveBeenCalledWith({ chunk: 2 }); }); + + it('propagates the abort signal when provided', () => { + const abortController = new AbortController(); + + geminiAdapter.chatComplete({ + logger, + executor: executorMock, + messages: [{ role: MessageRole.User, content: 'question' }], + abortSignal: abortController.signal, + }); + + expect(executorMock.invoke).toHaveBeenCalledTimes(1); + expect(executorMock.invoke).toHaveBeenCalledWith({ + subAction: 'invokeStream', + subActionParams: expect.objectContaining({ + signal: abortController.signal, + }), + }); + }); }); }); diff --git a/x-pack/platform/plugins/shared/inference/server/chat_complete/adapters/gemini/gemini_adapter.ts b/x-pack/platform/plugins/shared/inference/server/chat_complete/adapters/gemini/gemini_adapter.ts index 80d0439449066..aa62f7006eac7 100644 --- a/x-pack/platform/plugins/shared/inference/server/chat_complete/adapters/gemini/gemini_adapter.ts +++ b/x-pack/platform/plugins/shared/inference/server/chat_complete/adapters/gemini/gemini_adapter.ts @@ -22,7 +22,7 @@ import { processVertexStream } from './process_vertex_stream'; import type { GenerateContentResponseChunk, GeminiMessage, GeminiToolConfig } from './types'; export const geminiAdapter: InferenceConnectorAdapter = { - chatComplete: ({ executor, system, messages, toolChoice, tools }) => { + chatComplete: ({ executor, system, messages, toolChoice, tools, abortSignal }) => { return from( executor.invoke({ subAction: 'invokeStream', @@ -32,6 +32,7 @@ export const geminiAdapter: InferenceConnectorAdapter = { tools: toolsToGemini(tools), toolConfig: toolChoiceToConfig(toolChoice), temperature: 0, + signal: abortSignal, stopSequences: ['\n\nHuman:'], }, }) diff --git a/x-pack/platform/plugins/shared/inference/server/chat_complete/adapters/openai/openai_adapter.test.ts b/x-pack/platform/plugins/shared/inference/server/chat_complete/adapters/openai/openai_adapter.test.ts index 48544f1bb0fb1..9b7fbc388024f 100644 --- a/x-pack/platform/plugins/shared/inference/server/chat_complete/adapters/openai/openai_adapter.test.ts +++ b/x-pack/platform/plugins/shared/inference/server/chat_complete/adapters/openai/openai_adapter.test.ts @@ -77,6 +77,7 @@ describe('openAIAdapter', () => { }; }); }); + it('correctly formats messages ', () => { openAIAdapter.chatComplete({ ...defaultArgs, @@ -254,6 +255,25 @@ describe('openAIAdapter', () => { expect(getRequest().stream).toBe(true); expect(getRequest().body.stream).toBe(true); }); + + it('propagates the abort signal when provided', () => { + const abortController = new AbortController(); + + openAIAdapter.chatComplete({ + logger, + executor: executorMock, + messages: [{ role: MessageRole.User, content: 'question' }], + abortSignal: abortController.signal, + }); + + expect(executorMock.invoke).toHaveBeenCalledTimes(1); + expect(executorMock.invoke).toHaveBeenCalledWith({ + subAction: 'stream', + subActionParams: expect.objectContaining({ + signal: abortController.signal, + }), + }); + }); }); describe('when handling the response', () => { diff --git a/x-pack/platform/plugins/shared/inference/server/chat_complete/adapters/openai/openai_adapter.ts b/x-pack/platform/plugins/shared/inference/server/chat_complete/adapters/openai/openai_adapter.ts index 49b6bb5142023..0529820b1bfbf 100644 --- a/x-pack/platform/plugins/shared/inference/server/chat_complete/adapters/openai/openai_adapter.ts +++ b/x-pack/platform/plugins/shared/inference/server/chat_complete/adapters/openai/openai_adapter.ts @@ -43,7 +43,16 @@ import { } from '../../simulated_function_calling'; export const openAIAdapter: InferenceConnectorAdapter = { - chatComplete: ({ executor, system, messages, toolChoice, tools, functionCalling, logger }) => { + chatComplete: ({ + executor, + system, + messages, + toolChoice, + tools, + functionCalling, + logger, + abortSignal, + }) => { const stream = true; const simulatedFunctionCalling = functionCalling === 'simulated'; @@ -73,6 +82,7 @@ export const openAIAdapter: InferenceConnectorAdapter = { subAction: 'stream', subActionParams: { body: JSON.stringify(request), + signal: abortSignal, stream, }, }) diff --git a/x-pack/platform/plugins/shared/inference/server/chat_complete/api.test.mocks.ts b/x-pack/platform/plugins/shared/inference/server/chat_complete/api.test.mocks.ts new file mode 100644 index 0000000000000..e3248b79af406 --- /dev/null +++ b/x-pack/platform/plugins/shared/inference/server/chat_complete/api.test.mocks.ts @@ -0,0 +1,26 @@ +/* + * 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. + */ + +export const getInferenceAdapterMock = jest.fn(); + +jest.doMock('./adapters', () => { + const actual = jest.requireActual('./adapters'); + return { + ...actual, + getInferenceAdapter: getInferenceAdapterMock, + }; +}); + +export const getInferenceExecutorMock = jest.fn(); + +jest.doMock('./utils', () => { + const actual = jest.requireActual('./utils'); + return { + ...actual, + getInferenceExecutor: getInferenceExecutorMock, + }; +}); diff --git a/x-pack/platform/plugins/shared/inference/server/chat_complete/api.test.ts b/x-pack/platform/plugins/shared/inference/server/chat_complete/api.test.ts new file mode 100644 index 0000000000000..7d557ec512fcc --- /dev/null +++ b/x-pack/platform/plugins/shared/inference/server/chat_complete/api.test.ts @@ -0,0 +1,237 @@ +/* + * 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 { getInferenceExecutorMock, getInferenceAdapterMock } from './api.test.mocks'; + +import { of, Subject, isObservable, toArray, firstValueFrom } from 'rxjs'; +import { loggerMock, type MockedLogger } from '@kbn/logging-mocks'; +import { httpServerMock } from '@kbn/core/server/mocks'; +import { actionsMock } from '@kbn/actions-plugin/server/mocks'; +import { + type ChatCompleteAPI, + type ChatCompletionChunkEvent, + MessageRole, +} from '@kbn/inference-common'; +import { + createInferenceConnectorAdapterMock, + createInferenceConnectorMock, + createInferenceExecutorMock, + chunkEvent, +} from '../test_utils'; +import { createChatCompleteApi } from './api'; + +describe('createChatCompleteApi', () => { + let request: ReturnType; + let logger: MockedLogger; + let actions: ReturnType; + let inferenceAdapter: ReturnType; + let inferenceConnector: ReturnType; + let inferenceExecutor: ReturnType; + + let chatComplete: ChatCompleteAPI; + + beforeEach(() => { + request = httpServerMock.createKibanaRequest(); + logger = loggerMock.create(); + actions = actionsMock.createStart(); + + chatComplete = createChatCompleteApi({ request, actions, logger }); + + inferenceAdapter = createInferenceConnectorAdapterMock(); + inferenceAdapter.chatComplete.mockReturnValue(of(chunkEvent('chunk-1'))); + getInferenceAdapterMock.mockReturnValue(inferenceAdapter); + + inferenceConnector = createInferenceConnectorMock(); + + inferenceExecutor = createInferenceExecutorMock({ connector: inferenceConnector }); + getInferenceExecutorMock.mockResolvedValue(inferenceExecutor); + }); + + afterEach(() => { + getInferenceExecutorMock.mockReset(); + getInferenceAdapterMock.mockReset(); + }); + + it('calls `getInferenceExecutor` with the right parameters', async () => { + await chatComplete({ + connectorId: 'connectorId', + messages: [{ role: MessageRole.User, content: 'question' }], + }); + + expect(getInferenceExecutorMock).toHaveBeenCalledTimes(1); + expect(getInferenceExecutorMock).toHaveBeenCalledWith({ + connectorId: 'connectorId', + request, + actions, + }); + }); + + it('calls `getInferenceAdapter` with the right parameters', async () => { + await chatComplete({ + connectorId: 'connectorId', + messages: [{ role: MessageRole.User, content: 'question' }], + }); + + expect(getInferenceAdapterMock).toHaveBeenCalledTimes(1); + expect(getInferenceAdapterMock).toHaveBeenCalledWith(inferenceConnector.type); + }); + + it('calls `inferenceAdapter.chatComplete` with the right parameters', async () => { + await chatComplete({ + connectorId: 'connectorId', + messages: [{ role: MessageRole.User, content: 'question' }], + }); + + expect(inferenceAdapter.chatComplete).toHaveBeenCalledTimes(1); + expect(inferenceAdapter.chatComplete).toHaveBeenCalledWith({ + messages: [{ role: MessageRole.User, content: 'question' }], + executor: inferenceExecutor, + logger, + }); + }); + + it('throws if the connector is not compatible', async () => { + getInferenceAdapterMock.mockReturnValue(undefined); + + await expect( + chatComplete({ + connectorId: 'connectorId', + messages: [{ role: MessageRole.User, content: 'question' }], + }) + ).rejects.toThrowErrorMatchingInlineSnapshot(`"Adapter for type .gen-ai not implemented"`); + }); + + describe('response mode', () => { + it('returns a promise resolving with the response', async () => { + inferenceAdapter.chatComplete.mockReturnValue( + of(chunkEvent('chunk-1'), chunkEvent('chunk-2')) + ); + + const response = await chatComplete({ + connectorId: 'connectorId', + messages: [{ role: MessageRole.User, content: 'question' }], + }); + + expect(response).toEqual({ + content: 'chunk-1chunk-2', + toolCalls: [], + }); + }); + + describe('request cancellation', () => { + it('passes the abortSignal down to `inferenceAdapter.chatComplete`', async () => { + const abortController = new AbortController(); + + await chatComplete({ + connectorId: 'connectorId', + messages: [{ role: MessageRole.User, content: 'question' }], + abortSignal: abortController.signal, + }); + + expect(inferenceAdapter.chatComplete).toHaveBeenCalledTimes(1); + expect(inferenceAdapter.chatComplete).toHaveBeenCalledWith({ + messages: [{ role: MessageRole.User, content: 'question' }], + executor: inferenceExecutor, + abortSignal: abortController.signal, + logger, + }); + }); + + it('throws an error when the signal is triggered', async () => { + const abortController = new AbortController(); + + const subject = new Subject(); + inferenceAdapter.chatComplete.mockReturnValue(subject.asObservable()); + + subject.next(chunkEvent('chunk-1')); + + let caughtError: any; + + const promise = chatComplete({ + connectorId: 'connectorId', + messages: [{ role: MessageRole.User, content: 'question' }], + abortSignal: abortController.signal, + }).catch((err) => { + caughtError = err; + }); + + abortController.abort(); + + await promise; + + expect(caughtError).toBeInstanceOf(Error); + expect(caughtError.message).toContain('Request was aborted'); + }); + }); + }); + + describe('stream mode', () => { + it('returns an observable of events', async () => { + inferenceAdapter.chatComplete.mockReturnValue( + of(chunkEvent('chunk-1'), chunkEvent('chunk-2')) + ); + + const events$ = chatComplete({ + stream: true, + connectorId: 'connectorId', + messages: [{ role: MessageRole.User, content: 'question' }], + }); + + expect(isObservable(events$)).toBe(true); + + const events = await firstValueFrom(events$.pipe(toArray())); + expect(events).toEqual([ + { + content: 'chunk-1', + tool_calls: [], + type: 'chatCompletionChunk', + }, + { + content: 'chunk-2', + tool_calls: [], + type: 'chatCompletionChunk', + }, + { + content: 'chunk-1chunk-2', + toolCalls: [], + type: 'chatCompletionMessage', + }, + ]); + }); + + describe('request cancellation', () => { + it('throws an error when the signal is triggered', async () => { + const abortController = new AbortController(); + + const subject = new Subject(); + inferenceAdapter.chatComplete.mockReturnValue(subject.asObservable()); + + subject.next(chunkEvent('chunk-1')); + + let caughtError: any; + + const events$ = chatComplete({ + stream: true, + connectorId: 'connectorId', + messages: [{ role: MessageRole.User, content: 'question' }], + abortSignal: abortController.signal, + }); + + events$.subscribe({ + error: (err: any) => { + caughtError = err; + }, + }); + + abortController.abort(); + + expect(caughtError).toBeInstanceOf(Error); + expect(caughtError.message).toContain('Request was aborted'); + }); + }); + }); +}); diff --git a/x-pack/platform/plugins/shared/inference/server/chat_complete/api.ts b/x-pack/platform/plugins/shared/inference/server/chat_complete/api.ts index e58c94759e165..0e58c255bd608 100644 --- a/x-pack/platform/plugins/shared/inference/server/chat_complete/api.ts +++ b/x-pack/platform/plugins/shared/inference/server/chat_complete/api.ts @@ -6,7 +6,7 @@ */ import { last, omit } from 'lodash'; -import { defer, switchMap, throwError } from 'rxjs'; +import { defer, switchMap, throwError, identity } from 'rxjs'; import type { Logger } from '@kbn/logging'; import type { KibanaRequest } from '@kbn/core-http-server'; import { @@ -17,9 +17,13 @@ import { ChatCompleteOptions, } from '@kbn/inference-common'; import type { PluginStartContract as ActionsPluginStart } from '@kbn/actions-plugin/server'; -import { getConnectorById } from '../util/get_connector_by_id'; import { getInferenceAdapter } from './adapters'; -import { createInferenceExecutor, chunksIntoMessage, streamToResponse } from './utils'; +import { + getInferenceExecutor, + chunksIntoMessage, + streamToResponse, + handleCancellation, +} from './utils'; interface CreateChatCompleteApiOptions { request: KibanaRequest; @@ -37,18 +41,16 @@ export function createChatCompleteApi({ request, actions, logger }: CreateChatCo system, functionCalling, stream, + abortSignal, }: ChatCompleteOptions): ChatCompleteCompositeResponse< ToolOptions, boolean > => { - const obs$ = defer(async () => { - const actionsClient = await actions.getActionsClientWithRequest(request); - const connector = await getConnectorById({ connectorId, actionsClient }); - const executor = createInferenceExecutor({ actionsClient, connector }); - return { executor, connector }; + const inference$ = defer(async () => { + return await getInferenceExecutor({ connectorId, request, actions }); }).pipe( - switchMap(({ executor, connector }) => { - const connectorType = connector.type; + switchMap((executor) => { + const connectorType = executor.getConnector().type; const inferenceAdapter = getInferenceAdapter(connectorType); const messagesWithoutData = messages.map((message) => omit(message, 'data')); @@ -80,21 +82,20 @@ export function createChatCompleteApi({ request, actions, logger }: CreateChatCo tools, logger, functionCalling, + abortSignal, }); }), chunksIntoMessage({ - toolOptions: { - toolChoice, - tools, - }, + toolOptions: { toolChoice, tools }, logger, - }) + }), + abortSignal ? handleCancellation(abortSignal) : identity ); if (stream) { - return obs$; + return inference$; } else { - return streamToResponse(obs$); + return streamToResponse(inference$); } }; } diff --git a/x-pack/platform/plugins/shared/inference/server/chat_complete/types.ts b/x-pack/platform/plugins/shared/inference/server/chat_complete/types.ts index 64cc542ff6119..498afb9a2a17f 100644 --- a/x-pack/platform/plugins/shared/inference/server/chat_complete/types.ts +++ b/x-pack/platform/plugins/shared/inference/server/chat_complete/types.ts @@ -29,6 +29,7 @@ export interface InferenceConnectorAdapter { messages: Message[]; system?: string; functionCalling?: FunctionCallingMode; + abortSignal?: AbortSignal; logger: Logger; } & ToolOptions ) => Observable; diff --git a/x-pack/platform/plugins/shared/inference/server/chat_complete/utils/handle_cancellation.test.ts b/x-pack/platform/plugins/shared/inference/server/chat_complete/utils/handle_cancellation.test.ts new file mode 100644 index 0000000000000..7fd464a7051c6 --- /dev/null +++ b/x-pack/platform/plugins/shared/inference/server/chat_complete/utils/handle_cancellation.test.ts @@ -0,0 +1,53 @@ +/* + * 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 { of, Subject, toArray, firstValueFrom } from 'rxjs'; +import { InferenceTaskError, InferenceTaskErrorCode } from '@kbn/inference-common'; +import { handleCancellation } from './handle_cancellation'; + +describe('handleCancellation', () => { + it('mirrors the source when the abort signal is not triggered', async () => { + const abortController = new AbortController(); + + const source$ = of(1, 2, 3); + + const output$ = source$.pipe(handleCancellation(abortController.signal)); + + const events = await firstValueFrom(output$.pipe(toArray())); + expect(events).toEqual([1, 2, 3]); + }); + + it('causes the observable to error when the signal fires', () => { + const abortController = new AbortController(); + + const source$ = new Subject(); + + const output$ = source$.pipe(handleCancellation(abortController.signal)); + + let thrownError: any; + const values: number[] = []; + + output$.subscribe({ + next: (value) => { + values.push(value); + }, + error: (err) => { + thrownError = err; + }, + }); + + source$.next(1); + source$.next(2); + abortController.abort(); + source$.next(3); + + expect(values).toEqual([1, 2]); + expect(thrownError).toBeInstanceOf(InferenceTaskError); + expect(thrownError.code).toBe(InferenceTaskErrorCode.abortedError); + expect(thrownError.message).toContain('Request was aborted'); + }); +}); diff --git a/x-pack/platform/plugins/shared/inference/server/chat_complete/utils/handle_cancellation.ts b/x-pack/platform/plugins/shared/inference/server/chat_complete/utils/handle_cancellation.ts new file mode 100644 index 0000000000000..640172b150e4e --- /dev/null +++ b/x-pack/platform/plugins/shared/inference/server/chat_complete/utils/handle_cancellation.ts @@ -0,0 +1,39 @@ +/* + * 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 { OperatorFunction, Observable, Subject, takeUntil } from 'rxjs'; +import { createInferenceRequestAbortedError } from '@kbn/inference-common'; + +export function handleCancellation(abortSignal: AbortSignal): OperatorFunction { + return (source$) => { + const stop$ = new Subject(); + if (abortSignal.aborted) { + stop$.next(); + } + abortSignal.addEventListener('abort', () => { + stop$.next(); + }); + + return new Observable((subscriber) => { + return source$.pipe(takeUntil(stop$)).subscribe({ + next: (value) => { + subscriber.next(value); + }, + error: (err) => { + subscriber.error(err); + }, + complete: () => { + if (abortSignal.aborted) { + subscriber.error(createInferenceRequestAbortedError()); + } else { + subscriber.complete(); + } + }, + }); + }); + }; +} diff --git a/x-pack/platform/plugins/shared/inference/server/chat_complete/utils/index.ts b/x-pack/platform/plugins/shared/inference/server/chat_complete/utils/index.ts index d3dc2010cba3a..4314a554589dd 100644 --- a/x-pack/platform/plugins/shared/inference/server/chat_complete/utils/index.ts +++ b/x-pack/platform/plugins/shared/inference/server/chat_complete/utils/index.ts @@ -6,10 +6,11 @@ */ export { - createInferenceExecutor, + getInferenceExecutor, type InferenceInvokeOptions, type InferenceInvokeResult, type InferenceExecutor, } from './inference_executor'; export { chunksIntoMessage } from './chunks_into_message'; export { streamToResponse } from './stream_to_response'; +export { handleCancellation } from './handle_cancellation'; diff --git a/x-pack/platform/plugins/shared/inference/server/chat_complete/utils/inference_executor.ts b/x-pack/platform/plugins/shared/inference/server/chat_complete/utils/inference_executor.ts index 736beb82aa685..c461e6b6cdfb7 100644 --- a/x-pack/platform/plugins/shared/inference/server/chat_complete/utils/inference_executor.ts +++ b/x-pack/platform/plugins/shared/inference/server/chat_complete/utils/inference_executor.ts @@ -5,9 +5,14 @@ * 2.0. */ +import type { KibanaRequest } from '@kbn/core-http-server'; import type { ActionTypeExecutorResult } from '@kbn/actions-plugin/common'; -import type { ActionsClient } from '@kbn/actions-plugin/server'; +import type { + ActionsClient, + PluginStartContract as ActionsPluginStart, +} from '@kbn/actions-plugin/server'; import type { InferenceConnector } from '../../../common/connectors'; +import { getConnectorById } from '../../util/get_connector_by_id'; export interface InferenceInvokeOptions { subAction: string; @@ -22,6 +27,7 @@ export type InferenceInvokeResult = ActionTypeExecutorResult InferenceConnector; invoke(params: InferenceInvokeOptions): Promise; } @@ -33,6 +39,7 @@ export const createInferenceExecutor = ({ actionsClient: ActionsClient; }): InferenceExecutor => { return { + getConnector: () => connector, async invoke({ subAction, subActionParams }): Promise { return await actionsClient.execute({ actionId: connector.connectorId, @@ -44,3 +51,17 @@ export const createInferenceExecutor = ({ }, }; }; + +export const getInferenceExecutor = async ({ + connectorId, + actions, + request, +}: { + connectorId: string; + actions: ActionsPluginStart; + request: KibanaRequest; +}) => { + const actionsClient = await actions.getActionsClientWithRequest(request); + const connector = await getConnectorById({ connectorId, actionsClient }); + return createInferenceExecutor({ actionsClient, connector }); +}; diff --git a/x-pack/platform/plugins/shared/inference/server/routes/chat_complete.ts b/x-pack/platform/plugins/shared/inference/server/routes/chat_complete.ts index 84e3dd57cded1..06ca5381cd83a 100644 --- a/x-pack/platform/plugins/shared/inference/server/routes/chat_complete.ts +++ b/x-pack/platform/plugins/shared/inference/server/routes/chat_complete.ts @@ -109,6 +109,9 @@ export function registerChatCompleteRoute({ .getStartServices() .then(([coreStart, pluginsStart]) => pluginsStart.actions); + const abortController = new AbortController(); + request.events.aborted$.subscribe(() => abortController.abort()); + const client = createInferenceClient({ request, actions, logger }); const { connectorId, messages, system, toolChoice, tools, functionCalling } = request.body; @@ -121,6 +124,7 @@ export function registerChatCompleteRoute({ tools, functionCalling, stream, + abortSignal: abortController.signal, }); } diff --git a/x-pack/platform/plugins/shared/inference/server/test_utils/index.ts b/x-pack/platform/plugins/shared/inference/server/test_utils/index.ts new file mode 100644 index 0000000000000..2eafe20bfdcaf --- /dev/null +++ b/x-pack/platform/plugins/shared/inference/server/test_utils/index.ts @@ -0,0 +1,11 @@ +/* + * 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. + */ + +export { chunkEvent, tokensEvent, messageEvent } from './chat_complete_events'; +export { createInferenceConnectorMock } from './inference_connector'; +export { createInferenceConnectorAdapterMock } from './inference_connector_adapter'; +export { createInferenceExecutorMock } from './inference_executor'; diff --git a/x-pack/platform/plugins/shared/inference/server/test_utils/inference_connector.ts b/x-pack/platform/plugins/shared/inference/server/test_utils/inference_connector.ts new file mode 100644 index 0000000000000..af7f35115325d --- /dev/null +++ b/x-pack/platform/plugins/shared/inference/server/test_utils/inference_connector.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 { InferenceConnector, InferenceConnectorType } from '../../common/connectors'; + +export const createInferenceConnectorMock = ( + parts: Partial = {} +): InferenceConnector => { + return { + type: InferenceConnectorType.OpenAI, + name: 'Inference connector', + connectorId: 'connector-id', + ...parts, + }; +}; diff --git a/x-pack/platform/plugins/shared/inference/server/test_utils/inference_connector_adapter.ts b/x-pack/platform/plugins/shared/inference/server/test_utils/inference_connector_adapter.ts new file mode 100644 index 0000000000000..9e2c4516f4f1c --- /dev/null +++ b/x-pack/platform/plugins/shared/inference/server/test_utils/inference_connector_adapter.ts @@ -0,0 +1,14 @@ +/* + * 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 { InferenceConnectorAdapter } from '../chat_complete/types'; + +export const createInferenceConnectorAdapterMock = (): jest.Mocked => { + return { + chatComplete: jest.fn(), + }; +}; diff --git a/x-pack/platform/plugins/shared/inference/server/test_utils/inference_executor.ts b/x-pack/platform/plugins/shared/inference/server/test_utils/inference_executor.ts new file mode 100644 index 0000000000000..64b5100a9db3d --- /dev/null +++ b/x-pack/platform/plugins/shared/inference/server/test_utils/inference_executor.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 type { InferenceConnector } from '../../common/connectors'; +import { InferenceExecutor } from '../chat_complete/utils'; +import { createInferenceConnectorMock } from './inference_connector'; + +export const createInferenceExecutorMock = ({ + connector = createInferenceConnectorMock(), +}: { connector?: InferenceConnector } = {}): jest.Mocked => { + return { + getConnector: jest.fn().mockReturnValue(connector), + invoke: jest.fn(), + }; +}; From 92283373ae8317714ecbd46183194f2f62213399 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alejandro=20Fern=C3=A1ndez=20Haro?= Date: Tue, 17 Dec 2024 22:39:53 +0100 Subject: [PATCH 16/23] Update data archive for #158311 (#204647) ## Summary Updating the data archive to 8.last so that it can be opened by ES 9.0 in our forward-compatibility tests. Submitting the PR directly to 8.x because this test and archive were removed from `main`. Resolves #158311 --- .../7.13.2_so_with_multiple_namespaces.zip | Bin 79703 -> 119556 bytes .../7.14.0_xpack_sample_saved_objects.zip | Bin 9190687 -> 4648491 bytes .../7.3.0_xpack_sample_saved_objects.zip | Bin 922902 -> 1002101 bytes 3 files changed, 0 insertions(+), 0 deletions(-) diff --git a/src/core/server/integration_tests/saved_objects/migrations/archives/7.13.2_so_with_multiple_namespaces.zip b/src/core/server/integration_tests/saved_objects/migrations/archives/7.13.2_so_with_multiple_namespaces.zip index bc305de2d45606d82c668d30fe51b45687e6bf24..c2c9d596e65d43a5f4828569278ab2e9dccdbf65 100644 GIT binary patch literal 119556 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�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 W6Jl_R4S`sIKl=O-$RIq4hWsDNPtNoJ diff --git a/src/core/server/integration_tests/saved_objects/migrations/archives/7.14.0_xpack_sample_saved_objects.zip b/src/core/server/integration_tests/saved_objects/migrations/archives/7.14.0_xpack_sample_saved_objects.zip index 7b498c945680c686e38cb7904de6585526024490..cd008563aa177755129aedec81320b32c3e3c8cd 100644 GIT binary patch delta 249078 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 z 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%0D*aM3F15csaD&pN-!H%!O3 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 diff --git a/src/core/server/integration_tests/saved_objects/migrations/archives/7.3.0_xpack_sample_saved_objects.zip b/src/core/server/integration_tests/saved_objects/migrations/archives/7.3.0_xpack_sample_saved_objects.zip index b79a497d0694167816760e03d86b075c2432c220..69fc46b2f576d5da8f74a98e0117d93faab4cd3f 100644 GIT binary patch delta 144896 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

+v0~vC~zI5t{UnjHqE{87s(Zq=}m~Q)z2)P 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 a!oQv{Nq`V90?`8e4}BJar~-Zkf%reV-3j&p delta 65593 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 b*H@}B6u^5f5|UitpGJM)75qaw;7|Vp_VL{) From 6ecad8a9441f8e6f01c21aba879d9659c5b64349 Mon Sep 17 00:00:00 2001 From: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> Date: Wed, 18 Dec 2024 08:52:24 +1100 Subject: [PATCH 17/23] [8.x] [CI] skip flaky integration test (#204645) (#204652) # Backport This will backport the following commits from `main` to `8.x`: - [[CI] skip flaky integration test (#204645)](https://github.com/elastic/kibana/pull/204645) ### Questions ? Please refer to the [Backport tool documentation](https://github.com/sqren/backport) Co-authored-by: Alex Szabo --- .../migrations/group3/actions/actions_test_suite.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/core/server/integration_tests/saved_objects/migrations/group3/actions/actions_test_suite.ts b/src/core/server/integration_tests/saved_objects/migrations/group3/actions/actions_test_suite.ts index 41a194f5f1e5d..c6995c6e2d4ca 100644 --- a/src/core/server/integration_tests/saved_objects/migrations/group3/actions/actions_test_suite.ts +++ b/src/core/server/integration_tests/saved_objects/migrations/group3/actions/actions_test_suite.ts @@ -772,7 +772,9 @@ export const runActionTestSuite = ({ // Reindex doesn't return any errors on its own, so we have to test // together with waitForReindexTask - describe('reindex & waitForReindexTask', () => { + // Flaky: https://github.com/elastic/kibana/issues/166190 + // Reported here: https://github.com/elastic/kibana/issues/167273 + describe.skip('reindex & waitForReindexTask', () => { it('resolves right when reindex succeeds without reindex script', async () => { const res = (await reindex({ client, From aed00108282ca0cb6bd34fdb002f50a96b0247ff Mon Sep 17 00:00:00 2001 From: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> Date: Wed, 18 Dec 2024 11:09:50 +1100 Subject: [PATCH 18/23] [8.x] [Security Solution] Remove feature flag `entityAlertPreviewDisabled` (#203171) (#204664) # Backport This will backport the following commits from `main` to `8.x`: - [[Security Solution] Remove feature flag `entityAlertPreviewDisabled` (#203171)](https://github.com/elastic/kibana/pull/203171) ### Questions ? Please refer to the [Backport tool documentation](https://github.com/sqren/backport) Co-authored-by: christineweng <18648970+christineweng@users.noreply.github.com> --- .../common/experimental_features.ts | 5 -- .../tabs/risk_inputs/risk_inputs.test.tsx | 31 +--------- .../tabs/risk_inputs/risk_inputs_tab.tsx | 31 ++++------ ...correlations_details_alerts_table.test.tsx | 19 ++----- .../correlations_details_alerts_table.tsx | 53 +++++++----------- .../left/components/host_details.test.tsx | 19 ++----- .../left/components/host_details.tsx | 46 ++++++--------- .../components/prevalence_details.test.tsx | 12 +--- .../left/components/prevalence_details.tsx | 11 +--- .../left/components/user_details.test.tsx | 19 ++----- .../left/components/user_details.tsx | 46 ++++++--------- .../highlighted_fields_cell.test.tsx | 33 ++--------- .../components/highlighted_fields_cell.tsx | 38 ++----------- .../components/host_entity_overview.test.tsx | 29 +--------- .../right/components/host_entity_overview.tsx | 55 ++++-------------- .../table_field_value_cell.test.tsx | 7 +-- .../components/table_field_value_cell.tsx | 4 +- .../components/user_entity_overview.test.tsx | 35 +----------- .../right/components/user_entity_overview.tsx | 56 ++++--------------- 19 files changed, 124 insertions(+), 425 deletions(-) diff --git a/x-pack/solutions/security/plugins/security_solution/common/experimental_features.ts b/x-pack/solutions/security/plugins/security_solution/common/experimental_features.ts index 428a48cf4b7be..2367793e4c9fc 100644 --- a/x-pack/solutions/security/plugins/security_solution/common/experimental_features.ts +++ b/x-pack/solutions/security/plugins/security_solution/common/experimental_features.ts @@ -109,11 +109,6 @@ export const allowedExperimentalValues = Object.freeze({ */ securitySolutionNotesDisabled: false, - /** - * Disables entity and alert previews - */ - entityAlertPreviewDisabled: false, - /** * Enables the Assistant Model Evaluation advanced setting and API endpoint, introduced in `8.11.0`. */ diff --git a/x-pack/solutions/security/plugins/security_solution/public/entity_analytics/components/entity_details_flyout/tabs/risk_inputs/risk_inputs.test.tsx b/x-pack/solutions/security/plugins/security_solution/public/entity_analytics/components/entity_details_flyout/tabs/risk_inputs/risk_inputs.test.tsx index 6995656db31a5..7ff2a6feb958f 100644 --- a/x-pack/solutions/security/plugins/security_solution/public/entity_analytics/components/entity_details_flyout/tabs/risk_inputs/risk_inputs.test.tsx +++ b/x-pack/solutions/security/plugins/security_solution/public/entity_analytics/components/entity_details_flyout/tabs/risk_inputs/risk_inputs.test.tsx @@ -49,12 +49,6 @@ const riskScore = { }, }; -const mockUseIsExperimentalFeatureEnabled = jest.fn().mockReturnValue(false); - -jest.mock('../../../../../common/hooks/use_experimental_features', () => ({ - useIsExperimentalFeatureEnabled: () => mockUseIsExperimentalFeatureEnabled(), -})); - const riskScoreWithAssetCriticalityContribution = (contribution: number) => { const score = JSON.parse(JSON.stringify(riskScore)); score.user.risk.category_2_score = contribution; @@ -129,8 +123,7 @@ describe('RiskInputsTab', () => { expect(queryByTestId('risk-input-contexts-title')).toBeInTheDocument(); }); - it('it renders alert preview button when feature flag is enable', () => { - mockUseIsExperimentalFeatureEnabled.mockReturnValue(false); + it('it renders alert preview button', () => { mockUseRiskScore.mockReturnValue({ loading: false, error: false, @@ -151,28 +144,6 @@ describe('RiskInputsTab', () => { expect(getByTestId(EXPAND_ALERT_TEST_ID)).toBeInTheDocument(); }); - it('it does not render alert preview button when feature flag is disable', () => { - mockUseIsExperimentalFeatureEnabled.mockReturnValue(true); - mockUseRiskScore.mockReturnValue({ - loading: false, - error: false, - data: [riskScore], - }); - mockUseRiskContributingAlerts.mockReturnValue({ - loading: false, - error: false, - data: [alertInputDataMock], - }); - - const { queryByTestId } = render( - - - - ); - - expect(queryByTestId(EXPAND_ALERT_TEST_ID)).not.toBeInTheDocument(); - }); - it('Displays 0.00 for the asset criticality contribution if the contribution value is less than -0.01', () => { mockUseUiSetting.mockReturnValue([true]); diff --git a/x-pack/solutions/security/plugins/security_solution/public/entity_analytics/components/entity_details_flyout/tabs/risk_inputs/risk_inputs_tab.tsx b/x-pack/solutions/security/plugins/security_solution/public/entity_analytics/components/entity_details_flyout/tabs/risk_inputs/risk_inputs_tab.tsx index 78010434ee593..72a6af0fe768f 100644 --- a/x-pack/solutions/security/plugins/security_solution/public/entity_analytics/components/entity_details_flyout/tabs/risk_inputs/risk_inputs_tab.tsx +++ b/x-pack/solutions/security/plugins/security_solution/public/entity_analytics/components/entity_details_flyout/tabs/risk_inputs/risk_inputs_tab.tsx @@ -14,7 +14,6 @@ import { ALERT_RULE_NAME } from '@kbn/rule-data-utils'; import { get } from 'lodash/fp'; import { AlertPreviewButton } from '../../../../../flyout/shared/components/alert_preview_button'; -import { useIsExperimentalFeatureEnabled } from '../../../../../common/hooks/use_experimental_features'; import { useGlobalTime } from '../../../../../common/containers/use_global_time'; import { useQueryInspector } from '../../../../../common/components/page/manage_query'; import { formatRiskScore } from '../../../../common'; @@ -98,26 +97,20 @@ export const RiskInputsTab = ({ entityType, entityName, scopeId }: RiskInputsTab }), [] ); - const isPreviewEnabled = !useIsExperimentalFeatureEnabled('entityAlertPreviewDisabled'); const inputColumns: Array> = useMemo( () => [ - ...(isPreviewEnabled - ? [ - { - render: (data: InputAlert) => ( - - ), - width: '5%', - }, - ] - : []), - + { + render: (data: InputAlert) => ( + + ), + width: '5%', + }, { name: ( describe('CorrelationsDetailsAlertsTable', () => { beforeEach(() => { jest.mocked(useExpandableFlyoutApi).mockReturnValue(mockFlyoutApi); - mockUseIsExperimentalFeatureEnabled.mockReturnValue(true); jest.mocked(usePaginatedAlerts).mockReturnValue({ setPagination: jest.fn(), setSorting: jest.fn(), @@ -88,16 +84,16 @@ describe('CorrelationsDetailsAlertsTable', () => { }); it('renders EuiBasicTable with correct props', () => { - const { getByTestId, queryByTestId, queryAllByRole } = + const { getByTestId, getAllByTestId, queryAllByRole } = renderCorrelationsTable(mockContextValue); expect(getByTestId(`${TEST_ID}InvestigateInTimeline`)).toBeInTheDocument(); expect(getByTestId(`${TEST_ID}Table`)).toBeInTheDocument(); - expect(queryByTestId(`${TEST_ID}AlertPreviewButton`)).not.toBeInTheDocument(); + expect(getAllByTestId(`${TEST_ID}AlertPreviewButton`)).toHaveLength(2); expect(jest.mocked(usePaginatedAlerts)).toHaveBeenCalled(); - expect(queryAllByRole('columnheader').length).toBe(4); + expect(queryAllByRole('columnheader').length).toBe(5); expect(queryAllByRole('row').length).toBe(3); // 1 header row and 2 data rows expect(queryAllByRole('row')[1].textContent).toContain('Jan 1, 2022 @ 00:00:00.000'); expect(queryAllByRole('row')[1].textContent).toContain('Reason1'); @@ -105,8 +101,7 @@ describe('CorrelationsDetailsAlertsTable', () => { expect(queryAllByRole('row')[1].textContent).toContain('Severity1'); }); - it('renders open preview button when feature flag is on', () => { - mockUseIsExperimentalFeatureEnabled.mockReturnValue(false); + it('renders open preview button', () => { const { getByTestId, getAllByTestId } = renderCorrelationsTable({ ...mockContextValue, isPreviewMode: true, @@ -128,8 +123,7 @@ describe('CorrelationsDetailsAlertsTable', () => { }); }); - it('opens rule preview when feature flag is on and isPreview is false', () => { - mockUseIsExperimentalFeatureEnabled.mockReturnValue(false); + it('opens rule preview when isPreview is false', () => { const { getAllByTestId } = renderCorrelationsTable(mockContextValue); expect(getAllByTestId(`${TEST_ID}RulePreview`).length).toBe(2); @@ -145,8 +139,7 @@ describe('CorrelationsDetailsAlertsTable', () => { }); }); - it('does not render preview link when feature flag is on and isPreview is true', () => { - mockUseIsExperimentalFeatureEnabled.mockReturnValue(false); + it('does not render preview link when isPreview is true', () => { const { queryByTestId } = renderCorrelationsTable({ ...mockContextValue, isPreview: true }); expect(queryByTestId(`${TEST_ID}RulePreview`)).not.toBeInTheDocument(); }); diff --git a/x-pack/solutions/security/plugins/security_solution/public/flyout/document_details/left/components/correlations_details_alerts_table.tsx b/x-pack/solutions/security/plugins/security_solution/public/flyout/document_details/left/components/correlations_details_alerts_table.tsx index d8497ca984ea8..4d757b46edb27 100644 --- a/x-pack/solutions/security/plugins/security_solution/public/flyout/document_details/left/components/correlations_details_alerts_table.tsx +++ b/x-pack/solutions/security/plugins/security_solution/public/flyout/document_details/left/components/correlations_details_alerts_table.tsx @@ -14,7 +14,6 @@ import { isRight } from 'fp-ts/lib/Either'; import { ALERT_REASON, ALERT_RULE_NAME } from '@kbn/rule-data-utils'; import { FormattedMessage } from '@kbn/i18n-react'; import { i18n } from '@kbn/i18n'; -import { useIsExperimentalFeatureEnabled } from '../../../../common/hooks/use_experimental_features'; import { CellTooltipWrapper } from '../../shared/components/cell_tooltip_wrapper'; import type { DataProvider } from '../../../../../common/types'; import { SeverityBadge } from '../../../../common/components/severity_badge'; @@ -82,8 +81,6 @@ export const CorrelationsDetailsAlertsTable: FC [ - ...(isPreviewEnabled - ? [ - { - render: (row: Record) => ( - - ), - width: '5%', - }, - ] - : []), + { + render: (row: Record) => ( + + ), + width: '5%', + }, { field: '@timestamp', name: ( @@ -176,20 +169,16 @@ export const CorrelationsDetailsAlertsTable: FC - {isPreviewEnabled ? ( - - {ruleName} - - ) : ( + {ruleName} - )} + ); }, @@ -229,7 +218,7 @@ export const CorrelationsDetailsAlertsTable: FC { const actual = jest.requireActual('react-router-dom'); return { ...actual, useLocation: jest.fn().mockReturnValue({ pathname: '' }) }; @@ -178,20 +174,18 @@ describe('', () => { mockUseHostDetails.mockReturnValue(mockHostDetailsResponse); mockUseRiskScore.mockReturnValue(mockRiskScoreResponse); mockUseHostsRelatedUsers.mockReturnValue(mockRelatedUsersResponse); - mockUseIsExperimentalFeatureEnabled.mockReturnValue(true); (useMisconfigurationPreview as jest.Mock).mockReturnValue({}); (useVulnerabilitiesPreview as jest.Mock).mockReturnValue({}); (useAlertsByStatus as jest.Mock).mockReturnValue({ isLoading: false, items: {} }); }); it('should render host details correctly', () => { - const { getByTestId, queryByTestId } = renderHostDetails(mockContextValue); + const { getByTestId } = renderHostDetails(mockContextValue); expect(getByTestId(EXPANDABLE_PANEL_CONTENT_TEST_ID(HOST_DETAILS_TEST_ID))).toBeInTheDocument(); - expect(queryByTestId(HOST_DETAILS_LINK_TEST_ID)).not.toBeInTheDocument(); + expect(getByTestId(HOST_DETAILS_LINK_TEST_ID)).toBeInTheDocument(); }); - it('should render host name as clicable link when preview is not disabled', () => { - mockUseIsExperimentalFeatureEnabled.mockReturnValue(false); + it('should render host name as clicable link', () => { const { getByTestId } = renderHostDetails(mockContextValue); expect(getByTestId(HOST_DETAILS_LINK_TEST_ID)).toBeInTheDocument(); @@ -240,7 +234,7 @@ describe('', () => { describe('Related users', () => { it('should render the related user table with correct dates and indices', () => { - const { getByTestId, queryByTestId } = renderHostDetails(mockContextValue); + const { getByTestId } = renderHostDetails(mockContextValue); expect(mockUseHostsRelatedUsers).toBeCalledWith({ from: timestamp, hostName: 'test host', @@ -248,7 +242,7 @@ describe('', () => { skip: false, }); expect(getByTestId(HOST_DETAILS_RELATED_USERS_TABLE_TEST_ID)).toBeInTheDocument(); - expect(queryByTestId(HOST_DETAILS_RELATED_USERS_LINK_TEST_ID)).not.toBeInTheDocument(); + expect(getByTestId(HOST_DETAILS_RELATED_USERS_LINK_TEST_ID)).toBeInTheDocument(); }); it('should render user risk score column when license and capabilities are valid', () => { @@ -294,8 +288,7 @@ describe('', () => { ); }); - it('should render user name as clicable link when preview is not disabled', () => { - mockUseIsExperimentalFeatureEnabled.mockReturnValue(false); + it('should render user name as clicable link', () => { const { getAllByTestId } = renderHostDetails(mockContextValue); expect(getAllByTestId(HOST_DETAILS_RELATED_USERS_LINK_TEST_ID).length).toBe(1); diff --git a/x-pack/solutions/security/plugins/security_solution/public/flyout/document_details/left/components/host_details.tsx b/x-pack/solutions/security/plugins/security_solution/public/flyout/document_details/left/components/host_details.tsx index e3fd2fef8bc6e..9555860a329b3 100644 --- a/x-pack/solutions/security/plugins/security_solution/public/flyout/document_details/left/components/host_details.tsx +++ b/x-pack/solutions/security/plugins/security_solution/public/flyout/document_details/left/components/host_details.tsx @@ -25,14 +25,12 @@ import type { EuiBasicTableColumn } from '@elastic/eui'; import { FormattedMessage } from '@kbn/i18n-react'; import { i18n } from '@kbn/i18n'; import { useExpandableFlyoutApi } from '@kbn/expandable-flyout'; -import { useIsExperimentalFeatureEnabled } from '../../../../common/hooks/use_experimental_features'; import { ExpandablePanel } from '../../../shared/components/expandable_panel'; import type { RelatedUser } from '../../../../../common/search_strategy/security_solution/related_entities/related_users'; import type { RiskSeverity } from '../../../../../common/search_strategy'; import { HostOverview } from '../../../../overview/components/host_overview'; import { AnomalyTableProvider } from '../../../../common/components/ml/anomaly/anomaly_table_provider'; import { InspectButton, InspectButtonContainer } from '../../../../common/components/inspect'; -import { NetworkDetailsLink } from '../../../../common/components/links'; import { RiskScoreEntity } from '../../../../../common/search_strategy'; import { RiskScoreLevel } from '../../../../entity_analytics/components/severity/common'; import { DefaultFieldRenderer } from '../../../../timelines/components/field_renderers/default_renderer'; @@ -110,7 +108,6 @@ export const HostDetails: React.FC = ({ hostName, timestamp, s const isEntityAnalyticsAuthorized = isPlatinumOrTrialLicense && hasEntityAnalyticsCapability; const { openPreviewPanel } = useExpandableFlyoutApi(); - const isPreviewEnabled = !useIsExperimentalFeatureEnabled('entityAlertPreviewDisabled'); const narrowDateRange = useCallback( (score, interval) => { @@ -176,16 +173,12 @@ export const HostDetails: React.FC = ({ hostName, timestamp, s render: (user: string) => ( - {isPreviewEnabled ? ( - - ) : ( - <>{user} - )} + ), @@ -208,15 +201,13 @@ export const HostDetails: React.FC = ({ hostName, timestamp, s render={(ip) => ip == null ? ( getEmptyTagValue() - ) : isPreviewEnabled ? ( + ) : ( - ) : ( - ) } scopeId={scopeId} @@ -242,7 +233,7 @@ export const HostDetails: React.FC = ({ hostName, timestamp, s ] : []), ], - [isEntityAnalyticsAuthorized, scopeId, isPreviewEnabled] + [isEntityAnalyticsAuthorized, scopeId] ); const relatedUsersCount = useMemo( @@ -273,19 +264,14 @@ export const HostDetails: React.FC = ({ hostName, timestamp, s }; const hostLink = useMemo( - () => - isPreviewEnabled - ? { - callback: openHostPreview, - tooltip: i18n.translate( - 'xpack.securitySolution.flyout.left.insights.entities.host.hostPreviewTitle', - { - defaultMessage: 'Preview host', - } - ), - } - : undefined, - [isPreviewEnabled, openHostPreview] + () => ({ + callback: openHostPreview, + tooltip: i18n.translate( + 'xpack.securitySolution.flyout.left.insights.entities.host.hostPreviewTitle', + { defaultMessage: 'Preview host' } + ), + }), + [openHostPreview] ); return ( diff --git a/x-pack/solutions/security/plugins/security_solution/public/flyout/document_details/left/components/prevalence_details.test.tsx b/x-pack/solutions/security/plugins/security_solution/public/flyout/document_details/left/components/prevalence_details.test.tsx index e8b1b71e9cd0f..e0bef746b213b 100644 --- a/x-pack/solutions/security/plugins/security_solution/public/flyout/document_details/left/components/prevalence_details.test.tsx +++ b/x-pack/solutions/security/plugins/security_solution/public/flyout/document_details/left/components/prevalence_details.test.tsx @@ -24,7 +24,6 @@ import { import { usePrevalence } from '../../shared/hooks/use_prevalence'; import { TestProviders } from '../../../../common/mock'; import { licenseService } from '../../../../common/hooks/use_license'; -import { useIsExperimentalFeatureEnabled } from '../../../../common/hooks/use_experimental_features'; import { mockFlyoutApi } from '../../shared/mocks/mock_flyout_context'; import { useExpandableFlyoutApi } from '@kbn/expandable-flyout'; import { HostPreviewPanelKey } from '../../../entity_details/host_right'; @@ -46,9 +45,6 @@ jest.mock('../../../../common/lib/kibana', () => { }; }); -jest.mock('../../../../common/hooks/use_experimental_features'); -const mockUseIsExperimentalFeatureEnabled = useIsExperimentalFeatureEnabled as jest.Mock; - jest.mock('../../shared/hooks/use_prevalence'); const mockDispatch = jest.fn(); @@ -138,7 +134,6 @@ describe('PrevalenceDetails', () => { jest.clearAllMocks(); licenseServiceMock.isPlatinumPlus.mockReturnValue(true); jest.mocked(useExpandableFlyoutApi).mockReturnValue(mockFlyoutApi); - mockUseIsExperimentalFeatureEnabled.mockReturnValue(true); }); it('should render the table with all data if license is platinum', () => { @@ -162,13 +157,10 @@ describe('PrevalenceDetails', () => { ).toBeGreaterThan(1); expect(queryByTestId(PREVALENCE_DETAILS_UPSELL_TEST_ID)).not.toBeInTheDocument(); expect(queryByText(NO_DATA_MESSAGE)).not.toBeInTheDocument(); - expect( - queryByTestId(PREVALENCE_DETAILS_TABLE_PREVIEW_LINK_CELL_TEST_ID) - ).not.toBeInTheDocument(); + expect(getAllByTestId(PREVALENCE_DETAILS_TABLE_PREVIEW_LINK_CELL_TEST_ID)).toHaveLength(2); }); - it('should render host and user name as clickable link if preview is enabled', () => { - mockUseIsExperimentalFeatureEnabled.mockReturnValue(false); + it('should render host and user name as clickable link', () => { (usePrevalence as jest.Mock).mockReturnValue(mockPrevelanceReturnValue); const { getAllByTestId } = renderPrevalenceDetails(); diff --git a/x-pack/solutions/security/plugins/security_solution/public/flyout/document_details/left/components/prevalence_details.tsx b/x-pack/solutions/security/plugins/security_solution/public/flyout/document_details/left/components/prevalence_details.tsx index 6491bc9ad2747..77ab6eb66df31 100644 --- a/x-pack/solutions/security/plugins/security_solution/public/flyout/document_details/left/components/prevalence_details.tsx +++ b/x-pack/solutions/security/plugins/security_solution/public/flyout/document_details/left/components/prevalence_details.tsx @@ -22,7 +22,6 @@ import { useEuiTheme, } from '@elastic/eui'; import { FormattedMessage } from '@kbn/i18n-react'; -import { useIsExperimentalFeatureEnabled } from '../../../../common/hooks/use_experimental_features'; import { FormattedCount } from '../../../../common/components/formatted_number'; import { useLicense } from '../../../../common/hooks/use_license'; import { InvestigateInTimelineButton } from '../../../../common/components/event_details/investigate_in_timeline_button'; @@ -81,10 +80,6 @@ interface PrevalenceDetailsRow extends PrevalenceData { * License to drive the rendering of the last 2 prevalence columns */ isPlatinumPlus: boolean; - /** - * If enabled, clicking host or user should open an entity preview - */ - isPreviewEnabled: boolean; /** * Scope id to pass to the preview link */ @@ -115,7 +110,7 @@ const columns: Array> = [ render: (data: PrevalenceDetailsRow) => ( {data.values.map((value) => { - if (data.isPreviewEnabled && hasPreview(data.field)) { + if (hasPreview(data.field)) { return ( @@ -331,7 +326,6 @@ export const PrevalenceDetails: React.FC = () => { useDocumentDetailsContext(); const isPlatinumPlus = useLicense().isPlatinumPlus(); - const isPreviewEnabled = !useIsExperimentalFeatureEnabled('entityAlertPreviewDisabled'); // these two are used by the usePrevalence hook to fetch the data const [start, setStart] = useState(DEFAULT_FROM); @@ -382,10 +376,9 @@ export const PrevalenceDetails: React.FC = () => { from: absoluteStart, to: absoluteEnd, isPlatinumPlus, - isPreviewEnabled, scopeId, })), - [data, absoluteStart, absoluteEnd, isPlatinumPlus, isPreviewEnabled, scopeId] + [data, absoluteStart, absoluteEnd, isPlatinumPlus, scopeId] ); const upsell = ( 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 a5b09ce19bfb0..2ba6345cb1663 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 @@ -16,7 +16,6 @@ import { useMlCapabilities } from '../../../../common/components/ml/hooks/use_ml import { mockAnomalies } from '../../../../common/components/ml/mock'; import { useObservedUserDetails } from '../../../../explore/users/containers/users/observed_details'; import { useUserRelatedHosts } from '../../../../common/containers/related_entities/related_hosts'; -import { useIsExperimentalFeatureEnabled } from '../../../../common/hooks/use_experimental_features'; import { RiskSeverity } from '../../../../../common/search_strategy'; import { USER_DETAILS_TEST_ID, @@ -43,9 +42,6 @@ import { useAlertsByStatus } from '../../../../overview/components/detection_res jest.mock('@kbn/expandable-flyout'); jest.mock('@kbn/cloud-security-posture/src/hooks/use_misconfiguration_preview'); -jest.mock('../../../../common/hooks/use_experimental_features'); -const mockUseIsExperimentalFeatureEnabled = useIsExperimentalFeatureEnabled as jest.Mock; - jest.mock('react-router-dom', () => { const actual = jest.requireActual('react-router-dom'); return { ...actual, useLocation: jest.fn().mockReturnValue({ pathname: '' }) }; @@ -172,19 +168,17 @@ describe('', () => { mockUseObservedUserDetails.mockReturnValue(mockUserDetailsResponse); mockUseRiskScore.mockReturnValue(mockRiskScoreResponse); mockUseUsersRelatedHosts.mockReturnValue(mockRelatedHostsResponse); - mockUseIsExperimentalFeatureEnabled.mockReturnValue(true); (useMisconfigurationPreview as jest.Mock).mockReturnValue({}); (useAlertsByStatus as jest.Mock).mockReturnValue({ isLoading: false, items: {} }); }); it('should render user details correctly', () => { - const { getByTestId, queryByTestId } = renderUserDetails(mockContextValue); + const { getByTestId } = renderUserDetails(mockContextValue); expect(getByTestId(EXPANDABLE_PANEL_CONTENT_TEST_ID(USER_DETAILS_TEST_ID))).toBeInTheDocument(); - expect(queryByTestId(USER_DETAILS_LINK_TEST_ID)).not.toBeInTheDocument(); + expect(getByTestId(USER_DETAILS_LINK_TEST_ID)).toBeInTheDocument(); }); - it('should render user name as clicable link when feature flag is true', () => { - mockUseIsExperimentalFeatureEnabled.mockReturnValue(false); + it('should render user name as clicable link', () => { const { getByTestId } = renderUserDetails(mockContextValue); expect(getByTestId(USER_DETAILS_LINK_TEST_ID)).toBeInTheDocument(); @@ -231,7 +225,7 @@ describe('', () => { describe('Related hosts', () => { it('should render the related host table with correct dates and indices', () => { - const { getByTestId, queryByTestId } = renderUserDetails(mockContextValue); + const { getByTestId } = renderUserDetails(mockContextValue); expect(mockUseUsersRelatedHosts).toBeCalledWith({ from: timestamp, userName: 'test user', @@ -239,7 +233,7 @@ describe('', () => { skip: false, }); expect(getByTestId(USER_DETAILS_RELATED_HOSTS_TABLE_TEST_ID)).toBeInTheDocument(); - expect(queryByTestId(USER_DETAILS_RELATED_HOSTS_LINK_TEST_ID)).not.toBeInTheDocument(); + expect(getByTestId(USER_DETAILS_RELATED_HOSTS_LINK_TEST_ID)).toBeInTheDocument(); }); it('should render host risk score column when license is valid', () => { @@ -272,8 +266,7 @@ describe('', () => { ); }); - it('should render host name and ip as clicable link when preview is enabled', () => { - mockUseIsExperimentalFeatureEnabled.mockReturnValue(false); + it('should render host name and ip as clicable link', () => { const { getAllByTestId } = renderUserDetails(mockContextValue); expect(getAllByTestId(USER_DETAILS_RELATED_HOSTS_LINK_TEST_ID).length).toBe(1); diff --git a/x-pack/solutions/security/plugins/security_solution/public/flyout/document_details/left/components/user_details.tsx b/x-pack/solutions/security/plugins/security_solution/public/flyout/document_details/left/components/user_details.tsx index e88cbb54f9471..00366a367a81f 100644 --- a/x-pack/solutions/security/plugins/security_solution/public/flyout/document_details/left/components/user_details.tsx +++ b/x-pack/solutions/security/plugins/security_solution/public/flyout/document_details/left/components/user_details.tsx @@ -25,14 +25,12 @@ import type { EuiBasicTableColumn } from '@elastic/eui'; import { FormattedMessage } from '@kbn/i18n-react'; import { i18n } from '@kbn/i18n'; import { useExpandableFlyoutApi } from '@kbn/expandable-flyout'; -import { useIsExperimentalFeatureEnabled } from '../../../../common/hooks/use_experimental_features'; import { ExpandablePanel } from '../../../shared/components/expandable_panel'; import type { RelatedHost } from '../../../../../common/search_strategy/security_solution/related_entities/related_hosts'; import type { RiskSeverity } from '../../../../../common/search_strategy'; import { UserOverview } from '../../../../overview/components/user_overview'; import { AnomalyTableProvider } from '../../../../common/components/ml/anomaly/anomaly_table_provider'; import { InspectButton, InspectButtonContainer } from '../../../../common/components/inspect'; -import { NetworkDetailsLink } from '../../../../common/components/links'; import { RiskScoreEntity } from '../../../../../common/search_strategy'; import { RiskScoreLevel } from '../../../../entity_analytics/components/severity/common'; import { DefaultFieldRenderer } from '../../../../timelines/components/field_renderers/default_renderer'; @@ -109,7 +107,6 @@ export const UserDetails: React.FC = ({ userName, timestamp, s const isEntityAnalyticsAuthorized = isPlatinumOrTrialLicense && hasEntityAnalyticsCapability; const { openPreviewPanel } = useExpandableFlyoutApi(); - const isPreviewEnabled = !useIsExperimentalFeatureEnabled('entityAlertPreviewDisabled'); const narrowDateRange = useCallback( (score, interval) => { @@ -175,16 +172,12 @@ export const UserDetails: React.FC = ({ userName, timestamp, s render: (host: string) => ( - {isPreviewEnabled ? ( - - ) : ( - <>{host} - )} + ), @@ -207,15 +200,13 @@ export const UserDetails: React.FC = ({ userName, timestamp, s render={(ip) => ip == null ? ( getEmptyTagValue() - ) : isPreviewEnabled ? ( + ) : ( - ) : ( - ) } scopeId={scopeId} @@ -241,7 +232,7 @@ export const UserDetails: React.FC = ({ userName, timestamp, s ] : []), ], - [isEntityAnalyticsAuthorized, scopeId, isPreviewEnabled] + [isEntityAnalyticsAuthorized, scopeId] ); const relatedHostsCount = useMemo( @@ -272,19 +263,14 @@ export const UserDetails: React.FC = ({ userName, timestamp, s }; const userLink = useMemo( - () => - isPreviewEnabled - ? { - callback: openUserPreview, - tooltip: i18n.translate( - 'xpack.securitySolution.flyout.left.insights.entities.user.userPreviewTitle', - { - defaultMessage: 'Preview user', - } - ), - } - : undefined, - [isPreviewEnabled, openUserPreview] + () => ({ + callback: openUserPreview, + tooltip: i18n.translate( + 'xpack.securitySolution.flyout.left.insights.entities.user.userPreviewTitle', + { defaultMessage: 'Preview user' } + ), + }), + [openUserPreview] ); return ( diff --git a/x-pack/solutions/security/plugins/security_solution/public/flyout/document_details/right/components/highlighted_fields_cell.test.tsx b/x-pack/solutions/security/plugins/security_solution/public/flyout/document_details/right/components/highlighted_fields_cell.test.tsx index ff003813f260d..e6f88498b2605 100644 --- a/x-pack/solutions/security/plugins/security_solution/public/flyout/document_details/right/components/highlighted_fields_cell.test.tsx +++ b/x-pack/solutions/security/plugins/security_solution/public/flyout/document_details/right/components/highlighted_fields_cell.test.tsx @@ -14,11 +14,7 @@ import { } from './test_ids'; import { HighlightedFieldsCell } from './highlighted_fields_cell'; import { DocumentDetailsContext } from '../../shared/context'; -import { DocumentDetailsLeftPanelKey } from '../../shared/constants/panel_keys'; -import { LeftPanelInsightsTab } from '../../left'; import { TestProviders } from '../../../../common/mock'; -import { ENTITIES_TAB_ID } from '../../left/components/entities_details'; -import { useIsExperimentalFeatureEnabled } from '../../../../common/hooks/use_experimental_features'; import { useGetAgentStatus } from '../../../../management/hooks/agents/use_get_agent_status'; import { mockFlyoutApi } from '../../shared/mocks/mock_flyout_context'; import { useExpandableFlyoutApi } from '@kbn/expandable-flyout'; @@ -47,9 +43,6 @@ jest.mock('../../../../common/lib/kibana', () => { const useGetAgentStatusMock = useGetAgentStatus as jest.Mock; -jest.mock('../../../../common/hooks/use_experimental_features'); -const mockUseIsExperimentalFeatureEnabled = useIsExperimentalFeatureEnabled as jest.Mock; - const panelContextValue = { eventId: 'event id', indexName: 'indexName', @@ -68,7 +61,6 @@ const renderHighlightedFieldsCell = (values: string[], field: string) => describe('', () => { beforeAll(() => { jest.mocked(useExpandableFlyoutApi).mockReturnValue(mockFlyoutApi); - mockUseIsExperimentalFeatureEnabled.mockReturnValue(true); }); it('should render a basic cell', () => { @@ -83,23 +75,7 @@ describe('', () => { expect(getByTestId(HIGHLIGHTED_FIELDS_BASIC_CELL_TEST_ID)).toBeInTheDocument(); }); - it('should open left panel when clicking on the link within a a link cell when preview is disabled', () => { - const { getByTestId } = renderHighlightedFieldsCell(['value'], 'user.name'); - - getByTestId(HIGHLIGHTED_FIELDS_LINKED_CELL_TEST_ID).click(); - expect(mockFlyoutApi.openLeftPanel).toHaveBeenCalledWith({ - id: DocumentDetailsLeftPanelKey, - path: { tab: LeftPanelInsightsTab, subTab: ENTITIES_TAB_ID }, - params: { - id: panelContextValue.eventId, - indexName: panelContextValue.indexName, - scopeId: panelContextValue.scopeId, - }, - }); - }); - - it('should open host preview when click on host when preview is not disabled', () => { - mockUseIsExperimentalFeatureEnabled.mockReturnValue(false); + it('should open host preview when click on host', () => { const { getByTestId } = renderHighlightedFieldsCell(['test host'], 'host.name'); expect(getByTestId(HIGHLIGHTED_FIELDS_LINKED_CELL_TEST_ID)).toBeInTheDocument(); @@ -114,8 +90,7 @@ describe('', () => { }); }); - it('should open user preview when click on user when preview is not disabled', () => { - mockUseIsExperimentalFeatureEnabled.mockReturnValue(false); + it('should open user preview when click on user', () => { const { getByTestId } = renderHighlightedFieldsCell(['test user'], 'user.name'); expect(getByTestId(HIGHLIGHTED_FIELDS_LINKED_CELL_TEST_ID)).toBeInTheDocument(); @@ -130,8 +105,7 @@ describe('', () => { }); }); - it('should open ip preview when click on ip when preview is not disabled', () => { - mockUseIsExperimentalFeatureEnabled.mockReturnValue(false); + it('should open ip preview when click on ip', () => { const { getByTestId } = renderHighlightedFieldsCell(['100:XXX:XXX'], 'source.ip'); expect(getByTestId(HIGHLIGHTED_FIELDS_LINKED_CELL_TEST_ID)).toBeInTheDocument(); @@ -204,6 +178,7 @@ describe('', () => { expect(getByTestId(HIGHLIGHTED_FIELDS_AGENT_STATUS_CELL_TEST_ID)).toBeInTheDocument(); }); + it('should not render if values is null', () => { const { container } = render( diff --git a/x-pack/solutions/security/plugins/security_solution/public/flyout/document_details/right/components/highlighted_fields_cell.tsx b/x-pack/solutions/security/plugins/security_solution/public/flyout/document_details/right/components/highlighted_fields_cell.tsx index e11dee4a74adf..b6fc98653f896 100644 --- a/x-pack/solutions/security/plugins/security_solution/public/flyout/document_details/right/components/highlighted_fields_cell.tsx +++ b/x-pack/solutions/security/plugins/security_solution/public/flyout/document_details/right/components/highlighted_fields_cell.tsx @@ -5,19 +5,14 @@ * 2.0. */ -import type { VFC } from 'react'; -import React, { useCallback, useMemo } from 'react'; -import { EuiFlexItem, EuiLink } from '@elastic/eui'; -import { useExpandableFlyoutApi } from '@kbn/expandable-flyout'; +import type { FC } from 'react'; +import React, { useMemo } from 'react'; +import { EuiFlexItem } from '@elastic/eui'; import { getAgentTypeForAgentIdField } from '../../../../common/lib/endpoint/utils/get_agent_type_for_agent_id_field'; import type { ResponseActionAgentType } from '../../../../../common/endpoint/service/response_actions/constants'; import { AgentStatus } from '../../../../common/components/endpoint/agents/agent_status'; import { useDocumentDetailsContext } from '../../shared/context'; import { AGENT_STATUS_FIELD_NAME } from '../../../../timelines/components/timeline/body/renderers/constants'; -import { useIsExperimentalFeatureEnabled } from '../../../../common/hooks/use_experimental_features'; -import { DocumentDetailsLeftPanelKey } from '../../shared/constants/panel_keys'; -import { LeftPanelInsightsTab } from '../../left'; -import { ENTITIES_TAB_ID } from '../../left/components/entities_details'; import { HIGHLIGHTED_FIELDS_AGENT_STATUS_CELL_TEST_ID, HIGHLIGHTED_FIELDS_BASIC_CELL_TEST_ID, @@ -44,26 +39,12 @@ export interface HighlightedFieldsCellProps { /** * Renders a component in the highlighted fields table cell based on the field name */ -export const HighlightedFieldsCell: VFC = ({ +export const HighlightedFieldsCell: FC = ({ values, field, originalField = '', }) => { - const { scopeId, eventId, indexName } = useDocumentDetailsContext(); - const { openLeftPanel } = useExpandableFlyoutApi(); - const isPreviewEnabled = !useIsExperimentalFeatureEnabled('entityAlertPreviewDisabled'); - - const goToInsightsEntities = useCallback(() => { - openLeftPanel({ - id: DocumentDetailsLeftPanelKey, - path: { tab: LeftPanelInsightsTab, subTab: ENTITIES_TAB_ID }, - params: { - id: eventId, - indexName, - scopeId, - }, - }); - }, [eventId, indexName, openLeftPanel, scopeId]); + const { scopeId } = useDocumentDetailsContext(); const agentType: ResponseActionAgentType = useMemo(() => { return getAgentTypeForAgentIdField(originalField); @@ -79,20 +60,13 @@ export const HighlightedFieldsCell: VFC = ({ key={`${i}-${value}`} data-test-subj={`${value}-${HIGHLIGHTED_FIELDS_CELL_TEST_ID}`} > - {isPreviewEnabled && hasPreview(field) ? ( + {hasPreview(field) ? ( - ) : hasPreview(field) ? ( - - {value} - ) : field === AGENT_STATUS_FIELD_NAME ? ( { }; }); -jest.mock('../../../../common/hooks/use_experimental_features'); -const mockUseIsExperimentalFeatureEnabled = useIsExperimentalFeatureEnabled as jest.Mock; - const mockUseGlobalTime = jest.fn().mockReturnValue({ from, to }); jest.mock('../../../../common/containers/use_global_time', () => { return { @@ -124,7 +117,6 @@ const renderHostEntityContent = () => describe('', () => { beforeAll(() => { jest.mocked(useExpandableFlyoutApi).mockReturnValue(mockFlyoutApi); - mockUseIsExperimentalFeatureEnabled.mockReturnValue(true); (useMisconfigurationPreview as jest.Mock).mockReturnValue({}); (useVulnerabilitiesPreview as jest.Mock).mockReturnValue({}); (useAlertsByStatus as jest.Mock).mockReturnValue({ isLoading: false, items: {} }); @@ -204,28 +196,9 @@ describe('', () => { expect(getByTestId(ENTITIES_HOST_OVERVIEW_LAST_SEEN_TEST_ID)).toHaveTextContent('—'); }); - it('should navigate to left panel entities tab when clicking on title when feature flag is off', () => { - mockUseHostDetails.mockReturnValue([false, { hostDetails: hostData }]); - mockUseRiskScore.mockReturnValue({ data: riskLevel, isAuthorized: true }); - - const { getByTestId } = renderHostEntityContent(); - - getByTestId(ENTITIES_HOST_OVERVIEW_LINK_TEST_ID).click(); - expect(mockFlyoutApi.openLeftPanel).toHaveBeenCalledWith({ - id: DocumentDetailsLeftPanelKey, - path: { tab: LeftPanelInsightsTab, subTab: ENTITIES_TAB_ID }, - params: { - id: panelContextValue.eventId, - indexName: panelContextValue.indexName, - scopeId: panelContextValue.scopeId, - }, - }); - }); - - it('should open host preview when clicking on title when feature flag is on', () => { + it('should open host preview when clicking on title', () => { mockUseHostDetails.mockReturnValue([false, { hostDetails: hostData }]); mockUseRiskScore.mockReturnValue({ data: riskLevel, isAuthorized: true }); - mockUseIsExperimentalFeatureEnabled.mockReturnValue(false); const { getByTestId } = renderHostEntityContent(); diff --git a/x-pack/solutions/security/plugins/security_solution/public/flyout/document_details/right/components/host_entity_overview.tsx b/x-pack/solutions/security/plugins/security_solution/public/flyout/document_details/right/components/host_entity_overview.tsx index 9b60eefbb5f61..eb1ca093fbb03 100644 --- a/x-pack/solutions/security/plugins/security_solution/public/flyout/document_details/right/components/host_entity_overview.tsx +++ b/x-pack/solutions/security/plugins/security_solution/public/flyout/document_details/right/components/host_entity_overview.tsx @@ -5,11 +5,10 @@ * 2.0. */ -import React, { useCallback, useMemo } from 'react'; +import React, { useMemo } from 'react'; import { EuiFlexGroup, EuiFlexItem, - EuiLink, EuiText, EuiIcon, useEuiTheme, @@ -19,8 +18,6 @@ import { import { css } from '@emotion/css'; import { getOr } from 'lodash/fp'; import { i18n } from '@kbn/i18n'; -import { useExpandableFlyoutApi } from '@kbn/expandable-flyout'; -import { useIsExperimentalFeatureEnabled } from '../../../../common/hooks/use_experimental_features'; import { HOST_NAME_FIELD_NAME } from '../../../../timelines/components/timeline/body/renderers/constants'; import { useRiskScore } from '../../../../entity_analytics/api/hooks/use_risk_score'; import { useDocumentDetailsContext } from '../../shared/context'; @@ -44,7 +41,6 @@ import { LAST_SEEN, HOST_RISK_LEVEL, } from '../../../../overview/components/host_overview/translations'; -import { ENTITIES_TAB_ID } from '../../left/components/entities_details'; import { ENTITIES_HOST_OVERVIEW_TEST_ID, ENTITIES_HOST_OVERVIEW_OS_FAMILY_TEST_ID, @@ -56,8 +52,6 @@ import { ENTITIES_HOST_OVERVIEW_MISCONFIGURATIONS_TEST_ID, ENTITIES_HOST_OVERVIEW_VULNERABILITIES_TEST_ID, } from './test_ids'; -import { DocumentDetailsLeftPanelKey } from '../../shared/constants/panel_keys'; -import { LeftPanelInsightsTab } from '../../left'; import { RiskScoreDocTooltip } from '../../../../overview/components/common'; import { PreviewLink } from '../../../shared/components/preview_link'; import { MisconfigurationsInsight } from '../../shared/components/misconfiguration_insight'; @@ -85,21 +79,7 @@ export const HOST_PREVIEW_BANNER = { * Host preview content for the entities preview in right flyout. It contains ip addresses and risk level */ export const HostEntityOverview: React.FC = ({ hostName }) => { - const { eventId, indexName, scopeId } = useDocumentDetailsContext(); - const { openLeftPanel } = useExpandableFlyoutApi(); - const isPreviewEnabled = !useIsExperimentalFeatureEnabled('entityAlertPreviewDisabled'); - - const goToEntitiesTab = useCallback(() => { - openLeftPanel({ - id: DocumentDetailsLeftPanelKey, - path: { tab: LeftPanelInsightsTab, subTab: ENTITIES_TAB_ID }, - params: { - id: eventId, - indexName, - scopeId, - }, - }); - }, [eventId, openLeftPanel, indexName, scopeId]); + const { scopeId } = useDocumentDetailsContext(); const { from, to } = useGlobalTime(); const { selectedPatterns } = useSourcererDataView(); @@ -212,34 +192,21 @@ export const HostEntityOverview: React.FC = ({ hostName - {isPreviewEnabled ? ( - - - {hostName} - - - ) : ( - + {hostName} - - )} + + diff --git a/x-pack/solutions/security/plugins/security_solution/public/flyout/document_details/right/components/table_field_value_cell.test.tsx b/x-pack/solutions/security/plugins/security_solution/public/flyout/document_details/right/components/table_field_value_cell.test.tsx index eec53dbe3d262..2c7abe5bb1d27 100644 --- a/x-pack/solutions/security/plugins/security_solution/public/flyout/document_details/right/components/table_field_value_cell.test.tsx +++ b/x-pack/solutions/security/plugins/security_solution/public/flyout/document_details/right/components/table_field_value_cell.test.tsx @@ -9,7 +9,6 @@ import { render, screen } from '@testing-library/react'; import React from 'react'; import type { FieldSpec } from '@kbn/data-plugin/common'; import { DocumentDetailsContext } from '../../shared/context'; -import { useIsExperimentalFeatureEnabled } from '../../../../common/hooks/use_experimental_features'; import { useExpandableFlyoutApi } from '@kbn/expandable-flyout'; import type { EventFieldsData } from '../../../../common/components/event_details/types'; import { TableFieldValueCell } from './table_field_value_cell'; @@ -35,9 +34,6 @@ jest.mock('../../../../common/lib/kibana', () => { }; }); -jest.mock('../../../../common/hooks/use_experimental_features'); -const mockUseIsExperimentalFeatureEnabled = useIsExperimentalFeatureEnabled as jest.Mock; - const panelContextValue = { eventId: 'event id', indexName: 'indexName', @@ -66,7 +62,6 @@ describe('TableFieldValueCell', () => { beforeAll(() => { jest.clearAllMocks(); jest.mocked(useExpandableFlyoutApi).mockReturnValue(mockFlyoutApi); - mockUseIsExperimentalFeatureEnabled.mockReturnValue(false); }); describe('common behavior', () => { @@ -213,7 +208,7 @@ describe('TableFieldValueCell', () => { }); }); - it('should open preview when preview is not disabled', () => { + it('should open preview', () => { screen.getByTestId(`${FLYOUT_TABLE_PREVIEW_LINK_FIELD_TEST_ID}-0`).click(); expect(mockFlyoutApi.openPreviewPanel).toHaveBeenCalledWith({ diff --git a/x-pack/solutions/security/plugins/security_solution/public/flyout/document_details/right/components/table_field_value_cell.tsx b/x-pack/solutions/security/plugins/security_solution/public/flyout/document_details/right/components/table_field_value_cell.tsx index a0095bb8eadf0..17ea9980f1ee0 100644 --- a/x-pack/solutions/security/plugins/security_solution/public/flyout/document_details/right/components/table_field_value_cell.tsx +++ b/x-pack/solutions/security/plugins/security_solution/public/flyout/document_details/right/components/table_field_value_cell.tsx @@ -8,7 +8,6 @@ import React, { memo } from 'react'; import { EuiFlexGroup, EuiFlexItem, EuiText } from '@elastic/eui'; import type { FieldSpec } from '@kbn/data-plugin/common'; -import { useIsExperimentalFeatureEnabled } from '../../../../common/hooks/use_experimental_features'; import { getFieldFormat } from '../utils/get_field_format'; import type { EventFieldsData } from '../../../../common/components/event_details/types'; import { OverflowField } from '../../../../common/components/tables/helpers'; @@ -66,7 +65,6 @@ export const TableFieldValueCell = memo( values, isPreview, }: FieldValueCellProps) => { - const isPreviewEnabled = !useIsExperimentalFeatureEnabled('entityAlertPreviewDisabled'); if (values == null) { return null; } @@ -92,7 +90,7 @@ export const TableFieldValueCell = memo( {data.field === MESSAGE_FIELD_NAME ? ( - ) : isPreviewEnabled && hasPreview(data.field) ? ( + ) : hasPreview(data.field) ? ( { return { @@ -109,7 +102,6 @@ const renderUserEntityOverview = () => describe('', () => { beforeAll(() => { jest.mocked(useExpandableFlyoutApi).mockReturnValue(mockFlyoutApi); - mockUseIsExperimentalFeatureEnabled.mockReturnValue(true); (useMisconfigurationPreview as jest.Mock).mockReturnValue({}); (useAlertsByStatus as jest.Mock).mockReturnValue({ isLoading: false, items: {} }); }); @@ -190,34 +182,9 @@ describe('', () => { expect(queryByTestId(ENTITIES_USER_OVERVIEW_DOMAIN_TEST_ID)).not.toBeInTheDocument(); }); - it('should navigate to left panel entities tab when clicking on title when feature flag is off', () => { - mockUseUserDetails.mockReturnValue([false, { userDetails: userData }]); - mockUseRiskScore.mockReturnValue({ data: riskLevel, isAuthorized: true }); - - const { getByTestId } = render( - - - - - - ); - - getByTestId(ENTITIES_USER_OVERVIEW_LINK_TEST_ID).click(); - expect(mockFlyoutApi.openLeftPanel).toHaveBeenCalledWith({ - id: DocumentDetailsLeftPanelKey, - path: { tab: LeftPanelInsightsTab, subTab: ENTITIES_TAB_ID }, - params: { - id: panelContextValue.eventId, - indexName: panelContextValue.indexName, - scopeId: panelContextValue.scopeId, - }, - }); - }); - - it('should open user preview if feature flag is true', () => { + it('should open user preview', () => { mockUseUserDetails.mockReturnValue([false, { userDetails: userData }]); mockUseRiskScore.mockReturnValue({ data: riskLevel, isAuthorized: true }); - mockUseIsExperimentalFeatureEnabled.mockReturnValue(false); const { getByTestId } = render( diff --git a/x-pack/solutions/security/plugins/security_solution/public/flyout/document_details/right/components/user_entity_overview.tsx b/x-pack/solutions/security/plugins/security_solution/public/flyout/document_details/right/components/user_entity_overview.tsx index 1008f6139cd67..22f889a61c54e 100644 --- a/x-pack/solutions/security/plugins/security_solution/public/flyout/document_details/right/components/user_entity_overview.tsx +++ b/x-pack/solutions/security/plugins/security_solution/public/flyout/document_details/right/components/user_entity_overview.tsx @@ -5,13 +5,12 @@ * 2.0. */ -import React, { useCallback, useMemo } from 'react'; +import React, { useMemo } from 'react'; import { EuiFlexGroup, EuiFlexItem, EuiIcon, EuiText, - EuiLink, useEuiTheme, useEuiFontSize, EuiSkeletonText, @@ -19,11 +18,6 @@ import { import { css } from '@emotion/css'; import { getOr } from 'lodash/fp'; import { i18n } from '@kbn/i18n'; -import { useExpandableFlyoutApi } from '@kbn/expandable-flyout'; -import { useIsExperimentalFeatureEnabled } from '../../../../common/hooks/use_experimental_features'; -import { DocumentDetailsLeftPanelKey } from '../../shared/constants/panel_keys'; -import { LeftPanelInsightsTab } from '../../left'; -import { ENTITIES_TAB_ID } from '../../left/components/entities_details'; import { useDocumentDetailsContext } from '../../shared/context'; import type { DescriptionList } from '../../../../../common/utility_types'; import { USER_NAME_FIELD_NAME } from '../../../../timelines/components/timeline/body/renderers/constants'; @@ -83,22 +77,7 @@ export const USER_PREVIEW_BANNER = { * User preview content for the entities preview in right flyout. It contains ip addresses and risk level */ export const UserEntityOverview: React.FC = ({ userName }) => { - const { eventId, indexName, scopeId } = useDocumentDetailsContext(); - const { openLeftPanel } = useExpandableFlyoutApi(); - - const isPreviewEnabled = !useIsExperimentalFeatureEnabled('entityAlertPreviewDisabled'); - - const goToEntitiesTab = useCallback(() => { - openLeftPanel({ - id: DocumentDetailsLeftPanelKey, - path: { tab: LeftPanelInsightsTab, subTab: ENTITIES_TAB_ID }, - params: { - id: eventId, - indexName, - scopeId, - }, - }); - }, [eventId, openLeftPanel, indexName, scopeId]); + const { scopeId } = useDocumentDetailsContext(); const { from, to } = useGlobalTime(); const { selectedPatterns } = useSourcererDataView(); @@ -210,34 +189,21 @@ export const UserEntityOverview: React.FC = ({ userName - {isPreviewEnabled ? ( - - - {userName} - - - ) : ( - + {userName} - - )} + + From af953f4f6113b96b83d1254b6412268985172134 Mon Sep 17 00:00:00 2001 From: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> Date: Wed, 18 Dec 2024 11:38:06 +1100 Subject: [PATCH 19/23] [8.x] [Response Ops][Task Manager] Changing task manager `schedule.interval` schema to string from duration (#204413) (#204669) # Backport This will backport the following commits from `main` to `8.x`: - [[Response Ops][Task Manager] Changing task manager `schedule.interval` schema to string from duration (#204413)](https://github.com/elastic/kibana/pull/204413) ### Questions ? Please refer to the [Backport tool documentation](https://github.com/sqren/backport) Co-authored-by: Ying Mao --- .../model_versions/task_model_versions.ts | 4 ++++ .../server/saved_objects/schemas/task.test.ts | 24 +++++++++++++++++++ .../server/saved_objects/schemas/task.ts | 9 ++++++- 3 files changed, 36 insertions(+), 1 deletion(-) create mode 100644 x-pack/plugins/task_manager/server/saved_objects/schemas/task.test.ts diff --git a/x-pack/plugins/task_manager/server/saved_objects/model_versions/task_model_versions.ts b/x-pack/plugins/task_manager/server/saved_objects/model_versions/task_model_versions.ts index 775b3ea2f8cad..a86aed7e358fe 100644 --- a/x-pack/plugins/task_manager/server/saved_objects/model_versions/task_model_versions.ts +++ b/x-pack/plugins/task_manager/server/saved_objects/model_versions/task_model_versions.ts @@ -8,6 +8,10 @@ import { SavedObjectsModelVersionMap } from '@kbn/core-saved-objects-server'; import { taskSchemaV1, taskSchemaV2 } from '../schemas/task'; +// IMPORTANT!!! +// When adding new model versions, make sure to manually test +// downgrading to the previous version. This is a gap in our +// automated test coverage so manual testing is needed. export const taskModelVersions: SavedObjectsModelVersionMap = { '1': { changes: [ diff --git a/x-pack/plugins/task_manager/server/saved_objects/schemas/task.test.ts b/x-pack/plugins/task_manager/server/saved_objects/schemas/task.test.ts new file mode 100644 index 0000000000000..709e50bc54bf9 --- /dev/null +++ b/x-pack/plugins/task_manager/server/saved_objects/schemas/task.test.ts @@ -0,0 +1,24 @@ +/* + * 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 { validateDuration } from './task'; + +test('allows valid duration', () => { + expect(validateDuration('1s')).toBeUndefined(); + expect(validateDuration('45346s')).toBeUndefined(); + expect(validateDuration('10m')).toBeUndefined(); + expect(validateDuration('30000000h')).toBeUndefined(); + expect(validateDuration('3245d')).toBeUndefined(); +}); + +test('returns error message for invalid duration', () => { + expect(validateDuration('10x')).toBe('string is not a valid duration: 10x'); + expect(validateDuration('PT1M')).toBe('string is not a valid duration: PT1M'); + expect(validateDuration('foo')).toBe('string is not a valid duration: foo'); + expect(validateDuration('1 minute')).toBe('string is not a valid duration: 1 minute'); + expect(validateDuration('1hr')).toBe('string is not a valid duration: 1hr'); +}); diff --git a/x-pack/plugins/task_manager/server/saved_objects/schemas/task.ts b/x-pack/plugins/task_manager/server/saved_objects/schemas/task.ts index 2a6ee5c92198c..25b6a1cb079d0 100644 --- a/x-pack/plugins/task_manager/server/saved_objects/schemas/task.ts +++ b/x-pack/plugins/task_manager/server/saved_objects/schemas/task.ts @@ -6,6 +6,13 @@ */ import { schema } from '@kbn/config-schema'; +import { isInterval } from '../../lib/intervals'; + +export function validateDuration(duration: string) { + if (!isInterval(duration)) { + return 'string is not a valid duration: ' + duration; + } +} export const taskSchemaV1 = schema.object({ taskType: schema.string(), @@ -15,7 +22,7 @@ export const taskSchemaV1 = schema.object({ runAt: schema.string(), schedule: schema.maybe( schema.object({ - interval: schema.duration(), + interval: schema.string({ validate: validateDuration }), }) ), params: schema.string(), From b86b55a6c06b4e61e04437a636850ff181401338 Mon Sep 17 00:00:00 2001 From: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> Date: Wed, 18 Dec 2024 12:32:36 +1100 Subject: [PATCH 20/23] [8.x] Only run quick checks for changes to renovate.json (#203153) (#204675) # Backport This will backport the following commits from `main` to `8.x`: - [Only run quick checks for changes to renovate.json (#203153)](https://github.com/elastic/kibana/pull/203153) ### Questions ? Please refer to the [Backport tool documentation](https://github.com/sqren/backport) Co-authored-by: Larry Gregory --- .../pipelines/pull_request/renovate.yml | 20 +++++++++++++++++++ .../pipelines/pull_request/pipeline.ts | 8 ++++++++ .buildkite/scripts/steps/renovate.sh | 6 ++++++ 3 files changed, 34 insertions(+) create mode 100644 .buildkite/pipelines/pull_request/renovate.yml create mode 100755 .buildkite/scripts/steps/renovate.sh diff --git a/.buildkite/pipelines/pull_request/renovate.yml b/.buildkite/pipelines/pull_request/renovate.yml new file mode 100644 index 0000000000000..3b441cfe5375a --- /dev/null +++ b/.buildkite/pipelines/pull_request/renovate.yml @@ -0,0 +1,20 @@ +steps: + - command: .buildkite/scripts/lifecycle/pre_build.sh + label: Pre-Build + timeout_in_minutes: 10 + agents: + machineType: n2-standard-2 + + - wait + + - command: .buildkite/scripts/steps/renovate.sh + label: 'Renovate validation' + agents: + machineType: n2-highcpu-8 + preemptible: true + key: renovate_validation + timeout_in_minutes: 60 + retry: + automatic: + - exit_status: '-1' + limit: 3 diff --git a/.buildkite/scripts/pipelines/pull_request/pipeline.ts b/.buildkite/scripts/pipelines/pull_request/pipeline.ts index d7dc166f3b8a1..7f70afc76cb91 100644 --- a/.buildkite/scripts/pipelines/pull_request/pipeline.ts +++ b/.buildkite/scripts/pipelines/pull_request/pipeline.ts @@ -39,6 +39,14 @@ const getPipeline = (filename: string, removeSteps = true) => { return; } + const onlyRunQuickChecks = await areChangesSkippable([/^renovate\.json$/], REQUIRED_PATHS); + if (onlyRunQuickChecks) { + pipeline.push(getPipeline('.buildkite/pipelines/pull_request/renovate.yml', false)); + pipeline.push(getPipeline('.buildkite/pipelines/pull_request/post_build.yml')); + console.log('Isolated changes to renovate.json. Skipping main PR pipeline.'); + return; + } + pipeline.push(getAgentImageConfig({ returnYaml: true })); pipeline.push(getPipeline('.buildkite/pipelines/pull_request/base.yml', false)); diff --git a/.buildkite/scripts/steps/renovate.sh b/.buildkite/scripts/steps/renovate.sh new file mode 100755 index 0000000000000..cc4583e3da216 --- /dev/null +++ b/.buildkite/scripts/steps/renovate.sh @@ -0,0 +1,6 @@ +#!/usr/bin/env bash + +set -euo pipefail + +echo '--- Renovate: validation' +.buildkite/scripts/steps/checks/renovate.sh From 63e0c214b23cbb13a734dc2cea644822fa393920 Mon Sep 17 00:00:00 2001 From: Yuliia Naumenko Date: Tue, 17 Dec 2024 23:22:06 -0800 Subject: [PATCH 21/23] [8.x] [Inference Connector] Modified getProvider to use _inference/_services ES API instead of hardcoded values. (#199047) (#204680) # Backport This will backport the following commits from `main` to `8.x`: - [[Inference Connector] Modified getProvider to use _inference/_services ES API instead of hardcoded values. (#199047)](https://github.com/elastic/kibana/pull/199047) ### Questions ? Please refer to the [Backport tool documentation](https://github.com/sorenlouv/backport) --- .../lib => common}/dynamic_config/types.ts | 0 .../common/inference/types.ts | 15 + .../inference/additional_options_fields.tsx | 4 +- .../inference/connector.test.tsx | 75 +- .../connector_types/inference/connector.tsx | 59 +- .../inference/get_task_types.test.ts | 50 - .../inference/get_task_types.ts | 606 ---------- .../connector_types/inference/helpers.ts | 2 +- .../inference/hidden_fields.tsx | 2 +- .../inference/providers/get_providers.ts | 1022 +---------------- .../service_provider.tsx | 6 +- .../inference/providers/selectable/index.tsx | 23 +- .../public/connector_types/inference/types.ts | 3 - .../connector_configuration_field.tsx | 2 +- .../connector_configuration_form_items.tsx | 2 +- .../connector_configuration_utils.ts | 2 +- .../plugins/stack_connectors/server/plugin.ts | 7 +- .../routes/get_inference_services.test.ts | 133 +++ .../server/routes/get_inference_services.ts | 48 + .../stack_connectors/server/routes/index.ts | 1 + 20 files changed, 301 insertions(+), 1761 deletions(-) rename x-pack/plugins/stack_connectors/{public/connector_types/lib => common}/dynamic_config/types.ts (100%) delete mode 100644 x-pack/plugins/stack_connectors/public/connector_types/inference/get_task_types.test.ts delete mode 100644 x-pack/plugins/stack_connectors/public/connector_types/inference/get_task_types.ts create mode 100644 x-pack/plugins/stack_connectors/server/routes/get_inference_services.test.ts create mode 100644 x-pack/plugins/stack_connectors/server/routes/get_inference_services.ts diff --git a/x-pack/plugins/stack_connectors/public/connector_types/lib/dynamic_config/types.ts b/x-pack/plugins/stack_connectors/common/dynamic_config/types.ts similarity index 100% rename from x-pack/plugins/stack_connectors/public/connector_types/lib/dynamic_config/types.ts rename to x-pack/plugins/stack_connectors/common/dynamic_config/types.ts diff --git a/x-pack/plugins/stack_connectors/common/inference/types.ts b/x-pack/plugins/stack_connectors/common/inference/types.ts index 9dbd447cb4578..b9561efe24292 100644 --- a/x-pack/plugins/stack_connectors/common/inference/types.ts +++ b/x-pack/plugins/stack_connectors/common/inference/types.ts @@ -19,6 +19,7 @@ import { TextEmbeddingParamsSchema, TextEmbeddingResponseSchema, } from './schema'; +import { ConfigProperties } from '../dynamic_config/types'; export type Config = TypeOf; export type Secrets = TypeOf; @@ -36,3 +37,17 @@ export type TextEmbeddingParams = TypeOf; export type TextEmbeddingResponse = TypeOf; export type StreamingResponse = TypeOf; + +export type FieldsConfiguration = Record; + +export interface InferenceTaskType { + task_type: string; + configuration: FieldsConfiguration; +} + +export interface InferenceProvider { + provider: string; + task_types: InferenceTaskType[]; + logo?: string; + configuration: FieldsConfiguration; +} diff --git a/x-pack/plugins/stack_connectors/public/connector_types/inference/additional_options_fields.tsx b/x-pack/plugins/stack_connectors/public/connector_types/inference/additional_options_fields.tsx index 8973f3124bc86..7a3b1abfd800b 100644 --- a/x-pack/plugins/stack_connectors/public/connector_types/inference/additional_options_fields.tsx +++ b/x-pack/plugins/stack_connectors/public/connector_types/inference/additional_options_fields.tsx @@ -32,10 +32,10 @@ import { import { FormattedMessage } from '@kbn/i18n-react'; import { fieldValidators } from '@kbn/es-ui-shared-plugin/static/forms/helpers'; +import { ConfigEntryView } from '../../../common/dynamic_config/types'; import { ConnectorConfigurationFormItems } from '../lib/dynamic_config/connector_configuration_form_items'; import * as i18n from './translations'; import { DEFAULT_TASK_TYPE } from './constants'; -import { ConfigEntryView } from '../lib/dynamic_config/types'; import { Config } from './types'; import { TaskTypeOption } from './helpers'; @@ -52,7 +52,7 @@ interface AdditionalOptionsConnectorFieldsProps { isEdit: boolean; optionalProviderFormFields: ConfigEntryView[]; onSetProviderConfigEntry: (key: string, value: unknown) => Promise; - onTaskTypeOptionsSelect: (taskType: string, provider?: string) => Promise; + onTaskTypeOptionsSelect: (taskType: string, provider?: string) => void; selectedTaskType?: string; taskTypeFormFields: ConfigEntryView[]; taskTypeSchema: ConfigEntryView[]; diff --git a/x-pack/plugins/stack_connectors/public/connector_types/inference/connector.test.tsx b/x-pack/plugins/stack_connectors/public/connector_types/inference/connector.test.tsx index 44632e8b08331..d445504011b5f 100644 --- a/x-pack/plugins/stack_connectors/public/connector_types/inference/connector.test.tsx +++ b/x-pack/plugins/stack_connectors/public/connector_types/inference/connector.test.tsx @@ -12,13 +12,10 @@ import { ConnectorFormTestProvider } from '../lib/test_utils'; import { render, waitFor } from '@testing-library/react'; import userEvent from '@testing-library/user-event'; import { createStartServicesMock } from '@kbn/triggers-actions-ui-plugin/public/common/lib/kibana/kibana_react.mock'; -import { DisplayType, FieldType } from '../lib/dynamic_config/types'; import { useProviders } from './providers/get_providers'; -import { getTaskTypes } from './get_task_types'; -import { HttpSetup } from '@kbn/core-http-browser'; +import { DisplayType, FieldType } from '../../../common/dynamic_config/types'; jest.mock('./providers/get_providers'); -jest.mock('./get_task_types'); const mockUseKibanaReturnValue = createStartServicesMock(); jest.mock('@kbn/triggers-actions-ui-plugin/public/common/lib/kibana', () => ({ @@ -37,13 +34,32 @@ jest.mock('@faker-js/faker', () => ({ })); const mockProviders = useProviders as jest.Mock; -const mockTaskTypes = getTaskTypes as jest.Mock; const providersSchemas = [ { provider: 'openai', logo: '', // should be openai logo here, the hardcoded uses assets/images - taskTypes: ['completion', 'text_embedding'], + task_types: [ + { + task_type: 'completion', + configuration: { + user: { + display: DisplayType.TEXTBOX, + label: 'User', + order: 1, + required: false, + sensitive: false, + tooltip: 'Specifies the user issuing the request.', + type: FieldType.STRING, + validations: [], + value: '', + ui_restrictions: [], + default_value: null, + depends_on: [], + }, + }, + }, + ], configuration: { api_key: { display: DisplayType.TEXTBOX, @@ -106,7 +122,16 @@ const providersSchemas = [ { provider: 'googleaistudio', logo: '', // should be googleaistudio logo here, the hardcoded uses assets/images - taskTypes: ['completion', 'text_embedding'], + task_types: [ + { + task_type: 'completion', + configuration: {}, + }, + { + task_type: 'text_embedding', + configuration: {}, + }, + ], configuration: { api_key: { display: DisplayType.TEXTBOX, @@ -139,39 +164,6 @@ const providersSchemas = [ }, }, ]; -const taskTypesSchemas: Record = { - googleaistudio: [ - { - task_type: 'completion', - configuration: {}, - }, - { - task_type: 'text_embedding', - configuration: {}, - }, - ], - openai: [ - { - task_type: 'completion', - configuration: { - user: { - display: DisplayType.TEXTBOX, - label: 'User', - order: 1, - required: false, - sensitive: false, - tooltip: 'Specifies the user issuing the request.', - type: FieldType.STRING, - validations: [], - value: '', - ui_restrictions: [], - default_value: null, - depends_on: [], - }, - }, - }, - ], -}; const openAiConnector = { actionTypeId: '.inference', @@ -222,9 +214,6 @@ describe('ConnectorFields renders', () => { isLoading: false, data: providersSchemas, }); - mockTaskTypes.mockImplementation( - (http: HttpSetup, provider: string) => taskTypesSchemas[provider] - ); }); test('openai provider fields are rendered', async () => { const { getAllByTestId } = render( diff --git a/x-pack/plugins/stack_connectors/public/connector_types/inference/connector.tsx b/x-pack/plugins/stack_connectors/public/connector_types/inference/connector.tsx index 35314dc06167d..5f854384dbb54 100644 --- a/x-pack/plugins/stack_connectors/public/connector_types/inference/connector.tsx +++ b/x-pack/plugins/stack_connectors/public/connector_types/inference/connector.tsx @@ -5,7 +5,7 @@ * 2.0. */ -import React, { useState, useEffect, useCallback } from 'react'; +import React, { useState, useEffect, useCallback, useMemo } from 'react'; import { EuiFormRow, EuiSpacer, @@ -31,12 +31,12 @@ import { import { useKibana } from '@kbn/triggers-actions-ui-plugin/public'; import { fieldValidators } from '@kbn/es-ui-shared-plugin/static/forms/helpers'; +import { ConfigEntryView } from '../../../common/dynamic_config/types'; +import { InferenceTaskType } from '../../../common/inference/types'; import { ServiceProviderKeys } from '../../../common/inference/constants'; import { ConnectorConfigurationFormItems } from '../lib/dynamic_config/connector_configuration_form_items'; -import { getTaskTypes } from './get_task_types'; import * as i18n from './translations'; import { DEFAULT_TASK_TYPE } from './constants'; -import { ConfigEntryView } from '../lib/dynamic_config/types'; import { SelectableProvider } from './providers/selectable'; import { Config, Secrets } from './types'; import { generateInferenceEndpointId, getTaskTypeOptions, TaskTypeOption } from './helpers'; @@ -116,13 +116,13 @@ const InferenceAPIConnectorFields: React.FunctionComponent { + (taskType: string, provider?: string) => { // Get task type settings - const currentTaskTypes = await getTaskTypes(http, provider ?? config?.provider); + const currentProvider = providers?.find((p) => p.provider === (provider ?? config?.provider)); + const currentTaskTypes = currentProvider?.task_types; const newTaskType = currentTaskTypes?.find((p) => p.task_type === taskType); setSelectedTaskType(taskType); - generateInferenceEndpointId(config, setFieldValue); // transform the schema const newTaskTypeSchema = Object.keys(newTaskType?.configuration ?? {}).map((k) => ({ @@ -150,19 +150,23 @@ const InferenceAPIConnectorFields: React.FunctionComponent { + (provider?: string) => { const newProvider = providers?.find((p) => p.provider === provider); // Update task types list available for the selected provider - const providerTaskTypes = newProvider?.taskTypes ?? []; + const providerTaskTypes = (newProvider?.task_types ?? []).map((t) => t.task_type); setTaskTypeOptions(getTaskTypeOptions(providerTaskTypes)); if (providerTaskTypes.length > 0) { - await onTaskTypeOptionsSelect(providerTaskTypes[0], provider); + onTaskTypeOptionsSelect(providerTaskTypes[0], provider); } // Update connector providerSchema @@ -203,9 +207,8 @@ const InferenceAPIConnectorFields: React.FunctionComponent { - const getTaskTypeSchema = async () => { - const currentTaskTypes = await getTaskTypes(http, config?.provider ?? ''); - const newTaskType = currentTaskTypes?.find((p) => p.task_type === config?.taskType); + const getTaskTypeSchema = (taskTypes: InferenceTaskType[]) => { + const newTaskType = taskTypes.find((p) => p.task_type === config?.taskType); // transform the schema const newTaskTypeSchema = Object.keys(newTaskType?.configuration ?? {}).map((k) => ({ @@ -228,7 +231,7 @@ const InferenceAPIConnectorFields: React.FunctionComponent + Object.keys(SERVICE_PROVIDERS).includes(config?.provider) + ? SERVICE_PROVIDERS[config?.provider as ServiceProviderKeys].icon + : undefined, + [config?.provider] + ); + + const providerName = useMemo( + () => + Object.keys(SERVICE_PROVIDERS).includes(config?.provider) + ? SERVICE_PROVIDERS[config?.provider as ServiceProviderKeys].name + : config?.provider, + [config?.provider] + ); + const providerSuperSelect = useCallback( (isInvalid: boolean) => ( jest.resetAllMocks()); - -describe.skip('getTaskTypes', () => { - test('should call get inference task types api', async () => { - const apiResponse = { - amazonbedrock: [ - { - task_type: 'completion', - configuration: { - max_new_tokens: { - display: DisplayType.NUMERIC, - label: 'Max new tokens', - order: 1, - required: false, - sensitive: false, - tooltip: 'Sets the maximum number for the output tokens to be generated.', - type: FieldType.INTEGER, - validations: [], - value: null, - ui_restrictions: [], - default_value: null, - depends_on: [], - }, - }, - }, - { - task_type: 'text_embedding', - configuration: {}, - }, - ], - }; - http.get.mockResolvedValueOnce(apiResponse); - - const result = await getTaskTypes(http, 'amazonbedrock'); - expect(result).toEqual(apiResponse); - }); -}); diff --git a/x-pack/plugins/stack_connectors/public/connector_types/inference/get_task_types.ts b/x-pack/plugins/stack_connectors/public/connector_types/inference/get_task_types.ts deleted file mode 100644 index a4fbbd6a6288b..0000000000000 --- a/x-pack/plugins/stack_connectors/public/connector_types/inference/get_task_types.ts +++ /dev/null @@ -1,606 +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 type { HttpSetup } from '@kbn/core-http-browser'; -import { DisplayType, FieldType } from '../lib/dynamic_config/types'; -import { FieldsConfiguration } from './types'; - -export interface InferenceTaskType { - task_type: string; - configuration: FieldsConfiguration; -} - -// this http param is for the future migrating to real API -export const getTaskTypes = (http: HttpSetup, provider: string): Promise => { - const providersTaskTypes: Record = { - openai: [ - { - task_type: 'completion', - configuration: { - user: { - display: DisplayType.TEXTBOX, - label: 'User', - order: 1, - required: false, - sensitive: false, - tooltip: 'Specifies the user issuing the request.', - type: FieldType.STRING, - validations: [], - value: '', - ui_restrictions: [], - default_value: null, - depends_on: [], - }, - }, - }, - { - task_type: 'text_embedding', - configuration: { - user: { - display: DisplayType.TEXTBOX, - label: 'User', - order: 1, - required: false, - sensitive: false, - tooltip: 'Specifies the user issuing the request.', - type: FieldType.STRING, - validations: [], - value: '', - ui_restrictions: [], - default_value: null, - depends_on: [], - }, - }, - }, - ], - mistral: [ - { - task_type: 'text_embedding', - configuration: {}, - }, - ], - hugging_face: [ - { - task_type: 'text_embedding', - configuration: {}, - }, - ], - googlevertexai: [ - { - task_type: 'text_embedding', - configuration: { - auto_truncate: { - display: DisplayType.TOGGLE, - label: 'Auto truncate', - order: 1, - required: false, - sensitive: false, - tooltip: - 'Specifies if the API truncates inputs longer than the maximum token length automatically.', - type: FieldType.BOOLEAN, - validations: [], - value: false, - ui_restrictions: [], - default_value: null, - depends_on: [], - }, - }, - }, - { - task_type: 'rerank', - configuration: { - top_n: { - display: DisplayType.TOGGLE, - label: 'Top N', - order: 1, - required: false, - sensitive: false, - tooltip: 'Specifies the number of the top n documents, which should be returned.', - type: FieldType.BOOLEAN, - validations: [], - value: false, - ui_restrictions: [], - default_value: null, - depends_on: [], - }, - }, - }, - ], - googleaistudio: [ - { - task_type: 'completion', - configuration: {}, - }, - { - task_type: 'text_embedding', - configuration: {}, - }, - ], - elasticsearch: [ - { - task_type: 'rerank', - configuration: { - return_documents: { - display: DisplayType.TOGGLE, - label: 'Return documents', - options: [], - order: 1, - required: false, - sensitive: false, - tooltip: 'Returns the document instead of only the index.', - type: FieldType.BOOLEAN, - validations: [], - value: true, - ui_restrictions: [], - default_value: null, - depends_on: [], - }, - }, - }, - { - task_type: 'sparse_embedding', - configuration: {}, - }, - { - task_type: 'text_embedding', - configuration: {}, - }, - ], - cohere: [ - { - task_type: 'completion', - configuration: {}, - }, - { - task_type: 'text_embedding', - configuration: { - input_type: { - display: DisplayType.DROPDOWN, - label: 'Input type', - order: 1, - required: false, - sensitive: false, - tooltip: 'Specifies the type of input passed to the model.', - type: FieldType.STRING, - validations: [], - options: [ - { - label: 'classification', - value: 'classification', - }, - { - label: 'clusterning', - value: 'clusterning', - }, - { - label: 'ingest', - value: 'ingest', - }, - { - label: 'search', - value: 'search', - }, - ], - value: '', - ui_restrictions: [], - default_value: null, - depends_on: [], - }, - truncate: { - display: DisplayType.DROPDOWN, - options: [ - { - label: 'NONE', - value: 'NONE', - }, - { - label: 'START', - value: 'START', - }, - { - label: 'END', - value: 'END', - }, - ], - label: 'Truncate', - order: 2, - required: false, - sensitive: false, - tooltip: 'Specifies how the API handles inputs longer than the maximum token length.', - type: FieldType.STRING, - validations: [], - value: '', - ui_restrictions: [], - default_value: null, - depends_on: [], - }, - }, - }, - { - task_type: 'rerank', - configuration: { - return_documents: { - display: DisplayType.TOGGLE, - label: 'Return documents', - order: 1, - required: false, - sensitive: false, - tooltip: 'Specify whether to return doc text within the results.', - type: FieldType.BOOLEAN, - validations: [], - value: false, - ui_restrictions: [], - default_value: null, - depends_on: [], - }, - top_n: { - display: DisplayType.NUMERIC, - label: 'Top N', - order: 1, - required: false, - sensitive: false, - tooltip: - 'The number of most relevant documents to return, defaults to the number of the documents.', - type: FieldType.INTEGER, - validations: [], - value: false, - ui_restrictions: [], - default_value: null, - depends_on: [], - }, - }, - }, - ], - azureopenai: [ - { - task_type: 'completion', - configuration: { - user: { - display: DisplayType.TEXTBOX, - label: 'User', - order: 1, - required: false, - sensitive: false, - tooltip: 'Specifies the user issuing the request.', - type: FieldType.STRING, - validations: [], - value: '', - ui_restrictions: [], - default_value: null, - depends_on: [], - }, - }, - }, - { - task_type: 'text_embedding', - configuration: { - user: { - display: DisplayType.TEXTBOX, - label: 'User', - order: 1, - required: false, - sensitive: false, - tooltip: 'Specifies the user issuing the request.', - type: FieldType.STRING, - validations: [], - value: '', - ui_restrictions: [], - default_value: null, - depends_on: [], - }, - }, - }, - ], - azureaistudio: [ - { - task_type: 'completion', - configuration: { - user: { - display: DisplayType.TEXTBOX, - label: 'User', - order: 1, - required: false, - sensitive: false, - tooltip: 'Specifies the user issuing the request.', - type: FieldType.STRING, - validations: [], - value: '', - ui_restrictions: [], - default_value: null, - depends_on: [], - }, - }, - }, - { - task_type: 'text_embedding', - configuration: { - do_sample: { - display: DisplayType.NUMERIC, - label: 'Do sample', - order: 1, - required: false, - sensitive: false, - tooltip: 'Instructs the inference process to perform sampling or not.', - type: FieldType.INTEGER, - validations: [], - value: null, - ui_restrictions: [], - default_value: null, - depends_on: [], - }, - max_new_tokens: { - display: DisplayType.NUMERIC, - label: 'Max new tokens', - order: 1, - required: false, - sensitive: false, - tooltip: 'Provides a hint for the maximum number of output tokens to be generated.', - type: FieldType.INTEGER, - validations: [], - value: null, - ui_restrictions: [], - default_value: null, - depends_on: [], - }, - temperature: { - display: DisplayType.NUMERIC, - label: 'Temperature', - order: 1, - required: false, - sensitive: false, - tooltip: 'A number in the range of 0.0 to 2.0 that specifies the sampling temperature.', - type: FieldType.INTEGER, - validations: [], - value: null, - ui_restrictions: [], - default_value: null, - depends_on: [], - }, - top_p: { - display: DisplayType.NUMERIC, - label: 'Top P', - order: 1, - required: false, - sensitive: false, - tooltip: - 'A number in the range of 0.0 to 2.0 that is an alternative value to temperature. Should not be used if temperature is specified.', - type: FieldType.INTEGER, - validations: [], - value: null, - ui_restrictions: [], - default_value: null, - depends_on: [], - }, - }, - }, - ], - amazonbedrock: [ - { - task_type: 'completion', - configuration: { - max_new_tokens: { - display: DisplayType.NUMERIC, - label: 'Max new tokens', - order: 1, - required: false, - sensitive: false, - tooltip: 'Sets the maximum number for the output tokens to be generated.', - type: FieldType.INTEGER, - validations: [], - value: null, - ui_restrictions: [], - default_value: null, - depends_on: [], - }, - temperature: { - display: DisplayType.NUMERIC, - label: 'Temperature', - order: 1, - required: false, - sensitive: false, - tooltip: - 'A number between 0.0 and 1.0 that controls the apparent creativity of the results.', - type: FieldType.INTEGER, - validations: [], - value: null, - ui_restrictions: [], - default_value: null, - depends_on: [], - }, - top_p: { - display: DisplayType.NUMERIC, - label: 'Top P', - order: 1, - required: false, - sensitive: false, - tooltip: - 'Alternative to temperature. A number in the range of 0.0 to 1.0, to eliminate low-probability tokens.', - type: FieldType.INTEGER, - validations: [], - value: null, - ui_restrictions: [], - default_value: null, - depends_on: [], - }, - top_k: { - display: DisplayType.NUMERIC, - label: 'Top K', - order: 1, - required: false, - sensitive: false, - tooltip: - 'Only available for anthropic, cohere, and mistral providers. Alternative to temperature.', - type: FieldType.INTEGER, - validations: [], - value: null, - ui_restrictions: [], - default_value: null, - depends_on: [], - }, - }, - }, - { - task_type: 'text_embedding', - configuration: {}, - }, - ], - anthropic: [ - { - task_type: 'completion', - configuration: { - max_tokens: { - display: DisplayType.NUMERIC, - label: 'Max tokens', - order: 1, - required: true, - sensitive: false, - tooltip: 'The maximum number of tokens to generate before stopping.', - type: FieldType.INTEGER, - validations: [], - value: null, - ui_restrictions: [], - default_value: null, - depends_on: [], - }, - temperature: { - display: DisplayType.TEXTBOX, - label: 'Temperature', - order: 2, - required: false, - sensitive: false, - tooltip: 'The amount of randomness injected into the response.', - type: FieldType.STRING, - validations: [], - value: null, - ui_restrictions: [], - default_value: null, - depends_on: [], - }, - top_p: { - display: DisplayType.NUMERIC, - label: 'Top P', - order: 4, - required: false, - sensitive: false, - tooltip: 'Specifies to use Anthropic’s nucleus sampling.', - type: FieldType.INTEGER, - validations: [], - value: null, - ui_restrictions: [], - default_value: null, - depends_on: [], - }, - top_k: { - display: DisplayType.NUMERIC, - label: 'Top K', - order: 3, - required: false, - sensitive: false, - tooltip: 'Specifies to only sample from the top K options for each subsequent token.', - type: FieldType.INTEGER, - validations: [], - value: null, - ui_restrictions: [], - default_value: null, - depends_on: [], - }, - }, - }, - ], - 'alibabacloud-ai-search': [ - { - task_type: 'text_embedding', - configuration: { - input_type: { - display: DisplayType.DROPDOWN, - label: 'Input type', - order: 1, - required: false, - sensitive: false, - tooltip: 'Specifies the type of input passed to the model.', - type: FieldType.STRING, - validations: [], - options: [ - { - label: 'ingest', - value: 'ingest', - }, - { - label: 'search', - value: 'search', - }, - ], - value: '', - ui_restrictions: [], - default_value: null, - depends_on: [], - }, - }, - }, - { - task_type: 'sparse_embedding', - configuration: { - input_type: { - display: DisplayType.DROPDOWN, - label: 'Input type', - order: 1, - required: false, - sensitive: false, - tooltip: 'Specifies the type of input passed to the model.', - type: FieldType.STRING, - validations: [], - options: [ - { - label: 'ingest', - value: 'ingest', - }, - { - label: 'search', - value: 'search', - }, - ], - value: '', - ui_restrictions: [], - default_value: null, - depends_on: [], - }, - return_token: { - display: DisplayType.TOGGLE, - label: 'Return token', - options: [], - order: 1, - required: false, - sensitive: false, - tooltip: - 'If `true`, the token name will be returned in the response. Defaults to `false` which means only the token ID will be returned in the response.', - type: FieldType.BOOLEAN, - validations: [], - value: true, - ui_restrictions: [], - default_value: null, - depends_on: [], - }, - }, - }, - { - task_type: 'completion', - configuration: {}, - }, - { - task_type: 'rerank', - configuration: {}, - }, - ], - watsonxai: [ - { - task_type: 'text_embedding', - configuration: {}, - }, - ], - }; - return Promise.resolve(providersTaskTypes[provider]); -}; diff --git a/x-pack/plugins/stack_connectors/public/connector_types/inference/helpers.ts b/x-pack/plugins/stack_connectors/public/connector_types/inference/helpers.ts index 0e1e4cdaa41ad..8638caa998eff 100644 --- a/x-pack/plugins/stack_connectors/public/connector_types/inference/helpers.ts +++ b/x-pack/plugins/stack_connectors/public/connector_types/inference/helpers.ts @@ -7,7 +7,7 @@ import { isEmpty } from 'lodash/fp'; import { ValidationFunc } from '@kbn/es-ui-shared-plugin/static/forms/hook_form_lib'; -import { ConfigEntryView } from '../lib/dynamic_config/types'; +import { ConfigEntryView } from '../../../common/dynamic_config/types'; import { Config } from './types'; import * as i18n from './translations'; diff --git a/x-pack/plugins/stack_connectors/public/connector_types/inference/hidden_fields.tsx b/x-pack/plugins/stack_connectors/public/connector_types/inference/hidden_fields.tsx index 9b28d35aaaf3a..f6df891b4b9c8 100644 --- a/x-pack/plugins/stack_connectors/public/connector_types/inference/hidden_fields.tsx +++ b/x-pack/plugins/stack_connectors/public/connector_types/inference/hidden_fields.tsx @@ -8,8 +8,8 @@ import React from 'react'; import { HiddenField } from '@kbn/es-ui-shared-plugin/static/forms/components'; import { UseField } from '@kbn/es-ui-shared-plugin/static/forms/hook_form_lib'; +import { ConfigEntryView } from '../../../common/dynamic_config/types'; import { getNonEmptyValidator } from './helpers'; -import { ConfigEntryView } from '../lib/dynamic_config/types'; export const getProviderSecretsHiddenField = ( providerSchema: ConfigEntryView[], diff --git a/x-pack/plugins/stack_connectors/public/connector_types/inference/providers/get_providers.ts b/x-pack/plugins/stack_connectors/public/connector_types/inference/providers/get_providers.ts index 109266c1273fc..badc0cb61030d 100644 --- a/x-pack/plugins/stack_connectors/public/connector_types/inference/providers/get_providers.ts +++ b/x-pack/plugins/stack_connectors/public/connector_types/inference/providers/get_providers.ts @@ -9,1025 +9,11 @@ import type { HttpSetup } from '@kbn/core-http-browser'; import { i18n } from '@kbn/i18n'; import { useQuery } from '@tanstack/react-query'; import type { ToastsStart } from '@kbn/core-notifications-browser'; -import { DisplayType, FieldType } from '../../lib/dynamic_config/types'; -import { FieldsConfiguration } from '../types'; +import { INTERNAL_BASE_STACK_CONNECTORS_API_PATH } from '../../../../common'; +import { InferenceProvider } from '../../../../common/inference/types'; -export interface InferenceProvider { - provider: string; - taskTypes: string[]; - logo?: string; - configuration: FieldsConfiguration; -} - -export const getProviders = (http: HttpSetup): Promise => { - const providers = [ - { - provider: 'openai', - logo: '', // should be openai logo here, the hardcoded uses assets/images - taskTypes: ['completion', 'text_embedding'], - configuration: { - api_key: { - display: DisplayType.TEXTBOX, - label: 'API Key', - order: 3, - required: true, - sensitive: true, - tooltip: `The OpenAI API authentication key. For more details about generating OpenAI API keys, refer to the https://platform.openai.com/account/api-keys.`, - type: FieldType.STRING, - validations: [], - value: null, - ui_restrictions: [], - default_value: null, - depends_on: [], - }, - model_id: { - display: DisplayType.TEXTBOX, - label: 'Model ID', - order: 2, - required: true, - sensitive: false, - tooltip: 'The name of the model to use for the inference task.', - type: FieldType.STRING, - validations: [], - value: null, - ui_restrictions: [], - default_value: null, - depends_on: [], - }, - organization_id: { - display: DisplayType.TEXTBOX, - label: 'Organization ID', - order: 4, - required: false, - sensitive: false, - tooltip: 'The unique identifier of your organization.', - type: FieldType.STRING, - validations: [], - value: null, - ui_restrictions: [], - default_value: null, - depends_on: [], - }, - url: { - display: DisplayType.TEXTBOX, - label: 'URL', - order: 1, - required: true, - sensitive: false, - tooltip: - 'The OpenAI API endpoint URL. For more information on the URL, refer to the https://platform.openai.com/docs/api-reference.', - type: FieldType.STRING, - validations: [], - value: null, - ui_restrictions: [], - default_value: 'https://api.openai.com/v1/chat/completions', - depends_on: [], - }, - 'rate_limit.requests_per_minute': { - display: DisplayType.NUMERIC, - label: 'Rate limit', - order: 5, - required: false, - sensitive: false, - tooltip: - 'Default number of requests allowed per minute. For text_embedding is 3000. For completion is 500.', - type: FieldType.INTEGER, - validations: [], - value: null, - ui_restrictions: [], - default_value: null, - depends_on: [], - }, - }, - }, - { - provider: 'googleaistudio', - logo: '', // should be googleaistudio logo here, the hardcoded uses assets/images - taskTypes: ['completion', 'text_embedding'], - configuration: { - api_key: { - display: DisplayType.TEXTBOX, - label: 'API Key', - order: 1, - required: true, - sensitive: true, - tooltip: `API Key for the provider you're connecting to`, - type: FieldType.STRING, - validations: [], - value: null, - ui_restrictions: [], - default_value: null, - depends_on: [], - }, - model_id: { - display: DisplayType.TEXTBOX, - label: 'Model ID', - order: 2, - required: true, - sensitive: false, - tooltip: `ID of the LLM you're using`, - type: FieldType.STRING, - validations: [], - value: null, - ui_restrictions: [], - default_value: null, - depends_on: [], - }, - 'rate_limit.requests_per_minute': { - display: DisplayType.NUMERIC, - label: 'Rate limit', - order: 5, - required: false, - sensitive: false, - tooltip: 'Minimize the number of rate limit errors.', - type: FieldType.INTEGER, - validations: [], - value: null, - ui_restrictions: [], - default_value: null, - depends_on: [], - }, - }, - }, - { - provider: 'amazonbedrock', - logo: '', // should be amazonbedrock logo here, the hardcoded uses assets/images - taskTypes: ['completion', 'text_embedding'], - configuration: { - access_key: { - display: DisplayType.TEXTBOX, - label: 'Access Key', - order: 1, - required: true, - sensitive: true, - tooltip: `A valid AWS access key that has permissions to use Amazon Bedrock.`, - type: FieldType.STRING, - validations: [], - value: null, - ui_restrictions: [], - default_value: null, - depends_on: [], - }, - secret_key: { - display: DisplayType.TEXTBOX, - label: 'Secret Key', - order: 2, - required: true, - sensitive: true, - tooltip: `A valid AWS secret key that is paired with the access_key.`, - type: FieldType.STRING, - validations: [], - value: null, - ui_restrictions: [], - default_value: null, - depends_on: [], - }, - provider: { - display: DisplayType.DROPDOWN, - label: 'Provider', - order: 3, - required: true, - options: [ - { - label: 'amazontitan', - value: 'amazontitan', - }, - { - label: 'anthropic', - value: 'anthropic', - }, - { - label: 'ai21labs', - value: 'ai21labs', - }, - { - label: 'cohere', - value: 'cohere', - }, - { - label: 'meta', - value: 'meta', - }, - { - label: 'mistral', - value: 'mistral', - }, - ], - sensitive: false, - tooltip: 'The model provider for your deployment.', - type: FieldType.STRING, - validations: [], - value: null, - ui_restrictions: [], - default_value: null, - depends_on: [], - }, - model: { - display: DisplayType.TEXTBOX, - label: 'Model', - order: 4, - required: true, - sensitive: false, - tooltip: `The base model ID or an ARN to a custom model based on a foundational model.`, - type: FieldType.STRING, - validations: [], - value: null, - ui_restrictions: [], - default_value: null, - depends_on: [], - }, - region: { - display: DisplayType.TEXTBOX, - label: 'Region', - order: 5, - required: true, - sensitive: false, - tooltip: `The region that your model or ARN is deployed in.`, - type: FieldType.STRING, - validations: [], - value: null, - ui_restrictions: [], - default_value: null, - depends_on: [], - }, - 'rate_limit.requests_per_minute': { - display: DisplayType.NUMERIC, - label: 'Rate limit', - order: 6, - required: false, - sensitive: false, - tooltip: - 'By default, the amazonbedrock service sets the number of requests allowed per minute to 240.', - type: FieldType.INTEGER, - validations: [], - value: null, - ui_restrictions: [], - default_value: null, - depends_on: [], - }, - }, - }, - { - provider: 'googlevertexai', - logo: '', // should be googlevertexai logo here, the hardcoded uses assets/images - taskTypes: ['text_embedding', 'rerank'], - configuration: { - service_account_json: { - display: DisplayType.TEXTBOX, - label: 'Credentials JSON', - order: 1, - required: true, - sensitive: true, - tooltip: `API Key for the provider you're connecting to`, - type: FieldType.STRING, - validations: [], - value: null, - ui_restrictions: [], - default_value: null, - depends_on: [], - }, - model_id: { - display: DisplayType.TEXTBOX, - label: 'Model ID', - order: 2, - required: true, - sensitive: false, - tooltip: `ID of the LLM you're using`, - type: FieldType.STRING, - validations: [], - value: null, - ui_restrictions: [], - default_value: null, - depends_on: [], - }, - location: { - display: DisplayType.TEXTBOX, - label: 'GCP Region', - order: 2, - required: true, - sensitive: false, - tooltip: `Please provide the GCP region where the Vertex AI API(s) is enabled. For more information, refer to the {geminiVertexAIDocs}.`, - type: FieldType.STRING, - validations: [], - value: null, - ui_restrictions: [], - default_value: null, - depends_on: [], - }, - project_id: { - display: DisplayType.TEXTBOX, - label: 'GCP Project', - order: 3, - required: true, - sensitive: false, - tooltip: - 'The GCP Project ID which has Vertex AI API(s) enabled. For more information on the URL, refer to the {geminiVertexAIDocs}.', - type: FieldType.STRING, - validations: [], - value: null, - ui_restrictions: [], - default_value: null, - depends_on: [], - }, - 'rate_limit.requests_per_minute': { - display: DisplayType.NUMERIC, - label: 'Rate limit', - order: 5, - required: false, - sensitive: false, - tooltip: 'Minimize the number of rate limit errors.', - type: FieldType.INTEGER, - validations: [], - value: null, - ui_restrictions: [], - default_value: null, - depends_on: [], - }, - }, - }, - { - provider: 'mistral', - logo: '', // should be misral logo here, the hardcoded uses assets/images - taskTypes: ['text_embedding'], - configuration: { - api_key: { - display: DisplayType.TEXTBOX, - label: 'API Key', - order: 1, - required: true, - sensitive: true, - tooltip: `API Key for the provider you're connecting to`, - type: FieldType.STRING, - validations: [], - value: null, - ui_restrictions: [], - default_value: null, - depends_on: [], - }, - model: { - display: DisplayType.TEXTBOX, - label: 'Model', - order: 2, - required: true, - sensitive: false, - tooltip: `Refer to the Mistral models documentation for the list of available text embedding models`, - type: FieldType.STRING, - validations: [], - value: null, - ui_restrictions: [], - default_value: null, - depends_on: [], - }, - 'rate_limit.requests_per_minute': { - display: DisplayType.NUMERIC, - label: 'Rate limit', - order: 4, - required: false, - sensitive: false, - tooltip: 'Minimize the number of rate limit errors.', - type: FieldType.INTEGER, - validations: [], - value: null, - ui_restrictions: [], - default_value: 240, - depends_on: [], - }, - max_input_tokens: { - display: DisplayType.NUMERIC, - label: 'Maximum input tokens', - order: 3, - required: false, - sensitive: false, - tooltip: 'Allows you to specify the maximum number of tokens per input.', - type: FieldType.INTEGER, - validations: [], - value: null, - ui_restrictions: [], - default_value: null, - depends_on: [], - }, - }, - }, - { - provider: 'hugging_face', - logo: '', // should be hugging_face logo here, the hardcoded uses assets/images - taskTypes: ['text_embedding'], - configuration: { - api_key: { - display: DisplayType.TEXTBOX, - label: 'API Key', - order: 2, - required: true, - sensitive: true, - tooltip: `API Key for the provider you're connecting to`, - type: FieldType.STRING, - validations: [], - value: null, - ui_restrictions: [], - default_value: null, - depends_on: [], - }, - url: { - display: DisplayType.TEXTBOX, - label: 'URL', - order: 1, - required: true, - sensitive: false, - tooltip: 'The URL endpoint to use for the requests.', - type: FieldType.STRING, - validations: [], - value: 'https://api.openai.com/v1/embeddings', - ui_restrictions: [], - default_value: 'https://api.openai.com/v1/embeddings', - depends_on: [], - }, - 'rate_limit.requests_per_minute': { - display: DisplayType.NUMERIC, - label: 'Rate limit', - order: 3, - required: false, - sensitive: false, - tooltip: 'Minimize the number of rate limit errors.', - type: FieldType.INTEGER, - validations: [], - value: null, - ui_restrictions: [], - default_value: null, - depends_on: [], - }, - }, - }, - { - provider: 'elasticsearch', - logo: '', // elasticsearch logo here - taskTypes: ['sparse_embedding', 'text_embedding', 'rerank'], - configuration: { - model_id: { - display: DisplayType.DROPDOWN, - label: 'Model ID', - order: 1, - required: true, - sensitive: false, - tooltip: `The name of the model to use for the inference task.`, - type: FieldType.STRING, - validations: [], - options: [ - { - label: '.elser_model_1', - value: '.elser_model_1', - }, - { - label: '.elser_model_2', - value: '.elser_model_2', - }, - { - label: '.elser_model_2_linux-x86_64', - value: '.elser_model_2_linux-x86_64', - }, - { - label: '.multilingual-e5-small', - value: '.multilingual-e5-small', - }, - { - label: '.multilingual-e5-small_linux-x86_64', - value: '.multilingual-e5-small_linux-x86_64', - }, - ], - value: null, - ui_restrictions: [], - default_value: '.multilingual-e5-small', - depends_on: [], - }, - num_allocations: { - display: DisplayType.NUMERIC, - label: 'Number allocations', - order: 2, - required: true, - sensitive: false, - tooltip: - 'The total number of allocations this model is assigned across machine learning nodes.', - type: FieldType.INTEGER, - validations: [], - value: null, - ui_restrictions: [], - default_value: 1, - depends_on: [], - }, - num_threads: { - display: DisplayType.NUMERIC, - label: 'Number threads', - order: 3, - required: true, - sensitive: false, - tooltip: 'Sets the number of threads used by each model allocation during inference.', - type: FieldType.INTEGER, - validations: [], - value: null, - ui_restrictions: [], - default_value: 2, - depends_on: [], - }, - }, - }, - { - provider: 'cohere', - logo: '', // should be cohere logo here, the hardcoded uses assets/images - taskTypes: ['completion', 'text_embedding', 'rerank'], - configuration: { - api_key: { - display: DisplayType.TEXTBOX, - label: 'API Key', - order: 1, - required: true, - sensitive: true, - tooltip: `API Key for the provider you're connecting to`, - type: FieldType.STRING, - validations: [], - value: null, - ui_restrictions: [], - default_value: null, - depends_on: [], - }, - 'rate_limit.requests_per_minute': { - display: DisplayType.NUMERIC, - label: 'Rate limit', - order: 5, - required: false, - sensitive: false, - tooltip: 'Minimize the number of rate limit errors.', - type: FieldType.INTEGER, - validations: [], - value: null, - ui_restrictions: [], - default_value: null, - depends_on: [], - }, - }, - }, - { - provider: 'azureopenai', - logo: '', // should be azureopenai logo here, the hardcoded uses assets/images - taskTypes: ['completion', 'text_embedding'], - configuration: { - api_key: { - display: DisplayType.TEXTBOX, - label: 'API Key', - order: 1, - required: false, - sensitive: true, - tooltip: `You must provide either an API key or an Entra ID.`, - type: FieldType.STRING, - validations: [], - value: null, - ui_restrictions: [], - default_value: null, - depends_on: [], - }, - entra_id: { - display: DisplayType.TEXTBOX, - label: 'Entra ID', - order: 2, - required: false, - sensitive: true, - tooltip: `You must provide either an API key or an Entra ID.`, - type: FieldType.STRING, - validations: [], - value: null, - ui_restrictions: [], - default_value: null, - depends_on: [], - }, - resource_name: { - display: DisplayType.TEXTBOX, - label: 'Resource Name', - order: 3, - required: true, - sensitive: false, - tooltip: `The name of your Azure OpenAI resource`, - type: FieldType.STRING, - validations: [], - value: null, - ui_restrictions: [], - default_value: null, - depends_on: [], - }, - api_version: { - display: DisplayType.TEXTBOX, - label: 'API version', - order: 4, - required: true, - sensitive: false, - tooltip: 'The Azure API version ID to use.', - type: FieldType.STRING, - validations: [], - value: null, - ui_restrictions: [], - default_value: null, - depends_on: [], - }, - deployment_id: { - display: DisplayType.TEXTBOX, - label: 'Deployment ID', - order: 5, - required: true, - sensitive: false, - tooltip: 'The deployment name of your deployed models.', - type: FieldType.STRING, - validations: [], - value: null, - ui_restrictions: [], - default_value: null, - depends_on: [], - }, - 'rate_limit.requests_per_minute': { - display: DisplayType.NUMERIC, - label: 'Rate limit', - order: 5, - required: false, - sensitive: false, - tooltip: - 'The azureopenai service sets a default number of requests allowed per minute depending on the task type.', - type: FieldType.INTEGER, - validations: [], - value: null, - ui_restrictions: [], - default_value: null, - depends_on: [], - }, - }, - }, - { - provider: 'azureaistudio', - logo: '', // should be azureaistudio logo here, the hardcoded uses assets/images - taskTypes: ['completion', 'text_embedding'], - configuration: { - api_key: { - display: DisplayType.TEXTBOX, - label: 'API Key', - order: 1, - required: true, - sensitive: true, - tooltip: `API Key for the provider you're connecting to`, - type: FieldType.STRING, - validations: [], - value: null, - ui_restrictions: [], - default_value: null, - depends_on: [], - }, - target: { - display: DisplayType.TEXTBOX, - label: 'Target', - order: 2, - required: true, - sensitive: false, - tooltip: `The target URL of your Azure AI Studio model deployment.`, - type: FieldType.STRING, - validations: [], - value: null, - ui_restrictions: [], - default_value: null, - depends_on: [], - }, - endpoint_type: { - display: DisplayType.DROPDOWN, - label: 'Endpoint type', - order: 3, - required: true, - sensitive: false, - tooltip: 'Specifies the type of endpoint that is used in your model deployment.', - type: FieldType.STRING, - options: [ - { - label: 'token', - value: 'token', - }, - { - label: 'realtime', - value: 'realtime', - }, - ], - validations: [], - value: null, - ui_restrictions: [], - default_value: null, - depends_on: [], - }, - provider: { - display: DisplayType.DROPDOWN, - label: 'Provider', - order: 3, - required: true, - options: [ - { - label: 'cohere', - value: 'cohere', - }, - { - label: 'meta', - value: 'meta', - }, - { - label: 'microsoft_phi', - value: 'microsoft_phi', - }, - { - label: 'mistral', - value: 'mistral', - }, - { - label: 'openai', - value: 'openai', - }, - { - label: 'databricks', - value: 'databricks', - }, - ], - sensitive: false, - tooltip: 'The model provider for your deployment.', - type: FieldType.STRING, - validations: [], - value: null, - ui_restrictions: [], - default_value: null, - depends_on: [], - }, - 'rate_limit.requests_per_minute': { - display: DisplayType.NUMERIC, - label: 'Rate limit', - order: 5, - required: false, - sensitive: false, - tooltip: 'Minimize the number of rate limit errors.', - type: FieldType.INTEGER, - validations: [], - value: null, - ui_restrictions: [], - default_value: null, - depends_on: [], - }, - }, - }, - { - provider: 'anthropic', - logo: '', // should be anthropic logo here, the hardcoded uses assets/images - taskTypes: ['completion'], - configuration: { - api_key: { - display: DisplayType.TEXTBOX, - label: 'API Key', - order: 1, - required: true, - sensitive: true, - tooltip: `API Key for the provider you're connecting to`, - type: FieldType.STRING, - validations: [], - value: null, - ui_restrictions: [], - default_value: null, - depends_on: [], - }, - model_id: { - display: DisplayType.TEXTBOX, - label: 'Model ID', - order: 2, - required: true, - sensitive: false, - tooltip: `The name of the model to use for the inference task.`, - type: FieldType.STRING, - validations: [], - value: null, - ui_restrictions: [], - default_value: null, - depends_on: [], - }, - 'rate_limit.requests_per_minute': { - display: DisplayType.NUMERIC, - label: 'Rate limit', - order: 5, - required: false, - sensitive: false, - tooltip: - 'By default, the anthropic service sets the number of requests allowed per minute to 50.', - type: FieldType.INTEGER, - validations: [], - value: null, - ui_restrictions: [], - default_value: null, - depends_on: [], - }, - }, - }, - { - provider: 'watsonxai', - logo: '', // should be anthropic logo here, the hardcoded uses assets/images - taskTypes: ['text_embedding'], - configuration: { - api_version: { - display: DisplayType.TEXTBOX, - label: 'API version', - order: 1, - required: true, - sensitive: false, - tooltip: 'The IBM Watsonx API version ID to use.', - type: FieldType.STRING, - validations: [], - value: null, - ui_restrictions: [], - default_value: null, - depends_on: [], - }, - project_id: { - display: DisplayType.TEXTBOX, - label: 'Project ID', - order: 2, - required: true, - sensitive: false, - tooltip: '', - type: FieldType.STRING, - validations: [], - value: null, - ui_restrictions: [], - default_value: null, - depends_on: [], - }, - model_id: { - display: DisplayType.TEXTBOX, - label: 'Model ID', - order: 3, - required: true, - sensitive: false, - tooltip: `The name of the model to use for the inference task.`, - type: FieldType.STRING, - validations: [], - value: null, - ui_restrictions: [], - default_value: null, - depends_on: [], - }, - url: { - display: DisplayType.TEXTBOX, - label: 'URL', - order: 4, - required: true, - sensitive: false, - tooltip: '', - type: FieldType.STRING, - validations: [], - value: null, - ui_restrictions: [], - default_value: null, - depends_on: [], - }, - max_input_tokens: { - display: DisplayType.NUMERIC, - label: 'Maximum input tokens', - order: 5, - required: false, - sensitive: false, - tooltip: 'Allows you to specify the maximum number of tokens per input.', - type: FieldType.INTEGER, - validations: [], - value: null, - ui_restrictions: [], - default_value: null, - depends_on: [], - }, - }, - }, - { - provider: 'alibabacloud-ai-search', - logo: '', // should be anthropic logo here, the hardcoded uses assets/images - taskTypes: ['completion', 'sparse_embedding', 'text_embedding', 'rerank'], - configuration: { - api_key: { - display: DisplayType.TEXTBOX, - label: 'API Key', - order: 1, - required: true, - sensitive: true, - tooltip: 'A valid API key for the AlibabaCloud AI Search API.', - type: FieldType.STRING, - validations: [], - value: null, - ui_restrictions: [], - default_value: null, - depends_on: [], - }, - service_id: { - display: DisplayType.DROPDOWN, - label: 'Project ID', - order: 2, - required: true, - sensitive: false, - tooltip: 'The name of the model service to use for the {infer} task.', - type: FieldType.STRING, - options: [ - { - label: 'ops-text-embedding-001', - value: 'ops-text-embedding-001', - }, - { - label: 'ops-text-embedding-zh-001', - value: 'ops-text-embedding-zh-001', - }, - { - label: 'ops-text-embedding-en-001', - value: 'ops-text-embedding-en-001', - }, - { - label: 'ops-text-embedding-002', - value: 'ops-text-embedding-002', - }, - { - label: 'ops-text-sparse-embedding-001', - value: 'ops-text-sparse-embedding-001', - }, - { - label: 'ops-bge-reranker-larger', - value: 'ops-bge-reranker-larger', - }, - ], - validations: [], - value: null, - ui_restrictions: [], - default_value: null, - depends_on: [], - }, - host: { - display: DisplayType.TEXTBOX, - label: 'Host', - order: 3, - required: true, - sensitive: false, - tooltip: - 'The name of the host address used for the {infer} task. You can find the host address at https://opensearch.console.aliyun.com/cn-shanghai/rag/api-key[ the API keys section] of the documentation.', - type: FieldType.STRING, - validations: [], - value: null, - ui_restrictions: [], - default_value: null, - depends_on: [], - }, - http_schema: { - display: DisplayType.DROPDOWN, - label: 'HTTP Schema', - order: 4, - required: true, - sensitive: false, - tooltip: '', - type: FieldType.STRING, - options: [ - { - label: 'https', - value: 'https', - }, - { - label: 'http', - value: 'http', - }, - ], - validations: [], - value: null, - ui_restrictions: [], - default_value: null, - depends_on: [], - }, - workspace: { - display: DisplayType.TEXTBOX, - label: 'Workspace', - order: 5, - required: true, - sensitive: false, - tooltip: 'The name of the workspace used for the {infer} task.', - type: FieldType.STRING, - validations: [], - value: null, - ui_restrictions: [], - default_value: null, - depends_on: [], - }, - 'rate_limit.requests_per_minute': { - display: DisplayType.NUMERIC, - label: 'Rate limit', - order: 6, - required: false, - sensitive: false, - tooltip: 'Minimize the number of rate limit errors.', - type: FieldType.INTEGER, - validations: [], - value: null, - ui_restrictions: [], - default_value: null, - depends_on: [], - }, - }, - }, - ] as InferenceProvider[]; - return Promise.resolve( - providers.sort((a, b) => (a.provider > b.provider ? 1 : b.provider > a.provider ? -1 : 0)) - ); +export const getProviders = async (http: HttpSetup): Promise => { + return await http.get(`${INTERNAL_BASE_STACK_CONNECTORS_API_PATH}/_inference/_services`); }; export const useProviders = (http: HttpSetup, toasts: ToastsStart) => { diff --git a/x-pack/plugins/stack_connectors/public/connector_types/inference/providers/render_service_provider/service_provider.tsx b/x-pack/plugins/stack_connectors/public/connector_types/inference/providers/render_service_provider/service_provider.tsx index 5d2c99ffd92ce..5eb8518a5ea15 100644 --- a/x-pack/plugins/stack_connectors/public/connector_types/inference/providers/render_service_provider/service_provider.tsx +++ b/x-pack/plugins/stack_connectors/public/connector_types/inference/providers/render_service_provider/service_provider.tsx @@ -26,7 +26,7 @@ interface ServiceProviderProps { searchValue?: string; } -type ProviderSolution = 'Observability' | 'Security' | 'Search'; +export type ProviderSolution = 'Observability' | 'Security' | 'Search'; interface ServiceProviderRecord { icon: string; @@ -107,9 +107,7 @@ export const ServiceProviderIcon: React.FC = ({ providerKe return provider ? ( - ) : ( - {providerKey} - ); + ) : null; }; export const ServiceProviderName: React.FC = ({ diff --git a/x-pack/plugins/stack_connectors/public/connector_types/inference/providers/selectable/index.tsx b/x-pack/plugins/stack_connectors/public/connector_types/inference/providers/selectable/index.tsx index d4527e9c7b9a4..fc31c9dd6c4f7 100644 --- a/x-pack/plugins/stack_connectors/public/connector_types/inference/providers/selectable/index.tsx +++ b/x-pack/plugins/stack_connectors/public/connector_types/inference/providers/selectable/index.tsx @@ -11,6 +11,7 @@ import React, { memo, useCallback, useMemo, useState } from 'react'; import { i18n } from '@kbn/i18n'; import { ServiceProviderKeys } from '../../../../../common/inference/constants'; import { + ProviderSolution, SERVICE_PROVIDERS, ServiceProviderIcon, ServiceProviderName, @@ -47,7 +48,20 @@ const SelectableProviderComponent: React.FC = ({ const renderProviderOption = useCallback>( (option, searchValue) => { - const provider = SERVICE_PROVIDERS[option.label as ServiceProviderKeys]; + const provider = Object.keys(SERVICE_PROVIDERS).includes(option.label) + ? SERVICE_PROVIDERS[option.label as ServiceProviderKeys] + : undefined; + + const supportedBySolutions = (provider && + provider.solutions.map((solution) => ( + + {solution} + + ))) ?? ( + + {'Search' as ProviderSolution} + + ); return ( @@ -65,12 +79,7 @@ const SelectableProviderComponent: React.FC = ({ - {provider && - provider.solutions.map((solution) => ( - - {solution} - - ))} + {supportedBySolutions} diff --git a/x-pack/plugins/stack_connectors/public/connector_types/inference/types.ts b/x-pack/plugins/stack_connectors/public/connector_types/inference/types.ts index 150292894b643..1bd55793bc463 100644 --- a/x-pack/plugins/stack_connectors/public/connector_types/inference/types.ts +++ b/x-pack/plugins/stack_connectors/public/connector_types/inference/types.ts @@ -14,7 +14,6 @@ import { SparseEmbeddingParams, TextEmbeddingParams, } from '../../../common/inference/types'; -import { ConfigProperties } from '../lib/dynamic_config/types'; export type InferenceActionParams = | { subAction: SUB_ACTION.COMPLETION; subActionParams: ChatCompleteParams } @@ -22,8 +21,6 @@ export type InferenceActionParams = | { subAction: SUB_ACTION.SPARSE_EMBEDDING; subActionParams: SparseEmbeddingParams } | { subAction: SUB_ACTION.TEXT_EMBEDDING; subActionParams: TextEmbeddingParams }; -export type FieldsConfiguration = Record; - export interface Config { taskType: string; taskTypeConfig?: Record; diff --git a/x-pack/plugins/stack_connectors/public/connector_types/lib/dynamic_config/connector_configuration_field.tsx b/x-pack/plugins/stack_connectors/public/connector_types/lib/dynamic_config/connector_configuration_field.tsx index 79ae552a9528a..5560c831c4a61 100644 --- a/x-pack/plugins/stack_connectors/public/connector_types/lib/dynamic_config/connector_configuration_field.tsx +++ b/x-pack/plugins/stack_connectors/public/connector_types/lib/dynamic_config/connector_configuration_field.tsx @@ -25,12 +25,12 @@ import { } from '@elastic/eui'; import { isEmpty } from 'lodash/fp'; +import { ConfigEntryView, DisplayType } from '../../../../common/dynamic_config/types'; import { ensureBooleanType, ensureCorrectTyping, ensureStringType, } from './connector_configuration_utils'; -import { ConfigEntryView, DisplayType } from './types'; interface ConnectorConfigurationFieldProps { configEntry: ConfigEntryView; diff --git a/x-pack/plugins/stack_connectors/public/connector_types/lib/dynamic_config/connector_configuration_form_items.tsx b/x-pack/plugins/stack_connectors/public/connector_types/lib/dynamic_config/connector_configuration_form_items.tsx index 3190ac80275f1..a7063d81719a8 100644 --- a/x-pack/plugins/stack_connectors/public/connector_types/lib/dynamic_config/connector_configuration_form_items.tsx +++ b/x-pack/plugins/stack_connectors/public/connector_types/lib/dynamic_config/connector_configuration_form_items.tsx @@ -18,7 +18,7 @@ import { } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; -import { ConfigEntryView, DisplayType } from './types'; +import { ConfigEntryView, DisplayType } from '../../../../common/dynamic_config/types'; import { ConnectorConfigurationField } from './connector_configuration_field'; interface ConnectorConfigurationFormItemsProps { diff --git a/x-pack/plugins/stack_connectors/public/connector_types/lib/dynamic_config/connector_configuration_utils.ts b/x-pack/plugins/stack_connectors/public/connector_types/lib/dynamic_config/connector_configuration_utils.ts index 182327a180a63..cce5bc15fa56c 100644 --- a/x-pack/plugins/stack_connectors/public/connector_types/lib/dynamic_config/connector_configuration_utils.ts +++ b/x-pack/plugins/stack_connectors/public/connector_types/lib/dynamic_config/connector_configuration_utils.ts @@ -5,7 +5,7 @@ * 2.0. */ -import { ConfigProperties, FieldType } from './types'; +import { ConfigProperties, FieldType } from '../../../../common/dynamic_config/types'; export type ConnectorConfigEntry = ConfigProperties & { key: string }; diff --git a/x-pack/plugins/stack_connectors/server/plugin.ts b/x-pack/plugins/stack_connectors/server/plugin.ts index aee84d963043d..b20892938735b 100644 --- a/x-pack/plugins/stack_connectors/server/plugin.ts +++ b/x-pack/plugins/stack_connectors/server/plugin.ts @@ -8,7 +8,11 @@ import { PluginInitializerContext, Plugin, CoreSetup, Logger } from '@kbn/core/server'; import { PluginSetupContract as ActionsPluginSetupContract } from '@kbn/actions-plugin/server'; import { registerConnectorTypes } from './connector_types'; -import { validSlackApiChannelsRoute, getWellKnownEmailServiceRoute } from './routes'; +import { + validSlackApiChannelsRoute, + getWellKnownEmailServiceRoute, + getInferenceServicesRoute, +} from './routes'; import { ExperimentalFeatures, parseExperimentalConfigValue, @@ -39,6 +43,7 @@ export class StackConnectorsPlugin implements Plugin { getWellKnownEmailServiceRoute(router); validSlackApiChannelsRoute(router, actions.getActionsConfigurationUtilities(), this.logger); + getInferenceServicesRoute(router); registerConnectorTypes({ actions, diff --git a/x-pack/plugins/stack_connectors/server/routes/get_inference_services.test.ts b/x-pack/plugins/stack_connectors/server/routes/get_inference_services.test.ts new file mode 100644 index 0000000000000..50596028d80a8 --- /dev/null +++ b/x-pack/plugins/stack_connectors/server/routes/get_inference_services.test.ts @@ -0,0 +1,133 @@ +/* + * 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 { httpServiceMock, httpServerMock } from '@kbn/core/server/mocks'; +import { coreMock } from '@kbn/core/server/mocks'; +import { getInferenceServicesRoute } from './get_inference_services'; +import { DisplayType, FieldType } from '../../common/dynamic_config/types'; + +describe('getInferenceServicesRoute', () => { + it('returns available service providers', async () => { + const router = httpServiceMock.createRouter(); + const core = coreMock.createRequestHandlerContext(); + + const mockResult = [ + { + provider: 'openai', + task_types: [ + { + task_type: 'completion', + configuration: { + user: { + display: DisplayType.TEXTBOX, + label: 'User', + order: 1, + required: false, + sensitive: false, + tooltip: 'Specifies the user issuing the request.', + type: FieldType.STRING, + validations: [], + value: '', + ui_restrictions: [], + default_value: null, + depends_on: [], + }, + }, + }, + ], + configuration: { + api_key: { + display: DisplayType.TEXTBOX, + label: 'API Key', + order: 3, + required: true, + sensitive: true, + tooltip: `The OpenAI API authentication key. For more details about generating OpenAI API keys, refer to the https://platform.openai.com/account/api-keys.`, + type: FieldType.STRING, + validations: [], + value: null, + ui_restrictions: [], + default_value: null, + depends_on: [], + }, + model_id: { + display: DisplayType.TEXTBOX, + label: 'Model ID', + order: 2, + required: true, + sensitive: false, + tooltip: 'The name of the model to use for the inference task.', + type: FieldType.STRING, + validations: [], + value: null, + ui_restrictions: [], + default_value: null, + depends_on: [], + }, + organization_id: { + display: DisplayType.TEXTBOX, + label: 'Organization ID', + order: 4, + required: false, + sensitive: false, + tooltip: 'The unique identifier of your organization.', + type: FieldType.STRING, + validations: [], + value: null, + ui_restrictions: [], + default_value: null, + depends_on: [], + }, + url: { + display: DisplayType.TEXTBOX, + label: 'URL', + order: 1, + required: true, + sensitive: false, + tooltip: + 'The OpenAI API endpoint URL. For more information on the URL, refer to the https://platform.openai.com/docs/api-reference.', + type: FieldType.STRING, + validations: [], + value: null, + ui_restrictions: [], + default_value: 'https://api.openai.com/v1/chat/completions', + depends_on: [], + }, + 'rate_limit.requests_per_minute': { + display: DisplayType.NUMERIC, + label: 'Rate limit', + order: 5, + required: false, + sensitive: false, + tooltip: + 'Default number of requests allowed per minute. For text_embedding is 3000. For completion is 500.', + type: FieldType.INTEGER, + validations: [], + value: null, + ui_restrictions: [], + default_value: null, + depends_on: [], + }, + }, + }, + ]; + core.elasticsearch.client.asInternalUser.transport.request.mockResolvedValue(mockResult); + + getInferenceServicesRoute(router); + + const [config, handler] = router.get.mock.calls[0]; + expect(config.path).toMatchInlineSnapshot(`"/internal/stack_connectors/_inference/_services"`); + + const mockResponse = httpServerMock.createResponseFactory(); + const mockRequest = httpServerMock.createKibanaRequest(); + await handler({ core }, mockRequest, mockResponse); + + expect(mockResponse.ok).toHaveBeenCalledWith({ + body: mockResult, + }); + }); +}); diff --git a/x-pack/plugins/stack_connectors/server/routes/get_inference_services.ts b/x-pack/plugins/stack_connectors/server/routes/get_inference_services.ts new file mode 100644 index 0000000000000..1396072834261 --- /dev/null +++ b/x-pack/plugins/stack_connectors/server/routes/get_inference_services.ts @@ -0,0 +1,48 @@ +/* + * 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 { + IRouter, + RequestHandlerContext, + KibanaRequest, + IKibanaResponse, + KibanaResponseFactory, +} from '@kbn/core/server'; +import { InferenceProvider } from '../../common/inference/types'; +import { INTERNAL_BASE_STACK_CONNECTORS_API_PATH } from '../../common'; + +export const getInferenceServicesRoute = (router: IRouter) => { + router.get( + { + path: `${INTERNAL_BASE_STACK_CONNECTORS_API_PATH}/_inference/_services`, + options: { + access: 'internal', + }, + validate: false, + }, + handler + ); + + async function handler( + ctx: RequestHandlerContext, + req: KibanaRequest, + res: KibanaResponseFactory + ): Promise { + const esClient = (await ctx.core).elasticsearch.client.asInternalUser; + + const response = await esClient.transport.request<{ + endpoints: InferenceProvider[]; + }>({ + method: 'GET', + path: `/_inference/_services`, + }); + + return res.ok({ + body: response, + }); + } +}; diff --git a/x-pack/plugins/stack_connectors/server/routes/index.ts b/x-pack/plugins/stack_connectors/server/routes/index.ts index cd9857b2168ed..e64995e1a50ef 100644 --- a/x-pack/plugins/stack_connectors/server/routes/index.ts +++ b/x-pack/plugins/stack_connectors/server/routes/index.ts @@ -7,3 +7,4 @@ export { getWellKnownEmailServiceRoute } from './get_well_known_email_service'; export { validSlackApiChannelsRoute } from './valid_slack_api_channels'; +export { getInferenceServicesRoute } from './get_inference_services'; From 1e6a6caa5f8eda9e48a2ae084c214d74550c2972 Mon Sep 17 00:00:00 2001 From: seanrathier Date: Wed, 18 Dec 2024 03:14:02 -0500 Subject: [PATCH 22/23] [8.x] Sustainable Kibana Architecture: Move modules owned by `@elastic/kibana-cloud-security-posture` (#202862) (#204474) # Backport This will backport the following commits from `main` to `8.x`: - [Sustainable Kibana Architecture: Move modules owned by `@elastic/kibana-cloud-security-posture` (#202862)](https://github.com/elastic/kibana/pull/202862) ### Questions ? Please refer to the [Backport tool documentation](https://github.com/sqren/backport) --------- Co-authored-by: Gerard Soldevila Co-authored-by: kibanamachine <42973632+kibanamachine@users.noreply.github.com> --- .../pipelines/pull_request/pipeline.ts | 2 +- .eslintrc.js | 2 +- .github/CODEOWNERS | 16 +- .github/codeql/codeql-config.yml | 2 +- .i18nrc.json | 7 +- docs/developer/plugin-list.asciidoc | 10 +- package.json | 16 +- .../shared/deeplinks/security/deep_links.ts | 4 +- tsconfig.base.json | 32 +- x-pack/.i18nrc.json | 82 +- .../common/README.md | 9 - .../common/README.md | 9 + .../common/constants.ts | 0 .../common/index.ts | 0 .../common/jest.config.js | 4 +- .../common/kibana.jsonc | 0 .../common/package.json | 0 .../common/schema/graph/index.ts | 0 .../common/schema/graph/latest.ts | 0 .../common/schema/graph/v1.ts | 0 .../common/schema/rules/index.ts | 0 .../common/schema/rules/latest.ts | 0 .../common/schema/rules/v1.ts | 0 .../common/schema/rules/v2.ts | 0 .../common/schema/rules/v3.ts | 0 .../common/schema/rules/v4.ts | 0 .../common/schema/rules/v5.ts | 0 .../csp_vulnerability_finding.ts | 0 .../common/schema/vulnerabilities/latest.ts | 0 .../common/tsconfig.json | 2 +- .../common/types/benchmark.ts | 0 .../common/types/findings.ts | 0 .../common/types/graph/index.ts | 0 .../common/types/graph/latest.ts | 0 .../common/types/graph/v1.ts | 0 .../common/types/status.ts | 0 .../common/types/vulnerabilities.ts | 0 .../utils/get_abbreviated_number.test.ts | 0 .../common/utils/get_abbreviated_number.ts | 0 .../common/utils/helpers.test.ts | 0 .../common/utils/helpers.ts | 9 +- .../common/utils/ui_metrics.ts | 0 .../translations/translations/fr-FR.json | 19 +- .../translations/translations/ja-JP.json | 19 +- .../translations/translations/zh-CN.json | 19 +- .../schema/xpack_plugins.json | 712 -------------- .../schema/xpack_security.json | 712 ++++++++++++++ .../graph/README.md | 0 .../kbn-cloud-security-posture/graph/index.ts | 0 .../graph/jest.config.js | 8 +- .../graph/kibana.jsonc | 0 .../graph/package.json | 0 .../graph/setup_tests.ts | 0 .../graph/src/assets/icons/aws.svg | 0 .../graph/src/assets/icons/aws_ec2.svg | 0 .../graph/src/assets/icons/aws_s3.svg | 0 .../graph/src/assets/icons/okta.svg | 0 .../graph/src/common/constants.ts | 0 .../components/edge/deafult_edge.stories.tsx | 8 +- .../src/components/edge/default_edge.tsx | 0 .../graph/src/components/edge/index.ts | 0 .../graph/src/components/edge/styles.tsx | 0 .../graph/src/components/edge/utils.ts | 0 .../graph/src/components/graph/graph.test.tsx | 0 .../graph/src/components/graph/graph.tsx | 0 .../graph/graph_popover.stories.tsx | 10 +- .../src/components/graph/graph_popover.tsx | 0 .../src/components/graph/layout_graph.ts | 0 .../components/graph/use_graph_popover.tsx | 0 .../graph/src/components/graph/utils.ts | 0 .../graph_investigation.tsx | 0 .../graph_node_expand_popover.tsx | 27 +- .../use_graph_node_expand_popover.tsx | 2 + .../components/graph_layout.stories.test.tsx | 1 + .../src/components/graph_layout.stories.tsx | 7 +- .../graph/src/components/index.ts | 0 .../graph/src/components/mock/react_flow.ts | 1 + .../src/components/mock/test_providers.tsx | 0 .../src/components/node/button.stories.tsx | 2 + .../src/components/node/diamond_node.tsx | 3 +- .../src/components/node/edge_group_node.tsx | 1 + .../src/components/node/ellipse_node.tsx | 3 +- .../src/components/node/get_span_icon.ts | 1 + .../src/components/node/hexagon_node.tsx | 3 +- .../graph/src/components/node/index.ts | 0 .../graph/src/components/node/label_node.tsx | 3 +- .../src/components/node/node.stories.tsx | 0 .../components/node/node_expand_button.tsx | 0 .../src/components/node/pentagon_node.tsx | 3 +- .../src/components/node/rectangle_node.tsx | 3 +- .../components/node/shapes/diamond_shape.tsx | 2 + .../components/node/shapes/ellipse_shape.tsx | 2 + .../components/node/shapes/hexagon_shape.tsx | 2 + .../components/node/shapes/pentagon_shape.tsx | 2 + .../node/shapes/rectangle_shape.tsx | 2 + .../graph/src/components/node/shapes/types.ts | 0 .../graph/src/components/node/styles.tsx | 0 .../graph/src/components/styles.tsx | 0 .../graph/src/components/test_ids.ts | 0 .../graph/src/components/types.ts | 3 +- .../graph/src/hooks/index.ts | 0 .../src/hooks/use_fetch_graph_data.test.tsx | 0 .../graph/src/hooks/use_fetch_graph_data.ts | 0 .../graph/tsconfig.json | 2 +- .../public/index.ts | 0 .../public/jest.config.js | 4 +- .../public/kibana.jsonc | 0 .../public/package.json | 0 .../src/components/csp_evaluation_badge.tsx | 15 +- .../src/components/vulnerability_badges.tsx | 0 .../src/constants/component_constants.ts | 0 .../public/src/constants/navigation.ts | 10 +- .../src/hooks/use_csp_setup_status_api.ts | 0 .../public/src/hooks/use_data_view.ts | 0 .../use_get_benchmark_rules_state_api.ts | 0 .../hooks/use_get_navigation_url_params.ts | 0 .../src/hooks/use_has_misconfigurations.ts | 0 .../src/hooks/use_has_vulnerabilities.ts | 0 .../hooks/use_misconfiguration_findings.ts | 1 + .../src/hooks/use_misconfiguration_preview.ts | 1 + .../src/hooks/use_navigate_findings.test.ts | 0 .../public/src/hooks/use_navigate_findings.ts | 0 .../src/hooks/use_vulnerabilities_findings.ts | 0 .../src/hooks/use_vulnerabilities_preview.ts | 0 .../public/src/types.ts | 0 .../utils/get_vulnerabilitiy_colors.test.ts | 0 .../src/utils/get_vulnerability_colors.ts | 0 .../src/utils/get_vulnerability_text.test.ts | 0 .../src/utils/get_vulnerability_text.ts | 0 .../public/src/utils/hooks_utils.test.ts | 0 .../public/src/utils/hooks_utils.ts | 2 +- .../public/src/utils/query_utils.test.ts | 0 .../public/src/utils/query_utils.ts | 3 + .../public/src/utils/show_error_toast.ts | 2 +- .../src/utils/vulnerability_helpers.test.ts | 0 .../public/src/utils/vulnerability_helpers.ts | 1 + .../public/tsconfig.json | 2 +- .../plugins/asset_inventory/README.md | 0 .../plugins/asset_inventory/common/index.ts | 0 .../plugins/asset_inventory/kibana.jsonc | 0 .../plugins/asset_inventory/package.json | 0 .../asset_inventory/public/application.tsx | 0 .../asset_inventory/public/components/app.tsx | 0 .../plugins/asset_inventory/public/index.ts | 0 .../plugins/asset_inventory/public/plugin.ts | 0 .../plugins/asset_inventory/public/types.ts | 0 .../create_transforms/create_transforms.ts | 0 .../plugins/asset_inventory/server/index.ts | 0 .../plugins/asset_inventory/server/plugin.ts | 0 .../asset_inventory/server/routes/index.ts | 0 .../plugins/asset_inventory/server/types.ts | 0 .../plugins/asset_inventory/tsconfig.json | 4 +- .../plugins/cloud_defend/.i18nrc.json | 0 .../security}/plugins/cloud_defend/README.md | 6 +- .../plugins/cloud_defend/common/constants.ts | 0 .../plugins/cloud_defend/common/index.ts | 0 .../plugins/cloud_defend/common/latest.ts | 0 .../plugins/cloud_defend/common/schemas/v1.ts | 0 .../cloud_defend/common/utils/helpers.test.ts | 0 .../cloud_defend/common/utils/helpers.ts | 0 .../common/utils/subscription.test.ts | 0 .../cloud_defend/common/utils/subscription.ts | 0 .../plugins/cloud_defend/common/v1.ts | 0 .../plugins/cloud_defend/jest.config.js | 9 +- .../plugins/cloud_defend/kibana.jsonc | 0 .../cloud_defend/public/application/route.tsx | 0 .../public/application/router.test.tsx | 0 .../public/application/router.tsx | 0 .../application/security_solution_context.ts | 0 .../public/application/setup_context.ts | 0 .../cloud_defend/public/assets/icons/logo.svg | 0 .../api/use_cloud_defend_integration.tsx | 0 .../public/common/api/use_setup_status_api.ts | 0 .../cloud_defend/public/common/constants.ts | 0 .../public/common/hooks/use_kibana.ts | 0 .../public/common/hooks/use_page_size.ts | 0 .../common/hooks/use_subscription_status.ts | 0 .../public/common/navigation/constants.ts | 0 .../security_solution_links.test.ts | 0 .../navigation/security_solution_links.ts | 0 .../public/common/navigation/types.ts | 0 .../use_cloud_defend_integration_links.ts | 0 .../cloud_defend/public/common/utils.test.ts | 0 .../cloud_defend/public/common/utils.ts | 0 .../cloud_defend_page/index.test.tsx | 0 .../components/cloud_defend_page/index.tsx | 0 .../cloud_defend_page_title/index.tsx | 0 .../control_general_view/index.test.tsx | 0 .../components/control_general_view/index.tsx | 0 .../components/control_general_view/styles.ts | 0 .../control_general_view/translations.ts | 0 .../index.test.tsx | 0 .../control_general_view_response/index.tsx | 0 .../control_general_view_response/styles.ts | 0 .../index.test.tsx | 0 .../control_general_view_selector/index.tsx | 0 .../control_general_view_selector/styles.ts | 0 .../control_settings/index.test.tsx | 0 .../components/control_settings/index.tsx | 0 .../control_settings/translations.ts | 0 .../hooks/policy_schema.json | 0 .../hooks/use_config_model.ts | 0 .../control_yaml_view/index.test.tsx | 0 .../components/control_yaml_view/index.tsx | 0 .../components/control_yaml_view/styles.ts | 0 .../control_yaml_view/translations.ts | 0 .../custom_assets_extension.tsx | 0 ...e_policy_replace_define_step_extension.tsx | 0 .../components/full_size_page/index.tsx | 0 .../public/components/loading_state/index.tsx | 0 .../components/policies_table/index.test.tsx | 0 .../components/policies_table/index.tsx | 0 .../components/policy_settings/index.test.tsx | 0 .../components/policy_settings/index.tsx | 0 .../policy_settings/translations.ts | 0 .../subscription_not_allowed/index.tsx | 0 .../components/timestamp_table_cell/index.tsx | 0 .../plugins/cloud_defend/public/index.ts | 0 .../cloud_defend/public/pages/index.ts | 0 .../public/pages/policies/index.test.tsx | 0 .../public/pages/policies/index.tsx | 0 .../public/pages/policies/test_subjects.ts | 0 .../policies/use_cloud_defend_policies.ts | 0 .../plugins/cloud_defend/public/plugin.tsx | 0 .../public/test/__mocks__/worker.js | 0 .../test/fixtures/cloud_defend_integration.ts | 0 .../public/test/fixtures/navigation_item.ts | 0 .../public/test/fixtures/react_query.ts | 0 .../plugins/cloud_defend/public/test/mocks.ts | 0 .../public/test/test_provider.tsx | 0 .../plugins/cloud_defend/public/test/utils.ts | 0 .../plugins/cloud_defend/public/types.ts | 0 .../plugins/cloud_defend/server/index.ts | 0 .../server/lib/check_index_status.ts | 0 .../cloud_defend/server/lib/fleet_util.ts | 0 .../collectors/accounts_stats_collector.ts | 0 .../collectors/indices_stats_collector.ts | 0 .../installation_stats_collector.ts | 0 .../collectors/pods_stats_collector.ts | 0 .../lib/telemetry/collectors/register.ts | 0 .../server/lib/telemetry/collectors/schema.ts | 0 .../server/lib/telemetry/collectors/types.ts | 2 +- .../plugins/cloud_defend/server/mocks.ts | 0 .../cloud_defend/server/plugin.test.ts | 0 .../plugins/cloud_defend/server/plugin.ts | 0 .../server/routes/policies/policies.test.ts | 0 .../server/routes/policies/policies.ts | 0 .../server/routes/setup_routes.ts | 0 .../server/routes/status/status.test.ts | 0 .../server/routes/status/status.ts | 0 .../plugins/cloud_defend/server/types.ts | 0 .../plugins/cloud_defend/tsconfig.json | 4 +- .../plugins/cloud_security_posture/README.md | 20 +- .../common/constants.ts | 0 ...enerated_csp_requirements_test_coverage.md | 928 +++++++++--------- .../cloud_security_posture/common/index.ts | 0 .../get_identifier_runtime_mapping.ts | 0 .../get_package_policy_id_mapping.ts | 0 .../get_safe_posture_type_runtime_mapping.ts | 0 .../common/schemas/stats.ts | 0 .../__auto_generated_csp_test_log.json | 200 ++-- .../common/scripts/get_tests.js | 4 +- .../common/types/benchmarks/v1.ts | 0 .../common/types/benchmarks/v2.ts | 0 .../common/types/index.ts | 0 .../common/types/latest.ts | 0 .../common/types_old.ts | 0 .../common/utils/detection_rules.test.ts | 0 .../common/utils/detection_rules.ts | 0 .../common/utils/helpers.test.ts | 0 .../common/utils/helpers.ts | 0 .../common/utils/rules_states.ts | 0 .../common/utils/subscription.test.ts | 0 .../common/utils/subscription.ts | 0 .../cloud_security_posture/jest.config.js | 9 +- .../cloud_security_posture/kibana.jsonc | 0 .../public/application/csp_route.tsx | 0 .../public/application/csp_router.test.tsx | 0 .../public/application/csp_router.tsx | 0 .../application/security_solution_context.ts | 0 .../public/application/setup_context.ts | 0 .../public/assets/icons/cis_aks_logo.svg | 0 .../public/assets/icons/cis_eks_logo.svg | 0 .../public/assets/icons/cis_gke_logo.svg | 0 .../public/assets/icons/cis_logo.svg | 0 .../public/assets/icons/google_cloud_logo.svg | 0 .../public/assets/icons/nvd_logo_svg.tsx | 0 .../public/assets/icons/redhat_logo.svg | 0 .../public/assets/illustrations/clouds.svg | 0 ...on_product_no_results_magnifying_glass.svg | 0 .../misconfigurations_vendors.svg | 0 .../illustrations/no_data_illustration.svg | 0 .../illustrations/vulnerabilities_vendors.svg | 0 .../common/api/create_detection_rule.ts | 0 .../public/common/api/index.ts | 0 .../api/use_cis_kubernetes_integration.tsx | 0 ...use_fetch_detection_rules_alerts_status.ts | 0 .../api/use_fetch_detection_rules_by_tags.ts | 0 .../use_license_management_locator_api.tsx | 0 .../common/api/use_package_policy_list.ts | 0 .../public/common/api/use_stats_api.ts | 0 .../api/use_vulnerability_dashboard_api.ts | 0 .../common/api/use_wiz_integration_route.ts | 0 .../common/component/multi_select_filter.tsx | 0 .../public/common/constants.ts | 0 .../common/contexts/data_view_context.ts | 0 .../use_benchmark_dynamic_values.test.ts | 0 .../hooks/use_benchmark_dynamic_values.ts | 0 .../use_cloud_posture_data_table/index.ts | 0 .../use_base_es_query.ts | 0 .../use_cloud_posture_data_table.ts | 0 .../use_persisted_query.ts | 0 .../use_cloud_posture_data_table/utils.ts | 0 .../hooks/use_is_subscription_status_valid.ts | 0 .../public/common/hooks/use_kibana.ts | 0 .../public/common/hooks/use_page_size.ts | 0 .../public/common/hooks/use_url_query.test.ts | 0 .../public/common/hooks/use_url_query.ts | 0 .../public/common/navigation/constants.ts | 0 .../security_solution_links.test.ts | 0 .../navigation/security_solution_links.ts | 0 .../public/common/navigation/types.ts | 0 .../navigation/use_csp_integration_link.ts | 0 ...se_navigate_to_cis_integration_policies.ts | 0 .../public/common/types.ts | 0 .../utils/get_template_url_package_info.ts | 0 .../common/utils/get_vendor_name.test.ts | 0 .../public/common/utils/get_vendor_name.ts | 0 .../utils/is_native_csp_finding.test.ts | 0 .../common/utils/is_native_csp_finding.ts | 0 .../accounts_evaluated_widget.test.tsx | 0 .../components/accounts_evaluated_widget.tsx | 0 .../public/components/chart_panel.test.tsx | 0 .../public/components/chart_panel.tsx | 0 .../public/components/cis_benchmark_icon.tsx | 0 .../components/cloud_posture_page.test.tsx | 0 .../public/components/cloud_posture_page.tsx | 0 .../components/cloud_posture_page_title.tsx | 0 .../public/components/cloud_provider_icon.tsx | 0 .../additional_controls.tsx | 0 .../cloud_security_data_table.test.tsx | 0 .../cloud_security_data_table.tsx | 0 .../fields_selector/fields_selector_modal.tsx | 0 .../fields_selector_table.test.tsx | 0 .../fields_selector/fields_selector_table.tsx | 0 .../fields_selector/index.ts | 0 .../fields_selector/use_fields_modal.ts | 0 .../cloud_security_data_table/index.ts | 0 .../cloud_security_data_table/use_styles.ts | 0 .../cloud_security_grouping.tsx | 0 .../cloud_security_grouping/index.ts | 0 .../cloud_security_grouping/loading_group.tsx | 0 .../cloud_security_grouping/null_group.tsx | 0 .../use_cloud_security_grouping.ts | 0 .../utils/first_non_null_value.test.ts | 0 .../utils/first_non_null_value.ts | 0 .../components/column_name_with_tooltip.tsx | 0 .../components/compact_formatted_number.tsx | 0 .../components/compliance_score_bar.test.tsx | 0 .../components/compliance_score_bar.tsx | 0 .../public/components/csp_counter_card.tsx | 0 .../csp_inline_description_list.tsx | 0 .../public/components/csp_loading_state.tsx | 0 .../detection_rule_counter.test.tsx | 0 .../components/detection_rule_counter.tsx | 0 .../public/components/empty_state.tsx | 0 .../empty_states_illustration_container.tsx | 0 .../aws_credentials_form.tsx | 0 .../aws_credentials_form_agentless.tsx | 0 .../aws_input_var_fields.tsx | 0 .../get_aws_credentials_form_options.tsx | 0 .../aws_credentials_form/hooks.ts | 0 .../azure_credentials_form.tsx | 0 .../azure_credentials_form_agentless.tsx | 0 .../get_azure_credentials_form_options.tsx | 0 .../azure_credentials_form/hooks.ts | 0 .../csp_boxed_radio_group.tsx | 0 .../custom_assets_extension.tsx | 0 .../fleet_extensions/eks_credentials_form.tsx | 0 .../gcp_credential_form.tsx | 0 .../gcp_credentials_form_agentless.tsx | 0 .../components/fleet_extensions/mocks.ts | 0 .../policy_template_form.test.tsx | 0 .../fleet_extensions/policy_template_form.tsx | 0 .../policy_template_selectors.tsx | 0 .../setup_technology_selector.tsx | 0 .../use_setup_technology.test.ts | 0 .../use_setup_technology.ts | 0 .../components/fleet_extensions/utils.test.ts | 0 .../components/fleet_extensions/utils.ts | 0 .../components/full_size_centered_page.tsx | 0 .../components/no_findings_states/index.ts | 0 .../no_findings_states.test.tsx | 0 .../no_findings_states/no_findings_states.tsx | 0 .../components/no_vulnerabilities_states.tsx | 0 .../components/subscription_not_allowed.tsx | 0 .../public/components/take_action.tsx | 0 .../public/components/test_subjects.ts | 0 .../components/timestamp_table_cell.tsx | 0 .../public/components/vuln_counter_card.tsx | 0 .../components/vulnerability_severity_map.tsx | 0 .../cloud_security_posture/public/index.ts | 0 .../pages/benchmarks/benchmarks.test.tsx | 0 .../public/pages/benchmarks/benchmarks.tsx | 0 .../benchmarks/benchmarks_table.test.tsx | 0 .../pages/benchmarks/benchmarks_table.tsx | 0 .../public/pages/benchmarks/index.ts | 0 .../public/pages/benchmarks/test_subjects.ts | 0 .../use_csp_benchmark_integrations.ts | 0 .../compliance_score_chart.tsx | 0 .../compliance_charts/risks_table.test.ts | 0 .../compliance_charts/risks_table.tsx | 0 .../compliance_dashboard.test.tsx | 0 .../compliance_dashboard.tsx | 0 .../benchmark_details_box.tsx | 0 .../benchmarks_section.test.tsx | 0 .../dashboard_sections/benchmarks_section.tsx | 0 .../summary_section.test.tsx | 0 .../dashboard_sections/summary_section.tsx | 0 .../pages/compliance_dashboard/index.tsx | 0 .../public/pages/compliance_dashboard/mock.ts | 0 .../compliance_dashboard/test_subjects.ts | 0 .../configurations/__mocks__/findings.ts | 0 .../configurations.handlers.mock.ts | 0 .../configurations/configurations.test.tsx | 0 .../pages/configurations/configurations.tsx | 0 .../findings_detection_rule_counter.tsx | 0 .../findings_flyout/findings_flyout.test.tsx | 0 .../findings_flyout/findings_flyout.tsx | 0 .../findings_flyout/json_tab.tsx | 0 .../findings_flyout/overview_tab.tsx | 0 .../findings_flyout/rule_tab.tsx | 0 .../findings_flyout/table_tab.tsx | 0 .../public/pages/configurations/index.tsx | 0 .../latest_findings/constants.ts | 0 .../findings_table_field_labels.ts | 0 .../latest_findings_container.tsx | 0 .../latest_findings_group_renderer.test.tsx | 0 .../latest_findings_group_renderer.tsx | 0 .../latest_findings/latest_findings_table.tsx | 0 .../latest_findings/use_grouped_findings.tsx | 0 .../latest_findings/use_latest_findings.ts | 0 .../use_latest_findings_grouping.tsx | 0 .../use_latest_findings_table.tsx | 0 .../configurations/layout/error_callout.tsx | 0 .../layout/findings_distribution_bar.tsx | 0 .../layout/findings_search_bar.tsx | 0 .../pages/configurations/test_subjects.ts | 0 .../create_detection_rule_from_benchmark.ts | 0 .../configurations/utils/get_filters.test.ts | 0 .../pages/configurations/utils/get_filters.ts | 0 .../pages/configurations/utils/utils.ts | 0 .../public/pages/findings/findings.tsx | 0 .../public/pages/findings/index.tsx | 0 .../third_party_integrations_callout.tsx | 0 .../public/pages/index.ts | 0 .../public/pages/rules/index.tsx | 0 .../public/pages/rules/rules.test.tsx | 0 .../pages/rules/rules_container.test.tsx | 0 .../public/pages/rules/rules_container.tsx | 0 .../public/pages/rules/rules_counters.tsx | 0 .../rules/rules_detection_rule_counter.tsx | 0 .../public/pages/rules/rules_flyout.tsx | 0 .../public/pages/rules/rules_table.tsx | 0 .../public/pages/rules/rules_table_header.tsx | 0 .../public/pages/rules/test_subjects.ts | 0 .../rules/use_change_csp_rule_state.test.tsx | 0 .../pages/rules/use_change_csp_rule_state.tsx | 0 .../pages/rules/use_csp_benchmark_rules.ts | 0 .../public/pages/rules/use_csp_rules_state.ts | 0 .../_mocks_/vulnerability.mock.ts | 0 .../public/pages/vulnerabilities/constants.ts | 0 .../hooks/use_grouped_vulnerabilities.tsx | 0 .../hooks/use_latest_vulnerabilities.tsx | 0 .../use_latest_vulnerabilities_grouping.tsx | 0 .../use_latest_vulnerabilities_table.tsx | 0 .../public/pages/vulnerabilities/index.tsx | 0 .../latest_vulnerabilities_container.tsx | 0 .../latest_vulnerabilities_group_renderer.tsx | 0 .../latest_vulnerabilities_table.tsx | 0 .../pages/vulnerabilities/test_subjects.ts | 0 .../pages/vulnerabilities/translations.ts | 0 .../public/pages/vulnerabilities/types.ts | 0 ..._detection_rule_from_vulnerability.test.ts | 0 ...reate_detection_rule_from_vulnerability.ts | 0 .../utils/custom_sort_script.ts | 0 .../utils/get_vector_score_list.ts | 0 .../pages/vulnerabilities/vulnerabilities.tsx | 0 .../vulnerability_detection_rule_counter.tsx | 0 .../vulnerability_finding_flyout.test.tsx | 0 .../vulnerability_finding_flyout.tsx | 0 .../vulnerability_json_tab.tsx | 0 .../vulnerability_overview_tab.tsx | 0 .../vulnerability_table_tab.tsx | 0 .../vulnerabilities_table_field_labels.ts | 0 .../vulnerabilities/vulnerabilties.test.tsx | 0 .../_mocks_/vulnerability_dashboard.mock.ts | 0 .../vulnerability_dashboard.test.tsx | 0 .../vulnerability_dashboard.tsx | 0 .../vulnerability_statistics.tsx | 0 .../vulnerability_table_panel.config.ts | 0 .../vulnerability_table_panel.tsx | 0 .../vulnerability_table_panel_section.tsx | 0 .../vulnerability_trend_graph.tsx | 0 .../cloud_security_posture/public/plugin.tsx | 0 .../fixtures/csp_benchmark_integration.ts | 0 .../public/test/fixtures/findings_fixture.ts | 0 .../test/fixtures/get_mock_dependencies.ts | 0 .../public/test/fixtures/react_query.ts | 0 .../handlers/dataview.handlers.mock.ts | 0 .../handlers/fleet.handlers.mock.ts | 0 .../public/test/mock_server/handlers/index.ts | 0 .../handlers/licensing.handlers.mock.ts | 0 .../public/test/mock_server/mock_server.ts | 0 .../mock_server/mock_server_test_provider.tsx | 0 .../public/test/test_provider.tsx | 0 .../public/test/utils.ts | 0 .../cloud_security_posture/public/types.ts | 0 .../cloud_security_posture/server/config.ts | 0 .../create_indices/benchmark_score_mapping.ts | 0 .../create_indices/create_indices.test.ts | 0 .../server/create_indices/create_indices.ts | 0 .../server/create_indices/create_processor.ts | 0 .../server/create_indices/ingest_pipelines.ts | 0 .../server/create_indices/latest_indices.ts | 0 .../server/create_indices/types.ts | 0 .../create_transforms.test.ts | 0 .../create_transforms/create_transforms.ts | 0 .../latest_findings_transform.ts | 0 .../latest_vulnerabilities_transforms.ts | 0 .../fleet_integration/fleet_integration.ts | 0 .../cloud_security_posture/server/index.ts | 0 .../server/lib/check_index_status.ts | 0 .../server/lib/fleet_util.ts | 0 .../server/lib/mapping_field_util.test.ts | 0 .../server/lib/mapping_field_util.ts | 0 .../server/lib/task_manager_util.ts | 0 .../collectors/accounts_stats_collector.ts | 0 .../collectors/alert_stats_collector.ts | 0 .../cloud_accounts_stats_collector.ts | 0 .../collectors/indices_stats_collector.ts | 0 .../installation_stats_collector.ts | 0 .../collectors/muted_rules_stats_collector.ts | 0 .../lib/telemetry/collectors/register.ts | 0 .../collectors/resources_stats_collector.ts | 0 .../collectors/rules_stats_collector.ts | 0 .../server/lib/telemetry/collectors/schema.ts | 0 .../server/lib/telemetry/collectors/types.ts | 0 .../cloud_security_posture/server/mocks.ts | 0 .../server/plugin.test.ts | 0 .../cloud_security_posture/server/plugin.ts | 0 .../bulk_action/bulk_action.ts | 0 .../benchmark_rules/bulk_action/utils.ts | 0 .../routes/benchmark_rules/bulk_action/v1.ts | 0 .../routes/benchmark_rules/find/find.test.ts | 0 .../routes/benchmark_rules/find/find.ts | 0 .../routes/benchmark_rules/find/utils.ts | 0 .../server/routes/benchmark_rules/find/v1.ts | 0 .../server/routes/benchmark_rules/find/v2.ts | 0 .../server/routes/benchmark_rules/find/v3.ts | 0 .../benchmark_rules/get_states/get_states.ts | 0 .../routes/benchmark_rules/get_states/v1.ts | 0 .../benchmarks/benchmarks.handlers.mock.ts | 0 .../routes/benchmarks/benchmarks.test.ts | 0 .../server/routes/benchmarks/benchmarks.ts | 0 .../server/routes/benchmarks/utilities.ts | 0 .../server/routes/benchmarks/v1.ts | 0 .../server/routes/benchmarks/v2.ts | 0 .../compliance_dashboard.ts | 0 .../get_benchmarks.test.ts | 0 .../compliance_dashboard/get_benchmarks.ts | 0 .../compliance_dashboard/get_clusters.test.ts | 0 .../compliance_dashboard/get_clusters.ts | 0 .../get_grouped_findings_evaluation.test.ts | 0 .../get_grouped_findings_evaluation.ts | 0 .../compliance_dashboard/get_stats.test.ts | 0 .../routes/compliance_dashboard/get_stats.ts | 0 .../compliance_dashboard/get_trends.test.ts | 0 .../routes/compliance_dashboard/get_trends.ts | 0 ...ection_engine_alerts_count_by_rule_tags.ts | 0 .../server/routes/graph/route.ts | 0 .../server/routes/graph/v1.ts | 0 .../server/routes/setup_routes.ts | 0 .../routes/status/status.handlers.mock.ts | 0 .../server/routes/status/status.test.ts | 0 .../server/routes/status/status.ts | 0 .../get_top_patchable_vulnerabilities.ts | 0 .../get_top_vulnerabilities.ts | 0 .../get_top_vulnerable_resources.ts | 0 .../get_vulnerabilities_statistics.ts | 0 .../get_vulnerabilities_trend.ts | 0 .../vulnerabilities_dashboard.ts | 0 .../saved_objects/csp_benchmark_rule.ts | 0 .../server/saved_objects/csp_settings.ts | 0 .../server/saved_objects/data_views.ts | 0 .../server/saved_objects/index.ts | 0 .../server/saved_objects/mappings.ts | 0 .../migrations/csp_benchmark_rule.ts | 0 .../server/saved_objects/migrations/index.ts | 0 .../server/tasks/findings_stats_task.ts | 0 .../server/tasks/task_state.test.ts | 0 .../server/tasks/task_state.ts | 0 .../server/tasks/types.ts | 0 .../cloud_security_posture/server/types.ts | 0 .../cloud_security_posture/tsconfig.json | 4 +- .../kubernetes_security/.eslintrc.json | 0 .../plugins/kubernetes_security/README.md | 0 .../kubernetes_security/common/constants.ts | 0 .../common/translations.ts | 0 .../kubernetes_security/common/types/index.ts | 0 .../common/types/latest.ts | 0 .../kubernetes_security/common/types/v1.ts | 0 .../kubernetes_security}/jest.config.js | 9 +- .../plugins/kubernetes_security/kibana.jsonc | 0 .../plugins/kubernetes_security/package.json | 4 +- .../components/charts_toggle/index.test.tsx | 0 .../public/components/charts_toggle/index.tsx | 0 .../container_name_row.test.tsx | 0 .../container_name_row.tsx | 0 .../components/container_name_widget/hooks.ts | 0 .../container_name_widget/index.test.tsx | 0 .../container_name_widget/index.tsx | 0 .../container_name_widget/styles.ts | 0 .../components/count_widget/helpers.test.ts | 0 .../public/components/count_widget/helpers.ts | 0 .../public/components/count_widget/hooks.ts | 0 .../components/count_widget/index.test.tsx | 0 .../public/components/count_widget/index.tsx | 0 .../public/components/count_widget/styles.ts | 0 .../kubernetes_security_routes/index.test.tsx | 0 .../kubernetes_security_routes/index.tsx | 0 .../kubernetes_security_routes/styles.ts | 0 .../public/components/percent_widget/hooks.ts | 0 .../components/percent_widget/index.test.tsx | 0 .../components/percent_widget/index.tsx | 0 .../components/percent_widget/styles.ts | 0 ...on_product_no_results_magnifying_glass.svg | 0 .../__snapshots__/index.test.tsx.snap | 0 .../breadcrumb/helper.test.tsx | 0 .../tree_view_container/breadcrumb/helper.tsx | 0 .../breadcrumb/index.test.tsx | 0 .../tree_view_container/breadcrumb/index.tsx | 0 .../tree_view_container/breadcrumb/styles.ts | 0 .../tree_view_container/contexts.tsx | 0 .../dynamic_tree_view/helpers.test.tsx | 0 .../dynamic_tree_view/helpers.ts | 0 .../dynamic_tree_view/hooks.ts | 0 .../dynamic_tree_view/index.test.tsx | 0 .../dynamic_tree_view/index.tsx | 0 .../dynamic_tree_view/styles.ts | 0 .../dynamic_tree_view/types.ts | 0 .../tree_view_container/empty_state.tsx | 0 .../components/tree_view_container/helpers.ts | 0 .../components/tree_view_container/hooks.tsx | 0 .../tree_view_container/index.test.tsx | 0 .../components/tree_view_container/index.tsx | 0 .../components/tree_view_container/mocks.ts | 0 .../components/tree_view_container/styles.ts | 0 .../tree_view_container/translations.ts | 0 .../tree_view_container/tree_nav/constants.ts | 0 .../tree_nav/index.test.tsx | 0 .../tree_view_container/tree_nav/index.tsx | 0 .../tree_view_container/tree_nav/styles.ts | 0 .../tree_nav/translations.ts | 0 .../tree_view_container/tree_nav/types.ts | 0 .../tree_view_container/tree_view_icon.tsx | 0 .../kubernetes_security/public/hooks/index.ts | 0 .../public/hooks/use_eui_theme.ts | 0 .../public/hooks/use_filter.ts | 0 .../public/hooks/use_last_updated.ts | 0 .../public/hooks/use_scroll.ts | 0 .../kubernetes_security/public/index.ts | 0 .../public/methods/index.tsx | 0 .../kubernetes_security/public/plugin.ts | 0 .../kubernetes_security/public/test/index.tsx | 0 .../kubernetes_security/public/types.ts | 0 .../public/utils/add_commas_to_number.test.ts | 0 .../public/utils/add_commas_to_number.ts | 0 ...erange_and_default_filter_to_query.test.ts | 0 ...d_timerange_and_default_filter_to_query.ts | 0 .../kubernetes_security/server/index.ts | 0 .../kubernetes_security/server/plugin.ts | 0 .../server/routes/aggregate.ts | 0 .../server/routes/count.ts | 0 .../server/routes/index.ts | 0 .../server/routes/multi_terms_aggregate.ts | 0 .../kubernetes_security/server/types.ts | 0 .../plugins/kubernetes_security/tsconfig.json | 4 +- .../plugins/session_view/.eslintrc.json | 0 .../security}/plugins/session_view/README.md | 4 +- .../plugins/session_view/common/constants.ts | 0 .../plugins/session_view/common/index.ts | 0 .../constants/session_view_process.mock.ts | 0 .../responses/session_view_io_events.mock.ts | 0 .../session_view_process_events.mock.ts | 0 ...session_view_process_events_merged.mock.ts | 0 .../session_view/common/translations.ts | 0 .../session_view/common/types/latest.ts | 0 .../plugins/session_view/common/types/v1.ts | 0 .../utils/alert_icon_tooltip_content.test.ts | 0 .../utils/alert_icon_tooltip_content.ts | 0 .../common/utils/expand_dotted_object.test.ts | 0 .../common/utils/expand_dotted_object.ts | 0 .../common/utils/sort_processes.test.ts | 0 .../common/utils/sort_processes.ts | 0 .../plugins/session_view}/jest.config.js | 9 +- .../plugins/session_view/kibana.jsonc | 0 .../plugins/session_view/package.json | 4 +- .../back_to_investigated_alert/index.test.tsx | 0 .../back_to_investigated_alert/index.tsx | 0 .../back_to_investigated_alert/styles.ts | 0 .../detail_panel_accordion/index.test.tsx | 0 .../detail_panel_accordion/index.tsx | 0 .../detail_panel_accordion/styles.ts | 0 .../detail_panel_alert_actions/index.test.tsx | 0 .../detail_panel_alert_actions/index.tsx | 0 .../detail_panel_alert_actions/styles.ts | 0 .../detail_panel_alert_group_item/index.tsx | 0 .../detail_panel_alert_list_item/index.tsx | 0 .../detail_panel_alert_list_item/styles.ts | 0 .../detail_panel_alert_tab/index.test.tsx | 0 .../detail_panel_alert_tab/index.tsx | 0 .../detail_panel_alert_tab/styles.ts | 0 .../__snapshots__/index.test.tsx.snap | 0 .../detail_panel_copy/index.test.tsx | 0 .../components/detail_panel_copy/index.tsx | 0 .../components/detail_panel_copy/styles.ts | 0 .../index.test.tsx | 0 .../detail_panel_description_list/index.tsx | 0 .../detail_panel_description_list/styles.ts | 0 .../detail_panel_list_item/index.test.tsx | 0 .../detail_panel_list_item/index.tsx | 0 .../detail_panel_list_item/styles.ts | 0 .../detail_panel_metadata_tab/helpers.test.ts | 0 .../detail_panel_metadata_tab/helpers.ts | 0 .../detail_panel_metadata_tab/index.test.tsx | 0 .../detail_panel_metadata_tab/index.tsx | 0 .../detail_panel_metadata_tab/styles.ts | 0 .../detail_panel_process_tab/helpers.test.ts | 0 .../detail_panel_process_tab/helpers.ts | 0 .../detail_panel_process_tab/index.test.tsx | 0 .../detail_panel_process_tab/index.tsx | 0 .../detail_panel_process_tab/styles.ts | 0 .../components/process_tree/helpers.test.ts | 0 .../public/components/process_tree/helpers.ts | 0 .../components/process_tree/hooks.test.tsx | 0 .../public/components/process_tree/hooks.ts | 0 .../components/process_tree/index.test.tsx | 0 .../public/components/process_tree/index.tsx | 0 .../public/components/process_tree/styles.ts | 0 .../__snapshots__/index.test.tsx.snap | 0 .../components/process_tree_alert/helpers.ts | 0 .../process_tree_alert/index.test.tsx | 0 .../components/process_tree_alert/index.tsx | 0 .../components/process_tree_alert/styles.ts | 0 .../process_tree_alerts/index.test.tsx | 0 .../components/process_tree_alerts/index.tsx | 0 .../components/process_tree_alerts/styles.ts | 0 .../process_tree_alerts_filter/index.test.tsx | 0 .../process_tree_alerts_filter/index.tsx | 0 .../process_tree_alerts_filter/styles.ts | 0 .../translations.ts | 0 .../process_tree_load_more_button/index.tsx | 0 .../process_tree_load_more_button/styles.ts | 0 .../components/process_tree_node/buttons.tsx | 0 .../process_tree_node/index.test.tsx | 0 .../components/process_tree_node/index.tsx | 0 .../components/process_tree_node/nbsp.tsx | 0 .../process_tree_node/split_text.test.tsx | 0 .../process_tree_node/split_text.tsx | 0 .../components/process_tree_node/styles.ts | 0 .../process_tree_node/text_highlight.test.tsx | 0 .../process_tree_node/text_highlight.tsx | 0 .../process_tree_node/use_button_styles.ts | 0 .../public/components/session_view/hooks.ts | 0 .../components/session_view/index.test.tsx | 0 .../public/components/session_view/index.tsx | 0 .../public/components/session_view/styles.ts | 0 .../components/session_view/translations.ts | 0 .../session_view_detail_panel/helpers.test.ts | 0 .../session_view_detail_panel/helpers.ts | 0 .../session_view_detail_panel/index.test.tsx | 0 .../session_view_detail_panel/index.tsx | 0 .../session_view_detail_panel/styles.ts | 0 .../session_view_display_options/index.tsx | 0 .../session_view_display_options/styles.ts | 0 .../session_view_search_bar/index.test.tsx | 0 .../session_view_search_bar/index.tsx | 0 .../session_view_search_bar/styles.ts | 0 .../components/tty_player/ansi_helpers.ts | 0 .../components/tty_player/hooks.test.tsx | 0 .../public/components/tty_player/hooks.ts | 0 .../components/tty_player/index.test.tsx | 0 .../public/components/tty_player/index.tsx | 0 .../public/components/tty_player/styles.ts | 0 .../components/tty_player/translations.ts | 0 .../components/tty_player/xterm_search.ts | 0 .../tty_player_controls/index.test.tsx | 0 .../components/tty_player_controls/index.tsx | 0 .../components/tty_player_controls/styles.ts | 0 .../tty_player_controls/translations.ts | 0 .../tty_player_controls_markers/index.tsx | 0 .../tty_player_controls_markers/play_head.tsx | 0 .../tty_player_controls_markers/styles.ts | 0 .../components/tty_search_bar/index.test.tsx | 0 .../components/tty_search_bar/index.tsx | 0 .../components/tty_text_sizer/index.test.tsx | 0 .../components/tty_text_sizer/index.tsx | 0 .../components/tty_text_sizer/styles.ts | 0 .../components/tty_text_sizer/translations.ts | 0 .../plugins/session_view/public/constants.ts | 0 .../session_view/public/hooks/index.ts | 0 .../public/hooks/use_date_format.ts | 0 .../public/hooks/use_eui_theme.ts | 0 .../session_view/public/hooks/use_scroll.ts | 0 .../session_view/public/hooks/use_visible.ts | 0 .../plugins/session_view/public/index.ts | 0 .../public/methods/index.test.tsx | 0 .../session_view/public/methods/index.tsx | 0 .../plugins/session_view/public/plugin.ts | 0 .../session_view/public/shared_imports.ts | 0 .../session_view/public/test/index.tsx | 0 .../plugins/session_view/public/types.ts | 0 .../utils/alert_category_display_test.test.ts | 0 .../utils/alert_category_display_text.ts | 0 .../public/utils/data_or_dash.test.ts | 0 .../session_view/public/utils/data_or_dash.ts | 0 .../plugins/session_view/server/index.ts | 0 .../plugins/session_view/server/plugin.ts | 0 .../server/routes/alert_status_route.test.ts | 0 .../server/routes/alert_status_route.ts | 0 .../server/routes/alerts_client_mock.test.ts | 0 .../server/routes/alerts_route.test.ts | 0 .../server/routes/alerts_route.ts | 0 .../server/routes/get_total_io_bytes_route.ts | 0 .../session_view/server/routes/index.ts | 0 .../server/routes/io_events_route.test.ts | 0 .../server/routes/io_events_route.ts | 0 .../routes/process_events_route.test.ts | 0 .../server/routes/process_events_route.ts | 0 .../plugins/session_view/server/types.ts | 0 .../plugins/session_view/tsconfig.json | 4 +- yarn.lock | 16 +- 843 files changed, 1549 insertions(+), 1524 deletions(-) delete mode 100644 x-pack/packages/kbn-cloud-security-posture/common/README.md create mode 100644 x-pack/platform/packages/shared/kbn-cloud-security-posture/common/README.md rename x-pack/{packages => platform/packages/shared}/kbn-cloud-security-posture/common/constants.ts (100%) rename x-pack/{packages => platform/packages/shared}/kbn-cloud-security-posture/common/index.ts (100%) rename x-pack/{packages => platform/packages/shared}/kbn-cloud-security-posture/common/jest.config.js (71%) rename x-pack/{packages => platform/packages/shared}/kbn-cloud-security-posture/common/kibana.jsonc (100%) rename x-pack/{packages => platform/packages/shared}/kbn-cloud-security-posture/common/package.json (100%) rename x-pack/{packages => platform/packages/shared}/kbn-cloud-security-posture/common/schema/graph/index.ts (100%) rename x-pack/{packages => platform/packages/shared}/kbn-cloud-security-posture/common/schema/graph/latest.ts (100%) rename x-pack/{packages => platform/packages/shared}/kbn-cloud-security-posture/common/schema/graph/v1.ts (100%) rename x-pack/{packages => platform/packages/shared}/kbn-cloud-security-posture/common/schema/rules/index.ts (100%) rename x-pack/{packages => platform/packages/shared}/kbn-cloud-security-posture/common/schema/rules/latest.ts (100%) rename x-pack/{packages => platform/packages/shared}/kbn-cloud-security-posture/common/schema/rules/v1.ts (100%) rename x-pack/{packages => platform/packages/shared}/kbn-cloud-security-posture/common/schema/rules/v2.ts (100%) rename x-pack/{packages => platform/packages/shared}/kbn-cloud-security-posture/common/schema/rules/v3.ts (100%) rename x-pack/{packages => platform/packages/shared}/kbn-cloud-security-posture/common/schema/rules/v4.ts (100%) rename x-pack/{packages => platform/packages/shared}/kbn-cloud-security-posture/common/schema/rules/v5.ts (100%) rename x-pack/{packages => platform/packages/shared}/kbn-cloud-security-posture/common/schema/vulnerabilities/csp_vulnerability_finding.ts (100%) rename x-pack/{packages => platform/packages/shared}/kbn-cloud-security-posture/common/schema/vulnerabilities/latest.ts (100%) rename x-pack/{packages => platform/packages/shared}/kbn-cloud-security-posture/common/tsconfig.json (87%) rename x-pack/{packages => platform/packages/shared}/kbn-cloud-security-posture/common/types/benchmark.ts (100%) rename x-pack/{packages => platform/packages/shared}/kbn-cloud-security-posture/common/types/findings.ts (100%) rename x-pack/{packages => platform/packages/shared}/kbn-cloud-security-posture/common/types/graph/index.ts (100%) rename x-pack/{packages => platform/packages/shared}/kbn-cloud-security-posture/common/types/graph/latest.ts (100%) rename x-pack/{packages => platform/packages/shared}/kbn-cloud-security-posture/common/types/graph/v1.ts (100%) rename x-pack/{packages => platform/packages/shared}/kbn-cloud-security-posture/common/types/status.ts (100%) rename x-pack/{packages => platform/packages/shared}/kbn-cloud-security-posture/common/types/vulnerabilities.ts (100%) rename x-pack/{packages => platform/packages/shared}/kbn-cloud-security-posture/common/utils/get_abbreviated_number.test.ts (100%) rename x-pack/{packages => platform/packages/shared}/kbn-cloud-security-posture/common/utils/get_abbreviated_number.ts (100%) rename x-pack/{packages => platform/packages/shared}/kbn-cloud-security-posture/common/utils/helpers.test.ts (100%) rename x-pack/{packages => platform/packages/shared}/kbn-cloud-security-posture/common/utils/helpers.ts (96%) rename x-pack/{packages => platform/packages/shared}/kbn-cloud-security-posture/common/utils/ui_metrics.ts (100%) rename x-pack/{ => solutions/security}/packages/kbn-cloud-security-posture/graph/README.md (100%) rename x-pack/{ => solutions/security}/packages/kbn-cloud-security-posture/graph/index.ts (100%) rename x-pack/{ => solutions/security}/packages/kbn-cloud-security-posture/graph/jest.config.js (65%) rename x-pack/{ => solutions/security}/packages/kbn-cloud-security-posture/graph/kibana.jsonc (100%) rename x-pack/{ => solutions/security}/packages/kbn-cloud-security-posture/graph/package.json (100%) rename x-pack/{ => solutions/security}/packages/kbn-cloud-security-posture/graph/setup_tests.ts (100%) rename x-pack/{ => solutions/security}/packages/kbn-cloud-security-posture/graph/src/assets/icons/aws.svg (100%) rename x-pack/{ => solutions/security}/packages/kbn-cloud-security-posture/graph/src/assets/icons/aws_ec2.svg (100%) rename x-pack/{ => solutions/security}/packages/kbn-cloud-security-posture/graph/src/assets/icons/aws_s3.svg (100%) rename x-pack/{ => solutions/security}/packages/kbn-cloud-security-posture/graph/src/assets/icons/okta.svg (100%) rename x-pack/{ => solutions/security}/packages/kbn-cloud-security-posture/graph/src/common/constants.ts (100%) rename x-pack/{ => solutions/security}/packages/kbn-cloud-security-posture/graph/src/components/edge/deafult_edge.stories.tsx (96%) rename x-pack/{ => solutions/security}/packages/kbn-cloud-security-posture/graph/src/components/edge/default_edge.tsx (100%) rename x-pack/{ => solutions/security}/packages/kbn-cloud-security-posture/graph/src/components/edge/index.ts (100%) rename x-pack/{ => solutions/security}/packages/kbn-cloud-security-posture/graph/src/components/edge/styles.tsx (100%) rename x-pack/{ => solutions/security}/packages/kbn-cloud-security-posture/graph/src/components/edge/utils.ts (100%) rename x-pack/{ => solutions/security}/packages/kbn-cloud-security-posture/graph/src/components/graph/graph.test.tsx (100%) rename x-pack/{ => solutions/security}/packages/kbn-cloud-security-posture/graph/src/components/graph/graph.tsx (100%) rename x-pack/{ => solutions/security}/packages/kbn-cloud-security-posture/graph/src/components/graph/graph_popover.stories.tsx (93%) rename x-pack/{ => solutions/security}/packages/kbn-cloud-security-posture/graph/src/components/graph/graph_popover.tsx (100%) rename x-pack/{ => solutions/security}/packages/kbn-cloud-security-posture/graph/src/components/graph/layout_graph.ts (100%) rename x-pack/{ => solutions/security}/packages/kbn-cloud-security-posture/graph/src/components/graph/use_graph_popover.tsx (100%) rename x-pack/{ => solutions/security}/packages/kbn-cloud-security-posture/graph/src/components/graph/utils.ts (100%) rename x-pack/{ => solutions/security}/packages/kbn-cloud-security-posture/graph/src/components/graph_investigation/graph_investigation.tsx (100%) rename x-pack/{ => solutions/security}/packages/kbn-cloud-security-posture/graph/src/components/graph_investigation/graph_node_expand_popover.tsx (75%) rename x-pack/{ => solutions/security}/packages/kbn-cloud-security-posture/graph/src/components/graph_investigation/use_graph_node_expand_popover.tsx (98%) rename x-pack/{ => solutions/security}/packages/kbn-cloud-security-posture/graph/src/components/graph_layout.stories.test.tsx (98%) rename x-pack/{ => solutions/security}/packages/kbn-cloud-security-posture/graph/src/components/graph_layout.stories.tsx (98%) rename x-pack/{ => solutions/security}/packages/kbn-cloud-security-posture/graph/src/components/index.ts (100%) rename x-pack/{ => solutions/security}/packages/kbn-cloud-security-posture/graph/src/components/mock/react_flow.ts (96%) rename x-pack/{ => solutions/security}/packages/kbn-cloud-security-posture/graph/src/components/mock/test_providers.tsx (100%) rename x-pack/{ => solutions/security}/packages/kbn-cloud-security-posture/graph/src/components/node/button.stories.tsx (95%) rename x-pack/{ => solutions/security}/packages/kbn-cloud-security-posture/graph/src/components/node/diamond_node.tsx (96%) rename x-pack/{ => solutions/security}/packages/kbn-cloud-security-posture/graph/src/components/node/edge_group_node.tsx (96%) rename x-pack/{ => solutions/security}/packages/kbn-cloud-security-posture/graph/src/components/node/ellipse_node.tsx (96%) rename x-pack/{ => solutions/security}/packages/kbn-cloud-security-posture/graph/src/components/node/get_span_icon.ts (91%) rename x-pack/{ => solutions/security}/packages/kbn-cloud-security-posture/graph/src/components/node/hexagon_node.tsx (96%) rename x-pack/{ => solutions/security}/packages/kbn-cloud-security-posture/graph/src/components/node/index.ts (100%) rename x-pack/{ => solutions/security}/packages/kbn-cloud-security-posture/graph/src/components/node/label_node.tsx (93%) rename x-pack/{ => solutions/security}/packages/kbn-cloud-security-posture/graph/src/components/node/node.stories.tsx (100%) rename x-pack/{ => solutions/security}/packages/kbn-cloud-security-posture/graph/src/components/node/node_expand_button.tsx (100%) rename x-pack/{ => solutions/security}/packages/kbn-cloud-security-posture/graph/src/components/node/pentagon_node.tsx (96%) rename x-pack/{ => solutions/security}/packages/kbn-cloud-security-posture/graph/src/components/node/rectangle_node.tsx (96%) rename x-pack/{ => solutions/security}/packages/kbn-cloud-security-posture/graph/src/components/node/shapes/diamond_shape.tsx (98%) rename x-pack/{ => solutions/security}/packages/kbn-cloud-security-posture/graph/src/components/node/shapes/ellipse_shape.tsx (87%) rename x-pack/{ => solutions/security}/packages/kbn-cloud-security-posture/graph/src/components/node/shapes/hexagon_shape.tsx (98%) rename x-pack/{ => solutions/security}/packages/kbn-cloud-security-posture/graph/src/components/node/shapes/pentagon_shape.tsx (98%) rename x-pack/{ => solutions/security}/packages/kbn-cloud-security-posture/graph/src/components/node/shapes/rectangle_shape.tsx (88%) rename x-pack/{ => solutions/security}/packages/kbn-cloud-security-posture/graph/src/components/node/shapes/types.ts (100%) rename x-pack/{ => solutions/security}/packages/kbn-cloud-security-posture/graph/src/components/node/styles.tsx (100%) rename x-pack/{ => solutions/security}/packages/kbn-cloud-security-posture/graph/src/components/styles.tsx (100%) rename x-pack/{ => solutions/security}/packages/kbn-cloud-security-posture/graph/src/components/test_ids.ts (100%) rename x-pack/{ => solutions/security}/packages/kbn-cloud-security-posture/graph/src/components/types.ts (92%) rename x-pack/{ => solutions/security}/packages/kbn-cloud-security-posture/graph/src/hooks/index.ts (100%) rename x-pack/{ => solutions/security}/packages/kbn-cloud-security-posture/graph/src/hooks/use_fetch_graph_data.test.tsx (100%) rename x-pack/{ => solutions/security}/packages/kbn-cloud-security-posture/graph/src/hooks/use_fetch_graph_data.ts (100%) rename x-pack/{ => solutions/security}/packages/kbn-cloud-security-posture/graph/tsconfig.json (88%) rename x-pack/{ => solutions/security}/packages/kbn-cloud-security-posture/public/index.ts (100%) rename x-pack/{ => solutions/security}/packages/kbn-cloud-security-posture/public/jest.config.js (70%) rename x-pack/{ => solutions/security}/packages/kbn-cloud-security-posture/public/kibana.jsonc (100%) rename x-pack/{ => solutions/security}/packages/kbn-cloud-security-posture/public/package.json (100%) rename x-pack/{ => solutions/security}/packages/kbn-cloud-security-posture/public/src/components/csp_evaluation_badge.tsx (75%) rename x-pack/{ => solutions/security}/packages/kbn-cloud-security-posture/public/src/components/vulnerability_badges.tsx (100%) rename x-pack/{ => solutions/security}/packages/kbn-cloud-security-posture/public/src/constants/component_constants.ts (100%) rename x-pack/{ => solutions/security}/packages/kbn-cloud-security-posture/public/src/constants/navigation.ts (81%) rename x-pack/{ => solutions/security}/packages/kbn-cloud-security-posture/public/src/hooks/use_csp_setup_status_api.ts (100%) rename x-pack/{ => solutions/security}/packages/kbn-cloud-security-posture/public/src/hooks/use_data_view.ts (100%) rename x-pack/{ => solutions/security}/packages/kbn-cloud-security-posture/public/src/hooks/use_get_benchmark_rules_state_api.ts (100%) rename x-pack/{ => solutions/security}/packages/kbn-cloud-security-posture/public/src/hooks/use_get_navigation_url_params.ts (100%) rename x-pack/{ => solutions/security}/packages/kbn-cloud-security-posture/public/src/hooks/use_has_misconfigurations.ts (100%) rename x-pack/{ => solutions/security}/packages/kbn-cloud-security-posture/public/src/hooks/use_has_vulnerabilities.ts (100%) rename x-pack/{ => solutions/security}/packages/kbn-cloud-security-posture/public/src/hooks/use_misconfiguration_findings.ts (96%) rename x-pack/{ => solutions/security}/packages/kbn-cloud-security-posture/public/src/hooks/use_misconfiguration_preview.ts (95%) rename x-pack/{ => solutions/security}/packages/kbn-cloud-security-posture/public/src/hooks/use_navigate_findings.test.ts (100%) rename x-pack/{ => solutions/security}/packages/kbn-cloud-security-posture/public/src/hooks/use_navigate_findings.ts (100%) rename x-pack/{ => solutions/security}/packages/kbn-cloud-security-posture/public/src/hooks/use_vulnerabilities_findings.ts (100%) rename x-pack/{ => solutions/security}/packages/kbn-cloud-security-posture/public/src/hooks/use_vulnerabilities_preview.ts (100%) rename x-pack/{ => solutions/security}/packages/kbn-cloud-security-posture/public/src/types.ts (100%) rename x-pack/{ => solutions/security}/packages/kbn-cloud-security-posture/public/src/utils/get_vulnerabilitiy_colors.test.ts (100%) rename x-pack/{ => solutions/security}/packages/kbn-cloud-security-posture/public/src/utils/get_vulnerability_colors.ts (100%) rename x-pack/{ => solutions/security}/packages/kbn-cloud-security-posture/public/src/utils/get_vulnerability_text.test.ts (100%) rename x-pack/{ => solutions/security}/packages/kbn-cloud-security-posture/public/src/utils/get_vulnerability_text.ts (100%) rename x-pack/{ => solutions/security}/packages/kbn-cloud-security-posture/public/src/utils/hooks_utils.test.ts (100%) rename x-pack/{ => solutions/security}/packages/kbn-cloud-security-posture/public/src/utils/hooks_utils.ts (98%) rename x-pack/{ => solutions/security}/packages/kbn-cloud-security-posture/public/src/utils/query_utils.test.ts (100%) rename x-pack/{ => solutions/security}/packages/kbn-cloud-security-posture/public/src/utils/query_utils.ts (93%) rename x-pack/{ => solutions/security}/packages/kbn-cloud-security-posture/public/src/utils/show_error_toast.ts (90%) rename x-pack/{ => solutions/security}/packages/kbn-cloud-security-posture/public/src/utils/vulnerability_helpers.test.ts (100%) rename x-pack/{ => solutions/security}/packages/kbn-cloud-security-posture/public/src/utils/vulnerability_helpers.ts (98%) rename x-pack/{ => solutions/security}/packages/kbn-cloud-security-posture/public/tsconfig.json (94%) rename x-pack/{ => solutions/security}/plugins/asset_inventory/README.md (100%) rename x-pack/{ => solutions/security}/plugins/asset_inventory/common/index.ts (100%) rename x-pack/{ => solutions/security}/plugins/asset_inventory/kibana.jsonc (100%) rename x-pack/{ => solutions/security}/plugins/asset_inventory/package.json (100%) rename x-pack/{ => solutions/security}/plugins/asset_inventory/public/application.tsx (100%) rename x-pack/{ => solutions/security}/plugins/asset_inventory/public/components/app.tsx (100%) rename x-pack/{ => solutions/security}/plugins/asset_inventory/public/index.ts (100%) rename x-pack/{ => solutions/security}/plugins/asset_inventory/public/plugin.ts (100%) rename x-pack/{ => solutions/security}/plugins/asset_inventory/public/types.ts (100%) rename x-pack/{ => solutions/security}/plugins/asset_inventory/server/create_transforms/create_transforms.ts (100%) rename x-pack/{ => solutions/security}/plugins/asset_inventory/server/index.ts (100%) rename x-pack/{ => solutions/security}/plugins/asset_inventory/server/plugin.ts (100%) rename x-pack/{ => solutions/security}/plugins/asset_inventory/server/routes/index.ts (100%) rename x-pack/{ => solutions/security}/plugins/asset_inventory/server/types.ts (100%) rename x-pack/{ => solutions/security}/plugins/asset_inventory/tsconfig.json (82%) rename x-pack/{ => solutions/security}/plugins/cloud_defend/.i18nrc.json (100%) rename x-pack/{ => solutions/security}/plugins/cloud_defend/README.md (85%) rename x-pack/{ => solutions/security}/plugins/cloud_defend/common/constants.ts (100%) rename x-pack/{ => solutions/security}/plugins/cloud_defend/common/index.ts (100%) rename x-pack/{ => solutions/security}/plugins/cloud_defend/common/latest.ts (100%) rename x-pack/{ => solutions/security}/plugins/cloud_defend/common/schemas/v1.ts (100%) rename x-pack/{ => solutions/security}/plugins/cloud_defend/common/utils/helpers.test.ts (100%) rename x-pack/{ => solutions/security}/plugins/cloud_defend/common/utils/helpers.ts (100%) rename x-pack/{ => solutions/security}/plugins/cloud_defend/common/utils/subscription.test.ts (100%) rename x-pack/{ => solutions/security}/plugins/cloud_defend/common/utils/subscription.ts (100%) rename x-pack/{ => solutions/security}/plugins/cloud_defend/common/v1.ts (100%) rename x-pack/{ => solutions/security}/plugins/cloud_defend/jest.config.js (57%) rename x-pack/{ => solutions/security}/plugins/cloud_defend/kibana.jsonc (100%) rename x-pack/{ => solutions/security}/plugins/cloud_defend/public/application/route.tsx (100%) rename x-pack/{ => solutions/security}/plugins/cloud_defend/public/application/router.test.tsx (100%) rename x-pack/{ => solutions/security}/plugins/cloud_defend/public/application/router.tsx (100%) rename x-pack/{ => solutions/security}/plugins/cloud_defend/public/application/security_solution_context.ts (100%) rename x-pack/{ => solutions/security}/plugins/cloud_defend/public/application/setup_context.ts (100%) rename x-pack/{ => solutions/security}/plugins/cloud_defend/public/assets/icons/logo.svg (100%) rename x-pack/{ => solutions/security}/plugins/cloud_defend/public/common/api/use_cloud_defend_integration.tsx (100%) rename x-pack/{ => solutions/security}/plugins/cloud_defend/public/common/api/use_setup_status_api.ts (100%) rename x-pack/{ => solutions/security}/plugins/cloud_defend/public/common/constants.ts (100%) rename x-pack/{ => solutions/security}/plugins/cloud_defend/public/common/hooks/use_kibana.ts (100%) rename x-pack/{ => solutions/security}/plugins/cloud_defend/public/common/hooks/use_page_size.ts (100%) rename x-pack/{ => solutions/security}/plugins/cloud_defend/public/common/hooks/use_subscription_status.ts (100%) rename x-pack/{ => solutions/security}/plugins/cloud_defend/public/common/navigation/constants.ts (100%) rename x-pack/{ => solutions/security}/plugins/cloud_defend/public/common/navigation/security_solution_links.test.ts (100%) rename x-pack/{ => solutions/security}/plugins/cloud_defend/public/common/navigation/security_solution_links.ts (100%) rename x-pack/{ => solutions/security}/plugins/cloud_defend/public/common/navigation/types.ts (100%) rename x-pack/{ => solutions/security}/plugins/cloud_defend/public/common/navigation/use_cloud_defend_integration_links.ts (100%) rename x-pack/{ => solutions/security}/plugins/cloud_defend/public/common/utils.test.ts (100%) rename x-pack/{ => solutions/security}/plugins/cloud_defend/public/common/utils.ts (100%) rename x-pack/{ => solutions/security}/plugins/cloud_defend/public/components/cloud_defend_page/index.test.tsx (100%) rename x-pack/{ => solutions/security}/plugins/cloud_defend/public/components/cloud_defend_page/index.tsx (100%) rename x-pack/{ => solutions/security}/plugins/cloud_defend/public/components/cloud_defend_page_title/index.tsx (100%) rename x-pack/{ => solutions/security}/plugins/cloud_defend/public/components/control_general_view/index.test.tsx (100%) rename x-pack/{ => solutions/security}/plugins/cloud_defend/public/components/control_general_view/index.tsx (100%) rename x-pack/{ => solutions/security}/plugins/cloud_defend/public/components/control_general_view/styles.ts (100%) rename x-pack/{ => solutions/security}/plugins/cloud_defend/public/components/control_general_view/translations.ts (100%) rename x-pack/{ => solutions/security}/plugins/cloud_defend/public/components/control_general_view_response/index.test.tsx (100%) rename x-pack/{ => solutions/security}/plugins/cloud_defend/public/components/control_general_view_response/index.tsx (100%) rename x-pack/{ => solutions/security}/plugins/cloud_defend/public/components/control_general_view_response/styles.ts (100%) rename x-pack/{ => solutions/security}/plugins/cloud_defend/public/components/control_general_view_selector/index.test.tsx (100%) rename x-pack/{ => solutions/security}/plugins/cloud_defend/public/components/control_general_view_selector/index.tsx (100%) rename x-pack/{ => solutions/security}/plugins/cloud_defend/public/components/control_general_view_selector/styles.ts (100%) rename x-pack/{ => solutions/security}/plugins/cloud_defend/public/components/control_settings/index.test.tsx (100%) rename x-pack/{ => solutions/security}/plugins/cloud_defend/public/components/control_settings/index.tsx (100%) rename x-pack/{ => solutions/security}/plugins/cloud_defend/public/components/control_settings/translations.ts (100%) rename x-pack/{ => solutions/security}/plugins/cloud_defend/public/components/control_yaml_view/hooks/policy_schema.json (100%) rename x-pack/{ => solutions/security}/plugins/cloud_defend/public/components/control_yaml_view/hooks/use_config_model.ts (100%) rename x-pack/{ => solutions/security}/plugins/cloud_defend/public/components/control_yaml_view/index.test.tsx (100%) rename x-pack/{ => solutions/security}/plugins/cloud_defend/public/components/control_yaml_view/index.tsx (100%) rename x-pack/{ => solutions/security}/plugins/cloud_defend/public/components/control_yaml_view/styles.ts (100%) rename x-pack/{ => solutions/security}/plugins/cloud_defend/public/components/control_yaml_view/translations.ts (100%) rename x-pack/{ => solutions/security}/plugins/cloud_defend/public/components/fleet_extensions/custom_assets_extension.tsx (100%) rename x-pack/{ => solutions/security}/plugins/cloud_defend/public/components/fleet_extensions/package_policy_replace_define_step_extension.tsx (100%) rename x-pack/{ => solutions/security}/plugins/cloud_defend/public/components/full_size_page/index.tsx (100%) rename x-pack/{ => solutions/security}/plugins/cloud_defend/public/components/loading_state/index.tsx (100%) rename x-pack/{ => solutions/security}/plugins/cloud_defend/public/components/policies_table/index.test.tsx (100%) rename x-pack/{ => solutions/security}/plugins/cloud_defend/public/components/policies_table/index.tsx (100%) rename x-pack/{ => solutions/security}/plugins/cloud_defend/public/components/policy_settings/index.test.tsx (100%) rename x-pack/{ => solutions/security}/plugins/cloud_defend/public/components/policy_settings/index.tsx (100%) rename x-pack/{ => solutions/security}/plugins/cloud_defend/public/components/policy_settings/translations.ts (100%) rename x-pack/{ => solutions/security}/plugins/cloud_defend/public/components/subscription_not_allowed/index.tsx (100%) rename x-pack/{ => solutions/security}/plugins/cloud_defend/public/components/timestamp_table_cell/index.tsx (100%) rename x-pack/{ => solutions/security}/plugins/cloud_defend/public/index.ts (100%) rename x-pack/{ => solutions/security}/plugins/cloud_defend/public/pages/index.ts (100%) rename x-pack/{ => solutions/security}/plugins/cloud_defend/public/pages/policies/index.test.tsx (100%) rename x-pack/{ => solutions/security}/plugins/cloud_defend/public/pages/policies/index.tsx (100%) rename x-pack/{ => solutions/security}/plugins/cloud_defend/public/pages/policies/test_subjects.ts (100%) rename x-pack/{ => solutions/security}/plugins/cloud_defend/public/pages/policies/use_cloud_defend_policies.ts (100%) rename x-pack/{ => solutions/security}/plugins/cloud_defend/public/plugin.tsx (100%) rename x-pack/{ => solutions/security}/plugins/cloud_defend/public/test/__mocks__/worker.js (100%) rename x-pack/{ => solutions/security}/plugins/cloud_defend/public/test/fixtures/cloud_defend_integration.ts (100%) rename x-pack/{ => solutions/security}/plugins/cloud_defend/public/test/fixtures/navigation_item.ts (100%) rename x-pack/{ => solutions/security}/plugins/cloud_defend/public/test/fixtures/react_query.ts (100%) rename x-pack/{ => solutions/security}/plugins/cloud_defend/public/test/mocks.ts (100%) rename x-pack/{ => solutions/security}/plugins/cloud_defend/public/test/test_provider.tsx (100%) rename x-pack/{ => solutions/security}/plugins/cloud_defend/public/test/utils.ts (100%) rename x-pack/{ => solutions/security}/plugins/cloud_defend/public/types.ts (100%) rename x-pack/{ => solutions/security}/plugins/cloud_defend/server/index.ts (100%) rename x-pack/{ => solutions/security}/plugins/cloud_defend/server/lib/check_index_status.ts (100%) rename x-pack/{ => solutions/security}/plugins/cloud_defend/server/lib/fleet_util.ts (100%) rename x-pack/{ => solutions/security}/plugins/cloud_defend/server/lib/telemetry/collectors/accounts_stats_collector.ts (100%) rename x-pack/{ => solutions/security}/plugins/cloud_defend/server/lib/telemetry/collectors/indices_stats_collector.ts (100%) rename x-pack/{ => solutions/security}/plugins/cloud_defend/server/lib/telemetry/collectors/installation_stats_collector.ts (100%) rename x-pack/{ => solutions/security}/plugins/cloud_defend/server/lib/telemetry/collectors/pods_stats_collector.ts (100%) rename x-pack/{ => solutions/security}/plugins/cloud_defend/server/lib/telemetry/collectors/register.ts (100%) rename x-pack/{ => solutions/security}/plugins/cloud_defend/server/lib/telemetry/collectors/schema.ts (100%) rename x-pack/{ => solutions/security}/plugins/cloud_defend/server/lib/telemetry/collectors/types.ts (96%) rename x-pack/{ => solutions/security}/plugins/cloud_defend/server/mocks.ts (100%) rename x-pack/{ => solutions/security}/plugins/cloud_defend/server/plugin.test.ts (100%) rename x-pack/{ => solutions/security}/plugins/cloud_defend/server/plugin.ts (100%) rename x-pack/{ => solutions/security}/plugins/cloud_defend/server/routes/policies/policies.test.ts (100%) rename x-pack/{ => solutions/security}/plugins/cloud_defend/server/routes/policies/policies.ts (100%) rename x-pack/{ => solutions/security}/plugins/cloud_defend/server/routes/setup_routes.ts (100%) rename x-pack/{ => solutions/security}/plugins/cloud_defend/server/routes/status/status.test.ts (100%) rename x-pack/{ => solutions/security}/plugins/cloud_defend/server/routes/status/status.ts (100%) rename x-pack/{ => solutions/security}/plugins/cloud_defend/server/types.ts (100%) rename x-pack/{ => solutions/security}/plugins/cloud_defend/tsconfig.json (92%) rename x-pack/{ => solutions/security}/plugins/cloud_security_posture/README.md (81%) rename x-pack/{ => solutions/security}/plugins/cloud_security_posture/common/constants.ts (100%) rename x-pack/{ => solutions/security}/plugins/cloud_security_posture/common/dev_docs/__auto_generated_csp_requirements_test_coverage.md (58%) rename x-pack/{ => solutions/security}/plugins/cloud_security_posture/common/index.ts (100%) rename x-pack/{ => solutions/security}/plugins/cloud_security_posture/common/runtime_mappings/get_identifier_runtime_mapping.ts (100%) rename x-pack/{ => solutions/security}/plugins/cloud_security_posture/common/runtime_mappings/get_package_policy_id_mapping.ts (100%) rename x-pack/{ => solutions/security}/plugins/cloud_security_posture/common/runtime_mappings/get_safe_posture_type_runtime_mapping.ts (100%) rename x-pack/{ => solutions/security}/plugins/cloud_security_posture/common/schemas/stats.ts (100%) rename x-pack/{ => solutions/security}/plugins/cloud_security_posture/common/scripts/__auto_generated_csp_test_log.json (98%) rename x-pack/{ => solutions/security}/plugins/cloud_security_posture/common/scripts/get_tests.js (98%) rename x-pack/{ => solutions/security}/plugins/cloud_security_posture/common/types/benchmarks/v1.ts (100%) rename x-pack/{ => solutions/security}/plugins/cloud_security_posture/common/types/benchmarks/v2.ts (100%) rename x-pack/{ => solutions/security}/plugins/cloud_security_posture/common/types/index.ts (100%) rename x-pack/{ => solutions/security}/plugins/cloud_security_posture/common/types/latest.ts (100%) rename x-pack/{ => solutions/security}/plugins/cloud_security_posture/common/types_old.ts (100%) rename x-pack/{ => solutions/security}/plugins/cloud_security_posture/common/utils/detection_rules.test.ts (100%) rename x-pack/{ => solutions/security}/plugins/cloud_security_posture/common/utils/detection_rules.ts (100%) rename x-pack/{ => solutions/security}/plugins/cloud_security_posture/common/utils/helpers.test.ts (100%) rename x-pack/{ => solutions/security}/plugins/cloud_security_posture/common/utils/helpers.ts (100%) rename x-pack/{ => solutions/security}/plugins/cloud_security_posture/common/utils/rules_states.ts (100%) rename x-pack/{ => solutions/security}/plugins/cloud_security_posture/common/utils/subscription.test.ts (100%) rename x-pack/{ => solutions/security}/plugins/cloud_security_posture/common/utils/subscription.ts (100%) rename x-pack/{ => solutions/security}/plugins/cloud_security_posture/jest.config.js (80%) rename x-pack/{ => solutions/security}/plugins/cloud_security_posture/kibana.jsonc (100%) rename x-pack/{ => solutions/security}/plugins/cloud_security_posture/public/application/csp_route.tsx (100%) rename x-pack/{ => solutions/security}/plugins/cloud_security_posture/public/application/csp_router.test.tsx (100%) rename x-pack/{ => solutions/security}/plugins/cloud_security_posture/public/application/csp_router.tsx (100%) rename x-pack/{ => solutions/security}/plugins/cloud_security_posture/public/application/security_solution_context.ts (100%) rename x-pack/{ => solutions/security}/plugins/cloud_security_posture/public/application/setup_context.ts (100%) rename x-pack/{ => solutions/security}/plugins/cloud_security_posture/public/assets/icons/cis_aks_logo.svg (100%) rename x-pack/{ => solutions/security}/plugins/cloud_security_posture/public/assets/icons/cis_eks_logo.svg (100%) rename x-pack/{ => solutions/security}/plugins/cloud_security_posture/public/assets/icons/cis_gke_logo.svg (100%) rename x-pack/{ => solutions/security}/plugins/cloud_security_posture/public/assets/icons/cis_logo.svg (100%) rename x-pack/{ => solutions/security}/plugins/cloud_security_posture/public/assets/icons/google_cloud_logo.svg (100%) rename x-pack/{ => solutions/security}/plugins/cloud_security_posture/public/assets/icons/nvd_logo_svg.tsx (100%) rename x-pack/{ => solutions/security}/plugins/cloud_security_posture/public/assets/icons/redhat_logo.svg (100%) rename x-pack/{ => solutions/security}/plugins/cloud_security_posture/public/assets/illustrations/clouds.svg (100%) rename x-pack/{ => solutions/security}/plugins/cloud_security_posture/public/assets/illustrations/illustration_product_no_results_magnifying_glass.svg (100%) rename x-pack/{ => solutions/security}/plugins/cloud_security_posture/public/assets/illustrations/misconfigurations_vendors.svg (100%) rename x-pack/{ => solutions/security}/plugins/cloud_security_posture/public/assets/illustrations/no_data_illustration.svg (100%) rename x-pack/{ => solutions/security}/plugins/cloud_security_posture/public/assets/illustrations/vulnerabilities_vendors.svg (100%) rename x-pack/{ => solutions/security}/plugins/cloud_security_posture/public/common/api/create_detection_rule.ts (100%) rename x-pack/{ => solutions/security}/plugins/cloud_security_posture/public/common/api/index.ts (100%) rename x-pack/{ => solutions/security}/plugins/cloud_security_posture/public/common/api/use_cis_kubernetes_integration.tsx (100%) rename x-pack/{ => solutions/security}/plugins/cloud_security_posture/public/common/api/use_fetch_detection_rules_alerts_status.ts (100%) rename x-pack/{ => solutions/security}/plugins/cloud_security_posture/public/common/api/use_fetch_detection_rules_by_tags.ts (100%) rename x-pack/{ => solutions/security}/plugins/cloud_security_posture/public/common/api/use_license_management_locator_api.tsx (100%) rename x-pack/{ => solutions/security}/plugins/cloud_security_posture/public/common/api/use_package_policy_list.ts (100%) rename x-pack/{ => solutions/security}/plugins/cloud_security_posture/public/common/api/use_stats_api.ts (100%) rename x-pack/{ => solutions/security}/plugins/cloud_security_posture/public/common/api/use_vulnerability_dashboard_api.ts (100%) rename x-pack/{ => solutions/security}/plugins/cloud_security_posture/public/common/api/use_wiz_integration_route.ts (100%) rename x-pack/{ => solutions/security}/plugins/cloud_security_posture/public/common/component/multi_select_filter.tsx (100%) rename x-pack/{ => solutions/security}/plugins/cloud_security_posture/public/common/constants.ts (100%) rename x-pack/{ => solutions/security}/plugins/cloud_security_posture/public/common/contexts/data_view_context.ts (100%) rename x-pack/{ => solutions/security}/plugins/cloud_security_posture/public/common/hooks/use_benchmark_dynamic_values.test.ts (100%) rename x-pack/{ => solutions/security}/plugins/cloud_security_posture/public/common/hooks/use_benchmark_dynamic_values.ts (100%) rename x-pack/{ => solutions/security}/plugins/cloud_security_posture/public/common/hooks/use_cloud_posture_data_table/index.ts (100%) rename x-pack/{ => solutions/security}/plugins/cloud_security_posture/public/common/hooks/use_cloud_posture_data_table/use_base_es_query.ts (100%) rename x-pack/{ => solutions/security}/plugins/cloud_security_posture/public/common/hooks/use_cloud_posture_data_table/use_cloud_posture_data_table.ts (100%) rename x-pack/{ => solutions/security}/plugins/cloud_security_posture/public/common/hooks/use_cloud_posture_data_table/use_persisted_query.ts (100%) rename x-pack/{ => solutions/security}/plugins/cloud_security_posture/public/common/hooks/use_cloud_posture_data_table/utils.ts (100%) rename x-pack/{ => solutions/security}/plugins/cloud_security_posture/public/common/hooks/use_is_subscription_status_valid.ts (100%) rename x-pack/{ => solutions/security}/plugins/cloud_security_posture/public/common/hooks/use_kibana.ts (100%) rename x-pack/{ => solutions/security}/plugins/cloud_security_posture/public/common/hooks/use_page_size.ts (100%) rename x-pack/{ => solutions/security}/plugins/cloud_security_posture/public/common/hooks/use_url_query.test.ts (100%) rename x-pack/{ => solutions/security}/plugins/cloud_security_posture/public/common/hooks/use_url_query.ts (100%) rename x-pack/{ => solutions/security}/plugins/cloud_security_posture/public/common/navigation/constants.ts (100%) rename x-pack/{ => solutions/security}/plugins/cloud_security_posture/public/common/navigation/security_solution_links.test.ts (100%) rename x-pack/{ => solutions/security}/plugins/cloud_security_posture/public/common/navigation/security_solution_links.ts (100%) rename x-pack/{ => solutions/security}/plugins/cloud_security_posture/public/common/navigation/types.ts (100%) rename x-pack/{ => solutions/security}/plugins/cloud_security_posture/public/common/navigation/use_csp_integration_link.ts (100%) rename x-pack/{ => solutions/security}/plugins/cloud_security_posture/public/common/navigation/use_navigate_to_cis_integration_policies.ts (100%) rename x-pack/{ => solutions/security}/plugins/cloud_security_posture/public/common/types.ts (100%) rename x-pack/{ => solutions/security}/plugins/cloud_security_posture/public/common/utils/get_template_url_package_info.ts (100%) rename x-pack/{ => solutions/security}/plugins/cloud_security_posture/public/common/utils/get_vendor_name.test.ts (100%) rename x-pack/{ => solutions/security}/plugins/cloud_security_posture/public/common/utils/get_vendor_name.ts (100%) rename x-pack/{ => solutions/security}/plugins/cloud_security_posture/public/common/utils/is_native_csp_finding.test.ts (100%) rename x-pack/{ => solutions/security}/plugins/cloud_security_posture/public/common/utils/is_native_csp_finding.ts (100%) rename x-pack/{ => solutions/security}/plugins/cloud_security_posture/public/components/accounts_evaluated_widget.test.tsx (100%) rename x-pack/{ => solutions/security}/plugins/cloud_security_posture/public/components/accounts_evaluated_widget.tsx (100%) rename x-pack/{ => solutions/security}/plugins/cloud_security_posture/public/components/chart_panel.test.tsx (100%) rename x-pack/{ => solutions/security}/plugins/cloud_security_posture/public/components/chart_panel.tsx (100%) rename x-pack/{ => solutions/security}/plugins/cloud_security_posture/public/components/cis_benchmark_icon.tsx (100%) rename x-pack/{ => solutions/security}/plugins/cloud_security_posture/public/components/cloud_posture_page.test.tsx (100%) rename x-pack/{ => solutions/security}/plugins/cloud_security_posture/public/components/cloud_posture_page.tsx (100%) rename x-pack/{ => solutions/security}/plugins/cloud_security_posture/public/components/cloud_posture_page_title.tsx (100%) rename x-pack/{ => solutions/security}/plugins/cloud_security_posture/public/components/cloud_provider_icon.tsx (100%) rename x-pack/{ => solutions/security}/plugins/cloud_security_posture/public/components/cloud_security_data_table/additional_controls.tsx (100%) rename x-pack/{ => solutions/security}/plugins/cloud_security_posture/public/components/cloud_security_data_table/cloud_security_data_table.test.tsx (100%) rename x-pack/{ => solutions/security}/plugins/cloud_security_posture/public/components/cloud_security_data_table/cloud_security_data_table.tsx (100%) rename x-pack/{ => solutions/security}/plugins/cloud_security_posture/public/components/cloud_security_data_table/fields_selector/fields_selector_modal.tsx (100%) rename x-pack/{ => solutions/security}/plugins/cloud_security_posture/public/components/cloud_security_data_table/fields_selector/fields_selector_table.test.tsx (100%) rename x-pack/{ => solutions/security}/plugins/cloud_security_posture/public/components/cloud_security_data_table/fields_selector/fields_selector_table.tsx (100%) rename x-pack/{ => solutions/security}/plugins/cloud_security_posture/public/components/cloud_security_data_table/fields_selector/index.ts (100%) rename x-pack/{ => solutions/security}/plugins/cloud_security_posture/public/components/cloud_security_data_table/fields_selector/use_fields_modal.ts (100%) rename x-pack/{ => solutions/security}/plugins/cloud_security_posture/public/components/cloud_security_data_table/index.ts (100%) rename x-pack/{ => solutions/security}/plugins/cloud_security_posture/public/components/cloud_security_data_table/use_styles.ts (100%) rename x-pack/{ => solutions/security}/plugins/cloud_security_posture/public/components/cloud_security_grouping/cloud_security_grouping.tsx (100%) rename x-pack/{ => solutions/security}/plugins/cloud_security_posture/public/components/cloud_security_grouping/index.ts (100%) rename x-pack/{ => solutions/security}/plugins/cloud_security_posture/public/components/cloud_security_grouping/loading_group.tsx (100%) rename x-pack/{ => solutions/security}/plugins/cloud_security_posture/public/components/cloud_security_grouping/null_group.tsx (100%) rename x-pack/{ => solutions/security}/plugins/cloud_security_posture/public/components/cloud_security_grouping/use_cloud_security_grouping.ts (100%) rename x-pack/{ => solutions/security}/plugins/cloud_security_posture/public/components/cloud_security_grouping/utils/first_non_null_value.test.ts (100%) rename x-pack/{ => solutions/security}/plugins/cloud_security_posture/public/components/cloud_security_grouping/utils/first_non_null_value.ts (100%) rename x-pack/{ => solutions/security}/plugins/cloud_security_posture/public/components/column_name_with_tooltip.tsx (100%) rename x-pack/{ => solutions/security}/plugins/cloud_security_posture/public/components/compact_formatted_number.tsx (100%) rename x-pack/{ => solutions/security}/plugins/cloud_security_posture/public/components/compliance_score_bar.test.tsx (100%) rename x-pack/{ => solutions/security}/plugins/cloud_security_posture/public/components/compliance_score_bar.tsx (100%) rename x-pack/{ => solutions/security}/plugins/cloud_security_posture/public/components/csp_counter_card.tsx (100%) rename x-pack/{ => solutions/security}/plugins/cloud_security_posture/public/components/csp_inline_description_list.tsx (100%) rename x-pack/{ => solutions/security}/plugins/cloud_security_posture/public/components/csp_loading_state.tsx (100%) rename x-pack/{ => solutions/security}/plugins/cloud_security_posture/public/components/detection_rule_counter.test.tsx (100%) rename x-pack/{ => solutions/security}/plugins/cloud_security_posture/public/components/detection_rule_counter.tsx (100%) rename x-pack/{ => solutions/security}/plugins/cloud_security_posture/public/components/empty_state.tsx (100%) rename x-pack/{ => solutions/security}/plugins/cloud_security_posture/public/components/empty_states_illustration_container.tsx (100%) rename x-pack/{ => solutions/security}/plugins/cloud_security_posture/public/components/fleet_extensions/aws_credentials_form/aws_credentials_form.tsx (100%) rename x-pack/{ => solutions/security}/plugins/cloud_security_posture/public/components/fleet_extensions/aws_credentials_form/aws_credentials_form_agentless.tsx (100%) rename x-pack/{ => solutions/security}/plugins/cloud_security_posture/public/components/fleet_extensions/aws_credentials_form/aws_input_var_fields.tsx (100%) rename x-pack/{ => solutions/security}/plugins/cloud_security_posture/public/components/fleet_extensions/aws_credentials_form/get_aws_credentials_form_options.tsx (100%) rename x-pack/{ => solutions/security}/plugins/cloud_security_posture/public/components/fleet_extensions/aws_credentials_form/hooks.ts (100%) rename x-pack/{ => solutions/security}/plugins/cloud_security_posture/public/components/fleet_extensions/azure_credentials_form/azure_credentials_form.tsx (100%) rename x-pack/{ => solutions/security}/plugins/cloud_security_posture/public/components/fleet_extensions/azure_credentials_form/azure_credentials_form_agentless.tsx (100%) rename x-pack/{ => solutions/security}/plugins/cloud_security_posture/public/components/fleet_extensions/azure_credentials_form/get_azure_credentials_form_options.tsx (100%) rename x-pack/{ => solutions/security}/plugins/cloud_security_posture/public/components/fleet_extensions/azure_credentials_form/hooks.ts (100%) rename x-pack/{ => solutions/security}/plugins/cloud_security_posture/public/components/fleet_extensions/csp_boxed_radio_group.tsx (100%) rename x-pack/{ => solutions/security}/plugins/cloud_security_posture/public/components/fleet_extensions/custom_assets_extension.tsx (100%) rename x-pack/{ => solutions/security}/plugins/cloud_security_posture/public/components/fleet_extensions/eks_credentials_form.tsx (100%) rename x-pack/{ => solutions/security}/plugins/cloud_security_posture/public/components/fleet_extensions/gcp_credentials_form/gcp_credential_form.tsx (100%) rename x-pack/{ => solutions/security}/plugins/cloud_security_posture/public/components/fleet_extensions/gcp_credentials_form/gcp_credentials_form_agentless.tsx (100%) rename x-pack/{ => solutions/security}/plugins/cloud_security_posture/public/components/fleet_extensions/mocks.ts (100%) rename x-pack/{ => solutions/security}/plugins/cloud_security_posture/public/components/fleet_extensions/policy_template_form.test.tsx (100%) rename x-pack/{ => solutions/security}/plugins/cloud_security_posture/public/components/fleet_extensions/policy_template_form.tsx (100%) rename x-pack/{ => solutions/security}/plugins/cloud_security_posture/public/components/fleet_extensions/policy_template_selectors.tsx (100%) rename x-pack/{ => solutions/security}/plugins/cloud_security_posture/public/components/fleet_extensions/setup_technology_selector/setup_technology_selector.tsx (100%) rename x-pack/{ => solutions/security}/plugins/cloud_security_posture/public/components/fleet_extensions/setup_technology_selector/use_setup_technology.test.ts (100%) rename x-pack/{ => solutions/security}/plugins/cloud_security_posture/public/components/fleet_extensions/setup_technology_selector/use_setup_technology.ts (100%) rename x-pack/{ => solutions/security}/plugins/cloud_security_posture/public/components/fleet_extensions/utils.test.ts (100%) rename x-pack/{ => solutions/security}/plugins/cloud_security_posture/public/components/fleet_extensions/utils.ts (100%) rename x-pack/{ => solutions/security}/plugins/cloud_security_posture/public/components/full_size_centered_page.tsx (100%) rename x-pack/{ => solutions/security}/plugins/cloud_security_posture/public/components/no_findings_states/index.ts (100%) rename x-pack/{ => solutions/security}/plugins/cloud_security_posture/public/components/no_findings_states/no_findings_states.test.tsx (100%) rename x-pack/{ => solutions/security}/plugins/cloud_security_posture/public/components/no_findings_states/no_findings_states.tsx (100%) rename x-pack/{ => solutions/security}/plugins/cloud_security_posture/public/components/no_vulnerabilities_states.tsx (100%) rename x-pack/{ => solutions/security}/plugins/cloud_security_posture/public/components/subscription_not_allowed.tsx (100%) rename x-pack/{ => solutions/security}/plugins/cloud_security_posture/public/components/take_action.tsx (100%) rename x-pack/{ => solutions/security}/plugins/cloud_security_posture/public/components/test_subjects.ts (100%) rename x-pack/{ => solutions/security}/plugins/cloud_security_posture/public/components/timestamp_table_cell.tsx (100%) rename x-pack/{ => solutions/security}/plugins/cloud_security_posture/public/components/vuln_counter_card.tsx (100%) rename x-pack/{ => solutions/security}/plugins/cloud_security_posture/public/components/vulnerability_severity_map.tsx (100%) rename x-pack/{ => solutions/security}/plugins/cloud_security_posture/public/index.ts (100%) rename x-pack/{ => solutions/security}/plugins/cloud_security_posture/public/pages/benchmarks/benchmarks.test.tsx (100%) rename x-pack/{ => solutions/security}/plugins/cloud_security_posture/public/pages/benchmarks/benchmarks.tsx (100%) rename x-pack/{ => solutions/security}/plugins/cloud_security_posture/public/pages/benchmarks/benchmarks_table.test.tsx (100%) rename x-pack/{ => solutions/security}/plugins/cloud_security_posture/public/pages/benchmarks/benchmarks_table.tsx (100%) rename x-pack/{ => solutions/security}/plugins/cloud_security_posture/public/pages/benchmarks/index.ts (100%) rename x-pack/{ => solutions/security}/plugins/cloud_security_posture/public/pages/benchmarks/test_subjects.ts (100%) rename x-pack/{ => solutions/security}/plugins/cloud_security_posture/public/pages/benchmarks/use_csp_benchmark_integrations.ts (100%) rename x-pack/{ => solutions/security}/plugins/cloud_security_posture/public/pages/compliance_dashboard/compliance_charts/compliance_score_chart.tsx (100%) rename x-pack/{ => solutions/security}/plugins/cloud_security_posture/public/pages/compliance_dashboard/compliance_charts/risks_table.test.ts (100%) rename x-pack/{ => solutions/security}/plugins/cloud_security_posture/public/pages/compliance_dashboard/compliance_charts/risks_table.tsx (100%) rename x-pack/{ => solutions/security}/plugins/cloud_security_posture/public/pages/compliance_dashboard/compliance_dashboard.test.tsx (100%) rename x-pack/{ => solutions/security}/plugins/cloud_security_posture/public/pages/compliance_dashboard/compliance_dashboard.tsx (100%) rename x-pack/{ => solutions/security}/plugins/cloud_security_posture/public/pages/compliance_dashboard/dashboard_sections/benchmark_details_box.tsx (100%) rename x-pack/{ => solutions/security}/plugins/cloud_security_posture/public/pages/compliance_dashboard/dashboard_sections/benchmarks_section.test.tsx (100%) rename x-pack/{ => solutions/security}/plugins/cloud_security_posture/public/pages/compliance_dashboard/dashboard_sections/benchmarks_section.tsx (100%) rename x-pack/{ => solutions/security}/plugins/cloud_security_posture/public/pages/compliance_dashboard/dashboard_sections/summary_section.test.tsx (100%) rename x-pack/{ => solutions/security}/plugins/cloud_security_posture/public/pages/compliance_dashboard/dashboard_sections/summary_section.tsx (100%) rename x-pack/{ => solutions/security}/plugins/cloud_security_posture/public/pages/compliance_dashboard/index.tsx (100%) rename x-pack/{ => solutions/security}/plugins/cloud_security_posture/public/pages/compliance_dashboard/mock.ts (100%) rename x-pack/{ => solutions/security}/plugins/cloud_security_posture/public/pages/compliance_dashboard/test_subjects.ts (100%) rename x-pack/{ => solutions/security}/plugins/cloud_security_posture/public/pages/configurations/__mocks__/findings.ts (100%) rename x-pack/{ => solutions/security}/plugins/cloud_security_posture/public/pages/configurations/configurations.handlers.mock.ts (100%) rename x-pack/{ => solutions/security}/plugins/cloud_security_posture/public/pages/configurations/configurations.test.tsx (100%) rename x-pack/{ => solutions/security}/plugins/cloud_security_posture/public/pages/configurations/configurations.tsx (100%) rename x-pack/{ => solutions/security}/plugins/cloud_security_posture/public/pages/configurations/findings_flyout/findings_detection_rule_counter.tsx (100%) rename x-pack/{ => solutions/security}/plugins/cloud_security_posture/public/pages/configurations/findings_flyout/findings_flyout.test.tsx (100%) rename x-pack/{ => solutions/security}/plugins/cloud_security_posture/public/pages/configurations/findings_flyout/findings_flyout.tsx (100%) rename x-pack/{ => solutions/security}/plugins/cloud_security_posture/public/pages/configurations/findings_flyout/json_tab.tsx (100%) rename x-pack/{ => solutions/security}/plugins/cloud_security_posture/public/pages/configurations/findings_flyout/overview_tab.tsx (100%) rename x-pack/{ => solutions/security}/plugins/cloud_security_posture/public/pages/configurations/findings_flyout/rule_tab.tsx (100%) rename x-pack/{ => solutions/security}/plugins/cloud_security_posture/public/pages/configurations/findings_flyout/table_tab.tsx (100%) rename x-pack/{ => solutions/security}/plugins/cloud_security_posture/public/pages/configurations/index.tsx (100%) rename x-pack/{ => solutions/security}/plugins/cloud_security_posture/public/pages/configurations/latest_findings/constants.ts (100%) rename x-pack/{ => solutions/security}/plugins/cloud_security_posture/public/pages/configurations/latest_findings/findings_table_field_labels.ts (100%) rename x-pack/{ => solutions/security}/plugins/cloud_security_posture/public/pages/configurations/latest_findings/latest_findings_container.tsx (100%) rename x-pack/{ => solutions/security}/plugins/cloud_security_posture/public/pages/configurations/latest_findings/latest_findings_group_renderer.test.tsx (100%) rename x-pack/{ => solutions/security}/plugins/cloud_security_posture/public/pages/configurations/latest_findings/latest_findings_group_renderer.tsx (100%) rename x-pack/{ => solutions/security}/plugins/cloud_security_posture/public/pages/configurations/latest_findings/latest_findings_table.tsx (100%) rename x-pack/{ => solutions/security}/plugins/cloud_security_posture/public/pages/configurations/latest_findings/use_grouped_findings.tsx (100%) rename x-pack/{ => solutions/security}/plugins/cloud_security_posture/public/pages/configurations/latest_findings/use_latest_findings.ts (100%) rename x-pack/{ => solutions/security}/plugins/cloud_security_posture/public/pages/configurations/latest_findings/use_latest_findings_grouping.tsx (100%) rename x-pack/{ => solutions/security}/plugins/cloud_security_posture/public/pages/configurations/latest_findings/use_latest_findings_table.tsx (100%) rename x-pack/{ => solutions/security}/plugins/cloud_security_posture/public/pages/configurations/layout/error_callout.tsx (100%) rename x-pack/{ => solutions/security}/plugins/cloud_security_posture/public/pages/configurations/layout/findings_distribution_bar.tsx (100%) rename x-pack/{ => solutions/security}/plugins/cloud_security_posture/public/pages/configurations/layout/findings_search_bar.tsx (100%) rename x-pack/{ => solutions/security}/plugins/cloud_security_posture/public/pages/configurations/test_subjects.ts (100%) rename x-pack/{ => solutions/security}/plugins/cloud_security_posture/public/pages/configurations/utils/create_detection_rule_from_benchmark.ts (100%) rename x-pack/{ => solutions/security}/plugins/cloud_security_posture/public/pages/configurations/utils/get_filters.test.ts (100%) rename x-pack/{ => solutions/security}/plugins/cloud_security_posture/public/pages/configurations/utils/get_filters.ts (100%) rename x-pack/{ => solutions/security}/plugins/cloud_security_posture/public/pages/configurations/utils/utils.ts (100%) rename x-pack/{ => solutions/security}/plugins/cloud_security_posture/public/pages/findings/findings.tsx (100%) rename x-pack/{ => solutions/security}/plugins/cloud_security_posture/public/pages/findings/index.tsx (100%) rename x-pack/{ => solutions/security}/plugins/cloud_security_posture/public/pages/findings/third_party_integrations_callout.tsx (100%) rename x-pack/{ => solutions/security}/plugins/cloud_security_posture/public/pages/index.ts (100%) rename x-pack/{ => solutions/security}/plugins/cloud_security_posture/public/pages/rules/index.tsx (100%) rename x-pack/{ => solutions/security}/plugins/cloud_security_posture/public/pages/rules/rules.test.tsx (100%) rename x-pack/{ => solutions/security}/plugins/cloud_security_posture/public/pages/rules/rules_container.test.tsx (100%) rename x-pack/{ => solutions/security}/plugins/cloud_security_posture/public/pages/rules/rules_container.tsx (100%) rename x-pack/{ => solutions/security}/plugins/cloud_security_posture/public/pages/rules/rules_counters.tsx (100%) rename x-pack/{ => solutions/security}/plugins/cloud_security_posture/public/pages/rules/rules_detection_rule_counter.tsx (100%) rename x-pack/{ => solutions/security}/plugins/cloud_security_posture/public/pages/rules/rules_flyout.tsx (100%) rename x-pack/{ => solutions/security}/plugins/cloud_security_posture/public/pages/rules/rules_table.tsx (100%) rename x-pack/{ => solutions/security}/plugins/cloud_security_posture/public/pages/rules/rules_table_header.tsx (100%) rename x-pack/{ => solutions/security}/plugins/cloud_security_posture/public/pages/rules/test_subjects.ts (100%) rename x-pack/{ => solutions/security}/plugins/cloud_security_posture/public/pages/rules/use_change_csp_rule_state.test.tsx (100%) rename x-pack/{ => solutions/security}/plugins/cloud_security_posture/public/pages/rules/use_change_csp_rule_state.tsx (100%) rename x-pack/{ => solutions/security}/plugins/cloud_security_posture/public/pages/rules/use_csp_benchmark_rules.ts (100%) rename x-pack/{ => solutions/security}/plugins/cloud_security_posture/public/pages/rules/use_csp_rules_state.ts (100%) rename x-pack/{ => solutions/security}/plugins/cloud_security_posture/public/pages/vulnerabilities/_mocks_/vulnerability.mock.ts (100%) rename x-pack/{ => solutions/security}/plugins/cloud_security_posture/public/pages/vulnerabilities/constants.ts (100%) rename x-pack/{ => solutions/security}/plugins/cloud_security_posture/public/pages/vulnerabilities/hooks/use_grouped_vulnerabilities.tsx (100%) rename x-pack/{ => solutions/security}/plugins/cloud_security_posture/public/pages/vulnerabilities/hooks/use_latest_vulnerabilities.tsx (100%) rename x-pack/{ => solutions/security}/plugins/cloud_security_posture/public/pages/vulnerabilities/hooks/use_latest_vulnerabilities_grouping.tsx (100%) rename x-pack/{ => solutions/security}/plugins/cloud_security_posture/public/pages/vulnerabilities/hooks/use_latest_vulnerabilities_table.tsx (100%) rename x-pack/{ => solutions/security}/plugins/cloud_security_posture/public/pages/vulnerabilities/index.tsx (100%) rename x-pack/{ => solutions/security}/plugins/cloud_security_posture/public/pages/vulnerabilities/latest_vulnerabilities_container.tsx (100%) rename x-pack/{ => solutions/security}/plugins/cloud_security_posture/public/pages/vulnerabilities/latest_vulnerabilities_group_renderer.tsx (100%) rename x-pack/{ => solutions/security}/plugins/cloud_security_posture/public/pages/vulnerabilities/latest_vulnerabilities_table.tsx (100%) rename x-pack/{ => solutions/security}/plugins/cloud_security_posture/public/pages/vulnerabilities/test_subjects.ts (100%) rename x-pack/{ => solutions/security}/plugins/cloud_security_posture/public/pages/vulnerabilities/translations.ts (100%) rename x-pack/{ => solutions/security}/plugins/cloud_security_posture/public/pages/vulnerabilities/types.ts (100%) rename x-pack/{ => solutions/security}/plugins/cloud_security_posture/public/pages/vulnerabilities/utils/create_detection_rule_from_vulnerability.test.ts (100%) rename x-pack/{ => solutions/security}/plugins/cloud_security_posture/public/pages/vulnerabilities/utils/create_detection_rule_from_vulnerability.ts (100%) rename x-pack/{ => solutions/security}/plugins/cloud_security_posture/public/pages/vulnerabilities/utils/custom_sort_script.ts (100%) rename x-pack/{ => solutions/security}/plugins/cloud_security_posture/public/pages/vulnerabilities/utils/get_vector_score_list.ts (100%) rename x-pack/{ => solutions/security}/plugins/cloud_security_posture/public/pages/vulnerabilities/vulnerabilities.tsx (100%) rename x-pack/{ => solutions/security}/plugins/cloud_security_posture/public/pages/vulnerabilities/vulnerabilities_finding_flyout/vulnerability_detection_rule_counter.tsx (100%) rename x-pack/{ => solutions/security}/plugins/cloud_security_posture/public/pages/vulnerabilities/vulnerabilities_finding_flyout/vulnerability_finding_flyout.test.tsx (100%) rename x-pack/{ => solutions/security}/plugins/cloud_security_posture/public/pages/vulnerabilities/vulnerabilities_finding_flyout/vulnerability_finding_flyout.tsx (100%) rename x-pack/{ => solutions/security}/plugins/cloud_security_posture/public/pages/vulnerabilities/vulnerabilities_finding_flyout/vulnerability_json_tab.tsx (100%) rename x-pack/{ => solutions/security}/plugins/cloud_security_posture/public/pages/vulnerabilities/vulnerabilities_finding_flyout/vulnerability_overview_tab.tsx (100%) rename x-pack/{ => solutions/security}/plugins/cloud_security_posture/public/pages/vulnerabilities/vulnerabilities_finding_flyout/vulnerability_table_tab.tsx (100%) rename x-pack/{ => solutions/security}/plugins/cloud_security_posture/public/pages/vulnerabilities/vulnerabilities_table_field_labels.ts (100%) rename x-pack/{ => solutions/security}/plugins/cloud_security_posture/public/pages/vulnerabilities/vulnerabilties.test.tsx (100%) rename x-pack/{ => solutions/security}/plugins/cloud_security_posture/public/pages/vulnerability_dashboard/_mocks_/vulnerability_dashboard.mock.ts (100%) rename x-pack/{ => solutions/security}/plugins/cloud_security_posture/public/pages/vulnerability_dashboard/vulnerability_dashboard.test.tsx (100%) rename x-pack/{ => solutions/security}/plugins/cloud_security_posture/public/pages/vulnerability_dashboard/vulnerability_dashboard.tsx (100%) rename x-pack/{ => solutions/security}/plugins/cloud_security_posture/public/pages/vulnerability_dashboard/vulnerability_statistics.tsx (100%) rename x-pack/{ => solutions/security}/plugins/cloud_security_posture/public/pages/vulnerability_dashboard/vulnerability_table_panel.config.ts (100%) rename x-pack/{ => solutions/security}/plugins/cloud_security_posture/public/pages/vulnerability_dashboard/vulnerability_table_panel.tsx (100%) rename x-pack/{ => solutions/security}/plugins/cloud_security_posture/public/pages/vulnerability_dashboard/vulnerability_table_panel_section.tsx (100%) rename x-pack/{ => solutions/security}/plugins/cloud_security_posture/public/pages/vulnerability_dashboard/vulnerability_trend_graph.tsx (100%) rename x-pack/{ => solutions/security}/plugins/cloud_security_posture/public/plugin.tsx (100%) rename x-pack/{ => solutions/security}/plugins/cloud_security_posture/public/test/fixtures/csp_benchmark_integration.ts (100%) rename x-pack/{ => solutions/security}/plugins/cloud_security_posture/public/test/fixtures/findings_fixture.ts (100%) rename x-pack/{ => solutions/security}/plugins/cloud_security_posture/public/test/fixtures/get_mock_dependencies.ts (100%) rename x-pack/{ => solutions/security}/plugins/cloud_security_posture/public/test/fixtures/react_query.ts (100%) rename x-pack/{ => solutions/security}/plugins/cloud_security_posture/public/test/mock_server/handlers/dataview.handlers.mock.ts (100%) rename x-pack/{ => solutions/security}/plugins/cloud_security_posture/public/test/mock_server/handlers/fleet.handlers.mock.ts (100%) rename x-pack/{ => solutions/security}/plugins/cloud_security_posture/public/test/mock_server/handlers/index.ts (100%) rename x-pack/{ => solutions/security}/plugins/cloud_security_posture/public/test/mock_server/handlers/licensing.handlers.mock.ts (100%) rename x-pack/{ => solutions/security}/plugins/cloud_security_posture/public/test/mock_server/mock_server.ts (100%) rename x-pack/{ => solutions/security}/plugins/cloud_security_posture/public/test/mock_server/mock_server_test_provider.tsx (100%) rename x-pack/{ => solutions/security}/plugins/cloud_security_posture/public/test/test_provider.tsx (100%) rename x-pack/{ => solutions/security}/plugins/cloud_security_posture/public/test/utils.ts (100%) rename x-pack/{ => solutions/security}/plugins/cloud_security_posture/public/types.ts (100%) rename x-pack/{ => solutions/security}/plugins/cloud_security_posture/server/config.ts (100%) rename x-pack/{ => solutions/security}/plugins/cloud_security_posture/server/create_indices/benchmark_score_mapping.ts (100%) rename x-pack/{ => solutions/security}/plugins/cloud_security_posture/server/create_indices/create_indices.test.ts (100%) rename x-pack/{ => solutions/security}/plugins/cloud_security_posture/server/create_indices/create_indices.ts (100%) rename x-pack/{ => solutions/security}/plugins/cloud_security_posture/server/create_indices/create_processor.ts (100%) rename x-pack/{ => solutions/security}/plugins/cloud_security_posture/server/create_indices/ingest_pipelines.ts (100%) rename x-pack/{ => solutions/security}/plugins/cloud_security_posture/server/create_indices/latest_indices.ts (100%) rename x-pack/{ => solutions/security}/plugins/cloud_security_posture/server/create_indices/types.ts (100%) rename x-pack/{ => solutions/security}/plugins/cloud_security_posture/server/create_transforms/create_transforms.test.ts (100%) rename x-pack/{ => solutions/security}/plugins/cloud_security_posture/server/create_transforms/create_transforms.ts (100%) rename x-pack/{ => solutions/security}/plugins/cloud_security_posture/server/create_transforms/latest_findings_transform.ts (100%) rename x-pack/{ => solutions/security}/plugins/cloud_security_posture/server/create_transforms/latest_vulnerabilities_transforms.ts (100%) rename x-pack/{ => solutions/security}/plugins/cloud_security_posture/server/fleet_integration/fleet_integration.ts (100%) rename x-pack/{ => solutions/security}/plugins/cloud_security_posture/server/index.ts (100%) rename x-pack/{ => solutions/security}/plugins/cloud_security_posture/server/lib/check_index_status.ts (100%) rename x-pack/{ => solutions/security}/plugins/cloud_security_posture/server/lib/fleet_util.ts (100%) rename x-pack/{ => solutions/security}/plugins/cloud_security_posture/server/lib/mapping_field_util.test.ts (100%) rename x-pack/{ => solutions/security}/plugins/cloud_security_posture/server/lib/mapping_field_util.ts (100%) rename x-pack/{ => solutions/security}/plugins/cloud_security_posture/server/lib/task_manager_util.ts (100%) rename x-pack/{ => solutions/security}/plugins/cloud_security_posture/server/lib/telemetry/collectors/accounts_stats_collector.ts (100%) rename x-pack/{ => solutions/security}/plugins/cloud_security_posture/server/lib/telemetry/collectors/alert_stats_collector.ts (100%) rename x-pack/{ => solutions/security}/plugins/cloud_security_posture/server/lib/telemetry/collectors/cloud_accounts_stats_collector.ts (100%) rename x-pack/{ => solutions/security}/plugins/cloud_security_posture/server/lib/telemetry/collectors/indices_stats_collector.ts (100%) rename x-pack/{ => solutions/security}/plugins/cloud_security_posture/server/lib/telemetry/collectors/installation_stats_collector.ts (100%) rename x-pack/{ => solutions/security}/plugins/cloud_security_posture/server/lib/telemetry/collectors/muted_rules_stats_collector.ts (100%) rename x-pack/{ => solutions/security}/plugins/cloud_security_posture/server/lib/telemetry/collectors/register.ts (100%) rename x-pack/{ => solutions/security}/plugins/cloud_security_posture/server/lib/telemetry/collectors/resources_stats_collector.ts (100%) rename x-pack/{ => solutions/security}/plugins/cloud_security_posture/server/lib/telemetry/collectors/rules_stats_collector.ts (100%) rename x-pack/{ => solutions/security}/plugins/cloud_security_posture/server/lib/telemetry/collectors/schema.ts (100%) rename x-pack/{ => solutions/security}/plugins/cloud_security_posture/server/lib/telemetry/collectors/types.ts (100%) rename x-pack/{ => solutions/security}/plugins/cloud_security_posture/server/mocks.ts (100%) rename x-pack/{ => solutions/security}/plugins/cloud_security_posture/server/plugin.test.ts (100%) rename x-pack/{ => solutions/security}/plugins/cloud_security_posture/server/plugin.ts (100%) rename x-pack/{ => solutions/security}/plugins/cloud_security_posture/server/routes/benchmark_rules/bulk_action/bulk_action.ts (100%) rename x-pack/{ => solutions/security}/plugins/cloud_security_posture/server/routes/benchmark_rules/bulk_action/utils.ts (100%) rename x-pack/{ => solutions/security}/plugins/cloud_security_posture/server/routes/benchmark_rules/bulk_action/v1.ts (100%) rename x-pack/{ => solutions/security}/plugins/cloud_security_posture/server/routes/benchmark_rules/find/find.test.ts (100%) rename x-pack/{ => solutions/security}/plugins/cloud_security_posture/server/routes/benchmark_rules/find/find.ts (100%) rename x-pack/{ => solutions/security}/plugins/cloud_security_posture/server/routes/benchmark_rules/find/utils.ts (100%) rename x-pack/{ => solutions/security}/plugins/cloud_security_posture/server/routes/benchmark_rules/find/v1.ts (100%) rename x-pack/{ => solutions/security}/plugins/cloud_security_posture/server/routes/benchmark_rules/find/v2.ts (100%) rename x-pack/{ => solutions/security}/plugins/cloud_security_posture/server/routes/benchmark_rules/find/v3.ts (100%) rename x-pack/{ => solutions/security}/plugins/cloud_security_posture/server/routes/benchmark_rules/get_states/get_states.ts (100%) rename x-pack/{ => solutions/security}/plugins/cloud_security_posture/server/routes/benchmark_rules/get_states/v1.ts (100%) rename x-pack/{ => solutions/security}/plugins/cloud_security_posture/server/routes/benchmarks/benchmarks.handlers.mock.ts (100%) rename x-pack/{ => solutions/security}/plugins/cloud_security_posture/server/routes/benchmarks/benchmarks.test.ts (100%) rename x-pack/{ => solutions/security}/plugins/cloud_security_posture/server/routes/benchmarks/benchmarks.ts (100%) rename x-pack/{ => solutions/security}/plugins/cloud_security_posture/server/routes/benchmarks/utilities.ts (100%) rename x-pack/{ => solutions/security}/plugins/cloud_security_posture/server/routes/benchmarks/v1.ts (100%) rename x-pack/{ => solutions/security}/plugins/cloud_security_posture/server/routes/benchmarks/v2.ts (100%) rename x-pack/{ => solutions/security}/plugins/cloud_security_posture/server/routes/compliance_dashboard/compliance_dashboard.ts (100%) rename x-pack/{ => solutions/security}/plugins/cloud_security_posture/server/routes/compliance_dashboard/get_benchmarks.test.ts (100%) rename x-pack/{ => solutions/security}/plugins/cloud_security_posture/server/routes/compliance_dashboard/get_benchmarks.ts (100%) rename x-pack/{ => solutions/security}/plugins/cloud_security_posture/server/routes/compliance_dashboard/get_clusters.test.ts (100%) rename x-pack/{ => solutions/security}/plugins/cloud_security_posture/server/routes/compliance_dashboard/get_clusters.ts (100%) rename x-pack/{ => solutions/security}/plugins/cloud_security_posture/server/routes/compliance_dashboard/get_grouped_findings_evaluation.test.ts (100%) rename x-pack/{ => solutions/security}/plugins/cloud_security_posture/server/routes/compliance_dashboard/get_grouped_findings_evaluation.ts (100%) rename x-pack/{ => solutions/security}/plugins/cloud_security_posture/server/routes/compliance_dashboard/get_stats.test.ts (100%) rename x-pack/{ => solutions/security}/plugins/cloud_security_posture/server/routes/compliance_dashboard/get_stats.ts (100%) rename x-pack/{ => solutions/security}/plugins/cloud_security_posture/server/routes/compliance_dashboard/get_trends.test.ts (100%) rename x-pack/{ => solutions/security}/plugins/cloud_security_posture/server/routes/compliance_dashboard/get_trends.ts (100%) rename x-pack/{ => solutions/security}/plugins/cloud_security_posture/server/routes/detection_engine/get_detection_engine_alerts_count_by_rule_tags.ts (100%) rename x-pack/{ => solutions/security}/plugins/cloud_security_posture/server/routes/graph/route.ts (100%) rename x-pack/{ => solutions/security}/plugins/cloud_security_posture/server/routes/graph/v1.ts (100%) rename x-pack/{ => solutions/security}/plugins/cloud_security_posture/server/routes/setup_routes.ts (100%) rename x-pack/{ => solutions/security}/plugins/cloud_security_posture/server/routes/status/status.handlers.mock.ts (100%) rename x-pack/{ => solutions/security}/plugins/cloud_security_posture/server/routes/status/status.test.ts (100%) rename x-pack/{ => solutions/security}/plugins/cloud_security_posture/server/routes/status/status.ts (100%) rename x-pack/{ => solutions/security}/plugins/cloud_security_posture/server/routes/vulnerabilities_dashboard/get_top_patchable_vulnerabilities.ts (100%) rename x-pack/{ => solutions/security}/plugins/cloud_security_posture/server/routes/vulnerabilities_dashboard/get_top_vulnerabilities.ts (100%) rename x-pack/{ => solutions/security}/plugins/cloud_security_posture/server/routes/vulnerabilities_dashboard/get_top_vulnerable_resources.ts (100%) rename x-pack/{ => solutions/security}/plugins/cloud_security_posture/server/routes/vulnerabilities_dashboard/get_vulnerabilities_statistics.ts (100%) rename x-pack/{ => solutions/security}/plugins/cloud_security_posture/server/routes/vulnerabilities_dashboard/get_vulnerabilities_trend.ts (100%) rename x-pack/{ => solutions/security}/plugins/cloud_security_posture/server/routes/vulnerabilities_dashboard/vulnerabilities_dashboard.ts (100%) rename x-pack/{ => solutions/security}/plugins/cloud_security_posture/server/saved_objects/csp_benchmark_rule.ts (100%) rename x-pack/{ => solutions/security}/plugins/cloud_security_posture/server/saved_objects/csp_settings.ts (100%) rename x-pack/{ => solutions/security}/plugins/cloud_security_posture/server/saved_objects/data_views.ts (100%) rename x-pack/{ => solutions/security}/plugins/cloud_security_posture/server/saved_objects/index.ts (100%) rename x-pack/{ => solutions/security}/plugins/cloud_security_posture/server/saved_objects/mappings.ts (100%) rename x-pack/{ => solutions/security}/plugins/cloud_security_posture/server/saved_objects/migrations/csp_benchmark_rule.ts (100%) rename x-pack/{ => solutions/security}/plugins/cloud_security_posture/server/saved_objects/migrations/index.ts (100%) rename x-pack/{ => solutions/security}/plugins/cloud_security_posture/server/tasks/findings_stats_task.ts (100%) rename x-pack/{ => solutions/security}/plugins/cloud_security_posture/server/tasks/task_state.test.ts (100%) rename x-pack/{ => solutions/security}/plugins/cloud_security_posture/server/tasks/task_state.ts (100%) rename x-pack/{ => solutions/security}/plugins/cloud_security_posture/server/tasks/types.ts (100%) rename x-pack/{ => solutions/security}/plugins/cloud_security_posture/server/types.ts (100%) rename x-pack/{ => solutions/security}/plugins/cloud_security_posture/tsconfig.json (95%) rename x-pack/{ => solutions/security}/plugins/kubernetes_security/.eslintrc.json (100%) rename x-pack/{ => solutions/security}/plugins/kubernetes_security/README.md (100%) rename x-pack/{ => solutions/security}/plugins/kubernetes_security/common/constants.ts (100%) rename x-pack/{ => solutions/security}/plugins/kubernetes_security/common/translations.ts (100%) rename x-pack/{ => solutions/security}/plugins/kubernetes_security/common/types/index.ts (100%) rename x-pack/{ => solutions/security}/plugins/kubernetes_security/common/types/latest.ts (100%) rename x-pack/{ => solutions/security}/plugins/kubernetes_security/common/types/v1.ts (100%) rename x-pack/{plugins/session_view => solutions/security/plugins/kubernetes_security}/jest.config.js (54%) rename x-pack/{ => solutions/security}/plugins/kubernetes_security/kibana.jsonc (100%) rename x-pack/{ => solutions/security}/plugins/kubernetes_security/package.json (59%) rename x-pack/{ => solutions/security}/plugins/kubernetes_security/public/components/charts_toggle/index.test.tsx (100%) rename x-pack/{ => solutions/security}/plugins/kubernetes_security/public/components/charts_toggle/index.tsx (100%) rename x-pack/{ => solutions/security}/plugins/kubernetes_security/public/components/container_name_widget/container_name_row.test.tsx (100%) rename x-pack/{ => solutions/security}/plugins/kubernetes_security/public/components/container_name_widget/container_name_row.tsx (100%) rename x-pack/{ => solutions/security}/plugins/kubernetes_security/public/components/container_name_widget/hooks.ts (100%) rename x-pack/{ => solutions/security}/plugins/kubernetes_security/public/components/container_name_widget/index.test.tsx (100%) rename x-pack/{ => solutions/security}/plugins/kubernetes_security/public/components/container_name_widget/index.tsx (100%) rename x-pack/{ => solutions/security}/plugins/kubernetes_security/public/components/container_name_widget/styles.ts (100%) rename x-pack/{ => solutions/security}/plugins/kubernetes_security/public/components/count_widget/helpers.test.ts (100%) rename x-pack/{ => solutions/security}/plugins/kubernetes_security/public/components/count_widget/helpers.ts (100%) rename x-pack/{ => solutions/security}/plugins/kubernetes_security/public/components/count_widget/hooks.ts (100%) rename x-pack/{ => solutions/security}/plugins/kubernetes_security/public/components/count_widget/index.test.tsx (100%) rename x-pack/{ => solutions/security}/plugins/kubernetes_security/public/components/count_widget/index.tsx (100%) rename x-pack/{ => solutions/security}/plugins/kubernetes_security/public/components/count_widget/styles.ts (100%) rename x-pack/{ => solutions/security}/plugins/kubernetes_security/public/components/kubernetes_security_routes/index.test.tsx (100%) rename x-pack/{ => solutions/security}/plugins/kubernetes_security/public/components/kubernetes_security_routes/index.tsx (100%) rename x-pack/{ => solutions/security}/plugins/kubernetes_security/public/components/kubernetes_security_routes/styles.ts (100%) rename x-pack/{ => solutions/security}/plugins/kubernetes_security/public/components/percent_widget/hooks.ts (100%) rename x-pack/{ => solutions/security}/plugins/kubernetes_security/public/components/percent_widget/index.test.tsx (100%) rename x-pack/{ => solutions/security}/plugins/kubernetes_security/public/components/percent_widget/index.tsx (100%) rename x-pack/{ => solutions/security}/plugins/kubernetes_security/public/components/percent_widget/styles.ts (100%) rename x-pack/{ => solutions/security}/plugins/kubernetes_security/public/components/tree_view_container/assets/illustration_product_no_results_magnifying_glass.svg (100%) rename x-pack/{ => solutions/security}/plugins/kubernetes_security/public/components/tree_view_container/breadcrumb/__snapshots__/index.test.tsx.snap (100%) rename x-pack/{ => solutions/security}/plugins/kubernetes_security/public/components/tree_view_container/breadcrumb/helper.test.tsx (100%) rename x-pack/{ => solutions/security}/plugins/kubernetes_security/public/components/tree_view_container/breadcrumb/helper.tsx (100%) rename x-pack/{ => solutions/security}/plugins/kubernetes_security/public/components/tree_view_container/breadcrumb/index.test.tsx (100%) rename x-pack/{ => solutions/security}/plugins/kubernetes_security/public/components/tree_view_container/breadcrumb/index.tsx (100%) rename x-pack/{ => solutions/security}/plugins/kubernetes_security/public/components/tree_view_container/breadcrumb/styles.ts (100%) rename x-pack/{ => solutions/security}/plugins/kubernetes_security/public/components/tree_view_container/contexts.tsx (100%) rename x-pack/{ => solutions/security}/plugins/kubernetes_security/public/components/tree_view_container/dynamic_tree_view/helpers.test.tsx (100%) rename x-pack/{ => solutions/security}/plugins/kubernetes_security/public/components/tree_view_container/dynamic_tree_view/helpers.ts (100%) rename x-pack/{ => solutions/security}/plugins/kubernetes_security/public/components/tree_view_container/dynamic_tree_view/hooks.ts (100%) rename x-pack/{ => solutions/security}/plugins/kubernetes_security/public/components/tree_view_container/dynamic_tree_view/index.test.tsx (100%) rename x-pack/{ => solutions/security}/plugins/kubernetes_security/public/components/tree_view_container/dynamic_tree_view/index.tsx (100%) rename x-pack/{ => solutions/security}/plugins/kubernetes_security/public/components/tree_view_container/dynamic_tree_view/styles.ts (100%) rename x-pack/{ => solutions/security}/plugins/kubernetes_security/public/components/tree_view_container/dynamic_tree_view/types.ts (100%) rename x-pack/{ => solutions/security}/plugins/kubernetes_security/public/components/tree_view_container/empty_state.tsx (100%) rename x-pack/{ => solutions/security}/plugins/kubernetes_security/public/components/tree_view_container/helpers.ts (100%) rename x-pack/{ => solutions/security}/plugins/kubernetes_security/public/components/tree_view_container/hooks.tsx (100%) rename x-pack/{ => solutions/security}/plugins/kubernetes_security/public/components/tree_view_container/index.test.tsx (100%) rename x-pack/{ => solutions/security}/plugins/kubernetes_security/public/components/tree_view_container/index.tsx (100%) rename x-pack/{ => solutions/security}/plugins/kubernetes_security/public/components/tree_view_container/mocks.ts (100%) rename x-pack/{ => solutions/security}/plugins/kubernetes_security/public/components/tree_view_container/styles.ts (100%) rename x-pack/{ => solutions/security}/plugins/kubernetes_security/public/components/tree_view_container/translations.ts (100%) rename x-pack/{ => solutions/security}/plugins/kubernetes_security/public/components/tree_view_container/tree_nav/constants.ts (100%) rename x-pack/{ => solutions/security}/plugins/kubernetes_security/public/components/tree_view_container/tree_nav/index.test.tsx (100%) rename x-pack/{ => solutions/security}/plugins/kubernetes_security/public/components/tree_view_container/tree_nav/index.tsx (100%) rename x-pack/{ => solutions/security}/plugins/kubernetes_security/public/components/tree_view_container/tree_nav/styles.ts (100%) rename x-pack/{ => solutions/security}/plugins/kubernetes_security/public/components/tree_view_container/tree_nav/translations.ts (100%) rename x-pack/{ => solutions/security}/plugins/kubernetes_security/public/components/tree_view_container/tree_nav/types.ts (100%) rename x-pack/{ => solutions/security}/plugins/kubernetes_security/public/components/tree_view_container/tree_view_icon.tsx (100%) rename x-pack/{ => solutions/security}/plugins/kubernetes_security/public/hooks/index.ts (100%) rename x-pack/{ => solutions/security}/plugins/kubernetes_security/public/hooks/use_eui_theme.ts (100%) rename x-pack/{ => solutions/security}/plugins/kubernetes_security/public/hooks/use_filter.ts (100%) rename x-pack/{ => solutions/security}/plugins/kubernetes_security/public/hooks/use_last_updated.ts (100%) rename x-pack/{ => solutions/security}/plugins/kubernetes_security/public/hooks/use_scroll.ts (100%) rename x-pack/{ => solutions/security}/plugins/kubernetes_security/public/index.ts (100%) rename x-pack/{ => solutions/security}/plugins/kubernetes_security/public/methods/index.tsx (100%) rename x-pack/{ => solutions/security}/plugins/kubernetes_security/public/plugin.ts (100%) rename x-pack/{ => solutions/security}/plugins/kubernetes_security/public/test/index.tsx (100%) rename x-pack/{ => solutions/security}/plugins/kubernetes_security/public/types.ts (100%) rename x-pack/{ => solutions/security}/plugins/kubernetes_security/public/utils/add_commas_to_number.test.ts (100%) rename x-pack/{ => solutions/security}/plugins/kubernetes_security/public/utils/add_commas_to_number.ts (100%) rename x-pack/{ => solutions/security}/plugins/kubernetes_security/public/utils/add_timerange_and_default_filter_to_query.test.ts (100%) rename x-pack/{ => solutions/security}/plugins/kubernetes_security/public/utils/add_timerange_and_default_filter_to_query.ts (100%) rename x-pack/{ => solutions/security}/plugins/kubernetes_security/server/index.ts (100%) rename x-pack/{ => solutions/security}/plugins/kubernetes_security/server/plugin.ts (100%) rename x-pack/{ => solutions/security}/plugins/kubernetes_security/server/routes/aggregate.ts (100%) rename x-pack/{ => solutions/security}/plugins/kubernetes_security/server/routes/count.ts (100%) rename x-pack/{ => solutions/security}/plugins/kubernetes_security/server/routes/index.ts (100%) rename x-pack/{ => solutions/security}/plugins/kubernetes_security/server/routes/multi_terms_aggregate.ts (100%) rename x-pack/{ => solutions/security}/plugins/kubernetes_security/server/types.ts (100%) rename x-pack/{ => solutions/security}/plugins/kubernetes_security/tsconfig.json (91%) rename x-pack/{ => solutions/security}/plugins/session_view/.eslintrc.json (100%) rename x-pack/{ => solutions/security}/plugins/session_view/README.md (91%) rename x-pack/{ => solutions/security}/plugins/session_view/common/constants.ts (100%) rename x-pack/{ => solutions/security}/plugins/session_view/common/index.ts (100%) rename x-pack/{ => solutions/security}/plugins/session_view/common/mocks/constants/session_view_process.mock.ts (100%) rename x-pack/{ => solutions/security}/plugins/session_view/common/mocks/responses/session_view_io_events.mock.ts (100%) rename x-pack/{ => solutions/security}/plugins/session_view/common/mocks/responses/session_view_process_events.mock.ts (100%) rename x-pack/{ => solutions/security}/plugins/session_view/common/mocks/responses/session_view_process_events_merged.mock.ts (100%) rename x-pack/{ => solutions/security}/plugins/session_view/common/translations.ts (100%) rename x-pack/{ => solutions/security}/plugins/session_view/common/types/latest.ts (100%) rename x-pack/{ => solutions/security}/plugins/session_view/common/types/v1.ts (100%) rename x-pack/{ => solutions/security}/plugins/session_view/common/utils/alert_icon_tooltip_content.test.ts (100%) rename x-pack/{ => solutions/security}/plugins/session_view/common/utils/alert_icon_tooltip_content.ts (100%) rename x-pack/{ => solutions/security}/plugins/session_view/common/utils/expand_dotted_object.test.ts (100%) rename x-pack/{ => solutions/security}/plugins/session_view/common/utils/expand_dotted_object.ts (100%) rename x-pack/{ => solutions/security}/plugins/session_view/common/utils/sort_processes.test.ts (100%) rename x-pack/{ => solutions/security}/plugins/session_view/common/utils/sort_processes.ts (100%) rename x-pack/{plugins/kubernetes_security => solutions/security/plugins/session_view}/jest.config.js (56%) rename x-pack/{ => solutions/security}/plugins/session_view/kibana.jsonc (100%) rename x-pack/{ => solutions/security}/plugins/session_view/package.json (58%) rename x-pack/{ => solutions/security}/plugins/session_view/public/components/back_to_investigated_alert/index.test.tsx (100%) rename x-pack/{ => solutions/security}/plugins/session_view/public/components/back_to_investigated_alert/index.tsx (100%) rename x-pack/{ => solutions/security}/plugins/session_view/public/components/back_to_investigated_alert/styles.ts (100%) rename x-pack/{ => solutions/security}/plugins/session_view/public/components/detail_panel_accordion/index.test.tsx (100%) rename x-pack/{ => solutions/security}/plugins/session_view/public/components/detail_panel_accordion/index.tsx (100%) rename x-pack/{ => solutions/security}/plugins/session_view/public/components/detail_panel_accordion/styles.ts (100%) rename x-pack/{ => solutions/security}/plugins/session_view/public/components/detail_panel_alert_actions/index.test.tsx (100%) rename x-pack/{ => solutions/security}/plugins/session_view/public/components/detail_panel_alert_actions/index.tsx (100%) rename x-pack/{ => solutions/security}/plugins/session_view/public/components/detail_panel_alert_actions/styles.ts (100%) rename x-pack/{ => solutions/security}/plugins/session_view/public/components/detail_panel_alert_group_item/index.tsx (100%) rename x-pack/{ => solutions/security}/plugins/session_view/public/components/detail_panel_alert_list_item/index.tsx (100%) rename x-pack/{ => solutions/security}/plugins/session_view/public/components/detail_panel_alert_list_item/styles.ts (100%) rename x-pack/{ => solutions/security}/plugins/session_view/public/components/detail_panel_alert_tab/index.test.tsx (100%) rename x-pack/{ => solutions/security}/plugins/session_view/public/components/detail_panel_alert_tab/index.tsx (100%) rename x-pack/{ => solutions/security}/plugins/session_view/public/components/detail_panel_alert_tab/styles.ts (100%) rename x-pack/{ => solutions/security}/plugins/session_view/public/components/detail_panel_copy/__snapshots__/index.test.tsx.snap (100%) rename x-pack/{ => solutions/security}/plugins/session_view/public/components/detail_panel_copy/index.test.tsx (100%) rename x-pack/{ => solutions/security}/plugins/session_view/public/components/detail_panel_copy/index.tsx (100%) rename x-pack/{ => solutions/security}/plugins/session_view/public/components/detail_panel_copy/styles.ts (100%) rename x-pack/{ => solutions/security}/plugins/session_view/public/components/detail_panel_description_list/index.test.tsx (100%) rename x-pack/{ => solutions/security}/plugins/session_view/public/components/detail_panel_description_list/index.tsx (100%) rename x-pack/{ => solutions/security}/plugins/session_view/public/components/detail_panel_description_list/styles.ts (100%) rename x-pack/{ => solutions/security}/plugins/session_view/public/components/detail_panel_list_item/index.test.tsx (100%) rename x-pack/{ => solutions/security}/plugins/session_view/public/components/detail_panel_list_item/index.tsx (100%) rename x-pack/{ => solutions/security}/plugins/session_view/public/components/detail_panel_list_item/styles.ts (100%) rename x-pack/{ => solutions/security}/plugins/session_view/public/components/detail_panel_metadata_tab/helpers.test.ts (100%) rename x-pack/{ => solutions/security}/plugins/session_view/public/components/detail_panel_metadata_tab/helpers.ts (100%) rename x-pack/{ => solutions/security}/plugins/session_view/public/components/detail_panel_metadata_tab/index.test.tsx (100%) rename x-pack/{ => solutions/security}/plugins/session_view/public/components/detail_panel_metadata_tab/index.tsx (100%) rename x-pack/{ => solutions/security}/plugins/session_view/public/components/detail_panel_metadata_tab/styles.ts (100%) rename x-pack/{ => solutions/security}/plugins/session_view/public/components/detail_panel_process_tab/helpers.test.ts (100%) rename x-pack/{ => solutions/security}/plugins/session_view/public/components/detail_panel_process_tab/helpers.ts (100%) rename x-pack/{ => solutions/security}/plugins/session_view/public/components/detail_panel_process_tab/index.test.tsx (100%) rename x-pack/{ => solutions/security}/plugins/session_view/public/components/detail_panel_process_tab/index.tsx (100%) rename x-pack/{ => solutions/security}/plugins/session_view/public/components/detail_panel_process_tab/styles.ts (100%) rename x-pack/{ => solutions/security}/plugins/session_view/public/components/process_tree/helpers.test.ts (100%) rename x-pack/{ => solutions/security}/plugins/session_view/public/components/process_tree/helpers.ts (100%) rename x-pack/{ => solutions/security}/plugins/session_view/public/components/process_tree/hooks.test.tsx (100%) rename x-pack/{ => solutions/security}/plugins/session_view/public/components/process_tree/hooks.ts (100%) rename x-pack/{ => solutions/security}/plugins/session_view/public/components/process_tree/index.test.tsx (100%) rename x-pack/{ => solutions/security}/plugins/session_view/public/components/process_tree/index.tsx (100%) rename x-pack/{ => solutions/security}/plugins/session_view/public/components/process_tree/styles.ts (100%) rename x-pack/{ => solutions/security}/plugins/session_view/public/components/process_tree_alert/__snapshots__/index.test.tsx.snap (100%) rename x-pack/{ => solutions/security}/plugins/session_view/public/components/process_tree_alert/helpers.ts (100%) rename x-pack/{ => solutions/security}/plugins/session_view/public/components/process_tree_alert/index.test.tsx (100%) rename x-pack/{ => solutions/security}/plugins/session_view/public/components/process_tree_alert/index.tsx (100%) rename x-pack/{ => solutions/security}/plugins/session_view/public/components/process_tree_alert/styles.ts (100%) rename x-pack/{ => solutions/security}/plugins/session_view/public/components/process_tree_alerts/index.test.tsx (100%) rename x-pack/{ => solutions/security}/plugins/session_view/public/components/process_tree_alerts/index.tsx (100%) rename x-pack/{ => solutions/security}/plugins/session_view/public/components/process_tree_alerts/styles.ts (100%) rename x-pack/{ => solutions/security}/plugins/session_view/public/components/process_tree_alerts_filter/index.test.tsx (100%) rename x-pack/{ => solutions/security}/plugins/session_view/public/components/process_tree_alerts_filter/index.tsx (100%) rename x-pack/{ => solutions/security}/plugins/session_view/public/components/process_tree_alerts_filter/styles.ts (100%) rename x-pack/{ => solutions/security}/plugins/session_view/public/components/process_tree_alerts_filter/translations.ts (100%) rename x-pack/{ => solutions/security}/plugins/session_view/public/components/process_tree_load_more_button/index.tsx (100%) rename x-pack/{ => solutions/security}/plugins/session_view/public/components/process_tree_load_more_button/styles.ts (100%) rename x-pack/{ => solutions/security}/plugins/session_view/public/components/process_tree_node/buttons.tsx (100%) rename x-pack/{ => solutions/security}/plugins/session_view/public/components/process_tree_node/index.test.tsx (100%) rename x-pack/{ => solutions/security}/plugins/session_view/public/components/process_tree_node/index.tsx (100%) rename x-pack/{ => solutions/security}/plugins/session_view/public/components/process_tree_node/nbsp.tsx (100%) rename x-pack/{ => solutions/security}/plugins/session_view/public/components/process_tree_node/split_text.test.tsx (100%) rename x-pack/{ => solutions/security}/plugins/session_view/public/components/process_tree_node/split_text.tsx (100%) rename x-pack/{ => solutions/security}/plugins/session_view/public/components/process_tree_node/styles.ts (100%) rename x-pack/{ => solutions/security}/plugins/session_view/public/components/process_tree_node/text_highlight.test.tsx (100%) rename x-pack/{ => solutions/security}/plugins/session_view/public/components/process_tree_node/text_highlight.tsx (100%) rename x-pack/{ => solutions/security}/plugins/session_view/public/components/process_tree_node/use_button_styles.ts (100%) rename x-pack/{ => solutions/security}/plugins/session_view/public/components/session_view/hooks.ts (100%) rename x-pack/{ => solutions/security}/plugins/session_view/public/components/session_view/index.test.tsx (100%) rename x-pack/{ => solutions/security}/plugins/session_view/public/components/session_view/index.tsx (100%) rename x-pack/{ => solutions/security}/plugins/session_view/public/components/session_view/styles.ts (100%) rename x-pack/{ => solutions/security}/plugins/session_view/public/components/session_view/translations.ts (100%) rename x-pack/{ => solutions/security}/plugins/session_view/public/components/session_view_detail_panel/helpers.test.ts (100%) rename x-pack/{ => solutions/security}/plugins/session_view/public/components/session_view_detail_panel/helpers.ts (100%) rename x-pack/{ => solutions/security}/plugins/session_view/public/components/session_view_detail_panel/index.test.tsx (100%) rename x-pack/{ => solutions/security}/plugins/session_view/public/components/session_view_detail_panel/index.tsx (100%) rename x-pack/{ => solutions/security}/plugins/session_view/public/components/session_view_detail_panel/styles.ts (100%) rename x-pack/{ => solutions/security}/plugins/session_view/public/components/session_view_display_options/index.tsx (100%) rename x-pack/{ => solutions/security}/plugins/session_view/public/components/session_view_display_options/styles.ts (100%) rename x-pack/{ => solutions/security}/plugins/session_view/public/components/session_view_search_bar/index.test.tsx (100%) rename x-pack/{ => solutions/security}/plugins/session_view/public/components/session_view_search_bar/index.tsx (100%) rename x-pack/{ => solutions/security}/plugins/session_view/public/components/session_view_search_bar/styles.ts (100%) rename x-pack/{ => solutions/security}/plugins/session_view/public/components/tty_player/ansi_helpers.ts (100%) rename x-pack/{ => solutions/security}/plugins/session_view/public/components/tty_player/hooks.test.tsx (100%) rename x-pack/{ => solutions/security}/plugins/session_view/public/components/tty_player/hooks.ts (100%) rename x-pack/{ => solutions/security}/plugins/session_view/public/components/tty_player/index.test.tsx (100%) rename x-pack/{ => solutions/security}/plugins/session_view/public/components/tty_player/index.tsx (100%) rename x-pack/{ => solutions/security}/plugins/session_view/public/components/tty_player/styles.ts (100%) rename x-pack/{ => solutions/security}/plugins/session_view/public/components/tty_player/translations.ts (100%) rename x-pack/{ => solutions/security}/plugins/session_view/public/components/tty_player/xterm_search.ts (100%) rename x-pack/{ => solutions/security}/plugins/session_view/public/components/tty_player_controls/index.test.tsx (100%) rename x-pack/{ => solutions/security}/plugins/session_view/public/components/tty_player_controls/index.tsx (100%) rename x-pack/{ => solutions/security}/plugins/session_view/public/components/tty_player_controls/styles.ts (100%) rename x-pack/{ => solutions/security}/plugins/session_view/public/components/tty_player_controls/translations.ts (100%) rename x-pack/{ => solutions/security}/plugins/session_view/public/components/tty_player_controls/tty_player_controls_markers/index.tsx (100%) rename x-pack/{ => solutions/security}/plugins/session_view/public/components/tty_player_controls/tty_player_controls_markers/play_head.tsx (100%) rename x-pack/{ => solutions/security}/plugins/session_view/public/components/tty_player_controls/tty_player_controls_markers/styles.ts (100%) rename x-pack/{ => solutions/security}/plugins/session_view/public/components/tty_search_bar/index.test.tsx (100%) rename x-pack/{ => solutions/security}/plugins/session_view/public/components/tty_search_bar/index.tsx (100%) rename x-pack/{ => solutions/security}/plugins/session_view/public/components/tty_text_sizer/index.test.tsx (100%) rename x-pack/{ => solutions/security}/plugins/session_view/public/components/tty_text_sizer/index.tsx (100%) rename x-pack/{ => solutions/security}/plugins/session_view/public/components/tty_text_sizer/styles.ts (100%) rename x-pack/{ => solutions/security}/plugins/session_view/public/components/tty_text_sizer/translations.ts (100%) rename x-pack/{ => solutions/security}/plugins/session_view/public/constants.ts (100%) rename x-pack/{ => solutions/security}/plugins/session_view/public/hooks/index.ts (100%) rename x-pack/{ => solutions/security}/plugins/session_view/public/hooks/use_date_format.ts (100%) rename x-pack/{ => solutions/security}/plugins/session_view/public/hooks/use_eui_theme.ts (100%) rename x-pack/{ => solutions/security}/plugins/session_view/public/hooks/use_scroll.ts (100%) rename x-pack/{ => solutions/security}/plugins/session_view/public/hooks/use_visible.ts (100%) rename x-pack/{ => solutions/security}/plugins/session_view/public/index.ts (100%) rename x-pack/{ => solutions/security}/plugins/session_view/public/methods/index.test.tsx (100%) rename x-pack/{ => solutions/security}/plugins/session_view/public/methods/index.tsx (100%) rename x-pack/{ => solutions/security}/plugins/session_view/public/plugin.ts (100%) rename x-pack/{ => solutions/security}/plugins/session_view/public/shared_imports.ts (100%) rename x-pack/{ => solutions/security}/plugins/session_view/public/test/index.tsx (100%) rename x-pack/{ => solutions/security}/plugins/session_view/public/types.ts (100%) rename x-pack/{ => solutions/security}/plugins/session_view/public/utils/alert_category_display_test.test.ts (100%) rename x-pack/{ => solutions/security}/plugins/session_view/public/utils/alert_category_display_text.ts (100%) rename x-pack/{ => solutions/security}/plugins/session_view/public/utils/data_or_dash.test.ts (100%) rename x-pack/{ => solutions/security}/plugins/session_view/public/utils/data_or_dash.ts (100%) rename x-pack/{ => solutions/security}/plugins/session_view/server/index.ts (100%) rename x-pack/{ => solutions/security}/plugins/session_view/server/plugin.ts (100%) rename x-pack/{ => solutions/security}/plugins/session_view/server/routes/alert_status_route.test.ts (100%) rename x-pack/{ => solutions/security}/plugins/session_view/server/routes/alert_status_route.ts (100%) rename x-pack/{ => solutions/security}/plugins/session_view/server/routes/alerts_client_mock.test.ts (100%) rename x-pack/{ => solutions/security}/plugins/session_view/server/routes/alerts_route.test.ts (100%) rename x-pack/{ => solutions/security}/plugins/session_view/server/routes/alerts_route.ts (100%) rename x-pack/{ => solutions/security}/plugins/session_view/server/routes/get_total_io_bytes_route.ts (100%) rename x-pack/{ => solutions/security}/plugins/session_view/server/routes/index.ts (100%) rename x-pack/{ => solutions/security}/plugins/session_view/server/routes/io_events_route.test.ts (100%) rename x-pack/{ => solutions/security}/plugins/session_view/server/routes/io_events_route.ts (100%) rename x-pack/{ => solutions/security}/plugins/session_view/server/routes/process_events_route.test.ts (100%) rename x-pack/{ => solutions/security}/plugins/session_view/server/routes/process_events_route.ts (100%) rename x-pack/{ => solutions/security}/plugins/session_view/server/types.ts (100%) rename x-pack/{ => solutions/security}/plugins/session_view/tsconfig.json (92%) diff --git a/.buildkite/scripts/pipelines/pull_request/pipeline.ts b/.buildkite/scripts/pipelines/pull_request/pipeline.ts index 7f70afc76cb91..00abf1f2a7ac8 100644 --- a/.buildkite/scripts/pipelines/pull_request/pipeline.ts +++ b/.buildkite/scripts/pipelines/pull_request/pipeline.ts @@ -372,7 +372,7 @@ const getPipeline = (filename: string, removeSteps = true) => { if ( (await doAnyChangesMatch([ /^x-pack\/packages\/kbn-cloud-security-posture/, - /^x-pack\/plugins\/cloud_security_posture/, + /^x-pack\/solutions\/security\/plugins\/cloud_security_posture/, /^x-pack\/solutions\/security\/plugins\/security_solution/, /^x-pack\/test\/security_solution_cypress/, ])) || diff --git a/.eslintrc.js b/.eslintrc.js index 4aa6cd084cef3..fafce927f8289 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -1966,7 +1966,7 @@ module.exports = { * Cloud Security Team overrides */ { - files: ['x-pack/plugins/cloud_security_posture/**/*.{js,mjs,ts,tsx}'], + files: ['x-pack/solutions/security/plugins/cloud_security_posture/**/*.{js,mjs,ts,tsx}'], plugins: ['testing-library'], rules: { 'testing-library/await-async-utils': 'error', diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index 385a35c4084d6..0238579321866 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -51,7 +51,7 @@ packages/kbn-apm-types @elastic/obs-ux-infra_services-team packages/kbn-apm-utils @elastic/obs-ux-infra_services-team test/plugin_functional/plugins/app_link_test @elastic/kibana-core x-pack/test/usage_collection/plugins/application_usage_test @elastic/kibana-core -x-pack/plugins/asset_inventory @elastic/kibana-cloud-security-posture +x-pack/solutions/security/plugins/asset_inventory @elastic/kibana-cloud-security-posture x-pack/test/security_api_integration/plugins/audit_log @elastic/kibana-security src/platform/packages/shared/kbn-avc-banner @elastic/security-defend-workflows packages/kbn-axe-config @elastic/kibana-qa @@ -85,16 +85,16 @@ packages/kbn-cli-dev-mode @elastic/kibana-operations packages/cloud @elastic/kibana-core x-pack/plugins/cloud_integrations/cloud_chat @elastic/kibana-core x-pack/platform/plugins/private/cloud_integrations/cloud_data_migration @elastic/kibana-management -x-pack/plugins/cloud_defend @elastic/kibana-cloud-security-posture +x-pack/solutions/security/plugins/cloud_defend @elastic/kibana-cloud-security-posture x-pack/plugins/cloud_integrations/cloud_experiments @elastic/kibana-core x-pack/plugins/cloud_integrations/cloud_full_story @elastic/kibana-core x-pack/test/cloud_integration/plugins/saml_provider @elastic/kibana-core x-pack/plugins/cloud_integrations/cloud_links @elastic/kibana-core x-pack/plugins/cloud @elastic/kibana-core -x-pack/packages/kbn-cloud-security-posture/public @elastic/kibana-cloud-security-posture -x-pack/packages/kbn-cloud-security-posture/common @elastic/kibana-cloud-security-posture -x-pack/packages/kbn-cloud-security-posture/graph @elastic/kibana-cloud-security-posture -x-pack/plugins/cloud_security_posture @elastic/kibana-cloud-security-posture +x-pack/solutions/security/packages/kbn-cloud-security-posture/public @elastic/kibana-cloud-security-posture +x-pack/platform/packages/shared/kbn-cloud-security-posture/common @elastic/kibana-cloud-security-posture +x-pack/solutions/security/packages/kbn-cloud-security-posture/graph @elastic/kibana-cloud-security-posture +x-pack/solutions/security/plugins/cloud_security_posture @elastic/kibana-cloud-security-posture packages/shared-ux/code_editor/impl @elastic/appex-sharedux packages/shared-ux/code_editor/mocks @elastic/appex-sharedux packages/kbn-code-owners @elastic/appex-qa @@ -566,7 +566,7 @@ src/plugins/kibana_overview @elastic/appex-sharedux src/plugins/kibana_react @elastic/appex-sharedux src/plugins/kibana_usage_collection @elastic/kibana-core src/plugins/kibana_utils @elastic/appex-sharedux -x-pack/plugins/kubernetes_security @elastic/kibana-cloud-security-posture +x-pack/solutions/security/plugins/kubernetes_security @elastic/kibana-cloud-security-posture x-pack/platform/packages/shared/kbn-langchain @elastic/security-generative-ai src/platform/packages/private/kbn-language-documentation @elastic/kibana-esql x-pack/examples/lens_config_builder_example @elastic/kibana-visualizations @@ -860,7 +860,7 @@ src/platform/packages/shared/serverless/settings/security_project @elastic/secur packages/serverless/storybook/config @elastic/appex-sharedux packages/serverless/types @elastic/appex-sharedux test/plugin_functional/plugins/session_notifications @elastic/kibana-core -x-pack/plugins/session_view @elastic/kibana-cloud-security-posture +x-pack/solutions/security/plugins/session_view @elastic/kibana-cloud-security-posture packages/kbn-set-map @elastic/kibana-operations examples/share_examples @elastic/appex-sharedux src/plugins/share @elastic/appex-sharedux diff --git a/.github/codeql/codeql-config.yml b/.github/codeql/codeql-config.yml index 70a9453612122..8ad946732714b 100644 --- a/.github/codeql/codeql-config.yml +++ b/.github/codeql/codeql-config.yml @@ -74,7 +74,7 @@ paths-ignore: - scripts - test - x-pack/plugins/canvas/scripts - - x-pack/plugins/cloud_security_posture/common/scripts + - x-pack/solutions/security/plugins/cloud_security_posture/common/scripts - x-pack/solutions/security/plugins/elastic_assistant/scripts - x-pack/plugins/event_log/scripts - x-pack/plugins/fleet/scripts diff --git a/.i18nrc.json b/.i18nrc.json index 1ef582708b2cd..63cbc62d13650 100644 --- a/.i18nrc.json +++ b/.i18nrc.json @@ -119,7 +119,12 @@ "searchIndexDocuments": "packages/kbn-search-index-documents", "searchResponseWarnings": "packages/kbn-search-response-warnings", "searchTypes": "packages/kbn-search-types", - "securitySolutionPackages": "x-pack/solutions/security/packages", + "securitySolutionPackages": [ + "x-pack/solutions/security/packages" + ], + "sharedPlatformPackages": [ + "x-pack/platform/packages/shared/kbn-cloud-security-posture" + ], "serverlessPackages": "packages/serverless", "sse": ["src/platform/packages/shared/kbn-sse-utils"], "coloring": "packages/kbn-coloring/src", diff --git a/docs/developer/plugin-list.asciidoc b/docs/developer/plugin-list.asciidoc index f7e907f97202f..f18bafe5221b3 100644 --- a/docs/developer/plugin-list.asciidoc +++ b/docs/developer/plugin-list.asciidoc @@ -470,7 +470,7 @@ The plugin exposes the static DefaultEditorController class to consume. |WARNING: Missing README. -|{kib-repo}blob/{branch}/x-pack/plugins/asset_inventory/README.md[assetInventory] +|{kib-repo}blob/{branch}/x-pack/solutions/security/plugins/asset_inventory/README.md[assetInventory] |Centralized asset inventory experience within the Elastic Security solution. A central place for users to view and manage all their assets from different environments. @@ -499,7 +499,7 @@ It was removed, but the plugin was left behind to register no longer used config |Static migration page where self-managed users can see text/copy about migrating to Elastic Cloud -|{kib-repo}blob/{branch}/x-pack/plugins/cloud_defend/README.md[cloudDefend] +|{kib-repo}blob/{branch}/x-pack/solutions/security/plugins/cloud_defend/README.md[cloudDefend] |This plugin currently only exists to provide custom fleet policy UX for a set of new BPF LSM features. The first feature being container "drift prevention". @@ -516,7 +516,7 @@ This plugin no-longer exposes any evaluation APIs. Refer to /x-pack/packages/kbn-cloud-security-posture/common'], + rootDir: '../../../../../..', + roots: ['/x-pack/platform/packages/shared/kbn-cloud-security-posture/common'], }; diff --git a/x-pack/packages/kbn-cloud-security-posture/common/kibana.jsonc b/x-pack/platform/packages/shared/kbn-cloud-security-posture/common/kibana.jsonc similarity index 100% rename from x-pack/packages/kbn-cloud-security-posture/common/kibana.jsonc rename to x-pack/platform/packages/shared/kbn-cloud-security-posture/common/kibana.jsonc diff --git a/x-pack/packages/kbn-cloud-security-posture/common/package.json b/x-pack/platform/packages/shared/kbn-cloud-security-posture/common/package.json similarity index 100% rename from x-pack/packages/kbn-cloud-security-posture/common/package.json rename to x-pack/platform/packages/shared/kbn-cloud-security-posture/common/package.json diff --git a/x-pack/packages/kbn-cloud-security-posture/common/schema/graph/index.ts b/x-pack/platform/packages/shared/kbn-cloud-security-posture/common/schema/graph/index.ts similarity index 100% rename from x-pack/packages/kbn-cloud-security-posture/common/schema/graph/index.ts rename to x-pack/platform/packages/shared/kbn-cloud-security-posture/common/schema/graph/index.ts diff --git a/x-pack/packages/kbn-cloud-security-posture/common/schema/graph/latest.ts b/x-pack/platform/packages/shared/kbn-cloud-security-posture/common/schema/graph/latest.ts similarity index 100% rename from x-pack/packages/kbn-cloud-security-posture/common/schema/graph/latest.ts rename to x-pack/platform/packages/shared/kbn-cloud-security-posture/common/schema/graph/latest.ts diff --git a/x-pack/packages/kbn-cloud-security-posture/common/schema/graph/v1.ts b/x-pack/platform/packages/shared/kbn-cloud-security-posture/common/schema/graph/v1.ts similarity index 100% rename from x-pack/packages/kbn-cloud-security-posture/common/schema/graph/v1.ts rename to x-pack/platform/packages/shared/kbn-cloud-security-posture/common/schema/graph/v1.ts diff --git a/x-pack/packages/kbn-cloud-security-posture/common/schema/rules/index.ts b/x-pack/platform/packages/shared/kbn-cloud-security-posture/common/schema/rules/index.ts similarity index 100% rename from x-pack/packages/kbn-cloud-security-posture/common/schema/rules/index.ts rename to x-pack/platform/packages/shared/kbn-cloud-security-posture/common/schema/rules/index.ts diff --git a/x-pack/packages/kbn-cloud-security-posture/common/schema/rules/latest.ts b/x-pack/platform/packages/shared/kbn-cloud-security-posture/common/schema/rules/latest.ts similarity index 100% rename from x-pack/packages/kbn-cloud-security-posture/common/schema/rules/latest.ts rename to x-pack/platform/packages/shared/kbn-cloud-security-posture/common/schema/rules/latest.ts diff --git a/x-pack/packages/kbn-cloud-security-posture/common/schema/rules/v1.ts b/x-pack/platform/packages/shared/kbn-cloud-security-posture/common/schema/rules/v1.ts similarity index 100% rename from x-pack/packages/kbn-cloud-security-posture/common/schema/rules/v1.ts rename to x-pack/platform/packages/shared/kbn-cloud-security-posture/common/schema/rules/v1.ts diff --git a/x-pack/packages/kbn-cloud-security-posture/common/schema/rules/v2.ts b/x-pack/platform/packages/shared/kbn-cloud-security-posture/common/schema/rules/v2.ts similarity index 100% rename from x-pack/packages/kbn-cloud-security-posture/common/schema/rules/v2.ts rename to x-pack/platform/packages/shared/kbn-cloud-security-posture/common/schema/rules/v2.ts diff --git a/x-pack/packages/kbn-cloud-security-posture/common/schema/rules/v3.ts b/x-pack/platform/packages/shared/kbn-cloud-security-posture/common/schema/rules/v3.ts similarity index 100% rename from x-pack/packages/kbn-cloud-security-posture/common/schema/rules/v3.ts rename to x-pack/platform/packages/shared/kbn-cloud-security-posture/common/schema/rules/v3.ts diff --git a/x-pack/packages/kbn-cloud-security-posture/common/schema/rules/v4.ts b/x-pack/platform/packages/shared/kbn-cloud-security-posture/common/schema/rules/v4.ts similarity index 100% rename from x-pack/packages/kbn-cloud-security-posture/common/schema/rules/v4.ts rename to x-pack/platform/packages/shared/kbn-cloud-security-posture/common/schema/rules/v4.ts diff --git a/x-pack/packages/kbn-cloud-security-posture/common/schema/rules/v5.ts b/x-pack/platform/packages/shared/kbn-cloud-security-posture/common/schema/rules/v5.ts similarity index 100% rename from x-pack/packages/kbn-cloud-security-posture/common/schema/rules/v5.ts rename to x-pack/platform/packages/shared/kbn-cloud-security-posture/common/schema/rules/v5.ts diff --git a/x-pack/packages/kbn-cloud-security-posture/common/schema/vulnerabilities/csp_vulnerability_finding.ts b/x-pack/platform/packages/shared/kbn-cloud-security-posture/common/schema/vulnerabilities/csp_vulnerability_finding.ts similarity index 100% rename from x-pack/packages/kbn-cloud-security-posture/common/schema/vulnerabilities/csp_vulnerability_finding.ts rename to x-pack/platform/packages/shared/kbn-cloud-security-posture/common/schema/vulnerabilities/csp_vulnerability_finding.ts diff --git a/x-pack/packages/kbn-cloud-security-posture/common/schema/vulnerabilities/latest.ts b/x-pack/platform/packages/shared/kbn-cloud-security-posture/common/schema/vulnerabilities/latest.ts similarity index 100% rename from x-pack/packages/kbn-cloud-security-posture/common/schema/vulnerabilities/latest.ts rename to x-pack/platform/packages/shared/kbn-cloud-security-posture/common/schema/vulnerabilities/latest.ts diff --git a/x-pack/packages/kbn-cloud-security-posture/common/tsconfig.json b/x-pack/platform/packages/shared/kbn-cloud-security-posture/common/tsconfig.json similarity index 87% rename from x-pack/packages/kbn-cloud-security-posture/common/tsconfig.json rename to x-pack/platform/packages/shared/kbn-cloud-security-posture/common/tsconfig.json index ebec9929559f0..681b16eddbd65 100644 --- a/x-pack/packages/kbn-cloud-security-posture/common/tsconfig.json +++ b/x-pack/platform/packages/shared/kbn-cloud-security-posture/common/tsconfig.json @@ -1,5 +1,5 @@ { - "extends": "../../../../tsconfig.base.json", + "extends": "../../../../../../tsconfig.base.json", "compilerOptions": { "outDir": "target/types", "types": [ diff --git a/x-pack/packages/kbn-cloud-security-posture/common/types/benchmark.ts b/x-pack/platform/packages/shared/kbn-cloud-security-posture/common/types/benchmark.ts similarity index 100% rename from x-pack/packages/kbn-cloud-security-posture/common/types/benchmark.ts rename to x-pack/platform/packages/shared/kbn-cloud-security-posture/common/types/benchmark.ts diff --git a/x-pack/packages/kbn-cloud-security-posture/common/types/findings.ts b/x-pack/platform/packages/shared/kbn-cloud-security-posture/common/types/findings.ts similarity index 100% rename from x-pack/packages/kbn-cloud-security-posture/common/types/findings.ts rename to x-pack/platform/packages/shared/kbn-cloud-security-posture/common/types/findings.ts diff --git a/x-pack/packages/kbn-cloud-security-posture/common/types/graph/index.ts b/x-pack/platform/packages/shared/kbn-cloud-security-posture/common/types/graph/index.ts similarity index 100% rename from x-pack/packages/kbn-cloud-security-posture/common/types/graph/index.ts rename to x-pack/platform/packages/shared/kbn-cloud-security-posture/common/types/graph/index.ts diff --git a/x-pack/packages/kbn-cloud-security-posture/common/types/graph/latest.ts b/x-pack/platform/packages/shared/kbn-cloud-security-posture/common/types/graph/latest.ts similarity index 100% rename from x-pack/packages/kbn-cloud-security-posture/common/types/graph/latest.ts rename to x-pack/platform/packages/shared/kbn-cloud-security-posture/common/types/graph/latest.ts diff --git a/x-pack/packages/kbn-cloud-security-posture/common/types/graph/v1.ts b/x-pack/platform/packages/shared/kbn-cloud-security-posture/common/types/graph/v1.ts similarity index 100% rename from x-pack/packages/kbn-cloud-security-posture/common/types/graph/v1.ts rename to x-pack/platform/packages/shared/kbn-cloud-security-posture/common/types/graph/v1.ts diff --git a/x-pack/packages/kbn-cloud-security-posture/common/types/status.ts b/x-pack/platform/packages/shared/kbn-cloud-security-posture/common/types/status.ts similarity index 100% rename from x-pack/packages/kbn-cloud-security-posture/common/types/status.ts rename to x-pack/platform/packages/shared/kbn-cloud-security-posture/common/types/status.ts diff --git a/x-pack/packages/kbn-cloud-security-posture/common/types/vulnerabilities.ts b/x-pack/platform/packages/shared/kbn-cloud-security-posture/common/types/vulnerabilities.ts similarity index 100% rename from x-pack/packages/kbn-cloud-security-posture/common/types/vulnerabilities.ts rename to x-pack/platform/packages/shared/kbn-cloud-security-posture/common/types/vulnerabilities.ts diff --git a/x-pack/packages/kbn-cloud-security-posture/common/utils/get_abbreviated_number.test.ts b/x-pack/platform/packages/shared/kbn-cloud-security-posture/common/utils/get_abbreviated_number.test.ts similarity index 100% rename from x-pack/packages/kbn-cloud-security-posture/common/utils/get_abbreviated_number.test.ts rename to x-pack/platform/packages/shared/kbn-cloud-security-posture/common/utils/get_abbreviated_number.test.ts diff --git a/x-pack/packages/kbn-cloud-security-posture/common/utils/get_abbreviated_number.ts b/x-pack/platform/packages/shared/kbn-cloud-security-posture/common/utils/get_abbreviated_number.ts similarity index 100% rename from x-pack/packages/kbn-cloud-security-posture/common/utils/get_abbreviated_number.ts rename to x-pack/platform/packages/shared/kbn-cloud-security-posture/common/utils/get_abbreviated_number.ts diff --git a/x-pack/packages/kbn-cloud-security-posture/common/utils/helpers.test.ts b/x-pack/platform/packages/shared/kbn-cloud-security-posture/common/utils/helpers.test.ts similarity index 100% rename from x-pack/packages/kbn-cloud-security-posture/common/utils/helpers.test.ts rename to x-pack/platform/packages/shared/kbn-cloud-security-posture/common/utils/helpers.test.ts diff --git a/x-pack/packages/kbn-cloud-security-posture/common/utils/helpers.ts b/x-pack/platform/packages/shared/kbn-cloud-security-posture/common/utils/helpers.ts similarity index 96% rename from x-pack/packages/kbn-cloud-security-posture/common/utils/helpers.ts rename to x-pack/platform/packages/shared/kbn-cloud-security-posture/common/utils/helpers.ts index ac2e27b70878f..8335fea705069 100644 --- a/x-pack/packages/kbn-cloud-security-posture/common/utils/helpers.ts +++ b/x-pack/platform/packages/shared/kbn-cloud-security-posture/common/utils/helpers.ts @@ -9,9 +9,12 @@ import { QueryDslQueryContainer } from '@kbn/data-views-plugin/common/types'; import { i18n } from '@kbn/i18n'; import type { CspBenchmarkRulesStates } from '../schema/rules/latest'; -export const defaultErrorMessage = i18n.translate('xpack.csp.common.utils.helpers.unknownError', { - defaultMessage: 'Unknown Error', -}); +export const defaultErrorMessage = i18n.translate( + 'sharedPlatformPackages.csp.common.utils.helpers.unknownError', + { + defaultMessage: 'Unknown Error', + } +); export const extractErrorMessage = (e: unknown, fallbackMessage?: string): string => { if (e instanceof Error) return e.message; diff --git a/x-pack/packages/kbn-cloud-security-posture/common/utils/ui_metrics.ts b/x-pack/platform/packages/shared/kbn-cloud-security-posture/common/utils/ui_metrics.ts similarity index 100% rename from x-pack/packages/kbn-cloud-security-posture/common/utils/ui_metrics.ts rename to x-pack/platform/packages/shared/kbn-cloud-security-posture/common/utils/ui_metrics.ts diff --git a/x-pack/platform/plugins/private/translations/translations/fr-FR.json b/x-pack/platform/plugins/private/translations/translations/fr-FR.json index 7f299390f1e31..71022cb1093f0 100644 --- a/x-pack/platform/plugins/private/translations/translations/fr-FR.json +++ b/x-pack/platform/plugins/private/translations/translations/fr-FR.json @@ -14728,7 +14728,7 @@ "xpack.csp.cnvmDashboardTable.section.topVulnerableResources.column.vulnerabilities": "Vulnérabilités", "xpack.csp.cnvmDashboardTable.section.topVulnerableResources.column.vulnerabilityCount": "Vulnérabilités", "xpack.csp.common.component.multiSelectFilter.searchWord": "Recherche", - "xpack.csp.common.utils.helpers.unknownError": "Erreur inconnue", + "sharedPlatformPackages.csp.common.utils.helpers.unknownError": "Erreur inconnue", "xpack.csp.compactFormattedNumber.naTitle": "S. O.", "xpack.csp.complianceScoreBar.tooltipTitle": "{failed} échecs et {passed} réussites de résultats", "xpack.csp.complianceScoreChart.counterButtonLink.failedFindingsTooltip": "Échec des résultats", @@ -14743,9 +14743,9 @@ "xpack.csp.createPackagePolicy.customAssetsTab.rulesViewLabel": "Afficher les règles CSP", "xpack.csp.createPackagePolicy.customAssetsTab.vulnerabilityDashboardViewLabel": "Afficher le tableau de bord CNVM", "xpack.csp.createPackagePolicy.customAssetsTab.vulnerabilityFindingsViewLabel": "Afficher les résultats des vulnérabilités", - "xpack.csp.cspEvaluationBadge.failLabel": "Échec", - "xpack.csp.cspEvaluationBadge.naLabel": "S. O.", - "xpack.csp.cspEvaluationBadge.passLabel": "Réussite", + "securitySolutionPackages.csp.cspEvaluationBadge.failLabel": "Échec", + "securitySolutionPackages.csp.cspEvaluationBadge.naLabel": "S. O.", + "securitySolutionPackages.csp.cspEvaluationBadge.passLabel": "Réussite", "xpack.csp.cspIntegration.gcpCloudCredentials.cloudFormationSupportedMessage": "La fonctionnalité Lancer Cloud Shell pour obtenir les informations d'identification de façon automatisée n’est pas pris en charge dans la version d'intégration actuelle. Veuillez effectuer une mise à niveau vers la dernière version pour activer Lancer Cloud Shell pour les informations d'identification automatisées.", "xpack.csp.cspmIntegration.awsOption.benchmarkTitle": "CIS AWS", "xpack.csp.cspmIntegration.awsOption.nameTitle": "AWS", @@ -14829,7 +14829,7 @@ "xpack.csp.findings.distributionBar.totalPassedLabel": "Réussite des résultats", "xpack.csp.findings.errorCallout.pageSearchErrorTitle": "Une erreur s’est produite lors de la récupération des résultats de recherche.", "xpack.csp.findings.errorCallout.showErrorButtonLabel": "Afficher le message d'erreur", - "xpack.csp.findings.findingsErrorToast.searchFailedTitle": "Échec de la recherche", + "securitySolutionPackages.csp.findings.findingsErrorToast.searchFailedTitle": "Échec de la recherche", "xpack.csp.findings.findingsFlyout.calloutTitle": "Certains champs ne sont pas fournis par {vendor}", "xpack.csp.findings.findingsFlyout.flyoutDescriptionList.resourceId": "ID ressource", "xpack.csp.findings.findingsFlyout.flyoutDescriptionList.resourceName": "Nom de ressource", @@ -14999,11 +14999,10 @@ "xpack.csp.kspmIntegration.integration.shortNameTitle": "KSPM", "xpack.csp.kspmIntegration.vanillaOption.benchmarkTitle": "CIS Kubernetes", "xpack.csp.kspmIntegration.vanillaOption.nameTitle": "Autogéré", - "xpack.csp.navigation.dashboardNavItemLabel": "Niveau de sécurité du cloud", - "xpack.csp.navigation.findingsNavItemLabel": "Résultats", - "xpack.csp.navigation.myBenchmarksNavItemLabel": "Benchmarks", - "xpack.csp.navigation.rulesNavItemLabel": "Règles", - "xpack.csp.navigation.vulnerabilityDashboardNavItemLabel": "Gestion des vulnérabilités natives du cloud", + "securitySolutionPackages.csp.navigation.dashboardNavItemLabel": "Niveau de sécurité du cloud", + "securitySolutionPackages.csp.navigation.findingsNavItemLabel": "Résultats", + "securitySolutionPackages.csp.navigation.rulesNavItemLabel": "Règles", + "securitySolutionPackages.csp.navigation.vulnerabilityDashboardNavItemLabel": "Gestion des vulnérabilités natives du cloud", "xpack.csp.noFindingsStates.indexing.indexingButtonTitle": "Évaluation du niveau en cours", "xpack.csp.noFindingsStates.indexing.indexingDescription": "En attente de la collecte et de l'indexation des données. Revenez plus tard pour voir vos résultats", "xpack.csp.noFindingsStates.indexTimeout.indexTimeoutDescription": "La collecte des résultats prend plus de temps que prévu. {docs}.", diff --git a/x-pack/platform/plugins/private/translations/translations/ja-JP.json b/x-pack/platform/plugins/private/translations/translations/ja-JP.json index b6717180fbf5f..0e57dedbab133 100644 --- a/x-pack/platform/plugins/private/translations/translations/ja-JP.json +++ b/x-pack/platform/plugins/private/translations/translations/ja-JP.json @@ -14594,7 +14594,7 @@ "xpack.csp.cnvmDashboardTable.section.topVulnerableResources.column.vulnerabilities": "脆弱性", "xpack.csp.cnvmDashboardTable.section.topVulnerableResources.column.vulnerabilityCount": "脆弱性", "xpack.csp.common.component.multiSelectFilter.searchWord": "検索", - "xpack.csp.common.utils.helpers.unknownError": "不明なエラー", + "sharedPlatformPackages.csp.common.utils.helpers.unknownError": "不明なエラー", "xpack.csp.compactFormattedNumber.naTitle": "N/A", "xpack.csp.complianceScoreBar.tooltipTitle": "{failed}が失敗し、{passed}が調査結果に合格しました", "xpack.csp.complianceScoreChart.counterButtonLink.failedFindingsTooltip": "失敗した調査結果", @@ -14609,9 +14609,9 @@ "xpack.csp.createPackagePolicy.customAssetsTab.rulesViewLabel": "CSPルールを表示", "xpack.csp.createPackagePolicy.customAssetsTab.vulnerabilityDashboardViewLabel": "CNVMダッシュボードを表示", "xpack.csp.createPackagePolicy.customAssetsTab.vulnerabilityFindingsViewLabel": "脆弱性の調査結果を表示", - "xpack.csp.cspEvaluationBadge.failLabel": "失敗", - "xpack.csp.cspEvaluationBadge.naLabel": "N/A", - "xpack.csp.cspEvaluationBadge.passLabel": "合格", + "securitySolutionPackages.csp.cspEvaluationBadge.failLabel": "失敗", + "securitySolutionPackages.csp.cspEvaluationBadge.naLabel": "N/A", + "securitySolutionPackages.csp.cspEvaluationBadge.passLabel": "合格", "xpack.csp.cspIntegration.gcpCloudCredentials.cloudFormationSupportedMessage": "Launch Cloud ShellLaunch Cloud Formation for Automated Credentialsは、現在の統合バージョンではサポートされていません。Launch Cloud Shell for Automated Credentialsを有効化するには、最新バージョンにアップグレードしてください。", "xpack.csp.cspmIntegration.awsOption.benchmarkTitle": "CIS AWS", "xpack.csp.cspmIntegration.awsOption.nameTitle": "AWS", @@ -14694,7 +14694,7 @@ "xpack.csp.findings.distributionBar.totalPassedLabel": "合格した調査結果", "xpack.csp.findings.errorCallout.pageSearchErrorTitle": "検索結果の取得中にエラーが発生しました", "xpack.csp.findings.errorCallout.showErrorButtonLabel": "エラーメッセージを表示", - "xpack.csp.findings.findingsErrorToast.searchFailedTitle": "検索失敗", + "securitySolutionPackages.csp.findings.findingsErrorToast.searchFailedTitle": "検索失敗", "xpack.csp.findings.findingsFlyout.calloutTitle": "一部のフィールドは{vendor}によって提供されていません", "xpack.csp.findings.findingsFlyout.flyoutDescriptionList.resourceId": "リソースID", "xpack.csp.findings.findingsFlyout.flyoutDescriptionList.resourceName": "リソース名", @@ -14863,11 +14863,10 @@ "xpack.csp.kspmIntegration.integration.shortNameTitle": "KSPM", "xpack.csp.kspmIntegration.vanillaOption.benchmarkTitle": "CIS Kubernetes", "xpack.csp.kspmIntegration.vanillaOption.nameTitle": "自己管理", - "xpack.csp.navigation.dashboardNavItemLabel": "クラウドセキュリティ態勢", - "xpack.csp.navigation.findingsNavItemLabel": "調査結果", - "xpack.csp.navigation.myBenchmarksNavItemLabel": "ベンチマーク", - "xpack.csp.navigation.rulesNavItemLabel": "ルール", - "xpack.csp.navigation.vulnerabilityDashboardNavItemLabel": "Cloud Native Vulnerability Management", + "securitySolutionPackages.csp.navigation.dashboardNavItemLabel": "クラウドセキュリティ態勢", + "securitySolutionPackages.csp.navigation.findingsNavItemLabel": "調査結果", + "securitySolutionPackages.csp.navigation.rulesNavItemLabel": "ルール", + "securitySolutionPackages.csp.navigation.vulnerabilityDashboardNavItemLabel": "Cloud Native Vulnerability Management", "xpack.csp.noFindingsStates.indexing.indexingButtonTitle": "態勢評価中", "xpack.csp.noFindingsStates.indexing.indexingDescription": "データの収集とインデックス作成を待機しています。結果を表示するには、しばらくたってから確認してください", "xpack.csp.noFindingsStates.indexTimeout.indexTimeoutDescription": "調査結果の収集に想定よりも時間がかかっています。{docs}。", diff --git a/x-pack/platform/plugins/private/translations/translations/zh-CN.json b/x-pack/platform/plugins/private/translations/translations/zh-CN.json index 5bb45d1a96c63..59ce51256ed17 100644 --- a/x-pack/platform/plugins/private/translations/translations/zh-CN.json +++ b/x-pack/platform/plugins/private/translations/translations/zh-CN.json @@ -14657,7 +14657,7 @@ "xpack.csp.cnvmDashboardTable.section.topVulnerableResources.column.vulnerabilities": "漏洞", "xpack.csp.cnvmDashboardTable.section.topVulnerableResources.column.vulnerabilityCount": "漏洞", "xpack.csp.common.component.multiSelectFilter.searchWord": "搜索", - "xpack.csp.common.utils.helpers.unknownError": "未知错误", + "sharedPlatformPackages.csp.common.utils.helpers.unknownError": "未知错误", "xpack.csp.compactFormattedNumber.naTitle": "不可用", "xpack.csp.complianceScoreBar.tooltipTitle": "{failed} 个失败和 {passed} 个通过的结果", "xpack.csp.complianceScoreChart.counterButtonLink.failedFindingsTooltip": "失败的结果", @@ -14672,9 +14672,9 @@ "xpack.csp.createPackagePolicy.customAssetsTab.rulesViewLabel": "查看 CSP 规则", "xpack.csp.createPackagePolicy.customAssetsTab.vulnerabilityDashboardViewLabel": "查看 CNVM 仪表板", "xpack.csp.createPackagePolicy.customAssetsTab.vulnerabilityFindingsViewLabel": "查看漏洞结果", - "xpack.csp.cspEvaluationBadge.failLabel": "失败", - "xpack.csp.cspEvaluationBadge.naLabel": "不可用", - "xpack.csp.cspEvaluationBadge.passLabel": "通过", + "securitySolutionPackages.csp.cspEvaluationBadge.failLabel": "失败", + "securitySolutionPackages.csp.cspEvaluationBadge.naLabel": "不可用", + "securitySolutionPackages.csp.cspEvaluationBadge.passLabel": "通过", "xpack.csp.cspIntegration.gcpCloudCredentials.cloudFormationSupportedMessage": "当前集成版本不支持为自动化凭据启动 Cloud Shell。请升级到最新版本以启用为自动化凭据启动 Cloud Shell。", "xpack.csp.cspmIntegration.awsOption.benchmarkTitle": "CIS AWS", "xpack.csp.cspmIntegration.awsOption.nameTitle": "AWS", @@ -14758,7 +14758,7 @@ "xpack.csp.findings.distributionBar.totalPassedLabel": "通过的结果", "xpack.csp.findings.errorCallout.pageSearchErrorTitle": "检索搜索结果时遇到问题", "xpack.csp.findings.errorCallout.showErrorButtonLabel": "显示错误消息", - "xpack.csp.findings.findingsErrorToast.searchFailedTitle": "搜索失败", + "securitySolutionPackages.csp.findings.findingsErrorToast.searchFailedTitle": "搜索失败", "xpack.csp.findings.findingsFlyout.calloutTitle": "{vendor} 未提供某些字段", "xpack.csp.findings.findingsFlyout.flyoutDescriptionList.resourceId": "资源 ID", "xpack.csp.findings.findingsFlyout.flyoutDescriptionList.resourceName": "资源名称", @@ -14928,11 +14928,10 @@ "xpack.csp.kspmIntegration.integration.shortNameTitle": "KSPM", "xpack.csp.kspmIntegration.vanillaOption.benchmarkTitle": "CIS Kubernetes", "xpack.csp.kspmIntegration.vanillaOption.nameTitle": "自管型", - "xpack.csp.navigation.dashboardNavItemLabel": "云安全态势", - "xpack.csp.navigation.findingsNavItemLabel": "结果", - "xpack.csp.navigation.myBenchmarksNavItemLabel": "基准", - "xpack.csp.navigation.rulesNavItemLabel": "规则", - "xpack.csp.navigation.vulnerabilityDashboardNavItemLabel": "云原生漏洞管理", + "securitySolutionPackages.csp.navigation.dashboardNavItemLabel": "云安全态势", + "securitySolutionPackages.csp.navigation.findingsNavItemLabel": "结果", + "securitySolutionPackages.csp.navigation.rulesNavItemLabel": "规则", + "securitySolutionPackages.csp.navigation.vulnerabilityDashboardNavItemLabel": "云原生漏洞管理", "xpack.csp.noFindingsStates.indexing.indexingButtonTitle": "正进行态势评估", "xpack.csp.noFindingsStates.indexing.indexingDescription": "正在等待要收集和索引的数据。请稍后返回检查以查看结果", "xpack.csp.noFindingsStates.indexTimeout.indexTimeoutDescription": "收集结果所需的时间长于预期。{docs}。", diff --git a/x-pack/plugins/telemetry_collection_xpack/schema/xpack_plugins.json b/x-pack/plugins/telemetry_collection_xpack/schema/xpack_plugins.json index eb9872e4cb607..c13999f601b6b 100644 --- a/x-pack/plugins/telemetry_collection_xpack/schema/xpack_plugins.json +++ b/x-pack/plugins/telemetry_collection_xpack/schema/xpack_plugins.json @@ -10955,718 +10955,6 @@ } } }, - "cloud_defend": { - "properties": { - "indices": { - "properties": { - "alerts": { - "properties": { - "doc_count": { - "type": "long" - }, - "deleted": { - "type": "long" - }, - "size_in_bytes": { - "type": "long" - }, - "last_doc_timestamp": { - "type": "date" - } - } - }, - "file": { - "properties": { - "doc_count": { - "type": "long" - }, - "deleted": { - "type": "long" - }, - "size_in_bytes": { - "type": "long" - }, - "last_doc_timestamp": { - "type": "date" - } - } - }, - "process": { - "properties": { - "doc_count": { - "type": "long" - }, - "deleted": { - "type": "long" - }, - "size_in_bytes": { - "type": "long" - }, - "last_doc_timestamp": { - "type": "date" - } - } - }, - "latestPackageVersion": { - "type": "keyword" - }, - "packageStatus": { - "properties": { - "status": { - "type": "keyword" - }, - "installedPackagePolicies": { - "type": "long" - }, - "healthyAgents": { - "type": "long" - } - } - } - } - }, - "pods_stats": { - "type": "array", - "items": { - "properties": { - "account_id": { - "type": "keyword" - }, - "container_image_name": { - "type": "keyword" - }, - "container_image_tag": { - "type": "keyword" - }, - "pod_name": { - "type": "keyword" - }, - "total_doc_count": { - "type": "long" - }, - "process_doc_count": { - "type": "long" - }, - "file_doc_count": { - "type": "long" - }, - "alert_doc_count": { - "type": "long" - } - } - } - }, - "accounts_stats": { - "type": "array", - "items": { - "properties": { - "account_id": { - "type": "keyword" - }, - "cloud_provider": { - "type": "keyword" - }, - "kubernetes_version": { - "type": "keyword" - }, - "total_doc_count": { - "type": "long" - }, - "file_doc_count": { - "type": "long" - }, - "process_doc_count": { - "type": "long" - }, - "alert_doc_count": { - "type": "long" - }, - "agents_count": { - "type": "short" - }, - "nodes_count": { - "type": "short" - }, - "pods_count": { - "type": "short" - } - } - } - }, - "installation_stats": { - "type": "array", - "items": { - "properties": { - "package_policy_id": { - "type": "keyword" - }, - "package_version": { - "type": "keyword" - }, - "agent_policy_id": { - "type": "keyword" - }, - "created_at": { - "type": "date" - }, - "agent_count": { - "type": "long" - }, - "policy_yaml": { - "type": "keyword" - }, - "selectors": { - "type": "array", - "items": { - "properties": { - "type": { - "type": "keyword" - }, - "name": { - "type": "keyword" - }, - "operation": { - "type": "array", - "items": { - "type": "keyword" - } - }, - "containerImageFullName": { - "type": "array", - "items": { - "type": "keyword" - } - }, - "containerImageName": { - "type": "array", - "items": { - "type": "keyword" - } - }, - "containerImageTag": { - "type": "array", - "items": { - "type": "keyword" - } - }, - "kubernetesClusterId": { - "type": "array", - "items": { - "type": "keyword" - } - }, - "kubernetesClusterName": { - "type": "array", - "items": { - "type": "keyword" - } - }, - "kubernetesNamespace": { - "type": "array", - "items": { - "type": "keyword" - } - }, - "kubernetesPodLabel": { - "type": "array", - "items": { - "type": "keyword" - } - }, - "kubernetesPodName": { - "type": "array", - "items": { - "type": "keyword" - } - }, - "targetFilePath": { - "type": "array", - "items": { - "type": "keyword" - } - }, - "ignoreVolumeFiles": { - "type": "boolean" - }, - "ignoreVolumeMounts": { - "type": "boolean" - }, - "processExecutable": { - "type": "array", - "items": { - "type": "keyword" - } - }, - "processName": { - "type": "array", - "items": { - "type": "keyword" - } - }, - "sessionLeaderInteractive": { - "type": "boolean" - } - } - } - }, - "responses": { - "type": "array", - "items": { - "properties": { - "type": { - "type": "keyword" - }, - "match": { - "type": "array", - "items": { - "type": "keyword" - } - }, - "exclude": { - "type": "array", - "items": { - "type": "keyword" - } - }, - "actions": { - "type": "array", - "items": { - "type": "keyword" - } - } - } - } - } - } - } - } - } - }, - "cloud_security_posture": { - "properties": { - "indices": { - "properties": { - "findings": { - "properties": { - "doc_count": { - "type": "long" - }, - "deleted": { - "type": "long" - }, - "size_in_bytes": { - "type": "long" - }, - "last_doc_timestamp": { - "type": "date" - } - } - }, - "latest_findings": { - "properties": { - "doc_count": { - "type": "long" - }, - "deleted": { - "type": "long" - }, - "size_in_bytes": { - "type": "long" - }, - "last_doc_timestamp": { - "type": "date" - } - } - }, - "vulnerabilities": { - "properties": { - "doc_count": { - "type": "long" - }, - "deleted": { - "type": "long" - }, - "size_in_bytes": { - "type": "long" - }, - "last_doc_timestamp": { - "type": "date" - } - } - }, - "latest_vulnerabilities": { - "properties": { - "doc_count": { - "type": "long" - }, - "deleted": { - "type": "long" - }, - "size_in_bytes": { - "type": "long" - }, - "last_doc_timestamp": { - "type": "date" - } - } - }, - "score": { - "properties": { - "doc_count": { - "type": "long" - }, - "deleted": { - "type": "long" - }, - "size_in_bytes": { - "type": "long" - }, - "last_doc_timestamp": { - "type": "date" - } - } - }, - "latestPackageVersion": { - "type": "keyword" - }, - "cspm": { - "properties": { - "status": { - "type": "keyword" - }, - "installedPackagePolicies": { - "type": "long" - }, - "healthyAgents": { - "type": "long" - } - } - }, - "kspm": { - "properties": { - "status": { - "type": "keyword" - }, - "installedPackagePolicies": { - "type": "long" - }, - "healthyAgents": { - "type": "long" - } - } - }, - "vuln_mgmt": { - "properties": { - "status": { - "type": "keyword" - }, - "installedPackagePolicies": { - "type": "long" - }, - "healthyAgents": { - "type": "long" - } - } - } - } - }, - "resources_stats": { - "type": "array", - "items": { - "properties": { - "account_id": { - "type": "keyword" - }, - "resource_type": { - "type": "keyword" - }, - "resource_type_doc_count": { - "type": "long" - }, - "resource_sub_type": { - "type": "keyword" - }, - "resource_sub_type_doc_count": { - "type": "long" - }, - "passed_findings_count": { - "type": "long" - }, - "failed_findings_count": { - "type": "long" - } - } - } - }, - "accounts_stats": { - "type": "array", - "items": { - "properties": { - "account_id": { - "type": "keyword" - }, - "posture_score": { - "type": "long" - }, - "latest_findings_doc_count": { - "type": "long" - }, - "benchmark_id": { - "type": "keyword" - }, - "benchmark_name": { - "type": "keyword" - }, - "benchmark_version": { - "type": "keyword" - }, - "kubernetes_version": { - "type": "keyword" - }, - "passed_findings_count": { - "type": "long" - }, - "failed_findings_count": { - "type": "long" - }, - "agents_count": { - "type": "short" - }, - "nodes_count": { - "type": "short" - }, - "pods_count": { - "type": "short" - } - } - } - }, - "rules_stats": { - "type": "array", - "items": { - "properties": { - "account_id": { - "type": "keyword" - }, - "rule_id": { - "type": "keyword" - }, - "rule_name": { - "type": "keyword" - }, - "rule_section": { - "type": "keyword" - }, - "rule_version": { - "type": "keyword" - }, - "rule_number": { - "type": "keyword" - }, - "posture_type": { - "type": "keyword" - }, - "benchmark_id": { - "type": "keyword" - }, - "benchmark_name": { - "type": "keyword" - }, - "benchmark_version": { - "type": "keyword" - }, - "passed_findings_count": { - "type": "long" - }, - "failed_findings_count": { - "type": "long" - } - } - } - }, - "installation_stats": { - "type": "array", - "items": { - "properties": { - "package_policy_id": { - "type": "keyword" - }, - "feature": { - "type": "keyword" - }, - "package_version": { - "type": "keyword" - }, - "agent_policy_id": { - "type": "keyword" - }, - "deployment_mode": { - "type": "keyword" - }, - "created_at": { - "type": "date" - }, - "agent_count": { - "type": "long" - }, - "is_agentless": { - "type": "boolean" - }, - "account_type": { - "type": "keyword" - }, - "is_setup_automatic": { - "type": "boolean" - }, - "setup_access_option": { - "type": "keyword" - } - } - } - }, - "alerts_stats": { - "type": "array", - "items": { - "properties": { - "posture_type": { - "type": "keyword" - }, - "rules_count": { - "type": "long" - }, - "alerts_count": { - "type": "long" - }, - "alerts_open_count": { - "type": "long" - }, - "alerts_closed_count": { - "type": "long" - }, - "alerts_acknowledged_count": { - "type": "long" - } - } - } - }, - "cloud_account_stats": { - "type": "array", - "items": { - "properties": { - "account_id": { - "type": "keyword" - }, - "cloud_provider": { - "type": "keyword" - }, - "product": { - "type": "keyword" - }, - "package_policy_id": { - "type": "keyword" - }, - "latest_doc_count": { - "type": "long" - }, - "latest_doc_updated_timestamp": { - "type": "date" - }, - "posture_management_stats": { - "properties": { - "posture_score": { - "type": "long" - }, - "benchmark_name": { - "type": "keyword" - }, - "benchmark_version": { - "type": "keyword" - }, - "passed_findings_count": { - "type": "long" - }, - "failed_findings_count": { - "type": "long" - } - } - }, - "posture_management_stats_enabled_rules": { - "properties": { - "posture_score": { - "type": "long" - }, - "benchmark_name": { - "type": "keyword" - }, - "benchmark_version": { - "type": "keyword" - }, - "passed_findings_count": { - "type": "long" - }, - "failed_findings_count": { - "type": "long" - } - } - }, - "kspm_stats": { - "properties": { - "kubernetes_version": { - "type": "keyword" - }, - "agents_count": { - "type": "short" - }, - "nodes_count": { - "type": "short" - }, - "pods_count": { - "type": "short" - } - } - }, - "has_muted_rules": { - "type": "boolean" - } - } - } - }, - "muted_rules_stats": { - "type": "array", - "items": { - "properties": { - "id": { - "type": "keyword" - }, - "name": { - "type": "keyword" - }, - "section": { - "type": "keyword" - }, - "benchmark_id": { - "type": "keyword" - }, - "benchmark_name": { - "type": "keyword" - }, - "benchmark_version": { - "type": "keyword" - }, - "rule_number": { - "type": "keyword" - }, - "posture_type": { - "type": "keyword" - }, - "version": { - "type": "keyword" - } - } - } - } - } - }, "connectors": { "properties": { "connectors": { diff --git a/x-pack/plugins/telemetry_collection_xpack/schema/xpack_security.json b/x-pack/plugins/telemetry_collection_xpack/schema/xpack_security.json index e777c123fdeba..1ab6ba490f0b5 100644 --- a/x-pack/plugins/telemetry_collection_xpack/schema/xpack_security.json +++ b/x-pack/plugins/telemetry_collection_xpack/schema/xpack_security.json @@ -1,5 +1,717 @@ { "properties": { + "cloud_defend": { + "properties": { + "indices": { + "properties": { + "alerts": { + "properties": { + "doc_count": { + "type": "long" + }, + "deleted": { + "type": "long" + }, + "size_in_bytes": { + "type": "long" + }, + "last_doc_timestamp": { + "type": "date" + } + } + }, + "file": { + "properties": { + "doc_count": { + "type": "long" + }, + "deleted": { + "type": "long" + }, + "size_in_bytes": { + "type": "long" + }, + "last_doc_timestamp": { + "type": "date" + } + } + }, + "process": { + "properties": { + "doc_count": { + "type": "long" + }, + "deleted": { + "type": "long" + }, + "size_in_bytes": { + "type": "long" + }, + "last_doc_timestamp": { + "type": "date" + } + } + }, + "latestPackageVersion": { + "type": "keyword" + }, + "packageStatus": { + "properties": { + "status": { + "type": "keyword" + }, + "installedPackagePolicies": { + "type": "long" + }, + "healthyAgents": { + "type": "long" + } + } + } + } + }, + "pods_stats": { + "type": "array", + "items": { + "properties": { + "account_id": { + "type": "keyword" + }, + "container_image_name": { + "type": "keyword" + }, + "container_image_tag": { + "type": "keyword" + }, + "pod_name": { + "type": "keyword" + }, + "total_doc_count": { + "type": "long" + }, + "process_doc_count": { + "type": "long" + }, + "file_doc_count": { + "type": "long" + }, + "alert_doc_count": { + "type": "long" + } + } + } + }, + "accounts_stats": { + "type": "array", + "items": { + "properties": { + "account_id": { + "type": "keyword" + }, + "cloud_provider": { + "type": "keyword" + }, + "kubernetes_version": { + "type": "keyword" + }, + "total_doc_count": { + "type": "long" + }, + "file_doc_count": { + "type": "long" + }, + "process_doc_count": { + "type": "long" + }, + "alert_doc_count": { + "type": "long" + }, + "agents_count": { + "type": "short" + }, + "nodes_count": { + "type": "short" + }, + "pods_count": { + "type": "short" + } + } + } + }, + "installation_stats": { + "type": "array", + "items": { + "properties": { + "package_policy_id": { + "type": "keyword" + }, + "package_version": { + "type": "keyword" + }, + "agent_policy_id": { + "type": "keyword" + }, + "created_at": { + "type": "date" + }, + "agent_count": { + "type": "long" + }, + "policy_yaml": { + "type": "keyword" + }, + "selectors": { + "type": "array", + "items": { + "properties": { + "type": { + "type": "keyword" + }, + "name": { + "type": "keyword" + }, + "operation": { + "type": "array", + "items": { + "type": "keyword" + } + }, + "containerImageFullName": { + "type": "array", + "items": { + "type": "keyword" + } + }, + "containerImageName": { + "type": "array", + "items": { + "type": "keyword" + } + }, + "containerImageTag": { + "type": "array", + "items": { + "type": "keyword" + } + }, + "kubernetesClusterId": { + "type": "array", + "items": { + "type": "keyword" + } + }, + "kubernetesClusterName": { + "type": "array", + "items": { + "type": "keyword" + } + }, + "kubernetesNamespace": { + "type": "array", + "items": { + "type": "keyword" + } + }, + "kubernetesPodLabel": { + "type": "array", + "items": { + "type": "keyword" + } + }, + "kubernetesPodName": { + "type": "array", + "items": { + "type": "keyword" + } + }, + "targetFilePath": { + "type": "array", + "items": { + "type": "keyword" + } + }, + "ignoreVolumeFiles": { + "type": "boolean" + }, + "ignoreVolumeMounts": { + "type": "boolean" + }, + "processExecutable": { + "type": "array", + "items": { + "type": "keyword" + } + }, + "processName": { + "type": "array", + "items": { + "type": "keyword" + } + }, + "sessionLeaderInteractive": { + "type": "boolean" + } + } + } + }, + "responses": { + "type": "array", + "items": { + "properties": { + "type": { + "type": "keyword" + }, + "match": { + "type": "array", + "items": { + "type": "keyword" + } + }, + "exclude": { + "type": "array", + "items": { + "type": "keyword" + } + }, + "actions": { + "type": "array", + "items": { + "type": "keyword" + } + } + } + } + } + } + } + } + } + }, + "cloud_security_posture": { + "properties": { + "indices": { + "properties": { + "findings": { + "properties": { + "doc_count": { + "type": "long" + }, + "deleted": { + "type": "long" + }, + "size_in_bytes": { + "type": "long" + }, + "last_doc_timestamp": { + "type": "date" + } + } + }, + "latest_findings": { + "properties": { + "doc_count": { + "type": "long" + }, + "deleted": { + "type": "long" + }, + "size_in_bytes": { + "type": "long" + }, + "last_doc_timestamp": { + "type": "date" + } + } + }, + "vulnerabilities": { + "properties": { + "doc_count": { + "type": "long" + }, + "deleted": { + "type": "long" + }, + "size_in_bytes": { + "type": "long" + }, + "last_doc_timestamp": { + "type": "date" + } + } + }, + "latest_vulnerabilities": { + "properties": { + "doc_count": { + "type": "long" + }, + "deleted": { + "type": "long" + }, + "size_in_bytes": { + "type": "long" + }, + "last_doc_timestamp": { + "type": "date" + } + } + }, + "score": { + "properties": { + "doc_count": { + "type": "long" + }, + "deleted": { + "type": "long" + }, + "size_in_bytes": { + "type": "long" + }, + "last_doc_timestamp": { + "type": "date" + } + } + }, + "latestPackageVersion": { + "type": "keyword" + }, + "cspm": { + "properties": { + "status": { + "type": "keyword" + }, + "installedPackagePolicies": { + "type": "long" + }, + "healthyAgents": { + "type": "long" + } + } + }, + "kspm": { + "properties": { + "status": { + "type": "keyword" + }, + "installedPackagePolicies": { + "type": "long" + }, + "healthyAgents": { + "type": "long" + } + } + }, + "vuln_mgmt": { + "properties": { + "status": { + "type": "keyword" + }, + "installedPackagePolicies": { + "type": "long" + }, + "healthyAgents": { + "type": "long" + } + } + } + } + }, + "resources_stats": { + "type": "array", + "items": { + "properties": { + "account_id": { + "type": "keyword" + }, + "resource_type": { + "type": "keyword" + }, + "resource_type_doc_count": { + "type": "long" + }, + "resource_sub_type": { + "type": "keyword" + }, + "resource_sub_type_doc_count": { + "type": "long" + }, + "passed_findings_count": { + "type": "long" + }, + "failed_findings_count": { + "type": "long" + } + } + } + }, + "accounts_stats": { + "type": "array", + "items": { + "properties": { + "account_id": { + "type": "keyword" + }, + "posture_score": { + "type": "long" + }, + "latest_findings_doc_count": { + "type": "long" + }, + "benchmark_id": { + "type": "keyword" + }, + "benchmark_name": { + "type": "keyword" + }, + "benchmark_version": { + "type": "keyword" + }, + "kubernetes_version": { + "type": "keyword" + }, + "passed_findings_count": { + "type": "long" + }, + "failed_findings_count": { + "type": "long" + }, + "agents_count": { + "type": "short" + }, + "nodes_count": { + "type": "short" + }, + "pods_count": { + "type": "short" + } + } + } + }, + "rules_stats": { + "type": "array", + "items": { + "properties": { + "account_id": { + "type": "keyword" + }, + "rule_id": { + "type": "keyword" + }, + "rule_name": { + "type": "keyword" + }, + "rule_section": { + "type": "keyword" + }, + "rule_version": { + "type": "keyword" + }, + "rule_number": { + "type": "keyword" + }, + "posture_type": { + "type": "keyword" + }, + "benchmark_id": { + "type": "keyword" + }, + "benchmark_name": { + "type": "keyword" + }, + "benchmark_version": { + "type": "keyword" + }, + "passed_findings_count": { + "type": "long" + }, + "failed_findings_count": { + "type": "long" + } + } + } + }, + "installation_stats": { + "type": "array", + "items": { + "properties": { + "package_policy_id": { + "type": "keyword" + }, + "feature": { + "type": "keyword" + }, + "package_version": { + "type": "keyword" + }, + "agent_policy_id": { + "type": "keyword" + }, + "deployment_mode": { + "type": "keyword" + }, + "created_at": { + "type": "date" + }, + "agent_count": { + "type": "long" + }, + "is_agentless": { + "type": "boolean" + }, + "account_type": { + "type": "keyword" + }, + "is_setup_automatic": { + "type": "boolean" + }, + "setup_access_option": { + "type": "keyword" + } + } + } + }, + "alerts_stats": { + "type": "array", + "items": { + "properties": { + "posture_type": { + "type": "keyword" + }, + "rules_count": { + "type": "long" + }, + "alerts_count": { + "type": "long" + }, + "alerts_open_count": { + "type": "long" + }, + "alerts_closed_count": { + "type": "long" + }, + "alerts_acknowledged_count": { + "type": "long" + } + } + } + }, + "cloud_account_stats": { + "type": "array", + "items": { + "properties": { + "account_id": { + "type": "keyword" + }, + "cloud_provider": { + "type": "keyword" + }, + "product": { + "type": "keyword" + }, + "package_policy_id": { + "type": "keyword" + }, + "latest_doc_count": { + "type": "long" + }, + "latest_doc_updated_timestamp": { + "type": "date" + }, + "posture_management_stats": { + "properties": { + "posture_score": { + "type": "long" + }, + "benchmark_name": { + "type": "keyword" + }, + "benchmark_version": { + "type": "keyword" + }, + "passed_findings_count": { + "type": "long" + }, + "failed_findings_count": { + "type": "long" + } + } + }, + "posture_management_stats_enabled_rules": { + "properties": { + "posture_score": { + "type": "long" + }, + "benchmark_name": { + "type": "keyword" + }, + "benchmark_version": { + "type": "keyword" + }, + "passed_findings_count": { + "type": "long" + }, + "failed_findings_count": { + "type": "long" + } + } + }, + "kspm_stats": { + "properties": { + "kubernetes_version": { + "type": "keyword" + }, + "agents_count": { + "type": "short" + }, + "nodes_count": { + "type": "short" + }, + "pods_count": { + "type": "short" + } + } + }, + "has_muted_rules": { + "type": "boolean" + } + } + } + }, + "muted_rules_stats": { + "type": "array", + "items": { + "properties": { + "id": { + "type": "keyword" + }, + "name": { + "type": "keyword" + }, + "section": { + "type": "keyword" + }, + "benchmark_id": { + "type": "keyword" + }, + "benchmark_name": { + "type": "keyword" + }, + "benchmark_version": { + "type": "keyword" + }, + "rule_number": { + "type": "keyword" + }, + "posture_type": { + "type": "keyword" + }, + "version": { + "type": "keyword" + } + } + } + } + } + }, "security_solution": { "properties": { "detectionMetrics": { diff --git a/x-pack/packages/kbn-cloud-security-posture/graph/README.md b/x-pack/solutions/security/packages/kbn-cloud-security-posture/graph/README.md similarity index 100% rename from x-pack/packages/kbn-cloud-security-posture/graph/README.md rename to x-pack/solutions/security/packages/kbn-cloud-security-posture/graph/README.md diff --git a/x-pack/packages/kbn-cloud-security-posture/graph/index.ts b/x-pack/solutions/security/packages/kbn-cloud-security-posture/graph/index.ts similarity index 100% rename from x-pack/packages/kbn-cloud-security-posture/graph/index.ts rename to x-pack/solutions/security/packages/kbn-cloud-security-posture/graph/index.ts diff --git a/x-pack/packages/kbn-cloud-security-posture/graph/jest.config.js b/x-pack/solutions/security/packages/kbn-cloud-security-posture/graph/jest.config.js similarity index 65% rename from x-pack/packages/kbn-cloud-security-posture/graph/jest.config.js rename to x-pack/solutions/security/packages/kbn-cloud-security-posture/graph/jest.config.js index 3f600bebb30f7..0448a8a11bc86 100644 --- a/x-pack/packages/kbn-cloud-security-posture/graph/jest.config.js +++ b/x-pack/solutions/security/packages/kbn-cloud-security-posture/graph/jest.config.js @@ -7,12 +7,14 @@ module.exports = { preset: '@kbn/test', - roots: ['/x-pack/packages/kbn-cloud-security-posture/graph'], - rootDir: '../../../..', + roots: ['/x-pack/solutions/security/packages/kbn-cloud-security-posture/graph'], + rootDir: '../../../../../..', transform: { '^.+\\.(js|tsx?)$': '/x-pack/packages/kbn-cloud-security-posture/storybook/config/babel_with_emotion.ts', }, setupFiles: ['jest-canvas-mock'], - setupFilesAfterEnv: ['/x-pack/packages/kbn-cloud-security-posture/graph/setup_tests.ts'], + setupFilesAfterEnv: [ + '/x-pack/solutions/security/packages/kbn-cloud-security-posture/graph/setup_tests.ts', + ], }; diff --git a/x-pack/packages/kbn-cloud-security-posture/graph/kibana.jsonc b/x-pack/solutions/security/packages/kbn-cloud-security-posture/graph/kibana.jsonc similarity index 100% rename from x-pack/packages/kbn-cloud-security-posture/graph/kibana.jsonc rename to x-pack/solutions/security/packages/kbn-cloud-security-posture/graph/kibana.jsonc diff --git a/x-pack/packages/kbn-cloud-security-posture/graph/package.json b/x-pack/solutions/security/packages/kbn-cloud-security-posture/graph/package.json similarity index 100% rename from x-pack/packages/kbn-cloud-security-posture/graph/package.json rename to x-pack/solutions/security/packages/kbn-cloud-security-posture/graph/package.json diff --git a/x-pack/packages/kbn-cloud-security-posture/graph/setup_tests.ts b/x-pack/solutions/security/packages/kbn-cloud-security-posture/graph/setup_tests.ts similarity index 100% rename from x-pack/packages/kbn-cloud-security-posture/graph/setup_tests.ts rename to x-pack/solutions/security/packages/kbn-cloud-security-posture/graph/setup_tests.ts diff --git a/x-pack/packages/kbn-cloud-security-posture/graph/src/assets/icons/aws.svg b/x-pack/solutions/security/packages/kbn-cloud-security-posture/graph/src/assets/icons/aws.svg similarity index 100% rename from x-pack/packages/kbn-cloud-security-posture/graph/src/assets/icons/aws.svg rename to x-pack/solutions/security/packages/kbn-cloud-security-posture/graph/src/assets/icons/aws.svg diff --git a/x-pack/packages/kbn-cloud-security-posture/graph/src/assets/icons/aws_ec2.svg b/x-pack/solutions/security/packages/kbn-cloud-security-posture/graph/src/assets/icons/aws_ec2.svg similarity index 100% rename from x-pack/packages/kbn-cloud-security-posture/graph/src/assets/icons/aws_ec2.svg rename to x-pack/solutions/security/packages/kbn-cloud-security-posture/graph/src/assets/icons/aws_ec2.svg diff --git a/x-pack/packages/kbn-cloud-security-posture/graph/src/assets/icons/aws_s3.svg b/x-pack/solutions/security/packages/kbn-cloud-security-posture/graph/src/assets/icons/aws_s3.svg similarity index 100% rename from x-pack/packages/kbn-cloud-security-posture/graph/src/assets/icons/aws_s3.svg rename to x-pack/solutions/security/packages/kbn-cloud-security-posture/graph/src/assets/icons/aws_s3.svg diff --git a/x-pack/packages/kbn-cloud-security-posture/graph/src/assets/icons/okta.svg b/x-pack/solutions/security/packages/kbn-cloud-security-posture/graph/src/assets/icons/okta.svg similarity index 100% rename from x-pack/packages/kbn-cloud-security-posture/graph/src/assets/icons/okta.svg rename to x-pack/solutions/security/packages/kbn-cloud-security-posture/graph/src/assets/icons/okta.svg diff --git a/x-pack/packages/kbn-cloud-security-posture/graph/src/common/constants.ts b/x-pack/solutions/security/packages/kbn-cloud-security-posture/graph/src/common/constants.ts similarity index 100% rename from x-pack/packages/kbn-cloud-security-posture/graph/src/common/constants.ts rename to x-pack/solutions/security/packages/kbn-cloud-security-posture/graph/src/common/constants.ts diff --git a/x-pack/packages/kbn-cloud-security-posture/graph/src/components/edge/deafult_edge.stories.tsx b/x-pack/solutions/security/packages/kbn-cloud-security-posture/graph/src/components/edge/deafult_edge.stories.tsx similarity index 96% rename from x-pack/packages/kbn-cloud-security-posture/graph/src/components/edge/deafult_edge.stories.tsx rename to x-pack/solutions/security/packages/kbn-cloud-security-posture/graph/src/components/edge/deafult_edge.stories.tsx index 4d6c689dd643b..dd1c956a55e55 100644 --- a/x-pack/packages/kbn-cloud-security-posture/graph/src/components/edge/deafult_edge.stories.tsx +++ b/x-pack/solutions/security/packages/kbn-cloud-security-posture/graph/src/components/edge/deafult_edge.stories.tsx @@ -88,11 +88,11 @@ const Template: Story = (args: NodeViewModel) => { const initialEdges = [ { - id: 'source-' + args.id, + id: `source-${args.id}`, source: 'source', target: args.id, data: { - id: 'source-' + args.id, + id: `source-${args.id}`, source: 'source', sourceShape: 'rectangle', target: args.id, @@ -103,11 +103,11 @@ const Template: Story = (args: NodeViewModel) => { type: 'default', }, { - id: args.id + '-target', + id: `${args.id}-target`, source: args.id, target: 'target', data: { - id: args.id + '-target', + id: `${args.id}-target`, source: args.id, sourceShape: 'label', target: 'target', diff --git a/x-pack/packages/kbn-cloud-security-posture/graph/src/components/edge/default_edge.tsx b/x-pack/solutions/security/packages/kbn-cloud-security-posture/graph/src/components/edge/default_edge.tsx similarity index 100% rename from x-pack/packages/kbn-cloud-security-posture/graph/src/components/edge/default_edge.tsx rename to x-pack/solutions/security/packages/kbn-cloud-security-posture/graph/src/components/edge/default_edge.tsx diff --git a/x-pack/packages/kbn-cloud-security-posture/graph/src/components/edge/index.ts b/x-pack/solutions/security/packages/kbn-cloud-security-posture/graph/src/components/edge/index.ts similarity index 100% rename from x-pack/packages/kbn-cloud-security-posture/graph/src/components/edge/index.ts rename to x-pack/solutions/security/packages/kbn-cloud-security-posture/graph/src/components/edge/index.ts diff --git a/x-pack/packages/kbn-cloud-security-posture/graph/src/components/edge/styles.tsx b/x-pack/solutions/security/packages/kbn-cloud-security-posture/graph/src/components/edge/styles.tsx similarity index 100% rename from x-pack/packages/kbn-cloud-security-posture/graph/src/components/edge/styles.tsx rename to x-pack/solutions/security/packages/kbn-cloud-security-posture/graph/src/components/edge/styles.tsx diff --git a/x-pack/packages/kbn-cloud-security-posture/graph/src/components/edge/utils.ts b/x-pack/solutions/security/packages/kbn-cloud-security-posture/graph/src/components/edge/utils.ts similarity index 100% rename from x-pack/packages/kbn-cloud-security-posture/graph/src/components/edge/utils.ts rename to x-pack/solutions/security/packages/kbn-cloud-security-posture/graph/src/components/edge/utils.ts diff --git a/x-pack/packages/kbn-cloud-security-posture/graph/src/components/graph/graph.test.tsx b/x-pack/solutions/security/packages/kbn-cloud-security-posture/graph/src/components/graph/graph.test.tsx similarity index 100% rename from x-pack/packages/kbn-cloud-security-posture/graph/src/components/graph/graph.test.tsx rename to x-pack/solutions/security/packages/kbn-cloud-security-posture/graph/src/components/graph/graph.test.tsx diff --git a/x-pack/packages/kbn-cloud-security-posture/graph/src/components/graph/graph.tsx b/x-pack/solutions/security/packages/kbn-cloud-security-posture/graph/src/components/graph/graph.tsx similarity index 100% rename from x-pack/packages/kbn-cloud-security-posture/graph/src/components/graph/graph.tsx rename to x-pack/solutions/security/packages/kbn-cloud-security-posture/graph/src/components/graph/graph.tsx diff --git a/x-pack/packages/kbn-cloud-security-posture/graph/src/components/graph/graph_popover.stories.tsx b/x-pack/solutions/security/packages/kbn-cloud-security-posture/graph/src/components/graph/graph_popover.stories.tsx similarity index 93% rename from x-pack/packages/kbn-cloud-security-posture/graph/src/components/graph/graph_popover.stories.tsx rename to x-pack/solutions/security/packages/kbn-cloud-security-posture/graph/src/components/graph/graph_popover.stories.tsx index 6d5b3c1b372fc..a4561f404829a 100644 --- a/x-pack/packages/kbn-cloud-security-posture/graph/src/components/graph/graph_popover.stories.tsx +++ b/x-pack/solutions/security/packages/kbn-cloud-security-posture/graph/src/components/graph/graph_popover.stories.tsx @@ -6,9 +6,8 @@ */ import React, { memo, useCallback, useEffect, useMemo, useRef, useState } from 'react'; -import { ThemeProvider } from '@emotion/react'; +import { ThemeProvider, css } from '@emotion/react'; import { Story } from '@storybook/react'; -import { css } from '@emotion/react'; import { EuiListGroup, EuiHorizontalRule } from '@elastic/eui'; import type { EntityNodeViewModel, NodeProps } from '..'; import { Graph } from '..'; @@ -77,6 +76,7 @@ const useExpandButtonPopover = () => { closePopover(); }, [closePopover]); + // eslint-disable-next-line react/display-name const PopoverComponent = memo(() => ( { const useNodePopover = () => { const { id, state, actions } = useGraphPopover('node-popover'); + // eslint-disable-next-line react/display-name const PopoverComponent = memo(() => ( { isOpen={state.isOpen} anchorElement={state.anchorElement} closePopover={actions.closePopover} + // eslint-disable-next-line react/jsx-no-literals > TODO @@ -160,17 +162,21 @@ const Template: Story = () => { const popovers = [expandNodePopover, nodePopover]; const isPopoverOpen = popovers.some((popover) => popover.state.isOpen); + // eslint-disable-next-line @typescript-eslint/no-explicit-any const popoverOpenWrapper = (cb: Function, ...args: any[]) => { [expandNodePopover.actions.closePopover, nodePopover.actions.closePopover].forEach( (closePopover) => { closePopover(); } ); + // eslint-disable-next-line prefer-spread cb.apply(null, args); }; + // eslint-disable-next-line @typescript-eslint/no-explicit-any const expandButtonClickHandler = (...args: any[]) => popoverOpenWrapper(expandNodePopover.onNodeExpandButtonClick, ...args); + // eslint-disable-next-line @typescript-eslint/no-explicit-any const nodeClickHandler = (...args: any[]) => popoverOpenWrapper(nodePopover.onNodeClick, ...args); const nodes: EntityNodeViewModel[] = useMemo( diff --git a/x-pack/packages/kbn-cloud-security-posture/graph/src/components/graph/graph_popover.tsx b/x-pack/solutions/security/packages/kbn-cloud-security-posture/graph/src/components/graph/graph_popover.tsx similarity index 100% rename from x-pack/packages/kbn-cloud-security-posture/graph/src/components/graph/graph_popover.tsx rename to x-pack/solutions/security/packages/kbn-cloud-security-posture/graph/src/components/graph/graph_popover.tsx diff --git a/x-pack/packages/kbn-cloud-security-posture/graph/src/components/graph/layout_graph.ts b/x-pack/solutions/security/packages/kbn-cloud-security-posture/graph/src/components/graph/layout_graph.ts similarity index 100% rename from x-pack/packages/kbn-cloud-security-posture/graph/src/components/graph/layout_graph.ts rename to x-pack/solutions/security/packages/kbn-cloud-security-posture/graph/src/components/graph/layout_graph.ts diff --git a/x-pack/packages/kbn-cloud-security-posture/graph/src/components/graph/use_graph_popover.tsx b/x-pack/solutions/security/packages/kbn-cloud-security-posture/graph/src/components/graph/use_graph_popover.tsx similarity index 100% rename from x-pack/packages/kbn-cloud-security-posture/graph/src/components/graph/use_graph_popover.tsx rename to x-pack/solutions/security/packages/kbn-cloud-security-posture/graph/src/components/graph/use_graph_popover.tsx diff --git a/x-pack/packages/kbn-cloud-security-posture/graph/src/components/graph/utils.ts b/x-pack/solutions/security/packages/kbn-cloud-security-posture/graph/src/components/graph/utils.ts similarity index 100% rename from x-pack/packages/kbn-cloud-security-posture/graph/src/components/graph/utils.ts rename to x-pack/solutions/security/packages/kbn-cloud-security-posture/graph/src/components/graph/utils.ts diff --git a/x-pack/packages/kbn-cloud-security-posture/graph/src/components/graph_investigation/graph_investigation.tsx b/x-pack/solutions/security/packages/kbn-cloud-security-posture/graph/src/components/graph_investigation/graph_investigation.tsx similarity index 100% rename from x-pack/packages/kbn-cloud-security-posture/graph/src/components/graph_investigation/graph_investigation.tsx rename to x-pack/solutions/security/packages/kbn-cloud-security-posture/graph/src/components/graph_investigation/graph_investigation.tsx diff --git a/x-pack/packages/kbn-cloud-security-posture/graph/src/components/graph_investigation/graph_node_expand_popover.tsx b/x-pack/solutions/security/packages/kbn-cloud-security-posture/graph/src/components/graph_investigation/graph_node_expand_popover.tsx similarity index 75% rename from x-pack/packages/kbn-cloud-security-posture/graph/src/components/graph_investigation/graph_node_expand_popover.tsx rename to x-pack/solutions/security/packages/kbn-cloud-security-posture/graph/src/components/graph_investigation/graph_node_expand_popover.tsx index c22f8dbe51ace..2fd10aa5c8c29 100644 --- a/x-pack/packages/kbn-cloud-security-posture/graph/src/components/graph_investigation/graph_node_expand_popover.tsx +++ b/x-pack/solutions/security/packages/kbn-cloud-security-posture/graph/src/components/graph_investigation/graph_node_expand_popover.tsx @@ -47,25 +47,34 @@ export const GraphNodeExpandPopover: React.FC = mem diff --git a/x-pack/packages/kbn-cloud-security-posture/graph/src/components/graph_investigation/use_graph_node_expand_popover.tsx b/x-pack/solutions/security/packages/kbn-cloud-security-posture/graph/src/components/graph_investigation/use_graph_node_expand_popover.tsx similarity index 98% rename from x-pack/packages/kbn-cloud-security-posture/graph/src/components/graph_investigation/use_graph_node_expand_popover.tsx rename to x-pack/solutions/security/packages/kbn-cloud-security-posture/graph/src/components/graph_investigation/use_graph_node_expand_popover.tsx index 90e8f66510cc0..520df39c8b47a 100644 --- a/x-pack/packages/kbn-cloud-security-posture/graph/src/components/graph_investigation/use_graph_node_expand_popover.tsx +++ b/x-pack/solutions/security/packages/kbn-cloud-security-posture/graph/src/components/graph_investigation/use_graph_node_expand_popover.tsx @@ -60,6 +60,8 @@ export const useGraphNodeExpandPopover = ({ // PopoverComponent is a memoized component that renders the GraphNodeExpandPopover // It handles the display of the popover and the actions that can be performed on the node + + // eslint-disable-next-line react/display-name const PopoverComponent = memo(() => ( { // Same label can appear more than once in the graph, so we skip them if already scanned if (labelElements.has(id!)) { + // eslint-disable-next-line no-continue continue; } labelElements.add(id!); diff --git a/x-pack/packages/kbn-cloud-security-posture/graph/src/components/graph_layout.stories.tsx b/x-pack/solutions/security/packages/kbn-cloud-security-posture/graph/src/components/graph_layout.stories.tsx similarity index 98% rename from x-pack/packages/kbn-cloud-security-posture/graph/src/components/graph_layout.stories.tsx rename to x-pack/solutions/security/packages/kbn-cloud-security-posture/graph/src/components/graph_layout.stories.tsx index e576a5abf030e..21a75d2500fec 100644 --- a/x-pack/packages/kbn-cloud-security-posture/graph/src/components/graph_layout.stories.tsx +++ b/x-pack/solutions/security/packages/kbn-cloud-security-posture/graph/src/components/graph_layout.stories.tsx @@ -6,10 +6,9 @@ */ import React from 'react'; -import { ThemeProvider } from '@emotion/react'; +import { ThemeProvider, css } from '@emotion/react'; import { Story } from '@storybook/react'; import { Writable } from '@kbn/utility-types'; -import { css } from '@emotion/react'; import type { EdgeViewModel, LabelNodeViewModel, @@ -515,7 +514,7 @@ GraphLargeStackedEdgeCases.args = { id: 'a(oktauser)-b(hackeruser)', source: 'oktauser', target: 'hackeruser', - label: 'CreateUser' + idx, + label: `CreateUser${idx}`, color: 'primary', shape: 'label', })), @@ -525,7 +524,7 @@ GraphLargeStackedEdgeCases.args = { id: 'a(siem-windows)-b(user)', source: 'siem-windows', target: 'user', - label: 'User login to OKTA' + idx, + label: `User login to OKTA${idx}`, color: 'danger', shape: 'label', })), diff --git a/x-pack/packages/kbn-cloud-security-posture/graph/src/components/index.ts b/x-pack/solutions/security/packages/kbn-cloud-security-posture/graph/src/components/index.ts similarity index 100% rename from x-pack/packages/kbn-cloud-security-posture/graph/src/components/index.ts rename to x-pack/solutions/security/packages/kbn-cloud-security-posture/graph/src/components/index.ts diff --git a/x-pack/packages/kbn-cloud-security-posture/graph/src/components/mock/react_flow.ts b/x-pack/solutions/security/packages/kbn-cloud-security-posture/graph/src/components/mock/react_flow.ts similarity index 96% rename from x-pack/packages/kbn-cloud-security-posture/graph/src/components/mock/react_flow.ts rename to x-pack/solutions/security/packages/kbn-cloud-security-posture/graph/src/components/mock/react_flow.ts index 35282dedcc6de..d28a50ba20c33 100644 --- a/x-pack/packages/kbn-cloud-security-posture/graph/src/components/mock/react_flow.ts +++ b/x-pack/solutions/security/packages/kbn-cloud-security-posture/graph/src/components/mock/react_flow.ts @@ -60,6 +60,7 @@ export const mockReactFlow = () => { }, }); + // eslint-disable-next-line @typescript-eslint/no-explicit-any (global.SVGElement as any).prototype.getBBox = () => ({ x: 0, y: 0, diff --git a/x-pack/packages/kbn-cloud-security-posture/graph/src/components/mock/test_providers.tsx b/x-pack/solutions/security/packages/kbn-cloud-security-posture/graph/src/components/mock/test_providers.tsx similarity index 100% rename from x-pack/packages/kbn-cloud-security-posture/graph/src/components/mock/test_providers.tsx rename to x-pack/solutions/security/packages/kbn-cloud-security-posture/graph/src/components/mock/test_providers.tsx diff --git a/x-pack/packages/kbn-cloud-security-posture/graph/src/components/node/button.stories.tsx b/x-pack/solutions/security/packages/kbn-cloud-security-posture/graph/src/components/node/button.stories.tsx similarity index 95% rename from x-pack/packages/kbn-cloud-security-posture/graph/src/components/node/button.stories.tsx rename to x-pack/solutions/security/packages/kbn-cloud-security-posture/graph/src/components/node/button.stories.tsx index 4a034c05ee166..7dc46ac6eb82c 100644 --- a/x-pack/packages/kbn-cloud-security-posture/graph/src/components/node/button.stories.tsx +++ b/x-pack/solutions/security/packages/kbn-cloud-security-posture/graph/src/components/node/button.stories.tsx @@ -5,6 +5,8 @@ * 2.0. */ +/* eslint-disable react/jsx-no-literals */ + import React from 'react'; import { ThemeProvider } from '@emotion/react'; import { Story } from '@storybook/react'; diff --git a/x-pack/packages/kbn-cloud-security-posture/graph/src/components/node/diamond_node.tsx b/x-pack/solutions/security/packages/kbn-cloud-security-posture/graph/src/components/node/diamond_node.tsx similarity index 96% rename from x-pack/packages/kbn-cloud-security-posture/graph/src/components/node/diamond_node.tsx rename to x-pack/solutions/security/packages/kbn-cloud-security-posture/graph/src/components/node/diamond_node.tsx index 75ad989b625e8..c974c0c9a60e6 100644 --- a/x-pack/packages/kbn-cloud-security-posture/graph/src/components/node/diamond_node.tsx +++ b/x-pack/solutions/security/packages/kbn-cloud-security-posture/graph/src/components/node/diamond_node.tsx @@ -24,6 +24,7 @@ import { NodeExpandButton } from './node_expand_button'; const NODE_WIDTH = 99; const NODE_HEIGHT = 98; +// eslint-disable-next-line react/display-name export const DiamondNode: React.FC = memo((props: NodeProps) => { const { id, color, icon, label, interactive, expandButtonClick, nodeClick } = props.data as EntityNodeViewModel; @@ -80,7 +81,7 @@ export const DiamondNode: React.FC = memo((props: NodeProps) => { style={HandleStyleOverride} /> - {Boolean(label) ? label : id} + {label ? label : id} ); }); diff --git a/x-pack/packages/kbn-cloud-security-posture/graph/src/components/node/edge_group_node.tsx b/x-pack/solutions/security/packages/kbn-cloud-security-posture/graph/src/components/node/edge_group_node.tsx similarity index 96% rename from x-pack/packages/kbn-cloud-security-posture/graph/src/components/node/edge_group_node.tsx rename to x-pack/solutions/security/packages/kbn-cloud-security-posture/graph/src/components/node/edge_group_node.tsx index a3dd064d16ab7..05a61977cdcb1 100644 --- a/x-pack/packages/kbn-cloud-security-posture/graph/src/components/node/edge_group_node.tsx +++ b/x-pack/solutions/security/packages/kbn-cloud-security-posture/graph/src/components/node/edge_group_node.tsx @@ -10,6 +10,7 @@ import { Handle, NodeResizeControl, Position } from '@xyflow/react'; import { HandleStyleOverride } from './styles'; import type { NodeProps } from '../types'; +// eslint-disable-next-line react/display-name export const EdgeGroupNode: React.FC = memo((props: NodeProps) => { // Handles order horizontally is: in > inside > out > outside return ( diff --git a/x-pack/packages/kbn-cloud-security-posture/graph/src/components/node/ellipse_node.tsx b/x-pack/solutions/security/packages/kbn-cloud-security-posture/graph/src/components/node/ellipse_node.tsx similarity index 96% rename from x-pack/packages/kbn-cloud-security-posture/graph/src/components/node/ellipse_node.tsx rename to x-pack/solutions/security/packages/kbn-cloud-security-posture/graph/src/components/node/ellipse_node.tsx index c9bd363130dca..7fccea3b6bcf6 100644 --- a/x-pack/packages/kbn-cloud-security-posture/graph/src/components/node/ellipse_node.tsx +++ b/x-pack/solutions/security/packages/kbn-cloud-security-posture/graph/src/components/node/ellipse_node.tsx @@ -24,6 +24,7 @@ import { NodeExpandButton } from './node_expand_button'; const NODE_WIDTH = 90; const NODE_HEIGHT = 90; +// eslint-disable-next-line react/display-name export const EllipseNode: React.FC = memo((props: NodeProps) => { const { id, color, icon, label, interactive, expandButtonClick, nodeClick } = props.data as EntityNodeViewModel; @@ -80,7 +81,7 @@ export const EllipseNode: React.FC = memo((props: NodeProps) => { style={HandleStyleOverride} /> - {Boolean(label) ? label : id} + {label ? label : id} ); }); diff --git a/x-pack/packages/kbn-cloud-security-posture/graph/src/components/node/get_span_icon.ts b/x-pack/solutions/security/packages/kbn-cloud-security-posture/graph/src/components/node/get_span_icon.ts similarity index 91% rename from x-pack/packages/kbn-cloud-security-posture/graph/src/components/node/get_span_icon.ts rename to x-pack/solutions/security/packages/kbn-cloud-security-posture/graph/src/components/node/get_span_icon.ts index 9aa77f03c3eb6..b5d092ddf25ef 100644 --- a/x-pack/packages/kbn-cloud-security-posture/graph/src/components/node/get_span_icon.ts +++ b/x-pack/solutions/security/packages/kbn-cloud-security-posture/graph/src/components/node/get_span_icon.ts @@ -10,6 +10,7 @@ import awsEc2Icon from '../../assets/icons/aws_ec2.svg'; import awsS3Icon from '../../assets/icons/aws_s3.svg'; import oktaIcon from '../../assets/icons/okta.svg'; +// eslint-disable-next-line @typescript-eslint/no-explicit-any const icons: Record = { aws: awsIcon, aws_ec2: awsEc2Icon, diff --git a/x-pack/packages/kbn-cloud-security-posture/graph/src/components/node/hexagon_node.tsx b/x-pack/solutions/security/packages/kbn-cloud-security-posture/graph/src/components/node/hexagon_node.tsx similarity index 96% rename from x-pack/packages/kbn-cloud-security-posture/graph/src/components/node/hexagon_node.tsx rename to x-pack/solutions/security/packages/kbn-cloud-security-posture/graph/src/components/node/hexagon_node.tsx index 9d155999e76ca..ca90094344072 100644 --- a/x-pack/packages/kbn-cloud-security-posture/graph/src/components/node/hexagon_node.tsx +++ b/x-pack/solutions/security/packages/kbn-cloud-security-posture/graph/src/components/node/hexagon_node.tsx @@ -24,6 +24,7 @@ import { NodeExpandButton } from './node_expand_button'; const NODE_WIDTH = 87; const NODE_HEIGHT = 96; +// eslint-disable-next-line react/display-name export const HexagonNode: React.FC = memo((props: NodeProps) => { const { id, color, icon, label, interactive, expandButtonClick, nodeClick } = props.data as EntityNodeViewModel; @@ -80,7 +81,7 @@ export const HexagonNode: React.FC = memo((props: NodeProps) => { style={HandleStyleOverride} /> - {Boolean(label) ? label : id} + {label ? label : id} ); }); diff --git a/x-pack/packages/kbn-cloud-security-posture/graph/src/components/node/index.ts b/x-pack/solutions/security/packages/kbn-cloud-security-posture/graph/src/components/node/index.ts similarity index 100% rename from x-pack/packages/kbn-cloud-security-posture/graph/src/components/node/index.ts rename to x-pack/solutions/security/packages/kbn-cloud-security-posture/graph/src/components/node/index.ts diff --git a/x-pack/packages/kbn-cloud-security-posture/graph/src/components/node/label_node.tsx b/x-pack/solutions/security/packages/kbn-cloud-security-posture/graph/src/components/node/label_node.tsx similarity index 93% rename from x-pack/packages/kbn-cloud-security-posture/graph/src/components/node/label_node.tsx rename to x-pack/solutions/security/packages/kbn-cloud-security-posture/graph/src/components/node/label_node.tsx index 2f23e5ab07513..62ee671659662 100644 --- a/x-pack/packages/kbn-cloud-security-posture/graph/src/components/node/label_node.tsx +++ b/x-pack/solutions/security/packages/kbn-cloud-security-posture/graph/src/components/node/label_node.tsx @@ -10,6 +10,7 @@ import { Handle, Position } from '@xyflow/react'; import { LabelNodeContainer, LabelShape, HandleStyleOverride, LabelShapeOnHover } from './styles'; import type { LabelNodeViewModel, NodeProps } from '../types'; +// eslint-disable-next-line react/display-name export const LabelNode: React.FC = memo((props: NodeProps) => { const { id, color, label, interactive } = props.data as LabelNodeViewModel; @@ -17,7 +18,7 @@ export const LabelNode: React.FC = memo((props: NodeProps) => { {interactive && } - {Boolean(label) ? label : id} + {label ? label : id} = memo((props: NodeProps) => { const { id, color, icon, label, interactive, expandButtonClick, nodeClick } = props.data as EntityNodeViewModel; @@ -85,7 +86,7 @@ export const PentagonNode: React.FC = memo((props: NodeProps) => { style={HandleStyleOverride} /> - {Boolean(label) ? label : id} + {label ? label : id} ); }); diff --git a/x-pack/packages/kbn-cloud-security-posture/graph/src/components/node/rectangle_node.tsx b/x-pack/solutions/security/packages/kbn-cloud-security-posture/graph/src/components/node/rectangle_node.tsx similarity index 96% rename from x-pack/packages/kbn-cloud-security-posture/graph/src/components/node/rectangle_node.tsx rename to x-pack/solutions/security/packages/kbn-cloud-security-posture/graph/src/components/node/rectangle_node.tsx index f85b102c7e445..6884974982838 100644 --- a/x-pack/packages/kbn-cloud-security-posture/graph/src/components/node/rectangle_node.tsx +++ b/x-pack/solutions/security/packages/kbn-cloud-security-posture/graph/src/components/node/rectangle_node.tsx @@ -24,6 +24,7 @@ import { NodeExpandButton } from './node_expand_button'; const NODE_WIDTH = 81; const NODE_HEIGHT = 80; +// eslint-disable-next-line react/display-name export const RectangleNode: React.FC = memo((props: NodeProps) => { const { id, color, icon, label, interactive, expandButtonClick, nodeClick } = props.data as EntityNodeViewModel; @@ -80,7 +81,7 @@ export const RectangleNode: React.FC = memo((props: NodeProps) => { style={HandleStyleOverride} /> - {Boolean(label) ? label : id} + {label ? label : id} ); }); diff --git a/x-pack/packages/kbn-cloud-security-posture/graph/src/components/node/shapes/diamond_shape.tsx b/x-pack/solutions/security/packages/kbn-cloud-security-posture/graph/src/components/node/shapes/diamond_shape.tsx similarity index 98% rename from x-pack/packages/kbn-cloud-security-posture/graph/src/components/node/shapes/diamond_shape.tsx rename to x-pack/solutions/security/packages/kbn-cloud-security-posture/graph/src/components/node/shapes/diamond_shape.tsx index 126a5702cf5d0..0f0cce4e744c7 100644 --- a/x-pack/packages/kbn-cloud-security-posture/graph/src/components/node/shapes/diamond_shape.tsx +++ b/x-pack/solutions/security/packages/kbn-cloud-security-posture/graph/src/components/node/shapes/diamond_shape.tsx @@ -8,6 +8,7 @@ import React, { memo } from 'react'; import type { HoverShapeProps, ShapeProps } from './types'; +// eslint-disable-next-line react/display-name export const DiamondHoverShape: React.FC = memo(({ stroke }) => ( = memo(({ stroke }) => /> )); +// eslint-disable-next-line react/display-name export const DiamondShape: React.FC = memo(({ stroke, fill }) => ( = memo(({ stroke }) => ( )); +// eslint-disable-next-line react/display-name export const EllipseShape: React.FC = memo(({ stroke, fill }) => ( )); diff --git a/x-pack/packages/kbn-cloud-security-posture/graph/src/components/node/shapes/hexagon_shape.tsx b/x-pack/solutions/security/packages/kbn-cloud-security-posture/graph/src/components/node/shapes/hexagon_shape.tsx similarity index 98% rename from x-pack/packages/kbn-cloud-security-posture/graph/src/components/node/shapes/hexagon_shape.tsx rename to x-pack/solutions/security/packages/kbn-cloud-security-posture/graph/src/components/node/shapes/hexagon_shape.tsx index 12aeebec88605..133c6e4a035c7 100644 --- a/x-pack/packages/kbn-cloud-security-posture/graph/src/components/node/shapes/hexagon_shape.tsx +++ b/x-pack/solutions/security/packages/kbn-cloud-security-posture/graph/src/components/node/shapes/hexagon_shape.tsx @@ -8,6 +8,7 @@ import React, { memo } from 'react'; import type { HoverShapeProps, ShapeProps } from './types'; +// eslint-disable-next-line react/display-name export const HexagonHoverShape: React.FC = memo(({ stroke }) => ( = memo(({ stroke }) => /> )); +// eslint-disable-next-line react/display-name export const HexagonShape: React.FC = memo(({ stroke, fill }) => ( = memo(({ stroke }) => ( = memo(({ stroke }) = /> )); +// eslint-disable-next-line react/display-name export const PentagonShape: React.FC = memo(({ stroke, fill }) => ( = memo(({ stroke }) => ( = memo(({ stroke }) /> )); +// eslint-disable-next-line react/display-name export const RectangleShape: React.FC = memo(({ stroke, fill }) => ( )); diff --git a/x-pack/packages/kbn-cloud-security-posture/graph/src/components/node/shapes/types.ts b/x-pack/solutions/security/packages/kbn-cloud-security-posture/graph/src/components/node/shapes/types.ts similarity index 100% rename from x-pack/packages/kbn-cloud-security-posture/graph/src/components/node/shapes/types.ts rename to x-pack/solutions/security/packages/kbn-cloud-security-posture/graph/src/components/node/shapes/types.ts diff --git a/x-pack/packages/kbn-cloud-security-posture/graph/src/components/node/styles.tsx b/x-pack/solutions/security/packages/kbn-cloud-security-posture/graph/src/components/node/styles.tsx similarity index 100% rename from x-pack/packages/kbn-cloud-security-posture/graph/src/components/node/styles.tsx rename to x-pack/solutions/security/packages/kbn-cloud-security-posture/graph/src/components/node/styles.tsx diff --git a/x-pack/packages/kbn-cloud-security-posture/graph/src/components/styles.tsx b/x-pack/solutions/security/packages/kbn-cloud-security-posture/graph/src/components/styles.tsx similarity index 100% rename from x-pack/packages/kbn-cloud-security-posture/graph/src/components/styles.tsx rename to x-pack/solutions/security/packages/kbn-cloud-security-posture/graph/src/components/styles.tsx diff --git a/x-pack/packages/kbn-cloud-security-posture/graph/src/components/test_ids.ts b/x-pack/solutions/security/packages/kbn-cloud-security-posture/graph/src/components/test_ids.ts similarity index 100% rename from x-pack/packages/kbn-cloud-security-posture/graph/src/components/test_ids.ts rename to x-pack/solutions/security/packages/kbn-cloud-security-posture/graph/src/components/test_ids.ts diff --git a/x-pack/packages/kbn-cloud-security-posture/graph/src/components/types.ts b/x-pack/solutions/security/packages/kbn-cloud-security-posture/graph/src/components/types.ts similarity index 92% rename from x-pack/packages/kbn-cloud-security-posture/graph/src/components/types.ts rename to x-pack/solutions/security/packages/kbn-cloud-security-posture/graph/src/components/types.ts index 328829ee3fabe..b09f6a29f6c62 100644 --- a/x-pack/packages/kbn-cloud-security-posture/graph/src/components/types.ts +++ b/x-pack/solutions/security/packages/kbn-cloud-security-posture/graph/src/components/types.ts @@ -13,8 +13,7 @@ import type { EdgeDataModel, NodeShape, } from '@kbn/cloud-security-posture-common/types/graph/latest'; -import type { Node, NodeProps as xyNodeProps } from '@xyflow/react'; -import type { Edge, EdgeProps as xyEdgeProps } from '@xyflow/react'; +import type { Node, NodeProps as xyNodeProps, Edge, EdgeProps as xyEdgeProps } from '@xyflow/react'; export interface Size { width: number; diff --git a/x-pack/packages/kbn-cloud-security-posture/graph/src/hooks/index.ts b/x-pack/solutions/security/packages/kbn-cloud-security-posture/graph/src/hooks/index.ts similarity index 100% rename from x-pack/packages/kbn-cloud-security-posture/graph/src/hooks/index.ts rename to x-pack/solutions/security/packages/kbn-cloud-security-posture/graph/src/hooks/index.ts diff --git a/x-pack/packages/kbn-cloud-security-posture/graph/src/hooks/use_fetch_graph_data.test.tsx b/x-pack/solutions/security/packages/kbn-cloud-security-posture/graph/src/hooks/use_fetch_graph_data.test.tsx similarity index 100% rename from x-pack/packages/kbn-cloud-security-posture/graph/src/hooks/use_fetch_graph_data.test.tsx rename to x-pack/solutions/security/packages/kbn-cloud-security-posture/graph/src/hooks/use_fetch_graph_data.test.tsx diff --git a/x-pack/packages/kbn-cloud-security-posture/graph/src/hooks/use_fetch_graph_data.ts b/x-pack/solutions/security/packages/kbn-cloud-security-posture/graph/src/hooks/use_fetch_graph_data.ts similarity index 100% rename from x-pack/packages/kbn-cloud-security-posture/graph/src/hooks/use_fetch_graph_data.ts rename to x-pack/solutions/security/packages/kbn-cloud-security-posture/graph/src/hooks/use_fetch_graph_data.ts diff --git a/x-pack/packages/kbn-cloud-security-posture/graph/tsconfig.json b/x-pack/solutions/security/packages/kbn-cloud-security-posture/graph/tsconfig.json similarity index 88% rename from x-pack/packages/kbn-cloud-security-posture/graph/tsconfig.json rename to x-pack/solutions/security/packages/kbn-cloud-security-posture/graph/tsconfig.json index e56b9aabf16a9..711f3cb002692 100644 --- a/x-pack/packages/kbn-cloud-security-posture/graph/tsconfig.json +++ b/x-pack/solutions/security/packages/kbn-cloud-security-posture/graph/tsconfig.json @@ -1,5 +1,5 @@ { - "extends": "../../../../tsconfig.base.json", + "extends": "../../../../../../tsconfig.base.json", "compilerOptions": { "outDir": "target/types" }, diff --git a/x-pack/packages/kbn-cloud-security-posture/public/index.ts b/x-pack/solutions/security/packages/kbn-cloud-security-posture/public/index.ts similarity index 100% rename from x-pack/packages/kbn-cloud-security-posture/public/index.ts rename to x-pack/solutions/security/packages/kbn-cloud-security-posture/public/index.ts diff --git a/x-pack/packages/kbn-cloud-security-posture/public/jest.config.js b/x-pack/solutions/security/packages/kbn-cloud-security-posture/public/jest.config.js similarity index 70% rename from x-pack/packages/kbn-cloud-security-posture/public/jest.config.js rename to x-pack/solutions/security/packages/kbn-cloud-security-posture/public/jest.config.js index 1c1a8c84561c1..c5a8f9ba2694d 100644 --- a/x-pack/packages/kbn-cloud-security-posture/public/jest.config.js +++ b/x-pack/solutions/security/packages/kbn-cloud-security-posture/public/jest.config.js @@ -7,6 +7,6 @@ module.exports = { preset: '@kbn/test', - rootDir: '../../../..', - roots: ['/x-pack/packages/kbn-cloud-security-posture/public'], + rootDir: '../../../../../..', + roots: ['/x-pack/solutions/security/packages/kbn-cloud-security-posture/public'], }; diff --git a/x-pack/packages/kbn-cloud-security-posture/public/kibana.jsonc b/x-pack/solutions/security/packages/kbn-cloud-security-posture/public/kibana.jsonc similarity index 100% rename from x-pack/packages/kbn-cloud-security-posture/public/kibana.jsonc rename to x-pack/solutions/security/packages/kbn-cloud-security-posture/public/kibana.jsonc diff --git a/x-pack/packages/kbn-cloud-security-posture/public/package.json b/x-pack/solutions/security/packages/kbn-cloud-security-posture/public/package.json similarity index 100% rename from x-pack/packages/kbn-cloud-security-posture/public/package.json rename to x-pack/solutions/security/packages/kbn-cloud-security-posture/public/package.json diff --git a/x-pack/packages/kbn-cloud-security-posture/public/src/components/csp_evaluation_badge.tsx b/x-pack/solutions/security/packages/kbn-cloud-security-posture/public/src/components/csp_evaluation_badge.tsx similarity index 75% rename from x-pack/packages/kbn-cloud-security-posture/public/src/components/csp_evaluation_badge.tsx rename to x-pack/solutions/security/packages/kbn-cloud-security-posture/public/src/components/csp_evaluation_badge.tsx index f84ac26d68767..28a5b7655723a 100644 --- a/x-pack/packages/kbn-cloud-security-posture/public/src/components/csp_evaluation_badge.tsx +++ b/x-pack/solutions/security/packages/kbn-cloud-security-posture/public/src/components/csp_evaluation_badge.tsx @@ -36,11 +36,20 @@ export const CspEvaluationBadge = ({ type }: Props) => ( data-test-subj={`${type}_finding`} > {type === 'failed' ? ( - + ) : type === 'passed' ? ( - + ) : ( - + )} ); diff --git a/x-pack/packages/kbn-cloud-security-posture/public/src/components/vulnerability_badges.tsx b/x-pack/solutions/security/packages/kbn-cloud-security-posture/public/src/components/vulnerability_badges.tsx similarity index 100% rename from x-pack/packages/kbn-cloud-security-posture/public/src/components/vulnerability_badges.tsx rename to x-pack/solutions/security/packages/kbn-cloud-security-posture/public/src/components/vulnerability_badges.tsx diff --git a/x-pack/packages/kbn-cloud-security-posture/public/src/constants/component_constants.ts b/x-pack/solutions/security/packages/kbn-cloud-security-posture/public/src/constants/component_constants.ts similarity index 100% rename from x-pack/packages/kbn-cloud-security-posture/public/src/constants/component_constants.ts rename to x-pack/solutions/security/packages/kbn-cloud-security-posture/public/src/constants/component_constants.ts diff --git a/x-pack/packages/kbn-cloud-security-posture/public/src/constants/navigation.ts b/x-pack/solutions/security/packages/kbn-cloud-security-posture/public/src/constants/navigation.ts similarity index 81% rename from x-pack/packages/kbn-cloud-security-posture/public/src/constants/navigation.ts rename to x-pack/solutions/security/packages/kbn-cloud-security-posture/public/src/constants/navigation.ts index 90c9633433cec..7175de9934a45 100644 --- a/x-pack/packages/kbn-cloud-security-posture/public/src/constants/navigation.ts +++ b/x-pack/solutions/security/packages/kbn-cloud-security-posture/public/src/constants/navigation.ts @@ -9,20 +9,20 @@ import { CLOUD_SECURITY_POSTURE_BASE_PATH } from '@kbn/cloud-security-posture-co import { i18n } from '@kbn/i18n'; export const NAV_ITEMS_NAMES = { - DASHBOARD: i18n.translate('xpack.csp.navigation.dashboardNavItemLabel', { + DASHBOARD: i18n.translate('securitySolutionPackages.csp.navigation.dashboardNavItemLabel', { defaultMessage: 'Cloud Security Posture', }), VULNERABILITY_DASHBOARD: i18n.translate( - 'xpack.csp.navigation.vulnerabilityDashboardNavItemLabel', + 'securitySolutionPackages.csp.navigation.vulnerabilityDashboardNavItemLabel', { defaultMessage: 'Cloud Native Vulnerability Management' } ), - FINDINGS: i18n.translate('xpack.csp.navigation.findingsNavItemLabel', { + FINDINGS: i18n.translate('securitySolutionPackages.csp.navigation.findingsNavItemLabel', { defaultMessage: 'Findings', }), - BENCHMARKS: i18n.translate('xpack.csp.navigation.myBenchmarksNavItemLabel', { + BENCHMARKS: i18n.translate('securitySolutionPackages.csp.navigation.findingsNavItemLabel', { defaultMessage: 'Benchmarks', }), - RULES: i18n.translate('xpack.csp.navigation.rulesNavItemLabel', { + RULES: i18n.translate('securitySolutionPackages.csp.navigation.rulesNavItemLabel', { defaultMessage: 'Rules', }), }; diff --git a/x-pack/packages/kbn-cloud-security-posture/public/src/hooks/use_csp_setup_status_api.ts b/x-pack/solutions/security/packages/kbn-cloud-security-posture/public/src/hooks/use_csp_setup_status_api.ts similarity index 100% rename from x-pack/packages/kbn-cloud-security-posture/public/src/hooks/use_csp_setup_status_api.ts rename to x-pack/solutions/security/packages/kbn-cloud-security-posture/public/src/hooks/use_csp_setup_status_api.ts diff --git a/x-pack/packages/kbn-cloud-security-posture/public/src/hooks/use_data_view.ts b/x-pack/solutions/security/packages/kbn-cloud-security-posture/public/src/hooks/use_data_view.ts similarity index 100% rename from x-pack/packages/kbn-cloud-security-posture/public/src/hooks/use_data_view.ts rename to x-pack/solutions/security/packages/kbn-cloud-security-posture/public/src/hooks/use_data_view.ts diff --git a/x-pack/packages/kbn-cloud-security-posture/public/src/hooks/use_get_benchmark_rules_state_api.ts b/x-pack/solutions/security/packages/kbn-cloud-security-posture/public/src/hooks/use_get_benchmark_rules_state_api.ts similarity index 100% rename from x-pack/packages/kbn-cloud-security-posture/public/src/hooks/use_get_benchmark_rules_state_api.ts rename to x-pack/solutions/security/packages/kbn-cloud-security-posture/public/src/hooks/use_get_benchmark_rules_state_api.ts diff --git a/x-pack/packages/kbn-cloud-security-posture/public/src/hooks/use_get_navigation_url_params.ts b/x-pack/solutions/security/packages/kbn-cloud-security-posture/public/src/hooks/use_get_navigation_url_params.ts similarity index 100% rename from x-pack/packages/kbn-cloud-security-posture/public/src/hooks/use_get_navigation_url_params.ts rename to x-pack/solutions/security/packages/kbn-cloud-security-posture/public/src/hooks/use_get_navigation_url_params.ts diff --git a/x-pack/packages/kbn-cloud-security-posture/public/src/hooks/use_has_misconfigurations.ts b/x-pack/solutions/security/packages/kbn-cloud-security-posture/public/src/hooks/use_has_misconfigurations.ts similarity index 100% rename from x-pack/packages/kbn-cloud-security-posture/public/src/hooks/use_has_misconfigurations.ts rename to x-pack/solutions/security/packages/kbn-cloud-security-posture/public/src/hooks/use_has_misconfigurations.ts diff --git a/x-pack/packages/kbn-cloud-security-posture/public/src/hooks/use_has_vulnerabilities.ts b/x-pack/solutions/security/packages/kbn-cloud-security-posture/public/src/hooks/use_has_vulnerabilities.ts similarity index 100% rename from x-pack/packages/kbn-cloud-security-posture/public/src/hooks/use_has_vulnerabilities.ts rename to x-pack/solutions/security/packages/kbn-cloud-security-posture/public/src/hooks/use_has_vulnerabilities.ts diff --git a/x-pack/packages/kbn-cloud-security-posture/public/src/hooks/use_misconfiguration_findings.ts b/x-pack/solutions/security/packages/kbn-cloud-security-posture/public/src/hooks/use_misconfiguration_findings.ts similarity index 96% rename from x-pack/packages/kbn-cloud-security-posture/public/src/hooks/use_misconfiguration_findings.ts rename to x-pack/solutions/security/packages/kbn-cloud-security-posture/public/src/hooks/use_misconfiguration_findings.ts index 9bbaedf587dde..fa060738651a1 100644 --- a/x-pack/packages/kbn-cloud-security-posture/public/src/hooks/use_misconfiguration_findings.ts +++ b/x-pack/solutions/security/packages/kbn-cloud-security-posture/public/src/hooks/use_misconfiguration_findings.ts @@ -37,6 +37,7 @@ export const useMisconfigurationFindings = (options: UseCspOptions) => { rawResponse: { hits, aggregations }, } = await lastValueFrom( data.search.search({ + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion params: buildMisconfigurationsFindingsQuery(options, rulesStates!), }) ); diff --git a/x-pack/packages/kbn-cloud-security-posture/public/src/hooks/use_misconfiguration_preview.ts b/x-pack/solutions/security/packages/kbn-cloud-security-posture/public/src/hooks/use_misconfiguration_preview.ts similarity index 95% rename from x-pack/packages/kbn-cloud-security-posture/public/src/hooks/use_misconfiguration_preview.ts rename to x-pack/solutions/security/packages/kbn-cloud-security-posture/public/src/hooks/use_misconfiguration_preview.ts index 067cd22a9e1a9..d2f4d4f522111 100644 --- a/x-pack/packages/kbn-cloud-security-posture/public/src/hooks/use_misconfiguration_preview.ts +++ b/x-pack/solutions/security/packages/kbn-cloud-security-posture/public/src/hooks/use_misconfiguration_preview.ts @@ -35,6 +35,7 @@ export const useMisconfigurationPreview = (options: UseCspOptions) => { rawResponse: { aggregations }, } = await lastValueFrom( data.search.search({ + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion params: buildMisconfigurationsFindingsQuery(options, rulesStates!), }) ); diff --git a/x-pack/packages/kbn-cloud-security-posture/public/src/hooks/use_navigate_findings.test.ts b/x-pack/solutions/security/packages/kbn-cloud-security-posture/public/src/hooks/use_navigate_findings.test.ts similarity index 100% rename from x-pack/packages/kbn-cloud-security-posture/public/src/hooks/use_navigate_findings.test.ts rename to x-pack/solutions/security/packages/kbn-cloud-security-posture/public/src/hooks/use_navigate_findings.test.ts diff --git a/x-pack/packages/kbn-cloud-security-posture/public/src/hooks/use_navigate_findings.ts b/x-pack/solutions/security/packages/kbn-cloud-security-posture/public/src/hooks/use_navigate_findings.ts similarity index 100% rename from x-pack/packages/kbn-cloud-security-posture/public/src/hooks/use_navigate_findings.ts rename to x-pack/solutions/security/packages/kbn-cloud-security-posture/public/src/hooks/use_navigate_findings.ts diff --git a/x-pack/packages/kbn-cloud-security-posture/public/src/hooks/use_vulnerabilities_findings.ts b/x-pack/solutions/security/packages/kbn-cloud-security-posture/public/src/hooks/use_vulnerabilities_findings.ts similarity index 100% rename from x-pack/packages/kbn-cloud-security-posture/public/src/hooks/use_vulnerabilities_findings.ts rename to x-pack/solutions/security/packages/kbn-cloud-security-posture/public/src/hooks/use_vulnerabilities_findings.ts diff --git a/x-pack/packages/kbn-cloud-security-posture/public/src/hooks/use_vulnerabilities_preview.ts b/x-pack/solutions/security/packages/kbn-cloud-security-posture/public/src/hooks/use_vulnerabilities_preview.ts similarity index 100% rename from x-pack/packages/kbn-cloud-security-posture/public/src/hooks/use_vulnerabilities_preview.ts rename to x-pack/solutions/security/packages/kbn-cloud-security-posture/public/src/hooks/use_vulnerabilities_preview.ts diff --git a/x-pack/packages/kbn-cloud-security-posture/public/src/types.ts b/x-pack/solutions/security/packages/kbn-cloud-security-posture/public/src/types.ts similarity index 100% rename from x-pack/packages/kbn-cloud-security-posture/public/src/types.ts rename to x-pack/solutions/security/packages/kbn-cloud-security-posture/public/src/types.ts diff --git a/x-pack/packages/kbn-cloud-security-posture/public/src/utils/get_vulnerabilitiy_colors.test.ts b/x-pack/solutions/security/packages/kbn-cloud-security-posture/public/src/utils/get_vulnerabilitiy_colors.test.ts similarity index 100% rename from x-pack/packages/kbn-cloud-security-posture/public/src/utils/get_vulnerabilitiy_colors.test.ts rename to x-pack/solutions/security/packages/kbn-cloud-security-posture/public/src/utils/get_vulnerabilitiy_colors.test.ts diff --git a/x-pack/packages/kbn-cloud-security-posture/public/src/utils/get_vulnerability_colors.ts b/x-pack/solutions/security/packages/kbn-cloud-security-posture/public/src/utils/get_vulnerability_colors.ts similarity index 100% rename from x-pack/packages/kbn-cloud-security-posture/public/src/utils/get_vulnerability_colors.ts rename to x-pack/solutions/security/packages/kbn-cloud-security-posture/public/src/utils/get_vulnerability_colors.ts diff --git a/x-pack/packages/kbn-cloud-security-posture/public/src/utils/get_vulnerability_text.test.ts b/x-pack/solutions/security/packages/kbn-cloud-security-posture/public/src/utils/get_vulnerability_text.test.ts similarity index 100% rename from x-pack/packages/kbn-cloud-security-posture/public/src/utils/get_vulnerability_text.test.ts rename to x-pack/solutions/security/packages/kbn-cloud-security-posture/public/src/utils/get_vulnerability_text.test.ts diff --git a/x-pack/packages/kbn-cloud-security-posture/public/src/utils/get_vulnerability_text.ts b/x-pack/solutions/security/packages/kbn-cloud-security-posture/public/src/utils/get_vulnerability_text.ts similarity index 100% rename from x-pack/packages/kbn-cloud-security-posture/public/src/utils/get_vulnerability_text.ts rename to x-pack/solutions/security/packages/kbn-cloud-security-posture/public/src/utils/get_vulnerability_text.ts diff --git a/x-pack/packages/kbn-cloud-security-posture/public/src/utils/hooks_utils.test.ts b/x-pack/solutions/security/packages/kbn-cloud-security-posture/public/src/utils/hooks_utils.test.ts similarity index 100% rename from x-pack/packages/kbn-cloud-security-posture/public/src/utils/hooks_utils.test.ts rename to x-pack/solutions/security/packages/kbn-cloud-security-posture/public/src/utils/hooks_utils.test.ts diff --git a/x-pack/packages/kbn-cloud-security-posture/public/src/utils/hooks_utils.ts b/x-pack/solutions/security/packages/kbn-cloud-security-posture/public/src/utils/hooks_utils.ts similarity index 98% rename from x-pack/packages/kbn-cloud-security-posture/public/src/utils/hooks_utils.ts rename to x-pack/solutions/security/packages/kbn-cloud-security-posture/public/src/utils/hooks_utils.ts index a621e1d01add8..e52b66a0db685 100644 --- a/x-pack/packages/kbn-cloud-security-posture/public/src/utils/hooks_utils.ts +++ b/x-pack/solutions/security/packages/kbn-cloud-security-posture/public/src/utils/hooks_utils.ts @@ -7,12 +7,12 @@ import type * as estypes from '@elastic/elasticsearch/lib/api/typesWithBodyKey'; import { + buildMutedRulesFilter, CDR_MISCONFIGURATIONS_INDEX_PATTERN, CDR_VULNERABILITIES_INDEX_PATTERN, CDR_3RD_PARTY_RETENTION_POLICY, } from '@kbn/cloud-security-posture-common'; import type { CspBenchmarkRulesStates } from '@kbn/cloud-security-posture-common/schema/rules/latest'; -import { buildMutedRulesFilter } from '@kbn/cloud-security-posture-common'; import type { UseCspOptions } from '../types'; const MISCONFIGURATIONS_SOURCE_FIELDS = ['result.*', 'rule.*', 'resource.*']; diff --git a/x-pack/packages/kbn-cloud-security-posture/public/src/utils/query_utils.test.ts b/x-pack/solutions/security/packages/kbn-cloud-security-posture/public/src/utils/query_utils.test.ts similarity index 100% rename from x-pack/packages/kbn-cloud-security-posture/public/src/utils/query_utils.test.ts rename to x-pack/solutions/security/packages/kbn-cloud-security-posture/public/src/utils/query_utils.test.ts diff --git a/x-pack/packages/kbn-cloud-security-posture/public/src/utils/query_utils.ts b/x-pack/solutions/security/packages/kbn-cloud-security-posture/public/src/utils/query_utils.ts similarity index 93% rename from x-pack/packages/kbn-cloud-security-posture/public/src/utils/query_utils.ts rename to x-pack/solutions/security/packages/kbn-cloud-security-posture/public/src/utils/query_utils.ts index 6cb5c1384e732..72307e4f47b28 100644 --- a/x-pack/packages/kbn-cloud-security-posture/public/src/utils/query_utils.ts +++ b/x-pack/solutions/security/packages/kbn-cloud-security-posture/public/src/utils/query_utils.ts @@ -20,6 +20,7 @@ type FilterValue = string | number | NegatedValue; export type NavFilter = Record; +// eslint-disable-next-line @typescript-eslint/no-explicit-any const encodeRison = (v: any): string | undefined => { try { return encode(v); @@ -40,6 +41,7 @@ const decodeRison = (query: string): T | undefined => { const QUERY_PARAM_KEY = 'cspq'; +// eslint-disable-next-line @typescript-eslint/no-explicit-any export const encodeQuery = (query: any): LocationDescriptorObject['search'] => { const risonQuery = encodeRison(query); if (!risonQuery) return; @@ -56,6 +58,7 @@ export const encodeQueryUrl = ( servicesStart: DataPublicPluginStart, filters: Filter[], groupBy?: string[] + // eslint-disable-next-line @typescript-eslint/no-explicit-any ): any => { return encodeQuery({ query: servicesStart.query.queryString.getDefaultQuery(), diff --git a/x-pack/packages/kbn-cloud-security-posture/public/src/utils/show_error_toast.ts b/x-pack/solutions/security/packages/kbn-cloud-security-posture/public/src/utils/show_error_toast.ts similarity index 90% rename from x-pack/packages/kbn-cloud-security-posture/public/src/utils/show_error_toast.ts rename to x-pack/solutions/security/packages/kbn-cloud-security-posture/public/src/utils/show_error_toast.ts index 060ae8c3b69ee..d8ddbcce9c985 100644 --- a/x-pack/packages/kbn-cloud-security-posture/public/src/utils/show_error_toast.ts +++ b/x-pack/solutions/security/packages/kbn-cloud-security-posture/public/src/utils/show_error_toast.ts @@ -10,7 +10,7 @@ import { i18n } from '@kbn/i18n'; import { extractErrorMessage } from '@kbn/cloud-security-posture-common'; const SEARCH_FAILED_TEXT = i18n.translate( - 'xpack.csp.findings.findingsErrorToast.searchFailedTitle', + 'securitySolutionPackages.csp.findings.findingsErrorToast.searchFailedTitle', { defaultMessage: 'Search failed' } ); diff --git a/x-pack/packages/kbn-cloud-security-posture/public/src/utils/vulnerability_helpers.test.ts b/x-pack/solutions/security/packages/kbn-cloud-security-posture/public/src/utils/vulnerability_helpers.test.ts similarity index 100% rename from x-pack/packages/kbn-cloud-security-posture/public/src/utils/vulnerability_helpers.test.ts rename to x-pack/solutions/security/packages/kbn-cloud-security-posture/public/src/utils/vulnerability_helpers.test.ts diff --git a/x-pack/packages/kbn-cloud-security-posture/public/src/utils/vulnerability_helpers.ts b/x-pack/solutions/security/packages/kbn-cloud-security-posture/public/src/utils/vulnerability_helpers.ts similarity index 98% rename from x-pack/packages/kbn-cloud-security-posture/public/src/utils/vulnerability_helpers.ts rename to x-pack/solutions/security/packages/kbn-cloud-security-posture/public/src/utils/vulnerability_helpers.ts index e1bec795ad444..321a135557e59 100644 --- a/x-pack/packages/kbn-cloud-security-posture/public/src/utils/vulnerability_helpers.ts +++ b/x-pack/solutions/security/packages/kbn-cloud-security-posture/public/src/utils/vulnerability_helpers.ts @@ -16,6 +16,7 @@ interface VulnerabilitiesDistributionBarProps { color: string; isCurrentFilter?: boolean; filter?: () => void; + // eslint-disable-next-line @typescript-eslint/no-explicit-any reset?: (event: any) => void; } diff --git a/x-pack/packages/kbn-cloud-security-posture/public/tsconfig.json b/x-pack/solutions/security/packages/kbn-cloud-security-posture/public/tsconfig.json similarity index 94% rename from x-pack/packages/kbn-cloud-security-posture/public/tsconfig.json rename to x-pack/solutions/security/packages/kbn-cloud-security-posture/public/tsconfig.json index 8c950553c7cde..80f3333bd276a 100644 --- a/x-pack/packages/kbn-cloud-security-posture/public/tsconfig.json +++ b/x-pack/solutions/security/packages/kbn-cloud-security-posture/public/tsconfig.json @@ -1,5 +1,5 @@ { - "extends": "../../../../tsconfig.base.json", + "extends": "../../../../../../tsconfig.base.json", "compilerOptions": { "outDir": "target/types", }, diff --git a/x-pack/plugins/asset_inventory/README.md b/x-pack/solutions/security/plugins/asset_inventory/README.md similarity index 100% rename from x-pack/plugins/asset_inventory/README.md rename to x-pack/solutions/security/plugins/asset_inventory/README.md diff --git a/x-pack/plugins/asset_inventory/common/index.ts b/x-pack/solutions/security/plugins/asset_inventory/common/index.ts similarity index 100% rename from x-pack/plugins/asset_inventory/common/index.ts rename to x-pack/solutions/security/plugins/asset_inventory/common/index.ts diff --git a/x-pack/plugins/asset_inventory/kibana.jsonc b/x-pack/solutions/security/plugins/asset_inventory/kibana.jsonc similarity index 100% rename from x-pack/plugins/asset_inventory/kibana.jsonc rename to x-pack/solutions/security/plugins/asset_inventory/kibana.jsonc diff --git a/x-pack/plugins/asset_inventory/package.json b/x-pack/solutions/security/plugins/asset_inventory/package.json similarity index 100% rename from x-pack/plugins/asset_inventory/package.json rename to x-pack/solutions/security/plugins/asset_inventory/package.json diff --git a/x-pack/plugins/asset_inventory/public/application.tsx b/x-pack/solutions/security/plugins/asset_inventory/public/application.tsx similarity index 100% rename from x-pack/plugins/asset_inventory/public/application.tsx rename to x-pack/solutions/security/plugins/asset_inventory/public/application.tsx diff --git a/x-pack/plugins/asset_inventory/public/components/app.tsx b/x-pack/solutions/security/plugins/asset_inventory/public/components/app.tsx similarity index 100% rename from x-pack/plugins/asset_inventory/public/components/app.tsx rename to x-pack/solutions/security/plugins/asset_inventory/public/components/app.tsx diff --git a/x-pack/plugins/asset_inventory/public/index.ts b/x-pack/solutions/security/plugins/asset_inventory/public/index.ts similarity index 100% rename from x-pack/plugins/asset_inventory/public/index.ts rename to x-pack/solutions/security/plugins/asset_inventory/public/index.ts diff --git a/x-pack/plugins/asset_inventory/public/plugin.ts b/x-pack/solutions/security/plugins/asset_inventory/public/plugin.ts similarity index 100% rename from x-pack/plugins/asset_inventory/public/plugin.ts rename to x-pack/solutions/security/plugins/asset_inventory/public/plugin.ts diff --git a/x-pack/plugins/asset_inventory/public/types.ts b/x-pack/solutions/security/plugins/asset_inventory/public/types.ts similarity index 100% rename from x-pack/plugins/asset_inventory/public/types.ts rename to x-pack/solutions/security/plugins/asset_inventory/public/types.ts diff --git a/x-pack/plugins/asset_inventory/server/create_transforms/create_transforms.ts b/x-pack/solutions/security/plugins/asset_inventory/server/create_transforms/create_transforms.ts similarity index 100% rename from x-pack/plugins/asset_inventory/server/create_transforms/create_transforms.ts rename to x-pack/solutions/security/plugins/asset_inventory/server/create_transforms/create_transforms.ts diff --git a/x-pack/plugins/asset_inventory/server/index.ts b/x-pack/solutions/security/plugins/asset_inventory/server/index.ts similarity index 100% rename from x-pack/plugins/asset_inventory/server/index.ts rename to x-pack/solutions/security/plugins/asset_inventory/server/index.ts diff --git a/x-pack/plugins/asset_inventory/server/plugin.ts b/x-pack/solutions/security/plugins/asset_inventory/server/plugin.ts similarity index 100% rename from x-pack/plugins/asset_inventory/server/plugin.ts rename to x-pack/solutions/security/plugins/asset_inventory/server/plugin.ts diff --git a/x-pack/plugins/asset_inventory/server/routes/index.ts b/x-pack/solutions/security/plugins/asset_inventory/server/routes/index.ts similarity index 100% rename from x-pack/plugins/asset_inventory/server/routes/index.ts rename to x-pack/solutions/security/plugins/asset_inventory/server/routes/index.ts diff --git a/x-pack/plugins/asset_inventory/server/types.ts b/x-pack/solutions/security/plugins/asset_inventory/server/types.ts similarity index 100% rename from x-pack/plugins/asset_inventory/server/types.ts rename to x-pack/solutions/security/plugins/asset_inventory/server/types.ts diff --git a/x-pack/plugins/asset_inventory/tsconfig.json b/x-pack/solutions/security/plugins/asset_inventory/tsconfig.json similarity index 82% rename from x-pack/plugins/asset_inventory/tsconfig.json rename to x-pack/solutions/security/plugins/asset_inventory/tsconfig.json index dc669eb3a6943..b733fc545be25 100644 --- a/x-pack/plugins/asset_inventory/tsconfig.json +++ b/x-pack/solutions/security/plugins/asset_inventory/tsconfig.json @@ -1,5 +1,5 @@ { - "extends": "../../../tsconfig.base.json", + "extends": "../../../../../tsconfig.base.json", "compilerOptions": { "outDir": "target/types" }, @@ -11,7 +11,7 @@ "public/**/*.json", "server/**/*.ts", "server/**/*.json", - "../../../typings/**/*" + "../../../../../typings/**/*" ], "exclude": ["target/**/*"], "kbn_references": [ diff --git a/x-pack/plugins/cloud_defend/.i18nrc.json b/x-pack/solutions/security/plugins/cloud_defend/.i18nrc.json similarity index 100% rename from x-pack/plugins/cloud_defend/.i18nrc.json rename to x-pack/solutions/security/plugins/cloud_defend/.i18nrc.json diff --git a/x-pack/plugins/cloud_defend/README.md b/x-pack/solutions/security/plugins/cloud_defend/README.md similarity index 85% rename from x-pack/plugins/cloud_defend/README.md rename to x-pack/solutions/security/plugins/cloud_defend/README.md index 9df1a13d328d2..8b12271d52535 100755 --- a/x-pack/plugins/cloud_defend/README.md +++ b/x-pack/solutions/security/plugins/cloud_defend/README.md @@ -41,9 +41,9 @@ responses: ## pre commit checks ``` -node scripts/type_check.js --project x-pack/plugins/cloud_defend/tsconfig.json -node scripts/eslint.js x-pack/plugins/cloud_defend -yarn test:jest x-pack/plugins/cloud_defend +node scripts/type_check.js --project x-pack/solutions/security/plugins/cloud_defend/tsconfig.json +node scripts/eslint.js x-pack/solutions/security/plugins/cloud_defend +yarn test:jest x-pack/solutions/security/plugins/cloud_defend ``` See the [kibana contributing guide](https://github.com/elastic/kibana/blob/main/CONTRIBUTING.md) for instructions setting up your development environment. diff --git a/x-pack/plugins/cloud_defend/common/constants.ts b/x-pack/solutions/security/plugins/cloud_defend/common/constants.ts similarity index 100% rename from x-pack/plugins/cloud_defend/common/constants.ts rename to x-pack/solutions/security/plugins/cloud_defend/common/constants.ts diff --git a/x-pack/plugins/cloud_defend/common/index.ts b/x-pack/solutions/security/plugins/cloud_defend/common/index.ts similarity index 100% rename from x-pack/plugins/cloud_defend/common/index.ts rename to x-pack/solutions/security/plugins/cloud_defend/common/index.ts diff --git a/x-pack/plugins/cloud_defend/common/latest.ts b/x-pack/solutions/security/plugins/cloud_defend/common/latest.ts similarity index 100% rename from x-pack/plugins/cloud_defend/common/latest.ts rename to x-pack/solutions/security/plugins/cloud_defend/common/latest.ts diff --git a/x-pack/plugins/cloud_defend/common/schemas/v1.ts b/x-pack/solutions/security/plugins/cloud_defend/common/schemas/v1.ts similarity index 100% rename from x-pack/plugins/cloud_defend/common/schemas/v1.ts rename to x-pack/solutions/security/plugins/cloud_defend/common/schemas/v1.ts diff --git a/x-pack/plugins/cloud_defend/common/utils/helpers.test.ts b/x-pack/solutions/security/plugins/cloud_defend/common/utils/helpers.test.ts similarity index 100% rename from x-pack/plugins/cloud_defend/common/utils/helpers.test.ts rename to x-pack/solutions/security/plugins/cloud_defend/common/utils/helpers.test.ts diff --git a/x-pack/plugins/cloud_defend/common/utils/helpers.ts b/x-pack/solutions/security/plugins/cloud_defend/common/utils/helpers.ts similarity index 100% rename from x-pack/plugins/cloud_defend/common/utils/helpers.ts rename to x-pack/solutions/security/plugins/cloud_defend/common/utils/helpers.ts diff --git a/x-pack/plugins/cloud_defend/common/utils/subscription.test.ts b/x-pack/solutions/security/plugins/cloud_defend/common/utils/subscription.test.ts similarity index 100% rename from x-pack/plugins/cloud_defend/common/utils/subscription.test.ts rename to x-pack/solutions/security/plugins/cloud_defend/common/utils/subscription.test.ts diff --git a/x-pack/plugins/cloud_defend/common/utils/subscription.ts b/x-pack/solutions/security/plugins/cloud_defend/common/utils/subscription.ts similarity index 100% rename from x-pack/plugins/cloud_defend/common/utils/subscription.ts rename to x-pack/solutions/security/plugins/cloud_defend/common/utils/subscription.ts diff --git a/x-pack/plugins/cloud_defend/common/v1.ts b/x-pack/solutions/security/plugins/cloud_defend/common/v1.ts similarity index 100% rename from x-pack/plugins/cloud_defend/common/v1.ts rename to x-pack/solutions/security/plugins/cloud_defend/common/v1.ts diff --git a/x-pack/plugins/cloud_defend/jest.config.js b/x-pack/solutions/security/plugins/cloud_defend/jest.config.js similarity index 57% rename from x-pack/plugins/cloud_defend/jest.config.js rename to x-pack/solutions/security/plugins/cloud_defend/jest.config.js index 144b2f1ad9e19..1a923a89d2da0 100644 --- a/x-pack/plugins/cloud_defend/jest.config.js +++ b/x-pack/solutions/security/plugins/cloud_defend/jest.config.js @@ -8,11 +8,12 @@ /** @type {import('@jest/types').Config.InitialOptions} */ module.exports = { preset: '@kbn/test', - rootDir: '../../..', - roots: ['/x-pack/plugins/cloud_defend'], - coverageDirectory: '/target/kibana-coverage/jest/x-pack/plugins/cloud_defend', + rootDir: '../../../../..', + roots: ['/x-pack/solutions/security/plugins/cloud_defend'], + coverageDirectory: + '/target/kibana-coverage/jest/x-pack/solutions/security/plugins/cloud_defend', coverageReporters: ['text', 'html'], collectCoverageFrom: [ - '/x-pack/plugins/cloud_defend/{common,public,server}/**/*.{ts,tsx}', + '/x-pack/solutions/security/plugins/cloud_defend/{common,public,server}/**/*.{ts,tsx}', ], }; diff --git a/x-pack/plugins/cloud_defend/kibana.jsonc b/x-pack/solutions/security/plugins/cloud_defend/kibana.jsonc similarity index 100% rename from x-pack/plugins/cloud_defend/kibana.jsonc rename to x-pack/solutions/security/plugins/cloud_defend/kibana.jsonc diff --git a/x-pack/plugins/cloud_defend/public/application/route.tsx b/x-pack/solutions/security/plugins/cloud_defend/public/application/route.tsx similarity index 100% rename from x-pack/plugins/cloud_defend/public/application/route.tsx rename to x-pack/solutions/security/plugins/cloud_defend/public/application/route.tsx diff --git a/x-pack/plugins/cloud_defend/public/application/router.test.tsx b/x-pack/solutions/security/plugins/cloud_defend/public/application/router.test.tsx similarity index 100% rename from x-pack/plugins/cloud_defend/public/application/router.test.tsx rename to x-pack/solutions/security/plugins/cloud_defend/public/application/router.test.tsx diff --git a/x-pack/plugins/cloud_defend/public/application/router.tsx b/x-pack/solutions/security/plugins/cloud_defend/public/application/router.tsx similarity index 100% rename from x-pack/plugins/cloud_defend/public/application/router.tsx rename to x-pack/solutions/security/plugins/cloud_defend/public/application/router.tsx diff --git a/x-pack/plugins/cloud_defend/public/application/security_solution_context.ts b/x-pack/solutions/security/plugins/cloud_defend/public/application/security_solution_context.ts similarity index 100% rename from x-pack/plugins/cloud_defend/public/application/security_solution_context.ts rename to x-pack/solutions/security/plugins/cloud_defend/public/application/security_solution_context.ts diff --git a/x-pack/plugins/cloud_defend/public/application/setup_context.ts b/x-pack/solutions/security/plugins/cloud_defend/public/application/setup_context.ts similarity index 100% rename from x-pack/plugins/cloud_defend/public/application/setup_context.ts rename to x-pack/solutions/security/plugins/cloud_defend/public/application/setup_context.ts diff --git a/x-pack/plugins/cloud_defend/public/assets/icons/logo.svg b/x-pack/solutions/security/plugins/cloud_defend/public/assets/icons/logo.svg similarity index 100% rename from x-pack/plugins/cloud_defend/public/assets/icons/logo.svg rename to x-pack/solutions/security/plugins/cloud_defend/public/assets/icons/logo.svg diff --git a/x-pack/plugins/cloud_defend/public/common/api/use_cloud_defend_integration.tsx b/x-pack/solutions/security/plugins/cloud_defend/public/common/api/use_cloud_defend_integration.tsx similarity index 100% rename from x-pack/plugins/cloud_defend/public/common/api/use_cloud_defend_integration.tsx rename to x-pack/solutions/security/plugins/cloud_defend/public/common/api/use_cloud_defend_integration.tsx diff --git a/x-pack/plugins/cloud_defend/public/common/api/use_setup_status_api.ts b/x-pack/solutions/security/plugins/cloud_defend/public/common/api/use_setup_status_api.ts similarity index 100% rename from x-pack/plugins/cloud_defend/public/common/api/use_setup_status_api.ts rename to x-pack/solutions/security/plugins/cloud_defend/public/common/api/use_setup_status_api.ts diff --git a/x-pack/plugins/cloud_defend/public/common/constants.ts b/x-pack/solutions/security/plugins/cloud_defend/public/common/constants.ts similarity index 100% rename from x-pack/plugins/cloud_defend/public/common/constants.ts rename to x-pack/solutions/security/plugins/cloud_defend/public/common/constants.ts diff --git a/x-pack/plugins/cloud_defend/public/common/hooks/use_kibana.ts b/x-pack/solutions/security/plugins/cloud_defend/public/common/hooks/use_kibana.ts similarity index 100% rename from x-pack/plugins/cloud_defend/public/common/hooks/use_kibana.ts rename to x-pack/solutions/security/plugins/cloud_defend/public/common/hooks/use_kibana.ts diff --git a/x-pack/plugins/cloud_defend/public/common/hooks/use_page_size.ts b/x-pack/solutions/security/plugins/cloud_defend/public/common/hooks/use_page_size.ts similarity index 100% rename from x-pack/plugins/cloud_defend/public/common/hooks/use_page_size.ts rename to x-pack/solutions/security/plugins/cloud_defend/public/common/hooks/use_page_size.ts diff --git a/x-pack/plugins/cloud_defend/public/common/hooks/use_subscription_status.ts b/x-pack/solutions/security/plugins/cloud_defend/public/common/hooks/use_subscription_status.ts similarity index 100% rename from x-pack/plugins/cloud_defend/public/common/hooks/use_subscription_status.ts rename to x-pack/solutions/security/plugins/cloud_defend/public/common/hooks/use_subscription_status.ts diff --git a/x-pack/plugins/cloud_defend/public/common/navigation/constants.ts b/x-pack/solutions/security/plugins/cloud_defend/public/common/navigation/constants.ts similarity index 100% rename from x-pack/plugins/cloud_defend/public/common/navigation/constants.ts rename to x-pack/solutions/security/plugins/cloud_defend/public/common/navigation/constants.ts diff --git a/x-pack/plugins/cloud_defend/public/common/navigation/security_solution_links.test.ts b/x-pack/solutions/security/plugins/cloud_defend/public/common/navigation/security_solution_links.test.ts similarity index 100% rename from x-pack/plugins/cloud_defend/public/common/navigation/security_solution_links.test.ts rename to x-pack/solutions/security/plugins/cloud_defend/public/common/navigation/security_solution_links.test.ts diff --git a/x-pack/plugins/cloud_defend/public/common/navigation/security_solution_links.ts b/x-pack/solutions/security/plugins/cloud_defend/public/common/navigation/security_solution_links.ts similarity index 100% rename from x-pack/plugins/cloud_defend/public/common/navigation/security_solution_links.ts rename to x-pack/solutions/security/plugins/cloud_defend/public/common/navigation/security_solution_links.ts diff --git a/x-pack/plugins/cloud_defend/public/common/navigation/types.ts b/x-pack/solutions/security/plugins/cloud_defend/public/common/navigation/types.ts similarity index 100% rename from x-pack/plugins/cloud_defend/public/common/navigation/types.ts rename to x-pack/solutions/security/plugins/cloud_defend/public/common/navigation/types.ts diff --git a/x-pack/plugins/cloud_defend/public/common/navigation/use_cloud_defend_integration_links.ts b/x-pack/solutions/security/plugins/cloud_defend/public/common/navigation/use_cloud_defend_integration_links.ts similarity index 100% rename from x-pack/plugins/cloud_defend/public/common/navigation/use_cloud_defend_integration_links.ts rename to x-pack/solutions/security/plugins/cloud_defend/public/common/navigation/use_cloud_defend_integration_links.ts diff --git a/x-pack/plugins/cloud_defend/public/common/utils.test.ts b/x-pack/solutions/security/plugins/cloud_defend/public/common/utils.test.ts similarity index 100% rename from x-pack/plugins/cloud_defend/public/common/utils.test.ts rename to x-pack/solutions/security/plugins/cloud_defend/public/common/utils.test.ts diff --git a/x-pack/plugins/cloud_defend/public/common/utils.ts b/x-pack/solutions/security/plugins/cloud_defend/public/common/utils.ts similarity index 100% rename from x-pack/plugins/cloud_defend/public/common/utils.ts rename to x-pack/solutions/security/plugins/cloud_defend/public/common/utils.ts diff --git a/x-pack/plugins/cloud_defend/public/components/cloud_defend_page/index.test.tsx b/x-pack/solutions/security/plugins/cloud_defend/public/components/cloud_defend_page/index.test.tsx similarity index 100% rename from x-pack/plugins/cloud_defend/public/components/cloud_defend_page/index.test.tsx rename to x-pack/solutions/security/plugins/cloud_defend/public/components/cloud_defend_page/index.test.tsx diff --git a/x-pack/plugins/cloud_defend/public/components/cloud_defend_page/index.tsx b/x-pack/solutions/security/plugins/cloud_defend/public/components/cloud_defend_page/index.tsx similarity index 100% rename from x-pack/plugins/cloud_defend/public/components/cloud_defend_page/index.tsx rename to x-pack/solutions/security/plugins/cloud_defend/public/components/cloud_defend_page/index.tsx diff --git a/x-pack/plugins/cloud_defend/public/components/cloud_defend_page_title/index.tsx b/x-pack/solutions/security/plugins/cloud_defend/public/components/cloud_defend_page_title/index.tsx similarity index 100% rename from x-pack/plugins/cloud_defend/public/components/cloud_defend_page_title/index.tsx rename to x-pack/solutions/security/plugins/cloud_defend/public/components/cloud_defend_page_title/index.tsx diff --git a/x-pack/plugins/cloud_defend/public/components/control_general_view/index.test.tsx b/x-pack/solutions/security/plugins/cloud_defend/public/components/control_general_view/index.test.tsx similarity index 100% rename from x-pack/plugins/cloud_defend/public/components/control_general_view/index.test.tsx rename to x-pack/solutions/security/plugins/cloud_defend/public/components/control_general_view/index.test.tsx diff --git a/x-pack/plugins/cloud_defend/public/components/control_general_view/index.tsx b/x-pack/solutions/security/plugins/cloud_defend/public/components/control_general_view/index.tsx similarity index 100% rename from x-pack/plugins/cloud_defend/public/components/control_general_view/index.tsx rename to x-pack/solutions/security/plugins/cloud_defend/public/components/control_general_view/index.tsx diff --git a/x-pack/plugins/cloud_defend/public/components/control_general_view/styles.ts b/x-pack/solutions/security/plugins/cloud_defend/public/components/control_general_view/styles.ts similarity index 100% rename from x-pack/plugins/cloud_defend/public/components/control_general_view/styles.ts rename to x-pack/solutions/security/plugins/cloud_defend/public/components/control_general_view/styles.ts diff --git a/x-pack/plugins/cloud_defend/public/components/control_general_view/translations.ts b/x-pack/solutions/security/plugins/cloud_defend/public/components/control_general_view/translations.ts similarity index 100% rename from x-pack/plugins/cloud_defend/public/components/control_general_view/translations.ts rename to x-pack/solutions/security/plugins/cloud_defend/public/components/control_general_view/translations.ts diff --git a/x-pack/plugins/cloud_defend/public/components/control_general_view_response/index.test.tsx b/x-pack/solutions/security/plugins/cloud_defend/public/components/control_general_view_response/index.test.tsx similarity index 100% rename from x-pack/plugins/cloud_defend/public/components/control_general_view_response/index.test.tsx rename to x-pack/solutions/security/plugins/cloud_defend/public/components/control_general_view_response/index.test.tsx diff --git a/x-pack/plugins/cloud_defend/public/components/control_general_view_response/index.tsx b/x-pack/solutions/security/plugins/cloud_defend/public/components/control_general_view_response/index.tsx similarity index 100% rename from x-pack/plugins/cloud_defend/public/components/control_general_view_response/index.tsx rename to x-pack/solutions/security/plugins/cloud_defend/public/components/control_general_view_response/index.tsx diff --git a/x-pack/plugins/cloud_defend/public/components/control_general_view_response/styles.ts b/x-pack/solutions/security/plugins/cloud_defend/public/components/control_general_view_response/styles.ts similarity index 100% rename from x-pack/plugins/cloud_defend/public/components/control_general_view_response/styles.ts rename to x-pack/solutions/security/plugins/cloud_defend/public/components/control_general_view_response/styles.ts diff --git a/x-pack/plugins/cloud_defend/public/components/control_general_view_selector/index.test.tsx b/x-pack/solutions/security/plugins/cloud_defend/public/components/control_general_view_selector/index.test.tsx similarity index 100% rename from x-pack/plugins/cloud_defend/public/components/control_general_view_selector/index.test.tsx rename to x-pack/solutions/security/plugins/cloud_defend/public/components/control_general_view_selector/index.test.tsx diff --git a/x-pack/plugins/cloud_defend/public/components/control_general_view_selector/index.tsx b/x-pack/solutions/security/plugins/cloud_defend/public/components/control_general_view_selector/index.tsx similarity index 100% rename from x-pack/plugins/cloud_defend/public/components/control_general_view_selector/index.tsx rename to x-pack/solutions/security/plugins/cloud_defend/public/components/control_general_view_selector/index.tsx diff --git a/x-pack/plugins/cloud_defend/public/components/control_general_view_selector/styles.ts b/x-pack/solutions/security/plugins/cloud_defend/public/components/control_general_view_selector/styles.ts similarity index 100% rename from x-pack/plugins/cloud_defend/public/components/control_general_view_selector/styles.ts rename to x-pack/solutions/security/plugins/cloud_defend/public/components/control_general_view_selector/styles.ts diff --git a/x-pack/plugins/cloud_defend/public/components/control_settings/index.test.tsx b/x-pack/solutions/security/plugins/cloud_defend/public/components/control_settings/index.test.tsx similarity index 100% rename from x-pack/plugins/cloud_defend/public/components/control_settings/index.test.tsx rename to x-pack/solutions/security/plugins/cloud_defend/public/components/control_settings/index.test.tsx diff --git a/x-pack/plugins/cloud_defend/public/components/control_settings/index.tsx b/x-pack/solutions/security/plugins/cloud_defend/public/components/control_settings/index.tsx similarity index 100% rename from x-pack/plugins/cloud_defend/public/components/control_settings/index.tsx rename to x-pack/solutions/security/plugins/cloud_defend/public/components/control_settings/index.tsx diff --git a/x-pack/plugins/cloud_defend/public/components/control_settings/translations.ts b/x-pack/solutions/security/plugins/cloud_defend/public/components/control_settings/translations.ts similarity index 100% rename from x-pack/plugins/cloud_defend/public/components/control_settings/translations.ts rename to x-pack/solutions/security/plugins/cloud_defend/public/components/control_settings/translations.ts diff --git a/x-pack/plugins/cloud_defend/public/components/control_yaml_view/hooks/policy_schema.json b/x-pack/solutions/security/plugins/cloud_defend/public/components/control_yaml_view/hooks/policy_schema.json similarity index 100% rename from x-pack/plugins/cloud_defend/public/components/control_yaml_view/hooks/policy_schema.json rename to x-pack/solutions/security/plugins/cloud_defend/public/components/control_yaml_view/hooks/policy_schema.json diff --git a/x-pack/plugins/cloud_defend/public/components/control_yaml_view/hooks/use_config_model.ts b/x-pack/solutions/security/plugins/cloud_defend/public/components/control_yaml_view/hooks/use_config_model.ts similarity index 100% rename from x-pack/plugins/cloud_defend/public/components/control_yaml_view/hooks/use_config_model.ts rename to x-pack/solutions/security/plugins/cloud_defend/public/components/control_yaml_view/hooks/use_config_model.ts diff --git a/x-pack/plugins/cloud_defend/public/components/control_yaml_view/index.test.tsx b/x-pack/solutions/security/plugins/cloud_defend/public/components/control_yaml_view/index.test.tsx similarity index 100% rename from x-pack/plugins/cloud_defend/public/components/control_yaml_view/index.test.tsx rename to x-pack/solutions/security/plugins/cloud_defend/public/components/control_yaml_view/index.test.tsx diff --git a/x-pack/plugins/cloud_defend/public/components/control_yaml_view/index.tsx b/x-pack/solutions/security/plugins/cloud_defend/public/components/control_yaml_view/index.tsx similarity index 100% rename from x-pack/plugins/cloud_defend/public/components/control_yaml_view/index.tsx rename to x-pack/solutions/security/plugins/cloud_defend/public/components/control_yaml_view/index.tsx diff --git a/x-pack/plugins/cloud_defend/public/components/control_yaml_view/styles.ts b/x-pack/solutions/security/plugins/cloud_defend/public/components/control_yaml_view/styles.ts similarity index 100% rename from x-pack/plugins/cloud_defend/public/components/control_yaml_view/styles.ts rename to x-pack/solutions/security/plugins/cloud_defend/public/components/control_yaml_view/styles.ts diff --git a/x-pack/plugins/cloud_defend/public/components/control_yaml_view/translations.ts b/x-pack/solutions/security/plugins/cloud_defend/public/components/control_yaml_view/translations.ts similarity index 100% rename from x-pack/plugins/cloud_defend/public/components/control_yaml_view/translations.ts rename to x-pack/solutions/security/plugins/cloud_defend/public/components/control_yaml_view/translations.ts diff --git a/x-pack/plugins/cloud_defend/public/components/fleet_extensions/custom_assets_extension.tsx b/x-pack/solutions/security/plugins/cloud_defend/public/components/fleet_extensions/custom_assets_extension.tsx similarity index 100% rename from x-pack/plugins/cloud_defend/public/components/fleet_extensions/custom_assets_extension.tsx rename to x-pack/solutions/security/plugins/cloud_defend/public/components/fleet_extensions/custom_assets_extension.tsx diff --git a/x-pack/plugins/cloud_defend/public/components/fleet_extensions/package_policy_replace_define_step_extension.tsx b/x-pack/solutions/security/plugins/cloud_defend/public/components/fleet_extensions/package_policy_replace_define_step_extension.tsx similarity index 100% rename from x-pack/plugins/cloud_defend/public/components/fleet_extensions/package_policy_replace_define_step_extension.tsx rename to x-pack/solutions/security/plugins/cloud_defend/public/components/fleet_extensions/package_policy_replace_define_step_extension.tsx diff --git a/x-pack/plugins/cloud_defend/public/components/full_size_page/index.tsx b/x-pack/solutions/security/plugins/cloud_defend/public/components/full_size_page/index.tsx similarity index 100% rename from x-pack/plugins/cloud_defend/public/components/full_size_page/index.tsx rename to x-pack/solutions/security/plugins/cloud_defend/public/components/full_size_page/index.tsx diff --git a/x-pack/plugins/cloud_defend/public/components/loading_state/index.tsx b/x-pack/solutions/security/plugins/cloud_defend/public/components/loading_state/index.tsx similarity index 100% rename from x-pack/plugins/cloud_defend/public/components/loading_state/index.tsx rename to x-pack/solutions/security/plugins/cloud_defend/public/components/loading_state/index.tsx diff --git a/x-pack/plugins/cloud_defend/public/components/policies_table/index.test.tsx b/x-pack/solutions/security/plugins/cloud_defend/public/components/policies_table/index.test.tsx similarity index 100% rename from x-pack/plugins/cloud_defend/public/components/policies_table/index.test.tsx rename to x-pack/solutions/security/plugins/cloud_defend/public/components/policies_table/index.test.tsx diff --git a/x-pack/plugins/cloud_defend/public/components/policies_table/index.tsx b/x-pack/solutions/security/plugins/cloud_defend/public/components/policies_table/index.tsx similarity index 100% rename from x-pack/plugins/cloud_defend/public/components/policies_table/index.tsx rename to x-pack/solutions/security/plugins/cloud_defend/public/components/policies_table/index.tsx diff --git a/x-pack/plugins/cloud_defend/public/components/policy_settings/index.test.tsx b/x-pack/solutions/security/plugins/cloud_defend/public/components/policy_settings/index.test.tsx similarity index 100% rename from x-pack/plugins/cloud_defend/public/components/policy_settings/index.test.tsx rename to x-pack/solutions/security/plugins/cloud_defend/public/components/policy_settings/index.test.tsx diff --git a/x-pack/plugins/cloud_defend/public/components/policy_settings/index.tsx b/x-pack/solutions/security/plugins/cloud_defend/public/components/policy_settings/index.tsx similarity index 100% rename from x-pack/plugins/cloud_defend/public/components/policy_settings/index.tsx rename to x-pack/solutions/security/plugins/cloud_defend/public/components/policy_settings/index.tsx diff --git a/x-pack/plugins/cloud_defend/public/components/policy_settings/translations.ts b/x-pack/solutions/security/plugins/cloud_defend/public/components/policy_settings/translations.ts similarity index 100% rename from x-pack/plugins/cloud_defend/public/components/policy_settings/translations.ts rename to x-pack/solutions/security/plugins/cloud_defend/public/components/policy_settings/translations.ts diff --git a/x-pack/plugins/cloud_defend/public/components/subscription_not_allowed/index.tsx b/x-pack/solutions/security/plugins/cloud_defend/public/components/subscription_not_allowed/index.tsx similarity index 100% rename from x-pack/plugins/cloud_defend/public/components/subscription_not_allowed/index.tsx rename to x-pack/solutions/security/plugins/cloud_defend/public/components/subscription_not_allowed/index.tsx diff --git a/x-pack/plugins/cloud_defend/public/components/timestamp_table_cell/index.tsx b/x-pack/solutions/security/plugins/cloud_defend/public/components/timestamp_table_cell/index.tsx similarity index 100% rename from x-pack/plugins/cloud_defend/public/components/timestamp_table_cell/index.tsx rename to x-pack/solutions/security/plugins/cloud_defend/public/components/timestamp_table_cell/index.tsx diff --git a/x-pack/plugins/cloud_defend/public/index.ts b/x-pack/solutions/security/plugins/cloud_defend/public/index.ts similarity index 100% rename from x-pack/plugins/cloud_defend/public/index.ts rename to x-pack/solutions/security/plugins/cloud_defend/public/index.ts diff --git a/x-pack/plugins/cloud_defend/public/pages/index.ts b/x-pack/solutions/security/plugins/cloud_defend/public/pages/index.ts similarity index 100% rename from x-pack/plugins/cloud_defend/public/pages/index.ts rename to x-pack/solutions/security/plugins/cloud_defend/public/pages/index.ts diff --git a/x-pack/plugins/cloud_defend/public/pages/policies/index.test.tsx b/x-pack/solutions/security/plugins/cloud_defend/public/pages/policies/index.test.tsx similarity index 100% rename from x-pack/plugins/cloud_defend/public/pages/policies/index.test.tsx rename to x-pack/solutions/security/plugins/cloud_defend/public/pages/policies/index.test.tsx diff --git a/x-pack/plugins/cloud_defend/public/pages/policies/index.tsx b/x-pack/solutions/security/plugins/cloud_defend/public/pages/policies/index.tsx similarity index 100% rename from x-pack/plugins/cloud_defend/public/pages/policies/index.tsx rename to x-pack/solutions/security/plugins/cloud_defend/public/pages/policies/index.tsx diff --git a/x-pack/plugins/cloud_defend/public/pages/policies/test_subjects.ts b/x-pack/solutions/security/plugins/cloud_defend/public/pages/policies/test_subjects.ts similarity index 100% rename from x-pack/plugins/cloud_defend/public/pages/policies/test_subjects.ts rename to x-pack/solutions/security/plugins/cloud_defend/public/pages/policies/test_subjects.ts diff --git a/x-pack/plugins/cloud_defend/public/pages/policies/use_cloud_defend_policies.ts b/x-pack/solutions/security/plugins/cloud_defend/public/pages/policies/use_cloud_defend_policies.ts similarity index 100% rename from x-pack/plugins/cloud_defend/public/pages/policies/use_cloud_defend_policies.ts rename to x-pack/solutions/security/plugins/cloud_defend/public/pages/policies/use_cloud_defend_policies.ts diff --git a/x-pack/plugins/cloud_defend/public/plugin.tsx b/x-pack/solutions/security/plugins/cloud_defend/public/plugin.tsx similarity index 100% rename from x-pack/plugins/cloud_defend/public/plugin.tsx rename to x-pack/solutions/security/plugins/cloud_defend/public/plugin.tsx diff --git a/x-pack/plugins/cloud_defend/public/test/__mocks__/worker.js b/x-pack/solutions/security/plugins/cloud_defend/public/test/__mocks__/worker.js similarity index 100% rename from x-pack/plugins/cloud_defend/public/test/__mocks__/worker.js rename to x-pack/solutions/security/plugins/cloud_defend/public/test/__mocks__/worker.js diff --git a/x-pack/plugins/cloud_defend/public/test/fixtures/cloud_defend_integration.ts b/x-pack/solutions/security/plugins/cloud_defend/public/test/fixtures/cloud_defend_integration.ts similarity index 100% rename from x-pack/plugins/cloud_defend/public/test/fixtures/cloud_defend_integration.ts rename to x-pack/solutions/security/plugins/cloud_defend/public/test/fixtures/cloud_defend_integration.ts diff --git a/x-pack/plugins/cloud_defend/public/test/fixtures/navigation_item.ts b/x-pack/solutions/security/plugins/cloud_defend/public/test/fixtures/navigation_item.ts similarity index 100% rename from x-pack/plugins/cloud_defend/public/test/fixtures/navigation_item.ts rename to x-pack/solutions/security/plugins/cloud_defend/public/test/fixtures/navigation_item.ts diff --git a/x-pack/plugins/cloud_defend/public/test/fixtures/react_query.ts b/x-pack/solutions/security/plugins/cloud_defend/public/test/fixtures/react_query.ts similarity index 100% rename from x-pack/plugins/cloud_defend/public/test/fixtures/react_query.ts rename to x-pack/solutions/security/plugins/cloud_defend/public/test/fixtures/react_query.ts diff --git a/x-pack/plugins/cloud_defend/public/test/mocks.ts b/x-pack/solutions/security/plugins/cloud_defend/public/test/mocks.ts similarity index 100% rename from x-pack/plugins/cloud_defend/public/test/mocks.ts rename to x-pack/solutions/security/plugins/cloud_defend/public/test/mocks.ts diff --git a/x-pack/plugins/cloud_defend/public/test/test_provider.tsx b/x-pack/solutions/security/plugins/cloud_defend/public/test/test_provider.tsx similarity index 100% rename from x-pack/plugins/cloud_defend/public/test/test_provider.tsx rename to x-pack/solutions/security/plugins/cloud_defend/public/test/test_provider.tsx diff --git a/x-pack/plugins/cloud_defend/public/test/utils.ts b/x-pack/solutions/security/plugins/cloud_defend/public/test/utils.ts similarity index 100% rename from x-pack/plugins/cloud_defend/public/test/utils.ts rename to x-pack/solutions/security/plugins/cloud_defend/public/test/utils.ts diff --git a/x-pack/plugins/cloud_defend/public/types.ts b/x-pack/solutions/security/plugins/cloud_defend/public/types.ts similarity index 100% rename from x-pack/plugins/cloud_defend/public/types.ts rename to x-pack/solutions/security/plugins/cloud_defend/public/types.ts diff --git a/x-pack/plugins/cloud_defend/server/index.ts b/x-pack/solutions/security/plugins/cloud_defend/server/index.ts similarity index 100% rename from x-pack/plugins/cloud_defend/server/index.ts rename to x-pack/solutions/security/plugins/cloud_defend/server/index.ts diff --git a/x-pack/plugins/cloud_defend/server/lib/check_index_status.ts b/x-pack/solutions/security/plugins/cloud_defend/server/lib/check_index_status.ts similarity index 100% rename from x-pack/plugins/cloud_defend/server/lib/check_index_status.ts rename to x-pack/solutions/security/plugins/cloud_defend/server/lib/check_index_status.ts diff --git a/x-pack/plugins/cloud_defend/server/lib/fleet_util.ts b/x-pack/solutions/security/plugins/cloud_defend/server/lib/fleet_util.ts similarity index 100% rename from x-pack/plugins/cloud_defend/server/lib/fleet_util.ts rename to x-pack/solutions/security/plugins/cloud_defend/server/lib/fleet_util.ts diff --git a/x-pack/plugins/cloud_defend/server/lib/telemetry/collectors/accounts_stats_collector.ts b/x-pack/solutions/security/plugins/cloud_defend/server/lib/telemetry/collectors/accounts_stats_collector.ts similarity index 100% rename from x-pack/plugins/cloud_defend/server/lib/telemetry/collectors/accounts_stats_collector.ts rename to x-pack/solutions/security/plugins/cloud_defend/server/lib/telemetry/collectors/accounts_stats_collector.ts diff --git a/x-pack/plugins/cloud_defend/server/lib/telemetry/collectors/indices_stats_collector.ts b/x-pack/solutions/security/plugins/cloud_defend/server/lib/telemetry/collectors/indices_stats_collector.ts similarity index 100% rename from x-pack/plugins/cloud_defend/server/lib/telemetry/collectors/indices_stats_collector.ts rename to x-pack/solutions/security/plugins/cloud_defend/server/lib/telemetry/collectors/indices_stats_collector.ts diff --git a/x-pack/plugins/cloud_defend/server/lib/telemetry/collectors/installation_stats_collector.ts b/x-pack/solutions/security/plugins/cloud_defend/server/lib/telemetry/collectors/installation_stats_collector.ts similarity index 100% rename from x-pack/plugins/cloud_defend/server/lib/telemetry/collectors/installation_stats_collector.ts rename to x-pack/solutions/security/plugins/cloud_defend/server/lib/telemetry/collectors/installation_stats_collector.ts diff --git a/x-pack/plugins/cloud_defend/server/lib/telemetry/collectors/pods_stats_collector.ts b/x-pack/solutions/security/plugins/cloud_defend/server/lib/telemetry/collectors/pods_stats_collector.ts similarity index 100% rename from x-pack/plugins/cloud_defend/server/lib/telemetry/collectors/pods_stats_collector.ts rename to x-pack/solutions/security/plugins/cloud_defend/server/lib/telemetry/collectors/pods_stats_collector.ts diff --git a/x-pack/plugins/cloud_defend/server/lib/telemetry/collectors/register.ts b/x-pack/solutions/security/plugins/cloud_defend/server/lib/telemetry/collectors/register.ts similarity index 100% rename from x-pack/plugins/cloud_defend/server/lib/telemetry/collectors/register.ts rename to x-pack/solutions/security/plugins/cloud_defend/server/lib/telemetry/collectors/register.ts diff --git a/x-pack/plugins/cloud_defend/server/lib/telemetry/collectors/schema.ts b/x-pack/solutions/security/plugins/cloud_defend/server/lib/telemetry/collectors/schema.ts similarity index 100% rename from x-pack/plugins/cloud_defend/server/lib/telemetry/collectors/schema.ts rename to x-pack/solutions/security/plugins/cloud_defend/server/lib/telemetry/collectors/schema.ts diff --git a/x-pack/plugins/cloud_defend/server/lib/telemetry/collectors/types.ts b/x-pack/solutions/security/plugins/cloud_defend/server/lib/telemetry/collectors/types.ts similarity index 96% rename from x-pack/plugins/cloud_defend/server/lib/telemetry/collectors/types.ts rename to x-pack/solutions/security/plugins/cloud_defend/server/lib/telemetry/collectors/types.ts index 32de2548cf7c2..6aca6936af649 100644 --- a/x-pack/plugins/cloud_defend/server/lib/telemetry/collectors/types.ts +++ b/x-pack/solutions/security/plugins/cloud_defend/server/lib/telemetry/collectors/types.ts @@ -6,7 +6,7 @@ */ // for some reason we can't reference common/index.ts because // the `node scripts/check_telemetry.js --fix` command fails with the error -// ERROR Error: Error extracting collector in x-pack/plugins/cloud_defend/server/lib/telemetry/collectors/register.ts +// ERROR Error: Error extracting collector in x-pack/solutions/security/plugins/cloud_defend/server/lib/telemetry/collectors/register.ts // Error: Unable to find identifier in source Selector // at createFailError (dev_cli_errors.ts:27:24) // at parseUsageCollection (ts_parser.ts:226:32) diff --git a/x-pack/plugins/cloud_defend/server/mocks.ts b/x-pack/solutions/security/plugins/cloud_defend/server/mocks.ts similarity index 100% rename from x-pack/plugins/cloud_defend/server/mocks.ts rename to x-pack/solutions/security/plugins/cloud_defend/server/mocks.ts diff --git a/x-pack/plugins/cloud_defend/server/plugin.test.ts b/x-pack/solutions/security/plugins/cloud_defend/server/plugin.test.ts similarity index 100% rename from x-pack/plugins/cloud_defend/server/plugin.test.ts rename to x-pack/solutions/security/plugins/cloud_defend/server/plugin.test.ts diff --git a/x-pack/plugins/cloud_defend/server/plugin.ts b/x-pack/solutions/security/plugins/cloud_defend/server/plugin.ts similarity index 100% rename from x-pack/plugins/cloud_defend/server/plugin.ts rename to x-pack/solutions/security/plugins/cloud_defend/server/plugin.ts diff --git a/x-pack/plugins/cloud_defend/server/routes/policies/policies.test.ts b/x-pack/solutions/security/plugins/cloud_defend/server/routes/policies/policies.test.ts similarity index 100% rename from x-pack/plugins/cloud_defend/server/routes/policies/policies.test.ts rename to x-pack/solutions/security/plugins/cloud_defend/server/routes/policies/policies.test.ts diff --git a/x-pack/plugins/cloud_defend/server/routes/policies/policies.ts b/x-pack/solutions/security/plugins/cloud_defend/server/routes/policies/policies.ts similarity index 100% rename from x-pack/plugins/cloud_defend/server/routes/policies/policies.ts rename to x-pack/solutions/security/plugins/cloud_defend/server/routes/policies/policies.ts diff --git a/x-pack/plugins/cloud_defend/server/routes/setup_routes.ts b/x-pack/solutions/security/plugins/cloud_defend/server/routes/setup_routes.ts similarity index 100% rename from x-pack/plugins/cloud_defend/server/routes/setup_routes.ts rename to x-pack/solutions/security/plugins/cloud_defend/server/routes/setup_routes.ts diff --git a/x-pack/plugins/cloud_defend/server/routes/status/status.test.ts b/x-pack/solutions/security/plugins/cloud_defend/server/routes/status/status.test.ts similarity index 100% rename from x-pack/plugins/cloud_defend/server/routes/status/status.test.ts rename to x-pack/solutions/security/plugins/cloud_defend/server/routes/status/status.test.ts diff --git a/x-pack/plugins/cloud_defend/server/routes/status/status.ts b/x-pack/solutions/security/plugins/cloud_defend/server/routes/status/status.ts similarity index 100% rename from x-pack/plugins/cloud_defend/server/routes/status/status.ts rename to x-pack/solutions/security/plugins/cloud_defend/server/routes/status/status.ts diff --git a/x-pack/plugins/cloud_defend/server/types.ts b/x-pack/solutions/security/plugins/cloud_defend/server/types.ts similarity index 100% rename from x-pack/plugins/cloud_defend/server/types.ts rename to x-pack/solutions/security/plugins/cloud_defend/server/types.ts diff --git a/x-pack/plugins/cloud_defend/tsconfig.json b/x-pack/solutions/security/plugins/cloud_defend/tsconfig.json similarity index 92% rename from x-pack/plugins/cloud_defend/tsconfig.json rename to x-pack/solutions/security/plugins/cloud_defend/tsconfig.json index 9b87f53f7c7b6..cce09d24d8d58 100755 --- a/x-pack/plugins/cloud_defend/tsconfig.json +++ b/x-pack/solutions/security/plugins/cloud_defend/tsconfig.json @@ -1,5 +1,5 @@ { - "extends": "../../../tsconfig.base.json", + "extends": "../../../../../tsconfig.base.json", "compilerOptions": { "outDir": "target/types" }, @@ -7,7 +7,7 @@ "common/**/*", "public/**/*", "server/**/*", - "../../../typings/**/*", + "../../../../../typings/**/*", "public/**/*.json", "server/**/*.json" ], diff --git a/x-pack/plugins/cloud_security_posture/README.md b/x-pack/solutions/security/plugins/cloud_security_posture/README.md similarity index 81% rename from x-pack/plugins/cloud_security_posture/README.md rename to x-pack/solutions/security/plugins/cloud_security_posture/README.md index f608a614fca1c..aaa1b3f2377a9 100755 --- a/x-pack/plugins/cloud_security_posture/README.md +++ b/x-pack/solutions/security/plugins/cloud_security_posture/README.md @@ -15,12 +15,12 @@ For general guidelines, read [Kibana Testing Guide](https://www.elastic.co/guide ### Tests 1. Unit Tests (Jest) - located in sibling files to the source code -1. [API Integration Tests](../../test/api_integration/apis/cloud_security_posture/config.ts) -1. [Telemetry Integration Tests](../../test/cloud_security_posture_api/config.ts) -1. [End-to-End Tests](../../test/cloud_security_posture_functional/config.ts) -1. [Serverless API Integration tests](../../test_serverless/api_integration/test_suites/security/config.ts) -1. [Serverless End-to-End Tests](../../test_serverless/functional/test_suites/security/config.ts) -1. [Cypress End-to-End Tests](../../test/security_solution_cypress/cypress/e2e/cloud_security_posture) +1. [API Integration Tests](../../../../test/api_integration/apis/cloud_security_posture/config.ts) +1. [Telemetry Integration Tests](../../../../test/cloud_security_posture_api/config.ts) +1. [End-to-End Tests](../../../../test/cloud_security_posture_functional/config.ts) +1. [Serverless API Integration tests](../../../../test_serverless/api_integration/test_suites/security/config.ts) +1. [Serverless End-to-End Tests](../../../../test_serverless/functional/test_suites/security/config.ts) +1. [Cypress End-to-End Tests](../../../../test/security_solution_cypress/cypress/e2e/cloud_security_posture) ### Tools @@ -28,13 +28,13 @@ For general guidelines, read [Kibana Testing Guide](https://www.elastic.co/guide Run **TypeScript**: ```bash -node scripts/type_check.js --project=x-pack/plugins/cloud_security_posture/tsconfig.json +node scripts/type_check.js --project=x-pack/solutions/security/plugins/cloud_security_posture/tsconfig.json ``` Run **ESLint**: ```bash -yarn lint:es x-pack/plugins/cloud_security_posture +yarn lint:es x-pack/solutions/security/plugins/cloud_security_posture ``` Run **i18n check**: @@ -51,12 +51,12 @@ node scripts/i18n_check.js Run [**Unit Tests**](https://www.elastic.co/guide/en/kibana/current/development-tests.html#_unit_testing): ```bash -yarn test:jest --config x-pack/plugins/cloud_security_posture/jest.config.js +yarn test:jest --config x-pack/solutions/security/plugins/cloud_security_posture/jest.config.js ``` > **Note** > -> for a coverage report, add the `--coverage` flag, and run `open target/kibana-coverage/jest/x-pack/plugins/cloud_security_posture/index.html` +> for a coverage report, add the `--coverage` flag, and run `open target/kibana-coverage/jest/x-pack/solutions/security/plugins/cloud_security_posture/index.html` Run [**Integration Tests**](https://docs.elastic.dev/kibana-dev-docs/tutorials/testing-plugins#): diff --git a/x-pack/plugins/cloud_security_posture/common/constants.ts b/x-pack/solutions/security/plugins/cloud_security_posture/common/constants.ts similarity index 100% rename from x-pack/plugins/cloud_security_posture/common/constants.ts rename to x-pack/solutions/security/plugins/cloud_security_posture/common/constants.ts diff --git a/x-pack/plugins/cloud_security_posture/common/dev_docs/__auto_generated_csp_requirements_test_coverage.md b/x-pack/solutions/security/plugins/cloud_security_posture/common/dev_docs/__auto_generated_csp_requirements_test_coverage.md similarity index 58% rename from x-pack/plugins/cloud_security_posture/common/dev_docs/__auto_generated_csp_requirements_test_coverage.md rename to x-pack/solutions/security/plugins/cloud_security_posture/common/dev_docs/__auto_generated_csp_requirements_test_coverage.md index 495400272ac43..a7cf161697027 100644 --- a/x-pack/plugins/cloud_security_posture/common/dev_docs/__auto_generated_csp_requirements_test_coverage.md +++ b/x-pack/solutions/security/plugins/cloud_security_posture/common/dev_docs/__auto_generated_csp_requirements_test_coverage.md @@ -28,7 +28,7 @@ You can also check out the dedicated app view, which enables easier search and f | [should return the correct queries for multiple muted rules](x-pack/packages/kbn-cloud-security-posture-common/utils/helpers.test.ts) | it | | | -## Directory: x-pack/plugins/cloud_security_posture +## Directory: x-pack/solutions/security/plugins/cloud_security_posture **Total Tests:** 463 | **Skipped:** 7 (1.51%) | **Todo:** 0 (0.00%) @@ -39,469 +39,469 @@ You can also check out the dedicated app view, which enables easier search and f | Test Label | Type | Skipped | Todo | |------------|------|---------|------| -| [Detection rules utils](x-pack/plugins/cloud_security_posture/common/utils/detection_rules.test.ts) | describe | | | -| [should convert tags to KQL format with AND operator](x-pack/plugins/cloud_security_posture/common/utils/detection_rules.test.ts) | it | | | -| [Should convert tags to KQL format with AND Operator (empty array)](x-pack/plugins/cloud_security_posture/common/utils/detection_rules.test.ts) | it | | | -| [should convert tags to KQL format with OR Operator](x-pack/plugins/cloud_security_posture/common/utils/detection_rules.test.ts) | it | | | -| [Should convert tags to KQL format with OR Operator (empty array)](x-pack/plugins/cloud_security_posture/common/utils/detection_rules.test.ts) | it | | | -| [Should generate search tags for a CSP benchmark rule](x-pack/plugins/cloud_security_posture/common/utils/detection_rules.test.ts) | it | | | -| [Should handle undefined benchmark object gracefully](x-pack/plugins/cloud_security_posture/common/utils/detection_rules.test.ts) | it | | | -| [Should handle undefined rule number gracefully](x-pack/plugins/cloud_security_posture/common/utils/detection_rules.test.ts) | it | | | -| [Should generate search tags for a CSP benchmark rule given an array of Benchmarks](x-pack/plugins/cloud_security_posture/common/utils/detection_rules.test.ts) | it | | | -| [Should handle undefined benchmark object gracefully given an array of empty benchmark](x-pack/plugins/cloud_security_posture/common/utils/detection_rules.test.ts) | it | | | -| [Should generate tags for a CSPM benchmark rule](x-pack/plugins/cloud_security_posture/common/utils/detection_rules.test.ts) | it | | | -| [Should generate tags for a KSPM benchmark rule](x-pack/plugins/cloud_security_posture/common/utils/detection_rules.test.ts) | it | | | -| [test helper methods](x-pack/plugins/cloud_security_posture/common/utils/helpers.test.ts) | describe | | | -| [get default integration type from inputs with multiple enabled types](x-pack/plugins/cloud_security_posture/common/utils/helpers.test.ts) | it | | | -| [get default integration type from inputs without any enabled types](x-pack/plugins/cloud_security_posture/common/utils/helpers.test.ts) | it | | | -| [get EKS integration type](x-pack/plugins/cloud_security_posture/common/utils/helpers.test.ts) | it | | | -| [get Vanilla K8S integration type](x-pack/plugins/cloud_security_posture/common/utils/helpers.test.ts) | it | | | -| [get benchmark type filter based on a benchmark id](x-pack/plugins/cloud_security_posture/common/utils/helpers.test.ts) | it | | | -| [should return a string with the correct filter when given a benchmark type and section](x-pack/plugins/cloud_security_posture/common/utils/helpers.test.ts) | it | | | -| [get benchmark filter query based on a benchmark Id, version](x-pack/plugins/cloud_security_posture/common/utils/helpers.test.ts) | it | | | -| [get benchmark filter query based on a benchmark Id, version and multiple sections and rule numbers](x-pack/plugins/cloud_security_posture/common/utils/helpers.test.ts) | it | | | -| [get benchmark filter query based on a benchmark Id, version and just sections](x-pack/plugins/cloud_security_posture/common/utils/helpers.test.ts) | it | | | -| [get benchmark filter query based on a benchmark Id, version and just rule numbers](x-pack/plugins/cloud_security_posture/common/utils/helpers.test.ts) | it | | | -| [cleanupCredentials](x-pack/plugins/cloud_security_posture/common/utils/helpers.test.ts) | describe | | | -| [cleans unused aws credential methods, except role_arn when using assume_role](x-pack/plugins/cloud_security_posture/common/utils/helpers.test.ts) | it | | | -| [cleans unused aws credential methods, when using cloud formation](x-pack/plugins/cloud_security_posture/common/utils/helpers.test.ts) | it | | | -| [cleans unused aws credential methods, when using direct_access_keys method ](x-pack/plugins/cloud_security_posture/common/utils/helpers.test.ts) | it | | | -| [when aws credential type is undefined, return unchanged policy](x-pack/plugins/cloud_security_posture/common/utils/helpers.test.ts) | it | | | -| [cleans unused gcp credential methods, when using credentials-file method ](x-pack/plugins/cloud_security_posture/common/utils/helpers.test.ts) | it | | | -| [when gcp credential type is undefined, return unchanged policy](x-pack/plugins/cloud_security_posture/common/utils/helpers.test.ts) | it | | | -| [isSubscriptionAllowed](x-pack/plugins/cloud_security_posture/common/utils/subscription.test.ts) | describe | | | -| [should allow any cloud subscription](x-pack/plugins/cloud_security_posture/common/utils/subscription.test.ts) | it | | | -| [should allow enterprise and trial licenses for on-prem](x-pack/plugins/cloud_security_posture/common/utils/subscription.test.ts) | it | | | -| [should not allow enterprise and trial licenses for on-prem](x-pack/plugins/cloud_security_posture/common/utils/subscription.test.ts) | it | | | -| [CspRouter](x-pack/plugins/cloud_security_posture/public/application/csp_router.test.tsx) | describe | | | -| [happy path](x-pack/plugins/cloud_security_posture/public/application/csp_router.test.tsx) | describe | | | -| [should render Findings](x-pack/plugins/cloud_security_posture/public/application/csp_router.test.tsx) | it | | | -| [should render Dashboards](x-pack/plugins/cloud_security_posture/public/application/csp_router.test.tsx) | it | | | -| [should render the Vulnerability Dashboard](x-pack/plugins/cloud_security_posture/public/application/csp_router.test.tsx) | it | | | -| [should render Benchmarks](x-pack/plugins/cloud_security_posture/public/application/csp_router.test.tsx) | it | | | -| [should render Rules](x-pack/plugins/cloud_security_posture/public/application/csp_router.test.tsx) | it | | | -| [unhappy path](x-pack/plugins/cloud_security_posture/public/application/csp_router.test.tsx) | describe | | | -| [should redirect base path to dashboard](x-pack/plugins/cloud_security_posture/public/application/csp_router.test.tsx) | it | | | -| [CspRoute](x-pack/plugins/cloud_security_posture/public/application/csp_router.test.tsx) | describe | | | -| [should not render disabled path](x-pack/plugins/cloud_security_posture/public/application/csp_router.test.tsx) | it | | | -| [should render SpyRoute for static paths](x-pack/plugins/cloud_security_posture/public/application/csp_router.test.tsx) | it | | | -| [should not render SpyRoute for dynamic paths](x-pack/plugins/cloud_security_posture/public/application/csp_router.test.tsx) | it | | | -| [useBenchmarkDynamicValues](x-pack/plugins/cloud_security_posture/public/common/hooks/use_benchmark_dynamic_values.test.ts) | describe | | | -| [should return the correct dynamic benchmark values for each provided benchmark ID](x-pack/plugins/cloud_security_posture/public/common/hooks/use_benchmark_dynamic_values.test.ts) | it | | | -| [should return the correct resource plurals based on the provided resource count](x-pack/plugins/cloud_security_posture/public/common/hooks/use_benchmark_dynamic_values.test.ts) | it | | | -| [useNavigateFindings](x-pack/plugins/cloud_security_posture/public/common/hooks/use_navigate_findings.test.ts) | describe | | | -| [creates a URL to findings page with correct path, filter and dataViewId](x-pack/plugins/cloud_security_posture/public/common/hooks/use_navigate_findings.test.ts) | it | | | -| [creates a URL to findings page with correct path and negated filter](x-pack/plugins/cloud_security_posture/public/common/hooks/use_navigate_findings.test.ts) | it | | | -| [creates a URL to vulnerabilities page with correct path, filter and dataViewId](x-pack/plugins/cloud_security_posture/public/common/hooks/use_navigate_findings.test.ts) | it | | | -| [useUrlQuery](x-pack/plugins/cloud_security_posture/public/common/hooks/use_url_query.test.ts) | describe | | | -| [uses default query when no query is provided](x-pack/plugins/cloud_security_posture/public/common/hooks/use_url_query.test.ts) | it | | | -| [merges default query, partial first query and partial second query](x-pack/plugins/cloud_security_posture/public/common/hooks/use_url_query.test.ts) | it | | | -| [getSecuritySolutionLink](x-pack/plugins/cloud_security_posture/public/common/navigation/security_solution_links.test.ts) | describe | | | -| [gets the correct link properties](x-pack/plugins/cloud_security_posture/public/common/navigation/security_solution_links.test.ts) | it | | | -| [getAbbreviatedNumber](x-pack/plugins/cloud_security_posture/public/common/utils/get_abbreviated_number.test.ts) | describe | | | -| [should return the same value if it is less than 1000](x-pack/plugins/cloud_security_posture/public/common/utils/get_abbreviated_number.test.ts) | it | | | -| [should use numeral to format the value if it is greater than or equal to 1000](x-pack/plugins/cloud_security_posture/public/common/utils/get_abbreviated_number.test.ts) | it | | | -| [should return 0 if the value is NaN](x-pack/plugins/cloud_security_posture/public/common/utils/get_abbreviated_number.test.ts) | it | | | -| [getCvsScoreColor](x-pack/plugins/cloud_security_posture/public/common/utils/get_vulnerabiltity_colors.test.ts) | describe | | | -| [returns correct color for low severity score](x-pack/plugins/cloud_security_posture/public/common/utils/get_vulnerabiltity_colors.test.ts) | it | | | -| [returns correct color for medium severity score](x-pack/plugins/cloud_security_posture/public/common/utils/get_vulnerabiltity_colors.test.ts) | it | | | -| [returns correct color for high severity score](x-pack/plugins/cloud_security_posture/public/common/utils/get_vulnerabiltity_colors.test.ts) | it | | | -| [returns correct color for critical severity score](x-pack/plugins/cloud_security_posture/public/common/utils/get_vulnerabiltity_colors.test.ts) | it | | | -| [returns correct color for low severity score for undefined value](x-pack/plugins/cloud_security_posture/public/common/utils/get_vulnerabiltity_colors.test.ts) | it | | | -| [getSeverityStatusColor](x-pack/plugins/cloud_security_posture/public/common/utils/get_vulnerabiltity_colors.test.ts) | describe | | | -| [should return the correct color for LOW severity](x-pack/plugins/cloud_security_posture/public/common/utils/get_vulnerabiltity_colors.test.ts) | it | | | -| [should return the correct color for MEDIUM severity](x-pack/plugins/cloud_security_posture/public/common/utils/get_vulnerabiltity_colors.test.ts) | it | | | -| [should return the correct color for HIGH severity](x-pack/plugins/cloud_security_posture/public/common/utils/get_vulnerabiltity_colors.test.ts) | it | | | -| [should return the correct color for CRITICAL severity](x-pack/plugins/cloud_security_posture/public/common/utils/get_vulnerabiltity_colors.test.ts) | it | | | -| [should return #aaa for an unknown severity](x-pack/plugins/cloud_security_posture/public/common/utils/get_vulnerabiltity_colors.test.ts) | it | | | -| [AccountsEvaluatedWidget](x-pack/plugins/cloud_security_posture/public/components/accounts_evaluated_widget.test.tsx) | describe | | | -| [renders the component with benchmark data correctly](x-pack/plugins/cloud_security_posture/public/components/accounts_evaluated_widget.test.tsx) | it | | | -| [calls navToFindingsByCloudProvider when a benchmark with provider is clicked](x-pack/plugins/cloud_security_posture/public/components/accounts_evaluated_widget.test.tsx) | it | | | -| [calls navToFindingsByCisBenchmark when a benchmark with benchmarkId is clicked](x-pack/plugins/cloud_security_posture/public/components/accounts_evaluated_widget.test.tsx) | it | | | -| [](x-pack/plugins/cloud_security_posture/public/components/chart_panel.test.tsx) | describe | | | -| [renders loading state](x-pack/plugins/cloud_security_posture/public/components/chart_panel.test.tsx) | it | | | -| [renders error state](x-pack/plugins/cloud_security_posture/public/components/chart_panel.test.tsx) | it | | | -| [renders chart component](x-pack/plugins/cloud_security_posture/public/components/chart_panel.test.tsx) | it | | | -| [](x-pack/plugins/cloud_security_posture/public/components/cloud_posture_page.test.tsx) | describe | | | -| [renders children if setup status is indexed](x-pack/plugins/cloud_security_posture/public/components/cloud_posture_page.test.tsx) | it | | | -| [renders default loading text when query isLoading](x-pack/plugins/cloud_security_posture/public/components/cloud_posture_page.test.tsx) | it | | | -| [renders default loading text when query is idle](x-pack/plugins/cloud_security_posture/public/components/cloud_posture_page.test.tsx) | it | | | -| [renders default error texts when query isError](x-pack/plugins/cloud_security_posture/public/components/cloud_posture_page.test.tsx) | it | | | -| [prefers custom error render](x-pack/plugins/cloud_security_posture/public/components/cloud_posture_page.test.tsx) | it | | | -| [prefers custom loading render](x-pack/plugins/cloud_security_posture/public/components/cloud_posture_page.test.tsx) | it | | | -| [renders no data prompt when query data is undefined](x-pack/plugins/cloud_security_posture/public/components/cloud_posture_page.test.tsx) | it | | | -| [prefers custom no data prompt](x-pack/plugins/cloud_security_posture/public/components/cloud_posture_page.test.tsx) | it | | | -| [CloudSecurityDataTable](x-pack/plugins/cloud_security_posture/public/components/cloud_security_data_table/cloud_security_data_table.test.tsx) | describe | | | -| [renders loading state](x-pack/plugins/cloud_security_posture/public/components/cloud_security_data_table/cloud_security_data_table.test.tsx) | it | | | -| [renders empty state when no rows are present](x-pack/plugins/cloud_security_posture/public/components/cloud_security_data_table/cloud_security_data_table.test.tsx) | it | | | -| [renders data table with rows](x-pack/plugins/cloud_security_posture/public/components/cloud_security_data_table/cloud_security_data_table.test.tsx) | it | | | -| [renders data table with actions button](x-pack/plugins/cloud_security_posture/public/components/cloud_security_data_table/cloud_security_data_table.test.tsx) | it | | | -| [renders data table without actions button](x-pack/plugins/cloud_security_posture/public/components/cloud_security_data_table/cloud_security_data_table.test.tsx) | it | | | -| [FieldsSelectorTable](x-pack/plugins/cloud_security_posture/public/components/cloud_security_data_table/fields_selector/fields_selector_table.test.tsx) | describe | | | -| [renders the table with data correctly](x-pack/plugins/cloud_security_posture/public/components/cloud_security_data_table/fields_selector/fields_selector_table.test.tsx) | it | | | -| [calls onAddColumn when a checkbox is checked](x-pack/plugins/cloud_security_posture/public/components/cloud_security_data_table/fields_selector/fields_selector_table.test.tsx) | it | | | -| [calls onRemoveColumn when a checkbox is unchecked](x-pack/plugins/cloud_security_posture/public/components/cloud_security_data_table/fields_selector/fields_selector_table.test.tsx) | it | | | -| [View selected](x-pack/plugins/cloud_security_posture/public/components/cloud_security_data_table/fields_selector/fields_selector_table.test.tsx) | describe | | | -| [should show "view all" option by default](x-pack/plugins/cloud_security_posture/public/components/cloud_security_data_table/fields_selector/fields_selector_table.test.tsx) | it | | | -| [should render "view selected" option when previous selection was "view selected"](x-pack/plugins/cloud_security_posture/public/components/cloud_security_data_table/fields_selector/fields_selector_table.test.tsx) | it | | | -| [should show "view all" option after the "view all" is selected](x-pack/plugins/cloud_security_posture/public/components/cloud_security_data_table/fields_selector/fields_selector_table.test.tsx) | it | | | -| [should show only selected columns after the "view selected" option is selected](x-pack/plugins/cloud_security_posture/public/components/cloud_security_data_table/fields_selector/fields_selector_table.test.tsx) | it | | | -| [should show all columns available after the "view all" option is selected](x-pack/plugins/cloud_security_posture/public/components/cloud_security_data_table/fields_selector/fields_selector_table.test.tsx) | it | | | -| [should open the view selector with button click](x-pack/plugins/cloud_security_posture/public/components/cloud_security_data_table/fields_selector/fields_selector_table.test.tsx) | it | | | -| [Searching columns](x-pack/plugins/cloud_security_posture/public/components/cloud_security_data_table/fields_selector/fields_selector_table.test.tsx) | describe | | | -| [should find all columns match the search term](x-pack/plugins/cloud_security_posture/public/components/cloud_security_data_table/fields_selector/fields_selector_table.test.tsx) | it | | | -| [should find all columns match the search term and are selected](x-pack/plugins/cloud_security_posture/public/components/cloud_security_data_table/fields_selector/fields_selector_table.test.tsx) | it | | | -| [firstNonNullValue](x-pack/plugins/cloud_security_posture/public/components/cloud_security_grouping/utils/first_non_null_value.test.ts) | describe | | | -| [returns the value itself for non-null single value](x-pack/plugins/cloud_security_posture/public/components/cloud_security_grouping/utils/first_non_null_value.test.ts) | it | | | -| [returns undefined for a null single value](x-pack/plugins/cloud_security_posture/public/components/cloud_security_grouping/utils/first_non_null_value.test.ts) | it | | | -| [returns undefined for an array of all null values](x-pack/plugins/cloud_security_posture/public/components/cloud_security_grouping/utils/first_non_null_value.test.ts) | it | | | -| [returns the first non-null value in an array of mixed values](x-pack/plugins/cloud_security_posture/public/components/cloud_security_grouping/utils/first_non_null_value.test.ts) | it | | | -| [returns the first value in an array of all non-null values](x-pack/plugins/cloud_security_posture/public/components/cloud_security_grouping/utils/first_non_null_value.test.ts) | it | | | -| [returns undefined for an empty array](x-pack/plugins/cloud_security_posture/public/components/cloud_security_grouping/utils/first_non_null_value.test.ts) | it | | | -| [DetectionRuleCounter](x-pack/plugins/cloud_security_posture/public/components/detection_rule_counter.test.tsx) | describe | | | -| [should render loading skeleton when both rules and alerts are loading](x-pack/plugins/cloud_security_posture/public/components/detection_rule_counter.test.tsx) | it | | | -| [should render create rule link when no rules exist](x-pack/plugins/cloud_security_posture/public/components/detection_rule_counter.test.tsx) | it | | | -| [should render alert and rule count when rules exist](x-pack/plugins/cloud_security_posture/public/components/detection_rule_counter.test.tsx) | it | | | -| [should show loading spinner when creating a rule](x-pack/plugins/cloud_security_posture/public/components/detection_rule_counter.test.tsx) | it | | | -| [](x-pack/plugins/cloud_security_posture/public/components/fleet_extensions/policy_template_form.test.tsx) | describe | | | -| [shows license block if subscription is not allowed](x-pack/plugins/cloud_security_posture/public/components/fleet_extensions/policy_template_form.test.tsx) | it | | | -| [license block renders with license url locator](x-pack/plugins/cloud_security_posture/public/components/fleet_extensions/policy_template_form.test.tsx) | it | | | -| [license block renders without license url locator](x-pack/plugins/cloud_security_posture/public/components/fleet_extensions/policy_template_form.test.tsx) | it | | | -| [updates package policy namespace to default when it changes](x-pack/plugins/cloud_security_posture/public/components/fleet_extensions/policy_template_form.test.tsx) | it | | | -| [renders and updates name field](x-pack/plugins/cloud_security_posture/public/components/fleet_extensions/policy_template_form.test.tsx) | it | | | -| [renders and updates description field](x-pack/plugins/cloud_security_posture/public/components/fleet_extensions/policy_template_form.test.tsx) | it | | | -| [renders KSPM input selector](x-pack/plugins/cloud_security_posture/public/components/fleet_extensions/policy_template_form.test.tsx) | it | | | -| [updates selected KSPM input](x-pack/plugins/cloud_security_posture/public/components/fleet_extensions/policy_template_form.test.tsx) | it | | | -| [renders CSPM input selector](x-pack/plugins/cloud_security_posture/public/components/fleet_extensions/policy_template_form.test.tsx) | it | | | -| [renders disabled KSPM input when editing](x-pack/plugins/cloud_security_posture/public/components/fleet_extensions/policy_template_form.test.tsx) | it | | | -| [renders disabled CSPM input when editing](x-pack/plugins/cloud_security_posture/public/components/fleet_extensions/policy_template_form.test.tsx) | it | | | -| [selects default KSPM input selector](x-pack/plugins/cloud_security_posture/public/components/fleet_extensions/policy_template_form.test.tsx) | it | | | -| [selects default VULN_MGMT input selector](x-pack/plugins/cloud_security_posture/public/components/fleet_extensions/policy_template_form.test.tsx) | it | | | -| [selects default CSPM input selector](x-pack/plugins/cloud_security_posture/public/components/fleet_extensions/policy_template_form.test.tsx) | it | | | -| [K8S](x-pack/plugins/cloud_security_posture/public/components/fleet_extensions/policy_template_form.test.tsx) | describe | | | -| [K8S or KSPM Vanilla should not render any Setup Access option](x-pack/plugins/cloud_security_posture/public/components/fleet_extensions/policy_template_form.test.tsx) | it | | | -| [EKS Credentials input fields](x-pack/plugins/cloud_security_posture/public/components/fleet_extensions/policy_template_form.test.tsx) | describe | | | -| [documentation Hyperlink should have correct URL to redirect users to AWS page](x-pack/plugins/cloud_security_posture/public/components/fleet_extensions/policy_template_form.test.tsx) | it | | | -| [renders ${CLOUDBEAT_EKS} Assume Role fields](x-pack/plugins/cloud_security_posture/public/components/fleet_extensions/policy_template_form.test.tsx) | it | | | -| [updates ${CLOUDBEAT_EKS} Assume Role fields](x-pack/plugins/cloud_security_posture/public/components/fleet_extensions/policy_template_form.test.tsx) | it | | | -| [renders ${CLOUDBEAT_EKS} Direct Access Keys fields](x-pack/plugins/cloud_security_posture/public/components/fleet_extensions/policy_template_form.test.tsx) | it | | | -| [updates ${CLOUDBEAT_EKS} Direct Access Keys fields](x-pack/plugins/cloud_security_posture/public/components/fleet_extensions/policy_template_form.test.tsx) | it | | | -| [renders ${CLOUDBEAT_EKS} Temporary Keys fields](x-pack/plugins/cloud_security_posture/public/components/fleet_extensions/policy_template_form.test.tsx) | it | | | -| [updates ${CLOUDBEAT_EKS} Temporary Keys fields](x-pack/plugins/cloud_security_posture/public/components/fleet_extensions/policy_template_form.test.tsx) | it | | | -| [renders ${CLOUDBEAT_EKS} Shared Credentials fields](x-pack/plugins/cloud_security_posture/public/components/fleet_extensions/policy_template_form.test.tsx) | it | | | -| [updates ${CLOUDBEAT_EKS} Shared Credentials fields](x-pack/plugins/cloud_security_posture/public/components/fleet_extensions/policy_template_form.test.tsx) | it | | | -| [AWS Credentials input fields](x-pack/plugins/cloud_security_posture/public/components/fleet_extensions/policy_template_form.test.tsx) | describe | | | -| [renders ${CLOUDBEAT_AWS} Account Type field, AWS Organization is enabled for supported versions](x-pack/plugins/cloud_security_posture/public/components/fleet_extensions/policy_template_form.test.tsx) | it | | | -| [${CLOUDBEAT_AWS} form displays upgrade message for unsupported versions and aws organization option is disabled](x-pack/plugins/cloud_security_posture/public/components/fleet_extensions/policy_template_form.test.tsx) | it | | | -| [${CLOUDBEAT_AWS} form do not displays upgrade message for supported versions and aws organization option is enabled](x-pack/plugins/cloud_security_posture/public/components/fleet_extensions/policy_template_form.test.tsx) | it | | | -| [Getting started Hyperlink should have correct URL to redirect users to elastic page](x-pack/plugins/cloud_security_posture/public/components/fleet_extensions/policy_template_form.test.tsx) | it | | | -| [documentation Hyperlink should have correct URL to redirect users to elastic page if user chose Manual](x-pack/plugins/cloud_security_posture/public/components/fleet_extensions/policy_template_form.test.tsx) | it | | | -| [documentation Hyperlink should have correct URL to redirect users to AWS page if user chose Cloudformation](x-pack/plugins/cloud_security_posture/public/components/fleet_extensions/policy_template_form.test.tsx) | it | | | -| [renders ${CLOUDBEAT_AWS} Assume Role fields](x-pack/plugins/cloud_security_posture/public/components/fleet_extensions/policy_template_form.test.tsx) | it | | | -| [updates ${CLOUDBEAT_AWS} Assume Role fields](x-pack/plugins/cloud_security_posture/public/components/fleet_extensions/policy_template_form.test.tsx) | it | | | -| [renders ${CLOUDBEAT_AWS} Direct Access Keys fields](x-pack/plugins/cloud_security_posture/public/components/fleet_extensions/policy_template_form.test.tsx) | it | | | -| [updates ${CLOUDBEAT_AWS} Direct Access Keys fields](x-pack/plugins/cloud_security_posture/public/components/fleet_extensions/policy_template_form.test.tsx) | it | | | -| [renders ${CLOUDBEAT_AWS} Temporary Keys fields](x-pack/plugins/cloud_security_posture/public/components/fleet_extensions/policy_template_form.test.tsx) | it | | | -| [updates ${CLOUDBEAT_AWS} Temporary Keys fields](x-pack/plugins/cloud_security_posture/public/components/fleet_extensions/policy_template_form.test.tsx) | it | | | -| [renders ${CLOUDBEAT_AWS} Shared Credentials fields](x-pack/plugins/cloud_security_posture/public/components/fleet_extensions/policy_template_form.test.tsx) | it | | | -| [updates ${CLOUDBEAT_AWS} Shared Credentials fields](x-pack/plugins/cloud_security_posture/public/components/fleet_extensions/policy_template_form.test.tsx) | it | | | -| [Vuln Mgmt](x-pack/plugins/cloud_security_posture/public/components/fleet_extensions/policy_template_form.test.tsx) | describe | | | -| [Update Agent Policy CloudFormation template from vars](x-pack/plugins/cloud_security_posture/public/components/fleet_extensions/policy_template_form.test.tsx) | it | | | -| [Additional Charge Callout message should be rendered](x-pack/plugins/cloud_security_posture/public/components/fleet_extensions/policy_template_form.test.tsx) | it | | | -| [GCP Credentials input fields](x-pack/plugins/cloud_security_posture/public/components/fleet_extensions/policy_template_form.test.tsx) | describe | | | -| [renders ${CLOUDBEAT_GCP} Not supported when version is not at least version 1.5.2](x-pack/plugins/cloud_security_posture/public/components/fleet_extensions/policy_template_form.test.tsx) | it | | | -| [documentation Hyperlink should have correct URL to redirect users to elastic page](x-pack/plugins/cloud_security_posture/public/components/fleet_extensions/policy_template_form.test.tsx) | it | | | -| [renders Google Cloud Shell forms when Setup Access is set to Google Cloud Shell](x-pack/plugins/cloud_security_posture/public/components/fleet_extensions/policy_template_form.test.tsx) | it | | | -| [renders ${CLOUDBEAT_GCP} Credentials File fields](x-pack/plugins/cloud_security_posture/public/components/fleet_extensions/policy_template_form.test.tsx) | it | | | -| [updates ${CLOUDBEAT_GCP} Credentials File fields](x-pack/plugins/cloud_security_posture/public/components/fleet_extensions/policy_template_form.test.tsx) | it | | | -| [${CLOUDBEAT_GCP} form do not displays upgrade message for supported versions and gcp organization option is enabled](x-pack/plugins/cloud_security_posture/public/components/fleet_extensions/policy_template_form.test.tsx) | it | | | -| [renders ${CLOUDBEAT_GCP} Organization fields when account type is Organization and Setup Access is Google Cloud Shell](x-pack/plugins/cloud_security_posture/public/components/fleet_extensions/policy_template_form.test.tsx) | it | | | -| [renders ${CLOUDBEAT_GCP} Organization fields when account type is Organization and Setup Access is manual](x-pack/plugins/cloud_security_posture/public/components/fleet_extensions/policy_template_form.test.tsx) | it | | | -| [Should not render ${CLOUDBEAT_GCP} Organization fields when account type is Single](x-pack/plugins/cloud_security_posture/public/components/fleet_extensions/policy_template_form.test.tsx) | it | | | -| [updates ${CLOUDBEAT_GCP} organization id](x-pack/plugins/cloud_security_posture/public/components/fleet_extensions/policy_template_form.test.tsx) | it | | | -| [Azure Credentials input fields](x-pack/plugins/cloud_security_posture/public/components/fleet_extensions/policy_template_form.test.tsx) | describe | | | -| [renders ${CLOUDBEAT_AZURE} Not supported when version is not at least version 1.6.0](x-pack/plugins/cloud_security_posture/public/components/fleet_extensions/policy_template_form.test.tsx) | it | | | -| [doesnt render ${CLOUDBEAT_AZURE} Manual fields when version is not at least version 1.7.0](x-pack/plugins/cloud_security_posture/public/components/fleet_extensions/policy_template_form.test.tsx) | it | | | -| [selects default ${CLOUDBEAT_AZURE} fields](x-pack/plugins/cloud_security_posture/public/components/fleet_extensions/policy_template_form.test.tsx) | it | | | -| [renders ${CLOUDBEAT_AZURE} Service Principal with Client Secret fields](x-pack/plugins/cloud_security_posture/public/components/fleet_extensions/policy_template_form.test.tsx) | it | | | -| [updates ${CLOUDBEAT_AZURE} Service Principal with Client Secret fields](x-pack/plugins/cloud_security_posture/public/components/fleet_extensions/policy_template_form.test.tsx) | it | | | -| [Agentless](x-pack/plugins/cloud_security_posture/public/components/fleet_extensions/policy_template_form.test.tsx) | describe | | | -| [should not render setup technology selector if agentless is not available and CSPM integration supports agentless](x-pack/plugins/cloud_security_posture/public/components/fleet_extensions/policy_template_form.test.tsx) | it | | | -| [should render setup technology selector for AWS and allow to select agentless](x-pack/plugins/cloud_security_posture/public/components/fleet_extensions/policy_template_form.test.tsx) | it | | | -| [should render setup technology selector for GCP for organisation account type](x-pack/plugins/cloud_security_posture/public/components/fleet_extensions/policy_template_form.test.tsx) | it | ![](https://img.shields.io/badge/skipped-yellow) | | -| [should render setup technology selector for GCP for single-account](x-pack/plugins/cloud_security_posture/public/components/fleet_extensions/policy_template_form.test.tsx) | it | ![](https://img.shields.io/badge/skipped-yellow) | | -| [should render setup technology selector for Azure for Organisation type](x-pack/plugins/cloud_security_posture/public/components/fleet_extensions/policy_template_form.test.tsx) | it | | | -| [should render setup technology selector for Azure for Single Subscription type](x-pack/plugins/cloud_security_posture/public/components/fleet_extensions/policy_template_form.test.tsx) | it | | | -| [should not render setup technology selector for KSPM](x-pack/plugins/cloud_security_posture/public/components/fleet_extensions/policy_template_form.test.tsx) | it | | | -| [should not render setup technology selector for CNVM](x-pack/plugins/cloud_security_posture/public/components/fleet_extensions/policy_template_form.test.tsx) | it | | | -| [renders Service principal with Client Certificate fields](x-pack/plugins/cloud_security_posture/public/components/fleet_extensions/policy_template_form.test.tsx) | it | | | -| [updates Service principal with Client Certificate fields](x-pack/plugins/cloud_security_posture/public/components/fleet_extensions/policy_template_form.test.tsx) | it | | | -| [should not render Service principal with Client Username and Password option](x-pack/plugins/cloud_security_posture/public/components/fleet_extensions/policy_template_form.test.tsx) | it | | | -| [renders Service principal with Client Username and Password fields](x-pack/plugins/cloud_security_posture/public/components/fleet_extensions/policy_template_form.test.tsx) | it | ![](https://img.shields.io/badge/skipped-yellow) | | -| [updates Service principal with Client Username and Password fields](x-pack/plugins/cloud_security_posture/public/components/fleet_extensions/policy_template_form.test.tsx) | it | ![](https://img.shields.io/badge/skipped-yellow) | | -| [useSetupTechnology](x-pack/plugins/cloud_security_posture/public/components/fleet_extensions/setup_technology_selector/use_setup_technology.test.ts) | describe | | | -| [create page flow](x-pack/plugins/cloud_security_posture/public/components/fleet_extensions/setup_technology_selector/use_setup_technology.test.ts) | describe | | | -| [initializes with AGENT_BASED technology](x-pack/plugins/cloud_security_posture/public/components/fleet_extensions/setup_technology_selector/use_setup_technology.test.ts) | it | | | -| [sets to AGENT-BASED when agentless is available and AWS cloud](x-pack/plugins/cloud_security_posture/public/components/fleet_extensions/setup_technology_selector/use_setup_technology.test.ts) | it | | | -| [sets to AGENT-BASED when agentless is available and GCP cloud](x-pack/plugins/cloud_security_posture/public/components/fleet_extensions/setup_technology_selector/use_setup_technology.test.ts) | it | | | -| [sets to AGENT-BASED when agentless is available and Azure cloud](x-pack/plugins/cloud_security_posture/public/components/fleet_extensions/setup_technology_selector/use_setup_technology.test.ts) | it | | | -| [sets to AGENT_BASED when agentless is available but input is not supported for agentless](x-pack/plugins/cloud_security_posture/public/components/fleet_extensions/setup_technology_selector/use_setup_technology.test.ts) | it | | | -| [sets to AGENT_BASED when isAgentlessEnabled is false](x-pack/plugins/cloud_security_posture/public/components/fleet_extensions/setup_technology_selector/use_setup_technology.test.ts) | it | | | -| [calls handleSetupTechnologyChange when setupTechnology changes](x-pack/plugins/cloud_security_posture/public/components/fleet_extensions/setup_technology_selector/use_setup_technology.test.ts) | it | | | -| [edit page flow](x-pack/plugins/cloud_security_posture/public/components/fleet_extensions/setup_technology_selector/use_setup_technology.test.ts) | describe | | | -| [initializes with AGENT_BASED technology](x-pack/plugins/cloud_security_posture/public/components/fleet_extensions/setup_technology_selector/use_setup_technology.test.ts) | it | | | -| [initializes with agentless when is in edit mode and is agentless selected](x-pack/plugins/cloud_security_posture/public/components/fleet_extensions/setup_technology_selector/use_setup_technology.test.ts) | it | | | -| [should not call handleSetupTechnologyChange when setupTechnology changes](x-pack/plugins/cloud_security_posture/public/components/fleet_extensions/setup_technology_selector/use_setup_technology.test.ts) | it | | | -| [should not update setupTechnology when agentlessPolicyId becomes available](x-pack/plugins/cloud_security_posture/public/components/fleet_extensions/setup_technology_selector/use_setup_technology.test.ts) | it | | | -| [getPosturePolicy](x-pack/plugins/cloud_security_posture/public/components/fleet_extensions/utils.test.ts) | describe | | | -| [updates package policy with hidden vars for ${name}](x-pack/plugins/cloud_security_posture/public/components/fleet_extensions/utils.test.ts) | it | | | -| [updates package policy required vars (posture/deployment)](x-pack/plugins/cloud_security_posture/public/components/fleet_extensions/utils.test.ts) | it | | | -| [updates package policy with a single enabled input](x-pack/plugins/cloud_security_posture/public/components/fleet_extensions/utils.test.ts) | it | | | -| [should correctly increment cspm package name](x-pack/plugins/cloud_security_posture/public/components/fleet_extensions/utils.test.ts) | it | | | -| [should return correctly increment vuln_mgmt package name](x-pack/plugins/cloud_security_posture/public/components/fleet_extensions/utils.test.ts) | it | | | -| [should return correctly increment kspm package name](x-pack/plugins/cloud_security_posture/public/components/fleet_extensions/utils.test.ts) | it | | | -| [should return package name with -1 when no matching package policies are found](x-pack/plugins/cloud_security_posture/public/components/fleet_extensions/utils.test.ts) | it | | | -| [should return empty string when policy_templates is missing](x-pack/plugins/cloud_security_posture/public/components/fleet_extensions/utils.test.ts) | it | | | -| [should return empty string when policy_templates.name is not cspm](x-pack/plugins/cloud_security_posture/public/components/fleet_extensions/utils.test.ts) | it | | | -| [should return empty string when policy_templates.inputs is missing](x-pack/plugins/cloud_security_posture/public/components/fleet_extensions/utils.test.ts) | it | | | -| [should return empty string when policy_templates.inputs is empty](x-pack/plugins/cloud_security_posture/public/components/fleet_extensions/utils.test.ts) | it | | | -| [should return empty string when policy_templates.inputs is undefined](x-pack/plugins/cloud_security_posture/public/components/fleet_extensions/utils.test.ts) | it | | | -| [should return empty string when policy_templates.inputs.vars does not have cloud_shell_url](x-pack/plugins/cloud_security_posture/public/components/fleet_extensions/utils.test.ts) | it | | | -| [should return empty string when policy_templates.inputs.varshave cloud_shell_url but no default](x-pack/plugins/cloud_security_posture/public/components/fleet_extensions/utils.test.ts) | it | | | -| [should cloud shell url when policy_templates.inputs.vars have cloud_shell_url](x-pack/plugins/cloud_security_posture/public/components/fleet_extensions/utils.test.ts) | it | | | -| [should return "direct_access_key" for agentless](x-pack/plugins/cloud_security_posture/public/components/fleet_extensions/utils.test.ts) | it | | | -| [should return "assume_role" for agent-based, when cloudformation is not available](x-pack/plugins/cloud_security_posture/public/components/fleet_extensions/utils.test.ts) | it | | | -| [should return "cloud_formation" for agent-based, when cloudformation is available](x-pack/plugins/cloud_security_posture/public/components/fleet_extensions/utils.test.ts) | it | | | -| [should return "service_principal_with_client_secret" for agentless](x-pack/plugins/cloud_security_posture/public/components/fleet_extensions/utils.test.ts) | it | | | -| [shold return "arm_template" for agent-based, when arm_template is available](x-pack/plugins/cloud_security_posture/public/components/fleet_extensions/utils.test.ts) | it | | | -| [should return "managed_identity" for agent-based, when arm_template is not available](x-pack/plugins/cloud_security_posture/public/components/fleet_extensions/utils.test.ts) | it | | | -| [should return manual credentials-json credentials type for agentless](x-pack/plugins/cloud_security_posture/public/components/fleet_extensions/utils.test.ts) | it | | | -| [should return google_cloud_shell setup access for agent-based if cloud_shell_url is available](x-pack/plugins/cloud_security_posture/public/components/fleet_extensions/utils.test.ts) | it | | | -| [should return manual setup access for agent-based if cloud_shell_url is not available](x-pack/plugins/cloud_security_posture/public/components/fleet_extensions/utils.test.ts) | it | | | -| [Should return var item when key exist](x-pack/plugins/cloud_security_posture/public/components/fleet_extensions/utils.test.ts) | it | | | -| [Should return undefined when key is invalid](x-pack/plugins/cloud_security_posture/public/components/fleet_extensions/utils.test.ts) | it | | | -| [Should return undefined when datastream is undefined](x-pack/plugins/cloud_security_posture/public/components/fleet_extensions/utils.test.ts) | it | | | -| [Should return undefined when stream is undefined](x-pack/plugins/cloud_security_posture/public/components/fleet_extensions/utils.test.ts) | it | | | -| [Should return undefined when stream.var is invalid](x-pack/plugins/cloud_security_posture/public/components/fleet_extensions/utils.test.ts) | it | | | -| [NoFindingsStates](x-pack/plugins/cloud_security_posture/public/components/no_findings_states/no_findings_states.test.tsx) | describe | | | -| [shows integrations installation prompt with installation links when integration is not-installed](x-pack/plugins/cloud_security_posture/public/components/no_findings_states/no_findings_states.test.tsx) | it | | | -| [shows install agent prompt with install agent link when status is not-deployed](x-pack/plugins/cloud_security_posture/public/components/no_findings_states/no_findings_states.test.tsx) | it | | | -| [shows install agent prompt with install agent link when status is not-deployed and postureType is KSPM](x-pack/plugins/cloud_security_posture/public/components/no_findings_states/no_findings_states.test.tsx) | it | | | -| [shows indexing message when status is indexing](x-pack/plugins/cloud_security_posture/public/components/no_findings_states/no_findings_states.test.tsx) | it | | | -| [shows timeout message when status is index-timeout](x-pack/plugins/cloud_security_posture/public/components/no_findings_states/no_findings_states.test.tsx) | it | | | -| [shows unprivileged message when status is unprivileged](x-pack/plugins/cloud_security_posture/public/components/no_findings_states/no_findings_states.test.tsx) | it | | | -| [renders empty container when the status does not match a no finding status](x-pack/plugins/cloud_security_posture/public/components/no_findings_states/no_findings_states.test.tsx) | it | | | -| [](x-pack/plugins/cloud_security_posture/public/pages/benchmarks/benchmarks_table.test.tsx) | describe | | | -| [renders cis integration name](x-pack/plugins/cloud_security_posture/public/pages/benchmarks/benchmarks_table.test.tsx) | it | | | -| [renders benchmark version](x-pack/plugins/cloud_security_posture/public/pages/benchmarks/benchmarks_table.test.tsx) | it | | | -| [renders applicable to](x-pack/plugins/cloud_security_posture/public/pages/benchmarks/benchmarks_table.test.tsx) | it | | | -| [renders evaluated](x-pack/plugins/cloud_security_posture/public/pages/benchmarks/benchmarks_table.test.tsx) | it | | | -| [renders compliance](x-pack/plugins/cloud_security_posture/public/pages/benchmarks/benchmarks_table.test.tsx) | it | | | -| [](x-pack/plugins/cloud_security_posture/public/pages/benchmarks/benchmarks.test.tsx) | describe | | | -| [renders the page header](x-pack/plugins/cloud_security_posture/public/pages/benchmarks/benchmarks.test.tsx) | it | | | -| [renders the "add integration" button](x-pack/plugins/cloud_security_posture/public/pages/benchmarks/benchmarks.test.tsx) | it | | | -| [renders error state while there is an error](x-pack/plugins/cloud_security_posture/public/pages/benchmarks/benchmarks.test.tsx) | it | | | -| [renders the benchmarks table](x-pack/plugins/cloud_security_posture/public/pages/benchmarks/benchmarks.test.tsx) | it | | | -| [getTopRisks](x-pack/plugins/cloud_security_posture/public/pages/compliance_dashboard/compliance_charts/risks_table.test.ts) | describe | | | -| [returns sorted by posture score](x-pack/plugins/cloud_security_posture/public/pages/compliance_dashboard/compliance_charts/risks_table.test.ts) | it | | | -| [return sorted array with the correct number of elements](x-pack/plugins/cloud_security_posture/public/pages/compliance_dashboard/compliance_charts/risks_table.test.ts) | it | | | -| [](x-pack/plugins/cloud_security_posture/public/pages/compliance_dashboard/compliance_dashboard.test.tsx) | describe | | | -| [shows package not installed page instead of tabs](x-pack/plugins/cloud_security_posture/public/pages/compliance_dashboard/compliance_dashboard.test.tsx) | it | | | -| [no findings state: not-deployed - shows NotDeployed instead of dashboard](x-pack/plugins/cloud_security_posture/public/pages/compliance_dashboard/compliance_dashboard.test.tsx) | it | | | -| [no findings state: indexing - shows Indexing instead of dashboard](x-pack/plugins/cloud_security_posture/public/pages/compliance_dashboard/compliance_dashboard.test.tsx) | it | | | -| [no findings state: indexing - shows Indexing instead of dashboard when waiting_for_results](x-pack/plugins/cloud_security_posture/public/pages/compliance_dashboard/compliance_dashboard.test.tsx) | it | | | -| [no findings state: index-timeout - shows IndexTimeout instead of dashboard](x-pack/plugins/cloud_security_posture/public/pages/compliance_dashboard/compliance_dashboard.test.tsx) | it | | | -| [no findings state: unprivileged - shows Unprivileged instead of dashboard](x-pack/plugins/cloud_security_posture/public/pages/compliance_dashboard/compliance_dashboard.test.tsx) | it | | | -| [shows dashboard when there are findings in latest findings index](x-pack/plugins/cloud_security_posture/public/pages/compliance_dashboard/compliance_dashboard.test.tsx) | it | | | -| [Show Kubernetes dashboard if there are KSPM findings](x-pack/plugins/cloud_security_posture/public/pages/compliance_dashboard/compliance_dashboard.test.tsx) | it | | | -| [Show Cloud dashboard if there are CSPM findings](x-pack/plugins/cloud_security_posture/public/pages/compliance_dashboard/compliance_dashboard.test.tsx) | it | | | -| [Show Cloud dashboard "no findings prompt" if the CSPM integration is installed without findings](x-pack/plugins/cloud_security_posture/public/pages/compliance_dashboard/compliance_dashboard.test.tsx) | it | | | -| [Show Kubernetes dashboard "no findings prompt" if the KSPM integration is installed without findings](x-pack/plugins/cloud_security_posture/public/pages/compliance_dashboard/compliance_dashboard.test.tsx) | it | | | -| [Prefer Cloud dashboard if both integration are installed](x-pack/plugins/cloud_security_posture/public/pages/compliance_dashboard/compliance_dashboard.test.tsx) | it | | | -| [Prefer Cloud dashboard if both integration have findings](x-pack/plugins/cloud_security_posture/public/pages/compliance_dashboard/compliance_dashboard.test.tsx) | it | | | -| [Show CSPM installation prompt if CSPM is not installed and KSPM is installed ,NO AGENT](x-pack/plugins/cloud_security_posture/public/pages/compliance_dashboard/compliance_dashboard.test.tsx) | it | | | -| [Show KSPM installation prompt if KSPM is not installed and CSPM is installed , NO AGENT](x-pack/plugins/cloud_security_posture/public/pages/compliance_dashboard/compliance_dashboard.test.tsx) | it | | | -| [getDefaultTab](x-pack/plugins/cloud_security_posture/public/pages/compliance_dashboard/compliance_dashboard.test.tsx) | describe | | | -| [returns CSPM tab if only CSPM has findings](x-pack/plugins/cloud_security_posture/public/pages/compliance_dashboard/compliance_dashboard.test.tsx) | it | | | -| [returns CSPM tab if both CSPM and KSPM has findings](x-pack/plugins/cloud_security_posture/public/pages/compliance_dashboard/compliance_dashboard.test.tsx) | it | | | -| [returns KSPM tab if only KSPM has findings](x-pack/plugins/cloud_security_posture/public/pages/compliance_dashboard/compliance_dashboard.test.tsx) | it | | | -| [when no findings preffers CSPM tab unless not-installed or unprivileged](x-pack/plugins/cloud_security_posture/public/pages/compliance_dashboard/compliance_dashboard.test.tsx) | it | | | -| [should returns undefined when plugin status and cspm stats is not provided](x-pack/plugins/cloud_security_posture/public/pages/compliance_dashboard/compliance_dashboard.test.tsx) | it | | | -| [should return undefined is plugin status and csp status is not provided ](x-pack/plugins/cloud_security_posture/public/pages/compliance_dashboard/compliance_dashboard.test.tsx) | it | | | -| [should return undefined when plugins status or cspm stats data is not provided](x-pack/plugins/cloud_security_posture/public/pages/compliance_dashboard/compliance_dashboard.test.tsx) | it | | | -| [](x-pack/plugins/cloud_security_posture/public/pages/compliance_dashboard/dashboard_sections/benchmarks_section.test.tsx) | describe | | | -| [Sorting](x-pack/plugins/cloud_security_posture/public/pages/compliance_dashboard/dashboard_sections/benchmarks_section.test.tsx) | describe | | | -| [sorts by ascending order of compliance scores](x-pack/plugins/cloud_security_posture/public/pages/compliance_dashboard/dashboard_sections/benchmarks_section.test.tsx) | it | | | -| [toggles sort order when clicking Posture Score](x-pack/plugins/cloud_security_posture/public/pages/compliance_dashboard/dashboard_sections/benchmarks_section.test.tsx) | it | | | -| [](x-pack/plugins/cloud_security_posture/public/pages/compliance_dashboard/dashboard_sections/summary_section.test.tsx) | describe | | | -| [renders all counter cards](x-pack/plugins/cloud_security_posture/public/pages/compliance_dashboard/dashboard_sections/summary_section.test.tsx) | it | | | -| [renders counters content according to mock](x-pack/plugins/cloud_security_posture/public/pages/compliance_dashboard/dashboard_sections/summary_section.test.tsx) | it | | | -| [renders counters value in compact abbreviation if its above one million](x-pack/plugins/cloud_security_posture/public/pages/compliance_dashboard/dashboard_sections/summary_section.test.tsx) | it | | | -| [](x-pack/plugins/cloud_security_posture/public/pages/configurations/configurations.test.tsx) | describe | | | -| [renders integrations installation prompt if integration is not installed and there are no findings](x-pack/plugins/cloud_security_posture/public/pages/configurations/configurations.test.tsx) | it | | | -| [SearchBar](x-pack/plugins/cloud_security_posture/public/pages/configurations/configurations.test.tsx) | describe | | | -| [set search query](x-pack/plugins/cloud_security_posture/public/pages/configurations/configurations.test.tsx) | it | | | -| [renders no results message and reset button when search query does not match](x-pack/plugins/cloud_security_posture/public/pages/configurations/configurations.test.tsx) | it | | | -| [add filter](x-pack/plugins/cloud_security_posture/public/pages/configurations/configurations.test.tsx) | it | | | -| [remove filter](x-pack/plugins/cloud_security_posture/public/pages/configurations/configurations.test.tsx) | it | | | -| [DistributionBar](x-pack/plugins/cloud_security_posture/public/pages/configurations/configurations.test.tsx) | describe | | | -| [renders the distribution bar](x-pack/plugins/cloud_security_posture/public/pages/configurations/configurations.test.tsx) | it | | | -| [filters by passed findings when clicking on the passed findings button](x-pack/plugins/cloud_security_posture/public/pages/configurations/configurations.test.tsx) | it | | | -| [filters by failed findings when clicking on the failed findings button](x-pack/plugins/cloud_security_posture/public/pages/configurations/configurations.test.tsx) | it | | | -| [](x-pack/plugins/cloud_security_posture/public/pages/configurations/findings_flyout/findings_flyout.test.tsx) | describe | | | -| [Overview Tab](x-pack/plugins/cloud_security_posture/public/pages/configurations/findings_flyout/findings_flyout.test.tsx) | describe | | | -| [details and remediation accordions are open](x-pack/plugins/cloud_security_posture/public/pages/configurations/findings_flyout/findings_flyout.test.tsx) | it | | | -| [displays text details summary info](x-pack/plugins/cloud_security_posture/public/pages/configurations/findings_flyout/findings_flyout.test.tsx) | it | | | -| [displays missing info callout when data source is not CSP](x-pack/plugins/cloud_security_posture/public/pages/configurations/findings_flyout/findings_flyout.test.tsx) | it | | | -| [does not display missing info callout when data source is CSP](x-pack/plugins/cloud_security_posture/public/pages/configurations/findings_flyout/findings_flyout.test.tsx) | it | | | -| [Rule Tab](x-pack/plugins/cloud_security_posture/public/pages/configurations/findings_flyout/findings_flyout.test.tsx) | describe | | | -| [displays rule text details](x-pack/plugins/cloud_security_posture/public/pages/configurations/findings_flyout/findings_flyout.test.tsx) | it | | | -| [displays missing info callout when data source is not CSP](x-pack/plugins/cloud_security_posture/public/pages/configurations/findings_flyout/findings_flyout.test.tsx) | it | | | -| [does not display missing info callout when data source is CSP](x-pack/plugins/cloud_security_posture/public/pages/configurations/findings_flyout/findings_flyout.test.tsx) | it | | | -| [Table Tab](x-pack/plugins/cloud_security_posture/public/pages/configurations/findings_flyout/findings_flyout.test.tsx) | describe | | | -| [displays resource name and id](x-pack/plugins/cloud_security_posture/public/pages/configurations/findings_flyout/findings_flyout.test.tsx) | it | | | -| [does not display missing info callout for 3Ps](x-pack/plugins/cloud_security_posture/public/pages/configurations/findings_flyout/findings_flyout.test.tsx) | it | | | -| [JSON Tab](x-pack/plugins/cloud_security_posture/public/pages/configurations/findings_flyout/findings_flyout.test.tsx) | describe | | | -| [does not display missing info callout for 3Ps](x-pack/plugins/cloud_security_posture/public/pages/configurations/findings_flyout/findings_flyout.test.tsx) | it | | | -| [should allow pagination with next](x-pack/plugins/cloud_security_posture/public/pages/configurations/findings_flyout/findings_flyout.test.tsx) | it | | | -| [should allow pagination with previous](x-pack/plugins/cloud_security_posture/public/pages/configurations/findings_flyout/findings_flyout.test.tsx) | it | | | -| [Get Filters](x-pack/plugins/cloud_security_posture/public/pages/configurations/utils/get_filters.test.ts) | describe | | | -| [negate an existing filter](x-pack/plugins/cloud_security_posture/public/pages/configurations/utils/get_filters.test.ts) | it | | | -| [](x-pack/plugins/cloud_security_posture/public/pages/rules/rules_container.test.tsx) | describe | | | -| [displays rules with their initial state](x-pack/plugins/cloud_security_posture/public/pages/rules/rules_container.test.tsx) | it | | | -| [](x-pack/plugins/cloud_security_posture/public/pages/rules/rules.test.tsx) | describe | | | -| [calls Benchmark API](x-pack/plugins/cloud_security_posture/public/pages/rules/rules.test.tsx) | it | | | -| [Display success state when result request is resolved](x-pack/plugins/cloud_security_posture/public/pages/rules/rules.test.tsx) | it | | | -| [use_change_csp_rule_state](x-pack/plugins/cloud_security_posture/public/pages/rules/use_change_csp_rule_state.test.tsx) | describe | | | -| [should call http.post with the correct parameters](x-pack/plugins/cloud_security_posture/public/pages/rules/use_change_csp_rule_state.test.tsx) | it | | | -| [should cancel queries and update query data onMutate](x-pack/plugins/cloud_security_posture/public/pages/rules/use_change_csp_rule_state.test.tsx) | it | | | -| [should invalidate queries onSettled](x-pack/plugins/cloud_security_posture/public/pages/rules/use_change_csp_rule_state.test.tsx) | it | | | -| [should restore previous query data onError](x-pack/plugins/cloud_security_posture/public/pages/rules/use_change_csp_rule_state.test.tsx) | it | | | -| [creates the new set of cache rules in a muted state when calling createRulesWithUpdatedState](x-pack/plugins/cloud_security_posture/public/pages/rules/use_change_csp_rule_state.test.tsx) | it | | | -| [creates the new cache with rules in a unmute state](x-pack/plugins/cloud_security_posture/public/pages/rules/use_change_csp_rule_state.test.tsx) | it | | | -| [](x-pack/plugins/cloud_security_posture/public/pages/vulnerabilities/vulnerabilities_finding_flyout/vulnerability_finding_flyout.test.tsx) | describe | | | -| [Header Info](x-pack/plugins/cloud_security_posture/public/pages/vulnerabilities/vulnerabilities_finding_flyout/vulnerability_finding_flyout.test.tsx) | describe | | | -| [displays text details flyout header info](x-pack/plugins/cloud_security_posture/public/pages/vulnerabilities/vulnerabilities_finding_flyout/vulnerability_finding_flyout.test.tsx) | it | | | -| [JSON Tab](x-pack/plugins/cloud_security_posture/public/pages/vulnerabilities/vulnerabilities_finding_flyout/vulnerability_finding_flyout.test.tsx) | describe | | | -| [show display Vulnerability JSON Tab](x-pack/plugins/cloud_security_posture/public/pages/vulnerabilities/vulnerabilities_finding_flyout/vulnerability_finding_flyout.test.tsx) | it | | | -| [Overview Summary Details Tab](x-pack/plugins/cloud_security_posture/public/pages/vulnerabilities/vulnerabilities_finding_flyout/vulnerability_finding_flyout.test.tsx) | describe | | | -| [show display Vulnerability details in a Overview Tab](x-pack/plugins/cloud_security_posture/public/pages/vulnerabilities/vulnerabilities_finding_flyout/vulnerability_finding_flyout.test.tsx) | it | | | -| [show empty state for no fixes](x-pack/plugins/cloud_security_posture/public/pages/vulnerabilities/vulnerabilities_finding_flyout/vulnerability_finding_flyout.test.tsx) | it | | | -| [Flyout Pagination](x-pack/plugins/cloud_security_posture/public/pages/vulnerabilities/vulnerabilities_finding_flyout/vulnerability_finding_flyout.test.tsx) | describe | ![](https://img.shields.io/badge/skipped-yellow) | | -| [should allow pagination with next](x-pack/plugins/cloud_security_posture/public/pages/vulnerabilities/vulnerabilities_finding_flyout/vulnerability_finding_flyout.test.tsx) | it | ![](https://img.shields.io/badge/skipped-yellow) | | -| [should allow pagination with previous](x-pack/plugins/cloud_security_posture/public/pages/vulnerabilities/vulnerabilities_finding_flyout/vulnerability_finding_flyout.test.tsx) | it | ![](https://img.shields.io/badge/skipped-yellow) | | -| [](x-pack/plugins/cloud_security_posture/public/pages/vulnerabilities/vulnerabilties.test.tsx) | describe | | | -| [No vulnerabilities state: not-deployed - shows NotDeployed instead of vulnerabilities ](x-pack/plugins/cloud_security_posture/public/pages/vulnerabilities/vulnerabilties.test.tsx) | it | | | -| [No vulnerabilities state: indexing - shows Indexing instead of vulnerabilities ](x-pack/plugins/cloud_security_posture/public/pages/vulnerabilities/vulnerabilties.test.tsx) | it | | | -| [No vulnerabilities state: index-timeout - shows IndexTimeout instead of vulnerabilities ](x-pack/plugins/cloud_security_posture/public/pages/vulnerabilities/vulnerabilties.test.tsx) | it | | | -| [No vulnerabilities state: unprivileged - shows Unprivileged instead of vulnerabilities ](x-pack/plugins/cloud_security_posture/public/pages/vulnerabilities/vulnerabilties.test.tsx) | it | | | -| [renders vuln_mgmt integrations installation prompt if vuln_mgmt integration is not installed](x-pack/plugins/cloud_security_posture/public/pages/vulnerabilities/vulnerabilties.test.tsx) | it | | | -| [](x-pack/plugins/cloud_security_posture/public/pages/vulnerability_dashboard/vulnerability_dashboard.test.tsx) | describe | | | -| [renders vuln_mgmt integrations installation prompt if vuln_mgmt integration is not installed](x-pack/plugins/cloud_security_posture/public/pages/vulnerability_dashboard/vulnerability_dashboard.test.tsx) | it | | | -| [No vulnerabilities state: not-deployed - shows NotDeployed instead of vulnerabilities ](x-pack/plugins/cloud_security_posture/public/pages/vulnerability_dashboard/vulnerability_dashboard.test.tsx) | it | | | -| [No vulnerabilities state: indexing - shows Indexing instead of vulnerabilities ](x-pack/plugins/cloud_security_posture/public/pages/vulnerability_dashboard/vulnerability_dashboard.test.tsx) | it | | | -| [No vulnerabilities state: index-timeout - shows IndexTimeout instead of vulnerabilities ](x-pack/plugins/cloud_security_posture/public/pages/vulnerability_dashboard/vulnerability_dashboard.test.tsx) | it | | | -| [No vulnerabilities state: unprivileged - shows Unprivileged instead of vulnerabilities ](x-pack/plugins/cloud_security_posture/public/pages/vulnerability_dashboard/vulnerability_dashboard.test.tsx) | it | | | -| [Vulnerabilities state: indexed - renders dashboard container on indexed state ](x-pack/plugins/cloud_security_posture/public/pages/vulnerability_dashboard/vulnerability_dashboard.test.tsx) | it | | | -| [createBenchmarkScoreIndex](x-pack/plugins/cloud_security_posture/server/create_indices/create_indices.test.ts) | describe | | | -| [should delete old index template from prev verions first](x-pack/plugins/cloud_security_posture/server/create_indices/create_indices.test.ts) | it | | | -| [should create index template with the correct index pattern, index name and default ingest pipeline](x-pack/plugins/cloud_security_posture/server/create_indices/create_indices.test.ts) | it | | | -| [should create index template the correct index patter, index name and default ingest pipeline but without lifecycle in serverless](x-pack/plugins/cloud_security_posture/server/create_indices/create_indices.test.ts) | it | | | -| [should create index if does not exist](x-pack/plugins/cloud_security_posture/server/create_indices/create_indices.test.ts) | it | | | -| [should updat index mapping if index exists](x-pack/plugins/cloud_security_posture/server/create_indices/create_indices.test.ts) | it | | | -| [createTransformIfNotExist](x-pack/plugins/cloud_security_posture/server/create_transforms/create_transforms.test.ts) | describe | | | -| [expect not to create if already exists](x-pack/plugins/cloud_security_posture/server/create_transforms/create_transforms.test.ts) | it | | | -| [expect to create if does not already exist](x-pack/plugins/cloud_security_posture/server/create_transforms/create_transforms.test.ts) | it | | | -| [expect not to create if get error is not 404](x-pack/plugins/cloud_security_posture/server/create_transforms/create_transforms.test.ts) | it | | | -| [startTransformIfNotStarted](x-pack/plugins/cloud_security_posture/server/create_transforms/create_transforms.test.ts) | describe | | | -| [expect not to start if state is ${state}](x-pack/plugins/cloud_security_posture/server/create_transforms/create_transforms.test.ts) | it | | | -| [expect not to start if transform not found](x-pack/plugins/cloud_security_posture/server/create_transforms/create_transforms.test.ts) | it | | | -| [expect to start if state is stopped](x-pack/plugins/cloud_security_posture/server/create_transforms/create_transforms.test.ts) | it | | | -| [expect to attempt restart if state is failed](x-pack/plugins/cloud_security_posture/server/create_transforms/create_transforms.test.ts) | it | | | -| [Benchmark Field Key Functions](x-pack/plugins/cloud_security_posture/server/lib/mapping_field_util.test.ts) | describe | | | -| [toBenchmarkDocFieldKey should keep the same benchmark id and version key for benchmark document](x-pack/plugins/cloud_security_posture/server/lib/mapping_field_util.test.ts) | it | | | -| [toBenchmarkDocFieldKey should convert benchmark version with . delimiter correctly](x-pack/plugins/cloud_security_posture/server/lib/mapping_field_util.test.ts) | it | | | -| [toBenchmarkMappingFieldKey should convert benchmark version with _ delimiter correctly](x-pack/plugins/cloud_security_posture/server/lib/mapping_field_util.test.ts) | it | | | -| [toBenchmarkMappingFieldKey should handle benchmark version with dots correctly](x-pack/plugins/cloud_security_posture/server/lib/mapping_field_util.test.ts) | it | | | -| [MAPPING_VERSION_DELIMITER should be an underscore](x-pack/plugins/cloud_security_posture/server/lib/mapping_field_util.test.ts) | it | | | -| [Cloud Security Posture Plugin](x-pack/plugins/cloud_security_posture/server/plugin.test.ts) | describe | | | -| [start()](x-pack/plugins/cloud_security_posture/server/plugin.test.ts) | describe | | | -| [should initialize when package installed](x-pack/plugins/cloud_security_posture/server/plugin.test.ts) | it | | | -| [should not initialize when package is not installed](x-pack/plugins/cloud_security_posture/server/plugin.test.ts) | it | | | -| [should not initialize when other package is created](x-pack/plugins/cloud_security_posture/server/plugin.test.ts) | it | | | -| [packagePolicyPostCreate should return the same received policy](x-pack/plugins/cloud_security_posture/server/plugin.test.ts) | it | | | -| [getSortedCspBenchmarkRules](x-pack/plugins/cloud_security_posture/server/routes/benchmark_rules/find/find.test.ts) | describe | | | -| [sorts by metadata.benchmark.rule_number, invalid semantic version still should still get sorted and empty values should be sorted last](x-pack/plugins/cloud_security_posture/server/routes/benchmark_rules/find/find.test.ts) | it | | | -| [edge case - returns empty array if input is empty](x-pack/plugins/cloud_security_posture/server/routes/benchmark_rules/find/find.test.ts) | it | | | -| [edge case - returns sorted array even if input only has one element](x-pack/plugins/cloud_security_posture/server/routes/benchmark_rules/find/find.test.ts) | it | | | -| [returns sorted array even with undefined or null properties](x-pack/plugins/cloud_security_posture/server/routes/benchmark_rules/find/find.test.ts) | it | | | -| [returns sorted array with invalid semantic versions](x-pack/plugins/cloud_security_posture/server/routes/benchmark_rules/find/find.test.ts) | it | | | -| [benchmarks API](x-pack/plugins/cloud_security_posture/server/routes/benchmarks/benchmarks.test.ts) | describe | | | -| [validate the API route path](x-pack/plugins/cloud_security_posture/server/routes/benchmarks/benchmarks.test.ts) | it | | | -| [should accept to a user with fleet.all privilege](x-pack/plugins/cloud_security_posture/server/routes/benchmarks/benchmarks.test.ts) | it | | | -| [should reject to a user without fleet.all privilege](x-pack/plugins/cloud_security_posture/server/routes/benchmarks/benchmarks.test.ts) | it | | | -| [test input schema](x-pack/plugins/cloud_security_posture/server/routes/benchmarks/benchmarks.test.ts) | describe | | | -| [expect to find default values](x-pack/plugins/cloud_security_posture/server/routes/benchmarks/benchmarks.test.ts) | it | | | -| [expect to find package_policy_name](x-pack/plugins/cloud_security_posture/server/routes/benchmarks/benchmarks.test.ts) | it | | | -| [should throw when page field is not a positive integer](x-pack/plugins/cloud_security_posture/server/routes/benchmarks/benchmarks.test.ts) | it | | | -| [should throw when per_page field is not a positive integer](x-pack/plugins/cloud_security_posture/server/routes/benchmarks/benchmarks.test.ts) | it | | | -| [should throw when sort_field is not string](x-pack/plugins/cloud_security_posture/server/routes/benchmarks/benchmarks.test.ts) | it | | | -| [should not throw when sort_field is a string](x-pack/plugins/cloud_security_posture/server/routes/benchmarks/benchmarks.test.ts) | it | | | -| [should throw when sort_order is not ](x-pack/plugins/cloud_security_posture/server/routes/benchmarks/benchmarks.test.ts) | it | | | -| [should not throw when ](x-pack/plugins/cloud_security_posture/server/routes/benchmarks/benchmarks.test.ts) | it | | | -| [should not throw when ](x-pack/plugins/cloud_security_posture/server/routes/benchmarks/benchmarks.test.ts) | it | | | -| [should not throw when fields is a known string literal](x-pack/plugins/cloud_security_posture/server/routes/benchmarks/benchmarks.test.ts) | it | | | -| [test benchmarks utils](x-pack/plugins/cloud_security_posture/server/routes/benchmarks/benchmarks.test.ts) | describe | | | -| [test getAgentPolicies](x-pack/plugins/cloud_security_posture/server/routes/benchmarks/benchmarks.test.ts) | describe | | | -| [should return one agent policy id when there is duplication](x-pack/plugins/cloud_security_posture/server/routes/benchmarks/benchmarks.test.ts) | it | | | -| [should return full policy ids list when there is no id duplication](x-pack/plugins/cloud_security_posture/server/routes/benchmarks/benchmarks.test.ts) | it | | | -| [test addPackagePolicyCspBenchmarkRule](x-pack/plugins/cloud_security_posture/server/routes/benchmarks/benchmarks.test.ts) | describe | | | -| [should retrieve the rules count by the filtered benchmark type](x-pack/plugins/cloud_security_posture/server/routes/benchmarks/benchmarks.test.ts) | it | | | -| [compliance dashboard permissions API](x-pack/plugins/cloud_security_posture/server/routes/compliance_dashboard/compliance_dashboard.test.ts) | describe | | | -| [should accept to a user with fleet.all privilege](x-pack/plugins/cloud_security_posture/server/routes/compliance_dashboard/compliance_dashboard.test.ts) | it | | | -| [should reject to a user without fleet.all privilege](x-pack/plugins/cloud_security_posture/server/routes/compliance_dashboard/compliance_dashboard.test.ts) | it | | | -| [getBenchmarksFromAggs](x-pack/plugins/cloud_security_posture/server/routes/compliance_dashboard/get_benchmarks.test.ts) | describe | | | -| [should return value matching ComplianceDashboardDataV2["benchmarks"]](x-pack/plugins/cloud_security_posture/server/routes/compliance_dashboard/get_benchmarks.test.ts) | it | | | -| [getClustersFromAggs](x-pack/plugins/cloud_security_posture/server/routes/compliance_dashboard/get_clusters.test.ts) | describe | | | -| [should return value matching ComplianceDashboardData["clusters"]](x-pack/plugins/cloud_security_posture/server/routes/compliance_dashboard/get_clusters.test.ts) | it | | | -| [getPostureStatsFromAggs](x-pack/plugins/cloud_security_posture/server/routes/compliance_dashboard/get_grouped_findings_evaluation.test.ts) | describe | | | -| [should return value matching ComplianceDashboardData["resourcesTypes"]](x-pack/plugins/cloud_security_posture/server/routes/compliance_dashboard/get_grouped_findings_evaluation.test.ts) | it | | | -| [roundScore](x-pack/plugins/cloud_security_posture/server/routes/compliance_dashboard/get_stats.test.ts) | describe | | | -| [should return decimal values with one fraction digit](x-pack/plugins/cloud_security_posture/server/routes/compliance_dashboard/get_stats.test.ts) | it | | | -| [calculatePostureScore](x-pack/plugins/cloud_security_posture/server/routes/compliance_dashboard/get_stats.test.ts) | describe | | | -| [should return calculated posture score](x-pack/plugins/cloud_security_posture/server/routes/compliance_dashboard/get_stats.test.ts) | it | | | -| [getStatsFromFindingsEvaluationsAggs](x-pack/plugins/cloud_security_posture/server/routes/compliance_dashboard/get_stats.test.ts) | describe | | | -| [should throw error in case no findings were found](x-pack/plugins/cloud_security_posture/server/routes/compliance_dashboard/get_stats.test.ts) | it | | | -| [should return value matching ComplianceDashboardData["stats"]](x-pack/plugins/cloud_security_posture/server/routes/compliance_dashboard/get_stats.test.ts) | it | | | -| [checks for stability in case one of the values is zero](x-pack/plugins/cloud_security_posture/server/routes/compliance_dashboard/get_stats.test.ts) | it | | | -| [should return zero on all stats if there are no failed or passed findings](x-pack/plugins/cloud_security_posture/server/routes/compliance_dashboard/get_stats.test.ts) | it | | | -| [getTrendsFromQueryResult](x-pack/plugins/cloud_security_posture/server/routes/compliance_dashboard/get_trends.test.ts) | describe | | | -| [should return value matching Trends type definition, in descending order, and with postureScore](x-pack/plugins/cloud_security_posture/server/routes/compliance_dashboard/get_trends.test.ts) | it | | | -| [calculateIntegrationStatus for cspm](x-pack/plugins/cloud_security_posture/server/routes/status/status.test.ts) | describe | | | -| [Verify status when CSP package is not installed](x-pack/plugins/cloud_security_posture/server/routes/status/status.test.ts) | it | | | -| [Verify status when there are no permission for cspm](x-pack/plugins/cloud_security_posture/server/routes/status/status.test.ts) | it | | | -| [Verify status when there are no findings, no healthy agents and no installed policy templates](x-pack/plugins/cloud_security_posture/server/routes/status/status.test.ts) | it | | | -| [Verify status when there are findings and installed policies but no healthy agents](x-pack/plugins/cloud_security_posture/server/routes/status/status.test.ts) | it | | | -| [Verify status when there are findings ,installed policies and healthy agents](x-pack/plugins/cloud_security_posture/server/routes/status/status.test.ts) | it | | | -| [Verify status when there are no findings ,installed policies and no healthy agents](x-pack/plugins/cloud_security_posture/server/routes/status/status.test.ts) | it | | | -| [Verify status when there are installed policies, healthy agents and no findings](x-pack/plugins/cloud_security_posture/server/routes/status/status.test.ts) | it | | | -| [Verify status when there are installed policies, healthy agents and no findings and been more than 10 minutes](x-pack/plugins/cloud_security_posture/server/routes/status/status.test.ts) | it | | | -| [Verify status when there are installed policies, healthy agents past findings but no recent findings](x-pack/plugins/cloud_security_posture/server/routes/status/status.test.ts) | it | | | -| [calculateIntegrationStatus for vul_mgmt](x-pack/plugins/cloud_security_posture/server/routes/status/status.test.ts) | describe | | | -| [Verify status when there are no permission for vul_mgmt](x-pack/plugins/cloud_security_posture/server/routes/status/status.test.ts) | it | | | -| [Verify status when there are no vul_mgmt findings, no healthy agents and no installed policy templates](x-pack/plugins/cloud_security_posture/server/routes/status/status.test.ts) | it | | | -| [Verify status when there are vul_mgmt findings and installed policies but no healthy agents](x-pack/plugins/cloud_security_posture/server/routes/status/status.test.ts) | it | | | -| [Verify status when there are vul_mgmt findings ,installed policies and healthy agents](x-pack/plugins/cloud_security_posture/server/routes/status/status.test.ts) | it | | | -| [Verify status when there are no vul_mgmt findings ,installed policies and no healthy agents](x-pack/plugins/cloud_security_posture/server/routes/status/status.test.ts) | it | | | -| [Verify status when there are installed policies, healthy agents and no vul_mgmt findings](x-pack/plugins/cloud_security_posture/server/routes/status/status.test.ts) | it | | | -| [Verify status when there are installed policies, healthy agents and no vul_mgmt findings and been more than 10 minutes](x-pack/plugins/cloud_security_posture/server/routes/status/status.test.ts) | it | | | -| [Verify status when there are installed policies, healthy agents and no vul_mgmt findings and been more than 1 hour](x-pack/plugins/cloud_security_posture/server/routes/status/status.test.ts) | it | | | -| [Verify status when there are installed policies, healthy agents past vul_mgmt findings but no recent findings](x-pack/plugins/cloud_security_posture/server/routes/status/status.test.ts) | it | | | -| [finding stats task state](x-pack/plugins/cloud_security_posture/server/tasks/task_state.test.ts) | describe | | | -| [v1](x-pack/plugins/cloud_security_posture/server/tasks/task_state.test.ts) | describe | | | -| [should work on empty object when running the up migration](x-pack/plugins/cloud_security_posture/server/tasks/task_state.test.ts) | it | | | -| [shouldn](x-pack/plugins/cloud_security_posture/server/tasks/task_state.test.ts) | it | | | -| [should drop unknown properties when running the up migration](x-pack/plugins/cloud_security_posture/server/tasks/task_state.test.ts) | it | | | +| [Detection rules utils](x-pack/solutions/security/plugins/cloud_security_posture/common/utils/detection_rules.test.ts) | describe | | | +| [should convert tags to KQL format with AND operator](x-pack/solutions/security/plugins/cloud_security_posture/common/utils/detection_rules.test.ts) | it | | | +| [Should convert tags to KQL format with AND Operator (empty array)](x-pack/solutions/security/plugins/cloud_security_posture/common/utils/detection_rules.test.ts) | it | | | +| [should convert tags to KQL format with OR Operator](x-pack/solutions/security/plugins/cloud_security_posture/common/utils/detection_rules.test.ts) | it | | | +| [Should convert tags to KQL format with OR Operator (empty array)](x-pack/solutions/security/plugins/cloud_security_posture/common/utils/detection_rules.test.ts) | it | | | +| [Should generate search tags for a CSP benchmark rule](x-pack/solutions/security/plugins/cloud_security_posture/common/utils/detection_rules.test.ts) | it | | | +| [Should handle undefined benchmark object gracefully](x-pack/solutions/security/plugins/cloud_security_posture/common/utils/detection_rules.test.ts) | it | | | +| [Should handle undefined rule number gracefully](x-pack/solutions/security/plugins/cloud_security_posture/common/utils/detection_rules.test.ts) | it | | | +| [Should generate search tags for a CSP benchmark rule given an array of Benchmarks](x-pack/solutions/security/plugins/cloud_security_posture/common/utils/detection_rules.test.ts) | it | | | +| [Should handle undefined benchmark object gracefully given an array of empty benchmark](x-pack/solutions/security/plugins/cloud_security_posture/common/utils/detection_rules.test.ts) | it | | | +| [Should generate tags for a CSPM benchmark rule](x-pack/solutions/security/plugins/cloud_security_posture/common/utils/detection_rules.test.ts) | it | | | +| [Should generate tags for a KSPM benchmark rule](x-pack/solutions/security/plugins/cloud_security_posture/common/utils/detection_rules.test.ts) | it | | | +| [test helper methods](x-pack/solutions/security/plugins/cloud_security_posture/common/utils/helpers.test.ts) | describe | | | +| [get default integration type from inputs with multiple enabled types](x-pack/solutions/security/plugins/cloud_security_posture/common/utils/helpers.test.ts) | it | | | +| [get default integration type from inputs without any enabled types](x-pack/solutions/security/plugins/cloud_security_posture/common/utils/helpers.test.ts) | it | | | +| [get EKS integration type](x-pack/solutions/security/plugins/cloud_security_posture/common/utils/helpers.test.ts) | it | | | +| [get Vanilla K8S integration type](x-pack/solutions/security/plugins/cloud_security_posture/common/utils/helpers.test.ts) | it | | | +| [get benchmark type filter based on a benchmark id](x-pack/solutions/security/plugins/cloud_security_posture/common/utils/helpers.test.ts) | it | | | +| [should return a string with the correct filter when given a benchmark type and section](x-pack/solutions/security/plugins/cloud_security_posture/common/utils/helpers.test.ts) | it | | | +| [get benchmark filter query based on a benchmark Id, version](x-pack/solutions/security/plugins/cloud_security_posture/common/utils/helpers.test.ts) | it | | | +| [get benchmark filter query based on a benchmark Id, version and multiple sections and rule numbers](x-pack/solutions/security/plugins/cloud_security_posture/common/utils/helpers.test.ts) | it | | | +| [get benchmark filter query based on a benchmark Id, version and just sections](x-pack/solutions/security/plugins/cloud_security_posture/common/utils/helpers.test.ts) | it | | | +| [get benchmark filter query based on a benchmark Id, version and just rule numbers](x-pack/solutions/security/plugins/cloud_security_posture/common/utils/helpers.test.ts) | it | | | +| [cleanupCredentials](x-pack/solutions/security/plugins/cloud_security_posture/common/utils/helpers.test.ts) | describe | | | +| [cleans unused aws credential methods, except role_arn when using assume_role](x-pack/solutions/security/plugins/cloud_security_posture/common/utils/helpers.test.ts) | it | | | +| [cleans unused aws credential methods, when using cloud formation](x-pack/solutions/security/plugins/cloud_security_posture/common/utils/helpers.test.ts) | it | | | +| [cleans unused aws credential methods, when using direct_access_keys method ](x-pack/solutions/security/plugins/cloud_security_posture/common/utils/helpers.test.ts) | it | | | +| [when aws credential type is undefined, return unchanged policy](x-pack/solutions/security/plugins/cloud_security_posture/common/utils/helpers.test.ts) | it | | | +| [cleans unused gcp credential methods, when using credentials-file method ](x-pack/solutions/security/plugins/cloud_security_posture/common/utils/helpers.test.ts) | it | | | +| [when gcp credential type is undefined, return unchanged policy](x-pack/solutions/security/plugins/cloud_security_posture/common/utils/helpers.test.ts) | it | | | +| [isSubscriptionAllowed](x-pack/solutions/security/plugins/cloud_security_posture/common/utils/subscription.test.ts) | describe | | | +| [should allow any cloud subscription](x-pack/solutions/security/plugins/cloud_security_posture/common/utils/subscription.test.ts) | it | | | +| [should allow enterprise and trial licenses for on-prem](x-pack/solutions/security/plugins/cloud_security_posture/common/utils/subscription.test.ts) | it | | | +| [should not allow enterprise and trial licenses for on-prem](x-pack/solutions/security/plugins/cloud_security_posture/common/utils/subscription.test.ts) | it | | | +| [CspRouter](x-pack/solutions/security/plugins/cloud_security_posture/public/application/csp_router.test.tsx) | describe | | | +| [happy path](x-pack/solutions/security/plugins/cloud_security_posture/public/application/csp_router.test.tsx) | describe | | | +| [should render Findings](x-pack/solutions/security/plugins/cloud_security_posture/public/application/csp_router.test.tsx) | it | | | +| [should render Dashboards](x-pack/solutions/security/plugins/cloud_security_posture/public/application/csp_router.test.tsx) | it | | | +| [should render the Vulnerability Dashboard](x-pack/solutions/security/plugins/cloud_security_posture/public/application/csp_router.test.tsx) | it | | | +| [should render Benchmarks](x-pack/solutions/security/plugins/cloud_security_posture/public/application/csp_router.test.tsx) | it | | | +| [should render Rules](x-pack/solutions/security/plugins/cloud_security_posture/public/application/csp_router.test.tsx) | it | | | +| [unhappy path](x-pack/solutions/security/plugins/cloud_security_posture/public/application/csp_router.test.tsx) | describe | | | +| [should redirect base path to dashboard](x-pack/solutions/security/plugins/cloud_security_posture/public/application/csp_router.test.tsx) | it | | | +| [CspRoute](x-pack/solutions/security/plugins/cloud_security_posture/public/application/csp_router.test.tsx) | describe | | | +| [should not render disabled path](x-pack/solutions/security/plugins/cloud_security_posture/public/application/csp_router.test.tsx) | it | | | +| [should render SpyRoute for static paths](x-pack/solutions/security/plugins/cloud_security_posture/public/application/csp_router.test.tsx) | it | | | +| [should not render SpyRoute for dynamic paths](x-pack/solutions/security/plugins/cloud_security_posture/public/application/csp_router.test.tsx) | it | | | +| [useBenchmarkDynamicValues](x-pack/solutions/security/plugins/cloud_security_posture/public/common/hooks/use_benchmark_dynamic_values.test.ts) | describe | | | +| [should return the correct dynamic benchmark values for each provided benchmark ID](x-pack/solutions/security/plugins/cloud_security_posture/public/common/hooks/use_benchmark_dynamic_values.test.ts) | it | | | +| [should return the correct resource plurals based on the provided resource count](x-pack/solutions/security/plugins/cloud_security_posture/public/common/hooks/use_benchmark_dynamic_values.test.ts) | it | | | +| [useNavigateFindings](x-pack/solutions/security/plugins/cloud_security_posture/public/common/hooks/use_navigate_findings.test.ts) | describe | | | +| [creates a URL to findings page with correct path, filter and dataViewId](x-pack/solutions/security/plugins/cloud_security_posture/public/common/hooks/use_navigate_findings.test.ts) | it | | | +| [creates a URL to findings page with correct path and negated filter](x-pack/solutions/security/plugins/cloud_security_posture/public/common/hooks/use_navigate_findings.test.ts) | it | | | +| [creates a URL to vulnerabilities page with correct path, filter and dataViewId](x-pack/solutions/security/plugins/cloud_security_posture/public/common/hooks/use_navigate_findings.test.ts) | it | | | +| [useUrlQuery](x-pack/solutions/security/plugins/cloud_security_posture/public/common/hooks/use_url_query.test.ts) | describe | | | +| [uses default query when no query is provided](x-pack/solutions/security/plugins/cloud_security_posture/public/common/hooks/use_url_query.test.ts) | it | | | +| [merges default query, partial first query and partial second query](x-pack/solutions/security/plugins/cloud_security_posture/public/common/hooks/use_url_query.test.ts) | it | | | +| [getSecuritySolutionLink](x-pack/solutions/security/plugins/cloud_security_posture/public/common/navigation/security_solution_links.test.ts) | describe | | | +| [gets the correct link properties](x-pack/solutions/security/plugins/cloud_security_posture/public/common/navigation/security_solution_links.test.ts) | it | | | +| [getAbbreviatedNumber](x-pack/solutions/security/plugins/cloud_security_posture/public/common/utils/get_abbreviated_number.test.ts) | describe | | | +| [should return the same value if it is less than 1000](x-pack/solutions/security/plugins/cloud_security_posture/public/common/utils/get_abbreviated_number.test.ts) | it | | | +| [should use numeral to format the value if it is greater than or equal to 1000](x-pack/solutions/security/plugins/cloud_security_posture/public/common/utils/get_abbreviated_number.test.ts) | it | | | +| [should return 0 if the value is NaN](x-pack/solutions/security/plugins/cloud_security_posture/public/common/utils/get_abbreviated_number.test.ts) | it | | | +| [getCvsScoreColor](x-pack/solutions/security/plugins/cloud_security_posture/public/common/utils/get_vulnerabiltity_colors.test.ts) | describe | | | +| [returns correct color for low severity score](x-pack/solutions/security/plugins/cloud_security_posture/public/common/utils/get_vulnerabiltity_colors.test.ts) | it | | | +| [returns correct color for medium severity score](x-pack/solutions/security/plugins/cloud_security_posture/public/common/utils/get_vulnerabiltity_colors.test.ts) | it | | | +| [returns correct color for high severity score](x-pack/solutions/security/plugins/cloud_security_posture/public/common/utils/get_vulnerabiltity_colors.test.ts) | it | | | +| [returns correct color for critical severity score](x-pack/solutions/security/plugins/cloud_security_posture/public/common/utils/get_vulnerabiltity_colors.test.ts) | it | | | +| [returns correct color for low severity score for undefined value](x-pack/solutions/security/plugins/cloud_security_posture/public/common/utils/get_vulnerabiltity_colors.test.ts) | it | | | +| [getSeverityStatusColor](x-pack/solutions/security/plugins/cloud_security_posture/public/common/utils/get_vulnerabiltity_colors.test.ts) | describe | | | +| [should return the correct color for LOW severity](x-pack/solutions/security/plugins/cloud_security_posture/public/common/utils/get_vulnerabiltity_colors.test.ts) | it | | | +| [should return the correct color for MEDIUM severity](x-pack/solutions/security/plugins/cloud_security_posture/public/common/utils/get_vulnerabiltity_colors.test.ts) | it | | | +| [should return the correct color for HIGH severity](x-pack/solutions/security/plugins/cloud_security_posture/public/common/utils/get_vulnerabiltity_colors.test.ts) | it | | | +| [should return the correct color for CRITICAL severity](x-pack/solutions/security/plugins/cloud_security_posture/public/common/utils/get_vulnerabiltity_colors.test.ts) | it | | | +| [should return #aaa for an unknown severity](x-pack/solutions/security/plugins/cloud_security_posture/public/common/utils/get_vulnerabiltity_colors.test.ts) | it | | | +| [AccountsEvaluatedWidget](x-pack/solutions/security/plugins/cloud_security_posture/public/components/accounts_evaluated_widget.test.tsx) | describe | | | +| [renders the component with benchmark data correctly](x-pack/solutions/security/plugins/cloud_security_posture/public/components/accounts_evaluated_widget.test.tsx) | it | | | +| [calls navToFindingsByCloudProvider when a benchmark with provider is clicked](x-pack/solutions/security/plugins/cloud_security_posture/public/components/accounts_evaluated_widget.test.tsx) | it | | | +| [calls navToFindingsByCisBenchmark when a benchmark with benchmarkId is clicked](x-pack/solutions/security/plugins/cloud_security_posture/public/components/accounts_evaluated_widget.test.tsx) | it | | | +| [](x-pack/solutions/security/plugins/cloud_security_posture/public/components/chart_panel.test.tsx) | describe | | | +| [renders loading state](x-pack/solutions/security/plugins/cloud_security_posture/public/components/chart_panel.test.tsx) | it | | | +| [renders error state](x-pack/solutions/security/plugins/cloud_security_posture/public/components/chart_panel.test.tsx) | it | | | +| [renders chart component](x-pack/solutions/security/plugins/cloud_security_posture/public/components/chart_panel.test.tsx) | it | | | +| [](x-pack/solutions/security/plugins/cloud_security_posture/public/components/cloud_posture_page.test.tsx) | describe | | | +| [renders children if setup status is indexed](x-pack/solutions/security/plugins/cloud_security_posture/public/components/cloud_posture_page.test.tsx) | it | | | +| [renders default loading text when query isLoading](x-pack/solutions/security/plugins/cloud_security_posture/public/components/cloud_posture_page.test.tsx) | it | | | +| [renders default loading text when query is idle](x-pack/solutions/security/plugins/cloud_security_posture/public/components/cloud_posture_page.test.tsx) | it | | | +| [renders default error texts when query isError](x-pack/solutions/security/plugins/cloud_security_posture/public/components/cloud_posture_page.test.tsx) | it | | | +| [prefers custom error render](x-pack/solutions/security/plugins/cloud_security_posture/public/components/cloud_posture_page.test.tsx) | it | | | +| [prefers custom loading render](x-pack/solutions/security/plugins/cloud_security_posture/public/components/cloud_posture_page.test.tsx) | it | | | +| [renders no data prompt when query data is undefined](x-pack/solutions/security/plugins/cloud_security_posture/public/components/cloud_posture_page.test.tsx) | it | | | +| [prefers custom no data prompt](x-pack/solutions/security/plugins/cloud_security_posture/public/components/cloud_posture_page.test.tsx) | it | | | +| [CloudSecurityDataTable](x-pack/solutions/security/plugins/cloud_security_posture/public/components/cloud_security_data_table/cloud_security_data_table.test.tsx) | describe | | | +| [renders loading state](x-pack/solutions/security/plugins/cloud_security_posture/public/components/cloud_security_data_table/cloud_security_data_table.test.tsx) | it | | | +| [renders empty state when no rows are present](x-pack/solutions/security/plugins/cloud_security_posture/public/components/cloud_security_data_table/cloud_security_data_table.test.tsx) | it | | | +| [renders data table with rows](x-pack/solutions/security/plugins/cloud_security_posture/public/components/cloud_security_data_table/cloud_security_data_table.test.tsx) | it | | | +| [renders data table with actions button](x-pack/solutions/security/plugins/cloud_security_posture/public/components/cloud_security_data_table/cloud_security_data_table.test.tsx) | it | | | +| [renders data table without actions button](x-pack/solutions/security/plugins/cloud_security_posture/public/components/cloud_security_data_table/cloud_security_data_table.test.tsx) | it | | | +| [FieldsSelectorTable](x-pack/solutions/security/plugins/cloud_security_posture/public/components/cloud_security_data_table/fields_selector/fields_selector_table.test.tsx) | describe | | | +| [renders the table with data correctly](x-pack/solutions/security/plugins/cloud_security_posture/public/components/cloud_security_data_table/fields_selector/fields_selector_table.test.tsx) | it | | | +| [calls onAddColumn when a checkbox is checked](x-pack/solutions/security/plugins/cloud_security_posture/public/components/cloud_security_data_table/fields_selector/fields_selector_table.test.tsx) | it | | | +| [calls onRemoveColumn when a checkbox is unchecked](x-pack/solutions/security/plugins/cloud_security_posture/public/components/cloud_security_data_table/fields_selector/fields_selector_table.test.tsx) | it | | | +| [View selected](x-pack/solutions/security/plugins/cloud_security_posture/public/components/cloud_security_data_table/fields_selector/fields_selector_table.test.tsx) | describe | | | +| [should show "view all" option by default](x-pack/solutions/security/plugins/cloud_security_posture/public/components/cloud_security_data_table/fields_selector/fields_selector_table.test.tsx) | it | | | +| [should render "view selected" option when previous selection was "view selected"](x-pack/solutions/security/plugins/cloud_security_posture/public/components/cloud_security_data_table/fields_selector/fields_selector_table.test.tsx) | it | | | +| [should show "view all" option after the "view all" is selected](x-pack/solutions/security/plugins/cloud_security_posture/public/components/cloud_security_data_table/fields_selector/fields_selector_table.test.tsx) | it | | | +| [should show only selected columns after the "view selected" option is selected](x-pack/solutions/security/plugins/cloud_security_posture/public/components/cloud_security_data_table/fields_selector/fields_selector_table.test.tsx) | it | | | +| [should show all columns available after the "view all" option is selected](x-pack/solutions/security/plugins/cloud_security_posture/public/components/cloud_security_data_table/fields_selector/fields_selector_table.test.tsx) | it | | | +| [should open the view selector with button click](x-pack/solutions/security/plugins/cloud_security_posture/public/components/cloud_security_data_table/fields_selector/fields_selector_table.test.tsx) | it | | | +| [Searching columns](x-pack/solutions/security/plugins/cloud_security_posture/public/components/cloud_security_data_table/fields_selector/fields_selector_table.test.tsx) | describe | | | +| [should find all columns match the search term](x-pack/solutions/security/plugins/cloud_security_posture/public/components/cloud_security_data_table/fields_selector/fields_selector_table.test.tsx) | it | | | +| [should find all columns match the search term and are selected](x-pack/solutions/security/plugins/cloud_security_posture/public/components/cloud_security_data_table/fields_selector/fields_selector_table.test.tsx) | it | | | +| [firstNonNullValue](x-pack/solutions/security/plugins/cloud_security_posture/public/components/cloud_security_grouping/utils/first_non_null_value.test.ts) | describe | | | +| [returns the value itself for non-null single value](x-pack/solutions/security/plugins/cloud_security_posture/public/components/cloud_security_grouping/utils/first_non_null_value.test.ts) | it | | | +| [returns undefined for a null single value](x-pack/solutions/security/plugins/cloud_security_posture/public/components/cloud_security_grouping/utils/first_non_null_value.test.ts) | it | | | +| [returns undefined for an array of all null values](x-pack/solutions/security/plugins/cloud_security_posture/public/components/cloud_security_grouping/utils/first_non_null_value.test.ts) | it | | | +| [returns the first non-null value in an array of mixed values](x-pack/solutions/security/plugins/cloud_security_posture/public/components/cloud_security_grouping/utils/first_non_null_value.test.ts) | it | | | +| [returns the first value in an array of all non-null values](x-pack/solutions/security/plugins/cloud_security_posture/public/components/cloud_security_grouping/utils/first_non_null_value.test.ts) | it | | | +| [returns undefined for an empty array](x-pack/solutions/security/plugins/cloud_security_posture/public/components/cloud_security_grouping/utils/first_non_null_value.test.ts) | it | | | +| [DetectionRuleCounter](x-pack/solutions/security/plugins/cloud_security_posture/public/components/detection_rule_counter.test.tsx) | describe | | | +| [should render loading skeleton when both rules and alerts are loading](x-pack/solutions/security/plugins/cloud_security_posture/public/components/detection_rule_counter.test.tsx) | it | | | +| [should render create rule link when no rules exist](x-pack/solutions/security/plugins/cloud_security_posture/public/components/detection_rule_counter.test.tsx) | it | | | +| [should render alert and rule count when rules exist](x-pack/solutions/security/plugins/cloud_security_posture/public/components/detection_rule_counter.test.tsx) | it | | | +| [should show loading spinner when creating a rule](x-pack/solutions/security/plugins/cloud_security_posture/public/components/detection_rule_counter.test.tsx) | it | | | +| [](x-pack/solutions/security/plugins/cloud_security_posture/public/components/fleet_extensions/policy_template_form.test.tsx) | describe | | | +| [shows license block if subscription is not allowed](x-pack/solutions/security/plugins/cloud_security_posture/public/components/fleet_extensions/policy_template_form.test.tsx) | it | | | +| [license block renders with license url locator](x-pack/solutions/security/plugins/cloud_security_posture/public/components/fleet_extensions/policy_template_form.test.tsx) | it | | | +| [license block renders without license url locator](x-pack/solutions/security/plugins/cloud_security_posture/public/components/fleet_extensions/policy_template_form.test.tsx) | it | | | +| [updates package policy namespace to default when it changes](x-pack/solutions/security/plugins/cloud_security_posture/public/components/fleet_extensions/policy_template_form.test.tsx) | it | | | +| [renders and updates name field](x-pack/solutions/security/plugins/cloud_security_posture/public/components/fleet_extensions/policy_template_form.test.tsx) | it | | | +| [renders and updates description field](x-pack/solutions/security/plugins/cloud_security_posture/public/components/fleet_extensions/policy_template_form.test.tsx) | it | | | +| [renders KSPM input selector](x-pack/solutions/security/plugins/cloud_security_posture/public/components/fleet_extensions/policy_template_form.test.tsx) | it | | | +| [updates selected KSPM input](x-pack/solutions/security/plugins/cloud_security_posture/public/components/fleet_extensions/policy_template_form.test.tsx) | it | | | +| [renders CSPM input selector](x-pack/solutions/security/plugins/cloud_security_posture/public/components/fleet_extensions/policy_template_form.test.tsx) | it | | | +| [renders disabled KSPM input when editing](x-pack/solutions/security/plugins/cloud_security_posture/public/components/fleet_extensions/policy_template_form.test.tsx) | it | | | +| [renders disabled CSPM input when editing](x-pack/solutions/security/plugins/cloud_security_posture/public/components/fleet_extensions/policy_template_form.test.tsx) | it | | | +| [selects default KSPM input selector](x-pack/solutions/security/plugins/cloud_security_posture/public/components/fleet_extensions/policy_template_form.test.tsx) | it | | | +| [selects default VULN_MGMT input selector](x-pack/solutions/security/plugins/cloud_security_posture/public/components/fleet_extensions/policy_template_form.test.tsx) | it | | | +| [selects default CSPM input selector](x-pack/solutions/security/plugins/cloud_security_posture/public/components/fleet_extensions/policy_template_form.test.tsx) | it | | | +| [K8S](x-pack/solutions/security/plugins/cloud_security_posture/public/components/fleet_extensions/policy_template_form.test.tsx) | describe | | | +| [K8S or KSPM Vanilla should not render any Setup Access option](x-pack/solutions/security/plugins/cloud_security_posture/public/components/fleet_extensions/policy_template_form.test.tsx) | it | | | +| [EKS Credentials input fields](x-pack/solutions/security/plugins/cloud_security_posture/public/components/fleet_extensions/policy_template_form.test.tsx) | describe | | | +| [documentation Hyperlink should have correct URL to redirect users to AWS page](x-pack/solutions/security/plugins/cloud_security_posture/public/components/fleet_extensions/policy_template_form.test.tsx) | it | | | +| [renders ${CLOUDBEAT_EKS} Assume Role fields](x-pack/solutions/security/plugins/cloud_security_posture/public/components/fleet_extensions/policy_template_form.test.tsx) | it | | | +| [updates ${CLOUDBEAT_EKS} Assume Role fields](x-pack/solutions/security/plugins/cloud_security_posture/public/components/fleet_extensions/policy_template_form.test.tsx) | it | | | +| [renders ${CLOUDBEAT_EKS} Direct Access Keys fields](x-pack/solutions/security/plugins/cloud_security_posture/public/components/fleet_extensions/policy_template_form.test.tsx) | it | | | +| [updates ${CLOUDBEAT_EKS} Direct Access Keys fields](x-pack/solutions/security/plugins/cloud_security_posture/public/components/fleet_extensions/policy_template_form.test.tsx) | it | | | +| [renders ${CLOUDBEAT_EKS} Temporary Keys fields](x-pack/solutions/security/plugins/cloud_security_posture/public/components/fleet_extensions/policy_template_form.test.tsx) | it | | | +| [updates ${CLOUDBEAT_EKS} Temporary Keys fields](x-pack/solutions/security/plugins/cloud_security_posture/public/components/fleet_extensions/policy_template_form.test.tsx) | it | | | +| [renders ${CLOUDBEAT_EKS} Shared Credentials fields](x-pack/solutions/security/plugins/cloud_security_posture/public/components/fleet_extensions/policy_template_form.test.tsx) | it | | | +| [updates ${CLOUDBEAT_EKS} Shared Credentials fields](x-pack/solutions/security/plugins/cloud_security_posture/public/components/fleet_extensions/policy_template_form.test.tsx) | it | | | +| [AWS Credentials input fields](x-pack/solutions/security/plugins/cloud_security_posture/public/components/fleet_extensions/policy_template_form.test.tsx) | describe | | | +| [renders ${CLOUDBEAT_AWS} Account Type field, AWS Organization is enabled for supported versions](x-pack/solutions/security/plugins/cloud_security_posture/public/components/fleet_extensions/policy_template_form.test.tsx) | it | | | +| [${CLOUDBEAT_AWS} form displays upgrade message for unsupported versions and aws organization option is disabled](x-pack/solutions/security/plugins/cloud_security_posture/public/components/fleet_extensions/policy_template_form.test.tsx) | it | | | +| [${CLOUDBEAT_AWS} form do not displays upgrade message for supported versions and aws organization option is enabled](x-pack/solutions/security/plugins/cloud_security_posture/public/components/fleet_extensions/policy_template_form.test.tsx) | it | | | +| [Getting started Hyperlink should have correct URL to redirect users to elastic page](x-pack/solutions/security/plugins/cloud_security_posture/public/components/fleet_extensions/policy_template_form.test.tsx) | it | | | +| [documentation Hyperlink should have correct URL to redirect users to elastic page if user chose Manual](x-pack/solutions/security/plugins/cloud_security_posture/public/components/fleet_extensions/policy_template_form.test.tsx) | it | | | +| [documentation Hyperlink should have correct URL to redirect users to AWS page if user chose Cloudformation](x-pack/solutions/security/plugins/cloud_security_posture/public/components/fleet_extensions/policy_template_form.test.tsx) | it | | | +| [renders ${CLOUDBEAT_AWS} Assume Role fields](x-pack/solutions/security/plugins/cloud_security_posture/public/components/fleet_extensions/policy_template_form.test.tsx) | it | | | +| [updates ${CLOUDBEAT_AWS} Assume Role fields](x-pack/solutions/security/plugins/cloud_security_posture/public/components/fleet_extensions/policy_template_form.test.tsx) | it | | | +| [renders ${CLOUDBEAT_AWS} Direct Access Keys fields](x-pack/solutions/security/plugins/cloud_security_posture/public/components/fleet_extensions/policy_template_form.test.tsx) | it | | | +| [updates ${CLOUDBEAT_AWS} Direct Access Keys fields](x-pack/solutions/security/plugins/cloud_security_posture/public/components/fleet_extensions/policy_template_form.test.tsx) | it | | | +| [renders ${CLOUDBEAT_AWS} Temporary Keys fields](x-pack/solutions/security/plugins/cloud_security_posture/public/components/fleet_extensions/policy_template_form.test.tsx) | it | | | +| [updates ${CLOUDBEAT_AWS} Temporary Keys fields](x-pack/solutions/security/plugins/cloud_security_posture/public/components/fleet_extensions/policy_template_form.test.tsx) | it | | | +| [renders ${CLOUDBEAT_AWS} Shared Credentials fields](x-pack/solutions/security/plugins/cloud_security_posture/public/components/fleet_extensions/policy_template_form.test.tsx) | it | | | +| [updates ${CLOUDBEAT_AWS} Shared Credentials fields](x-pack/solutions/security/plugins/cloud_security_posture/public/components/fleet_extensions/policy_template_form.test.tsx) | it | | | +| [Vuln Mgmt](x-pack/solutions/security/plugins/cloud_security_posture/public/components/fleet_extensions/policy_template_form.test.tsx) | describe | | | +| [Update Agent Policy CloudFormation template from vars](x-pack/solutions/security/plugins/cloud_security_posture/public/components/fleet_extensions/policy_template_form.test.tsx) | it | | | +| [Additional Charge Callout message should be rendered](x-pack/solutions/security/plugins/cloud_security_posture/public/components/fleet_extensions/policy_template_form.test.tsx) | it | | | +| [GCP Credentials input fields](x-pack/solutions/security/plugins/cloud_security_posture/public/components/fleet_extensions/policy_template_form.test.tsx) | describe | | | +| [renders ${CLOUDBEAT_GCP} Not supported when version is not at least version 1.5.2](x-pack/solutions/security/plugins/cloud_security_posture/public/components/fleet_extensions/policy_template_form.test.tsx) | it | | | +| [documentation Hyperlink should have correct URL to redirect users to elastic page](x-pack/solutions/security/plugins/cloud_security_posture/public/components/fleet_extensions/policy_template_form.test.tsx) | it | | | +| [renders Google Cloud Shell forms when Setup Access is set to Google Cloud Shell](x-pack/solutions/security/plugins/cloud_security_posture/public/components/fleet_extensions/policy_template_form.test.tsx) | it | | | +| [renders ${CLOUDBEAT_GCP} Credentials File fields](x-pack/solutions/security/plugins/cloud_security_posture/public/components/fleet_extensions/policy_template_form.test.tsx) | it | | | +| [updates ${CLOUDBEAT_GCP} Credentials File fields](x-pack/solutions/security/plugins/cloud_security_posture/public/components/fleet_extensions/policy_template_form.test.tsx) | it | | | +| [${CLOUDBEAT_GCP} form do not displays upgrade message for supported versions and gcp organization option is enabled](x-pack/solutions/security/plugins/cloud_security_posture/public/components/fleet_extensions/policy_template_form.test.tsx) | it | | | +| [renders ${CLOUDBEAT_GCP} Organization fields when account type is Organization and Setup Access is Google Cloud Shell](x-pack/solutions/security/plugins/cloud_security_posture/public/components/fleet_extensions/policy_template_form.test.tsx) | it | | | +| [renders ${CLOUDBEAT_GCP} Organization fields when account type is Organization and Setup Access is manual](x-pack/solutions/security/plugins/cloud_security_posture/public/components/fleet_extensions/policy_template_form.test.tsx) | it | | | +| [Should not render ${CLOUDBEAT_GCP} Organization fields when account type is Single](x-pack/solutions/security/plugins/cloud_security_posture/public/components/fleet_extensions/policy_template_form.test.tsx) | it | | | +| [updates ${CLOUDBEAT_GCP} organization id](x-pack/solutions/security/plugins/cloud_security_posture/public/components/fleet_extensions/policy_template_form.test.tsx) | it | | | +| [Azure Credentials input fields](x-pack/solutions/security/plugins/cloud_security_posture/public/components/fleet_extensions/policy_template_form.test.tsx) | describe | | | +| [renders ${CLOUDBEAT_AZURE} Not supported when version is not at least version 1.6.0](x-pack/solutions/security/plugins/cloud_security_posture/public/components/fleet_extensions/policy_template_form.test.tsx) | it | | | +| [doesnt render ${CLOUDBEAT_AZURE} Manual fields when version is not at least version 1.7.0](x-pack/solutions/security/plugins/cloud_security_posture/public/components/fleet_extensions/policy_template_form.test.tsx) | it | | | +| [selects default ${CLOUDBEAT_AZURE} fields](x-pack/solutions/security/plugins/cloud_security_posture/public/components/fleet_extensions/policy_template_form.test.tsx) | it | | | +| [renders ${CLOUDBEAT_AZURE} Service Principal with Client Secret fields](x-pack/solutions/security/plugins/cloud_security_posture/public/components/fleet_extensions/policy_template_form.test.tsx) | it | | | +| [updates ${CLOUDBEAT_AZURE} Service Principal with Client Secret fields](x-pack/solutions/security/plugins/cloud_security_posture/public/components/fleet_extensions/policy_template_form.test.tsx) | it | | | +| [Agentless](x-pack/solutions/security/plugins/cloud_security_posture/public/components/fleet_extensions/policy_template_form.test.tsx) | describe | | | +| [should not render setup technology selector if agentless is not available and CSPM integration supports agentless](x-pack/solutions/security/plugins/cloud_security_posture/public/components/fleet_extensions/policy_template_form.test.tsx) | it | | | +| [should render setup technology selector for AWS and allow to select agentless](x-pack/solutions/security/plugins/cloud_security_posture/public/components/fleet_extensions/policy_template_form.test.tsx) | it | | | +| [should render setup technology selector for GCP for organisation account type](x-pack/solutions/security/plugins/cloud_security_posture/public/components/fleet_extensions/policy_template_form.test.tsx) | it | ![](https://img.shields.io/badge/skipped-yellow) | | +| [should render setup technology selector for GCP for single-account](x-pack/solutions/security/plugins/cloud_security_posture/public/components/fleet_extensions/policy_template_form.test.tsx) | it | ![](https://img.shields.io/badge/skipped-yellow) | | +| [should render setup technology selector for Azure for Organisation type](x-pack/solutions/security/plugins/cloud_security_posture/public/components/fleet_extensions/policy_template_form.test.tsx) | it | | | +| [should render setup technology selector for Azure for Single Subscription type](x-pack/solutions/security/plugins/cloud_security_posture/public/components/fleet_extensions/policy_template_form.test.tsx) | it | | | +| [should not render setup technology selector for KSPM](x-pack/solutions/security/plugins/cloud_security_posture/public/components/fleet_extensions/policy_template_form.test.tsx) | it | | | +| [should not render setup technology selector for CNVM](x-pack/solutions/security/plugins/cloud_security_posture/public/components/fleet_extensions/policy_template_form.test.tsx) | it | | | +| [renders Service principal with Client Certificate fields](x-pack/solutions/security/plugins/cloud_security_posture/public/components/fleet_extensions/policy_template_form.test.tsx) | it | | | +| [updates Service principal with Client Certificate fields](x-pack/solutions/security/plugins/cloud_security_posture/public/components/fleet_extensions/policy_template_form.test.tsx) | it | | | +| [should not render Service principal with Client Username and Password option](x-pack/solutions/security/plugins/cloud_security_posture/public/components/fleet_extensions/policy_template_form.test.tsx) | it | | | +| [renders Service principal with Client Username and Password fields](x-pack/solutions/security/plugins/cloud_security_posture/public/components/fleet_extensions/policy_template_form.test.tsx) | it | ![](https://img.shields.io/badge/skipped-yellow) | | +| [updates Service principal with Client Username and Password fields](x-pack/solutions/security/plugins/cloud_security_posture/public/components/fleet_extensions/policy_template_form.test.tsx) | it | ![](https://img.shields.io/badge/skipped-yellow) | | +| [useSetupTechnology](x-pack/solutions/security/plugins/cloud_security_posture/public/components/fleet_extensions/setup_technology_selector/use_setup_technology.test.ts) | describe | | | +| [create page flow](x-pack/solutions/security/plugins/cloud_security_posture/public/components/fleet_extensions/setup_technology_selector/use_setup_technology.test.ts) | describe | | | +| [initializes with AGENT_BASED technology](x-pack/solutions/security/plugins/cloud_security_posture/public/components/fleet_extensions/setup_technology_selector/use_setup_technology.test.ts) | it | | | +| [sets to AGENT-BASED when agentless is available and AWS cloud](x-pack/solutions/security/plugins/cloud_security_posture/public/components/fleet_extensions/setup_technology_selector/use_setup_technology.test.ts) | it | | | +| [sets to AGENT-BASED when agentless is available and GCP cloud](x-pack/solutions/security/plugins/cloud_security_posture/public/components/fleet_extensions/setup_technology_selector/use_setup_technology.test.ts) | it | | | +| [sets to AGENT-BASED when agentless is available and Azure cloud](x-pack/solutions/security/plugins/cloud_security_posture/public/components/fleet_extensions/setup_technology_selector/use_setup_technology.test.ts) | it | | | +| [sets to AGENT_BASED when agentless is available but input is not supported for agentless](x-pack/solutions/security/plugins/cloud_security_posture/public/components/fleet_extensions/setup_technology_selector/use_setup_technology.test.ts) | it | | | +| [sets to AGENT_BASED when isAgentlessEnabled is false](x-pack/solutions/security/plugins/cloud_security_posture/public/components/fleet_extensions/setup_technology_selector/use_setup_technology.test.ts) | it | | | +| [calls handleSetupTechnologyChange when setupTechnology changes](x-pack/solutions/security/plugins/cloud_security_posture/public/components/fleet_extensions/setup_technology_selector/use_setup_technology.test.ts) | it | | | +| [edit page flow](x-pack/solutions/security/plugins/cloud_security_posture/public/components/fleet_extensions/setup_technology_selector/use_setup_technology.test.ts) | describe | | | +| [initializes with AGENT_BASED technology](x-pack/solutions/security/plugins/cloud_security_posture/public/components/fleet_extensions/setup_technology_selector/use_setup_technology.test.ts) | it | | | +| [initializes with agentless when is in edit mode and is agentless selected](x-pack/solutions/security/plugins/cloud_security_posture/public/components/fleet_extensions/setup_technology_selector/use_setup_technology.test.ts) | it | | | +| [should not call handleSetupTechnologyChange when setupTechnology changes](x-pack/solutions/security/plugins/cloud_security_posture/public/components/fleet_extensions/setup_technology_selector/use_setup_technology.test.ts) | it | | | +| [should not update setupTechnology when agentlessPolicyId becomes available](x-pack/solutions/security/plugins/cloud_security_posture/public/components/fleet_extensions/setup_technology_selector/use_setup_technology.test.ts) | it | | | +| [getPosturePolicy](x-pack/solutions/security/plugins/cloud_security_posture/public/components/fleet_extensions/utils.test.ts) | describe | | | +| [updates package policy with hidden vars for ${name}](x-pack/solutions/security/plugins/cloud_security_posture/public/components/fleet_extensions/utils.test.ts) | it | | | +| [updates package policy required vars (posture/deployment)](x-pack/solutions/security/plugins/cloud_security_posture/public/components/fleet_extensions/utils.test.ts) | it | | | +| [updates package policy with a single enabled input](x-pack/solutions/security/plugins/cloud_security_posture/public/components/fleet_extensions/utils.test.ts) | it | | | +| [should correctly increment cspm package name](x-pack/solutions/security/plugins/cloud_security_posture/public/components/fleet_extensions/utils.test.ts) | it | | | +| [should return correctly increment vuln_mgmt package name](x-pack/solutions/security/plugins/cloud_security_posture/public/components/fleet_extensions/utils.test.ts) | it | | | +| [should return correctly increment kspm package name](x-pack/solutions/security/plugins/cloud_security_posture/public/components/fleet_extensions/utils.test.ts) | it | | | +| [should return package name with -1 when no matching package policies are found](x-pack/solutions/security/plugins/cloud_security_posture/public/components/fleet_extensions/utils.test.ts) | it | | | +| [should return empty string when policy_templates is missing](x-pack/solutions/security/plugins/cloud_security_posture/public/components/fleet_extensions/utils.test.ts) | it | | | +| [should return empty string when policy_templates.name is not cspm](x-pack/solutions/security/plugins/cloud_security_posture/public/components/fleet_extensions/utils.test.ts) | it | | | +| [should return empty string when policy_templates.inputs is missing](x-pack/solutions/security/plugins/cloud_security_posture/public/components/fleet_extensions/utils.test.ts) | it | | | +| [should return empty string when policy_templates.inputs is empty](x-pack/solutions/security/plugins/cloud_security_posture/public/components/fleet_extensions/utils.test.ts) | it | | | +| [should return empty string when policy_templates.inputs is undefined](x-pack/solutions/security/plugins/cloud_security_posture/public/components/fleet_extensions/utils.test.ts) | it | | | +| [should return empty string when policy_templates.inputs.vars does not have cloud_shell_url](x-pack/solutions/security/plugins/cloud_security_posture/public/components/fleet_extensions/utils.test.ts) | it | | | +| [should return empty string when policy_templates.inputs.varshave cloud_shell_url but no default](x-pack/solutions/security/plugins/cloud_security_posture/public/components/fleet_extensions/utils.test.ts) | it | | | +| [should cloud shell url when policy_templates.inputs.vars have cloud_shell_url](x-pack/solutions/security/plugins/cloud_security_posture/public/components/fleet_extensions/utils.test.ts) | it | | | +| [should return "direct_access_key" for agentless](x-pack/solutions/security/plugins/cloud_security_posture/public/components/fleet_extensions/utils.test.ts) | it | | | +| [should return "assume_role" for agent-based, when cloudformation is not available](x-pack/solutions/security/plugins/cloud_security_posture/public/components/fleet_extensions/utils.test.ts) | it | | | +| [should return "cloud_formation" for agent-based, when cloudformation is available](x-pack/solutions/security/plugins/cloud_security_posture/public/components/fleet_extensions/utils.test.ts) | it | | | +| [should return "service_principal_with_client_secret" for agentless](x-pack/solutions/security/plugins/cloud_security_posture/public/components/fleet_extensions/utils.test.ts) | it | | | +| [shold return "arm_template" for agent-based, when arm_template is available](x-pack/solutions/security/plugins/cloud_security_posture/public/components/fleet_extensions/utils.test.ts) | it | | | +| [should return "managed_identity" for agent-based, when arm_template is not available](x-pack/solutions/security/plugins/cloud_security_posture/public/components/fleet_extensions/utils.test.ts) | it | | | +| [should return manual credentials-json credentials type for agentless](x-pack/solutions/security/plugins/cloud_security_posture/public/components/fleet_extensions/utils.test.ts) | it | | | +| [should return google_cloud_shell setup access for agent-based if cloud_shell_url is available](x-pack/solutions/security/plugins/cloud_security_posture/public/components/fleet_extensions/utils.test.ts) | it | | | +| [should return manual setup access for agent-based if cloud_shell_url is not available](x-pack/solutions/security/plugins/cloud_security_posture/public/components/fleet_extensions/utils.test.ts) | it | | | +| [Should return var item when key exist](x-pack/solutions/security/plugins/cloud_security_posture/public/components/fleet_extensions/utils.test.ts) | it | | | +| [Should return undefined when key is invalid](x-pack/solutions/security/plugins/cloud_security_posture/public/components/fleet_extensions/utils.test.ts) | it | | | +| [Should return undefined when datastream is undefined](x-pack/solutions/security/plugins/cloud_security_posture/public/components/fleet_extensions/utils.test.ts) | it | | | +| [Should return undefined when stream is undefined](x-pack/solutions/security/plugins/cloud_security_posture/public/components/fleet_extensions/utils.test.ts) | it | | | +| [Should return undefined when stream.var is invalid](x-pack/solutions/security/plugins/cloud_security_posture/public/components/fleet_extensions/utils.test.ts) | it | | | +| [NoFindingsStates](x-pack/solutions/security/plugins/cloud_security_posture/public/components/no_findings_states/no_findings_states.test.tsx) | describe | | | +| [shows integrations installation prompt with installation links when integration is not-installed](x-pack/solutions/security/plugins/cloud_security_posture/public/components/no_findings_states/no_findings_states.test.tsx) | it | | | +| [shows install agent prompt with install agent link when status is not-deployed](x-pack/solutions/security/plugins/cloud_security_posture/public/components/no_findings_states/no_findings_states.test.tsx) | it | | | +| [shows install agent prompt with install agent link when status is not-deployed and postureType is KSPM](x-pack/solutions/security/plugins/cloud_security_posture/public/components/no_findings_states/no_findings_states.test.tsx) | it | | | +| [shows indexing message when status is indexing](x-pack/solutions/security/plugins/cloud_security_posture/public/components/no_findings_states/no_findings_states.test.tsx) | it | | | +| [shows timeout message when status is index-timeout](x-pack/solutions/security/plugins/cloud_security_posture/public/components/no_findings_states/no_findings_states.test.tsx) | it | | | +| [shows unprivileged message when status is unprivileged](x-pack/solutions/security/plugins/cloud_security_posture/public/components/no_findings_states/no_findings_states.test.tsx) | it | | | +| [renders empty container when the status does not match a no finding status](x-pack/solutions/security/plugins/cloud_security_posture/public/components/no_findings_states/no_findings_states.test.tsx) | it | | | +| [](x-pack/solutions/security/plugins/cloud_security_posture/public/pages/benchmarks/benchmarks_table.test.tsx) | describe | | | +| [renders cis integration name](x-pack/solutions/security/plugins/cloud_security_posture/public/pages/benchmarks/benchmarks_table.test.tsx) | it | | | +| [renders benchmark version](x-pack/solutions/security/plugins/cloud_security_posture/public/pages/benchmarks/benchmarks_table.test.tsx) | it | | | +| [renders applicable to](x-pack/solutions/security/plugins/cloud_security_posture/public/pages/benchmarks/benchmarks_table.test.tsx) | it | | | +| [renders evaluated](x-pack/solutions/security/plugins/cloud_security_posture/public/pages/benchmarks/benchmarks_table.test.tsx) | it | | | +| [renders compliance](x-pack/solutions/security/plugins/cloud_security_posture/public/pages/benchmarks/benchmarks_table.test.tsx) | it | | | +| [](x-pack/solutions/security/plugins/cloud_security_posture/public/pages/benchmarks/benchmarks.test.tsx) | describe | | | +| [renders the page header](x-pack/solutions/security/plugins/cloud_security_posture/public/pages/benchmarks/benchmarks.test.tsx) | it | | | +| [renders the "add integration" button](x-pack/solutions/security/plugins/cloud_security_posture/public/pages/benchmarks/benchmarks.test.tsx) | it | | | +| [renders error state while there is an error](x-pack/solutions/security/plugins/cloud_security_posture/public/pages/benchmarks/benchmarks.test.tsx) | it | | | +| [renders the benchmarks table](x-pack/solutions/security/plugins/cloud_security_posture/public/pages/benchmarks/benchmarks.test.tsx) | it | | | +| [getTopRisks](x-pack/solutions/security/plugins/cloud_security_posture/public/pages/compliance_dashboard/compliance_charts/risks_table.test.ts) | describe | | | +| [returns sorted by posture score](x-pack/solutions/security/plugins/cloud_security_posture/public/pages/compliance_dashboard/compliance_charts/risks_table.test.ts) | it | | | +| [return sorted array with the correct number of elements](x-pack/solutions/security/plugins/cloud_security_posture/public/pages/compliance_dashboard/compliance_charts/risks_table.test.ts) | it | | | +| [](x-pack/solutions/security/plugins/cloud_security_posture/public/pages/compliance_dashboard/compliance_dashboard.test.tsx) | describe | | | +| [shows package not installed page instead of tabs](x-pack/solutions/security/plugins/cloud_security_posture/public/pages/compliance_dashboard/compliance_dashboard.test.tsx) | it | | | +| [no findings state: not-deployed - shows NotDeployed instead of dashboard](x-pack/solutions/security/plugins/cloud_security_posture/public/pages/compliance_dashboard/compliance_dashboard.test.tsx) | it | | | +| [no findings state: indexing - shows Indexing instead of dashboard](x-pack/solutions/security/plugins/cloud_security_posture/public/pages/compliance_dashboard/compliance_dashboard.test.tsx) | it | | | +| [no findings state: indexing - shows Indexing instead of dashboard when waiting_for_results](x-pack/solutions/security/plugins/cloud_security_posture/public/pages/compliance_dashboard/compliance_dashboard.test.tsx) | it | | | +| [no findings state: index-timeout - shows IndexTimeout instead of dashboard](x-pack/solutions/security/plugins/cloud_security_posture/public/pages/compliance_dashboard/compliance_dashboard.test.tsx) | it | | | +| [no findings state: unprivileged - shows Unprivileged instead of dashboard](x-pack/solutions/security/plugins/cloud_security_posture/public/pages/compliance_dashboard/compliance_dashboard.test.tsx) | it | | | +| [shows dashboard when there are findings in latest findings index](x-pack/solutions/security/plugins/cloud_security_posture/public/pages/compliance_dashboard/compliance_dashboard.test.tsx) | it | | | +| [Show Kubernetes dashboard if there are KSPM findings](x-pack/solutions/security/plugins/cloud_security_posture/public/pages/compliance_dashboard/compliance_dashboard.test.tsx) | it | | | +| [Show Cloud dashboard if there are CSPM findings](x-pack/solutions/security/plugins/cloud_security_posture/public/pages/compliance_dashboard/compliance_dashboard.test.tsx) | it | | | +| [Show Cloud dashboard "no findings prompt" if the CSPM integration is installed without findings](x-pack/solutions/security/plugins/cloud_security_posture/public/pages/compliance_dashboard/compliance_dashboard.test.tsx) | it | | | +| [Show Kubernetes dashboard "no findings prompt" if the KSPM integration is installed without findings](x-pack/solutions/security/plugins/cloud_security_posture/public/pages/compliance_dashboard/compliance_dashboard.test.tsx) | it | | | +| [Prefer Cloud dashboard if both integration are installed](x-pack/solutions/security/plugins/cloud_security_posture/public/pages/compliance_dashboard/compliance_dashboard.test.tsx) | it | | | +| [Prefer Cloud dashboard if both integration have findings](x-pack/solutions/security/plugins/cloud_security_posture/public/pages/compliance_dashboard/compliance_dashboard.test.tsx) | it | | | +| [Show CSPM installation prompt if CSPM is not installed and KSPM is installed ,NO AGENT](x-pack/solutions/security/plugins/cloud_security_posture/public/pages/compliance_dashboard/compliance_dashboard.test.tsx) | it | | | +| [Show KSPM installation prompt if KSPM is not installed and CSPM is installed , NO AGENT](x-pack/solutions/security/plugins/cloud_security_posture/public/pages/compliance_dashboard/compliance_dashboard.test.tsx) | it | | | +| [getDefaultTab](x-pack/solutions/security/plugins/cloud_security_posture/public/pages/compliance_dashboard/compliance_dashboard.test.tsx) | describe | | | +| [returns CSPM tab if only CSPM has findings](x-pack/solutions/security/plugins/cloud_security_posture/public/pages/compliance_dashboard/compliance_dashboard.test.tsx) | it | | | +| [returns CSPM tab if both CSPM and KSPM has findings](x-pack/solutions/security/plugins/cloud_security_posture/public/pages/compliance_dashboard/compliance_dashboard.test.tsx) | it | | | +| [returns KSPM tab if only KSPM has findings](x-pack/solutions/security/plugins/cloud_security_posture/public/pages/compliance_dashboard/compliance_dashboard.test.tsx) | it | | | +| [when no findings preffers CSPM tab unless not-installed or unprivileged](x-pack/solutions/security/plugins/cloud_security_posture/public/pages/compliance_dashboard/compliance_dashboard.test.tsx) | it | | | +| [should returns undefined when plugin status and cspm stats is not provided](x-pack/solutions/security/plugins/cloud_security_posture/public/pages/compliance_dashboard/compliance_dashboard.test.tsx) | it | | | +| [should return undefined is plugin status and csp status is not provided ](x-pack/solutions/security/plugins/cloud_security_posture/public/pages/compliance_dashboard/compliance_dashboard.test.tsx) | it | | | +| [should return undefined when plugins status or cspm stats data is not provided](x-pack/solutions/security/plugins/cloud_security_posture/public/pages/compliance_dashboard/compliance_dashboard.test.tsx) | it | | | +| [](x-pack/solutions/security/plugins/cloud_security_posture/public/pages/compliance_dashboard/dashboard_sections/benchmarks_section.test.tsx) | describe | | | +| [Sorting](x-pack/solutions/security/plugins/cloud_security_posture/public/pages/compliance_dashboard/dashboard_sections/benchmarks_section.test.tsx) | describe | | | +| [sorts by ascending order of compliance scores](x-pack/solutions/security/plugins/cloud_security_posture/public/pages/compliance_dashboard/dashboard_sections/benchmarks_section.test.tsx) | it | | | +| [toggles sort order when clicking Posture Score](x-pack/solutions/security/plugins/cloud_security_posture/public/pages/compliance_dashboard/dashboard_sections/benchmarks_section.test.tsx) | it | | | +| [](x-pack/solutions/security/plugins/cloud_security_posture/public/pages/compliance_dashboard/dashboard_sections/summary_section.test.tsx) | describe | | | +| [renders all counter cards](x-pack/solutions/security/plugins/cloud_security_posture/public/pages/compliance_dashboard/dashboard_sections/summary_section.test.tsx) | it | | | +| [renders counters content according to mock](x-pack/solutions/security/plugins/cloud_security_posture/public/pages/compliance_dashboard/dashboard_sections/summary_section.test.tsx) | it | | | +| [renders counters value in compact abbreviation if its above one million](x-pack/solutions/security/plugins/cloud_security_posture/public/pages/compliance_dashboard/dashboard_sections/summary_section.test.tsx) | it | | | +| [](x-pack/solutions/security/plugins/cloud_security_posture/public/pages/configurations/configurations.test.tsx) | describe | | | +| [renders integrations installation prompt if integration is not installed and there are no findings](x-pack/solutions/security/plugins/cloud_security_posture/public/pages/configurations/configurations.test.tsx) | it | | | +| [SearchBar](x-pack/solutions/security/plugins/cloud_security_posture/public/pages/configurations/configurations.test.tsx) | describe | | | +| [set search query](x-pack/solutions/security/plugins/cloud_security_posture/public/pages/configurations/configurations.test.tsx) | it | | | +| [renders no results message and reset button when search query does not match](x-pack/solutions/security/plugins/cloud_security_posture/public/pages/configurations/configurations.test.tsx) | it | | | +| [add filter](x-pack/solutions/security/plugins/cloud_security_posture/public/pages/configurations/configurations.test.tsx) | it | | | +| [remove filter](x-pack/solutions/security/plugins/cloud_security_posture/public/pages/configurations/configurations.test.tsx) | it | | | +| [DistributionBar](x-pack/solutions/security/plugins/cloud_security_posture/public/pages/configurations/configurations.test.tsx) | describe | | | +| [renders the distribution bar](x-pack/solutions/security/plugins/cloud_security_posture/public/pages/configurations/configurations.test.tsx) | it | | | +| [filters by passed findings when clicking on the passed findings button](x-pack/solutions/security/plugins/cloud_security_posture/public/pages/configurations/configurations.test.tsx) | it | | | +| [filters by failed findings when clicking on the failed findings button](x-pack/solutions/security/plugins/cloud_security_posture/public/pages/configurations/configurations.test.tsx) | it | | | +| [](x-pack/solutions/security/plugins/cloud_security_posture/public/pages/configurations/findings_flyout/findings_flyout.test.tsx) | describe | | | +| [Overview Tab](x-pack/solutions/security/plugins/cloud_security_posture/public/pages/configurations/findings_flyout/findings_flyout.test.tsx) | describe | | | +| [details and remediation accordions are open](x-pack/solutions/security/plugins/cloud_security_posture/public/pages/configurations/findings_flyout/findings_flyout.test.tsx) | it | | | +| [displays text details summary info](x-pack/solutions/security/plugins/cloud_security_posture/public/pages/configurations/findings_flyout/findings_flyout.test.tsx) | it | | | +| [displays missing info callout when data source is not CSP](x-pack/solutions/security/plugins/cloud_security_posture/public/pages/configurations/findings_flyout/findings_flyout.test.tsx) | it | | | +| [does not display missing info callout when data source is CSP](x-pack/solutions/security/plugins/cloud_security_posture/public/pages/configurations/findings_flyout/findings_flyout.test.tsx) | it | | | +| [Rule Tab](x-pack/solutions/security/plugins/cloud_security_posture/public/pages/configurations/findings_flyout/findings_flyout.test.tsx) | describe | | | +| [displays rule text details](x-pack/solutions/security/plugins/cloud_security_posture/public/pages/configurations/findings_flyout/findings_flyout.test.tsx) | it | | | +| [displays missing info callout when data source is not CSP](x-pack/solutions/security/plugins/cloud_security_posture/public/pages/configurations/findings_flyout/findings_flyout.test.tsx) | it | | | +| [does not display missing info callout when data source is CSP](x-pack/solutions/security/plugins/cloud_security_posture/public/pages/configurations/findings_flyout/findings_flyout.test.tsx) | it | | | +| [Table Tab](x-pack/solutions/security/plugins/cloud_security_posture/public/pages/configurations/findings_flyout/findings_flyout.test.tsx) | describe | | | +| [displays resource name and id](x-pack/solutions/security/plugins/cloud_security_posture/public/pages/configurations/findings_flyout/findings_flyout.test.tsx) | it | | | +| [does not display missing info callout for 3Ps](x-pack/solutions/security/plugins/cloud_security_posture/public/pages/configurations/findings_flyout/findings_flyout.test.tsx) | it | | | +| [JSON Tab](x-pack/solutions/security/plugins/cloud_security_posture/public/pages/configurations/findings_flyout/findings_flyout.test.tsx) | describe | | | +| [does not display missing info callout for 3Ps](x-pack/solutions/security/plugins/cloud_security_posture/public/pages/configurations/findings_flyout/findings_flyout.test.tsx) | it | | | +| [should allow pagination with next](x-pack/solutions/security/plugins/cloud_security_posture/public/pages/configurations/findings_flyout/findings_flyout.test.tsx) | it | | | +| [should allow pagination with previous](x-pack/solutions/security/plugins/cloud_security_posture/public/pages/configurations/findings_flyout/findings_flyout.test.tsx) | it | | | +| [Get Filters](x-pack/solutions/security/plugins/cloud_security_posture/public/pages/configurations/utils/get_filters.test.ts) | describe | | | +| [negate an existing filter](x-pack/solutions/security/plugins/cloud_security_posture/public/pages/configurations/utils/get_filters.test.ts) | it | | | +| [](x-pack/solutions/security/plugins/cloud_security_posture/public/pages/rules/rules_container.test.tsx) | describe | | | +| [displays rules with their initial state](x-pack/solutions/security/plugins/cloud_security_posture/public/pages/rules/rules_container.test.tsx) | it | | | +| [](x-pack/solutions/security/plugins/cloud_security_posture/public/pages/rules/rules.test.tsx) | describe | | | +| [calls Benchmark API](x-pack/solutions/security/plugins/cloud_security_posture/public/pages/rules/rules.test.tsx) | it | | | +| [Display success state when result request is resolved](x-pack/solutions/security/plugins/cloud_security_posture/public/pages/rules/rules.test.tsx) | it | | | +| [use_change_csp_rule_state](x-pack/solutions/security/plugins/cloud_security_posture/public/pages/rules/use_change_csp_rule_state.test.tsx) | describe | | | +| [should call http.post with the correct parameters](x-pack/solutions/security/plugins/cloud_security_posture/public/pages/rules/use_change_csp_rule_state.test.tsx) | it | | | +| [should cancel queries and update query data onMutate](x-pack/solutions/security/plugins/cloud_security_posture/public/pages/rules/use_change_csp_rule_state.test.tsx) | it | | | +| [should invalidate queries onSettled](x-pack/solutions/security/plugins/cloud_security_posture/public/pages/rules/use_change_csp_rule_state.test.tsx) | it | | | +| [should restore previous query data onError](x-pack/solutions/security/plugins/cloud_security_posture/public/pages/rules/use_change_csp_rule_state.test.tsx) | it | | | +| [creates the new set of cache rules in a muted state when calling createRulesWithUpdatedState](x-pack/solutions/security/plugins/cloud_security_posture/public/pages/rules/use_change_csp_rule_state.test.tsx) | it | | | +| [creates the new cache with rules in a unmute state](x-pack/solutions/security/plugins/cloud_security_posture/public/pages/rules/use_change_csp_rule_state.test.tsx) | it | | | +| [](x-pack/solutions/security/plugins/cloud_security_posture/public/pages/vulnerabilities/vulnerabilities_finding_flyout/vulnerability_finding_flyout.test.tsx) | describe | | | +| [Header Info](x-pack/solutions/security/plugins/cloud_security_posture/public/pages/vulnerabilities/vulnerabilities_finding_flyout/vulnerability_finding_flyout.test.tsx) | describe | | | +| [displays text details flyout header info](x-pack/solutions/security/plugins/cloud_security_posture/public/pages/vulnerabilities/vulnerabilities_finding_flyout/vulnerability_finding_flyout.test.tsx) | it | | | +| [JSON Tab](x-pack/solutions/security/plugins/cloud_security_posture/public/pages/vulnerabilities/vulnerabilities_finding_flyout/vulnerability_finding_flyout.test.tsx) | describe | | | +| [show display Vulnerability JSON Tab](x-pack/solutions/security/plugins/cloud_security_posture/public/pages/vulnerabilities/vulnerabilities_finding_flyout/vulnerability_finding_flyout.test.tsx) | it | | | +| [Overview Summary Details Tab](x-pack/solutions/security/plugins/cloud_security_posture/public/pages/vulnerabilities/vulnerabilities_finding_flyout/vulnerability_finding_flyout.test.tsx) | describe | | | +| [show display Vulnerability details in a Overview Tab](x-pack/solutions/security/plugins/cloud_security_posture/public/pages/vulnerabilities/vulnerabilities_finding_flyout/vulnerability_finding_flyout.test.tsx) | it | | | +| [show empty state for no fixes](x-pack/solutions/security/plugins/cloud_security_posture/public/pages/vulnerabilities/vulnerabilities_finding_flyout/vulnerability_finding_flyout.test.tsx) | it | | | +| [Flyout Pagination](x-pack/solutions/security/plugins/cloud_security_posture/public/pages/vulnerabilities/vulnerabilities_finding_flyout/vulnerability_finding_flyout.test.tsx) | describe | ![](https://img.shields.io/badge/skipped-yellow) | | +| [should allow pagination with next](x-pack/solutions/security/plugins/cloud_security_posture/public/pages/vulnerabilities/vulnerabilities_finding_flyout/vulnerability_finding_flyout.test.tsx) | it | ![](https://img.shields.io/badge/skipped-yellow) | | +| [should allow pagination with previous](x-pack/solutions/security/plugins/cloud_security_posture/public/pages/vulnerabilities/vulnerabilities_finding_flyout/vulnerability_finding_flyout.test.tsx) | it | ![](https://img.shields.io/badge/skipped-yellow) | | +| [](x-pack/solutions/security/plugins/cloud_security_posture/public/pages/vulnerabilities/vulnerabilties.test.tsx) | describe | | | +| [No vulnerabilities state: not-deployed - shows NotDeployed instead of vulnerabilities ](x-pack/solutions/security/plugins/cloud_security_posture/public/pages/vulnerabilities/vulnerabilties.test.tsx) | it | | | +| [No vulnerabilities state: indexing - shows Indexing instead of vulnerabilities ](x-pack/solutions/security/plugins/cloud_security_posture/public/pages/vulnerabilities/vulnerabilties.test.tsx) | it | | | +| [No vulnerabilities state: index-timeout - shows IndexTimeout instead of vulnerabilities ](x-pack/solutions/security/plugins/cloud_security_posture/public/pages/vulnerabilities/vulnerabilties.test.tsx) | it | | | +| [No vulnerabilities state: unprivileged - shows Unprivileged instead of vulnerabilities ](x-pack/solutions/security/plugins/cloud_security_posture/public/pages/vulnerabilities/vulnerabilties.test.tsx) | it | | | +| [renders vuln_mgmt integrations installation prompt if vuln_mgmt integration is not installed](x-pack/solutions/security/plugins/cloud_security_posture/public/pages/vulnerabilities/vulnerabilties.test.tsx) | it | | | +| [](x-pack/solutions/security/plugins/cloud_security_posture/public/pages/vulnerability_dashboard/vulnerability_dashboard.test.tsx) | describe | | | +| [renders vuln_mgmt integrations installation prompt if vuln_mgmt integration is not installed](x-pack/solutions/security/plugins/cloud_security_posture/public/pages/vulnerability_dashboard/vulnerability_dashboard.test.tsx) | it | | | +| [No vulnerabilities state: not-deployed - shows NotDeployed instead of vulnerabilities ](x-pack/solutions/security/plugins/cloud_security_posture/public/pages/vulnerability_dashboard/vulnerability_dashboard.test.tsx) | it | | | +| [No vulnerabilities state: indexing - shows Indexing instead of vulnerabilities ](x-pack/solutions/security/plugins/cloud_security_posture/public/pages/vulnerability_dashboard/vulnerability_dashboard.test.tsx) | it | | | +| [No vulnerabilities state: index-timeout - shows IndexTimeout instead of vulnerabilities ](x-pack/solutions/security/plugins/cloud_security_posture/public/pages/vulnerability_dashboard/vulnerability_dashboard.test.tsx) | it | | | +| [No vulnerabilities state: unprivileged - shows Unprivileged instead of vulnerabilities ](x-pack/solutions/security/plugins/cloud_security_posture/public/pages/vulnerability_dashboard/vulnerability_dashboard.test.tsx) | it | | | +| [Vulnerabilities state: indexed - renders dashboard container on indexed state ](x-pack/solutions/security/plugins/cloud_security_posture/public/pages/vulnerability_dashboard/vulnerability_dashboard.test.tsx) | it | | | +| [createBenchmarkScoreIndex](x-pack/solutions/security/plugins/cloud_security_posture/server/create_indices/create_indices.test.ts) | describe | | | +| [should delete old index template from prev verions first](x-pack/solutions/security/plugins/cloud_security_posture/server/create_indices/create_indices.test.ts) | it | | | +| [should create index template with the correct index pattern, index name and default ingest pipeline](x-pack/solutions/security/plugins/cloud_security_posture/server/create_indices/create_indices.test.ts) | it | | | +| [should create index template the correct index patter, index name and default ingest pipeline but without lifecycle in serverless](x-pack/solutions/security/plugins/cloud_security_posture/server/create_indices/create_indices.test.ts) | it | | | +| [should create index if does not exist](x-pack/solutions/security/plugins/cloud_security_posture/server/create_indices/create_indices.test.ts) | it | | | +| [should updat index mapping if index exists](x-pack/solutions/security/plugins/cloud_security_posture/server/create_indices/create_indices.test.ts) | it | | | +| [createTransformIfNotExist](x-pack/solutions/security/plugins/cloud_security_posture/server/create_transforms/create_transforms.test.ts) | describe | | | +| [expect not to create if already exists](x-pack/solutions/security/plugins/cloud_security_posture/server/create_transforms/create_transforms.test.ts) | it | | | +| [expect to create if does not already exist](x-pack/solutions/security/plugins/cloud_security_posture/server/create_transforms/create_transforms.test.ts) | it | | | +| [expect not to create if get error is not 404](x-pack/solutions/security/plugins/cloud_security_posture/server/create_transforms/create_transforms.test.ts) | it | | | +| [startTransformIfNotStarted](x-pack/solutions/security/plugins/cloud_security_posture/server/create_transforms/create_transforms.test.ts) | describe | | | +| [expect not to start if state is ${state}](x-pack/solutions/security/plugins/cloud_security_posture/server/create_transforms/create_transforms.test.ts) | it | | | +| [expect not to start if transform not found](x-pack/solutions/security/plugins/cloud_security_posture/server/create_transforms/create_transforms.test.ts) | it | | | +| [expect to start if state is stopped](x-pack/solutions/security/plugins/cloud_security_posture/server/create_transforms/create_transforms.test.ts) | it | | | +| [expect to attempt restart if state is failed](x-pack/solutions/security/plugins/cloud_security_posture/server/create_transforms/create_transforms.test.ts) | it | | | +| [Benchmark Field Key Functions](x-pack/solutions/security/plugins/cloud_security_posture/server/lib/mapping_field_util.test.ts) | describe | | | +| [toBenchmarkDocFieldKey should keep the same benchmark id and version key for benchmark document](x-pack/solutions/security/plugins/cloud_security_posture/server/lib/mapping_field_util.test.ts) | it | | | +| [toBenchmarkDocFieldKey should convert benchmark version with . delimiter correctly](x-pack/solutions/security/plugins/cloud_security_posture/server/lib/mapping_field_util.test.ts) | it | | | +| [toBenchmarkMappingFieldKey should convert benchmark version with _ delimiter correctly](x-pack/solutions/security/plugins/cloud_security_posture/server/lib/mapping_field_util.test.ts) | it | | | +| [toBenchmarkMappingFieldKey should handle benchmark version with dots correctly](x-pack/solutions/security/plugins/cloud_security_posture/server/lib/mapping_field_util.test.ts) | it | | | +| [MAPPING_VERSION_DELIMITER should be an underscore](x-pack/solutions/security/plugins/cloud_security_posture/server/lib/mapping_field_util.test.ts) | it | | | +| [Cloud Security Posture Plugin](x-pack/solutions/security/plugins/cloud_security_posture/server/plugin.test.ts) | describe | | | +| [start()](x-pack/solutions/security/plugins/cloud_security_posture/server/plugin.test.ts) | describe | | | +| [should initialize when package installed](x-pack/solutions/security/plugins/cloud_security_posture/server/plugin.test.ts) | it | | | +| [should not initialize when package is not installed](x-pack/solutions/security/plugins/cloud_security_posture/server/plugin.test.ts) | it | | | +| [should not initialize when other package is created](x-pack/solutions/security/plugins/cloud_security_posture/server/plugin.test.ts) | it | | | +| [packagePolicyPostCreate should return the same received policy](x-pack/solutions/security/plugins/cloud_security_posture/server/plugin.test.ts) | it | | | +| [getSortedCspBenchmarkRules](x-pack/solutions/security/plugins/cloud_security_posture/server/routes/benchmark_rules/find/find.test.ts) | describe | | | +| [sorts by metadata.benchmark.rule_number, invalid semantic version still should still get sorted and empty values should be sorted last](x-pack/solutions/security/plugins/cloud_security_posture/server/routes/benchmark_rules/find/find.test.ts) | it | | | +| [edge case - returns empty array if input is empty](x-pack/solutions/security/plugins/cloud_security_posture/server/routes/benchmark_rules/find/find.test.ts) | it | | | +| [edge case - returns sorted array even if input only has one element](x-pack/solutions/security/plugins/cloud_security_posture/server/routes/benchmark_rules/find/find.test.ts) | it | | | +| [returns sorted array even with undefined or null properties](x-pack/solutions/security/plugins/cloud_security_posture/server/routes/benchmark_rules/find/find.test.ts) | it | | | +| [returns sorted array with invalid semantic versions](x-pack/solutions/security/plugins/cloud_security_posture/server/routes/benchmark_rules/find/find.test.ts) | it | | | +| [benchmarks API](x-pack/solutions/security/plugins/cloud_security_posture/server/routes/benchmarks/benchmarks.test.ts) | describe | | | +| [validate the API route path](x-pack/solutions/security/plugins/cloud_security_posture/server/routes/benchmarks/benchmarks.test.ts) | it | | | +| [should accept to a user with fleet.all privilege](x-pack/solutions/security/plugins/cloud_security_posture/server/routes/benchmarks/benchmarks.test.ts) | it | | | +| [should reject to a user without fleet.all privilege](x-pack/solutions/security/plugins/cloud_security_posture/server/routes/benchmarks/benchmarks.test.ts) | it | | | +| [test input schema](x-pack/solutions/security/plugins/cloud_security_posture/server/routes/benchmarks/benchmarks.test.ts) | describe | | | +| [expect to find default values](x-pack/solutions/security/plugins/cloud_security_posture/server/routes/benchmarks/benchmarks.test.ts) | it | | | +| [expect to find package_policy_name](x-pack/solutions/security/plugins/cloud_security_posture/server/routes/benchmarks/benchmarks.test.ts) | it | | | +| [should throw when page field is not a positive integer](x-pack/solutions/security/plugins/cloud_security_posture/server/routes/benchmarks/benchmarks.test.ts) | it | | | +| [should throw when per_page field is not a positive integer](x-pack/solutions/security/plugins/cloud_security_posture/server/routes/benchmarks/benchmarks.test.ts) | it | | | +| [should throw when sort_field is not string](x-pack/solutions/security/plugins/cloud_security_posture/server/routes/benchmarks/benchmarks.test.ts) | it | | | +| [should not throw when sort_field is a string](x-pack/solutions/security/plugins/cloud_security_posture/server/routes/benchmarks/benchmarks.test.ts) | it | | | +| [should throw when sort_order is not ](x-pack/solutions/security/plugins/cloud_security_posture/server/routes/benchmarks/benchmarks.test.ts) | it | | | +| [should not throw when ](x-pack/solutions/security/plugins/cloud_security_posture/server/routes/benchmarks/benchmarks.test.ts) | it | | | +| [should not throw when ](x-pack/solutions/security/plugins/cloud_security_posture/server/routes/benchmarks/benchmarks.test.ts) | it | | | +| [should not throw when fields is a known string literal](x-pack/solutions/security/plugins/cloud_security_posture/server/routes/benchmarks/benchmarks.test.ts) | it | | | +| [test benchmarks utils](x-pack/solutions/security/plugins/cloud_security_posture/server/routes/benchmarks/benchmarks.test.ts) | describe | | | +| [test getAgentPolicies](x-pack/solutions/security/plugins/cloud_security_posture/server/routes/benchmarks/benchmarks.test.ts) | describe | | | +| [should return one agent policy id when there is duplication](x-pack/solutions/security/plugins/cloud_security_posture/server/routes/benchmarks/benchmarks.test.ts) | it | | | +| [should return full policy ids list when there is no id duplication](x-pack/solutions/security/plugins/cloud_security_posture/server/routes/benchmarks/benchmarks.test.ts) | it | | | +| [test addPackagePolicyCspBenchmarkRule](x-pack/solutions/security/plugins/cloud_security_posture/server/routes/benchmarks/benchmarks.test.ts) | describe | | | +| [should retrieve the rules count by the filtered benchmark type](x-pack/solutions/security/plugins/cloud_security_posture/server/routes/benchmarks/benchmarks.test.ts) | it | | | +| [compliance dashboard permissions API](x-pack/solutions/security/plugins/cloud_security_posture/server/routes/compliance_dashboard/compliance_dashboard.test.ts) | describe | | | +| [should accept to a user with fleet.all privilege](x-pack/solutions/security/plugins/cloud_security_posture/server/routes/compliance_dashboard/compliance_dashboard.test.ts) | it | | | +| [should reject to a user without fleet.all privilege](x-pack/solutions/security/plugins/cloud_security_posture/server/routes/compliance_dashboard/compliance_dashboard.test.ts) | it | | | +| [getBenchmarksFromAggs](x-pack/solutions/security/plugins/cloud_security_posture/server/routes/compliance_dashboard/get_benchmarks.test.ts) | describe | | | +| [should return value matching ComplianceDashboardDataV2["benchmarks"]](x-pack/solutions/security/plugins/cloud_security_posture/server/routes/compliance_dashboard/get_benchmarks.test.ts) | it | | | +| [getClustersFromAggs](x-pack/solutions/security/plugins/cloud_security_posture/server/routes/compliance_dashboard/get_clusters.test.ts) | describe | | | +| [should return value matching ComplianceDashboardData["clusters"]](x-pack/solutions/security/plugins/cloud_security_posture/server/routes/compliance_dashboard/get_clusters.test.ts) | it | | | +| [getPostureStatsFromAggs](x-pack/solutions/security/plugins/cloud_security_posture/server/routes/compliance_dashboard/get_grouped_findings_evaluation.test.ts) | describe | | | +| [should return value matching ComplianceDashboardData["resourcesTypes"]](x-pack/solutions/security/plugins/cloud_security_posture/server/routes/compliance_dashboard/get_grouped_findings_evaluation.test.ts) | it | | | +| [roundScore](x-pack/solutions/security/plugins/cloud_security_posture/server/routes/compliance_dashboard/get_stats.test.ts) | describe | | | +| [should return decimal values with one fraction digit](x-pack/solutions/security/plugins/cloud_security_posture/server/routes/compliance_dashboard/get_stats.test.ts) | it | | | +| [calculatePostureScore](x-pack/solutions/security/plugins/cloud_security_posture/server/routes/compliance_dashboard/get_stats.test.ts) | describe | | | +| [should return calculated posture score](x-pack/solutions/security/plugins/cloud_security_posture/server/routes/compliance_dashboard/get_stats.test.ts) | it | | | +| [getStatsFromFindingsEvaluationsAggs](x-pack/solutions/security/plugins/cloud_security_posture/server/routes/compliance_dashboard/get_stats.test.ts) | describe | | | +| [should throw error in case no findings were found](x-pack/solutions/security/plugins/cloud_security_posture/server/routes/compliance_dashboard/get_stats.test.ts) | it | | | +| [should return value matching ComplianceDashboardData["stats"]](x-pack/solutions/security/plugins/cloud_security_posture/server/routes/compliance_dashboard/get_stats.test.ts) | it | | | +| [checks for stability in case one of the values is zero](x-pack/solutions/security/plugins/cloud_security_posture/server/routes/compliance_dashboard/get_stats.test.ts) | it | | | +| [should return zero on all stats if there are no failed or passed findings](x-pack/solutions/security/plugins/cloud_security_posture/server/routes/compliance_dashboard/get_stats.test.ts) | it | | | +| [getTrendsFromQueryResult](x-pack/solutions/security/plugins/cloud_security_posture/server/routes/compliance_dashboard/get_trends.test.ts) | describe | | | +| [should return value matching Trends type definition, in descending order, and with postureScore](x-pack/solutions/security/plugins/cloud_security_posture/server/routes/compliance_dashboard/get_trends.test.ts) | it | | | +| [calculateIntegrationStatus for cspm](x-pack/solutions/security/plugins/cloud_security_posture/server/routes/status/status.test.ts) | describe | | | +| [Verify status when CSP package is not installed](x-pack/solutions/security/plugins/cloud_security_posture/server/routes/status/status.test.ts) | it | | | +| [Verify status when there are no permission for cspm](x-pack/solutions/security/plugins/cloud_security_posture/server/routes/status/status.test.ts) | it | | | +| [Verify status when there are no findings, no healthy agents and no installed policy templates](x-pack/solutions/security/plugins/cloud_security_posture/server/routes/status/status.test.ts) | it | | | +| [Verify status when there are findings and installed policies but no healthy agents](x-pack/solutions/security/plugins/cloud_security_posture/server/routes/status/status.test.ts) | it | | | +| [Verify status when there are findings ,installed policies and healthy agents](x-pack/solutions/security/plugins/cloud_security_posture/server/routes/status/status.test.ts) | it | | | +| [Verify status when there are no findings ,installed policies and no healthy agents](x-pack/solutions/security/plugins/cloud_security_posture/server/routes/status/status.test.ts) | it | | | +| [Verify status when there are installed policies, healthy agents and no findings](x-pack/solutions/security/plugins/cloud_security_posture/server/routes/status/status.test.ts) | it | | | +| [Verify status when there are installed policies, healthy agents and no findings and been more than 10 minutes](x-pack/solutions/security/plugins/cloud_security_posture/server/routes/status/status.test.ts) | it | | | +| [Verify status when there are installed policies, healthy agents past findings but no recent findings](x-pack/solutions/security/plugins/cloud_security_posture/server/routes/status/status.test.ts) | it | | | +| [calculateIntegrationStatus for vul_mgmt](x-pack/solutions/security/plugins/cloud_security_posture/server/routes/status/status.test.ts) | describe | | | +| [Verify status when there are no permission for vul_mgmt](x-pack/solutions/security/plugins/cloud_security_posture/server/routes/status/status.test.ts) | it | | | +| [Verify status when there are no vul_mgmt findings, no healthy agents and no installed policy templates](x-pack/solutions/security/plugins/cloud_security_posture/server/routes/status/status.test.ts) | it | | | +| [Verify status when there are vul_mgmt findings and installed policies but no healthy agents](x-pack/solutions/security/plugins/cloud_security_posture/server/routes/status/status.test.ts) | it | | | +| [Verify status when there are vul_mgmt findings ,installed policies and healthy agents](x-pack/solutions/security/plugins/cloud_security_posture/server/routes/status/status.test.ts) | it | | | +| [Verify status when there are no vul_mgmt findings ,installed policies and no healthy agents](x-pack/solutions/security/plugins/cloud_security_posture/server/routes/status/status.test.ts) | it | | | +| [Verify status when there are installed policies, healthy agents and no vul_mgmt findings](x-pack/solutions/security/plugins/cloud_security_posture/server/routes/status/status.test.ts) | it | | | +| [Verify status when there are installed policies, healthy agents and no vul_mgmt findings and been more than 10 minutes](x-pack/solutions/security/plugins/cloud_security_posture/server/routes/status/status.test.ts) | it | | | +| [Verify status when there are installed policies, healthy agents and no vul_mgmt findings and been more than 1 hour](x-pack/solutions/security/plugins/cloud_security_posture/server/routes/status/status.test.ts) | it | | | +| [Verify status when there are installed policies, healthy agents past vul_mgmt findings but no recent findings](x-pack/solutions/security/plugins/cloud_security_posture/server/routes/status/status.test.ts) | it | | | +| [finding stats task state](x-pack/solutions/security/plugins/cloud_security_posture/server/tasks/task_state.test.ts) | describe | | | +| [v1](x-pack/solutions/security/plugins/cloud_security_posture/server/tasks/task_state.test.ts) | describe | | | +| [should work on empty object when running the up migration](x-pack/solutions/security/plugins/cloud_security_posture/server/tasks/task_state.test.ts) | it | | | +| [shouldn](x-pack/solutions/security/plugins/cloud_security_posture/server/tasks/task_state.test.ts) | it | | | +| [should drop unknown properties when running the up migration](x-pack/solutions/security/plugins/cloud_security_posture/server/tasks/task_state.test.ts) | it | | | ## Directory: x-pack/test_serverless/api_integration/test_suites/security/cloud_security_posture diff --git a/x-pack/plugins/cloud_security_posture/common/index.ts b/x-pack/solutions/security/plugins/cloud_security_posture/common/index.ts similarity index 100% rename from x-pack/plugins/cloud_security_posture/common/index.ts rename to x-pack/solutions/security/plugins/cloud_security_posture/common/index.ts diff --git a/x-pack/plugins/cloud_security_posture/common/runtime_mappings/get_identifier_runtime_mapping.ts b/x-pack/solutions/security/plugins/cloud_security_posture/common/runtime_mappings/get_identifier_runtime_mapping.ts similarity index 100% rename from x-pack/plugins/cloud_security_posture/common/runtime_mappings/get_identifier_runtime_mapping.ts rename to x-pack/solutions/security/plugins/cloud_security_posture/common/runtime_mappings/get_identifier_runtime_mapping.ts diff --git a/x-pack/plugins/cloud_security_posture/common/runtime_mappings/get_package_policy_id_mapping.ts b/x-pack/solutions/security/plugins/cloud_security_posture/common/runtime_mappings/get_package_policy_id_mapping.ts similarity index 100% rename from x-pack/plugins/cloud_security_posture/common/runtime_mappings/get_package_policy_id_mapping.ts rename to x-pack/solutions/security/plugins/cloud_security_posture/common/runtime_mappings/get_package_policy_id_mapping.ts diff --git a/x-pack/plugins/cloud_security_posture/common/runtime_mappings/get_safe_posture_type_runtime_mapping.ts b/x-pack/solutions/security/plugins/cloud_security_posture/common/runtime_mappings/get_safe_posture_type_runtime_mapping.ts similarity index 100% rename from x-pack/plugins/cloud_security_posture/common/runtime_mappings/get_safe_posture_type_runtime_mapping.ts rename to x-pack/solutions/security/plugins/cloud_security_posture/common/runtime_mappings/get_safe_posture_type_runtime_mapping.ts diff --git a/x-pack/plugins/cloud_security_posture/common/schemas/stats.ts b/x-pack/solutions/security/plugins/cloud_security_posture/common/schemas/stats.ts similarity index 100% rename from x-pack/plugins/cloud_security_posture/common/schemas/stats.ts rename to x-pack/solutions/security/plugins/cloud_security_posture/common/schemas/stats.ts diff --git a/x-pack/plugins/cloud_security_posture/common/scripts/__auto_generated_csp_test_log.json b/x-pack/solutions/security/plugins/cloud_security_posture/common/scripts/__auto_generated_csp_test_log.json similarity index 98% rename from x-pack/plugins/cloud_security_posture/common/scripts/__auto_generated_csp_test_log.json rename to x-pack/solutions/security/plugins/cloud_security_posture/common/scripts/__auto_generated_csp_test_log.json index b2479277f0ee1..2fcada14f0ae3 100644 --- a/x-pack/plugins/cloud_security_posture/common/scripts/__auto_generated_csp_test_log.json +++ b/x-pack/solutions/security/plugins/cloud_security_posture/common/scripts/__auto_generated_csp_test_log.json @@ -230,9 +230,9 @@ ] }, { - "filePath": "x-pack/plugins/cloud_security_posture/common/utils/detection_rules.test.ts", + "filePath": "x-pack/solutions/security/plugins/cloud_security_posture/common/utils/detection_rules.test.ts", "fileName": "detection_rules.test.ts", - "directory": "x-pack/plugins/cloud_security_posture", + "directory": "x-pack/solutions/security/plugins/cloud_security_posture", "tags": [ "UT" ], @@ -498,9 +498,9 @@ ] }, { - "filePath": "x-pack/plugins/cloud_security_posture/common/utils/helpers.test.ts", + "filePath": "x-pack/solutions/security/plugins/cloud_security_posture/common/utils/helpers.test.ts", "fileName": "helpers.test.ts", - "directory": "x-pack/plugins/cloud_security_posture", + "directory": "x-pack/solutions/security/plugins/cloud_security_posture", "tags": [ "UT" ], @@ -894,9 +894,9 @@ ] }, { - "filePath": "x-pack/plugins/cloud_security_posture/common/utils/subscription.test.ts", + "filePath": "x-pack/solutions/security/plugins/cloud_security_posture/common/utils/subscription.test.ts", "fileName": "subscription.test.ts", - "directory": "x-pack/plugins/cloud_security_posture", + "directory": "x-pack/solutions/security/plugins/cloud_security_posture", "tags": [ "UT" ], @@ -994,9 +994,9 @@ ] }, { - "filePath": "x-pack/plugins/cloud_security_posture/public/application/csp_router.test.tsx", + "filePath": "x-pack/solutions/security/plugins/cloud_security_posture/public/application/csp_router.test.tsx", "fileName": "csp_router.test.tsx", - "directory": "x-pack/plugins/cloud_security_posture", + "directory": "x-pack/solutions/security/plugins/cloud_security_posture", "tags": [ "UT" ], @@ -1289,9 +1289,9 @@ ] }, { - "filePath": "x-pack/plugins/cloud_security_posture/public/common/hooks/use_benchmark_dynamic_values.test.ts", + "filePath": "x-pack/solutions/security/plugins/cloud_security_posture/public/common/hooks/use_benchmark_dynamic_values.test.ts", "fileName": "use_benchmark_dynamic_values.test.ts", - "directory": "x-pack/plugins/cloud_security_posture", + "directory": "x-pack/solutions/security/plugins/cloud_security_posture", "tags": [ "UT" ], @@ -1368,9 +1368,9 @@ ] }, { - "filePath": "x-pack/plugins/cloud_security_posture/public/common/hooks/use_navigate_findings.test.ts", + "filePath": "x-pack/solutions/security/plugins/cloud_security_posture/public/common/hooks/use_navigate_findings.test.ts", "fileName": "use_navigate_findings.test.ts", - "directory": "x-pack/plugins/cloud_security_posture", + "directory": "x-pack/solutions/security/plugins/cloud_security_posture", "tags": [ "UT" ], @@ -1468,9 +1468,9 @@ ] }, { - "filePath": "x-pack/plugins/cloud_security_posture/public/common/hooks/use_url_query.test.ts", + "filePath": "x-pack/solutions/security/plugins/cloud_security_posture/public/common/hooks/use_url_query.test.ts", "fileName": "use_url_query.test.ts", - "directory": "x-pack/plugins/cloud_security_posture", + "directory": "x-pack/solutions/security/plugins/cloud_security_posture", "tags": [ "UT" ], @@ -1547,9 +1547,9 @@ ] }, { - "filePath": "x-pack/plugins/cloud_security_posture/public/common/navigation/security_solution_links.test.ts", + "filePath": "x-pack/solutions/security/plugins/cloud_security_posture/public/common/navigation/security_solution_links.test.ts", "fileName": "security_solution_links.test.ts", - "directory": "x-pack/plugins/cloud_security_posture", + "directory": "x-pack/solutions/security/plugins/cloud_security_posture", "tags": [ "UT" ], @@ -1605,9 +1605,9 @@ ] }, { - "filePath": "x-pack/plugins/cloud_security_posture/public/common/utils/get_abbreviated_number.test.ts", + "filePath": "x-pack/solutions/security/plugins/cloud_security_posture/public/common/utils/get_abbreviated_number.test.ts", "fileName": "get_abbreviated_number.test.ts", - "directory": "x-pack/plugins/cloud_security_posture", + "directory": "x-pack/solutions/security/plugins/cloud_security_posture", "tags": [ "UT" ], @@ -1705,9 +1705,9 @@ ] }, { - "filePath": "x-pack/plugins/cloud_security_posture/public/common/utils/get_vulnerabiltity_colors.test.ts", + "filePath": "x-pack/solutions/security/plugins/cloud_security_posture/public/common/utils/get_vulnerabiltity_colors.test.ts", "fileName": "get_vulnerabiltity_colors.test.ts", - "directory": "x-pack/plugins/cloud_security_posture", + "directory": "x-pack/solutions/security/plugins/cloud_security_posture", "tags": [ "UT" ], @@ -1975,9 +1975,9 @@ ] }, { - "filePath": "x-pack/plugins/cloud_security_posture/public/components/accounts_evaluated_widget.test.tsx", + "filePath": "x-pack/solutions/security/plugins/cloud_security_posture/public/components/accounts_evaluated_widget.test.tsx", "fileName": "accounts_evaluated_widget.test.tsx", - "directory": "x-pack/plugins/cloud_security_posture", + "directory": "x-pack/solutions/security/plugins/cloud_security_posture", "tags": [ "UT" ], @@ -2075,9 +2075,9 @@ ] }, { - "filePath": "x-pack/plugins/cloud_security_posture/public/components/chart_panel.test.tsx", + "filePath": "x-pack/solutions/security/plugins/cloud_security_posture/public/components/chart_panel.test.tsx", "fileName": "chart_panel.test.tsx", - "directory": "x-pack/plugins/cloud_security_posture", + "directory": "x-pack/solutions/security/plugins/cloud_security_posture", "tags": [ "UT" ], @@ -2175,9 +2175,9 @@ ] }, { - "filePath": "x-pack/plugins/cloud_security_posture/public/components/cloud_posture_page.test.tsx", + "filePath": "x-pack/solutions/security/plugins/cloud_security_posture/public/components/cloud_posture_page.test.tsx", "fileName": "cloud_posture_page.test.tsx", - "directory": "x-pack/plugins/cloud_security_posture", + "directory": "x-pack/solutions/security/plugins/cloud_security_posture", "tags": [ "UT" ], @@ -2380,9 +2380,9 @@ ] }, { - "filePath": "x-pack/plugins/cloud_security_posture/public/components/cloud_security_data_table/cloud_security_data_table.test.tsx", + "filePath": "x-pack/solutions/security/plugins/cloud_security_posture/public/components/cloud_security_data_table/cloud_security_data_table.test.tsx", "fileName": "cloud_security_data_table.test.tsx", - "directory": "x-pack/plugins/cloud_security_posture", + "directory": "x-pack/solutions/security/plugins/cloud_security_posture", "tags": [ "UT" ], @@ -2522,9 +2522,9 @@ ] }, { - "filePath": "x-pack/plugins/cloud_security_posture/public/components/cloud_security_data_table/fields_selector/fields_selector_table.test.tsx", + "filePath": "x-pack/solutions/security/plugins/cloud_security_posture/public/components/cloud_security_data_table/fields_selector/fields_selector_table.test.tsx", "fileName": "fields_selector_table.test.tsx", - "directory": "x-pack/plugins/cloud_security_posture", + "directory": "x-pack/solutions/security/plugins/cloud_security_posture", "tags": [ "UT" ], @@ -2836,9 +2836,9 @@ ] }, { - "filePath": "x-pack/plugins/cloud_security_posture/public/components/cloud_security_grouping/utils/first_non_null_value.test.ts", + "filePath": "x-pack/solutions/security/plugins/cloud_security_posture/public/components/cloud_security_grouping/utils/first_non_null_value.test.ts", "fileName": "first_non_null_value.test.ts", - "directory": "x-pack/plugins/cloud_security_posture", + "directory": "x-pack/solutions/security/plugins/cloud_security_posture", "tags": [ "UT" ], @@ -2999,9 +2999,9 @@ ] }, { - "filePath": "x-pack/plugins/cloud_security_posture/public/components/detection_rule_counter.test.tsx", + "filePath": "x-pack/solutions/security/plugins/cloud_security_posture/public/components/detection_rule_counter.test.tsx", "fileName": "detection_rule_counter.test.tsx", - "directory": "x-pack/plugins/cloud_security_posture", + "directory": "x-pack/solutions/security/plugins/cloud_security_posture", "tags": [ "UT" ], @@ -3120,9 +3120,9 @@ ] }, { - "filePath": "x-pack/plugins/cloud_security_posture/public/components/fleet_extensions/policy_template_form.test.tsx", + "filePath": "x-pack/solutions/security/plugins/cloud_security_posture/public/components/fleet_extensions/policy_template_form.test.tsx", "fileName": "policy_template_form.test.tsx", - "directory": "x-pack/plugins/cloud_security_posture", + "directory": "x-pack/solutions/security/plugins/cloud_security_posture", "tags": [ "UT", "HAS SKIP" @@ -4747,9 +4747,9 @@ ] }, { - "filePath": "x-pack/plugins/cloud_security_posture/public/components/fleet_extensions/setup_technology_selector/use_setup_technology.test.ts", + "filePath": "x-pack/solutions/security/plugins/cloud_security_posture/public/components/fleet_extensions/setup_technology_selector/use_setup_technology.test.ts", "fileName": "use_setup_technology.test.ts", - "directory": "x-pack/plugins/cloud_security_posture", + "directory": "x-pack/solutions/security/plugins/cloud_security_posture", "tags": [ "UT" ], @@ -5061,9 +5061,9 @@ ] }, { - "filePath": "x-pack/plugins/cloud_security_posture/public/components/fleet_extensions/utils.test.ts", + "filePath": "x-pack/solutions/security/plugins/cloud_security_posture/public/components/fleet_extensions/utils.test.ts", "fileName": "utils.test.ts", - "directory": "x-pack/plugins/cloud_security_posture", + "directory": "x-pack/solutions/security/plugins/cloud_security_posture", "tags": [ "UT" ], @@ -5784,9 +5784,9 @@ ] }, { - "filePath": "x-pack/plugins/cloud_security_posture/public/components/no_findings_states/no_findings_states.test.tsx", + "filePath": "x-pack/solutions/security/plugins/cloud_security_posture/public/components/no_findings_states/no_findings_states.test.tsx", "fileName": "no_findings_states.test.tsx", - "directory": "x-pack/plugins/cloud_security_posture", + "directory": "x-pack/solutions/security/plugins/cloud_security_posture", "tags": [ "UT" ], @@ -5968,9 +5968,9 @@ ] }, { - "filePath": "x-pack/plugins/cloud_security_posture/public/pages/benchmarks/benchmarks_table.test.tsx", + "filePath": "x-pack/solutions/security/plugins/cloud_security_posture/public/pages/benchmarks/benchmarks_table.test.tsx", "fileName": "benchmarks_table.test.tsx", - "directory": "x-pack/plugins/cloud_security_posture", + "directory": "x-pack/solutions/security/plugins/cloud_security_posture", "tags": [ "UT" ], @@ -6110,9 +6110,9 @@ ] }, { - "filePath": "x-pack/plugins/cloud_security_posture/public/pages/benchmarks/benchmarks.test.tsx", + "filePath": "x-pack/solutions/security/plugins/cloud_security_posture/public/pages/benchmarks/benchmarks.test.tsx", "fileName": "benchmarks.test.tsx", - "directory": "x-pack/plugins/cloud_security_posture", + "directory": "x-pack/solutions/security/plugins/cloud_security_posture", "tags": [ "UT" ], @@ -6231,9 +6231,9 @@ ] }, { - "filePath": "x-pack/plugins/cloud_security_posture/public/pages/compliance_dashboard/compliance_charts/risks_table.test.ts", + "filePath": "x-pack/solutions/security/plugins/cloud_security_posture/public/pages/compliance_dashboard/compliance_charts/risks_table.test.ts", "fileName": "risks_table.test.ts", - "directory": "x-pack/plugins/cloud_security_posture", + "directory": "x-pack/solutions/security/plugins/cloud_security_posture", "tags": [ "UT" ], @@ -6310,9 +6310,9 @@ ] }, { - "filePath": "x-pack/plugins/cloud_security_posture/public/pages/compliance_dashboard/compliance_dashboard.test.tsx", + "filePath": "x-pack/solutions/security/plugins/cloud_security_posture/public/pages/compliance_dashboard/compliance_dashboard.test.tsx", "fileName": "compliance_dashboard.test.tsx", - "directory": "x-pack/plugins/cloud_security_posture", + "directory": "x-pack/solutions/security/plugins/cloud_security_posture", "tags": [ "UT" ], @@ -6832,9 +6832,9 @@ ] }, { - "filePath": "x-pack/plugins/cloud_security_posture/public/pages/compliance_dashboard/dashboard_sections/benchmarks_section.test.tsx", + "filePath": "x-pack/solutions/security/plugins/cloud_security_posture/public/pages/compliance_dashboard/dashboard_sections/benchmarks_section.test.tsx", "fileName": "benchmarks_section.test.tsx", - "directory": "x-pack/plugins/cloud_security_posture", + "directory": "x-pack/solutions/security/plugins/cloud_security_posture", "tags": [ "UT" ], @@ -6934,9 +6934,9 @@ ] }, { - "filePath": "x-pack/plugins/cloud_security_posture/public/pages/compliance_dashboard/dashboard_sections/summary_section.test.tsx", + "filePath": "x-pack/solutions/security/plugins/cloud_security_posture/public/pages/compliance_dashboard/dashboard_sections/summary_section.test.tsx", "fileName": "summary_section.test.tsx", - "directory": "x-pack/plugins/cloud_security_posture", + "directory": "x-pack/solutions/security/plugins/cloud_security_posture", "tags": [ "UT" ], @@ -7034,9 +7034,9 @@ ] }, { - "filePath": "x-pack/plugins/cloud_security_posture/public/pages/configurations/configurations.test.tsx", + "filePath": "x-pack/solutions/security/plugins/cloud_security_posture/public/pages/configurations/configurations.test.tsx", "fileName": "configurations.test.tsx", - "directory": "x-pack/plugins/cloud_security_posture", + "directory": "x-pack/solutions/security/plugins/cloud_security_posture", "tags": [ "UT" ], @@ -7285,9 +7285,9 @@ ] }, { - "filePath": "x-pack/plugins/cloud_security_posture/public/pages/configurations/findings_flyout/findings_flyout.test.tsx", + "filePath": "x-pack/solutions/security/plugins/cloud_security_posture/public/pages/configurations/findings_flyout/findings_flyout.test.tsx", "fileName": "findings_flyout.test.tsx", - "directory": "x-pack/plugins/cloud_security_posture", + "directory": "x-pack/solutions/security/plugins/cloud_security_posture", "tags": [ "UT" ], @@ -7666,9 +7666,9 @@ ] }, { - "filePath": "x-pack/plugins/cloud_security_posture/public/pages/configurations/utils/get_filters.test.ts", + "filePath": "x-pack/solutions/security/plugins/cloud_security_posture/public/pages/configurations/utils/get_filters.test.ts", "fileName": "get_filters.test.ts", - "directory": "x-pack/plugins/cloud_security_posture", + "directory": "x-pack/solutions/security/plugins/cloud_security_posture", "tags": [ "UT" ], @@ -7724,9 +7724,9 @@ ] }, { - "filePath": "x-pack/plugins/cloud_security_posture/public/pages/rules/rules_container.test.tsx", + "filePath": "x-pack/solutions/security/plugins/cloud_security_posture/public/pages/rules/rules_container.test.tsx", "fileName": "rules_container.test.tsx", - "directory": "x-pack/plugins/cloud_security_posture", + "directory": "x-pack/solutions/security/plugins/cloud_security_posture", "tags": [ "UT" ], @@ -7782,9 +7782,9 @@ ] }, { - "filePath": "x-pack/plugins/cloud_security_posture/public/pages/rules/rules.test.tsx", + "filePath": "x-pack/solutions/security/plugins/cloud_security_posture/public/pages/rules/rules.test.tsx", "fileName": "rules.test.tsx", - "directory": "x-pack/plugins/cloud_security_posture", + "directory": "x-pack/solutions/security/plugins/cloud_security_posture", "tags": [ "UT" ], @@ -7861,9 +7861,9 @@ ] }, { - "filePath": "x-pack/plugins/cloud_security_posture/public/pages/rules/use_change_csp_rule_state.test.tsx", + "filePath": "x-pack/solutions/security/plugins/cloud_security_posture/public/pages/rules/use_change_csp_rule_state.test.tsx", "fileName": "use_change_csp_rule_state.test.tsx", - "directory": "x-pack/plugins/cloud_security_posture", + "directory": "x-pack/solutions/security/plugins/cloud_security_posture", "tags": [ "UT" ], @@ -8024,9 +8024,9 @@ ] }, { - "filePath": "x-pack/plugins/cloud_security_posture/public/pages/vulnerabilities/vulnerabilities_finding_flyout/vulnerability_finding_flyout.test.tsx", + "filePath": "x-pack/solutions/security/plugins/cloud_security_posture/public/pages/vulnerabilities/vulnerabilities_finding_flyout/vulnerability_finding_flyout.test.tsx", "fileName": "vulnerability_finding_flyout.test.tsx", - "directory": "x-pack/plugins/cloud_security_posture", + "directory": "x-pack/solutions/security/plugins/cloud_security_posture", "tags": [ "UT", "HAS SKIP" @@ -8280,9 +8280,9 @@ ] }, { - "filePath": "x-pack/plugins/cloud_security_posture/public/pages/vulnerabilities/vulnerabilties.test.tsx", + "filePath": "x-pack/solutions/security/plugins/cloud_security_posture/public/pages/vulnerabilities/vulnerabilties.test.tsx", "fileName": "vulnerabilties.test.tsx", - "directory": "x-pack/plugins/cloud_security_posture", + "directory": "x-pack/solutions/security/plugins/cloud_security_posture", "tags": [ "UT" ], @@ -8422,9 +8422,9 @@ ] }, { - "filePath": "x-pack/plugins/cloud_security_posture/public/pages/vulnerability_dashboard/vulnerability_dashboard.test.tsx", + "filePath": "x-pack/solutions/security/plugins/cloud_security_posture/public/pages/vulnerability_dashboard/vulnerability_dashboard.test.tsx", "fileName": "vulnerability_dashboard.test.tsx", - "directory": "x-pack/plugins/cloud_security_posture", + "directory": "x-pack/solutions/security/plugins/cloud_security_posture", "tags": [ "UT" ], @@ -8585,9 +8585,9 @@ ] }, { - "filePath": "x-pack/plugins/cloud_security_posture/server/create_indices/create_indices.test.ts", + "filePath": "x-pack/solutions/security/plugins/cloud_security_posture/server/create_indices/create_indices.test.ts", "fileName": "create_indices.test.ts", - "directory": "x-pack/plugins/cloud_security_posture", + "directory": "x-pack/solutions/security/plugins/cloud_security_posture", "tags": [ "UT" ], @@ -8727,9 +8727,9 @@ ] }, { - "filePath": "x-pack/plugins/cloud_security_posture/server/create_transforms/create_transforms.test.ts", + "filePath": "x-pack/solutions/security/plugins/cloud_security_posture/server/create_transforms/create_transforms.test.ts", "fileName": "create_transforms.test.ts", - "directory": "x-pack/plugins/cloud_security_posture", + "directory": "x-pack/solutions/security/plugins/cloud_security_posture", "tags": [ "UT" ], @@ -8934,9 +8934,9 @@ ] }, { - "filePath": "x-pack/plugins/cloud_security_posture/server/lib/mapping_field_util.test.ts", + "filePath": "x-pack/solutions/security/plugins/cloud_security_posture/server/lib/mapping_field_util.test.ts", "fileName": "mapping_field_util.test.ts", - "directory": "x-pack/plugins/cloud_security_posture", + "directory": "x-pack/solutions/security/plugins/cloud_security_posture", "tags": [ "UT" ], @@ -9076,9 +9076,9 @@ ] }, { - "filePath": "x-pack/plugins/cloud_security_posture/server/plugin.test.ts", + "filePath": "x-pack/solutions/security/plugins/cloud_security_posture/server/plugin.test.ts", "fileName": "plugin.test.ts", - "directory": "x-pack/plugins/cloud_security_posture", + "directory": "x-pack/solutions/security/plugins/cloud_security_posture", "tags": [ "UT" ], @@ -9220,9 +9220,9 @@ ] }, { - "filePath": "x-pack/plugins/cloud_security_posture/server/routes/benchmark_rules/find/find.test.ts", + "filePath": "x-pack/solutions/security/plugins/cloud_security_posture/server/routes/benchmark_rules/find/find.test.ts", "fileName": "find.test.ts", - "directory": "x-pack/plugins/cloud_security_posture", + "directory": "x-pack/solutions/security/plugins/cloud_security_posture", "tags": [ "UT" ], @@ -9362,9 +9362,9 @@ ] }, { - "filePath": "x-pack/plugins/cloud_security_posture/server/routes/benchmarks/benchmarks.test.ts", + "filePath": "x-pack/solutions/security/plugins/cloud_security_posture/server/routes/benchmarks/benchmarks.test.ts", "fileName": "benchmarks.test.ts", - "directory": "x-pack/plugins/cloud_security_posture", + "directory": "x-pack/solutions/security/plugins/cloud_security_posture", "tags": [ "UT" ], @@ -9827,9 +9827,9 @@ ] }, { - "filePath": "x-pack/plugins/cloud_security_posture/server/routes/compliance_dashboard/compliance_dashboard.test.ts", + "filePath": "x-pack/solutions/security/plugins/cloud_security_posture/server/routes/compliance_dashboard/compliance_dashboard.test.ts", "fileName": "compliance_dashboard.test.ts", - "directory": "x-pack/plugins/cloud_security_posture", + "directory": "x-pack/solutions/security/plugins/cloud_security_posture", "tags": [ "UT" ], @@ -9906,9 +9906,9 @@ ] }, { - "filePath": "x-pack/plugins/cloud_security_posture/server/routes/compliance_dashboard/get_benchmarks.test.ts", + "filePath": "x-pack/solutions/security/plugins/cloud_security_posture/server/routes/compliance_dashboard/get_benchmarks.test.ts", "fileName": "get_benchmarks.test.ts", - "directory": "x-pack/plugins/cloud_security_posture", + "directory": "x-pack/solutions/security/plugins/cloud_security_posture", "tags": [ "UT" ], @@ -9964,9 +9964,9 @@ ] }, { - "filePath": "x-pack/plugins/cloud_security_posture/server/routes/compliance_dashboard/get_clusters.test.ts", + "filePath": "x-pack/solutions/security/plugins/cloud_security_posture/server/routes/compliance_dashboard/get_clusters.test.ts", "fileName": "get_clusters.test.ts", - "directory": "x-pack/plugins/cloud_security_posture", + "directory": "x-pack/solutions/security/plugins/cloud_security_posture", "tags": [ "UT" ], @@ -10022,9 +10022,9 @@ ] }, { - "filePath": "x-pack/plugins/cloud_security_posture/server/routes/compliance_dashboard/get_grouped_findings_evaluation.test.ts", + "filePath": "x-pack/solutions/security/plugins/cloud_security_posture/server/routes/compliance_dashboard/get_grouped_findings_evaluation.test.ts", "fileName": "get_grouped_findings_evaluation.test.ts", - "directory": "x-pack/plugins/cloud_security_posture", + "directory": "x-pack/solutions/security/plugins/cloud_security_posture", "tags": [ "UT" ], @@ -10080,9 +10080,9 @@ ] }, { - "filePath": "x-pack/plugins/cloud_security_posture/server/routes/compliance_dashboard/get_stats.test.ts", + "filePath": "x-pack/solutions/security/plugins/cloud_security_posture/server/routes/compliance_dashboard/get_stats.test.ts", "fileName": "get_stats.test.ts", - "directory": "x-pack/plugins/cloud_security_posture", + "directory": "x-pack/solutions/security/plugins/cloud_security_posture", "tags": [ "UT" ], @@ -10289,9 +10289,9 @@ ] }, { - "filePath": "x-pack/plugins/cloud_security_posture/server/routes/compliance_dashboard/get_trends.test.ts", + "filePath": "x-pack/solutions/security/plugins/cloud_security_posture/server/routes/compliance_dashboard/get_trends.test.ts", "fileName": "get_trends.test.ts", - "directory": "x-pack/plugins/cloud_security_posture", + "directory": "x-pack/solutions/security/plugins/cloud_security_posture", "tags": [ "UT" ], @@ -10347,9 +10347,9 @@ ] }, { - "filePath": "x-pack/plugins/cloud_security_posture/server/routes/status/status.test.ts", + "filePath": "x-pack/solutions/security/plugins/cloud_security_posture/server/routes/status/status.test.ts", "fileName": "status.test.ts", - "directory": "x-pack/plugins/cloud_security_posture", + "directory": "x-pack/solutions/security/plugins/cloud_security_posture", "tags": [ "UT" ], @@ -10785,9 +10785,9 @@ ] }, { - "filePath": "x-pack/plugins/cloud_security_posture/server/tasks/task_state.test.ts", + "filePath": "x-pack/solutions/security/plugins/cloud_security_posture/server/tasks/task_state.test.ts", "fileName": "task_state.test.ts", - "directory": "x-pack/plugins/cloud_security_posture", + "directory": "x-pack/solutions/security/plugins/cloud_security_posture", "tags": [ "UT" ], diff --git a/x-pack/plugins/cloud_security_posture/common/scripts/get_tests.js b/x-pack/solutions/security/plugins/cloud_security_posture/common/scripts/get_tests.js similarity index 98% rename from x-pack/plugins/cloud_security_posture/common/scripts/get_tests.js rename to x-pack/solutions/security/plugins/cloud_security_posture/common/scripts/get_tests.js index d23498b24bd86..e44cd96a659a3 100644 --- a/x-pack/plugins/cloud_security_posture/common/scripts/get_tests.js +++ b/x-pack/solutions/security/plugins/cloud_security_posture/common/scripts/get_tests.js @@ -32,7 +32,7 @@ const FTR_CSP_API = 'x-pack/test/cloud_security_posture_api'; const FTR_CSP_FUNCTIONAL = 'x-pack/test/cloud_security_posture_functional'; // Unit tests -const UNIT_TEST_CSP = 'x-pack/plugins/cloud_security_posture'; +const UNIT_TEST_CSP = 'x-pack/solutions/security/plugins/cloud_security_posture'; // KBN Package const KBN_CSP_PACKAGE = 'x-pack/packages/kbn-cloud-security-posture'; @@ -51,7 +51,7 @@ const directoryPaths = [ // Output directories and file paths const MD_FILE_PATH = path.join( - 'x-pack/plugins/cloud_security_posture/common/dev_docs', + 'x-pack/solutions/security/plugins/cloud_security_posture/common/dev_docs', '__auto_generated_csp_requirements_test_coverage.md' ); const CSP_TEST_LOGS_FILE_PATH = path.join(__dirname, '__auto_generated_csp_test_log.json'); diff --git a/x-pack/plugins/cloud_security_posture/common/types/benchmarks/v1.ts b/x-pack/solutions/security/plugins/cloud_security_posture/common/types/benchmarks/v1.ts similarity index 100% rename from x-pack/plugins/cloud_security_posture/common/types/benchmarks/v1.ts rename to x-pack/solutions/security/plugins/cloud_security_posture/common/types/benchmarks/v1.ts diff --git a/x-pack/plugins/cloud_security_posture/common/types/benchmarks/v2.ts b/x-pack/solutions/security/plugins/cloud_security_posture/common/types/benchmarks/v2.ts similarity index 100% rename from x-pack/plugins/cloud_security_posture/common/types/benchmarks/v2.ts rename to x-pack/solutions/security/plugins/cloud_security_posture/common/types/benchmarks/v2.ts diff --git a/x-pack/plugins/cloud_security_posture/common/types/index.ts b/x-pack/solutions/security/plugins/cloud_security_posture/common/types/index.ts similarity index 100% rename from x-pack/plugins/cloud_security_posture/common/types/index.ts rename to x-pack/solutions/security/plugins/cloud_security_posture/common/types/index.ts diff --git a/x-pack/plugins/cloud_security_posture/common/types/latest.ts b/x-pack/solutions/security/plugins/cloud_security_posture/common/types/latest.ts similarity index 100% rename from x-pack/plugins/cloud_security_posture/common/types/latest.ts rename to x-pack/solutions/security/plugins/cloud_security_posture/common/types/latest.ts diff --git a/x-pack/plugins/cloud_security_posture/common/types_old.ts b/x-pack/solutions/security/plugins/cloud_security_posture/common/types_old.ts similarity index 100% rename from x-pack/plugins/cloud_security_posture/common/types_old.ts rename to x-pack/solutions/security/plugins/cloud_security_posture/common/types_old.ts diff --git a/x-pack/plugins/cloud_security_posture/common/utils/detection_rules.test.ts b/x-pack/solutions/security/plugins/cloud_security_posture/common/utils/detection_rules.test.ts similarity index 100% rename from x-pack/plugins/cloud_security_posture/common/utils/detection_rules.test.ts rename to x-pack/solutions/security/plugins/cloud_security_posture/common/utils/detection_rules.test.ts diff --git a/x-pack/plugins/cloud_security_posture/common/utils/detection_rules.ts b/x-pack/solutions/security/plugins/cloud_security_posture/common/utils/detection_rules.ts similarity index 100% rename from x-pack/plugins/cloud_security_posture/common/utils/detection_rules.ts rename to x-pack/solutions/security/plugins/cloud_security_posture/common/utils/detection_rules.ts diff --git a/x-pack/plugins/cloud_security_posture/common/utils/helpers.test.ts b/x-pack/solutions/security/plugins/cloud_security_posture/common/utils/helpers.test.ts similarity index 100% rename from x-pack/plugins/cloud_security_posture/common/utils/helpers.test.ts rename to x-pack/solutions/security/plugins/cloud_security_posture/common/utils/helpers.test.ts diff --git a/x-pack/plugins/cloud_security_posture/common/utils/helpers.ts b/x-pack/solutions/security/plugins/cloud_security_posture/common/utils/helpers.ts similarity index 100% rename from x-pack/plugins/cloud_security_posture/common/utils/helpers.ts rename to x-pack/solutions/security/plugins/cloud_security_posture/common/utils/helpers.ts diff --git a/x-pack/plugins/cloud_security_posture/common/utils/rules_states.ts b/x-pack/solutions/security/plugins/cloud_security_posture/common/utils/rules_states.ts similarity index 100% rename from x-pack/plugins/cloud_security_posture/common/utils/rules_states.ts rename to x-pack/solutions/security/plugins/cloud_security_posture/common/utils/rules_states.ts diff --git a/x-pack/plugins/cloud_security_posture/common/utils/subscription.test.ts b/x-pack/solutions/security/plugins/cloud_security_posture/common/utils/subscription.test.ts similarity index 100% rename from x-pack/plugins/cloud_security_posture/common/utils/subscription.test.ts rename to x-pack/solutions/security/plugins/cloud_security_posture/common/utils/subscription.test.ts diff --git a/x-pack/plugins/cloud_security_posture/common/utils/subscription.ts b/x-pack/solutions/security/plugins/cloud_security_posture/common/utils/subscription.ts similarity index 100% rename from x-pack/plugins/cloud_security_posture/common/utils/subscription.ts rename to x-pack/solutions/security/plugins/cloud_security_posture/common/utils/subscription.ts diff --git a/x-pack/plugins/cloud_security_posture/jest.config.js b/x-pack/solutions/security/plugins/cloud_security_posture/jest.config.js similarity index 80% rename from x-pack/plugins/cloud_security_posture/jest.config.js rename to x-pack/solutions/security/plugins/cloud_security_posture/jest.config.js index 82ecbd0c85592..630c9292dd304 100644 --- a/x-pack/plugins/cloud_security_posture/jest.config.js +++ b/x-pack/solutions/security/plugins/cloud_security_posture/jest.config.js @@ -8,12 +8,13 @@ /** @type {import('@jest/types').Config.InitialOptions} */ module.exports = { preset: '@kbn/test', - rootDir: '../../..', - roots: ['/x-pack/plugins/cloud_security_posture'], - coverageDirectory: '/target/kibana-coverage/jest/x-pack/plugins/cloud_security_posture', + rootDir: '../../../../..', + roots: ['/x-pack/solutions/security/plugins/cloud_security_posture'], + coverageDirectory: + '/target/kibana-coverage/jest/x-pack/solutions/security/plugins/cloud_security_posture', coverageReporters: ['text', 'html'], collectCoverageFrom: [ - '/x-pack/plugins/cloud_security_posture/{common,public,server}/**/*.{ts,tsx}', + '/x-pack/solutions/security/plugins/cloud_security_posture/{common,public,server}/**/*.{ts,tsx}', ], // An array of regexp pattern strings that are matched against all source file paths, matched files will skip transformation transformIgnorePatterns: [ diff --git a/x-pack/plugins/cloud_security_posture/kibana.jsonc b/x-pack/solutions/security/plugins/cloud_security_posture/kibana.jsonc similarity index 100% rename from x-pack/plugins/cloud_security_posture/kibana.jsonc rename to x-pack/solutions/security/plugins/cloud_security_posture/kibana.jsonc diff --git a/x-pack/plugins/cloud_security_posture/public/application/csp_route.tsx b/x-pack/solutions/security/plugins/cloud_security_posture/public/application/csp_route.tsx similarity index 100% rename from x-pack/plugins/cloud_security_posture/public/application/csp_route.tsx rename to x-pack/solutions/security/plugins/cloud_security_posture/public/application/csp_route.tsx diff --git a/x-pack/plugins/cloud_security_posture/public/application/csp_router.test.tsx b/x-pack/solutions/security/plugins/cloud_security_posture/public/application/csp_router.test.tsx similarity index 100% rename from x-pack/plugins/cloud_security_posture/public/application/csp_router.test.tsx rename to x-pack/solutions/security/plugins/cloud_security_posture/public/application/csp_router.test.tsx diff --git a/x-pack/plugins/cloud_security_posture/public/application/csp_router.tsx b/x-pack/solutions/security/plugins/cloud_security_posture/public/application/csp_router.tsx similarity index 100% rename from x-pack/plugins/cloud_security_posture/public/application/csp_router.tsx rename to x-pack/solutions/security/plugins/cloud_security_posture/public/application/csp_router.tsx diff --git a/x-pack/plugins/cloud_security_posture/public/application/security_solution_context.ts b/x-pack/solutions/security/plugins/cloud_security_posture/public/application/security_solution_context.ts similarity index 100% rename from x-pack/plugins/cloud_security_posture/public/application/security_solution_context.ts rename to x-pack/solutions/security/plugins/cloud_security_posture/public/application/security_solution_context.ts diff --git a/x-pack/plugins/cloud_security_posture/public/application/setup_context.ts b/x-pack/solutions/security/plugins/cloud_security_posture/public/application/setup_context.ts similarity index 100% rename from x-pack/plugins/cloud_security_posture/public/application/setup_context.ts rename to x-pack/solutions/security/plugins/cloud_security_posture/public/application/setup_context.ts diff --git a/x-pack/plugins/cloud_security_posture/public/assets/icons/cis_aks_logo.svg b/x-pack/solutions/security/plugins/cloud_security_posture/public/assets/icons/cis_aks_logo.svg similarity index 100% rename from x-pack/plugins/cloud_security_posture/public/assets/icons/cis_aks_logo.svg rename to x-pack/solutions/security/plugins/cloud_security_posture/public/assets/icons/cis_aks_logo.svg diff --git a/x-pack/plugins/cloud_security_posture/public/assets/icons/cis_eks_logo.svg b/x-pack/solutions/security/plugins/cloud_security_posture/public/assets/icons/cis_eks_logo.svg similarity index 100% rename from x-pack/plugins/cloud_security_posture/public/assets/icons/cis_eks_logo.svg rename to x-pack/solutions/security/plugins/cloud_security_posture/public/assets/icons/cis_eks_logo.svg diff --git a/x-pack/plugins/cloud_security_posture/public/assets/icons/cis_gke_logo.svg b/x-pack/solutions/security/plugins/cloud_security_posture/public/assets/icons/cis_gke_logo.svg similarity index 100% rename from x-pack/plugins/cloud_security_posture/public/assets/icons/cis_gke_logo.svg rename to x-pack/solutions/security/plugins/cloud_security_posture/public/assets/icons/cis_gke_logo.svg diff --git a/x-pack/plugins/cloud_security_posture/public/assets/icons/cis_logo.svg b/x-pack/solutions/security/plugins/cloud_security_posture/public/assets/icons/cis_logo.svg similarity index 100% rename from x-pack/plugins/cloud_security_posture/public/assets/icons/cis_logo.svg rename to x-pack/solutions/security/plugins/cloud_security_posture/public/assets/icons/cis_logo.svg diff --git a/x-pack/plugins/cloud_security_posture/public/assets/icons/google_cloud_logo.svg b/x-pack/solutions/security/plugins/cloud_security_posture/public/assets/icons/google_cloud_logo.svg similarity index 100% rename from x-pack/plugins/cloud_security_posture/public/assets/icons/google_cloud_logo.svg rename to x-pack/solutions/security/plugins/cloud_security_posture/public/assets/icons/google_cloud_logo.svg diff --git a/x-pack/plugins/cloud_security_posture/public/assets/icons/nvd_logo_svg.tsx b/x-pack/solutions/security/plugins/cloud_security_posture/public/assets/icons/nvd_logo_svg.tsx similarity index 100% rename from x-pack/plugins/cloud_security_posture/public/assets/icons/nvd_logo_svg.tsx rename to x-pack/solutions/security/plugins/cloud_security_posture/public/assets/icons/nvd_logo_svg.tsx diff --git a/x-pack/plugins/cloud_security_posture/public/assets/icons/redhat_logo.svg b/x-pack/solutions/security/plugins/cloud_security_posture/public/assets/icons/redhat_logo.svg similarity index 100% rename from x-pack/plugins/cloud_security_posture/public/assets/icons/redhat_logo.svg rename to x-pack/solutions/security/plugins/cloud_security_posture/public/assets/icons/redhat_logo.svg diff --git a/x-pack/plugins/cloud_security_posture/public/assets/illustrations/clouds.svg b/x-pack/solutions/security/plugins/cloud_security_posture/public/assets/illustrations/clouds.svg similarity index 100% rename from x-pack/plugins/cloud_security_posture/public/assets/illustrations/clouds.svg rename to x-pack/solutions/security/plugins/cloud_security_posture/public/assets/illustrations/clouds.svg diff --git a/x-pack/plugins/cloud_security_posture/public/assets/illustrations/illustration_product_no_results_magnifying_glass.svg b/x-pack/solutions/security/plugins/cloud_security_posture/public/assets/illustrations/illustration_product_no_results_magnifying_glass.svg similarity index 100% rename from x-pack/plugins/cloud_security_posture/public/assets/illustrations/illustration_product_no_results_magnifying_glass.svg rename to x-pack/solutions/security/plugins/cloud_security_posture/public/assets/illustrations/illustration_product_no_results_magnifying_glass.svg diff --git a/x-pack/plugins/cloud_security_posture/public/assets/illustrations/misconfigurations_vendors.svg b/x-pack/solutions/security/plugins/cloud_security_posture/public/assets/illustrations/misconfigurations_vendors.svg similarity index 100% rename from x-pack/plugins/cloud_security_posture/public/assets/illustrations/misconfigurations_vendors.svg rename to x-pack/solutions/security/plugins/cloud_security_posture/public/assets/illustrations/misconfigurations_vendors.svg diff --git a/x-pack/plugins/cloud_security_posture/public/assets/illustrations/no_data_illustration.svg b/x-pack/solutions/security/plugins/cloud_security_posture/public/assets/illustrations/no_data_illustration.svg similarity index 100% rename from x-pack/plugins/cloud_security_posture/public/assets/illustrations/no_data_illustration.svg rename to x-pack/solutions/security/plugins/cloud_security_posture/public/assets/illustrations/no_data_illustration.svg diff --git a/x-pack/plugins/cloud_security_posture/public/assets/illustrations/vulnerabilities_vendors.svg b/x-pack/solutions/security/plugins/cloud_security_posture/public/assets/illustrations/vulnerabilities_vendors.svg similarity index 100% rename from x-pack/plugins/cloud_security_posture/public/assets/illustrations/vulnerabilities_vendors.svg rename to x-pack/solutions/security/plugins/cloud_security_posture/public/assets/illustrations/vulnerabilities_vendors.svg diff --git a/x-pack/plugins/cloud_security_posture/public/common/api/create_detection_rule.ts b/x-pack/solutions/security/plugins/cloud_security_posture/public/common/api/create_detection_rule.ts similarity index 100% rename from x-pack/plugins/cloud_security_posture/public/common/api/create_detection_rule.ts rename to x-pack/solutions/security/plugins/cloud_security_posture/public/common/api/create_detection_rule.ts diff --git a/x-pack/plugins/cloud_security_posture/public/common/api/index.ts b/x-pack/solutions/security/plugins/cloud_security_posture/public/common/api/index.ts similarity index 100% rename from x-pack/plugins/cloud_security_posture/public/common/api/index.ts rename to x-pack/solutions/security/plugins/cloud_security_posture/public/common/api/index.ts diff --git a/x-pack/plugins/cloud_security_posture/public/common/api/use_cis_kubernetes_integration.tsx b/x-pack/solutions/security/plugins/cloud_security_posture/public/common/api/use_cis_kubernetes_integration.tsx similarity index 100% rename from x-pack/plugins/cloud_security_posture/public/common/api/use_cis_kubernetes_integration.tsx rename to x-pack/solutions/security/plugins/cloud_security_posture/public/common/api/use_cis_kubernetes_integration.tsx diff --git a/x-pack/plugins/cloud_security_posture/public/common/api/use_fetch_detection_rules_alerts_status.ts b/x-pack/solutions/security/plugins/cloud_security_posture/public/common/api/use_fetch_detection_rules_alerts_status.ts similarity index 100% rename from x-pack/plugins/cloud_security_posture/public/common/api/use_fetch_detection_rules_alerts_status.ts rename to x-pack/solutions/security/plugins/cloud_security_posture/public/common/api/use_fetch_detection_rules_alerts_status.ts diff --git a/x-pack/plugins/cloud_security_posture/public/common/api/use_fetch_detection_rules_by_tags.ts b/x-pack/solutions/security/plugins/cloud_security_posture/public/common/api/use_fetch_detection_rules_by_tags.ts similarity index 100% rename from x-pack/plugins/cloud_security_posture/public/common/api/use_fetch_detection_rules_by_tags.ts rename to x-pack/solutions/security/plugins/cloud_security_posture/public/common/api/use_fetch_detection_rules_by_tags.ts diff --git a/x-pack/plugins/cloud_security_posture/public/common/api/use_license_management_locator_api.tsx b/x-pack/solutions/security/plugins/cloud_security_posture/public/common/api/use_license_management_locator_api.tsx similarity index 100% rename from x-pack/plugins/cloud_security_posture/public/common/api/use_license_management_locator_api.tsx rename to x-pack/solutions/security/plugins/cloud_security_posture/public/common/api/use_license_management_locator_api.tsx diff --git a/x-pack/plugins/cloud_security_posture/public/common/api/use_package_policy_list.ts b/x-pack/solutions/security/plugins/cloud_security_posture/public/common/api/use_package_policy_list.ts similarity index 100% rename from x-pack/plugins/cloud_security_posture/public/common/api/use_package_policy_list.ts rename to x-pack/solutions/security/plugins/cloud_security_posture/public/common/api/use_package_policy_list.ts diff --git a/x-pack/plugins/cloud_security_posture/public/common/api/use_stats_api.ts b/x-pack/solutions/security/plugins/cloud_security_posture/public/common/api/use_stats_api.ts similarity index 100% rename from x-pack/plugins/cloud_security_posture/public/common/api/use_stats_api.ts rename to x-pack/solutions/security/plugins/cloud_security_posture/public/common/api/use_stats_api.ts diff --git a/x-pack/plugins/cloud_security_posture/public/common/api/use_vulnerability_dashboard_api.ts b/x-pack/solutions/security/plugins/cloud_security_posture/public/common/api/use_vulnerability_dashboard_api.ts similarity index 100% rename from x-pack/plugins/cloud_security_posture/public/common/api/use_vulnerability_dashboard_api.ts rename to x-pack/solutions/security/plugins/cloud_security_posture/public/common/api/use_vulnerability_dashboard_api.ts diff --git a/x-pack/plugins/cloud_security_posture/public/common/api/use_wiz_integration_route.ts b/x-pack/solutions/security/plugins/cloud_security_posture/public/common/api/use_wiz_integration_route.ts similarity index 100% rename from x-pack/plugins/cloud_security_posture/public/common/api/use_wiz_integration_route.ts rename to x-pack/solutions/security/plugins/cloud_security_posture/public/common/api/use_wiz_integration_route.ts diff --git a/x-pack/plugins/cloud_security_posture/public/common/component/multi_select_filter.tsx b/x-pack/solutions/security/plugins/cloud_security_posture/public/common/component/multi_select_filter.tsx similarity index 100% rename from x-pack/plugins/cloud_security_posture/public/common/component/multi_select_filter.tsx rename to x-pack/solutions/security/plugins/cloud_security_posture/public/common/component/multi_select_filter.tsx diff --git a/x-pack/plugins/cloud_security_posture/public/common/constants.ts b/x-pack/solutions/security/plugins/cloud_security_posture/public/common/constants.ts similarity index 100% rename from x-pack/plugins/cloud_security_posture/public/common/constants.ts rename to x-pack/solutions/security/plugins/cloud_security_posture/public/common/constants.ts diff --git a/x-pack/plugins/cloud_security_posture/public/common/contexts/data_view_context.ts b/x-pack/solutions/security/plugins/cloud_security_posture/public/common/contexts/data_view_context.ts similarity index 100% rename from x-pack/plugins/cloud_security_posture/public/common/contexts/data_view_context.ts rename to x-pack/solutions/security/plugins/cloud_security_posture/public/common/contexts/data_view_context.ts diff --git a/x-pack/plugins/cloud_security_posture/public/common/hooks/use_benchmark_dynamic_values.test.ts b/x-pack/solutions/security/plugins/cloud_security_posture/public/common/hooks/use_benchmark_dynamic_values.test.ts similarity index 100% rename from x-pack/plugins/cloud_security_posture/public/common/hooks/use_benchmark_dynamic_values.test.ts rename to x-pack/solutions/security/plugins/cloud_security_posture/public/common/hooks/use_benchmark_dynamic_values.test.ts diff --git a/x-pack/plugins/cloud_security_posture/public/common/hooks/use_benchmark_dynamic_values.ts b/x-pack/solutions/security/plugins/cloud_security_posture/public/common/hooks/use_benchmark_dynamic_values.ts similarity index 100% rename from x-pack/plugins/cloud_security_posture/public/common/hooks/use_benchmark_dynamic_values.ts rename to x-pack/solutions/security/plugins/cloud_security_posture/public/common/hooks/use_benchmark_dynamic_values.ts diff --git a/x-pack/plugins/cloud_security_posture/public/common/hooks/use_cloud_posture_data_table/index.ts b/x-pack/solutions/security/plugins/cloud_security_posture/public/common/hooks/use_cloud_posture_data_table/index.ts similarity index 100% rename from x-pack/plugins/cloud_security_posture/public/common/hooks/use_cloud_posture_data_table/index.ts rename to x-pack/solutions/security/plugins/cloud_security_posture/public/common/hooks/use_cloud_posture_data_table/index.ts diff --git a/x-pack/plugins/cloud_security_posture/public/common/hooks/use_cloud_posture_data_table/use_base_es_query.ts b/x-pack/solutions/security/plugins/cloud_security_posture/public/common/hooks/use_cloud_posture_data_table/use_base_es_query.ts similarity index 100% rename from x-pack/plugins/cloud_security_posture/public/common/hooks/use_cloud_posture_data_table/use_base_es_query.ts rename to x-pack/solutions/security/plugins/cloud_security_posture/public/common/hooks/use_cloud_posture_data_table/use_base_es_query.ts diff --git a/x-pack/plugins/cloud_security_posture/public/common/hooks/use_cloud_posture_data_table/use_cloud_posture_data_table.ts b/x-pack/solutions/security/plugins/cloud_security_posture/public/common/hooks/use_cloud_posture_data_table/use_cloud_posture_data_table.ts similarity index 100% rename from x-pack/plugins/cloud_security_posture/public/common/hooks/use_cloud_posture_data_table/use_cloud_posture_data_table.ts rename to x-pack/solutions/security/plugins/cloud_security_posture/public/common/hooks/use_cloud_posture_data_table/use_cloud_posture_data_table.ts diff --git a/x-pack/plugins/cloud_security_posture/public/common/hooks/use_cloud_posture_data_table/use_persisted_query.ts b/x-pack/solutions/security/plugins/cloud_security_posture/public/common/hooks/use_cloud_posture_data_table/use_persisted_query.ts similarity index 100% rename from x-pack/plugins/cloud_security_posture/public/common/hooks/use_cloud_posture_data_table/use_persisted_query.ts rename to x-pack/solutions/security/plugins/cloud_security_posture/public/common/hooks/use_cloud_posture_data_table/use_persisted_query.ts diff --git a/x-pack/plugins/cloud_security_posture/public/common/hooks/use_cloud_posture_data_table/utils.ts b/x-pack/solutions/security/plugins/cloud_security_posture/public/common/hooks/use_cloud_posture_data_table/utils.ts similarity index 100% rename from x-pack/plugins/cloud_security_posture/public/common/hooks/use_cloud_posture_data_table/utils.ts rename to x-pack/solutions/security/plugins/cloud_security_posture/public/common/hooks/use_cloud_posture_data_table/utils.ts diff --git a/x-pack/plugins/cloud_security_posture/public/common/hooks/use_is_subscription_status_valid.ts b/x-pack/solutions/security/plugins/cloud_security_posture/public/common/hooks/use_is_subscription_status_valid.ts similarity index 100% rename from x-pack/plugins/cloud_security_posture/public/common/hooks/use_is_subscription_status_valid.ts rename to x-pack/solutions/security/plugins/cloud_security_posture/public/common/hooks/use_is_subscription_status_valid.ts diff --git a/x-pack/plugins/cloud_security_posture/public/common/hooks/use_kibana.ts b/x-pack/solutions/security/plugins/cloud_security_posture/public/common/hooks/use_kibana.ts similarity index 100% rename from x-pack/plugins/cloud_security_posture/public/common/hooks/use_kibana.ts rename to x-pack/solutions/security/plugins/cloud_security_posture/public/common/hooks/use_kibana.ts diff --git a/x-pack/plugins/cloud_security_posture/public/common/hooks/use_page_size.ts b/x-pack/solutions/security/plugins/cloud_security_posture/public/common/hooks/use_page_size.ts similarity index 100% rename from x-pack/plugins/cloud_security_posture/public/common/hooks/use_page_size.ts rename to x-pack/solutions/security/plugins/cloud_security_posture/public/common/hooks/use_page_size.ts diff --git a/x-pack/plugins/cloud_security_posture/public/common/hooks/use_url_query.test.ts b/x-pack/solutions/security/plugins/cloud_security_posture/public/common/hooks/use_url_query.test.ts similarity index 100% rename from x-pack/plugins/cloud_security_posture/public/common/hooks/use_url_query.test.ts rename to x-pack/solutions/security/plugins/cloud_security_posture/public/common/hooks/use_url_query.test.ts diff --git a/x-pack/plugins/cloud_security_posture/public/common/hooks/use_url_query.ts b/x-pack/solutions/security/plugins/cloud_security_posture/public/common/hooks/use_url_query.ts similarity index 100% rename from x-pack/plugins/cloud_security_posture/public/common/hooks/use_url_query.ts rename to x-pack/solutions/security/plugins/cloud_security_posture/public/common/hooks/use_url_query.ts diff --git a/x-pack/plugins/cloud_security_posture/public/common/navigation/constants.ts b/x-pack/solutions/security/plugins/cloud_security_posture/public/common/navigation/constants.ts similarity index 100% rename from x-pack/plugins/cloud_security_posture/public/common/navigation/constants.ts rename to x-pack/solutions/security/plugins/cloud_security_posture/public/common/navigation/constants.ts diff --git a/x-pack/plugins/cloud_security_posture/public/common/navigation/security_solution_links.test.ts b/x-pack/solutions/security/plugins/cloud_security_posture/public/common/navigation/security_solution_links.test.ts similarity index 100% rename from x-pack/plugins/cloud_security_posture/public/common/navigation/security_solution_links.test.ts rename to x-pack/solutions/security/plugins/cloud_security_posture/public/common/navigation/security_solution_links.test.ts diff --git a/x-pack/plugins/cloud_security_posture/public/common/navigation/security_solution_links.ts b/x-pack/solutions/security/plugins/cloud_security_posture/public/common/navigation/security_solution_links.ts similarity index 100% rename from x-pack/plugins/cloud_security_posture/public/common/navigation/security_solution_links.ts rename to x-pack/solutions/security/plugins/cloud_security_posture/public/common/navigation/security_solution_links.ts diff --git a/x-pack/plugins/cloud_security_posture/public/common/navigation/types.ts b/x-pack/solutions/security/plugins/cloud_security_posture/public/common/navigation/types.ts similarity index 100% rename from x-pack/plugins/cloud_security_posture/public/common/navigation/types.ts rename to x-pack/solutions/security/plugins/cloud_security_posture/public/common/navigation/types.ts diff --git a/x-pack/plugins/cloud_security_posture/public/common/navigation/use_csp_integration_link.ts b/x-pack/solutions/security/plugins/cloud_security_posture/public/common/navigation/use_csp_integration_link.ts similarity index 100% rename from x-pack/plugins/cloud_security_posture/public/common/navigation/use_csp_integration_link.ts rename to x-pack/solutions/security/plugins/cloud_security_posture/public/common/navigation/use_csp_integration_link.ts diff --git a/x-pack/plugins/cloud_security_posture/public/common/navigation/use_navigate_to_cis_integration_policies.ts b/x-pack/solutions/security/plugins/cloud_security_posture/public/common/navigation/use_navigate_to_cis_integration_policies.ts similarity index 100% rename from x-pack/plugins/cloud_security_posture/public/common/navigation/use_navigate_to_cis_integration_policies.ts rename to x-pack/solutions/security/plugins/cloud_security_posture/public/common/navigation/use_navigate_to_cis_integration_policies.ts diff --git a/x-pack/plugins/cloud_security_posture/public/common/types.ts b/x-pack/solutions/security/plugins/cloud_security_posture/public/common/types.ts similarity index 100% rename from x-pack/plugins/cloud_security_posture/public/common/types.ts rename to x-pack/solutions/security/plugins/cloud_security_posture/public/common/types.ts diff --git a/x-pack/plugins/cloud_security_posture/public/common/utils/get_template_url_package_info.ts b/x-pack/solutions/security/plugins/cloud_security_posture/public/common/utils/get_template_url_package_info.ts similarity index 100% rename from x-pack/plugins/cloud_security_posture/public/common/utils/get_template_url_package_info.ts rename to x-pack/solutions/security/plugins/cloud_security_posture/public/common/utils/get_template_url_package_info.ts diff --git a/x-pack/plugins/cloud_security_posture/public/common/utils/get_vendor_name.test.ts b/x-pack/solutions/security/plugins/cloud_security_posture/public/common/utils/get_vendor_name.test.ts similarity index 100% rename from x-pack/plugins/cloud_security_posture/public/common/utils/get_vendor_name.test.ts rename to x-pack/solutions/security/plugins/cloud_security_posture/public/common/utils/get_vendor_name.test.ts diff --git a/x-pack/plugins/cloud_security_posture/public/common/utils/get_vendor_name.ts b/x-pack/solutions/security/plugins/cloud_security_posture/public/common/utils/get_vendor_name.ts similarity index 100% rename from x-pack/plugins/cloud_security_posture/public/common/utils/get_vendor_name.ts rename to x-pack/solutions/security/plugins/cloud_security_posture/public/common/utils/get_vendor_name.ts diff --git a/x-pack/plugins/cloud_security_posture/public/common/utils/is_native_csp_finding.test.ts b/x-pack/solutions/security/plugins/cloud_security_posture/public/common/utils/is_native_csp_finding.test.ts similarity index 100% rename from x-pack/plugins/cloud_security_posture/public/common/utils/is_native_csp_finding.test.ts rename to x-pack/solutions/security/plugins/cloud_security_posture/public/common/utils/is_native_csp_finding.test.ts diff --git a/x-pack/plugins/cloud_security_posture/public/common/utils/is_native_csp_finding.ts b/x-pack/solutions/security/plugins/cloud_security_posture/public/common/utils/is_native_csp_finding.ts similarity index 100% rename from x-pack/plugins/cloud_security_posture/public/common/utils/is_native_csp_finding.ts rename to x-pack/solutions/security/plugins/cloud_security_posture/public/common/utils/is_native_csp_finding.ts diff --git a/x-pack/plugins/cloud_security_posture/public/components/accounts_evaluated_widget.test.tsx b/x-pack/solutions/security/plugins/cloud_security_posture/public/components/accounts_evaluated_widget.test.tsx similarity index 100% rename from x-pack/plugins/cloud_security_posture/public/components/accounts_evaluated_widget.test.tsx rename to x-pack/solutions/security/plugins/cloud_security_posture/public/components/accounts_evaluated_widget.test.tsx diff --git a/x-pack/plugins/cloud_security_posture/public/components/accounts_evaluated_widget.tsx b/x-pack/solutions/security/plugins/cloud_security_posture/public/components/accounts_evaluated_widget.tsx similarity index 100% rename from x-pack/plugins/cloud_security_posture/public/components/accounts_evaluated_widget.tsx rename to x-pack/solutions/security/plugins/cloud_security_posture/public/components/accounts_evaluated_widget.tsx diff --git a/x-pack/plugins/cloud_security_posture/public/components/chart_panel.test.tsx b/x-pack/solutions/security/plugins/cloud_security_posture/public/components/chart_panel.test.tsx similarity index 100% rename from x-pack/plugins/cloud_security_posture/public/components/chart_panel.test.tsx rename to x-pack/solutions/security/plugins/cloud_security_posture/public/components/chart_panel.test.tsx diff --git a/x-pack/plugins/cloud_security_posture/public/components/chart_panel.tsx b/x-pack/solutions/security/plugins/cloud_security_posture/public/components/chart_panel.tsx similarity index 100% rename from x-pack/plugins/cloud_security_posture/public/components/chart_panel.tsx rename to x-pack/solutions/security/plugins/cloud_security_posture/public/components/chart_panel.tsx diff --git a/x-pack/plugins/cloud_security_posture/public/components/cis_benchmark_icon.tsx b/x-pack/solutions/security/plugins/cloud_security_posture/public/components/cis_benchmark_icon.tsx similarity index 100% rename from x-pack/plugins/cloud_security_posture/public/components/cis_benchmark_icon.tsx rename to x-pack/solutions/security/plugins/cloud_security_posture/public/components/cis_benchmark_icon.tsx diff --git a/x-pack/plugins/cloud_security_posture/public/components/cloud_posture_page.test.tsx b/x-pack/solutions/security/plugins/cloud_security_posture/public/components/cloud_posture_page.test.tsx similarity index 100% rename from x-pack/plugins/cloud_security_posture/public/components/cloud_posture_page.test.tsx rename to x-pack/solutions/security/plugins/cloud_security_posture/public/components/cloud_posture_page.test.tsx diff --git a/x-pack/plugins/cloud_security_posture/public/components/cloud_posture_page.tsx b/x-pack/solutions/security/plugins/cloud_security_posture/public/components/cloud_posture_page.tsx similarity index 100% rename from x-pack/plugins/cloud_security_posture/public/components/cloud_posture_page.tsx rename to x-pack/solutions/security/plugins/cloud_security_posture/public/components/cloud_posture_page.tsx diff --git a/x-pack/plugins/cloud_security_posture/public/components/cloud_posture_page_title.tsx b/x-pack/solutions/security/plugins/cloud_security_posture/public/components/cloud_posture_page_title.tsx similarity index 100% rename from x-pack/plugins/cloud_security_posture/public/components/cloud_posture_page_title.tsx rename to x-pack/solutions/security/plugins/cloud_security_posture/public/components/cloud_posture_page_title.tsx diff --git a/x-pack/plugins/cloud_security_posture/public/components/cloud_provider_icon.tsx b/x-pack/solutions/security/plugins/cloud_security_posture/public/components/cloud_provider_icon.tsx similarity index 100% rename from x-pack/plugins/cloud_security_posture/public/components/cloud_provider_icon.tsx rename to x-pack/solutions/security/plugins/cloud_security_posture/public/components/cloud_provider_icon.tsx diff --git a/x-pack/plugins/cloud_security_posture/public/components/cloud_security_data_table/additional_controls.tsx b/x-pack/solutions/security/plugins/cloud_security_posture/public/components/cloud_security_data_table/additional_controls.tsx similarity index 100% rename from x-pack/plugins/cloud_security_posture/public/components/cloud_security_data_table/additional_controls.tsx rename to x-pack/solutions/security/plugins/cloud_security_posture/public/components/cloud_security_data_table/additional_controls.tsx diff --git a/x-pack/plugins/cloud_security_posture/public/components/cloud_security_data_table/cloud_security_data_table.test.tsx b/x-pack/solutions/security/plugins/cloud_security_posture/public/components/cloud_security_data_table/cloud_security_data_table.test.tsx similarity index 100% rename from x-pack/plugins/cloud_security_posture/public/components/cloud_security_data_table/cloud_security_data_table.test.tsx rename to x-pack/solutions/security/plugins/cloud_security_posture/public/components/cloud_security_data_table/cloud_security_data_table.test.tsx diff --git a/x-pack/plugins/cloud_security_posture/public/components/cloud_security_data_table/cloud_security_data_table.tsx b/x-pack/solutions/security/plugins/cloud_security_posture/public/components/cloud_security_data_table/cloud_security_data_table.tsx similarity index 100% rename from x-pack/plugins/cloud_security_posture/public/components/cloud_security_data_table/cloud_security_data_table.tsx rename to x-pack/solutions/security/plugins/cloud_security_posture/public/components/cloud_security_data_table/cloud_security_data_table.tsx diff --git a/x-pack/plugins/cloud_security_posture/public/components/cloud_security_data_table/fields_selector/fields_selector_modal.tsx b/x-pack/solutions/security/plugins/cloud_security_posture/public/components/cloud_security_data_table/fields_selector/fields_selector_modal.tsx similarity index 100% rename from x-pack/plugins/cloud_security_posture/public/components/cloud_security_data_table/fields_selector/fields_selector_modal.tsx rename to x-pack/solutions/security/plugins/cloud_security_posture/public/components/cloud_security_data_table/fields_selector/fields_selector_modal.tsx diff --git a/x-pack/plugins/cloud_security_posture/public/components/cloud_security_data_table/fields_selector/fields_selector_table.test.tsx b/x-pack/solutions/security/plugins/cloud_security_posture/public/components/cloud_security_data_table/fields_selector/fields_selector_table.test.tsx similarity index 100% rename from x-pack/plugins/cloud_security_posture/public/components/cloud_security_data_table/fields_selector/fields_selector_table.test.tsx rename to x-pack/solutions/security/plugins/cloud_security_posture/public/components/cloud_security_data_table/fields_selector/fields_selector_table.test.tsx diff --git a/x-pack/plugins/cloud_security_posture/public/components/cloud_security_data_table/fields_selector/fields_selector_table.tsx b/x-pack/solutions/security/plugins/cloud_security_posture/public/components/cloud_security_data_table/fields_selector/fields_selector_table.tsx similarity index 100% rename from x-pack/plugins/cloud_security_posture/public/components/cloud_security_data_table/fields_selector/fields_selector_table.tsx rename to x-pack/solutions/security/plugins/cloud_security_posture/public/components/cloud_security_data_table/fields_selector/fields_selector_table.tsx diff --git a/x-pack/plugins/cloud_security_posture/public/components/cloud_security_data_table/fields_selector/index.ts b/x-pack/solutions/security/plugins/cloud_security_posture/public/components/cloud_security_data_table/fields_selector/index.ts similarity index 100% rename from x-pack/plugins/cloud_security_posture/public/components/cloud_security_data_table/fields_selector/index.ts rename to x-pack/solutions/security/plugins/cloud_security_posture/public/components/cloud_security_data_table/fields_selector/index.ts diff --git a/x-pack/plugins/cloud_security_posture/public/components/cloud_security_data_table/fields_selector/use_fields_modal.ts b/x-pack/solutions/security/plugins/cloud_security_posture/public/components/cloud_security_data_table/fields_selector/use_fields_modal.ts similarity index 100% rename from x-pack/plugins/cloud_security_posture/public/components/cloud_security_data_table/fields_selector/use_fields_modal.ts rename to x-pack/solutions/security/plugins/cloud_security_posture/public/components/cloud_security_data_table/fields_selector/use_fields_modal.ts diff --git a/x-pack/plugins/cloud_security_posture/public/components/cloud_security_data_table/index.ts b/x-pack/solutions/security/plugins/cloud_security_posture/public/components/cloud_security_data_table/index.ts similarity index 100% rename from x-pack/plugins/cloud_security_posture/public/components/cloud_security_data_table/index.ts rename to x-pack/solutions/security/plugins/cloud_security_posture/public/components/cloud_security_data_table/index.ts diff --git a/x-pack/plugins/cloud_security_posture/public/components/cloud_security_data_table/use_styles.ts b/x-pack/solutions/security/plugins/cloud_security_posture/public/components/cloud_security_data_table/use_styles.ts similarity index 100% rename from x-pack/plugins/cloud_security_posture/public/components/cloud_security_data_table/use_styles.ts rename to x-pack/solutions/security/plugins/cloud_security_posture/public/components/cloud_security_data_table/use_styles.ts diff --git a/x-pack/plugins/cloud_security_posture/public/components/cloud_security_grouping/cloud_security_grouping.tsx b/x-pack/solutions/security/plugins/cloud_security_posture/public/components/cloud_security_grouping/cloud_security_grouping.tsx similarity index 100% rename from x-pack/plugins/cloud_security_posture/public/components/cloud_security_grouping/cloud_security_grouping.tsx rename to x-pack/solutions/security/plugins/cloud_security_posture/public/components/cloud_security_grouping/cloud_security_grouping.tsx diff --git a/x-pack/plugins/cloud_security_posture/public/components/cloud_security_grouping/index.ts b/x-pack/solutions/security/plugins/cloud_security_posture/public/components/cloud_security_grouping/index.ts similarity index 100% rename from x-pack/plugins/cloud_security_posture/public/components/cloud_security_grouping/index.ts rename to x-pack/solutions/security/plugins/cloud_security_posture/public/components/cloud_security_grouping/index.ts diff --git a/x-pack/plugins/cloud_security_posture/public/components/cloud_security_grouping/loading_group.tsx b/x-pack/solutions/security/plugins/cloud_security_posture/public/components/cloud_security_grouping/loading_group.tsx similarity index 100% rename from x-pack/plugins/cloud_security_posture/public/components/cloud_security_grouping/loading_group.tsx rename to x-pack/solutions/security/plugins/cloud_security_posture/public/components/cloud_security_grouping/loading_group.tsx diff --git a/x-pack/plugins/cloud_security_posture/public/components/cloud_security_grouping/null_group.tsx b/x-pack/solutions/security/plugins/cloud_security_posture/public/components/cloud_security_grouping/null_group.tsx similarity index 100% rename from x-pack/plugins/cloud_security_posture/public/components/cloud_security_grouping/null_group.tsx rename to x-pack/solutions/security/plugins/cloud_security_posture/public/components/cloud_security_grouping/null_group.tsx diff --git a/x-pack/plugins/cloud_security_posture/public/components/cloud_security_grouping/use_cloud_security_grouping.ts b/x-pack/solutions/security/plugins/cloud_security_posture/public/components/cloud_security_grouping/use_cloud_security_grouping.ts similarity index 100% rename from x-pack/plugins/cloud_security_posture/public/components/cloud_security_grouping/use_cloud_security_grouping.ts rename to x-pack/solutions/security/plugins/cloud_security_posture/public/components/cloud_security_grouping/use_cloud_security_grouping.ts diff --git a/x-pack/plugins/cloud_security_posture/public/components/cloud_security_grouping/utils/first_non_null_value.test.ts b/x-pack/solutions/security/plugins/cloud_security_posture/public/components/cloud_security_grouping/utils/first_non_null_value.test.ts similarity index 100% rename from x-pack/plugins/cloud_security_posture/public/components/cloud_security_grouping/utils/first_non_null_value.test.ts rename to x-pack/solutions/security/plugins/cloud_security_posture/public/components/cloud_security_grouping/utils/first_non_null_value.test.ts diff --git a/x-pack/plugins/cloud_security_posture/public/components/cloud_security_grouping/utils/first_non_null_value.ts b/x-pack/solutions/security/plugins/cloud_security_posture/public/components/cloud_security_grouping/utils/first_non_null_value.ts similarity index 100% rename from x-pack/plugins/cloud_security_posture/public/components/cloud_security_grouping/utils/first_non_null_value.ts rename to x-pack/solutions/security/plugins/cloud_security_posture/public/components/cloud_security_grouping/utils/first_non_null_value.ts diff --git a/x-pack/plugins/cloud_security_posture/public/components/column_name_with_tooltip.tsx b/x-pack/solutions/security/plugins/cloud_security_posture/public/components/column_name_with_tooltip.tsx similarity index 100% rename from x-pack/plugins/cloud_security_posture/public/components/column_name_with_tooltip.tsx rename to x-pack/solutions/security/plugins/cloud_security_posture/public/components/column_name_with_tooltip.tsx diff --git a/x-pack/plugins/cloud_security_posture/public/components/compact_formatted_number.tsx b/x-pack/solutions/security/plugins/cloud_security_posture/public/components/compact_formatted_number.tsx similarity index 100% rename from x-pack/plugins/cloud_security_posture/public/components/compact_formatted_number.tsx rename to x-pack/solutions/security/plugins/cloud_security_posture/public/components/compact_formatted_number.tsx diff --git a/x-pack/plugins/cloud_security_posture/public/components/compliance_score_bar.test.tsx b/x-pack/solutions/security/plugins/cloud_security_posture/public/components/compliance_score_bar.test.tsx similarity index 100% rename from x-pack/plugins/cloud_security_posture/public/components/compliance_score_bar.test.tsx rename to x-pack/solutions/security/plugins/cloud_security_posture/public/components/compliance_score_bar.test.tsx diff --git a/x-pack/plugins/cloud_security_posture/public/components/compliance_score_bar.tsx b/x-pack/solutions/security/plugins/cloud_security_posture/public/components/compliance_score_bar.tsx similarity index 100% rename from x-pack/plugins/cloud_security_posture/public/components/compliance_score_bar.tsx rename to x-pack/solutions/security/plugins/cloud_security_posture/public/components/compliance_score_bar.tsx diff --git a/x-pack/plugins/cloud_security_posture/public/components/csp_counter_card.tsx b/x-pack/solutions/security/plugins/cloud_security_posture/public/components/csp_counter_card.tsx similarity index 100% rename from x-pack/plugins/cloud_security_posture/public/components/csp_counter_card.tsx rename to x-pack/solutions/security/plugins/cloud_security_posture/public/components/csp_counter_card.tsx diff --git a/x-pack/plugins/cloud_security_posture/public/components/csp_inline_description_list.tsx b/x-pack/solutions/security/plugins/cloud_security_posture/public/components/csp_inline_description_list.tsx similarity index 100% rename from x-pack/plugins/cloud_security_posture/public/components/csp_inline_description_list.tsx rename to x-pack/solutions/security/plugins/cloud_security_posture/public/components/csp_inline_description_list.tsx diff --git a/x-pack/plugins/cloud_security_posture/public/components/csp_loading_state.tsx b/x-pack/solutions/security/plugins/cloud_security_posture/public/components/csp_loading_state.tsx similarity index 100% rename from x-pack/plugins/cloud_security_posture/public/components/csp_loading_state.tsx rename to x-pack/solutions/security/plugins/cloud_security_posture/public/components/csp_loading_state.tsx diff --git a/x-pack/plugins/cloud_security_posture/public/components/detection_rule_counter.test.tsx b/x-pack/solutions/security/plugins/cloud_security_posture/public/components/detection_rule_counter.test.tsx similarity index 100% rename from x-pack/plugins/cloud_security_posture/public/components/detection_rule_counter.test.tsx rename to x-pack/solutions/security/plugins/cloud_security_posture/public/components/detection_rule_counter.test.tsx diff --git a/x-pack/plugins/cloud_security_posture/public/components/detection_rule_counter.tsx b/x-pack/solutions/security/plugins/cloud_security_posture/public/components/detection_rule_counter.tsx similarity index 100% rename from x-pack/plugins/cloud_security_posture/public/components/detection_rule_counter.tsx rename to x-pack/solutions/security/plugins/cloud_security_posture/public/components/detection_rule_counter.tsx diff --git a/x-pack/plugins/cloud_security_posture/public/components/empty_state.tsx b/x-pack/solutions/security/plugins/cloud_security_posture/public/components/empty_state.tsx similarity index 100% rename from x-pack/plugins/cloud_security_posture/public/components/empty_state.tsx rename to x-pack/solutions/security/plugins/cloud_security_posture/public/components/empty_state.tsx diff --git a/x-pack/plugins/cloud_security_posture/public/components/empty_states_illustration_container.tsx b/x-pack/solutions/security/plugins/cloud_security_posture/public/components/empty_states_illustration_container.tsx similarity index 100% rename from x-pack/plugins/cloud_security_posture/public/components/empty_states_illustration_container.tsx rename to x-pack/solutions/security/plugins/cloud_security_posture/public/components/empty_states_illustration_container.tsx diff --git a/x-pack/plugins/cloud_security_posture/public/components/fleet_extensions/aws_credentials_form/aws_credentials_form.tsx b/x-pack/solutions/security/plugins/cloud_security_posture/public/components/fleet_extensions/aws_credentials_form/aws_credentials_form.tsx similarity index 100% rename from x-pack/plugins/cloud_security_posture/public/components/fleet_extensions/aws_credentials_form/aws_credentials_form.tsx rename to x-pack/solutions/security/plugins/cloud_security_posture/public/components/fleet_extensions/aws_credentials_form/aws_credentials_form.tsx diff --git a/x-pack/plugins/cloud_security_posture/public/components/fleet_extensions/aws_credentials_form/aws_credentials_form_agentless.tsx b/x-pack/solutions/security/plugins/cloud_security_posture/public/components/fleet_extensions/aws_credentials_form/aws_credentials_form_agentless.tsx similarity index 100% rename from x-pack/plugins/cloud_security_posture/public/components/fleet_extensions/aws_credentials_form/aws_credentials_form_agentless.tsx rename to x-pack/solutions/security/plugins/cloud_security_posture/public/components/fleet_extensions/aws_credentials_form/aws_credentials_form_agentless.tsx diff --git a/x-pack/plugins/cloud_security_posture/public/components/fleet_extensions/aws_credentials_form/aws_input_var_fields.tsx b/x-pack/solutions/security/plugins/cloud_security_posture/public/components/fleet_extensions/aws_credentials_form/aws_input_var_fields.tsx similarity index 100% rename from x-pack/plugins/cloud_security_posture/public/components/fleet_extensions/aws_credentials_form/aws_input_var_fields.tsx rename to x-pack/solutions/security/plugins/cloud_security_posture/public/components/fleet_extensions/aws_credentials_form/aws_input_var_fields.tsx diff --git a/x-pack/plugins/cloud_security_posture/public/components/fleet_extensions/aws_credentials_form/get_aws_credentials_form_options.tsx b/x-pack/solutions/security/plugins/cloud_security_posture/public/components/fleet_extensions/aws_credentials_form/get_aws_credentials_form_options.tsx similarity index 100% rename from x-pack/plugins/cloud_security_posture/public/components/fleet_extensions/aws_credentials_form/get_aws_credentials_form_options.tsx rename to x-pack/solutions/security/plugins/cloud_security_posture/public/components/fleet_extensions/aws_credentials_form/get_aws_credentials_form_options.tsx diff --git a/x-pack/plugins/cloud_security_posture/public/components/fleet_extensions/aws_credentials_form/hooks.ts b/x-pack/solutions/security/plugins/cloud_security_posture/public/components/fleet_extensions/aws_credentials_form/hooks.ts similarity index 100% rename from x-pack/plugins/cloud_security_posture/public/components/fleet_extensions/aws_credentials_form/hooks.ts rename to x-pack/solutions/security/plugins/cloud_security_posture/public/components/fleet_extensions/aws_credentials_form/hooks.ts diff --git a/x-pack/plugins/cloud_security_posture/public/components/fleet_extensions/azure_credentials_form/azure_credentials_form.tsx b/x-pack/solutions/security/plugins/cloud_security_posture/public/components/fleet_extensions/azure_credentials_form/azure_credentials_form.tsx similarity index 100% rename from x-pack/plugins/cloud_security_posture/public/components/fleet_extensions/azure_credentials_form/azure_credentials_form.tsx rename to x-pack/solutions/security/plugins/cloud_security_posture/public/components/fleet_extensions/azure_credentials_form/azure_credentials_form.tsx diff --git a/x-pack/plugins/cloud_security_posture/public/components/fleet_extensions/azure_credentials_form/azure_credentials_form_agentless.tsx b/x-pack/solutions/security/plugins/cloud_security_posture/public/components/fleet_extensions/azure_credentials_form/azure_credentials_form_agentless.tsx similarity index 100% rename from x-pack/plugins/cloud_security_posture/public/components/fleet_extensions/azure_credentials_form/azure_credentials_form_agentless.tsx rename to x-pack/solutions/security/plugins/cloud_security_posture/public/components/fleet_extensions/azure_credentials_form/azure_credentials_form_agentless.tsx diff --git a/x-pack/plugins/cloud_security_posture/public/components/fleet_extensions/azure_credentials_form/get_azure_credentials_form_options.tsx b/x-pack/solutions/security/plugins/cloud_security_posture/public/components/fleet_extensions/azure_credentials_form/get_azure_credentials_form_options.tsx similarity index 100% rename from x-pack/plugins/cloud_security_posture/public/components/fleet_extensions/azure_credentials_form/get_azure_credentials_form_options.tsx rename to x-pack/solutions/security/plugins/cloud_security_posture/public/components/fleet_extensions/azure_credentials_form/get_azure_credentials_form_options.tsx diff --git a/x-pack/plugins/cloud_security_posture/public/components/fleet_extensions/azure_credentials_form/hooks.ts b/x-pack/solutions/security/plugins/cloud_security_posture/public/components/fleet_extensions/azure_credentials_form/hooks.ts similarity index 100% rename from x-pack/plugins/cloud_security_posture/public/components/fleet_extensions/azure_credentials_form/hooks.ts rename to x-pack/solutions/security/plugins/cloud_security_posture/public/components/fleet_extensions/azure_credentials_form/hooks.ts diff --git a/x-pack/plugins/cloud_security_posture/public/components/fleet_extensions/csp_boxed_radio_group.tsx b/x-pack/solutions/security/plugins/cloud_security_posture/public/components/fleet_extensions/csp_boxed_radio_group.tsx similarity index 100% rename from x-pack/plugins/cloud_security_posture/public/components/fleet_extensions/csp_boxed_radio_group.tsx rename to x-pack/solutions/security/plugins/cloud_security_posture/public/components/fleet_extensions/csp_boxed_radio_group.tsx diff --git a/x-pack/plugins/cloud_security_posture/public/components/fleet_extensions/custom_assets_extension.tsx b/x-pack/solutions/security/plugins/cloud_security_posture/public/components/fleet_extensions/custom_assets_extension.tsx similarity index 100% rename from x-pack/plugins/cloud_security_posture/public/components/fleet_extensions/custom_assets_extension.tsx rename to x-pack/solutions/security/plugins/cloud_security_posture/public/components/fleet_extensions/custom_assets_extension.tsx diff --git a/x-pack/plugins/cloud_security_posture/public/components/fleet_extensions/eks_credentials_form.tsx b/x-pack/solutions/security/plugins/cloud_security_posture/public/components/fleet_extensions/eks_credentials_form.tsx similarity index 100% rename from x-pack/plugins/cloud_security_posture/public/components/fleet_extensions/eks_credentials_form.tsx rename to x-pack/solutions/security/plugins/cloud_security_posture/public/components/fleet_extensions/eks_credentials_form.tsx diff --git a/x-pack/plugins/cloud_security_posture/public/components/fleet_extensions/gcp_credentials_form/gcp_credential_form.tsx b/x-pack/solutions/security/plugins/cloud_security_posture/public/components/fleet_extensions/gcp_credentials_form/gcp_credential_form.tsx similarity index 100% rename from x-pack/plugins/cloud_security_posture/public/components/fleet_extensions/gcp_credentials_form/gcp_credential_form.tsx rename to x-pack/solutions/security/plugins/cloud_security_posture/public/components/fleet_extensions/gcp_credentials_form/gcp_credential_form.tsx diff --git a/x-pack/plugins/cloud_security_posture/public/components/fleet_extensions/gcp_credentials_form/gcp_credentials_form_agentless.tsx b/x-pack/solutions/security/plugins/cloud_security_posture/public/components/fleet_extensions/gcp_credentials_form/gcp_credentials_form_agentless.tsx similarity index 100% rename from x-pack/plugins/cloud_security_posture/public/components/fleet_extensions/gcp_credentials_form/gcp_credentials_form_agentless.tsx rename to x-pack/solutions/security/plugins/cloud_security_posture/public/components/fleet_extensions/gcp_credentials_form/gcp_credentials_form_agentless.tsx diff --git a/x-pack/plugins/cloud_security_posture/public/components/fleet_extensions/mocks.ts b/x-pack/solutions/security/plugins/cloud_security_posture/public/components/fleet_extensions/mocks.ts similarity index 100% rename from x-pack/plugins/cloud_security_posture/public/components/fleet_extensions/mocks.ts rename to x-pack/solutions/security/plugins/cloud_security_posture/public/components/fleet_extensions/mocks.ts diff --git a/x-pack/plugins/cloud_security_posture/public/components/fleet_extensions/policy_template_form.test.tsx b/x-pack/solutions/security/plugins/cloud_security_posture/public/components/fleet_extensions/policy_template_form.test.tsx similarity index 100% rename from x-pack/plugins/cloud_security_posture/public/components/fleet_extensions/policy_template_form.test.tsx rename to x-pack/solutions/security/plugins/cloud_security_posture/public/components/fleet_extensions/policy_template_form.test.tsx diff --git a/x-pack/plugins/cloud_security_posture/public/components/fleet_extensions/policy_template_form.tsx b/x-pack/solutions/security/plugins/cloud_security_posture/public/components/fleet_extensions/policy_template_form.tsx similarity index 100% rename from x-pack/plugins/cloud_security_posture/public/components/fleet_extensions/policy_template_form.tsx rename to x-pack/solutions/security/plugins/cloud_security_posture/public/components/fleet_extensions/policy_template_form.tsx diff --git a/x-pack/plugins/cloud_security_posture/public/components/fleet_extensions/policy_template_selectors.tsx b/x-pack/solutions/security/plugins/cloud_security_posture/public/components/fleet_extensions/policy_template_selectors.tsx similarity index 100% rename from x-pack/plugins/cloud_security_posture/public/components/fleet_extensions/policy_template_selectors.tsx rename to x-pack/solutions/security/plugins/cloud_security_posture/public/components/fleet_extensions/policy_template_selectors.tsx diff --git a/x-pack/plugins/cloud_security_posture/public/components/fleet_extensions/setup_technology_selector/setup_technology_selector.tsx b/x-pack/solutions/security/plugins/cloud_security_posture/public/components/fleet_extensions/setup_technology_selector/setup_technology_selector.tsx similarity index 100% rename from x-pack/plugins/cloud_security_posture/public/components/fleet_extensions/setup_technology_selector/setup_technology_selector.tsx rename to x-pack/solutions/security/plugins/cloud_security_posture/public/components/fleet_extensions/setup_technology_selector/setup_technology_selector.tsx diff --git a/x-pack/plugins/cloud_security_posture/public/components/fleet_extensions/setup_technology_selector/use_setup_technology.test.ts b/x-pack/solutions/security/plugins/cloud_security_posture/public/components/fleet_extensions/setup_technology_selector/use_setup_technology.test.ts similarity index 100% rename from x-pack/plugins/cloud_security_posture/public/components/fleet_extensions/setup_technology_selector/use_setup_technology.test.ts rename to x-pack/solutions/security/plugins/cloud_security_posture/public/components/fleet_extensions/setup_technology_selector/use_setup_technology.test.ts diff --git a/x-pack/plugins/cloud_security_posture/public/components/fleet_extensions/setup_technology_selector/use_setup_technology.ts b/x-pack/solutions/security/plugins/cloud_security_posture/public/components/fleet_extensions/setup_technology_selector/use_setup_technology.ts similarity index 100% rename from x-pack/plugins/cloud_security_posture/public/components/fleet_extensions/setup_technology_selector/use_setup_technology.ts rename to x-pack/solutions/security/plugins/cloud_security_posture/public/components/fleet_extensions/setup_technology_selector/use_setup_technology.ts diff --git a/x-pack/plugins/cloud_security_posture/public/components/fleet_extensions/utils.test.ts b/x-pack/solutions/security/plugins/cloud_security_posture/public/components/fleet_extensions/utils.test.ts similarity index 100% rename from x-pack/plugins/cloud_security_posture/public/components/fleet_extensions/utils.test.ts rename to x-pack/solutions/security/plugins/cloud_security_posture/public/components/fleet_extensions/utils.test.ts diff --git a/x-pack/plugins/cloud_security_posture/public/components/fleet_extensions/utils.ts b/x-pack/solutions/security/plugins/cloud_security_posture/public/components/fleet_extensions/utils.ts similarity index 100% rename from x-pack/plugins/cloud_security_posture/public/components/fleet_extensions/utils.ts rename to x-pack/solutions/security/plugins/cloud_security_posture/public/components/fleet_extensions/utils.ts diff --git a/x-pack/plugins/cloud_security_posture/public/components/full_size_centered_page.tsx b/x-pack/solutions/security/plugins/cloud_security_posture/public/components/full_size_centered_page.tsx similarity index 100% rename from x-pack/plugins/cloud_security_posture/public/components/full_size_centered_page.tsx rename to x-pack/solutions/security/plugins/cloud_security_posture/public/components/full_size_centered_page.tsx diff --git a/x-pack/plugins/cloud_security_posture/public/components/no_findings_states/index.ts b/x-pack/solutions/security/plugins/cloud_security_posture/public/components/no_findings_states/index.ts similarity index 100% rename from x-pack/plugins/cloud_security_posture/public/components/no_findings_states/index.ts rename to x-pack/solutions/security/plugins/cloud_security_posture/public/components/no_findings_states/index.ts diff --git a/x-pack/plugins/cloud_security_posture/public/components/no_findings_states/no_findings_states.test.tsx b/x-pack/solutions/security/plugins/cloud_security_posture/public/components/no_findings_states/no_findings_states.test.tsx similarity index 100% rename from x-pack/plugins/cloud_security_posture/public/components/no_findings_states/no_findings_states.test.tsx rename to x-pack/solutions/security/plugins/cloud_security_posture/public/components/no_findings_states/no_findings_states.test.tsx diff --git a/x-pack/plugins/cloud_security_posture/public/components/no_findings_states/no_findings_states.tsx b/x-pack/solutions/security/plugins/cloud_security_posture/public/components/no_findings_states/no_findings_states.tsx similarity index 100% rename from x-pack/plugins/cloud_security_posture/public/components/no_findings_states/no_findings_states.tsx rename to x-pack/solutions/security/plugins/cloud_security_posture/public/components/no_findings_states/no_findings_states.tsx diff --git a/x-pack/plugins/cloud_security_posture/public/components/no_vulnerabilities_states.tsx b/x-pack/solutions/security/plugins/cloud_security_posture/public/components/no_vulnerabilities_states.tsx similarity index 100% rename from x-pack/plugins/cloud_security_posture/public/components/no_vulnerabilities_states.tsx rename to x-pack/solutions/security/plugins/cloud_security_posture/public/components/no_vulnerabilities_states.tsx diff --git a/x-pack/plugins/cloud_security_posture/public/components/subscription_not_allowed.tsx b/x-pack/solutions/security/plugins/cloud_security_posture/public/components/subscription_not_allowed.tsx similarity index 100% rename from x-pack/plugins/cloud_security_posture/public/components/subscription_not_allowed.tsx rename to x-pack/solutions/security/plugins/cloud_security_posture/public/components/subscription_not_allowed.tsx diff --git a/x-pack/plugins/cloud_security_posture/public/components/take_action.tsx b/x-pack/solutions/security/plugins/cloud_security_posture/public/components/take_action.tsx similarity index 100% rename from x-pack/plugins/cloud_security_posture/public/components/take_action.tsx rename to x-pack/solutions/security/plugins/cloud_security_posture/public/components/take_action.tsx diff --git a/x-pack/plugins/cloud_security_posture/public/components/test_subjects.ts b/x-pack/solutions/security/plugins/cloud_security_posture/public/components/test_subjects.ts similarity index 100% rename from x-pack/plugins/cloud_security_posture/public/components/test_subjects.ts rename to x-pack/solutions/security/plugins/cloud_security_posture/public/components/test_subjects.ts diff --git a/x-pack/plugins/cloud_security_posture/public/components/timestamp_table_cell.tsx b/x-pack/solutions/security/plugins/cloud_security_posture/public/components/timestamp_table_cell.tsx similarity index 100% rename from x-pack/plugins/cloud_security_posture/public/components/timestamp_table_cell.tsx rename to x-pack/solutions/security/plugins/cloud_security_posture/public/components/timestamp_table_cell.tsx diff --git a/x-pack/plugins/cloud_security_posture/public/components/vuln_counter_card.tsx b/x-pack/solutions/security/plugins/cloud_security_posture/public/components/vuln_counter_card.tsx similarity index 100% rename from x-pack/plugins/cloud_security_posture/public/components/vuln_counter_card.tsx rename to x-pack/solutions/security/plugins/cloud_security_posture/public/components/vuln_counter_card.tsx diff --git a/x-pack/plugins/cloud_security_posture/public/components/vulnerability_severity_map.tsx b/x-pack/solutions/security/plugins/cloud_security_posture/public/components/vulnerability_severity_map.tsx similarity index 100% rename from x-pack/plugins/cloud_security_posture/public/components/vulnerability_severity_map.tsx rename to x-pack/solutions/security/plugins/cloud_security_posture/public/components/vulnerability_severity_map.tsx diff --git a/x-pack/plugins/cloud_security_posture/public/index.ts b/x-pack/solutions/security/plugins/cloud_security_posture/public/index.ts similarity index 100% rename from x-pack/plugins/cloud_security_posture/public/index.ts rename to x-pack/solutions/security/plugins/cloud_security_posture/public/index.ts diff --git a/x-pack/plugins/cloud_security_posture/public/pages/benchmarks/benchmarks.test.tsx b/x-pack/solutions/security/plugins/cloud_security_posture/public/pages/benchmarks/benchmarks.test.tsx similarity index 100% rename from x-pack/plugins/cloud_security_posture/public/pages/benchmarks/benchmarks.test.tsx rename to x-pack/solutions/security/plugins/cloud_security_posture/public/pages/benchmarks/benchmarks.test.tsx diff --git a/x-pack/plugins/cloud_security_posture/public/pages/benchmarks/benchmarks.tsx b/x-pack/solutions/security/plugins/cloud_security_posture/public/pages/benchmarks/benchmarks.tsx similarity index 100% rename from x-pack/plugins/cloud_security_posture/public/pages/benchmarks/benchmarks.tsx rename to x-pack/solutions/security/plugins/cloud_security_posture/public/pages/benchmarks/benchmarks.tsx diff --git a/x-pack/plugins/cloud_security_posture/public/pages/benchmarks/benchmarks_table.test.tsx b/x-pack/solutions/security/plugins/cloud_security_posture/public/pages/benchmarks/benchmarks_table.test.tsx similarity index 100% rename from x-pack/plugins/cloud_security_posture/public/pages/benchmarks/benchmarks_table.test.tsx rename to x-pack/solutions/security/plugins/cloud_security_posture/public/pages/benchmarks/benchmarks_table.test.tsx diff --git a/x-pack/plugins/cloud_security_posture/public/pages/benchmarks/benchmarks_table.tsx b/x-pack/solutions/security/plugins/cloud_security_posture/public/pages/benchmarks/benchmarks_table.tsx similarity index 100% rename from x-pack/plugins/cloud_security_posture/public/pages/benchmarks/benchmarks_table.tsx rename to x-pack/solutions/security/plugins/cloud_security_posture/public/pages/benchmarks/benchmarks_table.tsx diff --git a/x-pack/plugins/cloud_security_posture/public/pages/benchmarks/index.ts b/x-pack/solutions/security/plugins/cloud_security_posture/public/pages/benchmarks/index.ts similarity index 100% rename from x-pack/plugins/cloud_security_posture/public/pages/benchmarks/index.ts rename to x-pack/solutions/security/plugins/cloud_security_posture/public/pages/benchmarks/index.ts diff --git a/x-pack/plugins/cloud_security_posture/public/pages/benchmarks/test_subjects.ts b/x-pack/solutions/security/plugins/cloud_security_posture/public/pages/benchmarks/test_subjects.ts similarity index 100% rename from x-pack/plugins/cloud_security_posture/public/pages/benchmarks/test_subjects.ts rename to x-pack/solutions/security/plugins/cloud_security_posture/public/pages/benchmarks/test_subjects.ts diff --git a/x-pack/plugins/cloud_security_posture/public/pages/benchmarks/use_csp_benchmark_integrations.ts b/x-pack/solutions/security/plugins/cloud_security_posture/public/pages/benchmarks/use_csp_benchmark_integrations.ts similarity index 100% rename from x-pack/plugins/cloud_security_posture/public/pages/benchmarks/use_csp_benchmark_integrations.ts rename to x-pack/solutions/security/plugins/cloud_security_posture/public/pages/benchmarks/use_csp_benchmark_integrations.ts diff --git a/x-pack/plugins/cloud_security_posture/public/pages/compliance_dashboard/compliance_charts/compliance_score_chart.tsx b/x-pack/solutions/security/plugins/cloud_security_posture/public/pages/compliance_dashboard/compliance_charts/compliance_score_chart.tsx similarity index 100% rename from x-pack/plugins/cloud_security_posture/public/pages/compliance_dashboard/compliance_charts/compliance_score_chart.tsx rename to x-pack/solutions/security/plugins/cloud_security_posture/public/pages/compliance_dashboard/compliance_charts/compliance_score_chart.tsx diff --git a/x-pack/plugins/cloud_security_posture/public/pages/compliance_dashboard/compliance_charts/risks_table.test.ts b/x-pack/solutions/security/plugins/cloud_security_posture/public/pages/compliance_dashboard/compliance_charts/risks_table.test.ts similarity index 100% rename from x-pack/plugins/cloud_security_posture/public/pages/compliance_dashboard/compliance_charts/risks_table.test.ts rename to x-pack/solutions/security/plugins/cloud_security_posture/public/pages/compliance_dashboard/compliance_charts/risks_table.test.ts diff --git a/x-pack/plugins/cloud_security_posture/public/pages/compliance_dashboard/compliance_charts/risks_table.tsx b/x-pack/solutions/security/plugins/cloud_security_posture/public/pages/compliance_dashboard/compliance_charts/risks_table.tsx similarity index 100% rename from x-pack/plugins/cloud_security_posture/public/pages/compliance_dashboard/compliance_charts/risks_table.tsx rename to x-pack/solutions/security/plugins/cloud_security_posture/public/pages/compliance_dashboard/compliance_charts/risks_table.tsx diff --git a/x-pack/plugins/cloud_security_posture/public/pages/compliance_dashboard/compliance_dashboard.test.tsx b/x-pack/solutions/security/plugins/cloud_security_posture/public/pages/compliance_dashboard/compliance_dashboard.test.tsx similarity index 100% rename from x-pack/plugins/cloud_security_posture/public/pages/compliance_dashboard/compliance_dashboard.test.tsx rename to x-pack/solutions/security/plugins/cloud_security_posture/public/pages/compliance_dashboard/compliance_dashboard.test.tsx diff --git a/x-pack/plugins/cloud_security_posture/public/pages/compliance_dashboard/compliance_dashboard.tsx b/x-pack/solutions/security/plugins/cloud_security_posture/public/pages/compliance_dashboard/compliance_dashboard.tsx similarity index 100% rename from x-pack/plugins/cloud_security_posture/public/pages/compliance_dashboard/compliance_dashboard.tsx rename to x-pack/solutions/security/plugins/cloud_security_posture/public/pages/compliance_dashboard/compliance_dashboard.tsx diff --git a/x-pack/plugins/cloud_security_posture/public/pages/compliance_dashboard/dashboard_sections/benchmark_details_box.tsx b/x-pack/solutions/security/plugins/cloud_security_posture/public/pages/compliance_dashboard/dashboard_sections/benchmark_details_box.tsx similarity index 100% rename from x-pack/plugins/cloud_security_posture/public/pages/compliance_dashboard/dashboard_sections/benchmark_details_box.tsx rename to x-pack/solutions/security/plugins/cloud_security_posture/public/pages/compliance_dashboard/dashboard_sections/benchmark_details_box.tsx diff --git a/x-pack/plugins/cloud_security_posture/public/pages/compliance_dashboard/dashboard_sections/benchmarks_section.test.tsx b/x-pack/solutions/security/plugins/cloud_security_posture/public/pages/compliance_dashboard/dashboard_sections/benchmarks_section.test.tsx similarity index 100% rename from x-pack/plugins/cloud_security_posture/public/pages/compliance_dashboard/dashboard_sections/benchmarks_section.test.tsx rename to x-pack/solutions/security/plugins/cloud_security_posture/public/pages/compliance_dashboard/dashboard_sections/benchmarks_section.test.tsx diff --git a/x-pack/plugins/cloud_security_posture/public/pages/compliance_dashboard/dashboard_sections/benchmarks_section.tsx b/x-pack/solutions/security/plugins/cloud_security_posture/public/pages/compliance_dashboard/dashboard_sections/benchmarks_section.tsx similarity index 100% rename from x-pack/plugins/cloud_security_posture/public/pages/compliance_dashboard/dashboard_sections/benchmarks_section.tsx rename to x-pack/solutions/security/plugins/cloud_security_posture/public/pages/compliance_dashboard/dashboard_sections/benchmarks_section.tsx diff --git a/x-pack/plugins/cloud_security_posture/public/pages/compliance_dashboard/dashboard_sections/summary_section.test.tsx b/x-pack/solutions/security/plugins/cloud_security_posture/public/pages/compliance_dashboard/dashboard_sections/summary_section.test.tsx similarity index 100% rename from x-pack/plugins/cloud_security_posture/public/pages/compliance_dashboard/dashboard_sections/summary_section.test.tsx rename to x-pack/solutions/security/plugins/cloud_security_posture/public/pages/compliance_dashboard/dashboard_sections/summary_section.test.tsx diff --git a/x-pack/plugins/cloud_security_posture/public/pages/compliance_dashboard/dashboard_sections/summary_section.tsx b/x-pack/solutions/security/plugins/cloud_security_posture/public/pages/compliance_dashboard/dashboard_sections/summary_section.tsx similarity index 100% rename from x-pack/plugins/cloud_security_posture/public/pages/compliance_dashboard/dashboard_sections/summary_section.tsx rename to x-pack/solutions/security/plugins/cloud_security_posture/public/pages/compliance_dashboard/dashboard_sections/summary_section.tsx diff --git a/x-pack/plugins/cloud_security_posture/public/pages/compliance_dashboard/index.tsx b/x-pack/solutions/security/plugins/cloud_security_posture/public/pages/compliance_dashboard/index.tsx similarity index 100% rename from x-pack/plugins/cloud_security_posture/public/pages/compliance_dashboard/index.tsx rename to x-pack/solutions/security/plugins/cloud_security_posture/public/pages/compliance_dashboard/index.tsx diff --git a/x-pack/plugins/cloud_security_posture/public/pages/compliance_dashboard/mock.ts b/x-pack/solutions/security/plugins/cloud_security_posture/public/pages/compliance_dashboard/mock.ts similarity index 100% rename from x-pack/plugins/cloud_security_posture/public/pages/compliance_dashboard/mock.ts rename to x-pack/solutions/security/plugins/cloud_security_posture/public/pages/compliance_dashboard/mock.ts diff --git a/x-pack/plugins/cloud_security_posture/public/pages/compliance_dashboard/test_subjects.ts b/x-pack/solutions/security/plugins/cloud_security_posture/public/pages/compliance_dashboard/test_subjects.ts similarity index 100% rename from x-pack/plugins/cloud_security_posture/public/pages/compliance_dashboard/test_subjects.ts rename to x-pack/solutions/security/plugins/cloud_security_posture/public/pages/compliance_dashboard/test_subjects.ts diff --git a/x-pack/plugins/cloud_security_posture/public/pages/configurations/__mocks__/findings.ts b/x-pack/solutions/security/plugins/cloud_security_posture/public/pages/configurations/__mocks__/findings.ts similarity index 100% rename from x-pack/plugins/cloud_security_posture/public/pages/configurations/__mocks__/findings.ts rename to x-pack/solutions/security/plugins/cloud_security_posture/public/pages/configurations/__mocks__/findings.ts diff --git a/x-pack/plugins/cloud_security_posture/public/pages/configurations/configurations.handlers.mock.ts b/x-pack/solutions/security/plugins/cloud_security_posture/public/pages/configurations/configurations.handlers.mock.ts similarity index 100% rename from x-pack/plugins/cloud_security_posture/public/pages/configurations/configurations.handlers.mock.ts rename to x-pack/solutions/security/plugins/cloud_security_posture/public/pages/configurations/configurations.handlers.mock.ts diff --git a/x-pack/plugins/cloud_security_posture/public/pages/configurations/configurations.test.tsx b/x-pack/solutions/security/plugins/cloud_security_posture/public/pages/configurations/configurations.test.tsx similarity index 100% rename from x-pack/plugins/cloud_security_posture/public/pages/configurations/configurations.test.tsx rename to x-pack/solutions/security/plugins/cloud_security_posture/public/pages/configurations/configurations.test.tsx diff --git a/x-pack/plugins/cloud_security_posture/public/pages/configurations/configurations.tsx b/x-pack/solutions/security/plugins/cloud_security_posture/public/pages/configurations/configurations.tsx similarity index 100% rename from x-pack/plugins/cloud_security_posture/public/pages/configurations/configurations.tsx rename to x-pack/solutions/security/plugins/cloud_security_posture/public/pages/configurations/configurations.tsx diff --git a/x-pack/plugins/cloud_security_posture/public/pages/configurations/findings_flyout/findings_detection_rule_counter.tsx b/x-pack/solutions/security/plugins/cloud_security_posture/public/pages/configurations/findings_flyout/findings_detection_rule_counter.tsx similarity index 100% rename from x-pack/plugins/cloud_security_posture/public/pages/configurations/findings_flyout/findings_detection_rule_counter.tsx rename to x-pack/solutions/security/plugins/cloud_security_posture/public/pages/configurations/findings_flyout/findings_detection_rule_counter.tsx diff --git a/x-pack/plugins/cloud_security_posture/public/pages/configurations/findings_flyout/findings_flyout.test.tsx b/x-pack/solutions/security/plugins/cloud_security_posture/public/pages/configurations/findings_flyout/findings_flyout.test.tsx similarity index 100% rename from x-pack/plugins/cloud_security_posture/public/pages/configurations/findings_flyout/findings_flyout.test.tsx rename to x-pack/solutions/security/plugins/cloud_security_posture/public/pages/configurations/findings_flyout/findings_flyout.test.tsx diff --git a/x-pack/plugins/cloud_security_posture/public/pages/configurations/findings_flyout/findings_flyout.tsx b/x-pack/solutions/security/plugins/cloud_security_posture/public/pages/configurations/findings_flyout/findings_flyout.tsx similarity index 100% rename from x-pack/plugins/cloud_security_posture/public/pages/configurations/findings_flyout/findings_flyout.tsx rename to x-pack/solutions/security/plugins/cloud_security_posture/public/pages/configurations/findings_flyout/findings_flyout.tsx diff --git a/x-pack/plugins/cloud_security_posture/public/pages/configurations/findings_flyout/json_tab.tsx b/x-pack/solutions/security/plugins/cloud_security_posture/public/pages/configurations/findings_flyout/json_tab.tsx similarity index 100% rename from x-pack/plugins/cloud_security_posture/public/pages/configurations/findings_flyout/json_tab.tsx rename to x-pack/solutions/security/plugins/cloud_security_posture/public/pages/configurations/findings_flyout/json_tab.tsx diff --git a/x-pack/plugins/cloud_security_posture/public/pages/configurations/findings_flyout/overview_tab.tsx b/x-pack/solutions/security/plugins/cloud_security_posture/public/pages/configurations/findings_flyout/overview_tab.tsx similarity index 100% rename from x-pack/plugins/cloud_security_posture/public/pages/configurations/findings_flyout/overview_tab.tsx rename to x-pack/solutions/security/plugins/cloud_security_posture/public/pages/configurations/findings_flyout/overview_tab.tsx diff --git a/x-pack/plugins/cloud_security_posture/public/pages/configurations/findings_flyout/rule_tab.tsx b/x-pack/solutions/security/plugins/cloud_security_posture/public/pages/configurations/findings_flyout/rule_tab.tsx similarity index 100% rename from x-pack/plugins/cloud_security_posture/public/pages/configurations/findings_flyout/rule_tab.tsx rename to x-pack/solutions/security/plugins/cloud_security_posture/public/pages/configurations/findings_flyout/rule_tab.tsx diff --git a/x-pack/plugins/cloud_security_posture/public/pages/configurations/findings_flyout/table_tab.tsx b/x-pack/solutions/security/plugins/cloud_security_posture/public/pages/configurations/findings_flyout/table_tab.tsx similarity index 100% rename from x-pack/plugins/cloud_security_posture/public/pages/configurations/findings_flyout/table_tab.tsx rename to x-pack/solutions/security/plugins/cloud_security_posture/public/pages/configurations/findings_flyout/table_tab.tsx diff --git a/x-pack/plugins/cloud_security_posture/public/pages/configurations/index.tsx b/x-pack/solutions/security/plugins/cloud_security_posture/public/pages/configurations/index.tsx similarity index 100% rename from x-pack/plugins/cloud_security_posture/public/pages/configurations/index.tsx rename to x-pack/solutions/security/plugins/cloud_security_posture/public/pages/configurations/index.tsx diff --git a/x-pack/plugins/cloud_security_posture/public/pages/configurations/latest_findings/constants.ts b/x-pack/solutions/security/plugins/cloud_security_posture/public/pages/configurations/latest_findings/constants.ts similarity index 100% rename from x-pack/plugins/cloud_security_posture/public/pages/configurations/latest_findings/constants.ts rename to x-pack/solutions/security/plugins/cloud_security_posture/public/pages/configurations/latest_findings/constants.ts diff --git a/x-pack/plugins/cloud_security_posture/public/pages/configurations/latest_findings/findings_table_field_labels.ts b/x-pack/solutions/security/plugins/cloud_security_posture/public/pages/configurations/latest_findings/findings_table_field_labels.ts similarity index 100% rename from x-pack/plugins/cloud_security_posture/public/pages/configurations/latest_findings/findings_table_field_labels.ts rename to x-pack/solutions/security/plugins/cloud_security_posture/public/pages/configurations/latest_findings/findings_table_field_labels.ts diff --git a/x-pack/plugins/cloud_security_posture/public/pages/configurations/latest_findings/latest_findings_container.tsx b/x-pack/solutions/security/plugins/cloud_security_posture/public/pages/configurations/latest_findings/latest_findings_container.tsx similarity index 100% rename from x-pack/plugins/cloud_security_posture/public/pages/configurations/latest_findings/latest_findings_container.tsx rename to x-pack/solutions/security/plugins/cloud_security_posture/public/pages/configurations/latest_findings/latest_findings_container.tsx diff --git a/x-pack/plugins/cloud_security_posture/public/pages/configurations/latest_findings/latest_findings_group_renderer.test.tsx b/x-pack/solutions/security/plugins/cloud_security_posture/public/pages/configurations/latest_findings/latest_findings_group_renderer.test.tsx similarity index 100% rename from x-pack/plugins/cloud_security_posture/public/pages/configurations/latest_findings/latest_findings_group_renderer.test.tsx rename to x-pack/solutions/security/plugins/cloud_security_posture/public/pages/configurations/latest_findings/latest_findings_group_renderer.test.tsx diff --git a/x-pack/plugins/cloud_security_posture/public/pages/configurations/latest_findings/latest_findings_group_renderer.tsx b/x-pack/solutions/security/plugins/cloud_security_posture/public/pages/configurations/latest_findings/latest_findings_group_renderer.tsx similarity index 100% rename from x-pack/plugins/cloud_security_posture/public/pages/configurations/latest_findings/latest_findings_group_renderer.tsx rename to x-pack/solutions/security/plugins/cloud_security_posture/public/pages/configurations/latest_findings/latest_findings_group_renderer.tsx diff --git a/x-pack/plugins/cloud_security_posture/public/pages/configurations/latest_findings/latest_findings_table.tsx b/x-pack/solutions/security/plugins/cloud_security_posture/public/pages/configurations/latest_findings/latest_findings_table.tsx similarity index 100% rename from x-pack/plugins/cloud_security_posture/public/pages/configurations/latest_findings/latest_findings_table.tsx rename to x-pack/solutions/security/plugins/cloud_security_posture/public/pages/configurations/latest_findings/latest_findings_table.tsx diff --git a/x-pack/plugins/cloud_security_posture/public/pages/configurations/latest_findings/use_grouped_findings.tsx b/x-pack/solutions/security/plugins/cloud_security_posture/public/pages/configurations/latest_findings/use_grouped_findings.tsx similarity index 100% rename from x-pack/plugins/cloud_security_posture/public/pages/configurations/latest_findings/use_grouped_findings.tsx rename to x-pack/solutions/security/plugins/cloud_security_posture/public/pages/configurations/latest_findings/use_grouped_findings.tsx diff --git a/x-pack/plugins/cloud_security_posture/public/pages/configurations/latest_findings/use_latest_findings.ts b/x-pack/solutions/security/plugins/cloud_security_posture/public/pages/configurations/latest_findings/use_latest_findings.ts similarity index 100% rename from x-pack/plugins/cloud_security_posture/public/pages/configurations/latest_findings/use_latest_findings.ts rename to x-pack/solutions/security/plugins/cloud_security_posture/public/pages/configurations/latest_findings/use_latest_findings.ts diff --git a/x-pack/plugins/cloud_security_posture/public/pages/configurations/latest_findings/use_latest_findings_grouping.tsx b/x-pack/solutions/security/plugins/cloud_security_posture/public/pages/configurations/latest_findings/use_latest_findings_grouping.tsx similarity index 100% rename from x-pack/plugins/cloud_security_posture/public/pages/configurations/latest_findings/use_latest_findings_grouping.tsx rename to x-pack/solutions/security/plugins/cloud_security_posture/public/pages/configurations/latest_findings/use_latest_findings_grouping.tsx diff --git a/x-pack/plugins/cloud_security_posture/public/pages/configurations/latest_findings/use_latest_findings_table.tsx b/x-pack/solutions/security/plugins/cloud_security_posture/public/pages/configurations/latest_findings/use_latest_findings_table.tsx similarity index 100% rename from x-pack/plugins/cloud_security_posture/public/pages/configurations/latest_findings/use_latest_findings_table.tsx rename to x-pack/solutions/security/plugins/cloud_security_posture/public/pages/configurations/latest_findings/use_latest_findings_table.tsx diff --git a/x-pack/plugins/cloud_security_posture/public/pages/configurations/layout/error_callout.tsx b/x-pack/solutions/security/plugins/cloud_security_posture/public/pages/configurations/layout/error_callout.tsx similarity index 100% rename from x-pack/plugins/cloud_security_posture/public/pages/configurations/layout/error_callout.tsx rename to x-pack/solutions/security/plugins/cloud_security_posture/public/pages/configurations/layout/error_callout.tsx diff --git a/x-pack/plugins/cloud_security_posture/public/pages/configurations/layout/findings_distribution_bar.tsx b/x-pack/solutions/security/plugins/cloud_security_posture/public/pages/configurations/layout/findings_distribution_bar.tsx similarity index 100% rename from x-pack/plugins/cloud_security_posture/public/pages/configurations/layout/findings_distribution_bar.tsx rename to x-pack/solutions/security/plugins/cloud_security_posture/public/pages/configurations/layout/findings_distribution_bar.tsx diff --git a/x-pack/plugins/cloud_security_posture/public/pages/configurations/layout/findings_search_bar.tsx b/x-pack/solutions/security/plugins/cloud_security_posture/public/pages/configurations/layout/findings_search_bar.tsx similarity index 100% rename from x-pack/plugins/cloud_security_posture/public/pages/configurations/layout/findings_search_bar.tsx rename to x-pack/solutions/security/plugins/cloud_security_posture/public/pages/configurations/layout/findings_search_bar.tsx diff --git a/x-pack/plugins/cloud_security_posture/public/pages/configurations/test_subjects.ts b/x-pack/solutions/security/plugins/cloud_security_posture/public/pages/configurations/test_subjects.ts similarity index 100% rename from x-pack/plugins/cloud_security_posture/public/pages/configurations/test_subjects.ts rename to x-pack/solutions/security/plugins/cloud_security_posture/public/pages/configurations/test_subjects.ts diff --git a/x-pack/plugins/cloud_security_posture/public/pages/configurations/utils/create_detection_rule_from_benchmark.ts b/x-pack/solutions/security/plugins/cloud_security_posture/public/pages/configurations/utils/create_detection_rule_from_benchmark.ts similarity index 100% rename from x-pack/plugins/cloud_security_posture/public/pages/configurations/utils/create_detection_rule_from_benchmark.ts rename to x-pack/solutions/security/plugins/cloud_security_posture/public/pages/configurations/utils/create_detection_rule_from_benchmark.ts diff --git a/x-pack/plugins/cloud_security_posture/public/pages/configurations/utils/get_filters.test.ts b/x-pack/solutions/security/plugins/cloud_security_posture/public/pages/configurations/utils/get_filters.test.ts similarity index 100% rename from x-pack/plugins/cloud_security_posture/public/pages/configurations/utils/get_filters.test.ts rename to x-pack/solutions/security/plugins/cloud_security_posture/public/pages/configurations/utils/get_filters.test.ts diff --git a/x-pack/plugins/cloud_security_posture/public/pages/configurations/utils/get_filters.ts b/x-pack/solutions/security/plugins/cloud_security_posture/public/pages/configurations/utils/get_filters.ts similarity index 100% rename from x-pack/plugins/cloud_security_posture/public/pages/configurations/utils/get_filters.ts rename to x-pack/solutions/security/plugins/cloud_security_posture/public/pages/configurations/utils/get_filters.ts diff --git a/x-pack/plugins/cloud_security_posture/public/pages/configurations/utils/utils.ts b/x-pack/solutions/security/plugins/cloud_security_posture/public/pages/configurations/utils/utils.ts similarity index 100% rename from x-pack/plugins/cloud_security_posture/public/pages/configurations/utils/utils.ts rename to x-pack/solutions/security/plugins/cloud_security_posture/public/pages/configurations/utils/utils.ts diff --git a/x-pack/plugins/cloud_security_posture/public/pages/findings/findings.tsx b/x-pack/solutions/security/plugins/cloud_security_posture/public/pages/findings/findings.tsx similarity index 100% rename from x-pack/plugins/cloud_security_posture/public/pages/findings/findings.tsx rename to x-pack/solutions/security/plugins/cloud_security_posture/public/pages/findings/findings.tsx diff --git a/x-pack/plugins/cloud_security_posture/public/pages/findings/index.tsx b/x-pack/solutions/security/plugins/cloud_security_posture/public/pages/findings/index.tsx similarity index 100% rename from x-pack/plugins/cloud_security_posture/public/pages/findings/index.tsx rename to x-pack/solutions/security/plugins/cloud_security_posture/public/pages/findings/index.tsx diff --git a/x-pack/plugins/cloud_security_posture/public/pages/findings/third_party_integrations_callout.tsx b/x-pack/solutions/security/plugins/cloud_security_posture/public/pages/findings/third_party_integrations_callout.tsx similarity index 100% rename from x-pack/plugins/cloud_security_posture/public/pages/findings/third_party_integrations_callout.tsx rename to x-pack/solutions/security/plugins/cloud_security_posture/public/pages/findings/third_party_integrations_callout.tsx diff --git a/x-pack/plugins/cloud_security_posture/public/pages/index.ts b/x-pack/solutions/security/plugins/cloud_security_posture/public/pages/index.ts similarity index 100% rename from x-pack/plugins/cloud_security_posture/public/pages/index.ts rename to x-pack/solutions/security/plugins/cloud_security_posture/public/pages/index.ts diff --git a/x-pack/plugins/cloud_security_posture/public/pages/rules/index.tsx b/x-pack/solutions/security/plugins/cloud_security_posture/public/pages/rules/index.tsx similarity index 100% rename from x-pack/plugins/cloud_security_posture/public/pages/rules/index.tsx rename to x-pack/solutions/security/plugins/cloud_security_posture/public/pages/rules/index.tsx diff --git a/x-pack/plugins/cloud_security_posture/public/pages/rules/rules.test.tsx b/x-pack/solutions/security/plugins/cloud_security_posture/public/pages/rules/rules.test.tsx similarity index 100% rename from x-pack/plugins/cloud_security_posture/public/pages/rules/rules.test.tsx rename to x-pack/solutions/security/plugins/cloud_security_posture/public/pages/rules/rules.test.tsx diff --git a/x-pack/plugins/cloud_security_posture/public/pages/rules/rules_container.test.tsx b/x-pack/solutions/security/plugins/cloud_security_posture/public/pages/rules/rules_container.test.tsx similarity index 100% rename from x-pack/plugins/cloud_security_posture/public/pages/rules/rules_container.test.tsx rename to x-pack/solutions/security/plugins/cloud_security_posture/public/pages/rules/rules_container.test.tsx diff --git a/x-pack/plugins/cloud_security_posture/public/pages/rules/rules_container.tsx b/x-pack/solutions/security/plugins/cloud_security_posture/public/pages/rules/rules_container.tsx similarity index 100% rename from x-pack/plugins/cloud_security_posture/public/pages/rules/rules_container.tsx rename to x-pack/solutions/security/plugins/cloud_security_posture/public/pages/rules/rules_container.tsx diff --git a/x-pack/plugins/cloud_security_posture/public/pages/rules/rules_counters.tsx b/x-pack/solutions/security/plugins/cloud_security_posture/public/pages/rules/rules_counters.tsx similarity index 100% rename from x-pack/plugins/cloud_security_posture/public/pages/rules/rules_counters.tsx rename to x-pack/solutions/security/plugins/cloud_security_posture/public/pages/rules/rules_counters.tsx diff --git a/x-pack/plugins/cloud_security_posture/public/pages/rules/rules_detection_rule_counter.tsx b/x-pack/solutions/security/plugins/cloud_security_posture/public/pages/rules/rules_detection_rule_counter.tsx similarity index 100% rename from x-pack/plugins/cloud_security_posture/public/pages/rules/rules_detection_rule_counter.tsx rename to x-pack/solutions/security/plugins/cloud_security_posture/public/pages/rules/rules_detection_rule_counter.tsx diff --git a/x-pack/plugins/cloud_security_posture/public/pages/rules/rules_flyout.tsx b/x-pack/solutions/security/plugins/cloud_security_posture/public/pages/rules/rules_flyout.tsx similarity index 100% rename from x-pack/plugins/cloud_security_posture/public/pages/rules/rules_flyout.tsx rename to x-pack/solutions/security/plugins/cloud_security_posture/public/pages/rules/rules_flyout.tsx diff --git a/x-pack/plugins/cloud_security_posture/public/pages/rules/rules_table.tsx b/x-pack/solutions/security/plugins/cloud_security_posture/public/pages/rules/rules_table.tsx similarity index 100% rename from x-pack/plugins/cloud_security_posture/public/pages/rules/rules_table.tsx rename to x-pack/solutions/security/plugins/cloud_security_posture/public/pages/rules/rules_table.tsx diff --git a/x-pack/plugins/cloud_security_posture/public/pages/rules/rules_table_header.tsx b/x-pack/solutions/security/plugins/cloud_security_posture/public/pages/rules/rules_table_header.tsx similarity index 100% rename from x-pack/plugins/cloud_security_posture/public/pages/rules/rules_table_header.tsx rename to x-pack/solutions/security/plugins/cloud_security_posture/public/pages/rules/rules_table_header.tsx diff --git a/x-pack/plugins/cloud_security_posture/public/pages/rules/test_subjects.ts b/x-pack/solutions/security/plugins/cloud_security_posture/public/pages/rules/test_subjects.ts similarity index 100% rename from x-pack/plugins/cloud_security_posture/public/pages/rules/test_subjects.ts rename to x-pack/solutions/security/plugins/cloud_security_posture/public/pages/rules/test_subjects.ts diff --git a/x-pack/plugins/cloud_security_posture/public/pages/rules/use_change_csp_rule_state.test.tsx b/x-pack/solutions/security/plugins/cloud_security_posture/public/pages/rules/use_change_csp_rule_state.test.tsx similarity index 100% rename from x-pack/plugins/cloud_security_posture/public/pages/rules/use_change_csp_rule_state.test.tsx rename to x-pack/solutions/security/plugins/cloud_security_posture/public/pages/rules/use_change_csp_rule_state.test.tsx diff --git a/x-pack/plugins/cloud_security_posture/public/pages/rules/use_change_csp_rule_state.tsx b/x-pack/solutions/security/plugins/cloud_security_posture/public/pages/rules/use_change_csp_rule_state.tsx similarity index 100% rename from x-pack/plugins/cloud_security_posture/public/pages/rules/use_change_csp_rule_state.tsx rename to x-pack/solutions/security/plugins/cloud_security_posture/public/pages/rules/use_change_csp_rule_state.tsx diff --git a/x-pack/plugins/cloud_security_posture/public/pages/rules/use_csp_benchmark_rules.ts b/x-pack/solutions/security/plugins/cloud_security_posture/public/pages/rules/use_csp_benchmark_rules.ts similarity index 100% rename from x-pack/plugins/cloud_security_posture/public/pages/rules/use_csp_benchmark_rules.ts rename to x-pack/solutions/security/plugins/cloud_security_posture/public/pages/rules/use_csp_benchmark_rules.ts diff --git a/x-pack/plugins/cloud_security_posture/public/pages/rules/use_csp_rules_state.ts b/x-pack/solutions/security/plugins/cloud_security_posture/public/pages/rules/use_csp_rules_state.ts similarity index 100% rename from x-pack/plugins/cloud_security_posture/public/pages/rules/use_csp_rules_state.ts rename to x-pack/solutions/security/plugins/cloud_security_posture/public/pages/rules/use_csp_rules_state.ts diff --git a/x-pack/plugins/cloud_security_posture/public/pages/vulnerabilities/_mocks_/vulnerability.mock.ts b/x-pack/solutions/security/plugins/cloud_security_posture/public/pages/vulnerabilities/_mocks_/vulnerability.mock.ts similarity index 100% rename from x-pack/plugins/cloud_security_posture/public/pages/vulnerabilities/_mocks_/vulnerability.mock.ts rename to x-pack/solutions/security/plugins/cloud_security_posture/public/pages/vulnerabilities/_mocks_/vulnerability.mock.ts diff --git a/x-pack/plugins/cloud_security_posture/public/pages/vulnerabilities/constants.ts b/x-pack/solutions/security/plugins/cloud_security_posture/public/pages/vulnerabilities/constants.ts similarity index 100% rename from x-pack/plugins/cloud_security_posture/public/pages/vulnerabilities/constants.ts rename to x-pack/solutions/security/plugins/cloud_security_posture/public/pages/vulnerabilities/constants.ts diff --git a/x-pack/plugins/cloud_security_posture/public/pages/vulnerabilities/hooks/use_grouped_vulnerabilities.tsx b/x-pack/solutions/security/plugins/cloud_security_posture/public/pages/vulnerabilities/hooks/use_grouped_vulnerabilities.tsx similarity index 100% rename from x-pack/plugins/cloud_security_posture/public/pages/vulnerabilities/hooks/use_grouped_vulnerabilities.tsx rename to x-pack/solutions/security/plugins/cloud_security_posture/public/pages/vulnerabilities/hooks/use_grouped_vulnerabilities.tsx diff --git a/x-pack/plugins/cloud_security_posture/public/pages/vulnerabilities/hooks/use_latest_vulnerabilities.tsx b/x-pack/solutions/security/plugins/cloud_security_posture/public/pages/vulnerabilities/hooks/use_latest_vulnerabilities.tsx similarity index 100% rename from x-pack/plugins/cloud_security_posture/public/pages/vulnerabilities/hooks/use_latest_vulnerabilities.tsx rename to x-pack/solutions/security/plugins/cloud_security_posture/public/pages/vulnerabilities/hooks/use_latest_vulnerabilities.tsx diff --git a/x-pack/plugins/cloud_security_posture/public/pages/vulnerabilities/hooks/use_latest_vulnerabilities_grouping.tsx b/x-pack/solutions/security/plugins/cloud_security_posture/public/pages/vulnerabilities/hooks/use_latest_vulnerabilities_grouping.tsx similarity index 100% rename from x-pack/plugins/cloud_security_posture/public/pages/vulnerabilities/hooks/use_latest_vulnerabilities_grouping.tsx rename to x-pack/solutions/security/plugins/cloud_security_posture/public/pages/vulnerabilities/hooks/use_latest_vulnerabilities_grouping.tsx diff --git a/x-pack/plugins/cloud_security_posture/public/pages/vulnerabilities/hooks/use_latest_vulnerabilities_table.tsx b/x-pack/solutions/security/plugins/cloud_security_posture/public/pages/vulnerabilities/hooks/use_latest_vulnerabilities_table.tsx similarity index 100% rename from x-pack/plugins/cloud_security_posture/public/pages/vulnerabilities/hooks/use_latest_vulnerabilities_table.tsx rename to x-pack/solutions/security/plugins/cloud_security_posture/public/pages/vulnerabilities/hooks/use_latest_vulnerabilities_table.tsx diff --git a/x-pack/plugins/cloud_security_posture/public/pages/vulnerabilities/index.tsx b/x-pack/solutions/security/plugins/cloud_security_posture/public/pages/vulnerabilities/index.tsx similarity index 100% rename from x-pack/plugins/cloud_security_posture/public/pages/vulnerabilities/index.tsx rename to x-pack/solutions/security/plugins/cloud_security_posture/public/pages/vulnerabilities/index.tsx diff --git a/x-pack/plugins/cloud_security_posture/public/pages/vulnerabilities/latest_vulnerabilities_container.tsx b/x-pack/solutions/security/plugins/cloud_security_posture/public/pages/vulnerabilities/latest_vulnerabilities_container.tsx similarity index 100% rename from x-pack/plugins/cloud_security_posture/public/pages/vulnerabilities/latest_vulnerabilities_container.tsx rename to x-pack/solutions/security/plugins/cloud_security_posture/public/pages/vulnerabilities/latest_vulnerabilities_container.tsx diff --git a/x-pack/plugins/cloud_security_posture/public/pages/vulnerabilities/latest_vulnerabilities_group_renderer.tsx b/x-pack/solutions/security/plugins/cloud_security_posture/public/pages/vulnerabilities/latest_vulnerabilities_group_renderer.tsx similarity index 100% rename from x-pack/plugins/cloud_security_posture/public/pages/vulnerabilities/latest_vulnerabilities_group_renderer.tsx rename to x-pack/solutions/security/plugins/cloud_security_posture/public/pages/vulnerabilities/latest_vulnerabilities_group_renderer.tsx diff --git a/x-pack/plugins/cloud_security_posture/public/pages/vulnerabilities/latest_vulnerabilities_table.tsx b/x-pack/solutions/security/plugins/cloud_security_posture/public/pages/vulnerabilities/latest_vulnerabilities_table.tsx similarity index 100% rename from x-pack/plugins/cloud_security_posture/public/pages/vulnerabilities/latest_vulnerabilities_table.tsx rename to x-pack/solutions/security/plugins/cloud_security_posture/public/pages/vulnerabilities/latest_vulnerabilities_table.tsx diff --git a/x-pack/plugins/cloud_security_posture/public/pages/vulnerabilities/test_subjects.ts b/x-pack/solutions/security/plugins/cloud_security_posture/public/pages/vulnerabilities/test_subjects.ts similarity index 100% rename from x-pack/plugins/cloud_security_posture/public/pages/vulnerabilities/test_subjects.ts rename to x-pack/solutions/security/plugins/cloud_security_posture/public/pages/vulnerabilities/test_subjects.ts diff --git a/x-pack/plugins/cloud_security_posture/public/pages/vulnerabilities/translations.ts b/x-pack/solutions/security/plugins/cloud_security_posture/public/pages/vulnerabilities/translations.ts similarity index 100% rename from x-pack/plugins/cloud_security_posture/public/pages/vulnerabilities/translations.ts rename to x-pack/solutions/security/plugins/cloud_security_posture/public/pages/vulnerabilities/translations.ts diff --git a/x-pack/plugins/cloud_security_posture/public/pages/vulnerabilities/types.ts b/x-pack/solutions/security/plugins/cloud_security_posture/public/pages/vulnerabilities/types.ts similarity index 100% rename from x-pack/plugins/cloud_security_posture/public/pages/vulnerabilities/types.ts rename to x-pack/solutions/security/plugins/cloud_security_posture/public/pages/vulnerabilities/types.ts diff --git a/x-pack/plugins/cloud_security_posture/public/pages/vulnerabilities/utils/create_detection_rule_from_vulnerability.test.ts b/x-pack/solutions/security/plugins/cloud_security_posture/public/pages/vulnerabilities/utils/create_detection_rule_from_vulnerability.test.ts similarity index 100% rename from x-pack/plugins/cloud_security_posture/public/pages/vulnerabilities/utils/create_detection_rule_from_vulnerability.test.ts rename to x-pack/solutions/security/plugins/cloud_security_posture/public/pages/vulnerabilities/utils/create_detection_rule_from_vulnerability.test.ts diff --git a/x-pack/plugins/cloud_security_posture/public/pages/vulnerabilities/utils/create_detection_rule_from_vulnerability.ts b/x-pack/solutions/security/plugins/cloud_security_posture/public/pages/vulnerabilities/utils/create_detection_rule_from_vulnerability.ts similarity index 100% rename from x-pack/plugins/cloud_security_posture/public/pages/vulnerabilities/utils/create_detection_rule_from_vulnerability.ts rename to x-pack/solutions/security/plugins/cloud_security_posture/public/pages/vulnerabilities/utils/create_detection_rule_from_vulnerability.ts diff --git a/x-pack/plugins/cloud_security_posture/public/pages/vulnerabilities/utils/custom_sort_script.ts b/x-pack/solutions/security/plugins/cloud_security_posture/public/pages/vulnerabilities/utils/custom_sort_script.ts similarity index 100% rename from x-pack/plugins/cloud_security_posture/public/pages/vulnerabilities/utils/custom_sort_script.ts rename to x-pack/solutions/security/plugins/cloud_security_posture/public/pages/vulnerabilities/utils/custom_sort_script.ts diff --git a/x-pack/plugins/cloud_security_posture/public/pages/vulnerabilities/utils/get_vector_score_list.ts b/x-pack/solutions/security/plugins/cloud_security_posture/public/pages/vulnerabilities/utils/get_vector_score_list.ts similarity index 100% rename from x-pack/plugins/cloud_security_posture/public/pages/vulnerabilities/utils/get_vector_score_list.ts rename to x-pack/solutions/security/plugins/cloud_security_posture/public/pages/vulnerabilities/utils/get_vector_score_list.ts diff --git a/x-pack/plugins/cloud_security_posture/public/pages/vulnerabilities/vulnerabilities.tsx b/x-pack/solutions/security/plugins/cloud_security_posture/public/pages/vulnerabilities/vulnerabilities.tsx similarity index 100% rename from x-pack/plugins/cloud_security_posture/public/pages/vulnerabilities/vulnerabilities.tsx rename to x-pack/solutions/security/plugins/cloud_security_posture/public/pages/vulnerabilities/vulnerabilities.tsx diff --git a/x-pack/plugins/cloud_security_posture/public/pages/vulnerabilities/vulnerabilities_finding_flyout/vulnerability_detection_rule_counter.tsx b/x-pack/solutions/security/plugins/cloud_security_posture/public/pages/vulnerabilities/vulnerabilities_finding_flyout/vulnerability_detection_rule_counter.tsx similarity index 100% rename from x-pack/plugins/cloud_security_posture/public/pages/vulnerabilities/vulnerabilities_finding_flyout/vulnerability_detection_rule_counter.tsx rename to x-pack/solutions/security/plugins/cloud_security_posture/public/pages/vulnerabilities/vulnerabilities_finding_flyout/vulnerability_detection_rule_counter.tsx diff --git a/x-pack/plugins/cloud_security_posture/public/pages/vulnerabilities/vulnerabilities_finding_flyout/vulnerability_finding_flyout.test.tsx b/x-pack/solutions/security/plugins/cloud_security_posture/public/pages/vulnerabilities/vulnerabilities_finding_flyout/vulnerability_finding_flyout.test.tsx similarity index 100% rename from x-pack/plugins/cloud_security_posture/public/pages/vulnerabilities/vulnerabilities_finding_flyout/vulnerability_finding_flyout.test.tsx rename to x-pack/solutions/security/plugins/cloud_security_posture/public/pages/vulnerabilities/vulnerabilities_finding_flyout/vulnerability_finding_flyout.test.tsx diff --git a/x-pack/plugins/cloud_security_posture/public/pages/vulnerabilities/vulnerabilities_finding_flyout/vulnerability_finding_flyout.tsx b/x-pack/solutions/security/plugins/cloud_security_posture/public/pages/vulnerabilities/vulnerabilities_finding_flyout/vulnerability_finding_flyout.tsx similarity index 100% rename from x-pack/plugins/cloud_security_posture/public/pages/vulnerabilities/vulnerabilities_finding_flyout/vulnerability_finding_flyout.tsx rename to x-pack/solutions/security/plugins/cloud_security_posture/public/pages/vulnerabilities/vulnerabilities_finding_flyout/vulnerability_finding_flyout.tsx diff --git a/x-pack/plugins/cloud_security_posture/public/pages/vulnerabilities/vulnerabilities_finding_flyout/vulnerability_json_tab.tsx b/x-pack/solutions/security/plugins/cloud_security_posture/public/pages/vulnerabilities/vulnerabilities_finding_flyout/vulnerability_json_tab.tsx similarity index 100% rename from x-pack/plugins/cloud_security_posture/public/pages/vulnerabilities/vulnerabilities_finding_flyout/vulnerability_json_tab.tsx rename to x-pack/solutions/security/plugins/cloud_security_posture/public/pages/vulnerabilities/vulnerabilities_finding_flyout/vulnerability_json_tab.tsx diff --git a/x-pack/plugins/cloud_security_posture/public/pages/vulnerabilities/vulnerabilities_finding_flyout/vulnerability_overview_tab.tsx b/x-pack/solutions/security/plugins/cloud_security_posture/public/pages/vulnerabilities/vulnerabilities_finding_flyout/vulnerability_overview_tab.tsx similarity index 100% rename from x-pack/plugins/cloud_security_posture/public/pages/vulnerabilities/vulnerabilities_finding_flyout/vulnerability_overview_tab.tsx rename to x-pack/solutions/security/plugins/cloud_security_posture/public/pages/vulnerabilities/vulnerabilities_finding_flyout/vulnerability_overview_tab.tsx diff --git a/x-pack/plugins/cloud_security_posture/public/pages/vulnerabilities/vulnerabilities_finding_flyout/vulnerability_table_tab.tsx b/x-pack/solutions/security/plugins/cloud_security_posture/public/pages/vulnerabilities/vulnerabilities_finding_flyout/vulnerability_table_tab.tsx similarity index 100% rename from x-pack/plugins/cloud_security_posture/public/pages/vulnerabilities/vulnerabilities_finding_flyout/vulnerability_table_tab.tsx rename to x-pack/solutions/security/plugins/cloud_security_posture/public/pages/vulnerabilities/vulnerabilities_finding_flyout/vulnerability_table_tab.tsx diff --git a/x-pack/plugins/cloud_security_posture/public/pages/vulnerabilities/vulnerabilities_table_field_labels.ts b/x-pack/solutions/security/plugins/cloud_security_posture/public/pages/vulnerabilities/vulnerabilities_table_field_labels.ts similarity index 100% rename from x-pack/plugins/cloud_security_posture/public/pages/vulnerabilities/vulnerabilities_table_field_labels.ts rename to x-pack/solutions/security/plugins/cloud_security_posture/public/pages/vulnerabilities/vulnerabilities_table_field_labels.ts diff --git a/x-pack/plugins/cloud_security_posture/public/pages/vulnerabilities/vulnerabilties.test.tsx b/x-pack/solutions/security/plugins/cloud_security_posture/public/pages/vulnerabilities/vulnerabilties.test.tsx similarity index 100% rename from x-pack/plugins/cloud_security_posture/public/pages/vulnerabilities/vulnerabilties.test.tsx rename to x-pack/solutions/security/plugins/cloud_security_posture/public/pages/vulnerabilities/vulnerabilties.test.tsx diff --git a/x-pack/plugins/cloud_security_posture/public/pages/vulnerability_dashboard/_mocks_/vulnerability_dashboard.mock.ts b/x-pack/solutions/security/plugins/cloud_security_posture/public/pages/vulnerability_dashboard/_mocks_/vulnerability_dashboard.mock.ts similarity index 100% rename from x-pack/plugins/cloud_security_posture/public/pages/vulnerability_dashboard/_mocks_/vulnerability_dashboard.mock.ts rename to x-pack/solutions/security/plugins/cloud_security_posture/public/pages/vulnerability_dashboard/_mocks_/vulnerability_dashboard.mock.ts diff --git a/x-pack/plugins/cloud_security_posture/public/pages/vulnerability_dashboard/vulnerability_dashboard.test.tsx b/x-pack/solutions/security/plugins/cloud_security_posture/public/pages/vulnerability_dashboard/vulnerability_dashboard.test.tsx similarity index 100% rename from x-pack/plugins/cloud_security_posture/public/pages/vulnerability_dashboard/vulnerability_dashboard.test.tsx rename to x-pack/solutions/security/plugins/cloud_security_posture/public/pages/vulnerability_dashboard/vulnerability_dashboard.test.tsx diff --git a/x-pack/plugins/cloud_security_posture/public/pages/vulnerability_dashboard/vulnerability_dashboard.tsx b/x-pack/solutions/security/plugins/cloud_security_posture/public/pages/vulnerability_dashboard/vulnerability_dashboard.tsx similarity index 100% rename from x-pack/plugins/cloud_security_posture/public/pages/vulnerability_dashboard/vulnerability_dashboard.tsx rename to x-pack/solutions/security/plugins/cloud_security_posture/public/pages/vulnerability_dashboard/vulnerability_dashboard.tsx diff --git a/x-pack/plugins/cloud_security_posture/public/pages/vulnerability_dashboard/vulnerability_statistics.tsx b/x-pack/solutions/security/plugins/cloud_security_posture/public/pages/vulnerability_dashboard/vulnerability_statistics.tsx similarity index 100% rename from x-pack/plugins/cloud_security_posture/public/pages/vulnerability_dashboard/vulnerability_statistics.tsx rename to x-pack/solutions/security/plugins/cloud_security_posture/public/pages/vulnerability_dashboard/vulnerability_statistics.tsx diff --git a/x-pack/plugins/cloud_security_posture/public/pages/vulnerability_dashboard/vulnerability_table_panel.config.ts b/x-pack/solutions/security/plugins/cloud_security_posture/public/pages/vulnerability_dashboard/vulnerability_table_panel.config.ts similarity index 100% rename from x-pack/plugins/cloud_security_posture/public/pages/vulnerability_dashboard/vulnerability_table_panel.config.ts rename to x-pack/solutions/security/plugins/cloud_security_posture/public/pages/vulnerability_dashboard/vulnerability_table_panel.config.ts diff --git a/x-pack/plugins/cloud_security_posture/public/pages/vulnerability_dashboard/vulnerability_table_panel.tsx b/x-pack/solutions/security/plugins/cloud_security_posture/public/pages/vulnerability_dashboard/vulnerability_table_panel.tsx similarity index 100% rename from x-pack/plugins/cloud_security_posture/public/pages/vulnerability_dashboard/vulnerability_table_panel.tsx rename to x-pack/solutions/security/plugins/cloud_security_posture/public/pages/vulnerability_dashboard/vulnerability_table_panel.tsx diff --git a/x-pack/plugins/cloud_security_posture/public/pages/vulnerability_dashboard/vulnerability_table_panel_section.tsx b/x-pack/solutions/security/plugins/cloud_security_posture/public/pages/vulnerability_dashboard/vulnerability_table_panel_section.tsx similarity index 100% rename from x-pack/plugins/cloud_security_posture/public/pages/vulnerability_dashboard/vulnerability_table_panel_section.tsx rename to x-pack/solutions/security/plugins/cloud_security_posture/public/pages/vulnerability_dashboard/vulnerability_table_panel_section.tsx diff --git a/x-pack/plugins/cloud_security_posture/public/pages/vulnerability_dashboard/vulnerability_trend_graph.tsx b/x-pack/solutions/security/plugins/cloud_security_posture/public/pages/vulnerability_dashboard/vulnerability_trend_graph.tsx similarity index 100% rename from x-pack/plugins/cloud_security_posture/public/pages/vulnerability_dashboard/vulnerability_trend_graph.tsx rename to x-pack/solutions/security/plugins/cloud_security_posture/public/pages/vulnerability_dashboard/vulnerability_trend_graph.tsx diff --git a/x-pack/plugins/cloud_security_posture/public/plugin.tsx b/x-pack/solutions/security/plugins/cloud_security_posture/public/plugin.tsx similarity index 100% rename from x-pack/plugins/cloud_security_posture/public/plugin.tsx rename to x-pack/solutions/security/plugins/cloud_security_posture/public/plugin.tsx diff --git a/x-pack/plugins/cloud_security_posture/public/test/fixtures/csp_benchmark_integration.ts b/x-pack/solutions/security/plugins/cloud_security_posture/public/test/fixtures/csp_benchmark_integration.ts similarity index 100% rename from x-pack/plugins/cloud_security_posture/public/test/fixtures/csp_benchmark_integration.ts rename to x-pack/solutions/security/plugins/cloud_security_posture/public/test/fixtures/csp_benchmark_integration.ts diff --git a/x-pack/plugins/cloud_security_posture/public/test/fixtures/findings_fixture.ts b/x-pack/solutions/security/plugins/cloud_security_posture/public/test/fixtures/findings_fixture.ts similarity index 100% rename from x-pack/plugins/cloud_security_posture/public/test/fixtures/findings_fixture.ts rename to x-pack/solutions/security/plugins/cloud_security_posture/public/test/fixtures/findings_fixture.ts diff --git a/x-pack/plugins/cloud_security_posture/public/test/fixtures/get_mock_dependencies.ts b/x-pack/solutions/security/plugins/cloud_security_posture/public/test/fixtures/get_mock_dependencies.ts similarity index 100% rename from x-pack/plugins/cloud_security_posture/public/test/fixtures/get_mock_dependencies.ts rename to x-pack/solutions/security/plugins/cloud_security_posture/public/test/fixtures/get_mock_dependencies.ts diff --git a/x-pack/plugins/cloud_security_posture/public/test/fixtures/react_query.ts b/x-pack/solutions/security/plugins/cloud_security_posture/public/test/fixtures/react_query.ts similarity index 100% rename from x-pack/plugins/cloud_security_posture/public/test/fixtures/react_query.ts rename to x-pack/solutions/security/plugins/cloud_security_posture/public/test/fixtures/react_query.ts diff --git a/x-pack/plugins/cloud_security_posture/public/test/mock_server/handlers/dataview.handlers.mock.ts b/x-pack/solutions/security/plugins/cloud_security_posture/public/test/mock_server/handlers/dataview.handlers.mock.ts similarity index 100% rename from x-pack/plugins/cloud_security_posture/public/test/mock_server/handlers/dataview.handlers.mock.ts rename to x-pack/solutions/security/plugins/cloud_security_posture/public/test/mock_server/handlers/dataview.handlers.mock.ts diff --git a/x-pack/plugins/cloud_security_posture/public/test/mock_server/handlers/fleet.handlers.mock.ts b/x-pack/solutions/security/plugins/cloud_security_posture/public/test/mock_server/handlers/fleet.handlers.mock.ts similarity index 100% rename from x-pack/plugins/cloud_security_posture/public/test/mock_server/handlers/fleet.handlers.mock.ts rename to x-pack/solutions/security/plugins/cloud_security_posture/public/test/mock_server/handlers/fleet.handlers.mock.ts diff --git a/x-pack/plugins/cloud_security_posture/public/test/mock_server/handlers/index.ts b/x-pack/solutions/security/plugins/cloud_security_posture/public/test/mock_server/handlers/index.ts similarity index 100% rename from x-pack/plugins/cloud_security_posture/public/test/mock_server/handlers/index.ts rename to x-pack/solutions/security/plugins/cloud_security_posture/public/test/mock_server/handlers/index.ts diff --git a/x-pack/plugins/cloud_security_posture/public/test/mock_server/handlers/licensing.handlers.mock.ts b/x-pack/solutions/security/plugins/cloud_security_posture/public/test/mock_server/handlers/licensing.handlers.mock.ts similarity index 100% rename from x-pack/plugins/cloud_security_posture/public/test/mock_server/handlers/licensing.handlers.mock.ts rename to x-pack/solutions/security/plugins/cloud_security_posture/public/test/mock_server/handlers/licensing.handlers.mock.ts diff --git a/x-pack/plugins/cloud_security_posture/public/test/mock_server/mock_server.ts b/x-pack/solutions/security/plugins/cloud_security_posture/public/test/mock_server/mock_server.ts similarity index 100% rename from x-pack/plugins/cloud_security_posture/public/test/mock_server/mock_server.ts rename to x-pack/solutions/security/plugins/cloud_security_posture/public/test/mock_server/mock_server.ts diff --git a/x-pack/plugins/cloud_security_posture/public/test/mock_server/mock_server_test_provider.tsx b/x-pack/solutions/security/plugins/cloud_security_posture/public/test/mock_server/mock_server_test_provider.tsx similarity index 100% rename from x-pack/plugins/cloud_security_posture/public/test/mock_server/mock_server_test_provider.tsx rename to x-pack/solutions/security/plugins/cloud_security_posture/public/test/mock_server/mock_server_test_provider.tsx diff --git a/x-pack/plugins/cloud_security_posture/public/test/test_provider.tsx b/x-pack/solutions/security/plugins/cloud_security_posture/public/test/test_provider.tsx similarity index 100% rename from x-pack/plugins/cloud_security_posture/public/test/test_provider.tsx rename to x-pack/solutions/security/plugins/cloud_security_posture/public/test/test_provider.tsx diff --git a/x-pack/plugins/cloud_security_posture/public/test/utils.ts b/x-pack/solutions/security/plugins/cloud_security_posture/public/test/utils.ts similarity index 100% rename from x-pack/plugins/cloud_security_posture/public/test/utils.ts rename to x-pack/solutions/security/plugins/cloud_security_posture/public/test/utils.ts diff --git a/x-pack/plugins/cloud_security_posture/public/types.ts b/x-pack/solutions/security/plugins/cloud_security_posture/public/types.ts similarity index 100% rename from x-pack/plugins/cloud_security_posture/public/types.ts rename to x-pack/solutions/security/plugins/cloud_security_posture/public/types.ts diff --git a/x-pack/plugins/cloud_security_posture/server/config.ts b/x-pack/solutions/security/plugins/cloud_security_posture/server/config.ts similarity index 100% rename from x-pack/plugins/cloud_security_posture/server/config.ts rename to x-pack/solutions/security/plugins/cloud_security_posture/server/config.ts diff --git a/x-pack/plugins/cloud_security_posture/server/create_indices/benchmark_score_mapping.ts b/x-pack/solutions/security/plugins/cloud_security_posture/server/create_indices/benchmark_score_mapping.ts similarity index 100% rename from x-pack/plugins/cloud_security_posture/server/create_indices/benchmark_score_mapping.ts rename to x-pack/solutions/security/plugins/cloud_security_posture/server/create_indices/benchmark_score_mapping.ts diff --git a/x-pack/plugins/cloud_security_posture/server/create_indices/create_indices.test.ts b/x-pack/solutions/security/plugins/cloud_security_posture/server/create_indices/create_indices.test.ts similarity index 100% rename from x-pack/plugins/cloud_security_posture/server/create_indices/create_indices.test.ts rename to x-pack/solutions/security/plugins/cloud_security_posture/server/create_indices/create_indices.test.ts diff --git a/x-pack/plugins/cloud_security_posture/server/create_indices/create_indices.ts b/x-pack/solutions/security/plugins/cloud_security_posture/server/create_indices/create_indices.ts similarity index 100% rename from x-pack/plugins/cloud_security_posture/server/create_indices/create_indices.ts rename to x-pack/solutions/security/plugins/cloud_security_posture/server/create_indices/create_indices.ts diff --git a/x-pack/plugins/cloud_security_posture/server/create_indices/create_processor.ts b/x-pack/solutions/security/plugins/cloud_security_posture/server/create_indices/create_processor.ts similarity index 100% rename from x-pack/plugins/cloud_security_posture/server/create_indices/create_processor.ts rename to x-pack/solutions/security/plugins/cloud_security_posture/server/create_indices/create_processor.ts diff --git a/x-pack/plugins/cloud_security_posture/server/create_indices/ingest_pipelines.ts b/x-pack/solutions/security/plugins/cloud_security_posture/server/create_indices/ingest_pipelines.ts similarity index 100% rename from x-pack/plugins/cloud_security_posture/server/create_indices/ingest_pipelines.ts rename to x-pack/solutions/security/plugins/cloud_security_posture/server/create_indices/ingest_pipelines.ts diff --git a/x-pack/plugins/cloud_security_posture/server/create_indices/latest_indices.ts b/x-pack/solutions/security/plugins/cloud_security_posture/server/create_indices/latest_indices.ts similarity index 100% rename from x-pack/plugins/cloud_security_posture/server/create_indices/latest_indices.ts rename to x-pack/solutions/security/plugins/cloud_security_posture/server/create_indices/latest_indices.ts diff --git a/x-pack/plugins/cloud_security_posture/server/create_indices/types.ts b/x-pack/solutions/security/plugins/cloud_security_posture/server/create_indices/types.ts similarity index 100% rename from x-pack/plugins/cloud_security_posture/server/create_indices/types.ts rename to x-pack/solutions/security/plugins/cloud_security_posture/server/create_indices/types.ts diff --git a/x-pack/plugins/cloud_security_posture/server/create_transforms/create_transforms.test.ts b/x-pack/solutions/security/plugins/cloud_security_posture/server/create_transforms/create_transforms.test.ts similarity index 100% rename from x-pack/plugins/cloud_security_posture/server/create_transforms/create_transforms.test.ts rename to x-pack/solutions/security/plugins/cloud_security_posture/server/create_transforms/create_transforms.test.ts diff --git a/x-pack/plugins/cloud_security_posture/server/create_transforms/create_transforms.ts b/x-pack/solutions/security/plugins/cloud_security_posture/server/create_transforms/create_transforms.ts similarity index 100% rename from x-pack/plugins/cloud_security_posture/server/create_transforms/create_transforms.ts rename to x-pack/solutions/security/plugins/cloud_security_posture/server/create_transforms/create_transforms.ts diff --git a/x-pack/plugins/cloud_security_posture/server/create_transforms/latest_findings_transform.ts b/x-pack/solutions/security/plugins/cloud_security_posture/server/create_transforms/latest_findings_transform.ts similarity index 100% rename from x-pack/plugins/cloud_security_posture/server/create_transforms/latest_findings_transform.ts rename to x-pack/solutions/security/plugins/cloud_security_posture/server/create_transforms/latest_findings_transform.ts diff --git a/x-pack/plugins/cloud_security_posture/server/create_transforms/latest_vulnerabilities_transforms.ts b/x-pack/solutions/security/plugins/cloud_security_posture/server/create_transforms/latest_vulnerabilities_transforms.ts similarity index 100% rename from x-pack/plugins/cloud_security_posture/server/create_transforms/latest_vulnerabilities_transforms.ts rename to x-pack/solutions/security/plugins/cloud_security_posture/server/create_transforms/latest_vulnerabilities_transforms.ts diff --git a/x-pack/plugins/cloud_security_posture/server/fleet_integration/fleet_integration.ts b/x-pack/solutions/security/plugins/cloud_security_posture/server/fleet_integration/fleet_integration.ts similarity index 100% rename from x-pack/plugins/cloud_security_posture/server/fleet_integration/fleet_integration.ts rename to x-pack/solutions/security/plugins/cloud_security_posture/server/fleet_integration/fleet_integration.ts diff --git a/x-pack/plugins/cloud_security_posture/server/index.ts b/x-pack/solutions/security/plugins/cloud_security_posture/server/index.ts similarity index 100% rename from x-pack/plugins/cloud_security_posture/server/index.ts rename to x-pack/solutions/security/plugins/cloud_security_posture/server/index.ts diff --git a/x-pack/plugins/cloud_security_posture/server/lib/check_index_status.ts b/x-pack/solutions/security/plugins/cloud_security_posture/server/lib/check_index_status.ts similarity index 100% rename from x-pack/plugins/cloud_security_posture/server/lib/check_index_status.ts rename to x-pack/solutions/security/plugins/cloud_security_posture/server/lib/check_index_status.ts diff --git a/x-pack/plugins/cloud_security_posture/server/lib/fleet_util.ts b/x-pack/solutions/security/plugins/cloud_security_posture/server/lib/fleet_util.ts similarity index 100% rename from x-pack/plugins/cloud_security_posture/server/lib/fleet_util.ts rename to x-pack/solutions/security/plugins/cloud_security_posture/server/lib/fleet_util.ts diff --git a/x-pack/plugins/cloud_security_posture/server/lib/mapping_field_util.test.ts b/x-pack/solutions/security/plugins/cloud_security_posture/server/lib/mapping_field_util.test.ts similarity index 100% rename from x-pack/plugins/cloud_security_posture/server/lib/mapping_field_util.test.ts rename to x-pack/solutions/security/plugins/cloud_security_posture/server/lib/mapping_field_util.test.ts diff --git a/x-pack/plugins/cloud_security_posture/server/lib/mapping_field_util.ts b/x-pack/solutions/security/plugins/cloud_security_posture/server/lib/mapping_field_util.ts similarity index 100% rename from x-pack/plugins/cloud_security_posture/server/lib/mapping_field_util.ts rename to x-pack/solutions/security/plugins/cloud_security_posture/server/lib/mapping_field_util.ts diff --git a/x-pack/plugins/cloud_security_posture/server/lib/task_manager_util.ts b/x-pack/solutions/security/plugins/cloud_security_posture/server/lib/task_manager_util.ts similarity index 100% rename from x-pack/plugins/cloud_security_posture/server/lib/task_manager_util.ts rename to x-pack/solutions/security/plugins/cloud_security_posture/server/lib/task_manager_util.ts diff --git a/x-pack/plugins/cloud_security_posture/server/lib/telemetry/collectors/accounts_stats_collector.ts b/x-pack/solutions/security/plugins/cloud_security_posture/server/lib/telemetry/collectors/accounts_stats_collector.ts similarity index 100% rename from x-pack/plugins/cloud_security_posture/server/lib/telemetry/collectors/accounts_stats_collector.ts rename to x-pack/solutions/security/plugins/cloud_security_posture/server/lib/telemetry/collectors/accounts_stats_collector.ts diff --git a/x-pack/plugins/cloud_security_posture/server/lib/telemetry/collectors/alert_stats_collector.ts b/x-pack/solutions/security/plugins/cloud_security_posture/server/lib/telemetry/collectors/alert_stats_collector.ts similarity index 100% rename from x-pack/plugins/cloud_security_posture/server/lib/telemetry/collectors/alert_stats_collector.ts rename to x-pack/solutions/security/plugins/cloud_security_posture/server/lib/telemetry/collectors/alert_stats_collector.ts diff --git a/x-pack/plugins/cloud_security_posture/server/lib/telemetry/collectors/cloud_accounts_stats_collector.ts b/x-pack/solutions/security/plugins/cloud_security_posture/server/lib/telemetry/collectors/cloud_accounts_stats_collector.ts similarity index 100% rename from x-pack/plugins/cloud_security_posture/server/lib/telemetry/collectors/cloud_accounts_stats_collector.ts rename to x-pack/solutions/security/plugins/cloud_security_posture/server/lib/telemetry/collectors/cloud_accounts_stats_collector.ts diff --git a/x-pack/plugins/cloud_security_posture/server/lib/telemetry/collectors/indices_stats_collector.ts b/x-pack/solutions/security/plugins/cloud_security_posture/server/lib/telemetry/collectors/indices_stats_collector.ts similarity index 100% rename from x-pack/plugins/cloud_security_posture/server/lib/telemetry/collectors/indices_stats_collector.ts rename to x-pack/solutions/security/plugins/cloud_security_posture/server/lib/telemetry/collectors/indices_stats_collector.ts diff --git a/x-pack/plugins/cloud_security_posture/server/lib/telemetry/collectors/installation_stats_collector.ts b/x-pack/solutions/security/plugins/cloud_security_posture/server/lib/telemetry/collectors/installation_stats_collector.ts similarity index 100% rename from x-pack/plugins/cloud_security_posture/server/lib/telemetry/collectors/installation_stats_collector.ts rename to x-pack/solutions/security/plugins/cloud_security_posture/server/lib/telemetry/collectors/installation_stats_collector.ts diff --git a/x-pack/plugins/cloud_security_posture/server/lib/telemetry/collectors/muted_rules_stats_collector.ts b/x-pack/solutions/security/plugins/cloud_security_posture/server/lib/telemetry/collectors/muted_rules_stats_collector.ts similarity index 100% rename from x-pack/plugins/cloud_security_posture/server/lib/telemetry/collectors/muted_rules_stats_collector.ts rename to x-pack/solutions/security/plugins/cloud_security_posture/server/lib/telemetry/collectors/muted_rules_stats_collector.ts diff --git a/x-pack/plugins/cloud_security_posture/server/lib/telemetry/collectors/register.ts b/x-pack/solutions/security/plugins/cloud_security_posture/server/lib/telemetry/collectors/register.ts similarity index 100% rename from x-pack/plugins/cloud_security_posture/server/lib/telemetry/collectors/register.ts rename to x-pack/solutions/security/plugins/cloud_security_posture/server/lib/telemetry/collectors/register.ts diff --git a/x-pack/plugins/cloud_security_posture/server/lib/telemetry/collectors/resources_stats_collector.ts b/x-pack/solutions/security/plugins/cloud_security_posture/server/lib/telemetry/collectors/resources_stats_collector.ts similarity index 100% rename from x-pack/plugins/cloud_security_posture/server/lib/telemetry/collectors/resources_stats_collector.ts rename to x-pack/solutions/security/plugins/cloud_security_posture/server/lib/telemetry/collectors/resources_stats_collector.ts diff --git a/x-pack/plugins/cloud_security_posture/server/lib/telemetry/collectors/rules_stats_collector.ts b/x-pack/solutions/security/plugins/cloud_security_posture/server/lib/telemetry/collectors/rules_stats_collector.ts similarity index 100% rename from x-pack/plugins/cloud_security_posture/server/lib/telemetry/collectors/rules_stats_collector.ts rename to x-pack/solutions/security/plugins/cloud_security_posture/server/lib/telemetry/collectors/rules_stats_collector.ts diff --git a/x-pack/plugins/cloud_security_posture/server/lib/telemetry/collectors/schema.ts b/x-pack/solutions/security/plugins/cloud_security_posture/server/lib/telemetry/collectors/schema.ts similarity index 100% rename from x-pack/plugins/cloud_security_posture/server/lib/telemetry/collectors/schema.ts rename to x-pack/solutions/security/plugins/cloud_security_posture/server/lib/telemetry/collectors/schema.ts diff --git a/x-pack/plugins/cloud_security_posture/server/lib/telemetry/collectors/types.ts b/x-pack/solutions/security/plugins/cloud_security_posture/server/lib/telemetry/collectors/types.ts similarity index 100% rename from x-pack/plugins/cloud_security_posture/server/lib/telemetry/collectors/types.ts rename to x-pack/solutions/security/plugins/cloud_security_posture/server/lib/telemetry/collectors/types.ts diff --git a/x-pack/plugins/cloud_security_posture/server/mocks.ts b/x-pack/solutions/security/plugins/cloud_security_posture/server/mocks.ts similarity index 100% rename from x-pack/plugins/cloud_security_posture/server/mocks.ts rename to x-pack/solutions/security/plugins/cloud_security_posture/server/mocks.ts diff --git a/x-pack/plugins/cloud_security_posture/server/plugin.test.ts b/x-pack/solutions/security/plugins/cloud_security_posture/server/plugin.test.ts similarity index 100% rename from x-pack/plugins/cloud_security_posture/server/plugin.test.ts rename to x-pack/solutions/security/plugins/cloud_security_posture/server/plugin.test.ts diff --git a/x-pack/plugins/cloud_security_posture/server/plugin.ts b/x-pack/solutions/security/plugins/cloud_security_posture/server/plugin.ts similarity index 100% rename from x-pack/plugins/cloud_security_posture/server/plugin.ts rename to x-pack/solutions/security/plugins/cloud_security_posture/server/plugin.ts diff --git a/x-pack/plugins/cloud_security_posture/server/routes/benchmark_rules/bulk_action/bulk_action.ts b/x-pack/solutions/security/plugins/cloud_security_posture/server/routes/benchmark_rules/bulk_action/bulk_action.ts similarity index 100% rename from x-pack/plugins/cloud_security_posture/server/routes/benchmark_rules/bulk_action/bulk_action.ts rename to x-pack/solutions/security/plugins/cloud_security_posture/server/routes/benchmark_rules/bulk_action/bulk_action.ts diff --git a/x-pack/plugins/cloud_security_posture/server/routes/benchmark_rules/bulk_action/utils.ts b/x-pack/solutions/security/plugins/cloud_security_posture/server/routes/benchmark_rules/bulk_action/utils.ts similarity index 100% rename from x-pack/plugins/cloud_security_posture/server/routes/benchmark_rules/bulk_action/utils.ts rename to x-pack/solutions/security/plugins/cloud_security_posture/server/routes/benchmark_rules/bulk_action/utils.ts diff --git a/x-pack/plugins/cloud_security_posture/server/routes/benchmark_rules/bulk_action/v1.ts b/x-pack/solutions/security/plugins/cloud_security_posture/server/routes/benchmark_rules/bulk_action/v1.ts similarity index 100% rename from x-pack/plugins/cloud_security_posture/server/routes/benchmark_rules/bulk_action/v1.ts rename to x-pack/solutions/security/plugins/cloud_security_posture/server/routes/benchmark_rules/bulk_action/v1.ts diff --git a/x-pack/plugins/cloud_security_posture/server/routes/benchmark_rules/find/find.test.ts b/x-pack/solutions/security/plugins/cloud_security_posture/server/routes/benchmark_rules/find/find.test.ts similarity index 100% rename from x-pack/plugins/cloud_security_posture/server/routes/benchmark_rules/find/find.test.ts rename to x-pack/solutions/security/plugins/cloud_security_posture/server/routes/benchmark_rules/find/find.test.ts diff --git a/x-pack/plugins/cloud_security_posture/server/routes/benchmark_rules/find/find.ts b/x-pack/solutions/security/plugins/cloud_security_posture/server/routes/benchmark_rules/find/find.ts similarity index 100% rename from x-pack/plugins/cloud_security_posture/server/routes/benchmark_rules/find/find.ts rename to x-pack/solutions/security/plugins/cloud_security_posture/server/routes/benchmark_rules/find/find.ts diff --git a/x-pack/plugins/cloud_security_posture/server/routes/benchmark_rules/find/utils.ts b/x-pack/solutions/security/plugins/cloud_security_posture/server/routes/benchmark_rules/find/utils.ts similarity index 100% rename from x-pack/plugins/cloud_security_posture/server/routes/benchmark_rules/find/utils.ts rename to x-pack/solutions/security/plugins/cloud_security_posture/server/routes/benchmark_rules/find/utils.ts diff --git a/x-pack/plugins/cloud_security_posture/server/routes/benchmark_rules/find/v1.ts b/x-pack/solutions/security/plugins/cloud_security_posture/server/routes/benchmark_rules/find/v1.ts similarity index 100% rename from x-pack/plugins/cloud_security_posture/server/routes/benchmark_rules/find/v1.ts rename to x-pack/solutions/security/plugins/cloud_security_posture/server/routes/benchmark_rules/find/v1.ts diff --git a/x-pack/plugins/cloud_security_posture/server/routes/benchmark_rules/find/v2.ts b/x-pack/solutions/security/plugins/cloud_security_posture/server/routes/benchmark_rules/find/v2.ts similarity index 100% rename from x-pack/plugins/cloud_security_posture/server/routes/benchmark_rules/find/v2.ts rename to x-pack/solutions/security/plugins/cloud_security_posture/server/routes/benchmark_rules/find/v2.ts diff --git a/x-pack/plugins/cloud_security_posture/server/routes/benchmark_rules/find/v3.ts b/x-pack/solutions/security/plugins/cloud_security_posture/server/routes/benchmark_rules/find/v3.ts similarity index 100% rename from x-pack/plugins/cloud_security_posture/server/routes/benchmark_rules/find/v3.ts rename to x-pack/solutions/security/plugins/cloud_security_posture/server/routes/benchmark_rules/find/v3.ts diff --git a/x-pack/plugins/cloud_security_posture/server/routes/benchmark_rules/get_states/get_states.ts b/x-pack/solutions/security/plugins/cloud_security_posture/server/routes/benchmark_rules/get_states/get_states.ts similarity index 100% rename from x-pack/plugins/cloud_security_posture/server/routes/benchmark_rules/get_states/get_states.ts rename to x-pack/solutions/security/plugins/cloud_security_posture/server/routes/benchmark_rules/get_states/get_states.ts diff --git a/x-pack/plugins/cloud_security_posture/server/routes/benchmark_rules/get_states/v1.ts b/x-pack/solutions/security/plugins/cloud_security_posture/server/routes/benchmark_rules/get_states/v1.ts similarity index 100% rename from x-pack/plugins/cloud_security_posture/server/routes/benchmark_rules/get_states/v1.ts rename to x-pack/solutions/security/plugins/cloud_security_posture/server/routes/benchmark_rules/get_states/v1.ts diff --git a/x-pack/plugins/cloud_security_posture/server/routes/benchmarks/benchmarks.handlers.mock.ts b/x-pack/solutions/security/plugins/cloud_security_posture/server/routes/benchmarks/benchmarks.handlers.mock.ts similarity index 100% rename from x-pack/plugins/cloud_security_posture/server/routes/benchmarks/benchmarks.handlers.mock.ts rename to x-pack/solutions/security/plugins/cloud_security_posture/server/routes/benchmarks/benchmarks.handlers.mock.ts diff --git a/x-pack/plugins/cloud_security_posture/server/routes/benchmarks/benchmarks.test.ts b/x-pack/solutions/security/plugins/cloud_security_posture/server/routes/benchmarks/benchmarks.test.ts similarity index 100% rename from x-pack/plugins/cloud_security_posture/server/routes/benchmarks/benchmarks.test.ts rename to x-pack/solutions/security/plugins/cloud_security_posture/server/routes/benchmarks/benchmarks.test.ts diff --git a/x-pack/plugins/cloud_security_posture/server/routes/benchmarks/benchmarks.ts b/x-pack/solutions/security/plugins/cloud_security_posture/server/routes/benchmarks/benchmarks.ts similarity index 100% rename from x-pack/plugins/cloud_security_posture/server/routes/benchmarks/benchmarks.ts rename to x-pack/solutions/security/plugins/cloud_security_posture/server/routes/benchmarks/benchmarks.ts diff --git a/x-pack/plugins/cloud_security_posture/server/routes/benchmarks/utilities.ts b/x-pack/solutions/security/plugins/cloud_security_posture/server/routes/benchmarks/utilities.ts similarity index 100% rename from x-pack/plugins/cloud_security_posture/server/routes/benchmarks/utilities.ts rename to x-pack/solutions/security/plugins/cloud_security_posture/server/routes/benchmarks/utilities.ts diff --git a/x-pack/plugins/cloud_security_posture/server/routes/benchmarks/v1.ts b/x-pack/solutions/security/plugins/cloud_security_posture/server/routes/benchmarks/v1.ts similarity index 100% rename from x-pack/plugins/cloud_security_posture/server/routes/benchmarks/v1.ts rename to x-pack/solutions/security/plugins/cloud_security_posture/server/routes/benchmarks/v1.ts diff --git a/x-pack/plugins/cloud_security_posture/server/routes/benchmarks/v2.ts b/x-pack/solutions/security/plugins/cloud_security_posture/server/routes/benchmarks/v2.ts similarity index 100% rename from x-pack/plugins/cloud_security_posture/server/routes/benchmarks/v2.ts rename to x-pack/solutions/security/plugins/cloud_security_posture/server/routes/benchmarks/v2.ts diff --git a/x-pack/plugins/cloud_security_posture/server/routes/compliance_dashboard/compliance_dashboard.ts b/x-pack/solutions/security/plugins/cloud_security_posture/server/routes/compliance_dashboard/compliance_dashboard.ts similarity index 100% rename from x-pack/plugins/cloud_security_posture/server/routes/compliance_dashboard/compliance_dashboard.ts rename to x-pack/solutions/security/plugins/cloud_security_posture/server/routes/compliance_dashboard/compliance_dashboard.ts diff --git a/x-pack/plugins/cloud_security_posture/server/routes/compliance_dashboard/get_benchmarks.test.ts b/x-pack/solutions/security/plugins/cloud_security_posture/server/routes/compliance_dashboard/get_benchmarks.test.ts similarity index 100% rename from x-pack/plugins/cloud_security_posture/server/routes/compliance_dashboard/get_benchmarks.test.ts rename to x-pack/solutions/security/plugins/cloud_security_posture/server/routes/compliance_dashboard/get_benchmarks.test.ts diff --git a/x-pack/plugins/cloud_security_posture/server/routes/compliance_dashboard/get_benchmarks.ts b/x-pack/solutions/security/plugins/cloud_security_posture/server/routes/compliance_dashboard/get_benchmarks.ts similarity index 100% rename from x-pack/plugins/cloud_security_posture/server/routes/compliance_dashboard/get_benchmarks.ts rename to x-pack/solutions/security/plugins/cloud_security_posture/server/routes/compliance_dashboard/get_benchmarks.ts diff --git a/x-pack/plugins/cloud_security_posture/server/routes/compliance_dashboard/get_clusters.test.ts b/x-pack/solutions/security/plugins/cloud_security_posture/server/routes/compliance_dashboard/get_clusters.test.ts similarity index 100% rename from x-pack/plugins/cloud_security_posture/server/routes/compliance_dashboard/get_clusters.test.ts rename to x-pack/solutions/security/plugins/cloud_security_posture/server/routes/compliance_dashboard/get_clusters.test.ts diff --git a/x-pack/plugins/cloud_security_posture/server/routes/compliance_dashboard/get_clusters.ts b/x-pack/solutions/security/plugins/cloud_security_posture/server/routes/compliance_dashboard/get_clusters.ts similarity index 100% rename from x-pack/plugins/cloud_security_posture/server/routes/compliance_dashboard/get_clusters.ts rename to x-pack/solutions/security/plugins/cloud_security_posture/server/routes/compliance_dashboard/get_clusters.ts diff --git a/x-pack/plugins/cloud_security_posture/server/routes/compliance_dashboard/get_grouped_findings_evaluation.test.ts b/x-pack/solutions/security/plugins/cloud_security_posture/server/routes/compliance_dashboard/get_grouped_findings_evaluation.test.ts similarity index 100% rename from x-pack/plugins/cloud_security_posture/server/routes/compliance_dashboard/get_grouped_findings_evaluation.test.ts rename to x-pack/solutions/security/plugins/cloud_security_posture/server/routes/compliance_dashboard/get_grouped_findings_evaluation.test.ts diff --git a/x-pack/plugins/cloud_security_posture/server/routes/compliance_dashboard/get_grouped_findings_evaluation.ts b/x-pack/solutions/security/plugins/cloud_security_posture/server/routes/compliance_dashboard/get_grouped_findings_evaluation.ts similarity index 100% rename from x-pack/plugins/cloud_security_posture/server/routes/compliance_dashboard/get_grouped_findings_evaluation.ts rename to x-pack/solutions/security/plugins/cloud_security_posture/server/routes/compliance_dashboard/get_grouped_findings_evaluation.ts diff --git a/x-pack/plugins/cloud_security_posture/server/routes/compliance_dashboard/get_stats.test.ts b/x-pack/solutions/security/plugins/cloud_security_posture/server/routes/compliance_dashboard/get_stats.test.ts similarity index 100% rename from x-pack/plugins/cloud_security_posture/server/routes/compliance_dashboard/get_stats.test.ts rename to x-pack/solutions/security/plugins/cloud_security_posture/server/routes/compliance_dashboard/get_stats.test.ts diff --git a/x-pack/plugins/cloud_security_posture/server/routes/compliance_dashboard/get_stats.ts b/x-pack/solutions/security/plugins/cloud_security_posture/server/routes/compliance_dashboard/get_stats.ts similarity index 100% rename from x-pack/plugins/cloud_security_posture/server/routes/compliance_dashboard/get_stats.ts rename to x-pack/solutions/security/plugins/cloud_security_posture/server/routes/compliance_dashboard/get_stats.ts diff --git a/x-pack/plugins/cloud_security_posture/server/routes/compliance_dashboard/get_trends.test.ts b/x-pack/solutions/security/plugins/cloud_security_posture/server/routes/compliance_dashboard/get_trends.test.ts similarity index 100% rename from x-pack/plugins/cloud_security_posture/server/routes/compliance_dashboard/get_trends.test.ts rename to x-pack/solutions/security/plugins/cloud_security_posture/server/routes/compliance_dashboard/get_trends.test.ts diff --git a/x-pack/plugins/cloud_security_posture/server/routes/compliance_dashboard/get_trends.ts b/x-pack/solutions/security/plugins/cloud_security_posture/server/routes/compliance_dashboard/get_trends.ts similarity index 100% rename from x-pack/plugins/cloud_security_posture/server/routes/compliance_dashboard/get_trends.ts rename to x-pack/solutions/security/plugins/cloud_security_posture/server/routes/compliance_dashboard/get_trends.ts diff --git a/x-pack/plugins/cloud_security_posture/server/routes/detection_engine/get_detection_engine_alerts_count_by_rule_tags.ts b/x-pack/solutions/security/plugins/cloud_security_posture/server/routes/detection_engine/get_detection_engine_alerts_count_by_rule_tags.ts similarity index 100% rename from x-pack/plugins/cloud_security_posture/server/routes/detection_engine/get_detection_engine_alerts_count_by_rule_tags.ts rename to x-pack/solutions/security/plugins/cloud_security_posture/server/routes/detection_engine/get_detection_engine_alerts_count_by_rule_tags.ts diff --git a/x-pack/plugins/cloud_security_posture/server/routes/graph/route.ts b/x-pack/solutions/security/plugins/cloud_security_posture/server/routes/graph/route.ts similarity index 100% rename from x-pack/plugins/cloud_security_posture/server/routes/graph/route.ts rename to x-pack/solutions/security/plugins/cloud_security_posture/server/routes/graph/route.ts diff --git a/x-pack/plugins/cloud_security_posture/server/routes/graph/v1.ts b/x-pack/solutions/security/plugins/cloud_security_posture/server/routes/graph/v1.ts similarity index 100% rename from x-pack/plugins/cloud_security_posture/server/routes/graph/v1.ts rename to x-pack/solutions/security/plugins/cloud_security_posture/server/routes/graph/v1.ts diff --git a/x-pack/plugins/cloud_security_posture/server/routes/setup_routes.ts b/x-pack/solutions/security/plugins/cloud_security_posture/server/routes/setup_routes.ts similarity index 100% rename from x-pack/plugins/cloud_security_posture/server/routes/setup_routes.ts rename to x-pack/solutions/security/plugins/cloud_security_posture/server/routes/setup_routes.ts diff --git a/x-pack/plugins/cloud_security_posture/server/routes/status/status.handlers.mock.ts b/x-pack/solutions/security/plugins/cloud_security_posture/server/routes/status/status.handlers.mock.ts similarity index 100% rename from x-pack/plugins/cloud_security_posture/server/routes/status/status.handlers.mock.ts rename to x-pack/solutions/security/plugins/cloud_security_posture/server/routes/status/status.handlers.mock.ts diff --git a/x-pack/plugins/cloud_security_posture/server/routes/status/status.test.ts b/x-pack/solutions/security/plugins/cloud_security_posture/server/routes/status/status.test.ts similarity index 100% rename from x-pack/plugins/cloud_security_posture/server/routes/status/status.test.ts rename to x-pack/solutions/security/plugins/cloud_security_posture/server/routes/status/status.test.ts diff --git a/x-pack/plugins/cloud_security_posture/server/routes/status/status.ts b/x-pack/solutions/security/plugins/cloud_security_posture/server/routes/status/status.ts similarity index 100% rename from x-pack/plugins/cloud_security_posture/server/routes/status/status.ts rename to x-pack/solutions/security/plugins/cloud_security_posture/server/routes/status/status.ts diff --git a/x-pack/plugins/cloud_security_posture/server/routes/vulnerabilities_dashboard/get_top_patchable_vulnerabilities.ts b/x-pack/solutions/security/plugins/cloud_security_posture/server/routes/vulnerabilities_dashboard/get_top_patchable_vulnerabilities.ts similarity index 100% rename from x-pack/plugins/cloud_security_posture/server/routes/vulnerabilities_dashboard/get_top_patchable_vulnerabilities.ts rename to x-pack/solutions/security/plugins/cloud_security_posture/server/routes/vulnerabilities_dashboard/get_top_patchable_vulnerabilities.ts diff --git a/x-pack/plugins/cloud_security_posture/server/routes/vulnerabilities_dashboard/get_top_vulnerabilities.ts b/x-pack/solutions/security/plugins/cloud_security_posture/server/routes/vulnerabilities_dashboard/get_top_vulnerabilities.ts similarity index 100% rename from x-pack/plugins/cloud_security_posture/server/routes/vulnerabilities_dashboard/get_top_vulnerabilities.ts rename to x-pack/solutions/security/plugins/cloud_security_posture/server/routes/vulnerabilities_dashboard/get_top_vulnerabilities.ts diff --git a/x-pack/plugins/cloud_security_posture/server/routes/vulnerabilities_dashboard/get_top_vulnerable_resources.ts b/x-pack/solutions/security/plugins/cloud_security_posture/server/routes/vulnerabilities_dashboard/get_top_vulnerable_resources.ts similarity index 100% rename from x-pack/plugins/cloud_security_posture/server/routes/vulnerabilities_dashboard/get_top_vulnerable_resources.ts rename to x-pack/solutions/security/plugins/cloud_security_posture/server/routes/vulnerabilities_dashboard/get_top_vulnerable_resources.ts diff --git a/x-pack/plugins/cloud_security_posture/server/routes/vulnerabilities_dashboard/get_vulnerabilities_statistics.ts b/x-pack/solutions/security/plugins/cloud_security_posture/server/routes/vulnerabilities_dashboard/get_vulnerabilities_statistics.ts similarity index 100% rename from x-pack/plugins/cloud_security_posture/server/routes/vulnerabilities_dashboard/get_vulnerabilities_statistics.ts rename to x-pack/solutions/security/plugins/cloud_security_posture/server/routes/vulnerabilities_dashboard/get_vulnerabilities_statistics.ts diff --git a/x-pack/plugins/cloud_security_posture/server/routes/vulnerabilities_dashboard/get_vulnerabilities_trend.ts b/x-pack/solutions/security/plugins/cloud_security_posture/server/routes/vulnerabilities_dashboard/get_vulnerabilities_trend.ts similarity index 100% rename from x-pack/plugins/cloud_security_posture/server/routes/vulnerabilities_dashboard/get_vulnerabilities_trend.ts rename to x-pack/solutions/security/plugins/cloud_security_posture/server/routes/vulnerabilities_dashboard/get_vulnerabilities_trend.ts diff --git a/x-pack/plugins/cloud_security_posture/server/routes/vulnerabilities_dashboard/vulnerabilities_dashboard.ts b/x-pack/solutions/security/plugins/cloud_security_posture/server/routes/vulnerabilities_dashboard/vulnerabilities_dashboard.ts similarity index 100% rename from x-pack/plugins/cloud_security_posture/server/routes/vulnerabilities_dashboard/vulnerabilities_dashboard.ts rename to x-pack/solutions/security/plugins/cloud_security_posture/server/routes/vulnerabilities_dashboard/vulnerabilities_dashboard.ts diff --git a/x-pack/plugins/cloud_security_posture/server/saved_objects/csp_benchmark_rule.ts b/x-pack/solutions/security/plugins/cloud_security_posture/server/saved_objects/csp_benchmark_rule.ts similarity index 100% rename from x-pack/plugins/cloud_security_posture/server/saved_objects/csp_benchmark_rule.ts rename to x-pack/solutions/security/plugins/cloud_security_posture/server/saved_objects/csp_benchmark_rule.ts diff --git a/x-pack/plugins/cloud_security_posture/server/saved_objects/csp_settings.ts b/x-pack/solutions/security/plugins/cloud_security_posture/server/saved_objects/csp_settings.ts similarity index 100% rename from x-pack/plugins/cloud_security_posture/server/saved_objects/csp_settings.ts rename to x-pack/solutions/security/plugins/cloud_security_posture/server/saved_objects/csp_settings.ts diff --git a/x-pack/plugins/cloud_security_posture/server/saved_objects/data_views.ts b/x-pack/solutions/security/plugins/cloud_security_posture/server/saved_objects/data_views.ts similarity index 100% rename from x-pack/plugins/cloud_security_posture/server/saved_objects/data_views.ts rename to x-pack/solutions/security/plugins/cloud_security_posture/server/saved_objects/data_views.ts diff --git a/x-pack/plugins/cloud_security_posture/server/saved_objects/index.ts b/x-pack/solutions/security/plugins/cloud_security_posture/server/saved_objects/index.ts similarity index 100% rename from x-pack/plugins/cloud_security_posture/server/saved_objects/index.ts rename to x-pack/solutions/security/plugins/cloud_security_posture/server/saved_objects/index.ts diff --git a/x-pack/plugins/cloud_security_posture/server/saved_objects/mappings.ts b/x-pack/solutions/security/plugins/cloud_security_posture/server/saved_objects/mappings.ts similarity index 100% rename from x-pack/plugins/cloud_security_posture/server/saved_objects/mappings.ts rename to x-pack/solutions/security/plugins/cloud_security_posture/server/saved_objects/mappings.ts diff --git a/x-pack/plugins/cloud_security_posture/server/saved_objects/migrations/csp_benchmark_rule.ts b/x-pack/solutions/security/plugins/cloud_security_posture/server/saved_objects/migrations/csp_benchmark_rule.ts similarity index 100% rename from x-pack/plugins/cloud_security_posture/server/saved_objects/migrations/csp_benchmark_rule.ts rename to x-pack/solutions/security/plugins/cloud_security_posture/server/saved_objects/migrations/csp_benchmark_rule.ts diff --git a/x-pack/plugins/cloud_security_posture/server/saved_objects/migrations/index.ts b/x-pack/solutions/security/plugins/cloud_security_posture/server/saved_objects/migrations/index.ts similarity index 100% rename from x-pack/plugins/cloud_security_posture/server/saved_objects/migrations/index.ts rename to x-pack/solutions/security/plugins/cloud_security_posture/server/saved_objects/migrations/index.ts diff --git a/x-pack/plugins/cloud_security_posture/server/tasks/findings_stats_task.ts b/x-pack/solutions/security/plugins/cloud_security_posture/server/tasks/findings_stats_task.ts similarity index 100% rename from x-pack/plugins/cloud_security_posture/server/tasks/findings_stats_task.ts rename to x-pack/solutions/security/plugins/cloud_security_posture/server/tasks/findings_stats_task.ts diff --git a/x-pack/plugins/cloud_security_posture/server/tasks/task_state.test.ts b/x-pack/solutions/security/plugins/cloud_security_posture/server/tasks/task_state.test.ts similarity index 100% rename from x-pack/plugins/cloud_security_posture/server/tasks/task_state.test.ts rename to x-pack/solutions/security/plugins/cloud_security_posture/server/tasks/task_state.test.ts diff --git a/x-pack/plugins/cloud_security_posture/server/tasks/task_state.ts b/x-pack/solutions/security/plugins/cloud_security_posture/server/tasks/task_state.ts similarity index 100% rename from x-pack/plugins/cloud_security_posture/server/tasks/task_state.ts rename to x-pack/solutions/security/plugins/cloud_security_posture/server/tasks/task_state.ts diff --git a/x-pack/plugins/cloud_security_posture/server/tasks/types.ts b/x-pack/solutions/security/plugins/cloud_security_posture/server/tasks/types.ts similarity index 100% rename from x-pack/plugins/cloud_security_posture/server/tasks/types.ts rename to x-pack/solutions/security/plugins/cloud_security_posture/server/tasks/types.ts diff --git a/x-pack/plugins/cloud_security_posture/server/types.ts b/x-pack/solutions/security/plugins/cloud_security_posture/server/types.ts similarity index 100% rename from x-pack/plugins/cloud_security_posture/server/types.ts rename to x-pack/solutions/security/plugins/cloud_security_posture/server/types.ts diff --git a/x-pack/plugins/cloud_security_posture/tsconfig.json b/x-pack/solutions/security/plugins/cloud_security_posture/tsconfig.json similarity index 95% rename from x-pack/plugins/cloud_security_posture/tsconfig.json rename to x-pack/solutions/security/plugins/cloud_security_posture/tsconfig.json index f3883e0fc43c6..e723ae3bc5d9f 100755 --- a/x-pack/plugins/cloud_security_posture/tsconfig.json +++ b/x-pack/solutions/security/plugins/cloud_security_posture/tsconfig.json @@ -1,5 +1,5 @@ { - "extends": "../../../tsconfig.base.json", + "extends": "../../../../../tsconfig.base.json", "compilerOptions": { "outDir": "target/types" }, @@ -11,7 +11,7 @@ // have to declare *.json explicitly due to https://github.com/microsoft/TypeScript/issues/25636 "server/**/*.json", "public/**/*.json", - "../../../typings/**/*" + "../../../../../typings/**/*" ], "kbn_references": [ "@kbn/core", diff --git a/x-pack/plugins/kubernetes_security/.eslintrc.json b/x-pack/solutions/security/plugins/kubernetes_security/.eslintrc.json similarity index 100% rename from x-pack/plugins/kubernetes_security/.eslintrc.json rename to x-pack/solutions/security/plugins/kubernetes_security/.eslintrc.json diff --git a/x-pack/plugins/kubernetes_security/README.md b/x-pack/solutions/security/plugins/kubernetes_security/README.md similarity index 100% rename from x-pack/plugins/kubernetes_security/README.md rename to x-pack/solutions/security/plugins/kubernetes_security/README.md diff --git a/x-pack/plugins/kubernetes_security/common/constants.ts b/x-pack/solutions/security/plugins/kubernetes_security/common/constants.ts similarity index 100% rename from x-pack/plugins/kubernetes_security/common/constants.ts rename to x-pack/solutions/security/plugins/kubernetes_security/common/constants.ts diff --git a/x-pack/plugins/kubernetes_security/common/translations.ts b/x-pack/solutions/security/plugins/kubernetes_security/common/translations.ts similarity index 100% rename from x-pack/plugins/kubernetes_security/common/translations.ts rename to x-pack/solutions/security/plugins/kubernetes_security/common/translations.ts diff --git a/x-pack/plugins/kubernetes_security/common/types/index.ts b/x-pack/solutions/security/plugins/kubernetes_security/common/types/index.ts similarity index 100% rename from x-pack/plugins/kubernetes_security/common/types/index.ts rename to x-pack/solutions/security/plugins/kubernetes_security/common/types/index.ts diff --git a/x-pack/plugins/kubernetes_security/common/types/latest.ts b/x-pack/solutions/security/plugins/kubernetes_security/common/types/latest.ts similarity index 100% rename from x-pack/plugins/kubernetes_security/common/types/latest.ts rename to x-pack/solutions/security/plugins/kubernetes_security/common/types/latest.ts diff --git a/x-pack/plugins/kubernetes_security/common/types/v1.ts b/x-pack/solutions/security/plugins/kubernetes_security/common/types/v1.ts similarity index 100% rename from x-pack/plugins/kubernetes_security/common/types/v1.ts rename to x-pack/solutions/security/plugins/kubernetes_security/common/types/v1.ts diff --git a/x-pack/plugins/session_view/jest.config.js b/x-pack/solutions/security/plugins/kubernetes_security/jest.config.js similarity index 54% rename from x-pack/plugins/session_view/jest.config.js rename to x-pack/solutions/security/plugins/kubernetes_security/jest.config.js index d35db0d369468..0ab8dfc19a081 100644 --- a/x-pack/plugins/session_view/jest.config.js +++ b/x-pack/solutions/security/plugins/kubernetes_security/jest.config.js @@ -7,12 +7,13 @@ module.exports = { preset: '@kbn/test', - rootDir: '../../..', - roots: ['/x-pack/plugins/session_view'], - coverageDirectory: '/target/kibana-coverage/jest/x-pack/plugins/session_view', + rootDir: '../../../../..', + roots: ['/x-pack/solutions/security/plugins/kubernetes_security'], + coverageDirectory: + '/target/kibana-coverage/jest/x-pack/solutions/security/plugins/kubernetes_security', coverageReporters: ['text', 'html'], collectCoverageFrom: [ - '/x-pack/plugins/session_view/{common,public,server}/**/*.{ts,tsx}', + '/x-pack/solutions/security/plugins/kubernetes_security/{common,public,server}/**/*.{ts,tsx}', ], setupFiles: ['jest-canvas-mock'], }; diff --git a/x-pack/plugins/kubernetes_security/kibana.jsonc b/x-pack/solutions/security/plugins/kubernetes_security/kibana.jsonc similarity index 100% rename from x-pack/plugins/kubernetes_security/kibana.jsonc rename to x-pack/solutions/security/plugins/kubernetes_security/kibana.jsonc diff --git a/x-pack/plugins/kubernetes_security/package.json b/x-pack/solutions/security/plugins/kubernetes_security/package.json similarity index 59% rename from x-pack/plugins/kubernetes_security/package.json rename to x-pack/solutions/security/plugins/kubernetes_security/package.json index 0f322f0649f66..b54e2d0381c93 100644 --- a/x-pack/plugins/kubernetes_security/package.json +++ b/x-pack/solutions/security/plugins/kubernetes_security/package.json @@ -5,7 +5,7 @@ "private": true, "license": "Elastic License 2.0", "scripts": { - "test:jest": "node ../../scripts/jest", - "test:coverage": "node ../../scripts/jest --coverage" + "test:jest": "node ../../../../scripts/jest", + "test:coverage": "node ../../../../scripts/jest --coverage" } } diff --git a/x-pack/plugins/kubernetes_security/public/components/charts_toggle/index.test.tsx b/x-pack/solutions/security/plugins/kubernetes_security/public/components/charts_toggle/index.test.tsx similarity index 100% rename from x-pack/plugins/kubernetes_security/public/components/charts_toggle/index.test.tsx rename to x-pack/solutions/security/plugins/kubernetes_security/public/components/charts_toggle/index.test.tsx diff --git a/x-pack/plugins/kubernetes_security/public/components/charts_toggle/index.tsx b/x-pack/solutions/security/plugins/kubernetes_security/public/components/charts_toggle/index.tsx similarity index 100% rename from x-pack/plugins/kubernetes_security/public/components/charts_toggle/index.tsx rename to x-pack/solutions/security/plugins/kubernetes_security/public/components/charts_toggle/index.tsx diff --git a/x-pack/plugins/kubernetes_security/public/components/container_name_widget/container_name_row.test.tsx b/x-pack/solutions/security/plugins/kubernetes_security/public/components/container_name_widget/container_name_row.test.tsx similarity index 100% rename from x-pack/plugins/kubernetes_security/public/components/container_name_widget/container_name_row.test.tsx rename to x-pack/solutions/security/plugins/kubernetes_security/public/components/container_name_widget/container_name_row.test.tsx diff --git a/x-pack/plugins/kubernetes_security/public/components/container_name_widget/container_name_row.tsx b/x-pack/solutions/security/plugins/kubernetes_security/public/components/container_name_widget/container_name_row.tsx similarity index 100% rename from x-pack/plugins/kubernetes_security/public/components/container_name_widget/container_name_row.tsx rename to x-pack/solutions/security/plugins/kubernetes_security/public/components/container_name_widget/container_name_row.tsx diff --git a/x-pack/plugins/kubernetes_security/public/components/container_name_widget/hooks.ts b/x-pack/solutions/security/plugins/kubernetes_security/public/components/container_name_widget/hooks.ts similarity index 100% rename from x-pack/plugins/kubernetes_security/public/components/container_name_widget/hooks.ts rename to x-pack/solutions/security/plugins/kubernetes_security/public/components/container_name_widget/hooks.ts diff --git a/x-pack/plugins/kubernetes_security/public/components/container_name_widget/index.test.tsx b/x-pack/solutions/security/plugins/kubernetes_security/public/components/container_name_widget/index.test.tsx similarity index 100% rename from x-pack/plugins/kubernetes_security/public/components/container_name_widget/index.test.tsx rename to x-pack/solutions/security/plugins/kubernetes_security/public/components/container_name_widget/index.test.tsx diff --git a/x-pack/plugins/kubernetes_security/public/components/container_name_widget/index.tsx b/x-pack/solutions/security/plugins/kubernetes_security/public/components/container_name_widget/index.tsx similarity index 100% rename from x-pack/plugins/kubernetes_security/public/components/container_name_widget/index.tsx rename to x-pack/solutions/security/plugins/kubernetes_security/public/components/container_name_widget/index.tsx diff --git a/x-pack/plugins/kubernetes_security/public/components/container_name_widget/styles.ts b/x-pack/solutions/security/plugins/kubernetes_security/public/components/container_name_widget/styles.ts similarity index 100% rename from x-pack/plugins/kubernetes_security/public/components/container_name_widget/styles.ts rename to x-pack/solutions/security/plugins/kubernetes_security/public/components/container_name_widget/styles.ts diff --git a/x-pack/plugins/kubernetes_security/public/components/count_widget/helpers.test.ts b/x-pack/solutions/security/plugins/kubernetes_security/public/components/count_widget/helpers.test.ts similarity index 100% rename from x-pack/plugins/kubernetes_security/public/components/count_widget/helpers.test.ts rename to x-pack/solutions/security/plugins/kubernetes_security/public/components/count_widget/helpers.test.ts diff --git a/x-pack/plugins/kubernetes_security/public/components/count_widget/helpers.ts b/x-pack/solutions/security/plugins/kubernetes_security/public/components/count_widget/helpers.ts similarity index 100% rename from x-pack/plugins/kubernetes_security/public/components/count_widget/helpers.ts rename to x-pack/solutions/security/plugins/kubernetes_security/public/components/count_widget/helpers.ts diff --git a/x-pack/plugins/kubernetes_security/public/components/count_widget/hooks.ts b/x-pack/solutions/security/plugins/kubernetes_security/public/components/count_widget/hooks.ts similarity index 100% rename from x-pack/plugins/kubernetes_security/public/components/count_widget/hooks.ts rename to x-pack/solutions/security/plugins/kubernetes_security/public/components/count_widget/hooks.ts diff --git a/x-pack/plugins/kubernetes_security/public/components/count_widget/index.test.tsx b/x-pack/solutions/security/plugins/kubernetes_security/public/components/count_widget/index.test.tsx similarity index 100% rename from x-pack/plugins/kubernetes_security/public/components/count_widget/index.test.tsx rename to x-pack/solutions/security/plugins/kubernetes_security/public/components/count_widget/index.test.tsx diff --git a/x-pack/plugins/kubernetes_security/public/components/count_widget/index.tsx b/x-pack/solutions/security/plugins/kubernetes_security/public/components/count_widget/index.tsx similarity index 100% rename from x-pack/plugins/kubernetes_security/public/components/count_widget/index.tsx rename to x-pack/solutions/security/plugins/kubernetes_security/public/components/count_widget/index.tsx diff --git a/x-pack/plugins/kubernetes_security/public/components/count_widget/styles.ts b/x-pack/solutions/security/plugins/kubernetes_security/public/components/count_widget/styles.ts similarity index 100% rename from x-pack/plugins/kubernetes_security/public/components/count_widget/styles.ts rename to x-pack/solutions/security/plugins/kubernetes_security/public/components/count_widget/styles.ts diff --git a/x-pack/plugins/kubernetes_security/public/components/kubernetes_security_routes/index.test.tsx b/x-pack/solutions/security/plugins/kubernetes_security/public/components/kubernetes_security_routes/index.test.tsx similarity index 100% rename from x-pack/plugins/kubernetes_security/public/components/kubernetes_security_routes/index.test.tsx rename to x-pack/solutions/security/plugins/kubernetes_security/public/components/kubernetes_security_routes/index.test.tsx diff --git a/x-pack/plugins/kubernetes_security/public/components/kubernetes_security_routes/index.tsx b/x-pack/solutions/security/plugins/kubernetes_security/public/components/kubernetes_security_routes/index.tsx similarity index 100% rename from x-pack/plugins/kubernetes_security/public/components/kubernetes_security_routes/index.tsx rename to x-pack/solutions/security/plugins/kubernetes_security/public/components/kubernetes_security_routes/index.tsx diff --git a/x-pack/plugins/kubernetes_security/public/components/kubernetes_security_routes/styles.ts b/x-pack/solutions/security/plugins/kubernetes_security/public/components/kubernetes_security_routes/styles.ts similarity index 100% rename from x-pack/plugins/kubernetes_security/public/components/kubernetes_security_routes/styles.ts rename to x-pack/solutions/security/plugins/kubernetes_security/public/components/kubernetes_security_routes/styles.ts diff --git a/x-pack/plugins/kubernetes_security/public/components/percent_widget/hooks.ts b/x-pack/solutions/security/plugins/kubernetes_security/public/components/percent_widget/hooks.ts similarity index 100% rename from x-pack/plugins/kubernetes_security/public/components/percent_widget/hooks.ts rename to x-pack/solutions/security/plugins/kubernetes_security/public/components/percent_widget/hooks.ts diff --git a/x-pack/plugins/kubernetes_security/public/components/percent_widget/index.test.tsx b/x-pack/solutions/security/plugins/kubernetes_security/public/components/percent_widget/index.test.tsx similarity index 100% rename from x-pack/plugins/kubernetes_security/public/components/percent_widget/index.test.tsx rename to x-pack/solutions/security/plugins/kubernetes_security/public/components/percent_widget/index.test.tsx diff --git a/x-pack/plugins/kubernetes_security/public/components/percent_widget/index.tsx b/x-pack/solutions/security/plugins/kubernetes_security/public/components/percent_widget/index.tsx similarity index 100% rename from x-pack/plugins/kubernetes_security/public/components/percent_widget/index.tsx rename to x-pack/solutions/security/plugins/kubernetes_security/public/components/percent_widget/index.tsx diff --git a/x-pack/plugins/kubernetes_security/public/components/percent_widget/styles.ts b/x-pack/solutions/security/plugins/kubernetes_security/public/components/percent_widget/styles.ts similarity index 100% rename from x-pack/plugins/kubernetes_security/public/components/percent_widget/styles.ts rename to x-pack/solutions/security/plugins/kubernetes_security/public/components/percent_widget/styles.ts diff --git a/x-pack/plugins/kubernetes_security/public/components/tree_view_container/assets/illustration_product_no_results_magnifying_glass.svg b/x-pack/solutions/security/plugins/kubernetes_security/public/components/tree_view_container/assets/illustration_product_no_results_magnifying_glass.svg similarity index 100% rename from x-pack/plugins/kubernetes_security/public/components/tree_view_container/assets/illustration_product_no_results_magnifying_glass.svg rename to x-pack/solutions/security/plugins/kubernetes_security/public/components/tree_view_container/assets/illustration_product_no_results_magnifying_glass.svg diff --git a/x-pack/plugins/kubernetes_security/public/components/tree_view_container/breadcrumb/__snapshots__/index.test.tsx.snap b/x-pack/solutions/security/plugins/kubernetes_security/public/components/tree_view_container/breadcrumb/__snapshots__/index.test.tsx.snap similarity index 100% rename from x-pack/plugins/kubernetes_security/public/components/tree_view_container/breadcrumb/__snapshots__/index.test.tsx.snap rename to x-pack/solutions/security/plugins/kubernetes_security/public/components/tree_view_container/breadcrumb/__snapshots__/index.test.tsx.snap diff --git a/x-pack/plugins/kubernetes_security/public/components/tree_view_container/breadcrumb/helper.test.tsx b/x-pack/solutions/security/plugins/kubernetes_security/public/components/tree_view_container/breadcrumb/helper.test.tsx similarity index 100% rename from x-pack/plugins/kubernetes_security/public/components/tree_view_container/breadcrumb/helper.test.tsx rename to x-pack/solutions/security/plugins/kubernetes_security/public/components/tree_view_container/breadcrumb/helper.test.tsx diff --git a/x-pack/plugins/kubernetes_security/public/components/tree_view_container/breadcrumb/helper.tsx b/x-pack/solutions/security/plugins/kubernetes_security/public/components/tree_view_container/breadcrumb/helper.tsx similarity index 100% rename from x-pack/plugins/kubernetes_security/public/components/tree_view_container/breadcrumb/helper.tsx rename to x-pack/solutions/security/plugins/kubernetes_security/public/components/tree_view_container/breadcrumb/helper.tsx diff --git a/x-pack/plugins/kubernetes_security/public/components/tree_view_container/breadcrumb/index.test.tsx b/x-pack/solutions/security/plugins/kubernetes_security/public/components/tree_view_container/breadcrumb/index.test.tsx similarity index 100% rename from x-pack/plugins/kubernetes_security/public/components/tree_view_container/breadcrumb/index.test.tsx rename to x-pack/solutions/security/plugins/kubernetes_security/public/components/tree_view_container/breadcrumb/index.test.tsx diff --git a/x-pack/plugins/kubernetes_security/public/components/tree_view_container/breadcrumb/index.tsx b/x-pack/solutions/security/plugins/kubernetes_security/public/components/tree_view_container/breadcrumb/index.tsx similarity index 100% rename from x-pack/plugins/kubernetes_security/public/components/tree_view_container/breadcrumb/index.tsx rename to x-pack/solutions/security/plugins/kubernetes_security/public/components/tree_view_container/breadcrumb/index.tsx diff --git a/x-pack/plugins/kubernetes_security/public/components/tree_view_container/breadcrumb/styles.ts b/x-pack/solutions/security/plugins/kubernetes_security/public/components/tree_view_container/breadcrumb/styles.ts similarity index 100% rename from x-pack/plugins/kubernetes_security/public/components/tree_view_container/breadcrumb/styles.ts rename to x-pack/solutions/security/plugins/kubernetes_security/public/components/tree_view_container/breadcrumb/styles.ts diff --git a/x-pack/plugins/kubernetes_security/public/components/tree_view_container/contexts.tsx b/x-pack/solutions/security/plugins/kubernetes_security/public/components/tree_view_container/contexts.tsx similarity index 100% rename from x-pack/plugins/kubernetes_security/public/components/tree_view_container/contexts.tsx rename to x-pack/solutions/security/plugins/kubernetes_security/public/components/tree_view_container/contexts.tsx diff --git a/x-pack/plugins/kubernetes_security/public/components/tree_view_container/dynamic_tree_view/helpers.test.tsx b/x-pack/solutions/security/plugins/kubernetes_security/public/components/tree_view_container/dynamic_tree_view/helpers.test.tsx similarity index 100% rename from x-pack/plugins/kubernetes_security/public/components/tree_view_container/dynamic_tree_view/helpers.test.tsx rename to x-pack/solutions/security/plugins/kubernetes_security/public/components/tree_view_container/dynamic_tree_view/helpers.test.tsx diff --git a/x-pack/plugins/kubernetes_security/public/components/tree_view_container/dynamic_tree_view/helpers.ts b/x-pack/solutions/security/plugins/kubernetes_security/public/components/tree_view_container/dynamic_tree_view/helpers.ts similarity index 100% rename from x-pack/plugins/kubernetes_security/public/components/tree_view_container/dynamic_tree_view/helpers.ts rename to x-pack/solutions/security/plugins/kubernetes_security/public/components/tree_view_container/dynamic_tree_view/helpers.ts diff --git a/x-pack/plugins/kubernetes_security/public/components/tree_view_container/dynamic_tree_view/hooks.ts b/x-pack/solutions/security/plugins/kubernetes_security/public/components/tree_view_container/dynamic_tree_view/hooks.ts similarity index 100% rename from x-pack/plugins/kubernetes_security/public/components/tree_view_container/dynamic_tree_view/hooks.ts rename to x-pack/solutions/security/plugins/kubernetes_security/public/components/tree_view_container/dynamic_tree_view/hooks.ts diff --git a/x-pack/plugins/kubernetes_security/public/components/tree_view_container/dynamic_tree_view/index.test.tsx b/x-pack/solutions/security/plugins/kubernetes_security/public/components/tree_view_container/dynamic_tree_view/index.test.tsx similarity index 100% rename from x-pack/plugins/kubernetes_security/public/components/tree_view_container/dynamic_tree_view/index.test.tsx rename to x-pack/solutions/security/plugins/kubernetes_security/public/components/tree_view_container/dynamic_tree_view/index.test.tsx diff --git a/x-pack/plugins/kubernetes_security/public/components/tree_view_container/dynamic_tree_view/index.tsx b/x-pack/solutions/security/plugins/kubernetes_security/public/components/tree_view_container/dynamic_tree_view/index.tsx similarity index 100% rename from x-pack/plugins/kubernetes_security/public/components/tree_view_container/dynamic_tree_view/index.tsx rename to x-pack/solutions/security/plugins/kubernetes_security/public/components/tree_view_container/dynamic_tree_view/index.tsx diff --git a/x-pack/plugins/kubernetes_security/public/components/tree_view_container/dynamic_tree_view/styles.ts b/x-pack/solutions/security/plugins/kubernetes_security/public/components/tree_view_container/dynamic_tree_view/styles.ts similarity index 100% rename from x-pack/plugins/kubernetes_security/public/components/tree_view_container/dynamic_tree_view/styles.ts rename to x-pack/solutions/security/plugins/kubernetes_security/public/components/tree_view_container/dynamic_tree_view/styles.ts diff --git a/x-pack/plugins/kubernetes_security/public/components/tree_view_container/dynamic_tree_view/types.ts b/x-pack/solutions/security/plugins/kubernetes_security/public/components/tree_view_container/dynamic_tree_view/types.ts similarity index 100% rename from x-pack/plugins/kubernetes_security/public/components/tree_view_container/dynamic_tree_view/types.ts rename to x-pack/solutions/security/plugins/kubernetes_security/public/components/tree_view_container/dynamic_tree_view/types.ts diff --git a/x-pack/plugins/kubernetes_security/public/components/tree_view_container/empty_state.tsx b/x-pack/solutions/security/plugins/kubernetes_security/public/components/tree_view_container/empty_state.tsx similarity index 100% rename from x-pack/plugins/kubernetes_security/public/components/tree_view_container/empty_state.tsx rename to x-pack/solutions/security/plugins/kubernetes_security/public/components/tree_view_container/empty_state.tsx diff --git a/x-pack/plugins/kubernetes_security/public/components/tree_view_container/helpers.ts b/x-pack/solutions/security/plugins/kubernetes_security/public/components/tree_view_container/helpers.ts similarity index 100% rename from x-pack/plugins/kubernetes_security/public/components/tree_view_container/helpers.ts rename to x-pack/solutions/security/plugins/kubernetes_security/public/components/tree_view_container/helpers.ts diff --git a/x-pack/plugins/kubernetes_security/public/components/tree_view_container/hooks.tsx b/x-pack/solutions/security/plugins/kubernetes_security/public/components/tree_view_container/hooks.tsx similarity index 100% rename from x-pack/plugins/kubernetes_security/public/components/tree_view_container/hooks.tsx rename to x-pack/solutions/security/plugins/kubernetes_security/public/components/tree_view_container/hooks.tsx diff --git a/x-pack/plugins/kubernetes_security/public/components/tree_view_container/index.test.tsx b/x-pack/solutions/security/plugins/kubernetes_security/public/components/tree_view_container/index.test.tsx similarity index 100% rename from x-pack/plugins/kubernetes_security/public/components/tree_view_container/index.test.tsx rename to x-pack/solutions/security/plugins/kubernetes_security/public/components/tree_view_container/index.test.tsx diff --git a/x-pack/plugins/kubernetes_security/public/components/tree_view_container/index.tsx b/x-pack/solutions/security/plugins/kubernetes_security/public/components/tree_view_container/index.tsx similarity index 100% rename from x-pack/plugins/kubernetes_security/public/components/tree_view_container/index.tsx rename to x-pack/solutions/security/plugins/kubernetes_security/public/components/tree_view_container/index.tsx diff --git a/x-pack/plugins/kubernetes_security/public/components/tree_view_container/mocks.ts b/x-pack/solutions/security/plugins/kubernetes_security/public/components/tree_view_container/mocks.ts similarity index 100% rename from x-pack/plugins/kubernetes_security/public/components/tree_view_container/mocks.ts rename to x-pack/solutions/security/plugins/kubernetes_security/public/components/tree_view_container/mocks.ts diff --git a/x-pack/plugins/kubernetes_security/public/components/tree_view_container/styles.ts b/x-pack/solutions/security/plugins/kubernetes_security/public/components/tree_view_container/styles.ts similarity index 100% rename from x-pack/plugins/kubernetes_security/public/components/tree_view_container/styles.ts rename to x-pack/solutions/security/plugins/kubernetes_security/public/components/tree_view_container/styles.ts diff --git a/x-pack/plugins/kubernetes_security/public/components/tree_view_container/translations.ts b/x-pack/solutions/security/plugins/kubernetes_security/public/components/tree_view_container/translations.ts similarity index 100% rename from x-pack/plugins/kubernetes_security/public/components/tree_view_container/translations.ts rename to x-pack/solutions/security/plugins/kubernetes_security/public/components/tree_view_container/translations.ts diff --git a/x-pack/plugins/kubernetes_security/public/components/tree_view_container/tree_nav/constants.ts b/x-pack/solutions/security/plugins/kubernetes_security/public/components/tree_view_container/tree_nav/constants.ts similarity index 100% rename from x-pack/plugins/kubernetes_security/public/components/tree_view_container/tree_nav/constants.ts rename to x-pack/solutions/security/plugins/kubernetes_security/public/components/tree_view_container/tree_nav/constants.ts diff --git a/x-pack/plugins/kubernetes_security/public/components/tree_view_container/tree_nav/index.test.tsx b/x-pack/solutions/security/plugins/kubernetes_security/public/components/tree_view_container/tree_nav/index.test.tsx similarity index 100% rename from x-pack/plugins/kubernetes_security/public/components/tree_view_container/tree_nav/index.test.tsx rename to x-pack/solutions/security/plugins/kubernetes_security/public/components/tree_view_container/tree_nav/index.test.tsx diff --git a/x-pack/plugins/kubernetes_security/public/components/tree_view_container/tree_nav/index.tsx b/x-pack/solutions/security/plugins/kubernetes_security/public/components/tree_view_container/tree_nav/index.tsx similarity index 100% rename from x-pack/plugins/kubernetes_security/public/components/tree_view_container/tree_nav/index.tsx rename to x-pack/solutions/security/plugins/kubernetes_security/public/components/tree_view_container/tree_nav/index.tsx diff --git a/x-pack/plugins/kubernetes_security/public/components/tree_view_container/tree_nav/styles.ts b/x-pack/solutions/security/plugins/kubernetes_security/public/components/tree_view_container/tree_nav/styles.ts similarity index 100% rename from x-pack/plugins/kubernetes_security/public/components/tree_view_container/tree_nav/styles.ts rename to x-pack/solutions/security/plugins/kubernetes_security/public/components/tree_view_container/tree_nav/styles.ts diff --git a/x-pack/plugins/kubernetes_security/public/components/tree_view_container/tree_nav/translations.ts b/x-pack/solutions/security/plugins/kubernetes_security/public/components/tree_view_container/tree_nav/translations.ts similarity index 100% rename from x-pack/plugins/kubernetes_security/public/components/tree_view_container/tree_nav/translations.ts rename to x-pack/solutions/security/plugins/kubernetes_security/public/components/tree_view_container/tree_nav/translations.ts diff --git a/x-pack/plugins/kubernetes_security/public/components/tree_view_container/tree_nav/types.ts b/x-pack/solutions/security/plugins/kubernetes_security/public/components/tree_view_container/tree_nav/types.ts similarity index 100% rename from x-pack/plugins/kubernetes_security/public/components/tree_view_container/tree_nav/types.ts rename to x-pack/solutions/security/plugins/kubernetes_security/public/components/tree_view_container/tree_nav/types.ts diff --git a/x-pack/plugins/kubernetes_security/public/components/tree_view_container/tree_view_icon.tsx b/x-pack/solutions/security/plugins/kubernetes_security/public/components/tree_view_container/tree_view_icon.tsx similarity index 100% rename from x-pack/plugins/kubernetes_security/public/components/tree_view_container/tree_view_icon.tsx rename to x-pack/solutions/security/plugins/kubernetes_security/public/components/tree_view_container/tree_view_icon.tsx diff --git a/x-pack/plugins/kubernetes_security/public/hooks/index.ts b/x-pack/solutions/security/plugins/kubernetes_security/public/hooks/index.ts similarity index 100% rename from x-pack/plugins/kubernetes_security/public/hooks/index.ts rename to x-pack/solutions/security/plugins/kubernetes_security/public/hooks/index.ts diff --git a/x-pack/plugins/kubernetes_security/public/hooks/use_eui_theme.ts b/x-pack/solutions/security/plugins/kubernetes_security/public/hooks/use_eui_theme.ts similarity index 100% rename from x-pack/plugins/kubernetes_security/public/hooks/use_eui_theme.ts rename to x-pack/solutions/security/plugins/kubernetes_security/public/hooks/use_eui_theme.ts diff --git a/x-pack/plugins/kubernetes_security/public/hooks/use_filter.ts b/x-pack/solutions/security/plugins/kubernetes_security/public/hooks/use_filter.ts similarity index 100% rename from x-pack/plugins/kubernetes_security/public/hooks/use_filter.ts rename to x-pack/solutions/security/plugins/kubernetes_security/public/hooks/use_filter.ts diff --git a/x-pack/plugins/kubernetes_security/public/hooks/use_last_updated.ts b/x-pack/solutions/security/plugins/kubernetes_security/public/hooks/use_last_updated.ts similarity index 100% rename from x-pack/plugins/kubernetes_security/public/hooks/use_last_updated.ts rename to x-pack/solutions/security/plugins/kubernetes_security/public/hooks/use_last_updated.ts diff --git a/x-pack/plugins/kubernetes_security/public/hooks/use_scroll.ts b/x-pack/solutions/security/plugins/kubernetes_security/public/hooks/use_scroll.ts similarity index 100% rename from x-pack/plugins/kubernetes_security/public/hooks/use_scroll.ts rename to x-pack/solutions/security/plugins/kubernetes_security/public/hooks/use_scroll.ts diff --git a/x-pack/plugins/kubernetes_security/public/index.ts b/x-pack/solutions/security/plugins/kubernetes_security/public/index.ts similarity index 100% rename from x-pack/plugins/kubernetes_security/public/index.ts rename to x-pack/solutions/security/plugins/kubernetes_security/public/index.ts diff --git a/x-pack/plugins/kubernetes_security/public/methods/index.tsx b/x-pack/solutions/security/plugins/kubernetes_security/public/methods/index.tsx similarity index 100% rename from x-pack/plugins/kubernetes_security/public/methods/index.tsx rename to x-pack/solutions/security/plugins/kubernetes_security/public/methods/index.tsx diff --git a/x-pack/plugins/kubernetes_security/public/plugin.ts b/x-pack/solutions/security/plugins/kubernetes_security/public/plugin.ts similarity index 100% rename from x-pack/plugins/kubernetes_security/public/plugin.ts rename to x-pack/solutions/security/plugins/kubernetes_security/public/plugin.ts diff --git a/x-pack/plugins/kubernetes_security/public/test/index.tsx b/x-pack/solutions/security/plugins/kubernetes_security/public/test/index.tsx similarity index 100% rename from x-pack/plugins/kubernetes_security/public/test/index.tsx rename to x-pack/solutions/security/plugins/kubernetes_security/public/test/index.tsx diff --git a/x-pack/plugins/kubernetes_security/public/types.ts b/x-pack/solutions/security/plugins/kubernetes_security/public/types.ts similarity index 100% rename from x-pack/plugins/kubernetes_security/public/types.ts rename to x-pack/solutions/security/plugins/kubernetes_security/public/types.ts diff --git a/x-pack/plugins/kubernetes_security/public/utils/add_commas_to_number.test.ts b/x-pack/solutions/security/plugins/kubernetes_security/public/utils/add_commas_to_number.test.ts similarity index 100% rename from x-pack/plugins/kubernetes_security/public/utils/add_commas_to_number.test.ts rename to x-pack/solutions/security/plugins/kubernetes_security/public/utils/add_commas_to_number.test.ts diff --git a/x-pack/plugins/kubernetes_security/public/utils/add_commas_to_number.ts b/x-pack/solutions/security/plugins/kubernetes_security/public/utils/add_commas_to_number.ts similarity index 100% rename from x-pack/plugins/kubernetes_security/public/utils/add_commas_to_number.ts rename to x-pack/solutions/security/plugins/kubernetes_security/public/utils/add_commas_to_number.ts diff --git a/x-pack/plugins/kubernetes_security/public/utils/add_timerange_and_default_filter_to_query.test.ts b/x-pack/solutions/security/plugins/kubernetes_security/public/utils/add_timerange_and_default_filter_to_query.test.ts similarity index 100% rename from x-pack/plugins/kubernetes_security/public/utils/add_timerange_and_default_filter_to_query.test.ts rename to x-pack/solutions/security/plugins/kubernetes_security/public/utils/add_timerange_and_default_filter_to_query.test.ts diff --git a/x-pack/plugins/kubernetes_security/public/utils/add_timerange_and_default_filter_to_query.ts b/x-pack/solutions/security/plugins/kubernetes_security/public/utils/add_timerange_and_default_filter_to_query.ts similarity index 100% rename from x-pack/plugins/kubernetes_security/public/utils/add_timerange_and_default_filter_to_query.ts rename to x-pack/solutions/security/plugins/kubernetes_security/public/utils/add_timerange_and_default_filter_to_query.ts diff --git a/x-pack/plugins/kubernetes_security/server/index.ts b/x-pack/solutions/security/plugins/kubernetes_security/server/index.ts similarity index 100% rename from x-pack/plugins/kubernetes_security/server/index.ts rename to x-pack/solutions/security/plugins/kubernetes_security/server/index.ts diff --git a/x-pack/plugins/kubernetes_security/server/plugin.ts b/x-pack/solutions/security/plugins/kubernetes_security/server/plugin.ts similarity index 100% rename from x-pack/plugins/kubernetes_security/server/plugin.ts rename to x-pack/solutions/security/plugins/kubernetes_security/server/plugin.ts diff --git a/x-pack/plugins/kubernetes_security/server/routes/aggregate.ts b/x-pack/solutions/security/plugins/kubernetes_security/server/routes/aggregate.ts similarity index 100% rename from x-pack/plugins/kubernetes_security/server/routes/aggregate.ts rename to x-pack/solutions/security/plugins/kubernetes_security/server/routes/aggregate.ts diff --git a/x-pack/plugins/kubernetes_security/server/routes/count.ts b/x-pack/solutions/security/plugins/kubernetes_security/server/routes/count.ts similarity index 100% rename from x-pack/plugins/kubernetes_security/server/routes/count.ts rename to x-pack/solutions/security/plugins/kubernetes_security/server/routes/count.ts diff --git a/x-pack/plugins/kubernetes_security/server/routes/index.ts b/x-pack/solutions/security/plugins/kubernetes_security/server/routes/index.ts similarity index 100% rename from x-pack/plugins/kubernetes_security/server/routes/index.ts rename to x-pack/solutions/security/plugins/kubernetes_security/server/routes/index.ts diff --git a/x-pack/plugins/kubernetes_security/server/routes/multi_terms_aggregate.ts b/x-pack/solutions/security/plugins/kubernetes_security/server/routes/multi_terms_aggregate.ts similarity index 100% rename from x-pack/plugins/kubernetes_security/server/routes/multi_terms_aggregate.ts rename to x-pack/solutions/security/plugins/kubernetes_security/server/routes/multi_terms_aggregate.ts diff --git a/x-pack/plugins/kubernetes_security/server/types.ts b/x-pack/solutions/security/plugins/kubernetes_security/server/types.ts similarity index 100% rename from x-pack/plugins/kubernetes_security/server/types.ts rename to x-pack/solutions/security/plugins/kubernetes_security/server/types.ts diff --git a/x-pack/plugins/kubernetes_security/tsconfig.json b/x-pack/solutions/security/plugins/kubernetes_security/tsconfig.json similarity index 91% rename from x-pack/plugins/kubernetes_security/tsconfig.json rename to x-pack/solutions/security/plugins/kubernetes_security/tsconfig.json index cf3d895eb40b9..3acc6db4c9bd7 100644 --- a/x-pack/plugins/kubernetes_security/tsconfig.json +++ b/x-pack/solutions/security/plugins/kubernetes_security/tsconfig.json @@ -1,5 +1,5 @@ { - "extends": "../../../tsconfig.base.json", + "extends": "../../../../../tsconfig.base.json", "compilerOptions": { "outDir": "target/types", }, @@ -12,7 +12,7 @@ "scripts/**/*", "package.json", "storybook/**/*", - "../../../typings/**/*" + "../../../../../typings/**/*" ], "kbn_references": [ "@kbn/core", diff --git a/x-pack/plugins/session_view/.eslintrc.json b/x-pack/solutions/security/plugins/session_view/.eslintrc.json similarity index 100% rename from x-pack/plugins/session_view/.eslintrc.json rename to x-pack/solutions/security/plugins/session_view/.eslintrc.json diff --git a/x-pack/plugins/session_view/README.md b/x-pack/solutions/security/plugins/session_view/README.md similarity index 91% rename from x-pack/plugins/session_view/README.md rename to x-pack/solutions/security/plugins/session_view/README.md index 384be8bcc292b..7c83a3dcf42ac 100644 --- a/x-pack/plugins/session_view/README.md +++ b/x-pack/solutions/security/plugins/session_view/README.md @@ -20,7 +20,7 @@ It provides an audit trail of: From kibana path in your terminal go to this plugin root: ```bash -cd x-pack/plugins/session_view +cd x-pack/solutions/security/plugins/session_view ``` Then run jest with: @@ -32,5 +32,5 @@ yarn test:jest Or if running from kibana root, you can specify the `-i` to specify the path: ```bash -yarn test:jest -i x-pack/plugins/session_view/ +yarn test:jest -i x-pack/solutions/security/plugins/session_view/ ``` diff --git a/x-pack/plugins/session_view/common/constants.ts b/x-pack/solutions/security/plugins/session_view/common/constants.ts similarity index 100% rename from x-pack/plugins/session_view/common/constants.ts rename to x-pack/solutions/security/plugins/session_view/common/constants.ts diff --git a/x-pack/plugins/session_view/common/index.ts b/x-pack/solutions/security/plugins/session_view/common/index.ts similarity index 100% rename from x-pack/plugins/session_view/common/index.ts rename to x-pack/solutions/security/plugins/session_view/common/index.ts diff --git a/x-pack/plugins/session_view/common/mocks/constants/session_view_process.mock.ts b/x-pack/solutions/security/plugins/session_view/common/mocks/constants/session_view_process.mock.ts similarity index 100% rename from x-pack/plugins/session_view/common/mocks/constants/session_view_process.mock.ts rename to x-pack/solutions/security/plugins/session_view/common/mocks/constants/session_view_process.mock.ts diff --git a/x-pack/plugins/session_view/common/mocks/responses/session_view_io_events.mock.ts b/x-pack/solutions/security/plugins/session_view/common/mocks/responses/session_view_io_events.mock.ts similarity index 100% rename from x-pack/plugins/session_view/common/mocks/responses/session_view_io_events.mock.ts rename to x-pack/solutions/security/plugins/session_view/common/mocks/responses/session_view_io_events.mock.ts diff --git a/x-pack/plugins/session_view/common/mocks/responses/session_view_process_events.mock.ts b/x-pack/solutions/security/plugins/session_view/common/mocks/responses/session_view_process_events.mock.ts similarity index 100% rename from x-pack/plugins/session_view/common/mocks/responses/session_view_process_events.mock.ts rename to x-pack/solutions/security/plugins/session_view/common/mocks/responses/session_view_process_events.mock.ts diff --git a/x-pack/plugins/session_view/common/mocks/responses/session_view_process_events_merged.mock.ts b/x-pack/solutions/security/plugins/session_view/common/mocks/responses/session_view_process_events_merged.mock.ts similarity index 100% rename from x-pack/plugins/session_view/common/mocks/responses/session_view_process_events_merged.mock.ts rename to x-pack/solutions/security/plugins/session_view/common/mocks/responses/session_view_process_events_merged.mock.ts diff --git a/x-pack/plugins/session_view/common/translations.ts b/x-pack/solutions/security/plugins/session_view/common/translations.ts similarity index 100% rename from x-pack/plugins/session_view/common/translations.ts rename to x-pack/solutions/security/plugins/session_view/common/translations.ts diff --git a/x-pack/plugins/session_view/common/types/latest.ts b/x-pack/solutions/security/plugins/session_view/common/types/latest.ts similarity index 100% rename from x-pack/plugins/session_view/common/types/latest.ts rename to x-pack/solutions/security/plugins/session_view/common/types/latest.ts diff --git a/x-pack/plugins/session_view/common/types/v1.ts b/x-pack/solutions/security/plugins/session_view/common/types/v1.ts similarity index 100% rename from x-pack/plugins/session_view/common/types/v1.ts rename to x-pack/solutions/security/plugins/session_view/common/types/v1.ts diff --git a/x-pack/plugins/session_view/common/utils/alert_icon_tooltip_content.test.ts b/x-pack/solutions/security/plugins/session_view/common/utils/alert_icon_tooltip_content.test.ts similarity index 100% rename from x-pack/plugins/session_view/common/utils/alert_icon_tooltip_content.test.ts rename to x-pack/solutions/security/plugins/session_view/common/utils/alert_icon_tooltip_content.test.ts diff --git a/x-pack/plugins/session_view/common/utils/alert_icon_tooltip_content.ts b/x-pack/solutions/security/plugins/session_view/common/utils/alert_icon_tooltip_content.ts similarity index 100% rename from x-pack/plugins/session_view/common/utils/alert_icon_tooltip_content.ts rename to x-pack/solutions/security/plugins/session_view/common/utils/alert_icon_tooltip_content.ts diff --git a/x-pack/plugins/session_view/common/utils/expand_dotted_object.test.ts b/x-pack/solutions/security/plugins/session_view/common/utils/expand_dotted_object.test.ts similarity index 100% rename from x-pack/plugins/session_view/common/utils/expand_dotted_object.test.ts rename to x-pack/solutions/security/plugins/session_view/common/utils/expand_dotted_object.test.ts diff --git a/x-pack/plugins/session_view/common/utils/expand_dotted_object.ts b/x-pack/solutions/security/plugins/session_view/common/utils/expand_dotted_object.ts similarity index 100% rename from x-pack/plugins/session_view/common/utils/expand_dotted_object.ts rename to x-pack/solutions/security/plugins/session_view/common/utils/expand_dotted_object.ts diff --git a/x-pack/plugins/session_view/common/utils/sort_processes.test.ts b/x-pack/solutions/security/plugins/session_view/common/utils/sort_processes.test.ts similarity index 100% rename from x-pack/plugins/session_view/common/utils/sort_processes.test.ts rename to x-pack/solutions/security/plugins/session_view/common/utils/sort_processes.test.ts diff --git a/x-pack/plugins/session_view/common/utils/sort_processes.ts b/x-pack/solutions/security/plugins/session_view/common/utils/sort_processes.ts similarity index 100% rename from x-pack/plugins/session_view/common/utils/sort_processes.ts rename to x-pack/solutions/security/plugins/session_view/common/utils/sort_processes.ts diff --git a/x-pack/plugins/kubernetes_security/jest.config.js b/x-pack/solutions/security/plugins/session_view/jest.config.js similarity index 56% rename from x-pack/plugins/kubernetes_security/jest.config.js rename to x-pack/solutions/security/plugins/session_view/jest.config.js index d42855eeab9de..b4881f48bbf6a 100644 --- a/x-pack/plugins/kubernetes_security/jest.config.js +++ b/x-pack/solutions/security/plugins/session_view/jest.config.js @@ -7,12 +7,13 @@ module.exports = { preset: '@kbn/test', - rootDir: '../../..', - roots: ['/x-pack/plugins/kubernetes_security'], - coverageDirectory: '/target/kibana-coverage/jest/x-pack/plugins/kubernetes_security', + rootDir: '../../../../..', + roots: ['/x-pack/solutions/security/plugins/session_view'], + coverageDirectory: + '/target/kibana-coverage/jest/x-pack/solutions/security/plugins/session_view', coverageReporters: ['text', 'html'], collectCoverageFrom: [ - '/x-pack/plugins/kubernetes_security/{common,public,server}/**/*.{ts,tsx}', + '/x-pack/solutions/security/plugins/session_view/{common,public,server}/**/*.{ts,tsx}', ], setupFiles: ['jest-canvas-mock'], }; diff --git a/x-pack/plugins/session_view/kibana.jsonc b/x-pack/solutions/security/plugins/session_view/kibana.jsonc similarity index 100% rename from x-pack/plugins/session_view/kibana.jsonc rename to x-pack/solutions/security/plugins/session_view/kibana.jsonc diff --git a/x-pack/plugins/session_view/package.json b/x-pack/solutions/security/plugins/session_view/package.json similarity index 58% rename from x-pack/plugins/session_view/package.json rename to x-pack/solutions/security/plugins/session_view/package.json index 256080545ba17..a9e4ab1ca6236 100644 --- a/x-pack/plugins/session_view/package.json +++ b/x-pack/solutions/security/plugins/session_view/package.json @@ -5,7 +5,7 @@ "private": true, "license": "Elastic License 2.0", "scripts": { - "test:jest": "node ../../scripts/jest", - "test:coverage": "node ../../scripts/jest --coverage" + "test:jest": "node ../../../../scripts/jest", + "test:coverage": "node ../../../../scripts/jest --coverage" } } diff --git a/x-pack/plugins/session_view/public/components/back_to_investigated_alert/index.test.tsx b/x-pack/solutions/security/plugins/session_view/public/components/back_to_investigated_alert/index.test.tsx similarity index 100% rename from x-pack/plugins/session_view/public/components/back_to_investigated_alert/index.test.tsx rename to x-pack/solutions/security/plugins/session_view/public/components/back_to_investigated_alert/index.test.tsx diff --git a/x-pack/plugins/session_view/public/components/back_to_investigated_alert/index.tsx b/x-pack/solutions/security/plugins/session_view/public/components/back_to_investigated_alert/index.tsx similarity index 100% rename from x-pack/plugins/session_view/public/components/back_to_investigated_alert/index.tsx rename to x-pack/solutions/security/plugins/session_view/public/components/back_to_investigated_alert/index.tsx diff --git a/x-pack/plugins/session_view/public/components/back_to_investigated_alert/styles.ts b/x-pack/solutions/security/plugins/session_view/public/components/back_to_investigated_alert/styles.ts similarity index 100% rename from x-pack/plugins/session_view/public/components/back_to_investigated_alert/styles.ts rename to x-pack/solutions/security/plugins/session_view/public/components/back_to_investigated_alert/styles.ts diff --git a/x-pack/plugins/session_view/public/components/detail_panel_accordion/index.test.tsx b/x-pack/solutions/security/plugins/session_view/public/components/detail_panel_accordion/index.test.tsx similarity index 100% rename from x-pack/plugins/session_view/public/components/detail_panel_accordion/index.test.tsx rename to x-pack/solutions/security/plugins/session_view/public/components/detail_panel_accordion/index.test.tsx diff --git a/x-pack/plugins/session_view/public/components/detail_panel_accordion/index.tsx b/x-pack/solutions/security/plugins/session_view/public/components/detail_panel_accordion/index.tsx similarity index 100% rename from x-pack/plugins/session_view/public/components/detail_panel_accordion/index.tsx rename to x-pack/solutions/security/plugins/session_view/public/components/detail_panel_accordion/index.tsx diff --git a/x-pack/plugins/session_view/public/components/detail_panel_accordion/styles.ts b/x-pack/solutions/security/plugins/session_view/public/components/detail_panel_accordion/styles.ts similarity index 100% rename from x-pack/plugins/session_view/public/components/detail_panel_accordion/styles.ts rename to x-pack/solutions/security/plugins/session_view/public/components/detail_panel_accordion/styles.ts diff --git a/x-pack/plugins/session_view/public/components/detail_panel_alert_actions/index.test.tsx b/x-pack/solutions/security/plugins/session_view/public/components/detail_panel_alert_actions/index.test.tsx similarity index 100% rename from x-pack/plugins/session_view/public/components/detail_panel_alert_actions/index.test.tsx rename to x-pack/solutions/security/plugins/session_view/public/components/detail_panel_alert_actions/index.test.tsx diff --git a/x-pack/plugins/session_view/public/components/detail_panel_alert_actions/index.tsx b/x-pack/solutions/security/plugins/session_view/public/components/detail_panel_alert_actions/index.tsx similarity index 100% rename from x-pack/plugins/session_view/public/components/detail_panel_alert_actions/index.tsx rename to x-pack/solutions/security/plugins/session_view/public/components/detail_panel_alert_actions/index.tsx diff --git a/x-pack/plugins/session_view/public/components/detail_panel_alert_actions/styles.ts b/x-pack/solutions/security/plugins/session_view/public/components/detail_panel_alert_actions/styles.ts similarity index 100% rename from x-pack/plugins/session_view/public/components/detail_panel_alert_actions/styles.ts rename to x-pack/solutions/security/plugins/session_view/public/components/detail_panel_alert_actions/styles.ts diff --git a/x-pack/plugins/session_view/public/components/detail_panel_alert_group_item/index.tsx b/x-pack/solutions/security/plugins/session_view/public/components/detail_panel_alert_group_item/index.tsx similarity index 100% rename from x-pack/plugins/session_view/public/components/detail_panel_alert_group_item/index.tsx rename to x-pack/solutions/security/plugins/session_view/public/components/detail_panel_alert_group_item/index.tsx diff --git a/x-pack/plugins/session_view/public/components/detail_panel_alert_list_item/index.tsx b/x-pack/solutions/security/plugins/session_view/public/components/detail_panel_alert_list_item/index.tsx similarity index 100% rename from x-pack/plugins/session_view/public/components/detail_panel_alert_list_item/index.tsx rename to x-pack/solutions/security/plugins/session_view/public/components/detail_panel_alert_list_item/index.tsx diff --git a/x-pack/plugins/session_view/public/components/detail_panel_alert_list_item/styles.ts b/x-pack/solutions/security/plugins/session_view/public/components/detail_panel_alert_list_item/styles.ts similarity index 100% rename from x-pack/plugins/session_view/public/components/detail_panel_alert_list_item/styles.ts rename to x-pack/solutions/security/plugins/session_view/public/components/detail_panel_alert_list_item/styles.ts diff --git a/x-pack/plugins/session_view/public/components/detail_panel_alert_tab/index.test.tsx b/x-pack/solutions/security/plugins/session_view/public/components/detail_panel_alert_tab/index.test.tsx similarity index 100% rename from x-pack/plugins/session_view/public/components/detail_panel_alert_tab/index.test.tsx rename to x-pack/solutions/security/plugins/session_view/public/components/detail_panel_alert_tab/index.test.tsx diff --git a/x-pack/plugins/session_view/public/components/detail_panel_alert_tab/index.tsx b/x-pack/solutions/security/plugins/session_view/public/components/detail_panel_alert_tab/index.tsx similarity index 100% rename from x-pack/plugins/session_view/public/components/detail_panel_alert_tab/index.tsx rename to x-pack/solutions/security/plugins/session_view/public/components/detail_panel_alert_tab/index.tsx diff --git a/x-pack/plugins/session_view/public/components/detail_panel_alert_tab/styles.ts b/x-pack/solutions/security/plugins/session_view/public/components/detail_panel_alert_tab/styles.ts similarity index 100% rename from x-pack/plugins/session_view/public/components/detail_panel_alert_tab/styles.ts rename to x-pack/solutions/security/plugins/session_view/public/components/detail_panel_alert_tab/styles.ts diff --git a/x-pack/plugins/session_view/public/components/detail_panel_copy/__snapshots__/index.test.tsx.snap b/x-pack/solutions/security/plugins/session_view/public/components/detail_panel_copy/__snapshots__/index.test.tsx.snap similarity index 100% rename from x-pack/plugins/session_view/public/components/detail_panel_copy/__snapshots__/index.test.tsx.snap rename to x-pack/solutions/security/plugins/session_view/public/components/detail_panel_copy/__snapshots__/index.test.tsx.snap diff --git a/x-pack/plugins/session_view/public/components/detail_panel_copy/index.test.tsx b/x-pack/solutions/security/plugins/session_view/public/components/detail_panel_copy/index.test.tsx similarity index 100% rename from x-pack/plugins/session_view/public/components/detail_panel_copy/index.test.tsx rename to x-pack/solutions/security/plugins/session_view/public/components/detail_panel_copy/index.test.tsx diff --git a/x-pack/plugins/session_view/public/components/detail_panel_copy/index.tsx b/x-pack/solutions/security/plugins/session_view/public/components/detail_panel_copy/index.tsx similarity index 100% rename from x-pack/plugins/session_view/public/components/detail_panel_copy/index.tsx rename to x-pack/solutions/security/plugins/session_view/public/components/detail_panel_copy/index.tsx diff --git a/x-pack/plugins/session_view/public/components/detail_panel_copy/styles.ts b/x-pack/solutions/security/plugins/session_view/public/components/detail_panel_copy/styles.ts similarity index 100% rename from x-pack/plugins/session_view/public/components/detail_panel_copy/styles.ts rename to x-pack/solutions/security/plugins/session_view/public/components/detail_panel_copy/styles.ts diff --git a/x-pack/plugins/session_view/public/components/detail_panel_description_list/index.test.tsx b/x-pack/solutions/security/plugins/session_view/public/components/detail_panel_description_list/index.test.tsx similarity index 100% rename from x-pack/plugins/session_view/public/components/detail_panel_description_list/index.test.tsx rename to x-pack/solutions/security/plugins/session_view/public/components/detail_panel_description_list/index.test.tsx diff --git a/x-pack/plugins/session_view/public/components/detail_panel_description_list/index.tsx b/x-pack/solutions/security/plugins/session_view/public/components/detail_panel_description_list/index.tsx similarity index 100% rename from x-pack/plugins/session_view/public/components/detail_panel_description_list/index.tsx rename to x-pack/solutions/security/plugins/session_view/public/components/detail_panel_description_list/index.tsx diff --git a/x-pack/plugins/session_view/public/components/detail_panel_description_list/styles.ts b/x-pack/solutions/security/plugins/session_view/public/components/detail_panel_description_list/styles.ts similarity index 100% rename from x-pack/plugins/session_view/public/components/detail_panel_description_list/styles.ts rename to x-pack/solutions/security/plugins/session_view/public/components/detail_panel_description_list/styles.ts diff --git a/x-pack/plugins/session_view/public/components/detail_panel_list_item/index.test.tsx b/x-pack/solutions/security/plugins/session_view/public/components/detail_panel_list_item/index.test.tsx similarity index 100% rename from x-pack/plugins/session_view/public/components/detail_panel_list_item/index.test.tsx rename to x-pack/solutions/security/plugins/session_view/public/components/detail_panel_list_item/index.test.tsx diff --git a/x-pack/plugins/session_view/public/components/detail_panel_list_item/index.tsx b/x-pack/solutions/security/plugins/session_view/public/components/detail_panel_list_item/index.tsx similarity index 100% rename from x-pack/plugins/session_view/public/components/detail_panel_list_item/index.tsx rename to x-pack/solutions/security/plugins/session_view/public/components/detail_panel_list_item/index.tsx diff --git a/x-pack/plugins/session_view/public/components/detail_panel_list_item/styles.ts b/x-pack/solutions/security/plugins/session_view/public/components/detail_panel_list_item/styles.ts similarity index 100% rename from x-pack/plugins/session_view/public/components/detail_panel_list_item/styles.ts rename to x-pack/solutions/security/plugins/session_view/public/components/detail_panel_list_item/styles.ts diff --git a/x-pack/plugins/session_view/public/components/detail_panel_metadata_tab/helpers.test.ts b/x-pack/solutions/security/plugins/session_view/public/components/detail_panel_metadata_tab/helpers.test.ts similarity index 100% rename from x-pack/plugins/session_view/public/components/detail_panel_metadata_tab/helpers.test.ts rename to x-pack/solutions/security/plugins/session_view/public/components/detail_panel_metadata_tab/helpers.test.ts diff --git a/x-pack/plugins/session_view/public/components/detail_panel_metadata_tab/helpers.ts b/x-pack/solutions/security/plugins/session_view/public/components/detail_panel_metadata_tab/helpers.ts similarity index 100% rename from x-pack/plugins/session_view/public/components/detail_panel_metadata_tab/helpers.ts rename to x-pack/solutions/security/plugins/session_view/public/components/detail_panel_metadata_tab/helpers.ts diff --git a/x-pack/plugins/session_view/public/components/detail_panel_metadata_tab/index.test.tsx b/x-pack/solutions/security/plugins/session_view/public/components/detail_panel_metadata_tab/index.test.tsx similarity index 100% rename from x-pack/plugins/session_view/public/components/detail_panel_metadata_tab/index.test.tsx rename to x-pack/solutions/security/plugins/session_view/public/components/detail_panel_metadata_tab/index.test.tsx diff --git a/x-pack/plugins/session_view/public/components/detail_panel_metadata_tab/index.tsx b/x-pack/solutions/security/plugins/session_view/public/components/detail_panel_metadata_tab/index.tsx similarity index 100% rename from x-pack/plugins/session_view/public/components/detail_panel_metadata_tab/index.tsx rename to x-pack/solutions/security/plugins/session_view/public/components/detail_panel_metadata_tab/index.tsx diff --git a/x-pack/plugins/session_view/public/components/detail_panel_metadata_tab/styles.ts b/x-pack/solutions/security/plugins/session_view/public/components/detail_panel_metadata_tab/styles.ts similarity index 100% rename from x-pack/plugins/session_view/public/components/detail_panel_metadata_tab/styles.ts rename to x-pack/solutions/security/plugins/session_view/public/components/detail_panel_metadata_tab/styles.ts diff --git a/x-pack/plugins/session_view/public/components/detail_panel_process_tab/helpers.test.ts b/x-pack/solutions/security/plugins/session_view/public/components/detail_panel_process_tab/helpers.test.ts similarity index 100% rename from x-pack/plugins/session_view/public/components/detail_panel_process_tab/helpers.test.ts rename to x-pack/solutions/security/plugins/session_view/public/components/detail_panel_process_tab/helpers.test.ts diff --git a/x-pack/plugins/session_view/public/components/detail_panel_process_tab/helpers.ts b/x-pack/solutions/security/plugins/session_view/public/components/detail_panel_process_tab/helpers.ts similarity index 100% rename from x-pack/plugins/session_view/public/components/detail_panel_process_tab/helpers.ts rename to x-pack/solutions/security/plugins/session_view/public/components/detail_panel_process_tab/helpers.ts diff --git a/x-pack/plugins/session_view/public/components/detail_panel_process_tab/index.test.tsx b/x-pack/solutions/security/plugins/session_view/public/components/detail_panel_process_tab/index.test.tsx similarity index 100% rename from x-pack/plugins/session_view/public/components/detail_panel_process_tab/index.test.tsx rename to x-pack/solutions/security/plugins/session_view/public/components/detail_panel_process_tab/index.test.tsx diff --git a/x-pack/plugins/session_view/public/components/detail_panel_process_tab/index.tsx b/x-pack/solutions/security/plugins/session_view/public/components/detail_panel_process_tab/index.tsx similarity index 100% rename from x-pack/plugins/session_view/public/components/detail_panel_process_tab/index.tsx rename to x-pack/solutions/security/plugins/session_view/public/components/detail_panel_process_tab/index.tsx diff --git a/x-pack/plugins/session_view/public/components/detail_panel_process_tab/styles.ts b/x-pack/solutions/security/plugins/session_view/public/components/detail_panel_process_tab/styles.ts similarity index 100% rename from x-pack/plugins/session_view/public/components/detail_panel_process_tab/styles.ts rename to x-pack/solutions/security/plugins/session_view/public/components/detail_panel_process_tab/styles.ts diff --git a/x-pack/plugins/session_view/public/components/process_tree/helpers.test.ts b/x-pack/solutions/security/plugins/session_view/public/components/process_tree/helpers.test.ts similarity index 100% rename from x-pack/plugins/session_view/public/components/process_tree/helpers.test.ts rename to x-pack/solutions/security/plugins/session_view/public/components/process_tree/helpers.test.ts diff --git a/x-pack/plugins/session_view/public/components/process_tree/helpers.ts b/x-pack/solutions/security/plugins/session_view/public/components/process_tree/helpers.ts similarity index 100% rename from x-pack/plugins/session_view/public/components/process_tree/helpers.ts rename to x-pack/solutions/security/plugins/session_view/public/components/process_tree/helpers.ts diff --git a/x-pack/plugins/session_view/public/components/process_tree/hooks.test.tsx b/x-pack/solutions/security/plugins/session_view/public/components/process_tree/hooks.test.tsx similarity index 100% rename from x-pack/plugins/session_view/public/components/process_tree/hooks.test.tsx rename to x-pack/solutions/security/plugins/session_view/public/components/process_tree/hooks.test.tsx diff --git a/x-pack/plugins/session_view/public/components/process_tree/hooks.ts b/x-pack/solutions/security/plugins/session_view/public/components/process_tree/hooks.ts similarity index 100% rename from x-pack/plugins/session_view/public/components/process_tree/hooks.ts rename to x-pack/solutions/security/plugins/session_view/public/components/process_tree/hooks.ts diff --git a/x-pack/plugins/session_view/public/components/process_tree/index.test.tsx b/x-pack/solutions/security/plugins/session_view/public/components/process_tree/index.test.tsx similarity index 100% rename from x-pack/plugins/session_view/public/components/process_tree/index.test.tsx rename to x-pack/solutions/security/plugins/session_view/public/components/process_tree/index.test.tsx diff --git a/x-pack/plugins/session_view/public/components/process_tree/index.tsx b/x-pack/solutions/security/plugins/session_view/public/components/process_tree/index.tsx similarity index 100% rename from x-pack/plugins/session_view/public/components/process_tree/index.tsx rename to x-pack/solutions/security/plugins/session_view/public/components/process_tree/index.tsx diff --git a/x-pack/plugins/session_view/public/components/process_tree/styles.ts b/x-pack/solutions/security/plugins/session_view/public/components/process_tree/styles.ts similarity index 100% rename from x-pack/plugins/session_view/public/components/process_tree/styles.ts rename to x-pack/solutions/security/plugins/session_view/public/components/process_tree/styles.ts diff --git a/x-pack/plugins/session_view/public/components/process_tree_alert/__snapshots__/index.test.tsx.snap b/x-pack/solutions/security/plugins/session_view/public/components/process_tree_alert/__snapshots__/index.test.tsx.snap similarity index 100% rename from x-pack/plugins/session_view/public/components/process_tree_alert/__snapshots__/index.test.tsx.snap rename to x-pack/solutions/security/plugins/session_view/public/components/process_tree_alert/__snapshots__/index.test.tsx.snap diff --git a/x-pack/plugins/session_view/public/components/process_tree_alert/helpers.ts b/x-pack/solutions/security/plugins/session_view/public/components/process_tree_alert/helpers.ts similarity index 100% rename from x-pack/plugins/session_view/public/components/process_tree_alert/helpers.ts rename to x-pack/solutions/security/plugins/session_view/public/components/process_tree_alert/helpers.ts diff --git a/x-pack/plugins/session_view/public/components/process_tree_alert/index.test.tsx b/x-pack/solutions/security/plugins/session_view/public/components/process_tree_alert/index.test.tsx similarity index 100% rename from x-pack/plugins/session_view/public/components/process_tree_alert/index.test.tsx rename to x-pack/solutions/security/plugins/session_view/public/components/process_tree_alert/index.test.tsx diff --git a/x-pack/plugins/session_view/public/components/process_tree_alert/index.tsx b/x-pack/solutions/security/plugins/session_view/public/components/process_tree_alert/index.tsx similarity index 100% rename from x-pack/plugins/session_view/public/components/process_tree_alert/index.tsx rename to x-pack/solutions/security/plugins/session_view/public/components/process_tree_alert/index.tsx diff --git a/x-pack/plugins/session_view/public/components/process_tree_alert/styles.ts b/x-pack/solutions/security/plugins/session_view/public/components/process_tree_alert/styles.ts similarity index 100% rename from x-pack/plugins/session_view/public/components/process_tree_alert/styles.ts rename to x-pack/solutions/security/plugins/session_view/public/components/process_tree_alert/styles.ts diff --git a/x-pack/plugins/session_view/public/components/process_tree_alerts/index.test.tsx b/x-pack/solutions/security/plugins/session_view/public/components/process_tree_alerts/index.test.tsx similarity index 100% rename from x-pack/plugins/session_view/public/components/process_tree_alerts/index.test.tsx rename to x-pack/solutions/security/plugins/session_view/public/components/process_tree_alerts/index.test.tsx diff --git a/x-pack/plugins/session_view/public/components/process_tree_alerts/index.tsx b/x-pack/solutions/security/plugins/session_view/public/components/process_tree_alerts/index.tsx similarity index 100% rename from x-pack/plugins/session_view/public/components/process_tree_alerts/index.tsx rename to x-pack/solutions/security/plugins/session_view/public/components/process_tree_alerts/index.tsx diff --git a/x-pack/plugins/session_view/public/components/process_tree_alerts/styles.ts b/x-pack/solutions/security/plugins/session_view/public/components/process_tree_alerts/styles.ts similarity index 100% rename from x-pack/plugins/session_view/public/components/process_tree_alerts/styles.ts rename to x-pack/solutions/security/plugins/session_view/public/components/process_tree_alerts/styles.ts diff --git a/x-pack/plugins/session_view/public/components/process_tree_alerts_filter/index.test.tsx b/x-pack/solutions/security/plugins/session_view/public/components/process_tree_alerts_filter/index.test.tsx similarity index 100% rename from x-pack/plugins/session_view/public/components/process_tree_alerts_filter/index.test.tsx rename to x-pack/solutions/security/plugins/session_view/public/components/process_tree_alerts_filter/index.test.tsx diff --git a/x-pack/plugins/session_view/public/components/process_tree_alerts_filter/index.tsx b/x-pack/solutions/security/plugins/session_view/public/components/process_tree_alerts_filter/index.tsx similarity index 100% rename from x-pack/plugins/session_view/public/components/process_tree_alerts_filter/index.tsx rename to x-pack/solutions/security/plugins/session_view/public/components/process_tree_alerts_filter/index.tsx diff --git a/x-pack/plugins/session_view/public/components/process_tree_alerts_filter/styles.ts b/x-pack/solutions/security/plugins/session_view/public/components/process_tree_alerts_filter/styles.ts similarity index 100% rename from x-pack/plugins/session_view/public/components/process_tree_alerts_filter/styles.ts rename to x-pack/solutions/security/plugins/session_view/public/components/process_tree_alerts_filter/styles.ts diff --git a/x-pack/plugins/session_view/public/components/process_tree_alerts_filter/translations.ts b/x-pack/solutions/security/plugins/session_view/public/components/process_tree_alerts_filter/translations.ts similarity index 100% rename from x-pack/plugins/session_view/public/components/process_tree_alerts_filter/translations.ts rename to x-pack/solutions/security/plugins/session_view/public/components/process_tree_alerts_filter/translations.ts diff --git a/x-pack/plugins/session_view/public/components/process_tree_load_more_button/index.tsx b/x-pack/solutions/security/plugins/session_view/public/components/process_tree_load_more_button/index.tsx similarity index 100% rename from x-pack/plugins/session_view/public/components/process_tree_load_more_button/index.tsx rename to x-pack/solutions/security/plugins/session_view/public/components/process_tree_load_more_button/index.tsx diff --git a/x-pack/plugins/session_view/public/components/process_tree_load_more_button/styles.ts b/x-pack/solutions/security/plugins/session_view/public/components/process_tree_load_more_button/styles.ts similarity index 100% rename from x-pack/plugins/session_view/public/components/process_tree_load_more_button/styles.ts rename to x-pack/solutions/security/plugins/session_view/public/components/process_tree_load_more_button/styles.ts diff --git a/x-pack/plugins/session_view/public/components/process_tree_node/buttons.tsx b/x-pack/solutions/security/plugins/session_view/public/components/process_tree_node/buttons.tsx similarity index 100% rename from x-pack/plugins/session_view/public/components/process_tree_node/buttons.tsx rename to x-pack/solutions/security/plugins/session_view/public/components/process_tree_node/buttons.tsx diff --git a/x-pack/plugins/session_view/public/components/process_tree_node/index.test.tsx b/x-pack/solutions/security/plugins/session_view/public/components/process_tree_node/index.test.tsx similarity index 100% rename from x-pack/plugins/session_view/public/components/process_tree_node/index.test.tsx rename to x-pack/solutions/security/plugins/session_view/public/components/process_tree_node/index.test.tsx diff --git a/x-pack/plugins/session_view/public/components/process_tree_node/index.tsx b/x-pack/solutions/security/plugins/session_view/public/components/process_tree_node/index.tsx similarity index 100% rename from x-pack/plugins/session_view/public/components/process_tree_node/index.tsx rename to x-pack/solutions/security/plugins/session_view/public/components/process_tree_node/index.tsx diff --git a/x-pack/plugins/session_view/public/components/process_tree_node/nbsp.tsx b/x-pack/solutions/security/plugins/session_view/public/components/process_tree_node/nbsp.tsx similarity index 100% rename from x-pack/plugins/session_view/public/components/process_tree_node/nbsp.tsx rename to x-pack/solutions/security/plugins/session_view/public/components/process_tree_node/nbsp.tsx diff --git a/x-pack/plugins/session_view/public/components/process_tree_node/split_text.test.tsx b/x-pack/solutions/security/plugins/session_view/public/components/process_tree_node/split_text.test.tsx similarity index 100% rename from x-pack/plugins/session_view/public/components/process_tree_node/split_text.test.tsx rename to x-pack/solutions/security/plugins/session_view/public/components/process_tree_node/split_text.test.tsx diff --git a/x-pack/plugins/session_view/public/components/process_tree_node/split_text.tsx b/x-pack/solutions/security/plugins/session_view/public/components/process_tree_node/split_text.tsx similarity index 100% rename from x-pack/plugins/session_view/public/components/process_tree_node/split_text.tsx rename to x-pack/solutions/security/plugins/session_view/public/components/process_tree_node/split_text.tsx diff --git a/x-pack/plugins/session_view/public/components/process_tree_node/styles.ts b/x-pack/solutions/security/plugins/session_view/public/components/process_tree_node/styles.ts similarity index 100% rename from x-pack/plugins/session_view/public/components/process_tree_node/styles.ts rename to x-pack/solutions/security/plugins/session_view/public/components/process_tree_node/styles.ts diff --git a/x-pack/plugins/session_view/public/components/process_tree_node/text_highlight.test.tsx b/x-pack/solutions/security/plugins/session_view/public/components/process_tree_node/text_highlight.test.tsx similarity index 100% rename from x-pack/plugins/session_view/public/components/process_tree_node/text_highlight.test.tsx rename to x-pack/solutions/security/plugins/session_view/public/components/process_tree_node/text_highlight.test.tsx diff --git a/x-pack/plugins/session_view/public/components/process_tree_node/text_highlight.tsx b/x-pack/solutions/security/plugins/session_view/public/components/process_tree_node/text_highlight.tsx similarity index 100% rename from x-pack/plugins/session_view/public/components/process_tree_node/text_highlight.tsx rename to x-pack/solutions/security/plugins/session_view/public/components/process_tree_node/text_highlight.tsx diff --git a/x-pack/plugins/session_view/public/components/process_tree_node/use_button_styles.ts b/x-pack/solutions/security/plugins/session_view/public/components/process_tree_node/use_button_styles.ts similarity index 100% rename from x-pack/plugins/session_view/public/components/process_tree_node/use_button_styles.ts rename to x-pack/solutions/security/plugins/session_view/public/components/process_tree_node/use_button_styles.ts diff --git a/x-pack/plugins/session_view/public/components/session_view/hooks.ts b/x-pack/solutions/security/plugins/session_view/public/components/session_view/hooks.ts similarity index 100% rename from x-pack/plugins/session_view/public/components/session_view/hooks.ts rename to x-pack/solutions/security/plugins/session_view/public/components/session_view/hooks.ts diff --git a/x-pack/plugins/session_view/public/components/session_view/index.test.tsx b/x-pack/solutions/security/plugins/session_view/public/components/session_view/index.test.tsx similarity index 100% rename from x-pack/plugins/session_view/public/components/session_view/index.test.tsx rename to x-pack/solutions/security/plugins/session_view/public/components/session_view/index.test.tsx diff --git a/x-pack/plugins/session_view/public/components/session_view/index.tsx b/x-pack/solutions/security/plugins/session_view/public/components/session_view/index.tsx similarity index 100% rename from x-pack/plugins/session_view/public/components/session_view/index.tsx rename to x-pack/solutions/security/plugins/session_view/public/components/session_view/index.tsx diff --git a/x-pack/plugins/session_view/public/components/session_view/styles.ts b/x-pack/solutions/security/plugins/session_view/public/components/session_view/styles.ts similarity index 100% rename from x-pack/plugins/session_view/public/components/session_view/styles.ts rename to x-pack/solutions/security/plugins/session_view/public/components/session_view/styles.ts diff --git a/x-pack/plugins/session_view/public/components/session_view/translations.ts b/x-pack/solutions/security/plugins/session_view/public/components/session_view/translations.ts similarity index 100% rename from x-pack/plugins/session_view/public/components/session_view/translations.ts rename to x-pack/solutions/security/plugins/session_view/public/components/session_view/translations.ts diff --git a/x-pack/plugins/session_view/public/components/session_view_detail_panel/helpers.test.ts b/x-pack/solutions/security/plugins/session_view/public/components/session_view_detail_panel/helpers.test.ts similarity index 100% rename from x-pack/plugins/session_view/public/components/session_view_detail_panel/helpers.test.ts rename to x-pack/solutions/security/plugins/session_view/public/components/session_view_detail_panel/helpers.test.ts diff --git a/x-pack/plugins/session_view/public/components/session_view_detail_panel/helpers.ts b/x-pack/solutions/security/plugins/session_view/public/components/session_view_detail_panel/helpers.ts similarity index 100% rename from x-pack/plugins/session_view/public/components/session_view_detail_panel/helpers.ts rename to x-pack/solutions/security/plugins/session_view/public/components/session_view_detail_panel/helpers.ts diff --git a/x-pack/plugins/session_view/public/components/session_view_detail_panel/index.test.tsx b/x-pack/solutions/security/plugins/session_view/public/components/session_view_detail_panel/index.test.tsx similarity index 100% rename from x-pack/plugins/session_view/public/components/session_view_detail_panel/index.test.tsx rename to x-pack/solutions/security/plugins/session_view/public/components/session_view_detail_panel/index.test.tsx diff --git a/x-pack/plugins/session_view/public/components/session_view_detail_panel/index.tsx b/x-pack/solutions/security/plugins/session_view/public/components/session_view_detail_panel/index.tsx similarity index 100% rename from x-pack/plugins/session_view/public/components/session_view_detail_panel/index.tsx rename to x-pack/solutions/security/plugins/session_view/public/components/session_view_detail_panel/index.tsx diff --git a/x-pack/plugins/session_view/public/components/session_view_detail_panel/styles.ts b/x-pack/solutions/security/plugins/session_view/public/components/session_view_detail_panel/styles.ts similarity index 100% rename from x-pack/plugins/session_view/public/components/session_view_detail_panel/styles.ts rename to x-pack/solutions/security/plugins/session_view/public/components/session_view_detail_panel/styles.ts diff --git a/x-pack/plugins/session_view/public/components/session_view_display_options/index.tsx b/x-pack/solutions/security/plugins/session_view/public/components/session_view_display_options/index.tsx similarity index 100% rename from x-pack/plugins/session_view/public/components/session_view_display_options/index.tsx rename to x-pack/solutions/security/plugins/session_view/public/components/session_view_display_options/index.tsx diff --git a/x-pack/plugins/session_view/public/components/session_view_display_options/styles.ts b/x-pack/solutions/security/plugins/session_view/public/components/session_view_display_options/styles.ts similarity index 100% rename from x-pack/plugins/session_view/public/components/session_view_display_options/styles.ts rename to x-pack/solutions/security/plugins/session_view/public/components/session_view_display_options/styles.ts diff --git a/x-pack/plugins/session_view/public/components/session_view_search_bar/index.test.tsx b/x-pack/solutions/security/plugins/session_view/public/components/session_view_search_bar/index.test.tsx similarity index 100% rename from x-pack/plugins/session_view/public/components/session_view_search_bar/index.test.tsx rename to x-pack/solutions/security/plugins/session_view/public/components/session_view_search_bar/index.test.tsx diff --git a/x-pack/plugins/session_view/public/components/session_view_search_bar/index.tsx b/x-pack/solutions/security/plugins/session_view/public/components/session_view_search_bar/index.tsx similarity index 100% rename from x-pack/plugins/session_view/public/components/session_view_search_bar/index.tsx rename to x-pack/solutions/security/plugins/session_view/public/components/session_view_search_bar/index.tsx diff --git a/x-pack/plugins/session_view/public/components/session_view_search_bar/styles.ts b/x-pack/solutions/security/plugins/session_view/public/components/session_view_search_bar/styles.ts similarity index 100% rename from x-pack/plugins/session_view/public/components/session_view_search_bar/styles.ts rename to x-pack/solutions/security/plugins/session_view/public/components/session_view_search_bar/styles.ts diff --git a/x-pack/plugins/session_view/public/components/tty_player/ansi_helpers.ts b/x-pack/solutions/security/plugins/session_view/public/components/tty_player/ansi_helpers.ts similarity index 100% rename from x-pack/plugins/session_view/public/components/tty_player/ansi_helpers.ts rename to x-pack/solutions/security/plugins/session_view/public/components/tty_player/ansi_helpers.ts diff --git a/x-pack/plugins/session_view/public/components/tty_player/hooks.test.tsx b/x-pack/solutions/security/plugins/session_view/public/components/tty_player/hooks.test.tsx similarity index 100% rename from x-pack/plugins/session_view/public/components/tty_player/hooks.test.tsx rename to x-pack/solutions/security/plugins/session_view/public/components/tty_player/hooks.test.tsx diff --git a/x-pack/plugins/session_view/public/components/tty_player/hooks.ts b/x-pack/solutions/security/plugins/session_view/public/components/tty_player/hooks.ts similarity index 100% rename from x-pack/plugins/session_view/public/components/tty_player/hooks.ts rename to x-pack/solutions/security/plugins/session_view/public/components/tty_player/hooks.ts diff --git a/x-pack/plugins/session_view/public/components/tty_player/index.test.tsx b/x-pack/solutions/security/plugins/session_view/public/components/tty_player/index.test.tsx similarity index 100% rename from x-pack/plugins/session_view/public/components/tty_player/index.test.tsx rename to x-pack/solutions/security/plugins/session_view/public/components/tty_player/index.test.tsx diff --git a/x-pack/plugins/session_view/public/components/tty_player/index.tsx b/x-pack/solutions/security/plugins/session_view/public/components/tty_player/index.tsx similarity index 100% rename from x-pack/plugins/session_view/public/components/tty_player/index.tsx rename to x-pack/solutions/security/plugins/session_view/public/components/tty_player/index.tsx diff --git a/x-pack/plugins/session_view/public/components/tty_player/styles.ts b/x-pack/solutions/security/plugins/session_view/public/components/tty_player/styles.ts similarity index 100% rename from x-pack/plugins/session_view/public/components/tty_player/styles.ts rename to x-pack/solutions/security/plugins/session_view/public/components/tty_player/styles.ts diff --git a/x-pack/plugins/session_view/public/components/tty_player/translations.ts b/x-pack/solutions/security/plugins/session_view/public/components/tty_player/translations.ts similarity index 100% rename from x-pack/plugins/session_view/public/components/tty_player/translations.ts rename to x-pack/solutions/security/plugins/session_view/public/components/tty_player/translations.ts diff --git a/x-pack/plugins/session_view/public/components/tty_player/xterm_search.ts b/x-pack/solutions/security/plugins/session_view/public/components/tty_player/xterm_search.ts similarity index 100% rename from x-pack/plugins/session_view/public/components/tty_player/xterm_search.ts rename to x-pack/solutions/security/plugins/session_view/public/components/tty_player/xterm_search.ts diff --git a/x-pack/plugins/session_view/public/components/tty_player_controls/index.test.tsx b/x-pack/solutions/security/plugins/session_view/public/components/tty_player_controls/index.test.tsx similarity index 100% rename from x-pack/plugins/session_view/public/components/tty_player_controls/index.test.tsx rename to x-pack/solutions/security/plugins/session_view/public/components/tty_player_controls/index.test.tsx diff --git a/x-pack/plugins/session_view/public/components/tty_player_controls/index.tsx b/x-pack/solutions/security/plugins/session_view/public/components/tty_player_controls/index.tsx similarity index 100% rename from x-pack/plugins/session_view/public/components/tty_player_controls/index.tsx rename to x-pack/solutions/security/plugins/session_view/public/components/tty_player_controls/index.tsx diff --git a/x-pack/plugins/session_view/public/components/tty_player_controls/styles.ts b/x-pack/solutions/security/plugins/session_view/public/components/tty_player_controls/styles.ts similarity index 100% rename from x-pack/plugins/session_view/public/components/tty_player_controls/styles.ts rename to x-pack/solutions/security/plugins/session_view/public/components/tty_player_controls/styles.ts diff --git a/x-pack/plugins/session_view/public/components/tty_player_controls/translations.ts b/x-pack/solutions/security/plugins/session_view/public/components/tty_player_controls/translations.ts similarity index 100% rename from x-pack/plugins/session_view/public/components/tty_player_controls/translations.ts rename to x-pack/solutions/security/plugins/session_view/public/components/tty_player_controls/translations.ts diff --git a/x-pack/plugins/session_view/public/components/tty_player_controls/tty_player_controls_markers/index.tsx b/x-pack/solutions/security/plugins/session_view/public/components/tty_player_controls/tty_player_controls_markers/index.tsx similarity index 100% rename from x-pack/plugins/session_view/public/components/tty_player_controls/tty_player_controls_markers/index.tsx rename to x-pack/solutions/security/plugins/session_view/public/components/tty_player_controls/tty_player_controls_markers/index.tsx diff --git a/x-pack/plugins/session_view/public/components/tty_player_controls/tty_player_controls_markers/play_head.tsx b/x-pack/solutions/security/plugins/session_view/public/components/tty_player_controls/tty_player_controls_markers/play_head.tsx similarity index 100% rename from x-pack/plugins/session_view/public/components/tty_player_controls/tty_player_controls_markers/play_head.tsx rename to x-pack/solutions/security/plugins/session_view/public/components/tty_player_controls/tty_player_controls_markers/play_head.tsx diff --git a/x-pack/plugins/session_view/public/components/tty_player_controls/tty_player_controls_markers/styles.ts b/x-pack/solutions/security/plugins/session_view/public/components/tty_player_controls/tty_player_controls_markers/styles.ts similarity index 100% rename from x-pack/plugins/session_view/public/components/tty_player_controls/tty_player_controls_markers/styles.ts rename to x-pack/solutions/security/plugins/session_view/public/components/tty_player_controls/tty_player_controls_markers/styles.ts diff --git a/x-pack/plugins/session_view/public/components/tty_search_bar/index.test.tsx b/x-pack/solutions/security/plugins/session_view/public/components/tty_search_bar/index.test.tsx similarity index 100% rename from x-pack/plugins/session_view/public/components/tty_search_bar/index.test.tsx rename to x-pack/solutions/security/plugins/session_view/public/components/tty_search_bar/index.test.tsx diff --git a/x-pack/plugins/session_view/public/components/tty_search_bar/index.tsx b/x-pack/solutions/security/plugins/session_view/public/components/tty_search_bar/index.tsx similarity index 100% rename from x-pack/plugins/session_view/public/components/tty_search_bar/index.tsx rename to x-pack/solutions/security/plugins/session_view/public/components/tty_search_bar/index.tsx diff --git a/x-pack/plugins/session_view/public/components/tty_text_sizer/index.test.tsx b/x-pack/solutions/security/plugins/session_view/public/components/tty_text_sizer/index.test.tsx similarity index 100% rename from x-pack/plugins/session_view/public/components/tty_text_sizer/index.test.tsx rename to x-pack/solutions/security/plugins/session_view/public/components/tty_text_sizer/index.test.tsx diff --git a/x-pack/plugins/session_view/public/components/tty_text_sizer/index.tsx b/x-pack/solutions/security/plugins/session_view/public/components/tty_text_sizer/index.tsx similarity index 100% rename from x-pack/plugins/session_view/public/components/tty_text_sizer/index.tsx rename to x-pack/solutions/security/plugins/session_view/public/components/tty_text_sizer/index.tsx diff --git a/x-pack/plugins/session_view/public/components/tty_text_sizer/styles.ts b/x-pack/solutions/security/plugins/session_view/public/components/tty_text_sizer/styles.ts similarity index 100% rename from x-pack/plugins/session_view/public/components/tty_text_sizer/styles.ts rename to x-pack/solutions/security/plugins/session_view/public/components/tty_text_sizer/styles.ts diff --git a/x-pack/plugins/session_view/public/components/tty_text_sizer/translations.ts b/x-pack/solutions/security/plugins/session_view/public/components/tty_text_sizer/translations.ts similarity index 100% rename from x-pack/plugins/session_view/public/components/tty_text_sizer/translations.ts rename to x-pack/solutions/security/plugins/session_view/public/components/tty_text_sizer/translations.ts diff --git a/x-pack/plugins/session_view/public/constants.ts b/x-pack/solutions/security/plugins/session_view/public/constants.ts similarity index 100% rename from x-pack/plugins/session_view/public/constants.ts rename to x-pack/solutions/security/plugins/session_view/public/constants.ts diff --git a/x-pack/plugins/session_view/public/hooks/index.ts b/x-pack/solutions/security/plugins/session_view/public/hooks/index.ts similarity index 100% rename from x-pack/plugins/session_view/public/hooks/index.ts rename to x-pack/solutions/security/plugins/session_view/public/hooks/index.ts diff --git a/x-pack/plugins/session_view/public/hooks/use_date_format.ts b/x-pack/solutions/security/plugins/session_view/public/hooks/use_date_format.ts similarity index 100% rename from x-pack/plugins/session_view/public/hooks/use_date_format.ts rename to x-pack/solutions/security/plugins/session_view/public/hooks/use_date_format.ts diff --git a/x-pack/plugins/session_view/public/hooks/use_eui_theme.ts b/x-pack/solutions/security/plugins/session_view/public/hooks/use_eui_theme.ts similarity index 100% rename from x-pack/plugins/session_view/public/hooks/use_eui_theme.ts rename to x-pack/solutions/security/plugins/session_view/public/hooks/use_eui_theme.ts diff --git a/x-pack/plugins/session_view/public/hooks/use_scroll.ts b/x-pack/solutions/security/plugins/session_view/public/hooks/use_scroll.ts similarity index 100% rename from x-pack/plugins/session_view/public/hooks/use_scroll.ts rename to x-pack/solutions/security/plugins/session_view/public/hooks/use_scroll.ts diff --git a/x-pack/plugins/session_view/public/hooks/use_visible.ts b/x-pack/solutions/security/plugins/session_view/public/hooks/use_visible.ts similarity index 100% rename from x-pack/plugins/session_view/public/hooks/use_visible.ts rename to x-pack/solutions/security/plugins/session_view/public/hooks/use_visible.ts diff --git a/x-pack/plugins/session_view/public/index.ts b/x-pack/solutions/security/plugins/session_view/public/index.ts similarity index 100% rename from x-pack/plugins/session_view/public/index.ts rename to x-pack/solutions/security/plugins/session_view/public/index.ts diff --git a/x-pack/plugins/session_view/public/methods/index.test.tsx b/x-pack/solutions/security/plugins/session_view/public/methods/index.test.tsx similarity index 100% rename from x-pack/plugins/session_view/public/methods/index.test.tsx rename to x-pack/solutions/security/plugins/session_view/public/methods/index.test.tsx diff --git a/x-pack/plugins/session_view/public/methods/index.tsx b/x-pack/solutions/security/plugins/session_view/public/methods/index.tsx similarity index 100% rename from x-pack/plugins/session_view/public/methods/index.tsx rename to x-pack/solutions/security/plugins/session_view/public/methods/index.tsx diff --git a/x-pack/plugins/session_view/public/plugin.ts b/x-pack/solutions/security/plugins/session_view/public/plugin.ts similarity index 100% rename from x-pack/plugins/session_view/public/plugin.ts rename to x-pack/solutions/security/plugins/session_view/public/plugin.ts diff --git a/x-pack/plugins/session_view/public/shared_imports.ts b/x-pack/solutions/security/plugins/session_view/public/shared_imports.ts similarity index 100% rename from x-pack/plugins/session_view/public/shared_imports.ts rename to x-pack/solutions/security/plugins/session_view/public/shared_imports.ts diff --git a/x-pack/plugins/session_view/public/test/index.tsx b/x-pack/solutions/security/plugins/session_view/public/test/index.tsx similarity index 100% rename from x-pack/plugins/session_view/public/test/index.tsx rename to x-pack/solutions/security/plugins/session_view/public/test/index.tsx diff --git a/x-pack/plugins/session_view/public/types.ts b/x-pack/solutions/security/plugins/session_view/public/types.ts similarity index 100% rename from x-pack/plugins/session_view/public/types.ts rename to x-pack/solutions/security/plugins/session_view/public/types.ts diff --git a/x-pack/plugins/session_view/public/utils/alert_category_display_test.test.ts b/x-pack/solutions/security/plugins/session_view/public/utils/alert_category_display_test.test.ts similarity index 100% rename from x-pack/plugins/session_view/public/utils/alert_category_display_test.test.ts rename to x-pack/solutions/security/plugins/session_view/public/utils/alert_category_display_test.test.ts diff --git a/x-pack/plugins/session_view/public/utils/alert_category_display_text.ts b/x-pack/solutions/security/plugins/session_view/public/utils/alert_category_display_text.ts similarity index 100% rename from x-pack/plugins/session_view/public/utils/alert_category_display_text.ts rename to x-pack/solutions/security/plugins/session_view/public/utils/alert_category_display_text.ts diff --git a/x-pack/plugins/session_view/public/utils/data_or_dash.test.ts b/x-pack/solutions/security/plugins/session_view/public/utils/data_or_dash.test.ts similarity index 100% rename from x-pack/plugins/session_view/public/utils/data_or_dash.test.ts rename to x-pack/solutions/security/plugins/session_view/public/utils/data_or_dash.test.ts diff --git a/x-pack/plugins/session_view/public/utils/data_or_dash.ts b/x-pack/solutions/security/plugins/session_view/public/utils/data_or_dash.ts similarity index 100% rename from x-pack/plugins/session_view/public/utils/data_or_dash.ts rename to x-pack/solutions/security/plugins/session_view/public/utils/data_or_dash.ts diff --git a/x-pack/plugins/session_view/server/index.ts b/x-pack/solutions/security/plugins/session_view/server/index.ts similarity index 100% rename from x-pack/plugins/session_view/server/index.ts rename to x-pack/solutions/security/plugins/session_view/server/index.ts diff --git a/x-pack/plugins/session_view/server/plugin.ts b/x-pack/solutions/security/plugins/session_view/server/plugin.ts similarity index 100% rename from x-pack/plugins/session_view/server/plugin.ts rename to x-pack/solutions/security/plugins/session_view/server/plugin.ts diff --git a/x-pack/plugins/session_view/server/routes/alert_status_route.test.ts b/x-pack/solutions/security/plugins/session_view/server/routes/alert_status_route.test.ts similarity index 100% rename from x-pack/plugins/session_view/server/routes/alert_status_route.test.ts rename to x-pack/solutions/security/plugins/session_view/server/routes/alert_status_route.test.ts diff --git a/x-pack/plugins/session_view/server/routes/alert_status_route.ts b/x-pack/solutions/security/plugins/session_view/server/routes/alert_status_route.ts similarity index 100% rename from x-pack/plugins/session_view/server/routes/alert_status_route.ts rename to x-pack/solutions/security/plugins/session_view/server/routes/alert_status_route.ts diff --git a/x-pack/plugins/session_view/server/routes/alerts_client_mock.test.ts b/x-pack/solutions/security/plugins/session_view/server/routes/alerts_client_mock.test.ts similarity index 100% rename from x-pack/plugins/session_view/server/routes/alerts_client_mock.test.ts rename to x-pack/solutions/security/plugins/session_view/server/routes/alerts_client_mock.test.ts diff --git a/x-pack/plugins/session_view/server/routes/alerts_route.test.ts b/x-pack/solutions/security/plugins/session_view/server/routes/alerts_route.test.ts similarity index 100% rename from x-pack/plugins/session_view/server/routes/alerts_route.test.ts rename to x-pack/solutions/security/plugins/session_view/server/routes/alerts_route.test.ts diff --git a/x-pack/plugins/session_view/server/routes/alerts_route.ts b/x-pack/solutions/security/plugins/session_view/server/routes/alerts_route.ts similarity index 100% rename from x-pack/plugins/session_view/server/routes/alerts_route.ts rename to x-pack/solutions/security/plugins/session_view/server/routes/alerts_route.ts diff --git a/x-pack/plugins/session_view/server/routes/get_total_io_bytes_route.ts b/x-pack/solutions/security/plugins/session_view/server/routes/get_total_io_bytes_route.ts similarity index 100% rename from x-pack/plugins/session_view/server/routes/get_total_io_bytes_route.ts rename to x-pack/solutions/security/plugins/session_view/server/routes/get_total_io_bytes_route.ts diff --git a/x-pack/plugins/session_view/server/routes/index.ts b/x-pack/solutions/security/plugins/session_view/server/routes/index.ts similarity index 100% rename from x-pack/plugins/session_view/server/routes/index.ts rename to x-pack/solutions/security/plugins/session_view/server/routes/index.ts diff --git a/x-pack/plugins/session_view/server/routes/io_events_route.test.ts b/x-pack/solutions/security/plugins/session_view/server/routes/io_events_route.test.ts similarity index 100% rename from x-pack/plugins/session_view/server/routes/io_events_route.test.ts rename to x-pack/solutions/security/plugins/session_view/server/routes/io_events_route.test.ts diff --git a/x-pack/plugins/session_view/server/routes/io_events_route.ts b/x-pack/solutions/security/plugins/session_view/server/routes/io_events_route.ts similarity index 100% rename from x-pack/plugins/session_view/server/routes/io_events_route.ts rename to x-pack/solutions/security/plugins/session_view/server/routes/io_events_route.ts diff --git a/x-pack/plugins/session_view/server/routes/process_events_route.test.ts b/x-pack/solutions/security/plugins/session_view/server/routes/process_events_route.test.ts similarity index 100% rename from x-pack/plugins/session_view/server/routes/process_events_route.test.ts rename to x-pack/solutions/security/plugins/session_view/server/routes/process_events_route.test.ts diff --git a/x-pack/plugins/session_view/server/routes/process_events_route.ts b/x-pack/solutions/security/plugins/session_view/server/routes/process_events_route.ts similarity index 100% rename from x-pack/plugins/session_view/server/routes/process_events_route.ts rename to x-pack/solutions/security/plugins/session_view/server/routes/process_events_route.ts diff --git a/x-pack/plugins/session_view/server/types.ts b/x-pack/solutions/security/plugins/session_view/server/types.ts similarity index 100% rename from x-pack/plugins/session_view/server/types.ts rename to x-pack/solutions/security/plugins/session_view/server/types.ts diff --git a/x-pack/plugins/session_view/tsconfig.json b/x-pack/solutions/security/plugins/session_view/tsconfig.json similarity index 92% rename from x-pack/plugins/session_view/tsconfig.json rename to x-pack/solutions/security/plugins/session_view/tsconfig.json index 412de8355943c..80cbd97282268 100644 --- a/x-pack/plugins/session_view/tsconfig.json +++ b/x-pack/solutions/security/plugins/session_view/tsconfig.json @@ -1,5 +1,5 @@ { - "extends": "../../../tsconfig.base.json", + "extends": "../../../../../tsconfig.base.json", "compilerOptions": { "outDir": "target/types", }, @@ -12,7 +12,7 @@ "scripts/**/*", "package.json", "storybook/**/*", - "../../../typings/**/*" + "../../../../../typings/**/*" ], "kbn_references": [ "@kbn/core", diff --git a/yarn.lock b/yarn.lock index 7e4b0bb56e5ab..0429712b792c4 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3999,7 +3999,7 @@ version "0.0.0" uid "" -"@kbn/asset-inventory-plugin@link:x-pack/plugins/asset_inventory": +"@kbn/asset-inventory-plugin@link:x-pack/solutions/security/plugins/asset_inventory": version "0.0.0" uid "" @@ -4131,7 +4131,7 @@ version "0.0.0" uid "" -"@kbn/cloud-defend-plugin@link:x-pack/plugins/cloud_defend": +"@kbn/cloud-defend-plugin@link:x-pack/solutions/security/plugins/cloud_defend": version "0.0.0" uid "" @@ -4155,19 +4155,19 @@ version "0.0.0" uid "" -"@kbn/cloud-security-posture-common@link:x-pack/packages/kbn-cloud-security-posture/common": +"@kbn/cloud-security-posture-common@link:x-pack/platform/packages/shared/kbn-cloud-security-posture/common": version "0.0.0" uid "" -"@kbn/cloud-security-posture-graph@link:x-pack/packages/kbn-cloud-security-posture/graph": +"@kbn/cloud-security-posture-graph@link:x-pack/solutions/security/packages/kbn-cloud-security-posture/graph": version "0.0.0" uid "" -"@kbn/cloud-security-posture-plugin@link:x-pack/plugins/cloud_security_posture": +"@kbn/cloud-security-posture-plugin@link:x-pack/solutions/security/plugins/cloud_security_posture": version "0.0.0" uid "" -"@kbn/cloud-security-posture@link:x-pack/packages/kbn-cloud-security-posture/public": +"@kbn/cloud-security-posture@link:x-pack/solutions/security/packages/kbn-cloud-security-posture/public": version "0.0.0" uid "" @@ -6059,7 +6059,7 @@ version "0.0.0" uid "" -"@kbn/kubernetes-security-plugin@link:x-pack/plugins/kubernetes_security": +"@kbn/kubernetes-security-plugin@link:x-pack/solutions/security/plugins/kubernetes_security": version "0.0.0" uid "" @@ -7235,7 +7235,7 @@ version "0.0.0" uid "" -"@kbn/session-view-plugin@link:x-pack/plugins/session_view": +"@kbn/session-view-plugin@link:x-pack/solutions/security/plugins/session_view": version "0.0.0" uid "" From f5353253781131689ec031e5a5a9cea18c04f5d5 Mon Sep 17 00:00:00 2001 From: "Eyo O. Eyo" <7893459+eokoneyo@users.noreply.github.com> Date: Wed, 18 Dec 2024 08:18:14 +0000 Subject: [PATCH 23/23] [8.x] ES Lint rules for css-in-js declarations within Kibana (#200703) (#204620) # Backport This will backport the following commits from `main` to `8.x`: - [ES Lint rules for css-in-js declarations within Kibana (#200703)](https://github.com/elastic/kibana/pull/200703) ### Questions ? Please refer to the [Backport tool documentation](https://github.com/sqren/backport) \r\n\r\n---------\r\n\r\nCo-authored-by: kibanamachine <42973632+kibanamachine@users.noreply.github.com>\r\nCo-authored-by: Elastic Machine ","sha":"7370cc712ee2bf23f4cf53eef2e74942340f761c","branchLabelMapping":{"^v9.0.0$":"main","^v8.18.0$":"8.x","^v(\\d+).(\\d+).\\d+$":"$1.$2"}},"sourcePullRequest":{"labels":["release_note:skip","backport missing","v9.0.0","Team:SharedUX","backport:prev-minor"],"number":200703,"url":"https://github.com/elastic/kibana/pull/200703","mergeCommit":{"message":"ES Lint rules for css-in-js declarations within Kibana (#200703)\n\n## Summary\r\n\r\nCloses https://github.com/elastic/kibana-team/issues/1272\r\n\r\nThis PR adds implementation for eslint rules to help facilitate the\r\nmigration away from SASS files to leveraging the design tokens EUI\r\nprovides for styling.\r\n\r\nThe introduced rules in this PR are as follows;\r\n\r\n- #### No CSS Color values\r\n Consider; \r\n\r\n ```tsx\r\n Hello World!\r\n ```\r\n\r\nthis expression because it specifies the css color property, with a\r\nvalid [CSS color\r\nvalue](https://developer.mozilla.org/en-US/docs/Web/CSS/color_value),\r\nwhen the aforementioned rule is enabled depending on the set report\r\nlevel set the user would get a feedback, see screenshot below;\r\n\r\n\r\n\"Screenshot\r\n\r\nThis rule also works for variables defined elsewhere in the code and\r\nreferenced as a value to the style prop, see screenshot below;\r\n\r\n\"Screenshot\r\n\r\nfeedback will also be provided when some variable that is a literal\r\nvalue is specified as a value for any earmarked property that should not\r\nspecify literal values.\r\n\r\n\"Screenshot\r\n\r\nfeedback will be provided for referencing a member prop of some object\r\ndefined elsewhere as a value to any earmarked property that we have\r\ndeemed to not specify literal values\r\n\r\n\"Screenshot\r\n\r\n\tSupports;\r\n\t- object values\r\n\t- object references\r\n\t- template literals\r\n\t- tagged templates \r\n\r\nThis approach does not penalize variable declarations, only the usages\r\nof any said variable when it doesn't conform to expectation\r\n\r\n- #### Prefer CSS attributes for EUI components (optional)\r\n Consider; \r\n\r\n ```tsx\r\nHello\r\nWorld!\r\n ```\r\nA declaration like the one above, will be regarded as an error and can\r\nbe fixed, when it's fixed it will be re-written as\r\n \r\n ```tsx\r\nHello\r\nWorld!\r\n ```\r\n\r\n\t\r\n\r\n\r\n---------\r\n\r\nCo-authored-by: kibanamachine <42973632+kibanamachine@users.noreply.github.com>\r\nCo-authored-by: Elastic Machine ","sha":"7370cc712ee2bf23f4cf53eef2e74942340f761c"}},"sourceBranch":"main","suggestedTargetBranches":[],"targetPullRequestStates":[{"branch":"main","label":"v9.0.0","labelRegex":"^v9.0.0$","isSourceBranch":true,"state":"MERGED","url":"https://github.com/elastic/kibana/pull/200703","number":200703,"mergeCommit":{"message":"ES Lint rules for css-in-js declarations within Kibana (#200703)\n\n## Summary\r\n\r\nCloses https://github.com/elastic/kibana-team/issues/1272\r\n\r\nThis PR adds implementation for eslint rules to help facilitate the\r\nmigration away from SASS files to leveraging the design tokens EUI\r\nprovides for styling.\r\n\r\nThe introduced rules in this PR are as follows;\r\n\r\n- #### No CSS Color values\r\n Consider; \r\n\r\n ```tsx\r\n Hello World!\r\n ```\r\n\r\nthis expression because it specifies the css color property, with a\r\nvalid [CSS color\r\nvalue](https://developer.mozilla.org/en-US/docs/Web/CSS/color_value),\r\nwhen the aforementioned rule is enabled depending on the set report\r\nlevel set the user would get a feedback, see screenshot below;\r\n\r\n\r\n\"Screenshot\r\n\r\nThis rule also works for variables defined elsewhere in the code and\r\nreferenced as a value to the style prop, see screenshot below;\r\n\r\n\"Screenshot\r\n\r\nfeedback will also be provided when some variable that is a literal\r\nvalue is specified as a value for any earmarked property that should not\r\nspecify literal values.\r\n\r\n\"Screenshot\r\n\r\nfeedback will be provided for referencing a member prop of some object\r\ndefined elsewhere as a value to any earmarked property that we have\r\ndeemed to not specify literal values\r\n\r\n\"Screenshot\r\n\r\n\tSupports;\r\n\t- object values\r\n\t- object references\r\n\t- template literals\r\n\t- tagged templates \r\n\r\nThis approach does not penalize variable declarations, only the usages\r\nof any said variable when it doesn't conform to expectation\r\n\r\n- #### Prefer CSS attributes for EUI components (optional)\r\n Consider; \r\n\r\n ```tsx\r\nHello\r\nWorld!\r\n ```\r\nA declaration like the one above, will be regarded as an error and can\r\nbe fixed, when it's fixed it will be re-written as\r\n \r\n ```tsx\r\nHello\r\nWorld!\r\n ```\r\n\r\n\t\r\n\r\n\r\n---------\r\n\r\nCo-authored-by: kibanamachine <42973632+kibanamachine@users.noreply.github.com>\r\nCo-authored-by: Elastic Machine ","sha":"7370cc712ee2bf23f4cf53eef2e74942340f761c"}}]}] BACKPORT--> --- .eslintrc.js | 1 - .github/CODEOWNERS | 1 + package.json | 3 + packages/kbn-eslint-config/.eslintrc.js | 2 + packages/kbn-eslint-plugin-css/README.mdx | 129 +++++ packages/kbn-eslint-plugin-css/index.ts | 20 + packages/kbn-eslint-plugin-css/jest.config.js | 14 + packages/kbn-eslint-plugin-css/kibana.jsonc | 6 + packages/kbn-eslint-plugin-css/package.json | 6 + .../src/rules/no_css_color.test.ts | 249 ++++++++++ .../src/rules/no_css_color.ts | 453 ++++++++++++++++++ ...r_css_attribute_for_eui_components.test.ts | 85 ++++ ...prefer_css_attribute_for_eui_components.ts | 62 +++ packages/kbn-eslint-plugin-css/tsconfig.json | 11 + tsconfig.base.json | 6 +- yarn.lock | 21 + 16 files changed, 1065 insertions(+), 4 deletions(-) create mode 100644 packages/kbn-eslint-plugin-css/README.mdx create mode 100644 packages/kbn-eslint-plugin-css/index.ts create mode 100644 packages/kbn-eslint-plugin-css/jest.config.js create mode 100644 packages/kbn-eslint-plugin-css/kibana.jsonc create mode 100644 packages/kbn-eslint-plugin-css/package.json create mode 100644 packages/kbn-eslint-plugin-css/src/rules/no_css_color.test.ts create mode 100644 packages/kbn-eslint-plugin-css/src/rules/no_css_color.ts create mode 100644 packages/kbn-eslint-plugin-css/src/rules/prefer_css_attribute_for_eui_components.test.ts create mode 100644 packages/kbn-eslint-plugin-css/src/rules/prefer_css_attribute_for_eui_components.ts create mode 100644 packages/kbn-eslint-plugin-css/tsconfig.json diff --git a/.eslintrc.js b/.eslintrc.js index fafce927f8289..9f8569cad19ed 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -764,7 +764,6 @@ module.exports = { ], }, }, - /** * Jest specific rules */ diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index 0238579321866..853b3de2d26c5 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -426,6 +426,7 @@ packages/kbn-es-query @elastic/kibana-data-discovery packages/kbn-es-types @elastic/kibana-core @elastic/obs-knowledge-team src/platform/plugins/shared/es_ui_shared @elastic/kibana-management packages/kbn-eslint-config @elastic/kibana-operations +packages/kbn-eslint-plugin-css @elastic/appex-sharedux packages/kbn-eslint-plugin-disable @elastic/kibana-operations packages/kbn-eslint-plugin-eslint @elastic/kibana-operations packages/kbn-eslint-plugin-i18n @elastic/obs-knowledge-team @elastic/kibana-operations diff --git a/package.json b/package.json index 4b781517aee86..4c5c44259b5b4 100644 --- a/package.json +++ b/package.json @@ -1447,6 +1447,7 @@ "@kbn/es": "link:packages/kbn-es", "@kbn/es-archiver": "link:packages/kbn-es-archiver", "@kbn/eslint-config": "link:packages/kbn-eslint-config", + "@kbn/eslint-plugin-css": "link:packages/kbn-eslint-plugin-css", "@kbn/eslint-plugin-disable": "link:packages/kbn-eslint-plugin-disable", "@kbn/eslint-plugin-eslint": "link:packages/kbn-eslint-plugin-eslint", "@kbn/eslint-plugin-i18n": "link:packages/kbn-eslint-plugin-i18n", @@ -1561,6 +1562,7 @@ "@types/classnames": "^2.2.9", "@types/cli-progress": "^3.11.5", "@types/color": "^3.0.3", + "@types/cssstyle": "^2.2.4", "@types/cytoscape": "^3.14.0", "@types/d3": "^3.5.43", "@types/d3-array": "^2.12.1", @@ -1710,6 +1712,7 @@ "css-loader": "^3.4.2", "cssnano": "^5.1.12", "cssnano-preset-default": "^5.2.12", + "cssstyle": "^4.1.0", "csstype": "^3.0.2", "cypress": "13.6.3", "cypress-axe": "^1.5.0", diff --git a/packages/kbn-eslint-config/.eslintrc.js b/packages/kbn-eslint-config/.eslintrc.js index 14ede0f4db45f..1814f3f47fec0 100644 --- a/packages/kbn-eslint-config/.eslintrc.js +++ b/packages/kbn-eslint-config/.eslintrc.js @@ -28,6 +28,7 @@ module.exports = { '@kbn/eslint-plugin-imports', '@kbn/eslint-plugin-telemetry', '@kbn/eslint-plugin-i18n', + '@kbn/eslint-plugin-css', 'eslint-plugin-depend', 'prettier', ], @@ -328,6 +329,7 @@ module.exports = { '@kbn/imports/no_boundary_crossing': 'error', '@kbn/imports/no_group_crossing_manifests': 'error', '@kbn/imports/no_group_crossing_imports': 'error', + '@kbn/css/no_css_color': 'warn', 'no-new-func': 'error', 'no-implied-eval': 'error', 'no-prototype-builtins': 'error', diff --git a/packages/kbn-eslint-plugin-css/README.mdx b/packages/kbn-eslint-plugin-css/README.mdx new file mode 100644 index 0000000000000..1e121657bc571 --- /dev/null +++ b/packages/kbn-eslint-plugin-css/README.mdx @@ -0,0 +1,129 @@ +--- +id: kibSharedUXEslintPluginCSS +slug: /kibana-dev-docs/shared-ux/packages/kbn-eslint-plugin-css +title: '@kbn/eslint-plugin-design-tokens' +description: Custom ESLint rules to guardrails for using eui in the Kibana repository +date: 2024-11-19 +tags: ['kibana', 'dev', 'contributor', 'shared_ux', 'eslint', 'eui'] +--- + +# Summary + +`@kbn/eslint-plugin-css` is an ESLint plugin providing custom ESLint rules to help setup guardrails for using eui in the Kibana repo especially around styling. + +The aim of this package is to help engineers to modify EUI components in a much complaint way. + +If a rule does not behave as you expect or you have an idea of how these rules can be improved, please reach out to the Shared UX team. + +# Rules + +## `@kbn/css/no_css_color` + +This rule warns engineers to not use literal css color in the codebase, particularly for CSS properties that apply color to +either the html element or text nodes, but rather urge users to defer to using the color tokens provided by EUI. + +This rule kicks in on the following JSXAttributes; `style`, `className` and `css` and supports various approaches to providing styling declarations. + +### Example + +The following code: + +``` +// Filename: /x-pack/plugins/observability_solution/observability/public/my_component.tsx + +import React from 'react'; +import { EuiText } from '@elastic/eui'; + +function MyComponent() { + return ( + You know, for search + ) +} +``` + +``` +// Filename: /x-pack/plugins/observability_solution/observability/public/my_component.tsx + +import React from 'react'; +import { EuiText } from '@elastic/eui'; + +function MyComponent() { + + const style = { + color: 'red' + } + + return ( + You know, for search + ) +} +``` + +``` +// Filename: /x-pack/plugins/observability_solution/observability/public/my_component.tsx + +import React from 'react'; +import { EuiText } from '@elastic/eui'; + +function MyComponent() { + const colorValue = '#dd4040'; + + return ( + You know, for search + ) +} +``` + +will all raise an eslint report with an appropriate message of severity that matches the configuration of the rule, further more all the examples above +will also match for when the attribute in question is `css`. The `css` attribute will also raise a report the following cases below; + +``` +// Filename: /x-pack/plugins/observability_solution/observability/public/my_component.tsx + +import React from 'react'; +import { css } from '@emotion/css'; +import { EuiText } from '@elastic/eui'; + +function MyComponent() { + return ( + You know, for search + ) +} +``` + +``` +// Filename: /x-pack/plugins/observability_solution/observability/public/my_component.tsx + +import React from 'react'; +import { EuiText } from '@elastic/eui'; + +function MyComponent() { + return ( + ({ color: '#dd4040' })}>You know, for search + ) +} +``` + +A special case is also covered for the `className` attribute, where the rule will also raise a report for the following case below; + + +``` +// Filename: /x-pack/plugins/observability_solution/observability/public/my_component.tsx + +import React from 'react'; +import { css } from '@emotion/css'; +import { EuiText } from '@elastic/eui'; + +function MyComponent() { + return ( + You know, for search + ) +} +``` + +it's worth pointing out that although the examples provided are specific to EUI components, this rule applies to all JSX elements. + +## `@kbn/css/prefer_css_attributes_for_eui_components` + +This rule warns engineers to use the `css` attribute for EUI components instead of the `style` attribute. + diff --git a/packages/kbn-eslint-plugin-css/index.ts b/packages/kbn-eslint-plugin-css/index.ts new file mode 100644 index 0000000000000..9ea4bcc67619f --- /dev/null +++ b/packages/kbn-eslint-plugin-css/index.ts @@ -0,0 +1,20 @@ +/* + * 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", the "GNU Affero General Public License v3.0 only", and the "Server Side + * Public License v 1"; you may not use this file except in compliance with, at + * your election, the "Elastic License 2.0", the "GNU Affero General Public + * License v3.0 only", or the "Server Side Public License, v 1". + */ + +import { NoCssColor } from './src/rules/no_css_color'; +import { PreferCSSAttributeForEuiComponents } from './src/rules/prefer_css_attribute_for_eui_components'; + +/** + * Custom ESLint rules, included as `'@kbn/eslint-plugin-design-tokens'` in the kibana eslint config + * @internal + */ +export const rules = { + no_css_color: NoCssColor, + prefer_css_attributes_for_eui_components: PreferCSSAttributeForEuiComponents, +}; diff --git a/packages/kbn-eslint-plugin-css/jest.config.js b/packages/kbn-eslint-plugin-css/jest.config.js new file mode 100644 index 0000000000000..c8ae20237eae8 --- /dev/null +++ b/packages/kbn-eslint-plugin-css/jest.config.js @@ -0,0 +1,14 @@ +/* + * 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", the "GNU Affero General Public License v3.0 only", and the "Server Side + * Public License v 1"; you may not use this file except in compliance with, at + * your election, the "Elastic License 2.0", the "GNU Affero General Public + * License v3.0 only", or the "Server Side Public License, v 1". + */ + +module.exports = { + preset: '@kbn/test', + rootDir: '../..', + roots: ['/packages/kbn-eslint-plugin-css'], +}; diff --git a/packages/kbn-eslint-plugin-css/kibana.jsonc b/packages/kbn-eslint-plugin-css/kibana.jsonc new file mode 100644 index 0000000000000..3ee8bff8736f6 --- /dev/null +++ b/packages/kbn-eslint-plugin-css/kibana.jsonc @@ -0,0 +1,6 @@ +{ + "type": "shared-common", + "id": "@kbn/eslint-plugin-css", + "devOnly": true, + "owner": "@elastic/appex-sharedux" +} diff --git a/packages/kbn-eslint-plugin-css/package.json b/packages/kbn-eslint-plugin-css/package.json new file mode 100644 index 0000000000000..c811f06f27cb7 --- /dev/null +++ b/packages/kbn-eslint-plugin-css/package.json @@ -0,0 +1,6 @@ +{ + "name": "@kbn/eslint-plugin-css", + "version": "1.0.0", + "private": true, + "license": "Elastic License 2.0 OR AGPL-3.0-only OR SSPL-1.0" +} diff --git a/packages/kbn-eslint-plugin-css/src/rules/no_css_color.test.ts b/packages/kbn-eslint-plugin-css/src/rules/no_css_color.test.ts new file mode 100644 index 0000000000000..e1f683b09814f --- /dev/null +++ b/packages/kbn-eslint-plugin-css/src/rules/no_css_color.test.ts @@ -0,0 +1,249 @@ +/* + * 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", the "GNU Affero General Public License v3.0 only", and the "Server Side + * Public License v 1"; you may not use this file except in compliance with, at + * your election, the "Elastic License 2.0", the "GNU Affero General Public + * License v3.0 only", or the "Server Side Public License, v 1". + */ + +import { RuleTester } from 'eslint'; +import { NoCssColor } from './no_css_color'; + +const tsTester = [ + '@typescript-eslint/parser', + new RuleTester({ + parser: require.resolve('@typescript-eslint/parser'), + parserOptions: { + sourceType: 'module', + ecmaVersion: 2018, + ecmaFeatures: { + jsx: true, + }, + }, + }), +] as const; + +const babelTester = [ + '@babel/eslint-parser', + new RuleTester({ + parser: require.resolve('@babel/eslint-parser'), + parserOptions: { + sourceType: 'module', + ecmaVersion: 2018, + requireConfigFile: false, + babelOptions: { + presets: ['@kbn/babel-preset/node_preset'], + }, + }, + }), +] as const; + +const invalid: RuleTester.InvalidTestCase[] = [ + { + name: 'Raises an error when a CSS color is used in a JSX style attribute', + filename: '/x-pack/plugins/observability_solution/observability/public/test_component.tsx', + code: ` + import React from 'react'; + + function TestComponent() { + return ( + This is a test + ) + }`, + errors: [{ messageId: 'noCssColorSpecific' }], + }, + { + name: 'Raises an error when a CSS color references a string variable that is passed to style prop of a JSX element', + filename: '/x-pack/plugins/observability_solution/observability/public/test_component.tsx', + code: ` + import React from 'react'; + + function TestComponent() { + const codeColor = '#dd4040'; + return ( + This is a test + ) + }`, + errors: [{ messageId: 'noCSSColorSpecificDeclaredVariable' }], + }, + { + name: 'Raises an error when a CSS color is used in an object variable that is passed to style prop of a JSX element', + filename: '/x-pack/plugins/observability_solution/observability/public/test_component.tsx', + code: ` + import React from 'react'; + + function TestComponent() { + const codeStyle = { color: '#dd4040' }; + return ( + This is a test + ) + }`, + errors: [{ messageId: 'noCSSColorSpecificDeclaredVariable' }], + }, + { + name: 'Raises an error when an object property that is a literal CSS color is used for the background property in a JSX style attribute', + filename: '/x-pack/plugins/observability_solution/observability/public/test_component.tsx', + code: ` + import React from 'react'; + + function TestComponent() { + const baseStyle = { background: 'rgb(255, 255, 255)' }; + + return ( + This is a test + ) + }`, + errors: [{ messageId: 'noCSSColorSpecificDeclaredVariable' }], + }, + { + name: 'Raises an error when a CSS color is used in a variable that is spread into another variable that is passed to style prop of a JSX element', + filename: '/x-pack/plugins/observability_solution/observability/public/test_component.tsx', + code: ` + import React from 'react'; + + function TestComponent() { + const baseStyle = { background: 'rgb(255, 255, 255)' }; + const codeStyle = { margin: '5px', ...baseStyle }; + return ( + This is a test + ) + }`, + errors: [{ messageId: 'noCSSColorSpecificDeclaredVariable' }], + }, + { + name: 'Raises an error when a CSS color is used for the background property in a JSX style attribute', + filename: '/x-pack/plugins/observability_solution/observability/public/test_component.tsx', + code: ` + import React from 'react'; + + function TestComponent() { + return ( + This is a test + ) + }`, + errors: [{ messageId: 'noCssColorSpecific' }], + }, + { + name: 'Raises an error when a CSS color for the color property is used in a JSX css attribute for EuiComponents', + filename: '/x-pack/plugins/observability_solution/observability/public/test_component.tsx', + code: ` + import React from 'react'; + + function TestComponent() { + return ( + This is a test + ) + }`, + errors: [{ messageId: 'noCssColorSpecific' }], + }, + { + name: 'Raises an error when a CSS color for the color property is used in with the tagged template css function', + filename: '/x-pack/plugins/observability_solution/observability/public/test_component.tsx', + code: ` + import { css } from '@emotion/css'; + + const codeColor = css\` color: #dd4040; \`; + `, + errors: [{ messageId: 'noCssColor' }], + }, + { + name: 'Raises an error when a CSS color for the color property is used in a JSX css attribute for EuiComponents with the css template function', + filename: '/x-pack/plugins/observability_solution/observability/public/test_component.tsx', + code: ` + import React from 'react'; + import { css } from '@emotion/css'; + + function TestComponent() { + return ( + This is a test + ) + }`, + errors: [{ messageId: 'noCssColor' }], + }, + { + name: 'Raises an error when a CSS color for the color property is used in a JSX className attribute for EuiComponents with the css template function defined outside the scope of the component', + filename: '/x-pack/plugins/observability_solution/observability/public/test_component.tsx', + code: ` + import React from 'react'; + import { css } from '@emotion/css'; + + const codeCss = css({ + color: '#dd4040', + }) + + function TestComponent() { + return ( + This is a test + ) + }`, + errors: [{ messageId: 'noCSSColorSpecificDeclaredVariable' }], + }, + { + name: 'Raises an error when a CSS color for the color property is used in a JSX className attribute for EuiComponents with the css template function defined outside the scope of the component', + filename: '/x-pack/plugins/observability_solution/observability/public/test_component.tsx', + code: ` + import React from 'react'; + import { css } from '@emotion/css'; + + const codeCss = css\` color: #dd4040; \` + + function TestComponent() { + return ( + This is a test + ) + }`, + errors: [{ messageId: 'noCssColor' }], + }, + { + name: 'Raises an error when a CSS color for the color property is used in a JSX css attribute for EuiComponents with an arrow function', + filename: '/x-pack/plugins/observability_solution/observability/public/test_component.tsx', + code: ` + import React from 'react'; + + function TestComponent() { + return ( + ({ color: '#dd4040' })}>This is a test + ) + }`, + errors: [{ messageId: 'noCssColorSpecific' }], + }, + { + name: 'Raises an error when a CSS color for the color property is used in a JSX css attribute for EuiComponents with a regular function', + filename: '/x-pack/plugins/observability_solution/observability/public/test_component.tsx', + code: ` + import React from 'react'; + + function TestComponent() { + return ( + This is a test + ) + }`, + errors: [{ messageId: 'noCssColorSpecific' }], + }, + { + name: 'Raises an error when a CSS color for the color property is used in a JSX className attribute for EuiComponents with the css template function', + filename: '/x-pack/plugins/observability_solution/observability/public/test_component.tsx', + code: ` + import React from 'react'; + import { css } from '@emotion/css'; + + function TestComponent() { + return ( + This is a test + ) + }`, + errors: [{ messageId: 'noCssColor' }], + }, +]; + +const valid: RuleTester.ValidTestCase[] = []; + +for (const [name, tester] of [tsTester, babelTester]) { + describe(name, () => { + tester.run('@kbn/no_css_color', NoCssColor, { + valid, + invalid, + }); + }); +} diff --git a/packages/kbn-eslint-plugin-css/src/rules/no_css_color.ts b/packages/kbn-eslint-plugin-css/src/rules/no_css_color.ts new file mode 100644 index 0000000000000..c453e5edfcd74 --- /dev/null +++ b/packages/kbn-eslint-plugin-css/src/rules/no_css_color.ts @@ -0,0 +1,453 @@ +/* + * 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", the "GNU Affero General Public License v3.0 only", and the "Server Side + * Public License v 1"; you may not use this file except in compliance with, at + * your election, the "Elastic License 2.0", the "GNU Affero General Public + * License v3.0 only", or the "Server Side Public License, v 1". + */ + +import type { Rule } from 'eslint'; +import { CSSStyleDeclaration } from 'cssstyle'; +import type { TSESTree } from '@typescript-eslint/typescript-estree'; + +/** + * @description List of superset css properties that can apply color to html box element elements and text nodes, leveraging the + * css style package allows us to directly singly check for these properties even if the actual declaration was written using the shorthand form + */ +const propertiesSupportingCssColor = ['color', 'background', 'border']; + +/** + * @description Builds off the existing color definition to match css declarations that can apply color to + * html elements and text nodes for string declarations + */ +const htmlElementColorDeclarationRegex = RegExp( + String.raw`(${propertiesSupportingCssColor.join('|')})` +); + +const checkPropertySpecifiesInvalidCSSColor = ([property, value]: string[]) => { + if (!property || !value) return false; + + const style = new CSSStyleDeclaration(); + + // @ts-ignore the types for this packages specifics an index signature of number, alongside other valid CSS properties + style[property] = value; + + const anchor = propertiesSupportingCssColor.find((resolvedProperty) => + property.includes(resolvedProperty) + ); + + if (!anchor) return false; + + // build the resolved color property to check if the value is a string after parsing the style declaration + const resolvedColorProperty = anchor === 'color' ? 'color' : anchor + 'Color'; + + // in trying to keep this rule simple, it's enough if a string is used to define a color to mark it as invalid + // @ts-ignore the types for this packages specifics an index signature of number, alongside other valid CSS properties + return typeof style[resolvedColorProperty] === 'string'; +}; + +const resolveMemberExpressionRoot = (node: TSESTree.MemberExpression): TSESTree.Identifier => { + if (node.object.type === 'MemberExpression') { + return resolveMemberExpressionRoot(node.object); + } + + return node.object as TSESTree.Identifier; +}; + +/** + * @description method to inspect values of interest found on an object + */ +const raiseReportIfPropertyHasInvalidCssColor = ( + context: Rule.RuleContext, + propertyNode: TSESTree.Property, + messageToReport: Rule.ReportDescriptor +) => { + let didReport = false; + + if ( + propertyNode.key.type === 'Identifier' && + !htmlElementColorDeclarationRegex.test(propertyNode.key.name) + ) { + return didReport; + } + + if (propertyNode.value.type === 'Literal') { + if ( + (didReport = checkPropertySpecifiesInvalidCSSColor([ + // @ts-expect-error the key name is present in this scenario + propertyNode.key.name, + propertyNode.value.value, + ])) + ) { + context.report(messageToReport); + } + } else if (propertyNode.value.type === 'Identifier') { + const identifierDeclaration = context.sourceCode + // @ts-expect-error + .getScope(propertyNode) + .variables.find( + (variable) => variable.name === (propertyNode.value as TSESTree.Identifier).name! + ); + + if ( + identifierDeclaration?.defs[0].node.init?.type === 'Literal' && + checkPropertySpecifiesInvalidCSSColor([ + // @ts-expect-error the key name is present in this scenario + propertyNode.key.name, + (identifierDeclaration.defs[0].node.init as TSESTree.Literal).value as string, + ]) + ) { + context.report({ + loc: propertyNode.value.loc, + messageId: 'noCSSColorSpecificDeclaredVariable', + data: { + // @ts-expect-error the key name is always present else this code will not execute + property: String(propertyNode.key.name), + line: String(propertyNode.value.loc.start.line), + variableName: propertyNode.value.name, + }, + }); + + didReport = true; + } + } else if (propertyNode.value.type === 'MemberExpression') { + // @ts-expect-error we ignore the case where this node could be a private identifier + const MemberExpressionLeafName = propertyNode.value.property.name; + const memberExpressionRootName = resolveMemberExpressionRoot(propertyNode.value).name; + + const expressionRootDeclaration = context.sourceCode + // @ts-expect-error + .getScope(propertyNode) + .variables.find((variable) => variable.name === memberExpressionRootName); + + const expressionRootDeclarationInit = expressionRootDeclaration?.defs[0].node.init; + + if (expressionRootDeclarationInit?.type === 'ObjectExpression') { + (expressionRootDeclarationInit as TSESTree.ObjectExpression).properties.forEach( + (property) => { + // This is a naive approach expecting the value to be at depth 1, we should actually be traversing the object to the same depth as the expression + if ( + property.type === 'Property' && + property.key.type === 'Identifier' && + property.key?.name === MemberExpressionLeafName + ) { + raiseReportIfPropertyHasInvalidCssColor(context, property, { + loc: propertyNode.value.loc, + messageId: 'noCSSColorSpecificDeclaredVariable', + data: { + // @ts-expect-error the key name is always present else this code will not execute + property: String(propertyNode.key.name), + line: String(propertyNode.value.loc.start.line), + variableName: memberExpressionRootName, + }, + }); + } + } + ); + } else if (expressionRootDeclarationInit?.type === 'CallExpression') { + // TODO: if this object was returned from invoking a function the best we can do is probably validate that the method invoked is one that returns an euitheme object + } + } + + return didReport; +}; + +/** + * + * @description style object declaration have a depth of 1, this function handles the properties of the object + */ +const handleObjectProperties = ( + context: Rule.RuleContext, + propertyParentNode: TSESTree.JSXAttribute, + property: TSESTree.ObjectLiteralElement, + reportMessage: Rule.ReportDescriptor +) => { + if (property.type === 'Property') { + raiseReportIfPropertyHasInvalidCssColor(context, property, reportMessage); + } else if (property.type === 'SpreadElement') { + const spreadElementIdentifierName = (property.argument as TSESTree.Identifier).name; + + const spreadElementDeclaration = context.sourceCode + // @ts-expect-error + .getScope(propertyParentNode!.value.expression!) + .references.find((ref) => ref.identifier.name === spreadElementIdentifierName)?.resolved; + + if (!spreadElementDeclaration) { + return; + } + + reportMessage = { + loc: propertyParentNode.loc, + messageId: 'noCSSColorSpecificDeclaredVariable', + data: { + // @ts-expect-error the key name is always present else this code will not execute + property: String(property.argument.name), + variableName: spreadElementIdentifierName, + line: String(property.loc.start.line), + }, + }; + + const spreadElementDeclarationNode = spreadElementDeclaration.defs[0].node.init; + + // evaluate only statically defined declarations, other possibilities like callExpressions in this context complicate things + if (spreadElementDeclarationNode?.type === 'ObjectExpression') { + (spreadElementDeclarationNode as TSESTree.ObjectExpression).properties.forEach( + (spreadProperty) => { + handleObjectProperties(context, propertyParentNode, spreadProperty, reportMessage); + } + ); + } + } +}; + +export const NoCssColor: Rule.RuleModule = { + meta: { + type: 'suggestion', + docs: { + description: 'Use color definitions from eui theme as opposed to CSS color values', + category: 'Best Practices', + recommended: true, + url: 'https://eui.elastic.co/#/theming/colors/values', + }, + messages: { + noCSSColorSpecificDeclaredVariable: + 'Avoid using a literal CSS color value for "{{property}}", use an EUI theme color instead in declared variable {{variableName}} on line {{line}}', + noCssColorSpecific: + 'Avoid using a literal CSS color value for "{{property}}", use an EUI theme color instead', + noCssColor: 'Avoid using a literal CSS color value, use an EUI theme color instead', + }, + schema: [], + }, + create(context) { + return { + // accounts for instances where declarations are created using the template tagged css function + TaggedTemplateExpression(node) { + if ( + node.tag.type !== 'Identifier' || + (node.tag.type === 'Identifier' && node.tag.name !== 'css') + ) { + return; + } + + for (let i = 0; i < node.quasi.quasis.length; i++) { + const declarationTemplateNode = node.quasi.quasis[i]; + + if (htmlElementColorDeclarationRegex.test(declarationTemplateNode.value.raw)) { + const cssText = declarationTemplateNode.value.raw.replace(/(\{|\}|\\n)/g, '').trim(); + + cssText.split(';').forEach((declaration) => { + if ( + declaration.length > 0 && + checkPropertySpecifiesInvalidCSSColor(declaration.split(':')) + ) { + context.report({ + node: declarationTemplateNode, + messageId: 'noCssColor', + }); + } + }); + } + } + }, + JSXAttribute(node: TSESTree.JSXAttribute) { + if (!(node.name.name === 'style' || node.name.name === 'css')) { + return; + } + + /** + * @description Accounts for instances where a variable is used to define a style object + * + * @example + * const codeStyle = { color: '#dd4040' }; + * This is an example + * + * @example + * const codeStyle = { color: '#dd4040' }; + * This is an example + * + * @example + * const codeStyle = css({ color: '#dd4040' }); + * This is an example + */ + if ( + node.value?.type === 'JSXExpressionContainer' && + node.value.expression.type === 'Identifier' + ) { + const styleVariableName = node.value.expression.name; + + const nodeScope = context.sourceCode.getScope(node.value.expression); + + const variableDeclarationMatches = nodeScope.references.find( + (ref) => ref.identifier.name === styleVariableName + )?.resolved; + + let variableInitializationNode; + + if ((variableInitializationNode = variableDeclarationMatches?.defs?.[0]?.node?.init)) { + if (variableInitializationNode.type === 'ObjectExpression') { + // @ts-ignore + variableInitializationNode.properties.forEach((property) => { + handleObjectProperties(context, node, property, { + loc: property.loc, + messageId: 'noCSSColorSpecificDeclaredVariable', + data: { + property: + property.type === 'SpreadElement' + ? String(property.argument.name) + : String(property.key.name), + variableName: styleVariableName, + line: String(property.loc.start.line), + }, + }); + }); + } else if ( + variableInitializationNode.type === 'CallExpression' && + variableInitializationNode.callee.name === 'css' + ) { + const cssFunctionArgument = variableInitializationNode.arguments[0]; + + if (cssFunctionArgument.type === 'ObjectExpression') { + // @ts-ignore + cssFunctionArgument.properties.forEach((property) => { + handleObjectProperties(context, node, property, { + loc: node.loc, + messageId: 'noCSSColorSpecificDeclaredVariable', + data: { + property: + property.type === 'SpreadElement' + ? String(property.argument.name) + : String(property.key.name), + variableName: styleVariableName, + line: String(property.loc.start.line), + }, + }); + }); + } + } + } + + return; + } + + /** + * + * @description Accounts for instances where a style object is inlined in the JSX attribute + * + * @example + * This is an example + * + * @example + * This is an example + * + * @example + * const styleRules = { color: '#dd4040' }; + * This is an example + * + * @example + * const styleRules = { color: '#dd4040' }; + * This is an example + */ + if ( + node.value?.type === 'JSXExpressionContainer' && + node.value.expression.type === 'ObjectExpression' + ) { + const declarationPropertiesNode = node.value.expression.properties; + + declarationPropertiesNode?.forEach((property) => { + handleObjectProperties(context, node, property, { + loc: property.loc, + messageId: 'noCssColorSpecific', + data: { + property: + property.type === 'SpreadElement' + ? // @ts-expect-error the key name is always present else this code will not execute + String(property.argument.name) + : // @ts-expect-error the key name is always present else this code will not execute + String(property.key.name), + }, + }); + }); + + return; + } + + if (node.name.name === 'css' && node.value?.type === 'JSXExpressionContainer') { + /** + * @example + * This is an example + */ + if (node.value.expression.type === 'TemplateLiteral') { + for (let i = 0; i < node.value.expression.quasis.length; i++) { + const declarationTemplateNode = node.value.expression.quasis[i]; + + if (htmlElementColorDeclarationRegex.test(declarationTemplateNode.value.raw)) { + const cssText = declarationTemplateNode.value.raw + .replace(/(\{|\}|\\n)/g, '') + .trim(); + + cssText.split(';').forEach((declaration) => { + if ( + declaration.length > 0 && + checkPropertySpecifiesInvalidCSSColor(declaration.split(':')) + ) { + context.report({ + node: declarationTemplateNode, + messageId: 'noCssColor', + }); + } + }); + } + } + } + + /** + * @example + * ({ color: '#dd4040' })}>This is an example + */ + if ( + node.value.expression.type === 'FunctionExpression' || + node.value.expression.type === 'ArrowFunctionExpression' + ) { + let declarationPropertiesNode: TSESTree.Property[] = []; + + if (node.value.expression.body.type === 'ObjectExpression') { + // @ts-expect-error + declarationPropertiesNode = node.value.expression.body.properties; + } + + if (node.value.expression.body.type === 'BlockStatement') { + const functionReturnStatementNode = node.value.expression.body.body?.find((_node) => { + return _node.type === 'ReturnStatement'; + }); + + if (!functionReturnStatementNode) { + return; + } + + declarationPropertiesNode = // @ts-expect-error + (functionReturnStatementNode as TSESTree.ReturnStatement).argument?.properties; + } + + if (!declarationPropertiesNode.length) { + return; + } + + declarationPropertiesNode.forEach((property) => { + handleObjectProperties(context, node, property, { + loc: property.loc, + messageId: 'noCssColorSpecific', + data: { + // @ts-expect-error the key name is always present else this code will not execute + property: property.key.name, + }, + }); + }); + + return; + } + } + }, + }; + }, +}; diff --git a/packages/kbn-eslint-plugin-css/src/rules/prefer_css_attribute_for_eui_components.test.ts b/packages/kbn-eslint-plugin-css/src/rules/prefer_css_attribute_for_eui_components.test.ts new file mode 100644 index 0000000000000..f1534ec5c861f --- /dev/null +++ b/packages/kbn-eslint-plugin-css/src/rules/prefer_css_attribute_for_eui_components.test.ts @@ -0,0 +1,85 @@ +/* + * 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", the "GNU Affero General Public License v3.0 only", and the "Server Side + * Public License v 1"; you may not use this file except in compliance with, at + * your election, the "Elastic License 2.0", the "GNU Affero General Public + * License v3.0 only", or the "Server Side Public License, v 1". + */ + +import { RuleTester } from 'eslint'; +import { PreferCSSAttributeForEuiComponents } from './prefer_css_attribute_for_eui_components'; + +const tsTester = [ + '@typescript-eslint/parser', + new RuleTester({ + parser: require.resolve('@typescript-eslint/parser'), + parserOptions: { + sourceType: 'module', + ecmaVersion: 2018, + ecmaFeatures: { + jsx: true, + }, + }, + }), +] as const; + +const babelTester = [ + '@babel/eslint-parser', + new RuleTester({ + parser: require.resolve('@babel/eslint-parser'), + parserOptions: { + sourceType: 'module', + ecmaVersion: 2018, + requireConfigFile: false, + babelOptions: { + presets: ['@kbn/babel-preset/node_preset'], + }, + }, + }), +] as const; + +const invalid: RuleTester.InvalidTestCase[] = [ + { + name: 'Prefer the JSX css attribute for EUI components', + filename: '/x-pack/plugins/observability_solution/observability/public/test_component.tsx', + code: ` + import React from 'react'; + + function TestComponent() { + return ( + This is a test + ) + }`, + errors: [ + { + messageId: 'preferCSSAttributeForEuiComponents', + }, + ], + output: ` + import React from 'react'; + + function TestComponent() { + return ( + This is a test + ) + }`, + }, +]; + +const valid: RuleTester.ValidTestCase[] = [ + { + name: invalid[0].name, + filename: invalid[0].filename, + code: invalid[0].output as string, + }, +]; + +for (const [name, tester] of [tsTester, babelTester]) { + describe(name, () => { + tester.run('@kbn/prefer_css_attribute_for_eui_components', PreferCSSAttributeForEuiComponents, { + valid, + invalid, + }); + }); +} diff --git a/packages/kbn-eslint-plugin-css/src/rules/prefer_css_attribute_for_eui_components.ts b/packages/kbn-eslint-plugin-css/src/rules/prefer_css_attribute_for_eui_components.ts new file mode 100644 index 0000000000000..f2b8bfd7b7d74 --- /dev/null +++ b/packages/kbn-eslint-plugin-css/src/rules/prefer_css_attribute_for_eui_components.ts @@ -0,0 +1,62 @@ +/* + * 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", the "GNU Affero General Public License v3.0 only", and the "Server Side + * Public License v 1"; you may not use this file except in compliance with, at + * your election, the "Elastic License 2.0", the "GNU Affero General Public + * License v3.0 only", or the "Server Side Public License, v 1". + */ + +import type { Rule } from 'eslint'; +import type { TSESTree } from '@typescript-eslint/typescript-estree'; +import type { Identifier, Node } from 'estree'; + +export const PreferCSSAttributeForEuiComponents: Rule.RuleModule = { + meta: { + type: 'suggestion', + docs: { + description: 'Prefer the JSX css attribute for EUI components', + category: 'Best Practices', + recommended: true, + }, + messages: { + preferCSSAttributeForEuiComponents: 'Prefer the css attribute for EUI components', + }, + fixable: 'code', + schema: [], + }, + create(context) { + const isNamedEuiComponentRegex = /^Eui[A-Z]*/; + + return { + JSXOpeningElement(node: TSESTree.JSXOpeningElement) { + if (isNamedEuiComponentRegex.test((node.name as unknown as Identifier).name)) { + let styleAttrNode: TSESTree.JSXAttribute | undefined; + + if ( + // @ts-expect-error the returned result is somehow typed as a union of JSXAttribute and JSXAttributeSpread + (styleAttrNode = node.attributes.find( + (attr) => attr.type === 'JSXAttribute' && attr.name.name === 'style' + )) + ) { + context.report({ + node: styleAttrNode?.parent! as Node, + messageId: 'preferCSSAttributeForEuiComponents', + fix(fixer) { + const cssAttr = node.attributes.find( + (attr) => attr.type === 'JSXAttribute' && attr.name.name === 'css' + ); + + if (cssAttr) { + return null; + } + + return fixer.replaceTextRange(styleAttrNode?.name?.range!, 'css'); + }, + }); + } + } + }, + }; + }, +}; diff --git a/packages/kbn-eslint-plugin-css/tsconfig.json b/packages/kbn-eslint-plugin-css/tsconfig.json new file mode 100644 index 0000000000000..a6dec1c1a62c5 --- /dev/null +++ b/packages/kbn-eslint-plugin-css/tsconfig.json @@ -0,0 +1,11 @@ +{ + "extends": "../../tsconfig.base.json", + "compilerOptions": { + "outDir": "target/types", + "types": ["jest", "node"], + "lib": ["es2021"] + }, + "include": ["**/*.ts"], + "exclude": ["target/**/*"], + "kbn_references": [] +} diff --git a/tsconfig.base.json b/tsconfig.base.json index d7b729f0aa34f..036acb822e20d 100644 --- a/tsconfig.base.json +++ b/tsconfig.base.json @@ -846,6 +846,8 @@ "@kbn/es-ui-shared-plugin/*": ["src/platform/plugins/shared/es_ui_shared/*"], "@kbn/eslint-config": ["packages/kbn-eslint-config"], "@kbn/eslint-config/*": ["packages/kbn-eslint-config/*"], + "@kbn/eslint-plugin-css": ["packages/kbn-eslint-plugin-css"], + "@kbn/eslint-plugin-css/*": ["packages/kbn-eslint-plugin-css/*"], "@kbn/eslint-plugin-disable": ["packages/kbn-eslint-plugin-disable"], "@kbn/eslint-plugin-disable/*": ["packages/kbn-eslint-plugin-disable/*"], "@kbn/eslint-plugin-eslint": ["packages/kbn-eslint-plugin-eslint"], @@ -2070,9 +2072,7 @@ "@kbn/zod-helpers/*": ["packages/kbn-zod-helpers/*"], // END AUTOMATED PACKAGE LISTING // Allows for importing from `kibana` package for the exported types. - "@emotion/core": [ - "typings/@emotion" - ] + "@emotion/core": ["typings/@emotion"] }, // Support .tsx files and transform JSX into calls to React.createElement "jsx": "react", diff --git a/yarn.lock b/yarn.lock index 0429712b792c4..79c16abf9c9c5 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5499,6 +5499,10 @@ version "0.0.0" uid "" +"@kbn/eslint-plugin-css@link:packages/kbn-eslint-plugin-css": + version "0.0.0" + uid "" + "@kbn/eslint-plugin-disable@link:packages/kbn-eslint-plugin-disable": version "0.0.0" uid "" @@ -11315,6 +11319,11 @@ resolved "https://registry.yarnpkg.com/@types/cookiejar/-/cookiejar-2.1.5.tgz#14a3e83fa641beb169a2dd8422d91c3c345a9a78" integrity sha512-he+DHOWReW0nghN24E1WUqM0efK4kI9oTqDm6XmK8ZPe2djZ90BSNdGnIyCLzCPw7/pogPlGbzI2wHGGmi4O/Q== +"@types/cssstyle@^2.2.4": + version "2.2.4" + resolved "https://registry.yarnpkg.com/@types/cssstyle/-/cssstyle-2.2.4.tgz#3d333ab9f8e6c40183ad1d6ebeebfcb8da2bfe4b" + integrity sha512-FTGMeuHZtLB7hRm+NGvOLZElslR1UkKvZmEmFevOZe/e7Av0nFleka1s8ZwoX+QvbJ2y7r9NDZXIzyqpRWDJXQ== + "@types/cytoscape@^3.14.0": version "3.14.0" resolved "https://registry.yarnpkg.com/@types/cytoscape/-/cytoscape-3.14.0.tgz#346b5430a7a1533784bcf44fcbe6c5255b948d36" @@ -16320,6 +16329,13 @@ cssstyle@^2.3.0: dependencies: cssom "~0.3.6" +cssstyle@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/cssstyle/-/cssstyle-4.1.0.tgz#161faee382af1bafadb6d3867a92a19bcb4aea70" + integrity sha512-h66W1URKpBS5YMI/V8PyXvTMFT8SupJ1IzoIV8IeBC/ji8WVmrO8dGlTi+2dh6whmdk6BiKJLD/ZBkhWbcg6nA== + dependencies: + rrweb-cssom "^0.7.1" + csstype@3.1.2: version "3.1.2" resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.1.2.tgz#1d4bf9d572f11c14031f0436e1c10bc1f571f50b" @@ -28908,6 +28924,11 @@ robust-predicates@^3.0.0: resolved "https://registry.yarnpkg.com/robust-predicates/-/robust-predicates-3.0.1.tgz#ecde075044f7f30118682bd9fb3f123109577f9a" integrity sha512-ndEIpszUHiG4HtDsQLeIuMvRsDnn8c8rYStabochtUeCvfuvNptb5TUbVD68LRAILPX7p9nqQGh4xJgn3EHS/g== +rrweb-cssom@^0.7.1: + version "0.7.1" + resolved "https://registry.yarnpkg.com/rrweb-cssom/-/rrweb-cssom-0.7.1.tgz#c73451a484b86dd7cfb1e0b2898df4b703183e4b" + integrity sha512-TrEMa7JGdVm0UThDJSx7ddw5nVm3UJS9o9CCIZ72B1vSyEZoziDqBYP3XIoi/12lKrJR8rE3jeFHMok2F/Mnsg== + rst-selector-parser@^2.2.3: version "2.2.3" resolved "https://registry.yarnpkg.com/rst-selector-parser/-/rst-selector-parser-2.2.3.tgz#81b230ea2fcc6066c89e3472de794285d9b03d91"