From 36100918ed7180890a60cb9896c66fcc8ae0575e Mon Sep 17 00:00:00 2001 From: Rudolf Meijering Date: Mon, 23 Oct 2023 16:12:13 +0200 Subject: [PATCH 01/68] Fix flaky migrations actions test by using an index with more docs (#168848) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## Summary Second attempt at: fixes https://github.com/elastic/kibana/issues/166190 fixes https://github.com/elastic/kibana/issues/166199 More data, more timeout 👯 I have not been able to cause this to fail locally, but we don't have a flaky test running for jest integrations tests to confirm. So the only way to fully test is to merge. ### Checklist Delete any items that are not applicable to this PR. - [ ] Any text added follows [EUI's writing guidelines](https://elastic.github.io/eui/#/guidelines/writing), uses sentence case text and includes [i18n support](https://github.com/elastic/kibana/blob/main/packages/kbn-i18n/README.md) - [ ] [Documentation](https://www.elastic.co/guide/en/kibana/master/development-documentation.html) was added for features that require explanation or tutorials - [ ] [Unit or functional tests](https://www.elastic.co/guide/en/kibana/master/development-tests.html) were updated or added to match the most common scenarios - [ ] Any UI touched in this PR is usable by keyboard only (learn more about [keyboard accessibility](https://webaim.org/techniques/keyboard/)) - [ ] Any UI touched in this PR does not create any new axe failures (run axe in browser: [FF](https://addons.mozilla.org/en-US/firefox/addon/axe-devtools/), [Chrome](https://chrome.google.com/webstore/detail/axe-web-accessibility-tes/lhdoppojpmngadmnindnejefpokejbdd?hl=en-US)) - [ ] If a plugin configuration key changed, check if it needs to be allowlisted in the cloud and added to the [docker list](https://github.com/elastic/kibana/blob/main/src/dev/build/tasks/os_packages/docker_generator/resources/base/bin/kibana-docker) - [ ] This renders correctly on smaller devices using a responsive layout. (You can test this [in your browser](https://www.browserstack.com/guide/responsive-testing-on-local-server)) - [ ] This was checked for [cross-browser compatibility](https://www.elastic.co/support/matrix#matrix_browsers) ### Risk Matrix Delete this section if it is not applicable to this PR. Before closing this PR, invite QA, stakeholders, and other developers to identify risks that should be tested prior to the change/feature release. When forming the risk matrix, consider some of the following examples and how they may potentially impact the change: | Risk | Probability | Severity | Mitigation/Notes | |---------------------------|-------------|----------|-------------------------| | Multiple Spaces—unexpected behavior in non-default Kibana Space. | Low | High | Integration tests will verify that all features are still supported in non-default Kibana Space and when user switches between spaces. | | Multiple nodes—Elasticsearch polling might have race conditions when multiple Kibana nodes are polling for the same tasks. | High | Low | Tasks are idempotent, so executing them multiple times will not result in logical error, but will degrade performance. To test for this case we add plenty of unit tests around this logic and document manual testing procedure. | | Code should gracefully handle cases when feature X or plugin Y are disabled. | Medium | High | Unit tests will verify that any feature flag or plugin combination still results in our service operational. | | [See more potential risk examples](https://github.com/elastic/kibana/blob/main/RISK_MATRIX.mdx) | ### For maintainers - [ ] This was checked for breaking API changes and was [labeled appropriately](https://www.elastic.co/guide/en/kibana/master/contributing.html#kibana-release-notes-process) --------- Co-authored-by: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> --- .../migrations/group3/actions/actions.test.ts | 1 - .../group3/actions/actions_test_suite.ts | 38 +++++++++++++++---- 2 files changed, 30 insertions(+), 9 deletions(-) diff --git a/src/core/server/integration_tests/saved_objects/migrations/group3/actions/actions.test.ts b/src/core/server/integration_tests/saved_objects/migrations/group3/actions/actions.test.ts index a951ecc37d1f46..559bbfb19a4154 100644 --- a/src/core/server/integration_tests/saved_objects/migrations/group3/actions/actions.test.ts +++ b/src/core/server/integration_tests/saved_objects/migrations/group3/actions/actions.test.ts @@ -5,7 +5,6 @@ * in compliance with, at your election, the Elastic License 2.0 or the Server * Side Public License, v 1. */ - import { createTestServers } from '@kbn/core-test-helpers-kbn-server'; import { MIGRATION_CLIENT_OPTIONS } from '@kbn/core-saved-objects-migration-server-internal'; import { runActionTestSuite } from './actions_test_suite'; 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 065ce179f480c3..3abfaaaedc9774 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 @@ -104,7 +104,9 @@ export const runActionTestSuite = ({ { _source: { title: 'doc 3' } }, { _source: { title: 'saved object 4', type: 'another_unused_type' } }, { _source: { title: 'f-agent-event 5', type: 'f_agent_event' } }, - { _source: { title: new Array(1000).fill('a').join(), type: 'large' } }, // "large" saved object + { + _source: { title: new Array(1000).fill('a').join(), type: 'large' }, + }, // "large" saved objects ] as unknown as SavedObjectsRawDoc[]; await bulkOverwriteTransformedDocuments({ client, @@ -113,6 +115,27 @@ export const runActionTestSuite = ({ refresh: 'wait_for', })(); + await createIndex({ + client, + indexName: 'existing_index_with_100k_docs', + aliases: ['existing_index_with_100k_docs_alias'], + esCapabilities, + mappings: { + dynamic: true, + properties: {}, + }, + })(); + const docs100k = new Array(100000).fill({ + _source: { title: new Array(1000).fill('a').join(), type: 'large' }, + }) as unknown as SavedObjectsRawDoc[]; // 100k "large" saved objects + + await bulkOverwriteTransformedDocuments({ + client, + index: 'existing_index_with_100k_docs', + operations: docs100k.map((doc) => createBulkIndexOperationTuple(doc)), + refresh: 'wait_for', + })(); + await createIndex({ client, indexName: 'existing_index_2', @@ -756,8 +779,7 @@ export const runActionTestSuite = ({ // Reindex doesn't return any errors on it's own, so we have to test // together with waitForReindexTask - // Failing: See https://github.com/elastic/kibana/issues/166190 - describe.skip('reindex & waitForReindexTask', () => { + describe('reindex & waitForReindexTask', () => { it('resolves right when reindex succeeds without reindex script', async () => { const res = (await reindex({ client, @@ -1122,15 +1144,16 @@ export const runActionTestSuite = ({ it('resolves left wait_for_task_completion_timeout when the task does not finish within the timeout', async () => { const readyTaskRes = await waitForIndexStatus({ client, - index: 'existing_index_with_docs', + index: 'existing_index_with_100k_docs', status: 'yellow', + timeout: '300s', })(); expect(Either.isRight(readyTaskRes)).toBe(true); const res = (await reindex({ client, - sourceIndex: 'existing_index_with_docs', + sourceIndex: 'existing_index_with_100k_docs', targetIndex: 'reindex_target', reindexScript: Option.none, requireAlias: false, @@ -1428,8 +1451,7 @@ export const runActionTestSuite = ({ }); }); - // Failing: See https://github.com/elastic/kibana/issues/166199 - describe.skip('waitForPickupUpdatedMappingsTask', () => { + describe('waitForPickupUpdatedMappingsTask', () => { it('rejects if there are failures', async () => { const res = (await pickupUpdatedMappings( client, @@ -1469,7 +1491,7 @@ export const runActionTestSuite = ({ it('resolves left wait_for_task_completion_timeout when the task does not complete within the timeout', async () => { const res = (await pickupUpdatedMappings( client, - 'existing_index_with_docs', + 'existing_index_with_100k_docs', 1000 )()) as Either.Right; From 6c172aed9a2ee6691d608319fc421911107712ac Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Efe=20G=C3=BCrkan=20YALAMAN?= Date: Mon, 23 Oct 2023 16:12:33 +0200 Subject: [PATCH 02/68] [Enterprise Search] Update search page title (#169521) ## Summary Update Page title for Search plugin. Screenshot 2023-10-23 at 14 51 18 --- .../shared/kibana_chrome/generate_title.ts | 8 ++++++-- .../applications/shared/kibana_chrome/set_chrome.tsx | 11 ++++++----- 2 files changed, 12 insertions(+), 7 deletions(-) diff --git a/x-pack/plugins/enterprise_search/public/applications/shared/kibana_chrome/generate_title.ts b/x-pack/plugins/enterprise_search/public/applications/shared/kibana_chrome/generate_title.ts index 73c691ef5536e9..c9400393b057b7 100644 --- a/x-pack/plugins/enterprise_search/public/applications/shared/kibana_chrome/generate_title.ts +++ b/x-pack/plugins/enterprise_search/public/applications/shared/kibana_chrome/generate_title.ts @@ -6,13 +6,14 @@ */ import { + AI_SEARCH_PLUGIN, ANALYTICS_PLUGIN, APP_SEARCH_PLUGIN, - WORKPLACE_SEARCH_PLUGIN, + ENTERPRISE_SEARCH_CONTENT_PLUGIN, SEARCH_EXPERIENCES_PLUGIN, SEARCH_PRODUCT_NAME, - AI_SEARCH_PLUGIN, VECTOR_SEARCH_PLUGIN, + WORKPLACE_SEARCH_PLUGIN, } from '../../../../common/constants'; /** @@ -53,3 +54,6 @@ export const aiSearchTitle = (page: Title = []) => generateTitle([...page, AI_SE export const vectorSearchTitle = (page: Title = []) => generateTitle([...page, VECTOR_SEARCH_PLUGIN.NAME]); + +export const enterpriseSearchContentTitle = (page: Title = []) => + generateTitle([...page, ENTERPRISE_SEARCH_CONTENT_PLUGIN.NAME]); diff --git a/x-pack/plugins/enterprise_search/public/applications/shared/kibana_chrome/set_chrome.tsx b/x-pack/plugins/enterprise_search/public/applications/shared/kibana_chrome/set_chrome.tsx index 27699c16d7a2a0..5c6758509c01d2 100644 --- a/x-pack/plugins/enterprise_search/public/applications/shared/kibana_chrome/set_chrome.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/shared/kibana_chrome/set_chrome.tsx @@ -28,14 +28,15 @@ import { useVectorSearchBreadcrumbs, } from './generate_breadcrumbs'; import { - searchTitle, + aiSearchTitle, analyticsTitle, - elasticsearchTitle, appSearchTitle, - workplaceSearchTitle, + elasticsearchTitle, + enterpriseSearchContentTitle, searchExperiencesTitle, - aiSearchTitle, + searchTitle, vectorSearchTitle, + workplaceSearchTitle, } from './generate_title'; /** @@ -163,7 +164,7 @@ export const SetEnterpriseSearchContentChrome: React.FC = ({ tra const { setBreadcrumbs, setDocTitle } = useValues(KibanaLogic); const title = reverseArray(trail); - const docTitle = appSearchTitle(title); + const docTitle = enterpriseSearchContentTitle(title); const crumbs = useGenerateBreadcrumbs(trail); const breadcrumbs = useEnterpriseSearchContentBreadcrumbs(crumbs); From 23846365ce6fff54dd17f567ae5c6792d22c6ccf Mon Sep 17 00:00:00 2001 From: Khristinin Nikita Date: Mon, 23 Oct 2023 16:15:15 +0200 Subject: [PATCH 03/68] Risk score for 1 space change message (#169518) Change the message according to this [comment](https://github.com/elastic/security-team/issues/7319#issuecomment-1735960127). Screenshot 2023-10-23 at 14 27 55 --- .../public/entity_analytics/translations.ts | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/x-pack/plugins/security_solution/public/entity_analytics/translations.ts b/x-pack/plugins/security_solution/public/entity_analytics/translations.ts index 18b645e6572826..e22833674ff852 100644 --- a/x-pack/plugins/security_solution/public/entity_analytics/translations.ts +++ b/x-pack/plugins/security_solution/public/entity_analytics/translations.ts @@ -249,14 +249,15 @@ export const UPDATE_PANEL_GO_TO_DISMISS = i18n.translate( export const getMaxSpaceTitle = (maxSpaces: number) => i18n.translate('xpack.securitySolution.riskScore.maxSpacePanel.title', { defaultMessage: - 'Entity Risk Scoring in the current version can run in {maxSpaces, plural, =1 {# Kibana space} other {# Kibana spaces}}', + 'You cannot enable entity risk scoring in more than {maxSpaces, plural, =1 {# Kibana space} other {# Kibana spaces}}.', values: { maxSpaces }, }); export const MAX_SPACE_PANEL_MESSAGE = i18n.translate( 'xpack.securitySolution.riskScore.maxSpacePanel.message', { - defaultMessage: 'Please disable a currently running engine before enabling it here.', + defaultMessage: + 'You can disable entity risk scoring in the space it is currently enabled before enabling it in this space', } ); From b7e2893f8880254852f52089b27241d09f205dd6 Mon Sep 17 00:00:00 2001 From: Anton Dosov Date: Mon, 23 Oct 2023 16:27:41 +0200 Subject: [PATCH 04/68] [Serverless] Improve cases breadcrumbs in oblt project (#169401) ## Summary partially fixes https://github.com/elastic/kibana/issues/161447 Fixed "Create Case" and "Manage Cases" breadcrumbs --- .../src/ui/components/navigation_group.tsx | 2 + .../src/ui/default_navigation.test.tsx | 123 ++++++++++++++++++ .../src/ui/hooks/use_init_navnode.ts | 2 +- .../components/side_navigation/index.tsx | 9 ++ .../test_suites/observability/navigation.ts | 18 +++ 5 files changed, 153 insertions(+), 1 deletion(-) diff --git a/packages/shared-ux/chrome/navigation/src/ui/components/navigation_group.tsx b/packages/shared-ux/chrome/navigation/src/ui/components/navigation_group.tsx index 93e451aa7f16f1..724e2bafac1f57 100644 --- a/packages/shared-ux/chrome/navigation/src/ui/components/navigation_group.tsx +++ b/packages/shared-ux/chrome/navigation/src/ui/components/navigation_group.tsx @@ -85,6 +85,8 @@ function NavigationGroupInternalComp< return null; } + if (navNodeWithChildren.sideNavStatus === 'hidden') return null; + if (unstyled) { // No UI for unstyled groups return children; diff --git a/packages/shared-ux/chrome/navigation/src/ui/default_navigation.test.tsx b/packages/shared-ux/chrome/navigation/src/ui/default_navigation.test.tsx index 61b2c850851e10..57e39d1350acea 100644 --- a/packages/shared-ux/chrome/navigation/src/ui/default_navigation.test.tsx +++ b/packages/shared-ux/chrome/navigation/src/ui/default_navigation.test.tsx @@ -348,6 +348,129 @@ describe('', () => { `); }); + test("shouldn't render hidden deeplink", async () => { + const navLinks$: Observable = of([ + ...navLinksMock, + { + id: 'item1', + title: 'Item 1', + baseUrl: '', + url: '', + href: '', + }, + { + id: 'item', + title: 'Item 2', + hidden: true, + baseUrl: '', + url: '', + href: '', + }, + ]); + + const onProjectNavigationChange = jest.fn(); + + const navigationBody: Array> = [ + { + type: 'navGroup', + id: 'root', + children: [ + { + id: 'group1', + children: [ + { + id: 'item1', + link: 'item1', + }, + { + id: 'item2', + link: 'item2', // this should be hidden from sidenav + }, + ], + }, + ], + }, + ]; + + const { queryByTestId } = render( + + + + ); + + await act(async () => { + jest.advanceTimersByTime(SET_NAVIGATION_DELAY); + }); + + expect(onProjectNavigationChange).toHaveBeenCalled(); + const lastCall = + onProjectNavigationChange.mock.calls[onProjectNavigationChange.mock.calls.length - 1]; + const [navTreeGenerated] = lastCall; + + expect(navTreeGenerated.navigationTree).toMatchInlineSnapshot(` + Array [ + Object { + "children": Array [ + Object { + "children": Array [ + Object { + "children": undefined, + "deepLink": Object { + "baseUrl": "", + "href": "", + "id": "item1", + "title": "Item 1", + "url": "", + }, + "href": undefined, + "id": "item1", + "isActive": false, + "isGroup": false, + "path": Array [ + "root", + "group1", + "item1", + ], + "sideNavStatus": "visible", + "title": "Item 1", + }, + ], + "deepLink": undefined, + "href": undefined, + "id": "group1", + "isActive": false, + "isGroup": true, + "path": Array [ + "root", + "group1", + ], + "sideNavStatus": "visible", + "title": "", + }, + ], + "deepLink": undefined, + "href": undefined, + "id": "root", + "isActive": false, + "isGroup": true, + "path": Array [ + "root", + ], + "sideNavStatus": "visible", + "title": "", + "type": "navGroup", + }, + ] + `); + + expect(await queryByTestId(/nav-item-deepLinkId-item1/)).not.toBeNull(); + expect(await queryByTestId(/nav-item-deepLinkId-item2/)).toBeNull(); + }); + test('should allow href for absolute links', async () => { const onProjectNavigationChange = jest.fn(); diff --git a/packages/shared-ux/chrome/navigation/src/ui/hooks/use_init_navnode.ts b/packages/shared-ux/chrome/navigation/src/ui/hooks/use_init_navnode.ts index ab0c5ae860f3c4..4e24c887b1d02d 100644 --- a/packages/shared-ux/chrome/navigation/src/ui/hooks/use_init_navnode.ts +++ b/packages/shared-ux/chrome/navigation/src/ui/hooks/use_init_navnode.ts @@ -59,7 +59,7 @@ function getNodeStatus( if (!hasUserAccessToCloudLink()) return 'remove'; } - if (deepLink && deepLink.hidden) return 'remove'; + if (deepLink && deepLink.hidden) return 'hidden'; return sideNavStatus ?? 'visible'; } diff --git a/x-pack/plugins/serverless_observability/public/components/side_navigation/index.tsx b/x-pack/plugins/serverless_observability/public/components/side_navigation/index.tsx index d2b07282e70b5c..a55fedb0b6c79b 100644 --- a/x-pack/plugins/serverless_observability/public/components/side_navigation/index.tsx +++ b/x-pack/plugins/serverless_observability/public/components/side_navigation/index.tsx @@ -63,6 +63,15 @@ const navigationTree: NavigationTreeDefinition = { }, { link: 'observability-overview:cases', + renderAs: 'item', + children: [ + { + link: 'observability-overview:cases_configure', + }, + { + link: 'observability-overview:cases_create', + }, + ], }, { link: 'observability-overview:slos', diff --git a/x-pack/test_serverless/functional/test_suites/observability/navigation.ts b/x-pack/test_serverless/functional/test_suites/observability/navigation.ts index 0b18ae0440e9bc..87aa8e3171251b 100644 --- a/x-pack/test_serverless/functional/test_suites/observability/navigation.ts +++ b/x-pack/test_serverless/functional/test_suites/observability/navigation.ts @@ -14,6 +14,7 @@ export default function ({ getPageObject, getService }: FtrProviderContext) { const svlCommonPage = getPageObject('svlCommonPage'); const svlCommonNavigation = getPageObject('svlCommonNavigation'); const browser = getService('browser'); + const testSubjects = getService('testSubjects'); describe('navigation', function () { before(async () => { @@ -100,6 +101,23 @@ export default function ({ getPageObject, getService }: FtrProviderContext) { deepLinkId: 'observability-overview:cases', }); expect(await browser.getCurrentUrl()).contain('/app/observability/cases'); + await svlCommonNavigation.breadcrumbs.expectBreadcrumbTexts(['Cases']); + + await testSubjects.click('createNewCaseBtn'); + expect(await browser.getCurrentUrl()).contain('app/observability/cases/create'); + await svlCommonNavigation.sidenav.expectLinkActive({ + deepLinkId: 'observability-overview:cases', + }); + await svlCommonNavigation.breadcrumbs.expectBreadcrumbTexts(['Cases', 'Create New Case']); + + await svlCommonNavigation.sidenav.clickLink({ deepLinkId: 'observability-overview:cases' }); + + await testSubjects.click('configure-case-button'); + expect(await browser.getCurrentUrl()).contain('app/observability/cases/configure'); + await svlCommonNavigation.sidenav.expectLinkActive({ + deepLinkId: 'observability-overview:cases', + }); + await svlCommonNavigation.breadcrumbs.expectBreadcrumbTexts(['Cases', 'Configure Cases']); }); }); } From ce931e28207981f271f730df36cf5a73ec75382a Mon Sep 17 00:00:00 2001 From: Saarika Bhasi <55930906+saarikabhasi@users.noreply.github.com> Date: Mon, 23 Oct 2023 10:39:39 -0400 Subject: [PATCH 05/68] [Serverless Search] Fix getting started footer to align with design (#169423) ## Summary This PR: * Removes pipeline card from Getting started page Footer * Adds right-chevron icon next to Discover and Documentation cards to align with design ## Screen shot Fix footer to align with design ### Checklist - [x] Any text added follows [EUI's writing guidelines](https://elastic.github.io/eui/#/guidelines/writing), uses sentence case text and includes [i18n support](https://github.com/elastic/kibana/blob/main/packages/kbn-i18n/README.md) --- .../application/components/overview.tsx | 74 +++++++++---------- 1 file changed, 34 insertions(+), 40 deletions(-) diff --git a/x-pack/plugins/serverless_search/public/application/components/overview.tsx b/x-pack/plugins/serverless_search/public/application/components/overview.tsx index ed29ac4c148025..beb5cea5d19c1d 100644 --- a/x-pack/plugins/serverless_search/public/application/components/overview.tsx +++ b/x-pack/plugins/serverless_search/public/application/components/overview.tsx @@ -12,6 +12,7 @@ import { EuiCodeBlock, EuiFlexGroup, EuiFlexItem, + EuiIcon, EuiPageTemplate, EuiPanel, EuiSpacer, @@ -342,41 +343,22 @@ const OverviewFooter = () => { title={i18n.translate('xpack.serverlessSearch.overview.footer.discover.title', { defaultMessage: 'Discover', })} - description={i18n.translate( - 'xpack.serverlessSearch.overview.footer.discover.description', - { - defaultMessage: - 'Search and filter your data, learn how your fields are structured, and create visualizations.', - } - )} - onClick={() => navigateToApp('discover')} - /> - - - + description={ + + +

+ {i18n.translate('xpack.serverlessSearch.overview.footer.discover.description', { + defaultMessage: + 'Search and filter your data, learn how your fields are structured, and create visualizations.', + })} +

+
+ + + +
} - titleSize="xs" - title={i18n.translate('xpack.serverlessSearch.overview.footer.pipelines.title', { - defaultMessage: 'Pipelines', - })} - description={i18n.translate( - 'xpack.serverlessSearch.overview.footer.pipelines.description', - { - defaultMessage: - 'Transform your data before indexing. Remove or rename fields, run custom scripts, and much more.', - } - )} - onClick={() => navigateToApp('management', { path: '/ingest/ingest_pipelines' })} + onClick={() => navigateToApp('discover')} />
@@ -396,12 +378,24 @@ const OverviewFooter = () => { title={i18n.translate('xpack.serverlessSearch.overview.footer.documentation.title', { defaultMessage: 'Documentation', })} - description={i18n.translate( - 'xpack.serverlessSearch.overview.footer.documentation.description', - { - defaultMessage: 'Learn more with our references, how-to guides, and tutorials.', - } - )} + description={ + + +

+ {i18n.translate( + 'xpack.serverlessSearch.overview.footer.documentation.description', + { + defaultMessage: + 'Learn more with our references, how-to guides, and tutorials.', + } + )} +

+
+ + + +
+ } href={docLinks.gettingStartedSearch} />
From 53c83e789b3e47700f6f46b0eb37bdd472fab239 Mon Sep 17 00:00:00 2001 From: Tim Sullivan Date: Mon, 23 Oct 2023 07:47:30 -0700 Subject: [PATCH 06/68] KibanaErrorBoundary initial implementation (#168754) ## Summary * Meta issue: https://github.com/elastic/kibana/issues/166584 * This PR implements tasks in: https://github.com/elastic/kibana/issues/167159 * [Technical doc [Elastic internal]](https://docs.google.com/document/d/1kVD3T08AzLuvRMnFrXzWd6rTQWZDFfjqmOMCoXRI-14/edit) This PR creates the `ErrorBoundary` component and its provider for services. It implements the wrapper around a few management apps owned by Appex-SharedUX. ### Screenshots Updated 2023-10-18 **Server upgrade scenario:** In this case, the caught error is known to be recoverable via window refresh: * image **Unknown/Custom error:** In this case, the error is something outside of known cases where the fix is to refresh: * image ### Testing 1. Use a script proxy in between the browser and the Kibana server. * Try **https://github.com/tsullivan/simple-node-proxy** * or **https://chrome.google.com/webstore/detail/tweak-mock-and-modify-htt/feahianecghpnipmhphmfgmpdodhcapi**. 2. Script the proxy to send 404 responses for the Reporting plugin bundle, and for a bundle of some Management app. 3. Try the Share > CSV menu in Discover. It should be blocked, and handled with a toast message. Buttons in the toast should work. 4. Try the SharedUX management apps that use the wrapper. It should be blocked, and handled with an EuiCallout. Refresh button and EuiAccordion should work. ### Checklist - [x] Ensure the package code is delivered to the browser in the initial loading of the page (c2559e83d27ff5a330b196deb8902c19683811fa) - [x] Any text added follows [EUI's writing guidelines](https://elastic.github.io/eui/#/guidelines/writing), uses sentence case text and includes [i18n support](https://github.com/elastic/kibana/blob/main/packages/kbn-i18n/README.md) - [x] [Documentation](https://www.elastic.co/guide/en/kibana/master/development-documentation.html) was added for features that require explanation or tutorials - [x] [Unit or functional tests](https://www.elastic.co/guide/en/kibana/master/development-tests.html) were updated or added to match the most common scenarios - [x] Any UI touched in this PR is usable by keyboard only (learn more about [keyboard accessibility](https://webaim.org/techniques/keyboard/)) - [x] Any UI touched in this PR does not create any new axe failures (run axe in browser: [FF](https://addons.mozilla.org/en-US/firefox/addon/axe-devtools/), [Chrome](https://chrome.google.com/webstore/detail/axe-web-accessibility-tes/lhdoppojpmngadmnindnejefpokejbdd?hl=en-US)) - [x] This renders correctly on smaller devices using a responsive layout. (You can test this [in your browser](https://www.browserstack.com/guide/responsive-testing-on-local-server)) - [x] This was checked for [cross-browser compatibility](https://www.elastic.co/support/matrix#matrix_browsers) --------- Co-authored-by: kibanamachine <42973632+kibanamachine@users.noreply.github.com> Co-authored-by: Tiago Costa --- .github/CODEOWNERS | 1 + package.json | 1 + .../flyout_service.test.tsx.snap | 84 +- .../__snapshots__/modal_service.test.tsx.snap | 846 ++++++++++-------- packages/kbn-optimizer/limits.yml | 2 +- packages/kbn-ui-shared-deps-src/BUILD.bazel | 1 + .../kbn-ui-shared-deps-src/src/definitions.js | 1 + packages/kbn-ui-shared-deps-src/src/entry.js | 2 + packages/kbn-ui-shared-deps-src/tsconfig.json | 3 +- .../kibana_context/render/render_provider.tsx | 6 +- .../react/kibana_context/render/tsconfig.json | 1 + packages/shared-ux/error_boundary/BUILD.bazel | 35 + packages/shared-ux/error_boundary/README.mdx | 16 + packages/shared-ux/error_boundary/index.ts | 10 + .../shared-ux/error_boundary/jest.config.js | 13 + .../shared-ux/error_boundary/kibana.jsonc | 5 + .../shared-ux/error_boundary/mocks/index.ts | 12 + .../mocks/src/bad_component.tsx | 31 + .../mocks/src/chunk_load_error_component.tsx | 33 + .../error_boundary/mocks/src/jest.ts | 17 + .../error_boundary/mocks/src/storybook.ts | 43 + .../mocks/src/storybook_template.tsx | 36 + .../shared-ux/error_boundary/package.json | 6 + .../src/services/error_boundary_services.tsx | 54 ++ .../src/services/error_service.test.ts | 52 ++ .../src/services/error_service.ts | 79 ++ .../src/ui/error_boundary.fatal.stories.tsx | 44 + .../ui/error_boundary.recoverable.stories.tsx | 46 + .../src/ui/error_boundary.test.tsx | 75 ++ .../error_boundary/src/ui/error_boundary.tsx | 89 ++ .../src/ui/message_components.tsx | 141 +++ .../error_boundary/src/ui/message_strings.ts | 67 ++ .../shared-ux/error_boundary/tsconfig.json | 25 + packages/shared-ux/error_boundary/types.ts | 18 + tsconfig.base.json | 2 + yarn.lock | 4 + 36 files changed, 1474 insertions(+), 427 deletions(-) create mode 100644 packages/shared-ux/error_boundary/BUILD.bazel create mode 100644 packages/shared-ux/error_boundary/README.mdx create mode 100644 packages/shared-ux/error_boundary/index.ts create mode 100644 packages/shared-ux/error_boundary/jest.config.js create mode 100644 packages/shared-ux/error_boundary/kibana.jsonc create mode 100644 packages/shared-ux/error_boundary/mocks/index.ts create mode 100644 packages/shared-ux/error_boundary/mocks/src/bad_component.tsx create mode 100644 packages/shared-ux/error_boundary/mocks/src/chunk_load_error_component.tsx create mode 100644 packages/shared-ux/error_boundary/mocks/src/jest.ts create mode 100644 packages/shared-ux/error_boundary/mocks/src/storybook.ts create mode 100644 packages/shared-ux/error_boundary/mocks/src/storybook_template.tsx create mode 100644 packages/shared-ux/error_boundary/package.json create mode 100644 packages/shared-ux/error_boundary/src/services/error_boundary_services.tsx create mode 100644 packages/shared-ux/error_boundary/src/services/error_service.test.ts create mode 100644 packages/shared-ux/error_boundary/src/services/error_service.ts create mode 100644 packages/shared-ux/error_boundary/src/ui/error_boundary.fatal.stories.tsx create mode 100644 packages/shared-ux/error_boundary/src/ui/error_boundary.recoverable.stories.tsx create mode 100644 packages/shared-ux/error_boundary/src/ui/error_boundary.test.tsx create mode 100644 packages/shared-ux/error_boundary/src/ui/error_boundary.tsx create mode 100644 packages/shared-ux/error_boundary/src/ui/message_components.tsx create mode 100644 packages/shared-ux/error_boundary/src/ui/message_strings.ts create mode 100644 packages/shared-ux/error_boundary/tsconfig.json create mode 100644 packages/shared-ux/error_boundary/types.ts diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index b07afe61353578..ecfbc723c8f8b4 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -681,6 +681,7 @@ packages/shared-ux/card/no_data/impl @elastic/appex-sharedux packages/shared-ux/card/no_data/mocks @elastic/appex-sharedux packages/shared-ux/card/no_data/types @elastic/appex-sharedux packages/shared-ux/chrome/navigation @elastic/appex-sharedux +packages/shared-ux/error_boundary @elastic/appex-sharedux packages/shared-ux/file/context @elastic/appex-sharedux packages/shared-ux/file/image/impl @elastic/appex-sharedux packages/shared-ux/file/image/mocks @elastic/appex-sharedux diff --git a/package.json b/package.json index b52c7716906cd5..75ae9e9fd0cdb7 100644 --- a/package.json +++ b/package.json @@ -684,6 +684,7 @@ "@kbn/shared-ux-card-no-data-mocks": "link:packages/shared-ux/card/no_data/mocks", "@kbn/shared-ux-card-no-data-types": "link:packages/shared-ux/card/no_data/types", "@kbn/shared-ux-chrome-navigation": "link:packages/shared-ux/chrome/navigation", + "@kbn/shared-ux-error-boundary": "link:packages/shared-ux/error_boundary", "@kbn/shared-ux-file-context": "link:packages/shared-ux/file/context", "@kbn/shared-ux-file-image": "link:packages/shared-ux/file/image/impl", "@kbn/shared-ux-file-image-mocks": "link:packages/shared-ux/file/image/mocks", diff --git a/packages/core/overlays/core-overlays-browser-internal/src/flyout/__snapshots__/flyout_service.test.tsx.snap b/packages/core/overlays/core-overlays-browser-internal/src/flyout/__snapshots__/flyout_service.test.tsx.snap index 4764d649c146dd..41f9899e7b00e1 100644 --- a/packages/core/overlays/core-overlays-browser-internal/src/flyout/__snapshots__/flyout_service.test.tsx.snap +++ b/packages/core/overlays/core-overlays-browser-internal/src/flyout/__snapshots__/flyout_service.test.tsx.snap @@ -51,7 +51,27 @@ Array [ "calls": Array [ Array [ Object { - "children": + "children": + + + + + + , + }, + Object {}, + ], + ], + "results": Array [ + Object { + "type": "return", + "value": + @@ -60,24 +80,8 @@ Array [ mount={[Function]} /> - , - }, - Object {}, - ], - ], - "results": Array [ - Object { - "type": "return", - "value": - - - - , + + , }, ], }, @@ -110,7 +114,27 @@ Array [ "calls": Array [ Array [ Object { - "children": + "children": + + + + + + , + }, + Object {}, + ], + ], + "results": Array [ + Object { + "type": "return", + "value": + @@ -119,24 +143,8 @@ Array [ mount={[Function]} /> - , - }, - Object {}, - ], - ], - "results": Array [ - Object { - "type": "return", - "value": - - - - , + + , }, ], }, diff --git a/packages/core/overlays/core-overlays-browser-internal/src/modal/__snapshots__/modal_service.test.tsx.snap b/packages/core/overlays/core-overlays-browser-internal/src/modal/__snapshots__/modal_service.test.tsx.snap index a3d283f0cde78b..5e66f339c780ff 100644 --- a/packages/core/overlays/core-overlays-browser-internal/src/modal/__snapshots__/modal_service.test.tsx.snap +++ b/packages/core/overlays/core-overlays-browser-internal/src/modal/__snapshots__/modal_service.test.tsx.snap @@ -18,7 +18,27 @@ Array [ "calls": Array [ Array [ Object { - "children": + "children": + + + + + + , + }, + Object {}, + ], + ], + "results": Array [ + Object { + "type": "return", + "value": + @@ -27,24 +47,8 @@ Array [ mount={[Function]} /> - , - }, - Object {}, - ], - ], - "results": Array [ - Object { - "type": "return", - "value": - - - - , + + , }, ], }, @@ -163,7 +167,47 @@ Array [ "calls": Array [ Array [ Object { - "children": + "children": + + + + + + , + }, + Object {}, + ], + Array [ + Object { + "children": + + + + + + , + }, + Object {}, + ], + ], + "results": Array [ + Object { + "type": "return", + "value": + @@ -172,13 +216,13 @@ Array [ mount={[Function]} /> - , - }, - Object {}, - ], - Array [ - Object { - "children": + + , + }, + Object { + "type": "return", + "value": + - , - }, - Object {}, - ], - ], - "results": Array [ - Object { - "type": "return", - "value": - - - - , - }, - Object { - "type": "return", - "value": - - - - , + + , }, ], }, @@ -335,7 +347,64 @@ Array [ "calls": Array [ Array [ Object { - "children": + "children": + + + + + + , + }, + Object {}, + ], + Array [ + Object { + "children": + + + + + + , + }, + Object {}, + ], + Array [ + Object { + "children": + + + Some message + + + , + }, + Object {}, + ], + ], + "results": Array [ + Object { + "type": "return", + "value": + @@ -344,13 +413,13 @@ Array [ mount={[Function]} /> - , - }, - Object {}, - ], - Array [ - Object { - "children": + + , + }, + Object { + "type": "return", + "value": + - , - }, - Object {}, - ], - Array [ - Object { - "children": + + , + }, + Object { + "type": "return", + "value": + Some message - , - }, - Object {}, - ], - ], - "results": Array [ - Object { - "type": "return", - "value": - - - - , - }, - Object { - "type": "return", - "value": - - - - , - }, - Object { - "type": "return", - "value": - - Some message - - , + + , }, ], }, @@ -456,7 +480,64 @@ Array [ "calls": Array [ Array [ Object { - "children": + "children": + + + + + + , + }, + Object {}, + ], + Array [ + Object { + "children": + + + + + + , + }, + Object {}, + ], + Array [ + Object { + "children": + + + Some message + + + , + }, + Object {}, + ], + ], + "results": Array [ + Object { + "type": "return", + "value": + @@ -465,13 +546,13 @@ Array [ mount={[Function]} /> - , - }, - Object {}, - ], - Array [ - Object { - "children": + + , + }, + Object { + "type": "return", + "value": + - , - }, - Object {}, - ], - Array [ - Object { - "children": + + , + }, + Object { + "type": "return", + "value": + Some message - , - }, - Object {}, - ], - ], - "results": Array [ - Object { - "type": "return", - "value": - - - - , - }, - Object { - "type": "return", - "value": - - - - , - }, - Object { - "type": "return", - "value": - - Some message - - , + + , }, ], }, @@ -582,7 +618,64 @@ Array [ "calls": Array [ Array [ Object { - "children": + "children": + + + + + + , + }, + Object {}, + ], + Array [ + Object { + "children": + + + + + + , + }, + Object {}, + ], + Array [ + Object { + "children": + + + Some message + + + , + }, + Object {}, + ], + ], + "results": Array [ + Object { + "type": "return", + "value": + @@ -591,13 +684,13 @@ Array [ mount={[Function]} /> - , - }, - Object {}, - ], - Array [ - Object { - "children": + + , + }, + Object { + "type": "return", + "value": + - , - }, - Object {}, - ], - Array [ - Object { - "children": + + , + }, + Object { + "type": "return", + "value": + Some message - , - }, - Object {}, - ], - ], - "results": Array [ - Object { - "type": "return", - "value": - - - - , - }, - Object { - "type": "return", - "value": - - - - , - }, - Object { - "type": "return", - "value": - - Some message - - , + + , }, ], }, @@ -703,7 +751,64 @@ Array [ "calls": Array [ Array [ Object { - "children": + "children": + + + + + + , + }, + Object {}, + ], + Array [ + Object { + "children": + + + + + + , + }, + Object {}, + ], + Array [ + Object { + "children": + + + Some message + + + , + }, + Object {}, + ], + ], + "results": Array [ + Object { + "type": "return", + "value": + @@ -712,13 +817,13 @@ Array [ mount={[Function]} /> - , - }, - Object {}, - ], - Array [ - Object { - "children": + + , + }, + Object { + "type": "return", + "value": + - , - }, - Object {}, - ], - Array [ - Object { - "children": + + , + }, + Object { + "type": "return", + "value": + Some message - , - }, - Object {}, - ], - ], - "results": Array [ - Object { - "type": "return", - "value": - - - - , - }, - Object { - "type": "return", - "value": - - - - , - }, - Object { - "type": "return", - "value": - - Some message - - , + + , }, ], }, @@ -891,7 +951,27 @@ Array [ "calls": Array [ Array [ Object { - "children": + "children": + + + + + + , + }, + Object {}, + ], + ], + "results": Array [ + Object { + "type": "return", + "value": + @@ -900,24 +980,8 @@ Array [ mount={[Function]} /> - , - }, - Object {}, - ], - ], - "results": Array [ - Object { - "type": "return", - "value": - - - - , + + , }, ], }, @@ -950,7 +1014,27 @@ Array [ "calls": Array [ Array [ Object { - "children": + "children": + + + + + + , + }, + Object {}, + ], + ], + "results": Array [ + Object { + "type": "return", + "value": + @@ -959,24 +1043,8 @@ Array [ mount={[Function]} /> - , - }, - Object {}, - ], - ], - "results": Array [ - Object { - "type": "return", - "value": - - - - , + + , }, ], }, @@ -1014,7 +1082,27 @@ Array [ "calls": Array [ Array [ Object { - "children": + "children": + + + + + + , + }, + Object {}, + ], + ], + "results": Array [ + Object { + "type": "return", + "value": + @@ -1023,24 +1111,8 @@ Array [ mount={[Function]} /> - , - }, - Object {}, - ], - ], - "results": Array [ - Object { - "type": "return", - "value": - - - - , + + , }, ], }, @@ -1073,7 +1145,27 @@ Array [ "calls": Array [ Array [ Object { - "children": + "children": + + + + + + , + }, + Object {}, + ], + ], + "results": Array [ + Object { + "type": "return", + "value": + @@ -1082,24 +1174,8 @@ Array [ mount={[Function]} /> - , - }, - Object {}, - ], - ], - "results": Array [ - Object { - "type": "return", - "value": - - - - , + + , }, ], }, diff --git a/packages/kbn-optimizer/limits.yml b/packages/kbn-optimizer/limits.yml index d796ccfc82ab0e..02a7b89621f58e 100644 --- a/packages/kbn-optimizer/limits.yml +++ b/packages/kbn-optimizer/limits.yml @@ -30,7 +30,7 @@ pageLoadAssetSize: data: 454087 dataViewEditor: 28082 dataViewFieldEditor: 27000 - dataViewManagement: 5000 + dataViewManagement: 5100 dataViews: 48300 dataVisualizer: 27530 devTools: 38637 diff --git a/packages/kbn-ui-shared-deps-src/BUILD.bazel b/packages/kbn-ui-shared-deps-src/BUILD.bazel index 49c2cc62dcfe57..95b9c7ac51e271 100644 --- a/packages/kbn-ui-shared-deps-src/BUILD.bazel +++ b/packages/kbn-ui-shared-deps-src/BUILD.bazel @@ -32,6 +32,7 @@ webpack_cli( "//packages/kbn-safer-lodash-set", "//packages/kbn-peggy", "//packages/kbn-peggy-loader", + "//packages/shared-ux/error_boundary", "//packages/kbn-rison", ], output_dir = True, diff --git a/packages/kbn-ui-shared-deps-src/src/definitions.js b/packages/kbn-ui-shared-deps-src/src/definitions.js index ae9dcd3b056f13..e95ff4ac0a7328 100644 --- a/packages/kbn-ui-shared-deps-src/src/definitions.js +++ b/packages/kbn-ui-shared-deps-src/src/definitions.js @@ -91,6 +91,7 @@ const externals = { '@kbn/es-query': '__kbnSharedDeps__.KbnEsQuery', '@kbn/std': '__kbnSharedDeps__.KbnStd', '@kbn/safer-lodash-set': '__kbnSharedDeps__.SaferLodashSet', + '@kbn/shared-ux-error-boundary': '__kbnSharedDeps__.KbnSharedUxErrorBoundary', '@kbn/rison': '__kbnSharedDeps__.KbnRison', history: '__kbnSharedDeps__.History', classnames: '__kbnSharedDeps__.Classnames', diff --git a/packages/kbn-ui-shared-deps-src/src/entry.js b/packages/kbn-ui-shared-deps-src/src/entry.js index 2491a34193e2e3..6e30acf963ab2e 100644 --- a/packages/kbn-ui-shared-deps-src/src/entry.js +++ b/packages/kbn-ui-shared-deps-src/src/entry.js @@ -66,6 +66,8 @@ export const KbnAnalytics = require('@kbn/analytics'); export const KbnEsQuery = require('@kbn/es-query'); export const KbnStd = require('@kbn/std'); export const SaferLodashSet = require('@kbn/safer-lodash-set'); + +export const KbnSharedUxErrorBoundary = require('@kbn/shared-ux-error-boundary'); export const KbnRison = require('@kbn/rison'); export const History = require('history'); export const Classnames = require('classnames'); diff --git a/packages/kbn-ui-shared-deps-src/tsconfig.json b/packages/kbn-ui-shared-deps-src/tsconfig.json index 54d86b5eeab76c..6b89a4adff0df8 100644 --- a/packages/kbn-ui-shared-deps-src/tsconfig.json +++ b/packages/kbn-ui-shared-deps-src/tsconfig.json @@ -26,6 +26,7 @@ "@kbn/rison", "@kbn/std", "@kbn/safer-lodash-set", - "@kbn/repo-info" + "@kbn/repo-info", + "@kbn/shared-ux-error-boundary" ] } diff --git a/packages/react/kibana_context/render/render_provider.tsx b/packages/react/kibana_context/render/render_provider.tsx index 7aee3d73ed0549..3deb8d91433cba 100644 --- a/packages/react/kibana_context/render/render_provider.tsx +++ b/packages/react/kibana_context/render/render_provider.tsx @@ -12,7 +12,7 @@ import { KibanaRootContextProvider, type KibanaRootContextProviderProps, } from '@kbn/react-kibana-context-root'; -import { EuiErrorBoundary } from '@elastic/eui'; +import { KibanaErrorBoundary, KibanaErrorBoundaryProvider } from '@kbn/shared-ux-error-boundary'; /** Props for the KibanaContextProvider */ export type KibanaRenderContextProviderProps = Omit; @@ -27,7 +27,9 @@ export const KibanaRenderContextProvider: FC = }) => { return ( - {children} + + {children} + ); }; diff --git a/packages/react/kibana_context/render/tsconfig.json b/packages/react/kibana_context/render/tsconfig.json index 61642a72eaec52..479f1a0ea50b14 100644 --- a/packages/react/kibana_context/render/tsconfig.json +++ b/packages/react/kibana_context/render/tsconfig.json @@ -17,5 +17,6 @@ ], "kbn_references": [ "@kbn/react-kibana-context-root", + "@kbn/shared-ux-error-boundary", ] } diff --git a/packages/shared-ux/error_boundary/BUILD.bazel b/packages/shared-ux/error_boundary/BUILD.bazel new file mode 100644 index 00000000000000..a0c94056aeb3a3 --- /dev/null +++ b/packages/shared-ux/error_boundary/BUILD.bazel @@ -0,0 +1,35 @@ +load("@build_bazel_rules_nodejs//:index.bzl", "js_library") + +SRCS = glob( + [ + "**/*.ts", + "**/*.tsx", + ], + exclude = [ + "**/test_helpers.ts", + "**/*.config.js", + "**/*.mock.*", + "**/*.test.*", + "**/*.stories.*", + "**/__snapshots__/**", + "**/integration_tests/**", + "**/mocks/**", + "**/scripts/**", + "**/storybook/**", + "**/test_fixtures/**", + "**/test_helpers/**", + ], +) + +BUNDLER_DEPS = [ + "@npm//react", + "@npm//tslib", +] + +js_library( + name = "error_boundary", + package_name = "@kbn/shared-ux-error-boundary", + srcs = ["package.json"] + SRCS, + deps = BUNDLER_DEPS, + visibility = ["//visibility:public"], +) diff --git a/packages/shared-ux/error_boundary/README.mdx b/packages/shared-ux/error_boundary/README.mdx new file mode 100644 index 00000000000000..005be45c16972b --- /dev/null +++ b/packages/shared-ux/error_boundary/README.mdx @@ -0,0 +1,16 @@ +--- +id: sharedUX/KibanaErrorBoundary +slug: /shared-ux/error_boundary/kibana_error_boundary +title: Kibana Error Boundary +description: Container to catch errors thrown by child component +tags: ['shared-ux', 'component', 'error', 'error_boundary'] +date: 2023-10-03 +--- + +## Description + +## API + +## EUI Promotion Status + +This component is specialized for error messages internal to Kibana and is not intended for promotion to EUI. diff --git a/packages/shared-ux/error_boundary/index.ts b/packages/shared-ux/error_boundary/index.ts new file mode 100644 index 00000000000000..77119fce15a90e --- /dev/null +++ b/packages/shared-ux/error_boundary/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 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 or the Server + * Side Public License, v 1. + */ + +export { KibanaErrorBoundary } from './src/ui/error_boundary'; +export { KibanaErrorBoundaryProvider } from './src/services/error_boundary_services'; diff --git a/packages/shared-ux/error_boundary/jest.config.js b/packages/shared-ux/error_boundary/jest.config.js new file mode 100644 index 00000000000000..7bb04347d113c7 --- /dev/null +++ b/packages/shared-ux/error_boundary/jest.config.js @@ -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 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 or the Server + * Side Public License, v 1. + */ + +module.exports = { + preset: '@kbn/test', + rootDir: '../../..', + roots: ['/packages/shared-ux/error_boundary'], +}; diff --git a/packages/shared-ux/error_boundary/kibana.jsonc b/packages/shared-ux/error_boundary/kibana.jsonc new file mode 100644 index 00000000000000..c7e6f9b5179621 --- /dev/null +++ b/packages/shared-ux/error_boundary/kibana.jsonc @@ -0,0 +1,5 @@ +{ + "type": "shared-common", + "id": "@kbn/shared-ux-error-boundary", + "owner": "@elastic/appex-sharedux" +} diff --git a/packages/shared-ux/error_boundary/mocks/index.ts b/packages/shared-ux/error_boundary/mocks/index.ts new file mode 100644 index 00000000000000..fb05bfe41bc1fe --- /dev/null +++ b/packages/shared-ux/error_boundary/mocks/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 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 or the Server + * Side Public License, v 1. + */ + +export { BadComponent } from './src/bad_component'; +export { ChunkLoadErrorComponent } from './src/chunk_load_error_component'; +export { getServicesMock } from './src/jest'; +export { KibanaErrorBoundaryStorybookMock } from './src/storybook'; diff --git a/packages/shared-ux/error_boundary/mocks/src/bad_component.tsx b/packages/shared-ux/error_boundary/mocks/src/bad_component.tsx new file mode 100644 index 00000000000000..90d5afd9015e21 --- /dev/null +++ b/packages/shared-ux/error_boundary/mocks/src/bad_component.tsx @@ -0,0 +1,31 @@ +/* + * 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 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 or the Server + * Side Public License, v 1. + */ + +import { EuiButton } from '@elastic/eui'; +import { action } from '@storybook/addon-actions'; +import React, { useState } from 'react'; + +export const BadComponent = () => { + const [hasError, setHasError] = useState(false); + + if (hasError) { + throw new Error('This is an error to show the test user!'); // custom error + } + + const clickedForError = action('clicked for error'); + const handleClick = () => { + clickedForError(); + setHasError(true); + }; + + return ( + + Click for error + + ); +}; diff --git a/packages/shared-ux/error_boundary/mocks/src/chunk_load_error_component.tsx b/packages/shared-ux/error_boundary/mocks/src/chunk_load_error_component.tsx new file mode 100644 index 00000000000000..0df91a8fb3ca8b --- /dev/null +++ b/packages/shared-ux/error_boundary/mocks/src/chunk_load_error_component.tsx @@ -0,0 +1,33 @@ +/* + * 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 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 or the Server + * Side Public License, v 1. + */ + +import { EuiButton } from '@elastic/eui'; +import { action } from '@storybook/addon-actions'; +import React, { useState } from 'react'; + +export const ChunkLoadErrorComponent = () => { + const [hasError, setHasError] = useState(false); + + if (hasError) { + const chunkError = new Error('Could not load chunk'); + chunkError.name = 'ChunkLoadError'; // specific error known to be recoverable with a click of a refresh button + throw chunkError; + } + + const clickedForError = action('clicked for error'); + const handleClick = () => { + clickedForError(); + setHasError(true); + }; + + return ( + + Click for error + + ); +}; diff --git a/packages/shared-ux/error_boundary/mocks/src/jest.ts b/packages/shared-ux/error_boundary/mocks/src/jest.ts new file mode 100644 index 00000000000000..3a23d58e6083cb --- /dev/null +++ b/packages/shared-ux/error_boundary/mocks/src/jest.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 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 or the Server + * Side Public License, v 1. + */ + +import { KibanaErrorService } from '../../src/services/error_service'; +import { KibanaErrorBoundaryServices } from '../../types'; + +export const getServicesMock = (): KibanaErrorBoundaryServices => { + return { + onClickRefresh: jest.fn().mockResolvedValue(undefined), + errorService: new KibanaErrorService(), + }; +}; diff --git a/packages/shared-ux/error_boundary/mocks/src/storybook.ts b/packages/shared-ux/error_boundary/mocks/src/storybook.ts new file mode 100644 index 00000000000000..af044acd0301d4 --- /dev/null +++ b/packages/shared-ux/error_boundary/mocks/src/storybook.ts @@ -0,0 +1,43 @@ +/* + * 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 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 or the Server + * Side Public License, v 1. + */ + +import { AbstractStorybookMock } from '@kbn/shared-ux-storybook-mock'; +import { action } from '@storybook/addon-actions'; +import { KibanaErrorService } from '../../src/services/error_service'; +import { KibanaErrorBoundaryServices } from '../../types'; + +// eslint-disable-next-line @typescript-eslint/no-empty-interface +export interface Params {} + +export class KibanaErrorBoundaryStorybookMock extends AbstractStorybookMock< + {}, + KibanaErrorBoundaryServices +> { + propArguments = {}; + + serviceArguments = {}; + + dependencies = []; + + getServices(params: Params = {}): KibanaErrorBoundaryServices { + const reloadWindowAction = action('Reload window'); + const onClickRefresh = () => { + reloadWindowAction(); + }; + + return { + ...params, + onClickRefresh, + errorService: new KibanaErrorService(), + }; + } + + getProps(params: Params) { + return params; + } +} diff --git a/packages/shared-ux/error_boundary/mocks/src/storybook_template.tsx b/packages/shared-ux/error_boundary/mocks/src/storybook_template.tsx new file mode 100644 index 00000000000000..e120cc5d3584f1 --- /dev/null +++ b/packages/shared-ux/error_boundary/mocks/src/storybook_template.tsx @@ -0,0 +1,36 @@ +/* + * 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 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 or the Server + * Side Public License, v 1. + */ + +import React, { FC } from 'react'; + +import { + EuiCollapsibleNavBeta, + EuiHeader, + EuiHeaderSection, + EuiLink, + EuiPageTemplate, +} from '@elastic/eui'; + +export const Template: FC = ({ children }) => { + return ( + <> + + + + + + + + {children} + + Contact us + + + + ); +}; diff --git a/packages/shared-ux/error_boundary/package.json b/packages/shared-ux/error_boundary/package.json new file mode 100644 index 00000000000000..5fdc7a08be2032 --- /dev/null +++ b/packages/shared-ux/error_boundary/package.json @@ -0,0 +1,6 @@ +{ + "name": "@kbn/shared-ux-error-boundary", + "private": true, + "version": "1.0.0", + "license": "SSPL-1.0 OR Elastic License 2.0" +} \ No newline at end of file diff --git a/packages/shared-ux/error_boundary/src/services/error_boundary_services.tsx b/packages/shared-ux/error_boundary/src/services/error_boundary_services.tsx new file mode 100644 index 00000000000000..f72880953eeb5b --- /dev/null +++ b/packages/shared-ux/error_boundary/src/services/error_boundary_services.tsx @@ -0,0 +1,54 @@ +/* + * 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 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 or the Server + * Side Public License, v 1. + */ + +import React, { FC, useContext, useMemo } from 'react'; + +import { KibanaErrorBoundaryServices } from '../../types'; +import { KibanaErrorService } from './error_service'; + +const Context = React.createContext(null); + +/** + * A Context Provider for Jest and Storybooks + */ +export const KibanaErrorBoundaryDepsProvider: FC = ({ + children, + onClickRefresh, + errorService, +}) => { + return {children}; +}; + +/** + * Kibana-specific Provider that maps dependencies to services. + */ +export const KibanaErrorBoundaryProvider: FC = ({ children }) => { + const value: KibanaErrorBoundaryServices = useMemo( + () => ({ + onClickRefresh: () => window.location.reload(), + errorService: new KibanaErrorService(), + }), + [] + ); + + return {children}; +}; + +/** + * React hook for accessing pre-wired services. + */ +export function useErrorBoundary(): KibanaErrorBoundaryServices { + const context = useContext(Context); + if (!context) { + throw new Error( + 'Kibana Error Boundary Context is missing. Ensure your component or React root is wrapped with Kibana Error Boundary Context.' + ); + } + + return context; +} diff --git a/packages/shared-ux/error_boundary/src/services/error_service.test.ts b/packages/shared-ux/error_boundary/src/services/error_service.test.ts new file mode 100644 index 00000000000000..779d79195b60aa --- /dev/null +++ b/packages/shared-ux/error_boundary/src/services/error_service.test.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 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 or the Server + * Side Public License, v 1. + */ + +import { KibanaErrorService } from './error_service'; + +describe('KibanaErrorBoundary KibanaErrorService', () => { + const service = new KibanaErrorService(); + + it('construction', () => { + expect(service).toHaveProperty('registerError'); + }); + + it('decorates fatal error object', () => { + const testFatal = new Error('This is an unrecognized and fatal error'); + const serviceError = service.registerError(testFatal, {}); + + expect(serviceError.isFatal).toBe(true); + }); + + it('decorates recoverable error object', () => { + const testRecoverable = new Error('Could not load chunk blah blah'); + testRecoverable.name = 'ChunkLoadError'; + const serviceError = service.registerError(testRecoverable, {}); + + expect(serviceError.isFatal).toBe(false); + }); + + it('derives component name', () => { + const testFatal = new Error('This is an unrecognized and fatal error'); + + const errorInfo = { + componentStack: ` + at BadComponent (http://localhost:9001/main.iframe.bundle.js:11616:73) + at ErrorBoundaryInternal (http://localhost:9001/main.iframe.bundle.js:12232:81) + at KibanaErrorBoundary (http://localhost:9001/main.iframe.bundle.js:12295:116) + at KibanaErrorBoundaryDepsProvider (http://localhost:9001/main.iframe.bundle.js:11879:23) + at div + at http://localhost:9001/kbn-ui-shared-deps-npm.dll.js:164499:73 + at section + at http://localhost:9001/kbn-ui-shared-deps-npm.dll.js`, + }; + + const serviceError = service.registerError(testFatal, errorInfo); + + expect(serviceError.name).toBe('BadComponent'); + }); +}); diff --git a/packages/shared-ux/error_boundary/src/services/error_service.ts b/packages/shared-ux/error_boundary/src/services/error_service.ts new file mode 100644 index 00000000000000..99d2b1488cc3c9 --- /dev/null +++ b/packages/shared-ux/error_boundary/src/services/error_service.ts @@ -0,0 +1,79 @@ +/* + * 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 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 or the Server + * Side Public License, v 1. + */ + +import React from 'react'; + +const MATCH_CHUNK_LOADERROR = /ChunkLoadError/; + +interface ErrorServiceError { + error: Error; + errorInfo?: Partial | null; + name: string | null; + isFatal: boolean; +} + +/** + * Kibana Error Boundary Services: Error Service + * Each Error Boundary tracks an instance of this class + * @internal + */ +export class KibanaErrorService { + /** + * Determines if the error fallback UI should appear as an apologetic but promising "Refresh" button, + * or treated with "danger" coloring and include a detailed error message. + */ + private getIsFatal(error: Error) { + const isChunkLoadError = MATCH_CHUNK_LOADERROR.test(error.name); + return !isChunkLoadError; // "ChunkLoadError" is recoverable by refreshing the page + } + + /** + * Derive the name of the component that threw the error + */ + private getErrorComponentName(errorInfo: Partial | null) { + let errorComponentName: string | null = null; + const stackLines = errorInfo?.componentStack?.split('\n'); + const errorIndicator = /^ at (\S+).*/; + + if (stackLines) { + let i = 0; + while (i < stackLines.length - 1) { + // scan the stack trace text + if (stackLines[i].match(errorIndicator)) { + // extract the name of the bad component + errorComponentName = stackLines[i].replace(errorIndicator, '$1'); + if (errorComponentName) { + break; + } + } + i++; + } + } + + return errorComponentName; + } + + /** + * Creates a decorated error object + * TODO: capture telemetry + */ + public registerError( + error: Error, + errorInfo: Partial | null + ): ErrorServiceError { + const isFatal = this.getIsFatal(error); + const name = this.getErrorComponentName(errorInfo); + + return { + error, + errorInfo, + isFatal, + name, + }; + } +} diff --git a/packages/shared-ux/error_boundary/src/ui/error_boundary.fatal.stories.tsx b/packages/shared-ux/error_boundary/src/ui/error_boundary.fatal.stories.tsx new file mode 100644 index 00000000000000..20fa5b3818e089 --- /dev/null +++ b/packages/shared-ux/error_boundary/src/ui/error_boundary.fatal.stories.tsx @@ -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 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 or the Server + * Side Public License, v 1. + */ + +import { Meta, Story } from '@storybook/react'; +import React from 'react'; + +import { Template } from '../../mocks/src/storybook_template'; +import { BadComponent, KibanaErrorBoundaryStorybookMock } from '../../mocks'; +import { KibanaErrorBoundaryDepsProvider } from '../services/error_boundary_services'; +import { KibanaErrorBoundary } from './error_boundary'; + +import mdx from '../../README.mdx'; + +const storybookMock = new KibanaErrorBoundaryStorybookMock(); + +export default { + title: 'Errors/Fatal Errors', + description: + 'This is the Kibana Error Boundary. Use this to put a boundary around React components that may throw errors when rendering. It will intercept the error and determine if it is fatal or recoverable.', + parameters: { + docs: { + page: mdx, + }, + }, +} as Meta; + +export const ErrorInCallout: Story = () => { + const services = storybookMock.getServices(); + + return ( + + ); +}; diff --git a/packages/shared-ux/error_boundary/src/ui/error_boundary.recoverable.stories.tsx b/packages/shared-ux/error_boundary/src/ui/error_boundary.recoverable.stories.tsx new file mode 100644 index 00000000000000..a44c1d5022ca4e --- /dev/null +++ b/packages/shared-ux/error_boundary/src/ui/error_boundary.recoverable.stories.tsx @@ -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 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 or the Server + * Side Public License, v 1. + */ + +import { Meta, Story } from '@storybook/react'; +import React from 'react'; + +import { Template } from '../../mocks/src/storybook_template'; +import { ChunkLoadErrorComponent, KibanaErrorBoundaryStorybookMock } from '../../mocks'; +import { KibanaErrorBoundaryDepsProvider } from '../services/error_boundary_services'; +import { KibanaErrorBoundary } from './error_boundary'; + +import mdx from '../../README.mdx'; + +const storybookMock = new KibanaErrorBoundaryStorybookMock(); + +export default { + title: 'Errors/Recoverable Errors', + description: + 'This is the Kibana Error Boundary.' + + ' Use this to put a boundary around React components that may throw errors when rendering.' + + ' It will intercept the error and determine if it is fatal or recoverable.', + parameters: { + docs: { + page: mdx, + }, + }, +} as Meta; + +export const ErrorInCallout: Story = () => { + const services = storybookMock.getServices(); + + return ( + + ); +}; diff --git a/packages/shared-ux/error_boundary/src/ui/error_boundary.test.tsx b/packages/shared-ux/error_boundary/src/ui/error_boundary.test.tsx new file mode 100644 index 00000000000000..6cccee1b7881fb --- /dev/null +++ b/packages/shared-ux/error_boundary/src/ui/error_boundary.test.tsx @@ -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 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 or the Server + * Side Public License, v 1. + */ + +import { render } from '@testing-library/react'; +import React, { FC } from 'react'; + +import { KibanaErrorBoundary } from '../..'; +import { BadComponent, ChunkLoadErrorComponent, getServicesMock } from '../../mocks'; +import { KibanaErrorBoundaryServices } from '../../types'; +import { errorMessageStrings as strings } from './message_strings'; +import { KibanaErrorBoundaryDepsProvider } from '../services/error_boundary_services'; + +describe('', () => { + let services: KibanaErrorBoundaryServices; + beforeEach(() => { + services = getServicesMock(); + }); + + const Template: FC = ({ children }) => { + return ( + + {children} + + ); + }; + + it('allow children to render when there is no error', () => { + const inputText = 'Hello, beautiful world.'; + const res = render(); + expect(res.getByText(inputText)).toBeInTheDocument(); + }); + + it('renders a "soft" callout when an unknown error is caught', async () => { + const reloadSpy = jest.spyOn(services, 'onClickRefresh'); + + const { findByTestId, findByText } = render( + + ); + (await findByTestId('clickForErrorBtn')).click(); + + expect(await findByText(strings.recoverable.callout.title())).toBeVisible(); + expect(await findByText(strings.recoverable.callout.pageReloadButton())).toBeVisible(); + + (await findByTestId('recoverablePromptReloadBtn')).click(); + + expect(reloadSpy).toHaveBeenCalledTimes(1); + }); + + it('renders a fatal callout when an unknown error is caught', async () => { + const reloadSpy = jest.spyOn(services, 'onClickRefresh'); + + const { findByTestId, findByText } = render( + + ); + (await findByTestId('clickForErrorBtn')).click(); + + expect(await findByText(strings.fatal.callout.title())).toBeVisible(); + expect(await findByText(strings.fatal.callout.body())).toBeVisible(); + expect(await findByText(strings.fatal.callout.showDetailsButton())).toBeVisible(); + expect(await findByText(strings.fatal.callout.pageReloadButton())).toBeVisible(); + + (await findByTestId('fatalPromptReloadBtn')).click(); + + expect(reloadSpy).toHaveBeenCalledTimes(1); + }); +}); diff --git a/packages/shared-ux/error_boundary/src/ui/error_boundary.tsx b/packages/shared-ux/error_boundary/src/ui/error_boundary.tsx new file mode 100644 index 00000000000000..9a456f597320f4 --- /dev/null +++ b/packages/shared-ux/error_boundary/src/ui/error_boundary.tsx @@ -0,0 +1,89 @@ +/* + * 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 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 or the Server + * Side Public License, v 1. + */ + +import React from 'react'; + +import { KibanaErrorBoundaryServices } from '../../types'; +import { useErrorBoundary } from '../services/error_boundary_services'; +import { FatalPrompt, RecoverablePrompt } from './message_components'; + +interface ErrorBoundaryState { + error: null | Error; + errorInfo: null | Partial; + componentName: null | string; + isFatal: null | boolean; +} + +interface ErrorBoundaryProps { + children?: React.ReactNode; +} + +interface ServiceContext { + services: KibanaErrorBoundaryServices; +} + +class ErrorBoundaryInternal extends React.Component< + ErrorBoundaryProps & ServiceContext, + ErrorBoundaryState +> { + constructor(props: ErrorBoundaryProps & ServiceContext) { + super(props); + this.state = { + error: null, + errorInfo: null, + componentName: null, + isFatal: null, + }; + } + + componentDidCatch(error: Error, errorInfo: Partial) { + const { name, isFatal } = this.props.services.errorService.registerError(error, errorInfo); + this.setState(() => { + return { error, errorInfo, componentName: name, isFatal }; + }); + } + + render() { + if (this.state.error != null) { + const { error, errorInfo, componentName, isFatal } = this.state; + + if (isFatal) { + return ( + + ); + } else { + return ( + + ); + } + } + + // not in error state + return this.props.children; + } +} + +/** + * Implementation of Kibana Error Boundary + * @param {ErrorBoundaryProps} props - ErrorBoundaryProps + * @public + */ +export const KibanaErrorBoundary = (props: ErrorBoundaryProps) => { + const services = useErrorBoundary(); + return ; +}; diff --git a/packages/shared-ux/error_boundary/src/ui/message_components.tsx b/packages/shared-ux/error_boundary/src/ui/message_components.tsx new file mode 100644 index 00000000000000..568e75f6fa4266 --- /dev/null +++ b/packages/shared-ux/error_boundary/src/ui/message_components.tsx @@ -0,0 +1,141 @@ +/* + * 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 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 or the Server + * Side Public License, v 1. + */ + +import React, { useState } from 'react'; + +import { + EuiButton, + EuiCodeBlock, + EuiEmptyPrompt, + EuiFlyout, + EuiFlyoutBody, + EuiFlyoutHeader, + EuiFlyoutFooter, + EuiLink, + EuiTitle, + useGeneratedHtmlId, + EuiFlexGroup, + EuiFlexItem, + EuiButtonEmpty, + EuiCopy, +} from '@elastic/eui'; + +import { errorMessageStrings as strings } from './message_strings'; + +export interface ErrorCalloutProps { + error: Error; + errorInfo: Partial | null; + name: string | null; + onClickRefresh: () => void; +} + +const CodePanel: React.FC void }> = (props) => { + const { error, errorInfo, name: errorComponentName, onClose } = props; + const simpleFlyoutTitleId = useGeneratedHtmlId({ + prefix: 'simpleFlyoutTitle', + }); + + const errorMessage = errorComponentName + ? strings.fatal.callout.details.componentName(errorComponentName) + : error.message; + const errorTrace = errorInfo?.componentStack ?? error.stack ?? error.toString(); + + return ( + + + +

{strings.fatal.callout.details.title()}

+
+
+ + +

{errorMessage}

+

{errorTrace}

+
+
+ + + + + {strings.fatal.callout.details.closeButton()} + + + + + {(copy) => ( + + {strings.fatal.callout.details.copyToClipboardButton()} + + )} + + + + +
+ ); +}; + +export const FatalPrompt: React.FC = (props) => { + const { onClickRefresh } = props; + const [isFlyoutVisible, setIsFlyoutVisible] = useState(false); + + return ( + {strings.fatal.callout.title()}} + color="danger" + iconType="error" + body={ + <> +

{strings.fatal.callout.body()}

+

+ + {strings.fatal.callout.pageReloadButton()} + +

+

+ setIsFlyoutVisible(true)}> + {strings.fatal.callout.showDetailsButton()} + + {isFlyoutVisible ? ( + setIsFlyoutVisible(false)} /> + ) : null} +

+ + } + /> + ); +}; + +export const RecoverablePrompt = (props: ErrorCalloutProps) => { + const { onClickRefresh } = props; + return ( + {strings.recoverable.callout.title()}} + body={

{strings.recoverable.callout.body()}

} + color="warning" + actions={ + + {strings.recoverable.callout.pageReloadButton()} + + } + /> + ); +}; diff --git a/packages/shared-ux/error_boundary/src/ui/message_strings.ts b/packages/shared-ux/error_boundary/src/ui/message_strings.ts new file mode 100644 index 00000000000000..08bb325e322f3f --- /dev/null +++ b/packages/shared-ux/error_boundary/src/ui/message_strings.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 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 or the Server + * Side Public License, v 1. + */ + +import { i18n } from '@kbn/i18n'; + +export const errorMessageStrings = { + fatal: { + callout: { + title: () => + i18n.translate('sharedUXPackages.error_boundary.fatal.prompt.title', { + defaultMessage: 'Unable to load page', + }), + body: () => + i18n.translate('sharedUXPackages.error_boundary.fatal.prompt.body', { + defaultMessage: 'Try refreshing the page to resolve the issue.', + }), + showDetailsButton: () => + i18n.translate('sharedUXPackages.error_boundary.fatal.prompt.detailButton', { + defaultMessage: 'Show details', + }), + details: { + title: () => + i18n.translate('sharedUXPackages.error_boundary.fatal.prompt.details.title', { + defaultMessage: 'Error details', + }), + componentName: (errorComponentName: string) => + i18n.translate('sharedUXPackages.error_boundary.fatal.prompt.details', { + defaultMessage: 'An error occurred in {name}:', + values: { name: errorComponentName }, + }), + closeButton: () => + i18n.translate('sharedUXPackages.error_boundary.fatal.prompt.details.close', { + defaultMessage: 'Close', + }), + copyToClipboardButton: () => + i18n.translate('sharedUXPackages.error_boundary.fatal.prompt.details.copyToClipboard', { + defaultMessage: 'Copy error to clipboard', + }), + }, + pageReloadButton: () => + i18n.translate('sharedUXPackages.error_boundary.fatal.prompt.pageReloadButton', { + defaultMessage: 'Refresh page', + }), + }, + }, + recoverable: { + callout: { + title: () => + i18n.translate('sharedUXPackages.error_boundary.recoverable.prompt.title', { + defaultMessage: 'Refresh the page', + }), + body: () => + i18n.translate('sharedUXPackages.error_boundary.recoverable.prompt.body', { + defaultMessage: 'A refresh fixes problems caused by upgrades or being offline.', + }), + pageReloadButton: () => + i18n.translate('sharedUXPackages.error_boundary.recoverable.prompt.pageReloadButton', { + defaultMessage: 'Refresh page', + }), + }, + }, +}; diff --git a/packages/shared-ux/error_boundary/tsconfig.json b/packages/shared-ux/error_boundary/tsconfig.json new file mode 100644 index 00000000000000..8a3cb2b5301d61 --- /dev/null +++ b/packages/shared-ux/error_boundary/tsconfig.json @@ -0,0 +1,25 @@ +{ + "extends": "../../../tsconfig.base.json", + "compilerOptions": { + "outDir": "target/types", + "types": [ + "jest", + "react", + "@emotion/react/types/css-prop", + "@testing-library/jest-dom", + "@testing-library/react", + "@kbn/ambient-ui-types" + ] + }, + "include": [ + "**/*.ts", + "**/*.tsx" + ], + "exclude": [ + "target/**/*" + ], + "kbn_references": [ + "@kbn/shared-ux-storybook-mock", + "@kbn/i18n", + ] +} diff --git a/packages/shared-ux/error_boundary/types.ts b/packages/shared-ux/error_boundary/types.ts new file mode 100644 index 00000000000000..8b4d960a30cad2 --- /dev/null +++ b/packages/shared-ux/error_boundary/types.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 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 or the Server + * Side Public License, v 1. + */ + +import { KibanaErrorService } from './src/services/error_service'; + +/** + * Services that are consumed internally in this component. + * @internal + */ +export interface KibanaErrorBoundaryServices { + onClickRefresh: () => void; + errorService: KibanaErrorService; +} diff --git a/tsconfig.base.json b/tsconfig.base.json index 2da5e2023b35cd..56ba0de5dafb60 100644 --- a/tsconfig.base.json +++ b/tsconfig.base.json @@ -1356,6 +1356,8 @@ "@kbn/shared-ux-card-no-data-types/*": ["packages/shared-ux/card/no_data/types/*"], "@kbn/shared-ux-chrome-navigation": ["packages/shared-ux/chrome/navigation"], "@kbn/shared-ux-chrome-navigation/*": ["packages/shared-ux/chrome/navigation/*"], + "@kbn/shared-ux-error-boundary": ["packages/shared-ux/error_boundary"], + "@kbn/shared-ux-error-boundary/*": ["packages/shared-ux/error_boundary/*"], "@kbn/shared-ux-file-context": ["packages/shared-ux/file/context"], "@kbn/shared-ux-file-context/*": ["packages/shared-ux/file/context/*"], "@kbn/shared-ux-file-image": ["packages/shared-ux/file/image/impl"], diff --git a/yarn.lock b/yarn.lock index 494e5324d4d839..4030af3bd91dc2 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5616,6 +5616,10 @@ version "0.0.0" uid "" +"@kbn/shared-ux-error-boundary@link:packages/shared-ux/error_boundary": + version "0.0.0" + uid "" + "@kbn/shared-ux-file-context@link:packages/shared-ux/file/context": version "0.0.0" uid "" From 4d1618ef41f9b7f23f15b692604b032fb44c19d7 Mon Sep 17 00:00:00 2001 From: Paul Tavares <56442535+paul-tavares@users.noreply.github.com> Date: Mon, 23 Oct 2023 10:59:55 -0400 Subject: [PATCH 07/68] [Security Solution][Endpoint] Remove `@brokenInServerless` tag from all serverless tests (#168035) ## Summary My purpose of this change is to enable as many test suites as possible to run in serverless. Changes included: - Re-enables running tests in serverless by removing the `@brokenInServerless` tag from (some) tests - A new common function for creating instances of `ToolingLog`: `createToolingLogger()` - Allows for us to control the default log level for all instances created - Will assist with enabling higher levels of logging across our tooling if desired - Replaced most usages of `new ToolingLog()` with `createToolingLogger()` - A new cypress configuration env. variable was introduced: `TOOLING_LOG_LEVEL` - Can be used to control the log levels for instances of `ToolingLog` used by our utilities - Several data loading utilities were wrapped with `UsageTracker.track()` in order to enable investigations around slow utility processing --------- Co-authored-by: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> --- .../endpoint/data_loaders/index_alerts.ts | 96 +++-- .../index_endpoint_fleet_actions.ts | 401 ++++++++++-------- .../data_loaders/index_endpoint_hosts.ts | 324 +++++++------- .../index_endpoint_rule_alerts.ts | 8 +- .../data_loaders/index_fleet_agent.ts | 125 ++++-- .../index_fleet_endpoint_policy.ts | 169 ++++---- .../data_loaders/index_fleet_server.ts | 70 +-- .../data_loaders/setup_fleet_for_endpoint.ts | 229 +++++----- .../endpoint/data_loaders/usage_tracker.ts | 237 ++++++++++- .../common/endpoint/data_loaders/utils.ts | 33 +- .../common/endpoint/generate_data.ts | 54 ++- .../common/endpoint/index_data.ts | 182 ++++---- .../common/endpoint/utils/package.ts | 34 +- .../common/endpoint/utils/transforms.ts | 118 +++--- .../management/cypress/cypress_base.config.ts | 17 + .../artifact_tabs_in_policy_details.cy.ts | 243 ++++++----- .../cypress/e2e/artifacts/artifacts.cy.ts | 2 +- .../e2e/artifacts/artifacts_mocked_data.cy.ts | 2 +- .../automated_response_actions.cy.ts | 11 +- .../e2e/automated_response_actions/form.cy.ts | 308 +++++++------- .../history_log.cy.ts | 9 +- .../no_license.cy.ts | 3 +- .../automated_response_actions/results.cy.ts | 84 ++-- .../cypress/e2e/endpoint_alerts.cy.ts | 120 +++--- .../cypress/e2e/endpoint_list/endpoints.cy.ts | 2 +- .../cypress/e2e/policy/policy_details.cy.ts | 13 +- ...olicy_experimental_features_disabled.cy.ts | 143 ++++--- .../cypress/e2e/policy/policy_list.cy.ts | 3 + .../e2e/response_actions/isolate.cy.ts | 378 +++++++++-------- .../isolate_mocked_data.cy.ts | 175 ++++---- .../reponse_actions_history.cy.ts | 104 +++-- .../e2e/response_actions/responder.cy.ts | 21 +- .../response_console_actions.cy.ts | 2 +- .../response_console_mocked_data.cy.ts | 6 +- .../cypress/support/data_loaders.ts | 4 +- .../plugin_handlers/endpoint_data_loader.ts | 6 +- .../support/setup_tooling_log_level.ts | 24 ++ .../endpoint/common/base_running_service.ts | 5 +- .../common/delete_all_endpoint_data.ts | 7 +- .../endpoint/common/endpoint_host_services.ts | 8 +- .../fleet_server/fleet_server_services.ts | 25 +- .../scripts/endpoint/common/fleet_services.ts | 5 +- .../scripts/endpoint/common/stack_services.ts | 38 +- .../endpoint/endpoint_agent_runner/runtime.ts | 4 +- .../endpoint/resolver_generator_script.ts | 8 +- .../scripts/endpoint/trusted_apps/index.ts | 3 +- 46 files changed, 2195 insertions(+), 1668 deletions(-) create mode 100644 x-pack/plugins/security_solution/public/management/cypress/support/setup_tooling_log_level.ts diff --git a/x-pack/plugins/security_solution/common/endpoint/data_loaders/index_alerts.ts b/x-pack/plugins/security_solution/common/endpoint/data_loaders/index_alerts.ts index ed82bfac0b665e..4ae8dd7c3d147a 100644 --- a/x-pack/plugins/security_solution/common/endpoint/data_loaders/index_alerts.ts +++ b/x-pack/plugins/security_solution/common/endpoint/data_loaders/index_alerts.ts @@ -6,6 +6,7 @@ */ import type { Client } from '@elastic/elasticsearch'; +import { usageTracker } from './usage_tracker'; import type { EndpointDocGenerator, Event, TreeOptions } from '../generate_data'; import { firstNonNullValue } from '../models/ecs_safety_helpers'; @@ -23,52 +24,55 @@ function delay(ms: number) { * @param numAlerts * @param options */ -export async function indexAlerts({ - client, - eventIndex, - alertIndex, - generator, - numAlerts, - options = {}, -}: { - client: Client; - eventIndex: string; - alertIndex: string; - generator: EndpointDocGenerator; - numAlerts: number; - options: TreeOptions; -}) { - const alertGenerator = generator.alertsGenerator(numAlerts, options); - let result = alertGenerator.next(); - while (!result.done) { - let k = 0; - const resolverDocs: Event[] = []; - while (k < 1000 && !result.done) { - resolverDocs.push(result.value); - result = alertGenerator.next(); - k++; +export const indexAlerts = usageTracker.track( + 'indexAlerts', + async ({ + client, + eventIndex, + alertIndex, + generator, + numAlerts, + options = {}, + }: { + client: Client; + eventIndex: string; + alertIndex: string; + generator: EndpointDocGenerator; + numAlerts: number; + options: TreeOptions; + }) => { + const alertGenerator = generator.alertsGenerator(numAlerts, options); + let result = alertGenerator.next(); + while (!result.done) { + let k = 0; + const resolverDocs: Event[] = []; + while (k < 1000 && !result.done) { + resolverDocs.push(result.value); + result = alertGenerator.next(); + k++; + } + const body = resolverDocs.reduce( + // eslint-disable-next-line @typescript-eslint/no-explicit-any + (array: Array>, doc) => { + let index = eventIndex; + if (firstNonNullValue(doc.event?.kind) === 'alert') { + index = alertIndex; + } + array.push({ create: { _index: index } }, doc); + return array; + }, + [] + ); + await client.bulk({ body, refresh: 'wait_for' }); } - const body = resolverDocs.reduce( - // eslint-disable-next-line @typescript-eslint/no-explicit-any - (array: Array>, doc) => { - let index = eventIndex; - if (firstNonNullValue(doc.event?.kind) === 'alert') { - index = alertIndex; - } - array.push({ create: { _index: index } }, doc); - return array; - }, - [] - ); - await client.bulk({ body, refresh: 'wait_for' }); - } - await client.indices.refresh({ - index: eventIndex, - }); + await client.indices.refresh({ + index: eventIndex, + }); - // TODO: Unclear why the documents are not showing up after the call to refresh. - // Waiting 5 seconds allows the indices to refresh automatically and - // the documents become available in API/integration tests. - await delay(5000); -} + // TODO: Unclear why the documents are not showing up after the call to refresh. + // Waiting 5 seconds allows the indices to refresh automatically and + // the documents become available in API/integration tests. + await delay(5000); + } +); diff --git a/x-pack/plugins/security_solution/common/endpoint/data_loaders/index_endpoint_fleet_actions.ts b/x-pack/plugins/security_solution/common/endpoint/data_loaders/index_endpoint_fleet_actions.ts index 73b8f38030968d..f94f148765ba5c 100644 --- a/x-pack/plugins/security_solution/common/endpoint/data_loaders/index_endpoint_fleet_actions.ts +++ b/x-pack/plugins/security_solution/common/endpoint/data_loaders/index_endpoint_fleet_actions.ts @@ -8,6 +8,9 @@ import type { Client } from '@elastic/elasticsearch'; import type * as estypes from '@elastic/elasticsearch/lib/api/typesWithBodyKey'; import { AGENT_ACTIONS_INDEX, AGENT_ACTIONS_RESULTS_INDEX } from '@kbn/fleet-plugin/common'; +import type { BulkRequest } from '@elastic/elasticsearch/lib/api/types'; +import { EndpointError } from '../errors'; +import { usageTracker } from './usage_tracker'; import type { EndpointAction, EndpointActionResponse, @@ -28,7 +31,9 @@ export interface IndexedEndpointAndFleetActionsForHostResponse { actionResponses: EndpointActionResponse[]; actionsIndex: string; responsesIndex: string; + /** @deprecated */ endpointActions: LogsEndpointAction[]; + /** @deprecated */ endpointActionResponses: LogsEndpointActionResponse[]; endpointActionsIndex: string; endpointActionResponsesIndex: string; @@ -47,223 +52,253 @@ export interface IndexEndpointAndFleetActionsForHostOptions { * @param endpointHost * @param options */ -export const indexEndpointAndFleetActionsForHost = async ( - esClient: Client, - endpointHost: HostMetadata, - options: IndexEndpointAndFleetActionsForHostOptions = {} -): Promise => { - const ES_INDEX_OPTIONS = { headers: { 'X-elastic-product-origin': 'fleet' } }; - const agentId = endpointHost.elastic.agent.id; - const actionsCount = options.numResponseActions ?? 1; - const total = actionsCount === 1 ? actionsCount : fleetActionGenerator.randomN(5) + actionsCount; - const response: IndexedEndpointAndFleetActionsForHostResponse = { +export const indexEndpointAndFleetActionsForHost = usageTracker.track( + 'indexEndpointAndFleetActionsForHost', + async ( + esClient: Client, + endpointHost: HostMetadata, + options: IndexEndpointAndFleetActionsForHostOptions = {} + ): Promise => { + const ES_INDEX_OPTIONS = { headers: { 'X-elastic-product-origin': 'fleet' } }; + const actionsCount = options.numResponseActions ?? 1; + const total = + actionsCount === 1 ? actionsCount : fleetActionGenerator.randomN(5) + actionsCount; + const hostActions = buildIEndpointAndFleetActionsBulkOperations({ + endpoints: [endpointHost], + count: total, + alertIds: options.alertIds, + }); + const response: IndexedEndpointAndFleetActionsForHostResponse = { + actions: hostActions.actions, + actionResponses: hostActions.actionResponses, + endpointActions: [], + endpointActionResponses: [], + actionsIndex: AGENT_ACTIONS_INDEX, + responsesIndex: AGENT_ACTIONS_RESULTS_INDEX, + endpointActionsIndex: ENDPOINT_ACTIONS_INDEX, + endpointActionResponsesIndex: ENDPOINT_ACTION_RESPONSES_INDEX, + }; + + const bulkResponse = await esClient + .bulk( + { + operations: hostActions.operations, + refresh: 'wait_for', + }, + ES_INDEX_OPTIONS + ) + .catch(wrapErrorAndRejectPromise); + + if (bulkResponse.errors) { + throw new EndpointError( + `indexEndpointAndFleetActionsForHost(): ES Bulk action failed\n\n${JSON.stringify( + bulkResponse, + null, + 2 + )}`, + bulkResponse + ); + } + + return response; + } +); + +interface BuildIEndpointAndFleetActionsBulkOperationsOptions { + endpoints: HostMetadata[]; + /** Number of response actions to create per endpoint host. Default: 1 */ + count?: number; + /** List of alerts that should be associated with the action */ + alertIds?: string[]; +} + +interface BuildIEndpointAndFleetActionsBulkOperationsResponse + extends IndexedEndpointAndFleetActionsForHostResponse { + operations: Required['operations']; +} + +export const buildIEndpointAndFleetActionsBulkOperations = ({ + endpoints, + count = 1, + alertIds, +}: BuildIEndpointAndFleetActionsBulkOperationsOptions): BuildIEndpointAndFleetActionsBulkOperationsResponse => { + const bulkOperations: BulkRequest['operations'] = []; + const response: BuildIEndpointAndFleetActionsBulkOperationsResponse = { + operations: bulkOperations, actions: [], actionResponses: [], - endpointActions: [], - endpointActionResponses: [], actionsIndex: AGENT_ACTIONS_INDEX, responsesIndex: AGENT_ACTIONS_RESULTS_INDEX, endpointActionsIndex: ENDPOINT_ACTIONS_INDEX, endpointActionResponsesIndex: ENDPOINT_ACTION_RESPONSES_INDEX, + endpointActions: [], + endpointActionResponses: [], }; - for (let i = 0; i < total; i++) { - // start with endpoint action - const logsEndpointAction: LogsEndpointAction = endpointActionGenerator.generate({ - EndpointActions: { - data: { - comment: 'data generator: this host is bad', - ...(options.alertIds ? { command: 'isolate' } : {}), - }, - }, - }); - - const fleetAction: EndpointAction = { - ...logsEndpointAction.EndpointActions, - '@timestamp': logsEndpointAction['@timestamp'], - agents: - typeof logsEndpointAction.agent.id === 'string' - ? [logsEndpointAction.agent.id] - : logsEndpointAction.agent.id, - user_id: logsEndpointAction.user.id, - }; + for (const endpoint of endpoints) { + const agentId = endpoint.elastic.agent.id; - // index fleet action - const indexFleetActions = esClient - .index( - { - index: AGENT_ACTIONS_INDEX, - body: fleetAction, - refresh: 'wait_for', + for (let i = 0; i < count; i++) { + // start with endpoint action + const logsEndpointAction: LogsEndpointAction = endpointActionGenerator.generate({ + EndpointActions: { + data: { + comment: 'data generator: this host is bad', + ...(alertIds ? { command: 'isolate' } : {}), + }, }, - ES_INDEX_OPTIONS - ) - .catch(wrapErrorAndRejectPromise); + }); - const logsEndpointActionsBody: LogsEndpointAction = { - ...logsEndpointAction, - EndpointActions: { + const fleetAction: EndpointAction = { ...logsEndpointAction.EndpointActions, - data: { - ...logsEndpointAction.EndpointActions.data, - alert_id: options.alertIds, - }, - }, - // to test automated actions in cypress - user: options.alertIds ? { id: 'unknown' } : logsEndpointAction.user, - rule: options.alertIds - ? { - id: 'generated_rule_id', - name: 'generated_rule_name', - } - : logsEndpointAction.rule, - }; + '@timestamp': logsEndpointAction['@timestamp'], + agents: + typeof logsEndpointAction.agent.id === 'string' + ? [logsEndpointAction.agent.id] + : logsEndpointAction.agent.id, + user_id: logsEndpointAction.user.id, + }; - await Promise.all([ - indexFleetActions, - esClient - .index({ - index: ENDPOINT_ACTIONS_INDEX, - body: logsEndpointActionsBody, - refresh: 'wait_for', - }) - .catch(wrapErrorAndRejectPromise), - ]); + bulkOperations.push({ create: { _index: AGENT_ACTIONS_INDEX } }, fleetAction); - const randomFloat = fleetActionGenerator.randomFloat(); - // Create an action response for the above - const fleetActionResponse: EndpointActionResponse = fleetActionGenerator.generateResponse({ - action_id: logsEndpointAction.EndpointActions.action_id, - agent_id: agentId, - action_response: { - endpoint: { - // add ack to 4/5th of fleet response - ack: randomFloat < 0.8 ? true : undefined, + const logsEndpointActionsBody: LogsEndpointAction = { + ...logsEndpointAction, + EndpointActions: { + ...logsEndpointAction.EndpointActions, + data: { + ...logsEndpointAction.EndpointActions.data, + alert_id: alertIds, + }, }, - }, - // error for 1/10th of responses - error: randomFloat < 0.1 ? 'some error happened' : undefined, - }); + // to test automated actions in cypress + user: alertIds ? { id: 'unknown' } : logsEndpointAction.user, + rule: alertIds + ? { + id: 'generated_rule_id', + name: 'generated_rule_name', + } + : logsEndpointAction.rule, + }; - const indexFleetResponses = esClient - .index( + bulkOperations.push( { - index: AGENT_ACTIONS_RESULTS_INDEX, - body: fleetActionResponse, - refresh: 'wait_for', + create: { _index: ENDPOINT_ACTIONS_INDEX }, }, - ES_INDEX_OPTIONS - ) - .catch(wrapErrorAndRejectPromise); + logsEndpointActionsBody + ); - // 70% has endpoint response - if (randomFloat < 0.7) { - const endpointActionResponseBody = { - EndpointActions: { - ...fleetActionResponse, - data: fleetActionResponse.action_data, - '@timestamp': undefined, - action_data: undefined, - agent_id: undefined, - error: undefined, - }, - agent: { - id: agentId, + const randomFloat = fleetActionGenerator.randomFloat(); + // Create an action response for the above + const fleetActionResponse: EndpointActionResponse = fleetActionGenerator.generateResponse({ + action_id: logsEndpointAction.EndpointActions.action_id, + agent_id: agentId, + action_response: { + endpoint: { + // add ack to 4/5th of fleet response + ack: randomFloat < 0.8 ? true : undefined, + }, }, // error for 1/10th of responses - error: - randomFloat < 0.1 - ? { - message: fleetActionResponse.error, - } - : undefined, - '@timestamp': fleetActionResponse['@timestamp'], - }; + error: randomFloat < 0.1 ? 'some error happened' : undefined, + }); - await Promise.all([ - indexFleetResponses, - esClient - .index({ - index: ENDPOINT_ACTION_RESPONSES_INDEX, - body: endpointActionResponseBody, - refresh: 'wait_for', - }) - .catch(wrapErrorAndRejectPromise), - ]); - } else { - // 30% has only fleet response - await indexFleetResponses; + bulkOperations.push( + { + create: { _index: AGENT_ACTIONS_RESULTS_INDEX }, + }, + fleetActionResponse + ); + + // 70% has endpoint response + if (randomFloat < 0.7) { + const endpointActionResponseBody = { + EndpointActions: { + ...fleetActionResponse, + data: fleetActionResponse.action_data, + '@timestamp': undefined, + action_data: undefined, + agent_id: undefined, + error: undefined, + }, + agent: { + id: agentId, + }, + // error for 1/10th of responses + error: + randomFloat < 0.1 + ? { + message: fleetActionResponse.error, + } + : undefined, + '@timestamp': fleetActionResponse['@timestamp'], + }; + + bulkOperations.push( + { + create: { _index: ENDPOINT_ACTION_RESPONSES_INDEX }, + }, + endpointActionResponseBody + ); + } + + response.actions.push(fleetAction); + response.actionResponses.push(fleetActionResponse); } - response.actions.push(fleetAction); - response.actionResponses.push(fleetActionResponse); - } + // ------------------------------------------- + // Add edge case fleet actions (maybe) + // ------------------------------------------- + if (fleetActionGenerator.randomFloat() < 0.3) { + const randomFloat = fleetActionGenerator.randomFloat(); - // Add edge case fleet actions (maybe) - if (fleetActionGenerator.randomFloat() < 0.3) { - const randomFloat = fleetActionGenerator.randomFloat(); + const actionStartedAt = { + '@timestamp': new Date().toISOString(), + }; + // 70% of the time just add either an Isolate -OR- an UnIsolate action + if (randomFloat < 0.7) { + let fleetAction: EndpointAction; - const actionStartedAt = { - '@timestamp': new Date().toISOString(), - }; - // 70% of the time just add either an Isolate -OR- an UnIsolate action - if (randomFloat < 0.7) { - let fleetAction: EndpointAction; + if (randomFloat < 0.3) { + // add a pending isolation + fleetAction = fleetActionGenerator.generateIsolateAction(actionStartedAt); + } else { + // add a pending UN-isolation + fleetAction = fleetActionGenerator.generateUnIsolateAction(actionStartedAt); + } - if (randomFloat < 0.3) { - // add a pending isolation - fleetAction = fleetActionGenerator.generateIsolateAction(actionStartedAt); + fleetAction.agents = [agentId]; + bulkOperations.push( + { + create: { _index: AGENT_ACTIONS_INDEX }, + }, + fleetAction + ); + + response.actions.push(fleetAction); } else { - // add a pending UN-isolation - fleetAction = fleetActionGenerator.generateUnIsolateAction(actionStartedAt); - } + // Else (30% of the time) add a pending isolate AND pending un-isolate + const fleetAction1 = fleetActionGenerator.generateIsolateAction(actionStartedAt); + const fleetAction2 = fleetActionGenerator.generateUnIsolateAction(actionStartedAt); - fleetAction.agents = [agentId]; + fleetAction1.agents = [agentId]; + fleetAction2.agents = [agentId]; - await esClient - .index( + bulkOperations.push( { - index: AGENT_ACTIONS_INDEX, - body: fleetAction, - refresh: 'wait_for', + create: { _index: AGENT_ACTIONS_INDEX }, }, - ES_INDEX_OPTIONS - ) - .catch(wrapErrorAndRejectPromise); + fleetAction1 + ); - response.actions.push(fleetAction); - } else { - // Else (30% of the time) add a pending isolate AND pending un-isolate - const fleetAction1 = fleetActionGenerator.generateIsolateAction(actionStartedAt); - const fleetAction2 = fleetActionGenerator.generateUnIsolateAction(actionStartedAt); - - fleetAction1.agents = [agentId]; - fleetAction2.agents = [agentId]; - - await Promise.all([ - esClient - .index( - { - index: AGENT_ACTIONS_INDEX, - body: fleetAction1, - refresh: 'wait_for', - }, - ES_INDEX_OPTIONS - ) - .catch(wrapErrorAndRejectPromise), - esClient - .index( - { - index: AGENT_ACTIONS_INDEX, - body: fleetAction2, - refresh: 'wait_for', - }, - ES_INDEX_OPTIONS - ) - .catch(wrapErrorAndRejectPromise), - ]); + bulkOperations.push( + { + create: { _index: AGENT_ACTIONS_INDEX }, + }, + fleetAction2 + ); - response.actions.push(fleetAction1, fleetAction2); + response.actions.push(fleetAction1, fleetAction2); + } } } diff --git a/x-pack/plugins/security_solution/common/endpoint/data_loaders/index_endpoint_hosts.ts b/x-pack/plugins/security_solution/common/endpoint/data_loaders/index_endpoint_hosts.ts index eed88ea4d44d25..c6679739d72d79 100644 --- a/x-pack/plugins/security_solution/common/endpoint/data_loaders/index_endpoint_hosts.ts +++ b/x-pack/plugins/security_solution/common/endpoint/data_loaders/index_endpoint_hosts.ts @@ -11,21 +11,24 @@ import type { AxiosResponse } from 'axios'; import { v4 as uuidv4 } from 'uuid'; import type { KbnClient } from '@kbn/test'; import type { DeleteByQueryResponse } from '@elastic/elasticsearch/lib/api/typesWithBodyKey'; -import type { Agent, CreatePackagePolicyResponse, GetInfoResponse } from '@kbn/fleet-plugin/common'; +import type { CreatePackagePolicyResponse, GetInfoResponse } from '@kbn/fleet-plugin/common'; +import type { BulkRequest } from '@elastic/elasticsearch/lib/api/types'; +import { EndpointError } from '../errors'; +import { usageTracker } from './usage_tracker'; import { EndpointDocGenerator } from '../generate_data'; import type { HostMetadata, HostPolicyResponse } from '../types'; import type { DeleteIndexedFleetAgentsResponse, IndexedFleetAgentResponse, } from './index_fleet_agent'; -import { deleteIndexedFleetAgents, indexFleetAgentForHost } from './index_fleet_agent'; +import { buildFleetAgentBulkCreateOperations, deleteIndexedFleetAgents } from './index_fleet_agent'; import type { DeleteIndexedEndpointFleetActionsResponse, IndexedEndpointAndFleetActionsForHostResponse, } from './index_endpoint_fleet_actions'; import { + buildIEndpointAndFleetActionsBulkOperations, deleteIndexedEndpointAndFleetActions, - indexEndpointAndFleetActionsForHost, type IndexEndpointAndFleetActionsForHostOptions, } from './index_endpoint_fleet_actions'; @@ -65,8 +68,6 @@ export interface IndexedHostsResponse * Endpoint Host metadata documents are added to an index that is set as "append only", thus one Endpoint host could * have multiple documents in that index. * - * - * * @param numDocs * @param client * @param kbnClient @@ -78,167 +79,188 @@ export interface IndexedHostsResponse * @param generator * @param disableEndpointActionsForHost */ -export async function indexEndpointHostDocs({ - numDocs, - client, - kbnClient, - realPolicies, - epmEndpointPackage, - metadataIndex, - policyResponseIndex, - enrollFleet, - generator, - withResponseActions = true, - numResponseActions, - alertIds, -}: { - numDocs: number; - client: Client; - kbnClient: KbnClient; - realPolicies: Record; - epmEndpointPackage: GetInfoResponse['item']; - metadataIndex: string; - policyResponseIndex: string; - enrollFleet: boolean; - generator: EndpointDocGenerator; - withResponseActions?: boolean; - numResponseActions?: IndexEndpointAndFleetActionsForHostOptions['numResponseActions']; - alertIds?: string[]; -}): Promise { - const timeBetweenDocs = 6 * 3600 * 1000; // 6 hours between metadata documents - const timestamp = new Date().getTime(); - const kibanaVersion = await fetchKibanaVersion(kbnClient); - const response: IndexedHostsResponse = { - hosts: [], - agents: [], - policyResponses: [], +export const indexEndpointHostDocs = usageTracker.track( + 'indexEndpointHostDocs', + async ({ + numDocs, + client, + kbnClient, + realPolicies, + epmEndpointPackage, metadataIndex, policyResponseIndex, - fleetAgentsIndex: '', - endpointActionResponses: [], - endpointActionResponsesIndex: '', - endpointActions: [], - endpointActionsIndex: '', - actionResponses: [], - responsesIndex: '', - actions: [], - actionsIndex: '', - integrationPolicies: [], - agentPolicies: [], - }; - let hostMetadata: HostMetadata; - let wasAgentEnrolled = false; - let enrolledAgent: undefined | Agent; - - for (let j = 0; j < numDocs; j++) { - generator.updateHostData(); - generator.updateHostPolicyData(); - - hostMetadata = generator.generateHostMetadata( - timestamp - timeBetweenDocs * (numDocs - j - 1), - EndpointDocGenerator.createDataStreamFromIndex(metadataIndex) - ); - - if (enrollFleet) { - const { id: appliedPolicyId, name: appliedPolicyName } = hostMetadata.Endpoint.policy.applied; - const uniqueAppliedPolicyName = `${appliedPolicyName}-${uuidv4()}`; - - // If we don't yet have a "real" policy record, then create it now in ingest (package config) - if (!realPolicies[appliedPolicyId]) { - const createdPolicies = await indexFleetEndpointPolicy( - kbnClient, - uniqueAppliedPolicyName, - epmEndpointPackage.version - ); - - mergeAndAppendArrays(response, createdPolicies); - - // eslint-disable-next-line require-atomic-updates - realPolicies[appliedPolicyId] = createdPolicies.integrationPolicies[0]; - } - - // If we did not yet enroll an agent for this Host, do it now that we have good policy id - if (!wasAgentEnrolled) { - wasAgentEnrolled = true; - - const indexedAgentResponse = await indexFleetAgentForHost( - client, - kbnClient, - hostMetadata, - realPolicies[appliedPolicyId].policy_id, - kibanaVersion - ); - - enrolledAgent = indexedAgentResponse.agents[0]; - mergeAndAppendArrays(response, indexedAgentResponse); - } - // Update the Host metadata record with the ID of the "real" policy along with the enrolled agent id - hostMetadata = { - ...hostMetadata, - agent: { - ...hostMetadata.agent, - id: enrolledAgent?.id ?? hostMetadata.agent.id, - }, - elastic: { - ...hostMetadata.elastic, + enrollFleet, + generator, + withResponseActions = true, + numResponseActions = 1, + alertIds, + }: { + numDocs: number; + client: Client; + kbnClient: KbnClient; + realPolicies: Record; + epmEndpointPackage: GetInfoResponse['item']; + metadataIndex: string; + policyResponseIndex: string; + enrollFleet: boolean; + generator: EndpointDocGenerator; + withResponseActions?: boolean; + numResponseActions?: IndexEndpointAndFleetActionsForHostOptions['numResponseActions']; + alertIds?: string[]; + }): Promise => { + const timeBetweenDocs = 6 * 3600 * 1000; // 6 hours between metadata documents + const timestamp = new Date().getTime(); + const kibanaVersion = await fetchKibanaVersion(kbnClient); + const response: IndexedHostsResponse = { + hosts: [], + agents: [], + policyResponses: [], + metadataIndex, + policyResponseIndex, + fleetAgentsIndex: '', + endpointActionResponses: [], + endpointActionResponsesIndex: '', + endpointActions: [], + endpointActionsIndex: '', + actionResponses: [], + responsesIndex: '', + actions: [], + actionsIndex: '', + integrationPolicies: [], + agentPolicies: [], + }; + let hostMetadata: HostMetadata; + let wasAgentEnrolled = false; + + const bulkOperations: BulkRequest['operations'] = []; + + for (let j = 0; j < numDocs; j++) { + generator.updateHostData(); + generator.updateHostPolicyData(); + + hostMetadata = generator.generateHostMetadata( + timestamp - timeBetweenDocs * (numDocs - j - 1), + EndpointDocGenerator.createDataStreamFromIndex(metadataIndex) + ); + let agentId = hostMetadata.agent.id; + + if (enrollFleet) { + const { id: appliedPolicyId, name: appliedPolicyName } = + hostMetadata.Endpoint.policy.applied; + const uniqueAppliedPolicyName = `${appliedPolicyName}-${uuidv4()}`; + + // If we don't yet have a "real" policy record, then create it now in ingest (package config) + if (!realPolicies[appliedPolicyId]) { + const createdPolicies = await indexFleetEndpointPolicy( + kbnClient, + uniqueAppliedPolicyName, + epmEndpointPackage.version + ); + + mergeAndAppendArrays(response, createdPolicies); + + // eslint-disable-next-line require-atomic-updates + realPolicies[appliedPolicyId] = createdPolicies.integrationPolicies[0]; + } + + // If we did not yet enroll an agent for this Host, do it now that we have good policy id + if (!wasAgentEnrolled) { + wasAgentEnrolled = true; + + const { agents, fleetAgentsIndex, operations } = buildFleetAgentBulkCreateOperations({ + endpoints: [hostMetadata], + agentPolicyId: realPolicies[appliedPolicyId].policy_id, + kibanaVersion, + }); + + bulkOperations.push(...operations); + agentId = agents[0]?.agent?.id ?? agentId; + + mergeAndAppendArrays(response, { agents, fleetAgentsIndex }); + } + + // Update the Host metadata record with the ID of the "real" policy along with the enrolled agent id + hostMetadata = { + ...hostMetadata, agent: { - ...hostMetadata.elastic.agent, - id: enrolledAgent?.id ?? hostMetadata.elastic.agent.id, + ...hostMetadata.agent, + id: agentId, }, - }, - Endpoint: { - ...hostMetadata.Endpoint, - policy: { - ...hostMetadata.Endpoint.policy, - applied: { - ...hostMetadata.Endpoint.policy.applied, - id: realPolicies[appliedPolicyId].id, + elastic: { + ...hostMetadata.elastic, + agent: { + ...hostMetadata.elastic.agent, + id: agentId, }, }, - }, - }; + Endpoint: { + ...hostMetadata.Endpoint, + policy: { + ...hostMetadata.Endpoint.policy, + applied: { + ...hostMetadata.Endpoint.policy.applied, + id: realPolicies[appliedPolicyId].id, + }, + }, + }, + }; - if (withResponseActions) { // Create some fleet endpoint actions and .logs-endpoint actions for this Host - const actionsResponse = await indexEndpointAndFleetActionsForHost(client, hostMetadata, { - alertIds, - numResponseActions, - }); - mergeAndAppendArrays(response, actionsResponse); + if (withResponseActions) { + // `count` logic matches that of `indexEndpointAndFleetActionsForHost()`. Unclear why the number of + // actions to create will be 5 more than the amount requested if that amount was grater than 1 + const count = + numResponseActions === 1 + ? numResponseActions + : generator.randomN(5) + numResponseActions; + + const { operations, ...indexFleetActions } = buildIEndpointAndFleetActionsBulkOperations({ + endpoints: [hostMetadata], + count, + alertIds, + }); + + bulkOperations.push(...operations); + mergeAndAppendArrays(response, indexFleetActions); + } } + + bulkOperations.push({ create: { _index: metadataIndex } }, hostMetadata); + + const hostPolicyResponse = generator.generatePolicyResponse({ + ts: timestamp - timeBetweenDocs * (numDocs - j - 1), + policyDataStream: EndpointDocGenerator.createDataStreamFromIndex(policyResponseIndex), + }); + + bulkOperations.push({ create: { _index: policyResponseIndex } }, hostPolicyResponse); + + // Clone the hostMetadata and policyResponse document to ensure that no shared state + // (as a result of using the generator) is returned across docs. + response.hosts.push(cloneDeep(hostMetadata)); + response.policyResponses.push(cloneDeep(hostPolicyResponse)); } - await client - .index({ - index: metadataIndex, - document: hostMetadata, - op_type: 'create', - refresh: 'wait_for', - }) + const bulkResponse = await client + .bulk( + { operations: bulkOperations, refresh: 'wait_for' }, + { headers: { 'X-elastic-product-origin': 'fleet' } } + ) .catch(wrapErrorAndRejectPromise); - const hostPolicyResponse = generator.generatePolicyResponse({ - ts: timestamp - timeBetweenDocs * (numDocs - j - 1), - policyDataStream: EndpointDocGenerator.createDataStreamFromIndex(policyResponseIndex), - }); - - await client - .index({ - index: policyResponseIndex, - document: hostPolicyResponse, - op_type: 'create', - refresh: 'wait_for', - }) - .catch(wrapErrorAndRejectPromise); + if (bulkResponse.errors) { + throw new EndpointError( + `indexEndpointHostDocs(): ES Bulk action failed\n\n${JSON.stringify( + bulkResponse, + null, + 2 + )}`, + bulkResponse + ); + } - // Clone the hostMetadata and policyResponse document to ensure that no shared state - // (as a result of using the generator) is returned across docs. - response.hosts.push(cloneDeep(hostMetadata)); - response.policyResponses.push(cloneDeep(hostPolicyResponse)); + return response; } - - return response; -} +); const fetchKibanaVersion = async (kbnClient: KbnClient) => { const version = ( diff --git a/x-pack/plugins/security_solution/common/endpoint/data_loaders/index_endpoint_rule_alerts.ts b/x-pack/plugins/security_solution/common/endpoint/data_loaders/index_endpoint_rule_alerts.ts index 656deff84ec6d6..3c5a47852b7c7d 100644 --- a/x-pack/plugins/security_solution/common/endpoint/data_loaders/index_endpoint_rule_alerts.ts +++ b/x-pack/plugins/security_solution/common/endpoint/data_loaders/index_endpoint_rule_alerts.ts @@ -6,7 +6,7 @@ */ import type { Client, estypes } from '@elastic/elasticsearch'; -import { ToolingLog } from '@kbn/tooling-log'; +import type { ToolingLog } from '@kbn/tooling-log'; import { kibanaPackageJson } from '@kbn/repo-info'; import type { IndexName, @@ -15,7 +15,7 @@ import type { MappingTypeMapping, Name, } from '@elastic/elasticsearch/lib/api/types'; -import { wrapErrorIfNeeded } from './utils'; +import { createToolingLogger, wrapErrorIfNeeded } from './utils'; import { DEFAULT_ALERTS_INDEX } from '../../constants'; import { EndpointRuleAlertGenerator } from '../data_generators/endpoint_rule_alert_generator'; @@ -53,7 +53,7 @@ export const indexEndpointRuleAlerts = async ({ endpointHostname, endpointIsolated, count = 1, - log = new ToolingLog(), + log = createToolingLogger(), }: IndexEndpointRuleAlertsOptions): Promise => { log.verbose(`Indexing ${count} endpoint rule alerts`); @@ -88,7 +88,7 @@ export const indexEndpointRuleAlerts = async ({ export const deleteIndexedEndpointRuleAlerts = async ( esClient: Client, indexedAlerts: IndexedEndpointRuleAlerts['alerts'], - log = new ToolingLog() + log = createToolingLogger() ): Promise => { let response: estypes.BulkResponse = { took: 0, diff --git a/x-pack/plugins/security_solution/common/endpoint/data_loaders/index_fleet_agent.ts b/x-pack/plugins/security_solution/common/endpoint/data_loaders/index_fleet_agent.ts index 781d6243384e9c..1a91b283d241c7 100644 --- a/x-pack/plugins/security_solution/common/endpoint/data_loaders/index_fleet_agent.ts +++ b/x-pack/plugins/security_solution/common/endpoint/data_loaders/index_fleet_agent.ts @@ -6,11 +6,12 @@ */ import type { Client } from '@elastic/elasticsearch'; -import type { AxiosResponse } from 'axios'; import type { DeleteByQueryResponse } from '@elastic/elasticsearch/lib/api/typesWithBodyKey'; import type { KbnClient } from '@kbn/test'; -import type { Agent, FleetServerAgent, GetOneAgentResponse } from '@kbn/fleet-plugin/common'; -import { AGENT_API_ROUTES, API_VERSIONS } from '@kbn/fleet-plugin/common'; +import type { FleetServerAgent } from '@kbn/fleet-plugin/common'; +import { AGENTS_INDEX } from '@kbn/fleet-plugin/common'; +import type { BulkRequest } from '@elastic/elasticsearch/lib/api/types'; +import { usageTracker } from './usage_tracker'; import type { HostMetadata } from '../types'; import { FleetAgentGenerator } from '../data_generators/fleet_agent_generator'; import { wrapErrorAndRejectPromise } from './utils'; @@ -18,7 +19,7 @@ import { wrapErrorAndRejectPromise } from './utils'; const defaultFleetAgentGenerator = new FleetAgentGenerator(); export interface IndexedFleetAgentResponse { - agents: Array; + agents: FleetServerAgent[]; fleetAgentsIndex: string; } @@ -33,15 +34,48 @@ export interface IndexedFleetAgentResponse { * @param [kibanaVersion] * @param [fleetAgentGenerator] */ -export const indexFleetAgentForHost = async ( - esClient: Client, - kbnClient: KbnClient, +export const indexFleetAgentForHost = usageTracker.track( + 'indexFleetAgentForHost', + async ( + esClient: Client, + kbnClient: KbnClient, + endpointHost: HostMetadata, + agentPolicyId: string, + kibanaVersion: string = '8.0.0', + fleetAgentGenerator: FleetAgentGenerator = defaultFleetAgentGenerator + ): Promise => { + const agentDoc = generateFleetAgentEsHitForEndpointHost( + endpointHost, + agentPolicyId, + kibanaVersion, + fleetAgentGenerator + ); + + await esClient + .index({ + index: agentDoc._index, + id: agentDoc._id, + body: agentDoc._source, + op_type: 'create', + refresh: 'wait_for', + }) + .catch(wrapErrorAndRejectPromise); + + return { + fleetAgentsIndex: agentDoc._index, + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + agents: [agentDoc._source!], + }; + } +); + +const generateFleetAgentEsHitForEndpointHost = ( endpointHost: HostMetadata, agentPolicyId: string, kibanaVersion: string = '8.0.0', fleetAgentGenerator: FleetAgentGenerator = defaultFleetAgentGenerator -): Promise => { - const agentDoc = fleetAgentGenerator.generateEsHit({ +) => { + return fleetAgentGenerator.generateEsHit({ _id: endpointHost.agent.id, _source: { agent: { @@ -65,35 +99,56 @@ export const indexFleetAgentForHost = async ( policy_id: agentPolicyId, }, }); +}; - const createdFleetAgent = await esClient - .index({ - index: agentDoc._index, - id: agentDoc._id, - body: agentDoc._source, - op_type: 'create', - refresh: 'wait_for', - }) - .catch(wrapErrorAndRejectPromise); - - return { - fleetAgentsIndex: agentDoc._index, - agents: [ - await fetchFleetAgent(kbnClient, createdFleetAgent._id).catch(wrapErrorAndRejectPromise), - ], +interface BuildFleetAgentBulkCreateOperationsOptions { + endpoints: HostMetadata[]; + agentPolicyId: string; + kibanaVersion?: string; + fleetAgentGenerator?: FleetAgentGenerator; +} + +interface BuildFleetAgentBulkCreateOperationsResponse extends IndexedFleetAgentResponse { + operations: Required['operations']; +} + +/** + * Creates an array of ES records with Fleet Agents that are associated with the provided set of Endpoint Agents. + * Array can be used with the `bulk()` API's `operations` option. + * @param endpoints + * @param agentPolicyId + * @param kibanaVersion + * @param fleetAgentGenerator + */ +export const buildFleetAgentBulkCreateOperations = ({ + endpoints, + agentPolicyId, + kibanaVersion = '8.0.0', + fleetAgentGenerator = defaultFleetAgentGenerator, +}: BuildFleetAgentBulkCreateOperationsOptions): BuildFleetAgentBulkCreateOperationsResponse => { + const response: BuildFleetAgentBulkCreateOperationsResponse = { + operations: [], + agents: [], + fleetAgentsIndex: AGENTS_INDEX, }; -}; -const fetchFleetAgent = async (kbnClient: KbnClient, agentId: string): Promise => { - return ( - (await kbnClient - .request({ - path: AGENT_API_ROUTES.INFO_PATTERN.replace('{agentId}', agentId), - method: 'GET', - headers: { 'elastic-api-version': API_VERSIONS.public.v1 }, - }) - .catch(wrapErrorAndRejectPromise)) as AxiosResponse - ).data.item; + for (const endpointHost of endpoints) { + const agentDoc = generateFleetAgentEsHitForEndpointHost( + endpointHost, + agentPolicyId, + kibanaVersion, + fleetAgentGenerator + ); + + response.operations.push( + { create: { _index: agentDoc._index, _id: agentDoc._id } }, + agentDoc._source + ); + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + response.agents.push(agentDoc._source!); + } + + return response; }; export interface DeleteIndexedFleetAgentsResponse { diff --git a/x-pack/plugins/security_solution/common/endpoint/data_loaders/index_fleet_endpoint_policy.ts b/x-pack/plugins/security_solution/common/endpoint/data_loaders/index_fleet_endpoint_policy.ts index fda862d247bae9..558d0a2fa6a503 100644 --- a/x-pack/plugins/security_solution/common/endpoint/data_loaders/index_fleet_endpoint_policy.ts +++ b/x-pack/plugins/security_solution/common/endpoint/data_loaders/index_fleet_endpoint_policy.ts @@ -22,6 +22,7 @@ import { API_VERSIONS, } from '@kbn/fleet-plugin/common'; import { memoize } from 'lodash'; +import { usageTracker } from './usage_tracker'; import { getEndpointPackageInfo } from '../utils/package'; import type { PolicyData } from '../types'; import { policyFactory as policyConfigFactory } from '../models/policy_config'; @@ -36,88 +37,91 @@ export interface IndexedFleetEndpointPolicyResponse { * Create an endpoint Integration Policy (and associated Agent Policy) via Fleet * (NOTE: ensure that fleet is setup first before calling this loading function) */ -export const indexFleetEndpointPolicy = async ( - kbnClient: KbnClient, - policyName: string, - endpointPackageVersion?: string, - agentPolicyName?: string -): Promise => { - const response: IndexedFleetEndpointPolicyResponse = { - integrationPolicies: [], - agentPolicies: [], - }; - - const packageVersion = - endpointPackageVersion ?? (await getDefaultEndpointPackageVersion(kbnClient)); - - // Create Agent Policy first - const newAgentPolicyData: CreateAgentPolicyRequest['body'] = { - name: - agentPolicyName || `Policy for ${policyName} (${Math.random().toString(36).substr(2, 5)})`, - description: `Policy created with endpoint data generator (${policyName})`, - namespace: 'default', - monitoring_enabled: ['logs', 'metrics'], - }; - - let agentPolicy: AxiosResponse; +export const indexFleetEndpointPolicy = usageTracker.track( + 'indexFleetEndpointPolicy', + async ( + kbnClient: KbnClient, + policyName: string, + endpointPackageVersion?: string, + agentPolicyName?: string + ): Promise => { + const response: IndexedFleetEndpointPolicyResponse = { + integrationPolicies: [], + agentPolicies: [], + }; + + const packageVersion = + endpointPackageVersion ?? (await getDefaultEndpointPackageVersion(kbnClient)); + + // Create Agent Policy first + const newAgentPolicyData: CreateAgentPolicyRequest['body'] = { + name: + agentPolicyName || `Policy for ${policyName} (${Math.random().toString(36).substr(2, 5)})`, + description: `Policy created with endpoint data generator (${policyName})`, + namespace: 'default', + monitoring_enabled: ['logs', 'metrics'], + }; + + let agentPolicy: AxiosResponse; + + try { + agentPolicy = (await kbnClient + .request({ + path: AGENT_POLICY_API_ROUTES.CREATE_PATTERN, + headers: { + 'elastic-api-version': API_VERSIONS.public.v1, + }, + method: 'POST', + body: newAgentPolicyData, + }) + .catch(wrapErrorAndRejectPromise)) as AxiosResponse; + } catch (error) { + throw new Error(`create fleet agent policy failed ${error}`); + } - try { - agentPolicy = (await kbnClient + response.agentPolicies.push(agentPolicy.data.item); + + // Create integration (package) policy + const newPackagePolicyData: CreatePackagePolicyRequest['body'] = { + name: policyName, + description: 'Protect the worlds data', + policy_id: agentPolicy.data.item.id, + enabled: true, + inputs: [ + { + type: 'endpoint', + enabled: true, + streams: [], + config: { + policy: { + value: policyConfigFactory(), + }, + }, + }, + ], + namespace: 'default', + package: { + name: 'endpoint', + title: 'Elastic Defend', + version: packageVersion, + }, + }; + const packagePolicy = (await kbnClient .request({ - path: AGENT_POLICY_API_ROUTES.CREATE_PATTERN, + path: PACKAGE_POLICY_API_ROUTES.CREATE_PATTERN, + method: 'POST', + body: newPackagePolicyData, headers: { 'elastic-api-version': API_VERSIONS.public.v1, }, - method: 'POST', - body: newAgentPolicyData, }) - .catch(wrapErrorAndRejectPromise)) as AxiosResponse; - } catch (error) { - throw new Error(`create fleet agent policy failed ${error}`); - } - - response.agentPolicies.push(agentPolicy.data.item); - - // Create integration (package) policy - const newPackagePolicyData: CreatePackagePolicyRequest['body'] = { - name: policyName, - description: 'Protect the worlds data', - policy_id: agentPolicy.data.item.id, - enabled: true, - inputs: [ - { - type: 'endpoint', - enabled: true, - streams: [], - config: { - policy: { - value: policyConfigFactory(), - }, - }, - }, - ], - namespace: 'default', - package: { - name: 'endpoint', - title: 'Elastic Defend', - version: packageVersion, - }, - }; - const packagePolicy = (await kbnClient - .request({ - path: PACKAGE_POLICY_API_ROUTES.CREATE_PATTERN, - method: 'POST', - body: newPackagePolicyData, - headers: { - 'elastic-api-version': API_VERSIONS.public.v1, - }, - }) - .catch(wrapErrorAndRejectPromise)) as AxiosResponse; + .catch(wrapErrorAndRejectPromise)) as AxiosResponse; - response.integrationPolicies.push(packagePolicy.data.item as PolicyData); + response.integrationPolicies.push(packagePolicy.data.item as PolicyData); - return response; -}; + return response; + } +); export interface DeleteIndexedFleetEndpointPoliciesResponse { integrationPolicies: PostDeletePackagePoliciesResponse | undefined; @@ -183,11 +187,14 @@ export const deleteIndexedFleetEndpointPolicies = async ( return response; }; -const getDefaultEndpointPackageVersion = memoize( - async (kbnClient: KbnClient) => { - return (await getEndpointPackageInfo(kbnClient)).version; - }, - (kbnClient: KbnClient) => { - return kbnClient.resolveUrl('/'); - } +const getDefaultEndpointPackageVersion = usageTracker.track( + 'getDefaultEndpointPackageVersion', + memoize( + async (kbnClient: KbnClient) => { + return (await getEndpointPackageInfo(kbnClient)).version; + }, + (kbnClient: KbnClient) => { + return kbnClient.resolveUrl('/'); + } + ) ); diff --git a/x-pack/plugins/security_solution/common/endpoint/data_loaders/index_fleet_server.ts b/x-pack/plugins/security_solution/common/endpoint/data_loaders/index_fleet_server.ts index da1bb6062ac864..63d6819c0db60e 100644 --- a/x-pack/plugins/security_solution/common/endpoint/data_loaders/index_fleet_server.ts +++ b/x-pack/plugins/security_solution/common/endpoint/data_loaders/index_fleet_server.ts @@ -7,6 +7,7 @@ import type { Client } from '@elastic/elasticsearch'; import { FLEET_SERVER_SERVERS_INDEX } from '@kbn/fleet-plugin/common'; +import { usageTracker } from './usage_tracker'; import { wrapErrorAndRejectPromise } from './utils'; /** @@ -16,39 +17,42 @@ import { wrapErrorAndRejectPromise } from './utils'; * @param esClient * @param version */ -export const enableFleetServerIfNecessary = async (esClient: Client, version: string = '8.0.0') => { - const res = await esClient.search({ - index: FLEET_SERVER_SERVERS_INDEX, - ignore_unavailable: true, - rest_total_hits_as_int: true, - }); +export const enableFleetServerIfNecessary = usageTracker.track( + 'enableFleetServerIfNecessary', + async (esClient: Client, version: string = '8.0.0') => { + const res = await esClient.search({ + index: FLEET_SERVER_SERVERS_INDEX, + ignore_unavailable: true, + rest_total_hits_as_int: true, + }); - if (res.hits.total) { - return; - } + if (res.hits.total) { + return; + } - // Create a Fake fleet-server in this kibana instance - await esClient - .index({ - index: FLEET_SERVER_SERVERS_INDEX, - refresh: 'wait_for', - body: { - agent: { - id: '12988155-475c-430d-ac89-84dc84b67cd1', - version, + // Create a Fake fleet-server in this kibana instance + await esClient + .index({ + index: FLEET_SERVER_SERVERS_INDEX, + refresh: 'wait_for', + body: { + agent: { + id: '12988155-475c-430d-ac89-84dc84b67cd1', + version, + }, + host: { + architecture: 'linux', + id: 'c3e5f4f690b4a3ff23e54900701a9513', + ip: ['127.0.0.1', '::1', '10.201.0.213', 'fe80::4001:aff:fec9:d5'], + name: 'endpoint-data-generator', + }, + server: { + id: '12988155-475c-430d-ac89-84dc84b67cd1', + version, + }, + '@timestamp': '2021-05-12T18:42:52.009482058Z', }, - host: { - architecture: 'linux', - id: 'c3e5f4f690b4a3ff23e54900701a9513', - ip: ['127.0.0.1', '::1', '10.201.0.213', 'fe80::4001:aff:fec9:d5'], - name: 'endpoint-data-generator', - }, - server: { - id: '12988155-475c-430d-ac89-84dc84b67cd1', - version, - }, - '@timestamp': '2021-05-12T18:42:52.009482058Z', - }, - }) - .catch(wrapErrorAndRejectPromise); -}; + }) + .catch(wrapErrorAndRejectPromise); + } +); diff --git a/x-pack/plugins/security_solution/common/endpoint/data_loaders/setup_fleet_for_endpoint.ts b/x-pack/plugins/security_solution/common/endpoint/data_loaders/setup_fleet_for_endpoint.ts index 234be86e4aa023..fa51e50cb62261 100644 --- a/x-pack/plugins/security_solution/common/endpoint/data_loaders/setup_fleet_for_endpoint.ts +++ b/x-pack/plugins/security_solution/common/endpoint/data_loaders/setup_fleet_for_endpoint.ts @@ -19,17 +19,16 @@ import { SETUP_API_ROUTE, API_VERSIONS, } from '@kbn/fleet-plugin/common'; -import { ToolingLog } from '@kbn/tooling-log'; -import { UsageTracker } from './usage_tracker'; +import type { ToolingLog } from '@kbn/tooling-log'; +import { usageTracker } from './usage_tracker'; import { + createToolingLogger, EndpointDataLoadingError, RETRYABLE_TRANSIENT_ERRORS, retryOnError, wrapErrorAndRejectPromise, } from './utils'; -const usageTracker = new UsageTracker({ dumpOnProcessExit: true }); - export interface SetupFleetForEndpointResponse { endpointPackage: BulkInstallPackageInfo; } @@ -39,73 +38,62 @@ export interface SetupFleetForEndpointResponse { * @param kbnClient * @param logger */ -export const setupFleetForEndpoint = async ( - kbnClient: KbnClient, - logger?: ToolingLog -): Promise => { - const log = logger ?? new ToolingLog(); - const usageRecord = usageTracker.create('setupFleetForEndpoint()'); - - log.info(`setupFleetForEndpoint(): Setting up fleet for endpoint`); - - // Setup Fleet - try { - const setupResponse = (await kbnClient - .request({ - path: SETUP_API_ROUTE, - headers: { 'Elastic-Api-Version': API_VERSIONS.public.v1 }, - method: 'POST', - }) - .catch(wrapErrorAndRejectPromise)) as AxiosResponse; - - if (!setupResponse.data.isInitialized) { - log.error(new Error(JSON.stringify(setupResponse.data, null, 2))); - throw new Error('Initializing the ingest manager failed, existing'); +export const setupFleetForEndpoint = usageTracker.track( + 'setupFleetForEndpoint', + async (kbnClient: KbnClient, logger?: ToolingLog): Promise => { + const log = logger ?? createToolingLogger(); + + log.info(`setupFleetForEndpoint(): Setting up fleet for endpoint`); + + // Setup Fleet + try { + const setupResponse = (await kbnClient + .request({ + path: SETUP_API_ROUTE, + headers: { 'Elastic-Api-Version': API_VERSIONS.public.v1 }, + method: 'POST', + }) + .catch(wrapErrorAndRejectPromise)) as AxiosResponse; + + if (!setupResponse.data.isInitialized) { + log.error(new Error(JSON.stringify(setupResponse.data, null, 2))); + throw new Error('Initializing the ingest manager failed, existing'); + } + } catch (error) { + log.error(error); + throw error; } - } catch (error) { - log.error(error); - usageRecord.set('failure', error.message); - - throw error; - } - // Setup Agents - try { - const setupResponse = (await kbnClient - .request({ - path: AGENTS_SETUP_API_ROUTES.CREATE_PATTERN, - method: 'POST', - headers: { - 'elastic-api-version': API_VERSIONS.public.v1, - }, - }) - .catch(wrapErrorAndRejectPromise)) as AxiosResponse; - - if (!setupResponse.data.isInitialized) { - log.error(new Error(JSON.stringify(setupResponse, null, 2))); - throw new Error('Initializing Fleet failed'); + // Setup Agents + try { + const setupResponse = (await kbnClient + .request({ + path: AGENTS_SETUP_API_ROUTES.CREATE_PATTERN, + method: 'POST', + headers: { + 'elastic-api-version': API_VERSIONS.public.v1, + }, + }) + .catch(wrapErrorAndRejectPromise)) as AxiosResponse; + + if (!setupResponse.data.isInitialized) { + log.error(new Error(JSON.stringify(setupResponse, null, 2))); + throw new Error('Initializing Fleet failed'); + } + } catch (error) { + log.error(error); + throw error; } - } catch (error) { - log.error(error); - - usageRecord.set('failure', error.message); - throw error; - } - - // Install/upgrade the endpoint package - try { - await installOrUpgradeEndpointFleetPackage(kbnClient, log); - } catch (error) { - log.error(error); - - usageRecord.set('failure', error.message); - - throw error; + // Install/upgrade the endpoint package + try { + await installOrUpgradeEndpointFleetPackage(kbnClient, log); + } catch (error) { + log.error(error); + throw error; + } } - - usageRecord.set('success'); -}; +); /** * Installs the Endpoint package (or upgrades it) in Fleet to the latest available in the registry @@ -113,76 +101,63 @@ export const setupFleetForEndpoint = async ( * @param kbnClient * @param logger */ -export const installOrUpgradeEndpointFleetPackage = async ( - kbnClient: KbnClient, - logger: ToolingLog -): Promise => { - logger.info(`installOrUpgradeEndpointFleetPackage(): starting`); - - const usageRecord = usageTracker.create('installOrUpgradeEndpointFleetPackage()'); - - const updatePackages = async () => { - const installEndpointPackageResp = (await kbnClient - .request({ - path: EPM_API_ROUTES.BULK_INSTALL_PATTERN, - method: 'POST', - body: { - packages: ['endpoint'], - }, - query: { - prerelease: true, - }, - headers: { - 'elastic-api-version': API_VERSIONS.public.v1, - }, - }) - .catch(wrapErrorAndRejectPromise)) as AxiosResponse; - - logger.debug(`Fleet bulk install response:`, installEndpointPackageResp.data); - - const bulkResp = installEndpointPackageResp.data.items; - - if (bulkResp.length <= 0) { - throw new EndpointDataLoadingError( - 'Installing the Endpoint package failed, response was empty, existing', - bulkResp - ); - } - - const installResponse = bulkResp[0]; - - logger.debug('package install response:', installResponse); - - if (isFleetBulkInstallError(installResponse)) { - if (installResponse.error instanceof Error) { +export const installOrUpgradeEndpointFleetPackage = usageTracker.track( + 'installOrUpgradeEndpointFleetPackage', + async (kbnClient: KbnClient, logger: ToolingLog): Promise => { + logger.info(`installOrUpgradeEndpointFleetPackage(): starting`); + + const updatePackages = async () => { + const installEndpointPackageResp = (await kbnClient + .request({ + path: EPM_API_ROUTES.BULK_INSTALL_PATTERN, + method: 'POST', + body: { + packages: ['endpoint'], + }, + query: { + prerelease: true, + }, + headers: { + 'elastic-api-version': API_VERSIONS.public.v1, + }, + }) + .catch(wrapErrorAndRejectPromise)) as AxiosResponse; + + logger.debug(`Fleet bulk install response:`, installEndpointPackageResp.data); + + const bulkResp = installEndpointPackageResp.data.items; + + if (bulkResp.length <= 0) { throw new EndpointDataLoadingError( - `Installing the Endpoint package failed: ${installResponse.error.message}`, + 'Installing the Endpoint package failed, response was empty, existing', bulkResp ); } - // Ignore `409` (conflicts due to Concurrent install or upgrades of package) errors - if (installResponse.statusCode !== 409) { - throw new EndpointDataLoadingError(installResponse.error, bulkResp); - } - } + const installResponse = bulkResp[0]; - return bulkResp[0] as BulkInstallPackageInfo; - }; + logger.debug('package install response:', installResponse); - return retryOnError(updatePackages, RETRYABLE_TRANSIENT_ERRORS, logger, 5, 10000) - .then((result) => { - usageRecord.set('success'); + if (isFleetBulkInstallError(installResponse)) { + if (installResponse.error instanceof Error) { + throw new EndpointDataLoadingError( + `Installing the Endpoint package failed: ${installResponse.error.message}`, + bulkResp + ); + } - return result; - }) - .catch((err) => { - usageRecord.set('failure', err.message); - usageTracker.dump(logger); + // Ignore `409` (conflicts due to Concurrent install or upgrades of package) errors + if (installResponse.statusCode !== 409) { + throw new EndpointDataLoadingError(installResponse.error, bulkResp); + } + } - throw err; - }); -}; + return bulkResp[0] as BulkInstallPackageInfo; + }; + + return retryOnError(updatePackages, RETRYABLE_TRANSIENT_ERRORS, logger, 5, 10000); + } +); function isFleetBulkInstallError( installResponse: BulkInstallPackageInfo | IBulkInstallPackageHTTPError diff --git a/x-pack/plugins/security_solution/common/endpoint/data_loaders/usage_tracker.ts b/x-pack/plugins/security_solution/common/endpoint/data_loaders/usage_tracker.ts index 64d7fff94e8345..ef80ff74a704a1 100644 --- a/x-pack/plugins/security_solution/common/endpoint/data_loaders/usage_tracker.ts +++ b/x-pack/plugins/security_solution/common/endpoint/data_loaders/usage_tracker.ts @@ -5,15 +5,22 @@ * 2.0. */ -/* eslint-disable max-classes-per-file */ +/* eslint-disable max-classes-per-file,@typescript-eslint/no-explicit-any */ -import { ToolingLog } from '@kbn/tooling-log'; +import type { ToolingLog } from '@kbn/tooling-log'; +import { isPromise } from '@kbn/std'; +import moment from 'moment'; +import { once } from 'lodash'; +import { createToolingLogger } from './utils'; interface UsageRecordJson { id: string; start: string; finish: string; + durationMs: number; + duration: string; status: 'success' | 'failure' | 'pending'; + stack: string; error?: string; } @@ -23,12 +30,14 @@ interface UsageTrackerOptions { maxRecordsPerType?: number; } +type AnyFunction = (...args: any) => any; + /** * Keep track of usage of stuff. Example: can track how many time a given utility/function was called. * * ** Should not be used for production code ** */ -export class UsageTracker { +class UsageTracker { private readonly records: Record< string, { @@ -37,9 +46,10 @@ export class UsageTracker { } > = {}; private readonly options: Required; + private wrappedCallbacks = new WeakSet(); constructor({ - logger = new ToolingLog(), + logger = createToolingLogger(), dumpOnProcessExit = false, maxRecordsPerType = 25, }: UsageTrackerOptions = {}) { @@ -51,10 +61,18 @@ export class UsageTracker { try { if (dumpOnProcessExit && process && process.once) { - ['SIGINT', 'exit', 'uncaughtException', 'unhandledRejection'].forEach((event) => { - process.once(event, () => { - // - }); + const nodeEvents = ['SIGINT', 'exit', 'uncaughtException', 'unhandledRejection']; + const logStats = once(() => { + logger.verbose(`Tooling usage tracking: +${this.toText()}`); + }); + + logger.verbose( + `${this.constructor.name}: Setting up event listeners for: ${nodeEvents.join(' | ')}` + ); + + nodeEvents.forEach((event) => { + process.once(event, logStats); }); } } catch (err) { @@ -62,6 +80,19 @@ export class UsageTracker { } } + protected formatDuration(durationMs: number): string { + const durationObj = moment.duration(durationMs); + const pad = (num: number, max = 2): string => { + return String(num).padStart(max, '0'); + }; + const hours = pad(durationObj.hours()); + const minutes = pad(durationObj.minutes()); + const seconds = pad(durationObj.seconds()); + const milliseconds = pad(durationObj.milliseconds(), 3); + + return `${hours}:${minutes}:${seconds}.${milliseconds}`; + } + create(id: string): UsageRecord { this.records[id] = this.records[id] ?? { count: 0, records: [] }; @@ -86,49 +117,206 @@ export class UsageTracker { .map((record) => record.toJSON()); } + /** + * Returns a `JSON.parse()` compatible string of all of the entries captured + */ toString(): string { return JSON.stringify(this.toJSON()); } - public dump(logger?: ToolingLog) { - (logger ?? this.options.logger).info( + getSummary(): Array<{ name: string; count: number; shortestMs: number; longestMs: number }> { + return Object.entries(this.records).map(([funcName, record]) => { + const funcSummary = { + name: funcName, + count: record.count, + shortestMs: 0, + longestMs: 0, + }; + + for (const instanceRecord of record.records) { + const instanceDuration = instanceRecord.toJSON().durationMs; + + funcSummary.shortestMs = + funcSummary.shortestMs > 0 + ? Math.min(funcSummary.shortestMs, instanceDuration) + : instanceDuration; + + funcSummary.longestMs = + funcSummary.longestMs > 0 + ? Math.max(funcSummary.longestMs, instanceDuration) + : instanceDuration; + } + + return funcSummary; + }); + } + + toSummaryTable(): string { + const separator = ' | '; + const width = { + name: 60, + count: 5, + shortest: 12, + longest: 12, + }; + + const maxLineLength = + Object.values(width).reduce((acc, n) => acc + n, 0) + + (Object.keys(width).length - 1) * separator.length; + + const summaryText = this.getSummary().map(({ name, count, shortestMs, longestMs }) => { + const fmtName = name.padEnd(width.name); + const fmtCount = String(count).padEnd(width.count); + const fmtShortest = this.formatDuration(shortestMs); + const fmtLongest = this.formatDuration(longestMs); + + return `${fmtName}${separator}${fmtCount}${separator}${fmtShortest}${separator}${fmtLongest}`; + }); + + return `${'-'.repeat(maxLineLength)} +${'Name'.padEnd(width.name)}${separator}${'Count'.padEnd( + width.count + )}${separator}${'Shortest'.padEnd(width.shortest)}${separator}${'longest'.padEnd(width.longest)} +${'-'.repeat(maxLineLength)} +${summaryText.join('\n')} +${'-'.repeat(maxLineLength)} +`; + } + + /** + * Returns a string with information about the entries captured + */ + toText(): string { + return ( + this.toSummaryTable() + Object.entries(this.records) .map(([key, { count, records: usageRecords }]) => { return ` - [${key}] Invoked ${count} times. Last ${this.options.maxRecordsPerType}: - ${usageRecords - .map((record) => { - return record.toString(); - }) - .join('\n ')} +[${key}] Invoked ${count} times. Records${ + count > this.options.maxRecordsPerType + ? ` (last ${this.options.maxRecordsPerType})` + : '' + }: +${'-'.repeat(98)} +${usageRecords + .map((record) => { + return record.toText(); + }) + .join('\n')} `; }) - .join('\n') + .join('') ); } + + public dump(logger?: ToolingLog) { + (logger ?? this.options.logger).info( + `${this.constructor.name}: usage tracking: +${this.toText()}` + ); + } + + /** + * Will wrap the provided callback and provide usage tracking on it. + * @param callback + * @param name + */ + public track(callback: F): F; + public track(name: string, callback: F): F; + public track( + callbackOrName: F | string, + maybeCallback?: F + ): F { + const isArg1Callback = typeof callbackOrName === 'function'; + + if (!isArg1Callback && !maybeCallback) { + throw new Error( + `Second argument to 'track()' can not be undefined when first argument defined a name` + ); + } + + const callback = (isArg1Callback ? callbackOrName : maybeCallback) as F; + const name = isArg1Callback ? undefined : (callbackOrName as string); + + if (this.wrappedCallbacks.has(callback)) { + return callback; + } + + const functionName = + name || + callback.name || + // Get the file/line number where function was defined + ((new Error('-').stack ?? '').split('\n')[2] || '').trim() || + // Last resort: get 50 first char. of function code + callback.toString().trim().substring(0, 50); + + const wrappedFunction = ((...args) => { + const usageRecord = this.create(functionName); + + try { + const response = callback(...args); + + if (isPromise(response)) { + response + .then(() => { + usageRecord.set('success'); + }) + .catch((e) => { + usageRecord.set('failure', e.message); + }); + } else { + usageRecord.set('success'); + } + + return response; + } catch (e) { + usageRecord.set('failure', e.message); + throw e; + } + }) as F; + + this.wrappedCallbacks.add(wrappedFunction); + + return wrappedFunction; + } } class UsageRecord { private start: UsageRecordJson['start'] = new Date().toISOString(); private finish: UsageRecordJson['finish'] = ''; + private durationMs = 0; + private duration: UsageRecordJson['duration'] = ''; private status: UsageRecordJson['status'] = 'pending'; private error: UsageRecordJson['error']; + private stack: string = ''; - constructor(private readonly id: string) {} + constructor(private readonly id: string) { + Error.captureStackTrace(this); + this.stack = `\n${this.stack.split('\n').slice(2).join('\n')}`; + } set(status: Exclude, error?: string) { this.finish = new Date().toISOString(); this.error = error; + this.status = status; + + const durationDiff = moment.duration(moment(this.finish).diff(this.start)); + + this.durationMs = durationDiff.asMilliseconds(); + this.duration = `h[${durationDiff.hours()}] m[${durationDiff.minutes()}] s[${durationDiff.seconds()}] ms[${durationDiff.milliseconds()}]`; } public toJSON(): UsageRecordJson { - const { id, start, finish, status, error } = this; + const { id, start, finish, status, error, duration, durationMs, stack } = this; return { id, start, finish, + durationMs, + duration, status, + stack, ...(error ? { error } : {}), }; } @@ -136,4 +324,15 @@ class UsageRecord { public toString(): string { return JSON.stringify(this.toJSON()); } + + public toText(): string { + const data = this.toJSON(); + const keys = Object.keys(data).sort(); + + return keys.reduce((acc, key) => { + return acc.concat(`\n${key}: ${data[key as keyof UsageRecordJson]}`); + }, ''); + } } + +export const usageTracker = new UsageTracker({ dumpOnProcessExit: true }); diff --git a/x-pack/plugins/security_solution/common/endpoint/data_loaders/utils.ts b/x-pack/plugins/security_solution/common/endpoint/data_loaders/utils.ts index b7f7385a5f119d..c27fb5fc7154d5 100644 --- a/x-pack/plugins/security_solution/common/endpoint/data_loaders/utils.ts +++ b/x-pack/plugins/security_solution/common/endpoint/data_loaders/utils.ts @@ -6,6 +6,7 @@ */ import { mergeWith } from 'lodash'; +import type { ToolingLogTextWriterConfig } from '@kbn/tooling-log'; import { ToolingLog } from '@kbn/tooling-log'; export const RETRYABLE_TRANSIENT_ERRORS: Readonly> = [ @@ -53,7 +54,7 @@ export const retryOnError = async ( tryCount: number = 5, interval: number = 10000 ): Promise => { - const log = logger ?? new ToolingLog({ writeTo: { write(_: string) {} }, level: 'silent' }); + const log = logger ?? createToolingLogger('silent'); const msg = (message: string): string => `retryOnError(): ${message}`; const isRetryableError = (err: Error): boolean => { return errors.some((retryMessage) => { @@ -106,3 +107,33 @@ export const retryOnError = async ( // @ts-expect-error TS2454: Variable 'responsePromise' is used before being assigned. return responsePromise; }; + +interface CreateLoggerInterface { + (level?: Partial['level']): ToolingLog; + + /** + * The default log level if one is not provided to the `createToolingLogger()` utility. + * Can be used to globally set the log level to calls made to this utility with no `level` set + * on input. + */ + defaultLogLevel: ToolingLogTextWriterConfig['level']; +} + +/** + * Creates an instance of `ToolingLog` that outputs to `stdout`. + * The default log `level` for all instances can be set by setting the function's `defaultLogLevel`. + * Log level can also be explicitly set on input. + * + * @param level + * + * @example + * // Set default log level - example: from cypress for CI jobs + * createLogger.defaultLogLevel = 'verbose' + */ +export const createToolingLogger: CreateLoggerInterface = (level): ToolingLog => { + return new ToolingLog({ + level: level || createToolingLogger.defaultLogLevel, + writeTo: process.stdout, + }); +}; +createToolingLogger.defaultLogLevel = 'info'; diff --git a/x-pack/plugins/security_solution/common/endpoint/generate_data.ts b/x-pack/plugins/security_solution/common/endpoint/generate_data.ts index d99b0c148489fe..29d0edd91b23ed 100644 --- a/x-pack/plugins/security_solution/common/endpoint/generate_data.ts +++ b/x-pack/plugins/security_solution/common/endpoint/generate_data.ts @@ -18,6 +18,7 @@ import type { AssetsGroupedByServiceByType, } from '@kbn/fleet-plugin/common'; import { agentPolicyStatuses } from '@kbn/fleet-plugin/common'; +import { clone } from 'lodash'; import { EndpointMetadataGenerator } from './data_generators/endpoint_metadata_generator'; import type { AlertEvent, @@ -290,17 +291,17 @@ export function getTreeOptionsWithDef(options?: TreeOptions): TreeOptionDefaults }; } -const metadataDefaultDataStream = { +const metadataDefaultDataStream = () => ({ type: 'metrics', dataset: 'endpoint.metadata', namespace: 'default', -}; +}); -const policyDefaultDataStream = { +const policyDefaultDataStream = () => ({ type: 'metrics', dataset: 'endpoint.policy', namespace: 'default', -}; +}); const eventsDefaultDataStream = { type: 'logs', @@ -330,7 +331,14 @@ const alertsDefaultDataStream = { * contain shared data structures. */ export class EndpointDocGenerator extends BaseDataGenerator { - commonInfo: CommonHostInfo; + /** + * DO NOT ACCESS THIS PROPERTY DIRECTORY. + * Should only be accessed from the `getter/setter` property for `commonInfo` defined further + * below. + * @deprecated (just to ensure that its obvious not to access it directory) + */ + _commonInfo: CommonHostInfo; + sequence: number = 0; private readonly metadataGenerator: EndpointMetadataGenerator; @@ -347,7 +355,7 @@ export class EndpointDocGenerator extends BaseDataGenerator { ) { super(seed); this.metadataGenerator = new MetadataGenerator(seed); - this.commonInfo = this.createHostData(); + this._commonInfo = this.createHostData(); } /** @@ -369,11 +377,21 @@ export class EndpointDocGenerator extends BaseDataGenerator { }; } + // Ensure that `this.commonInfo` is returned cloned data + protected get commonInfo() { + return clone(this._commonInfo); + } + protected set commonInfo(newInfo) { + this._commonInfo = newInfo; + } + /** * Creates new random IP addresses for the host to simulate new DHCP assignment */ public updateHostData() { - this.commonInfo.host.ip = this.randomArray(3, () => this.randomIP()); + const newInfo = this.commonInfo; + newInfo.host.ip = this.randomArray(3, () => this.randomIP()); + this.commonInfo = newInfo; } /** @@ -381,8 +399,10 @@ export class EndpointDocGenerator extends BaseDataGenerator { * of random choices and gives it a random policy response status. */ public updateHostPolicyData() { - this.commonInfo.Endpoint.policy.applied = this.randomChoice(APPLIED_POLICIES); - this.commonInfo.Endpoint.policy.applied.status = this.randomChoice(POLICY_RESPONSE_STATUSES); + const newInfo = this.commonInfo; + newInfo.Endpoint.policy.applied = this.randomChoice(APPLIED_POLICIES); + newInfo.Endpoint.policy.applied.status = this.randomChoice(POLICY_RESPONSE_STATUSES); + this.commonInfo = newInfo; } /** @@ -425,13 +445,15 @@ export class EndpointDocGenerator extends BaseDataGenerator { */ public generateHostMetadata( ts = new Date().getTime(), - metadataDataStream = metadataDefaultDataStream + metadataDataStream = metadataDefaultDataStream() ): HostMetadata { - return this.metadataGenerator.generate({ - '@timestamp': ts, - data_stream: metadataDataStream, - ...this.commonInfo, - }); + return clone( + this.metadataGenerator.generate({ + '@timestamp': ts, + data_stream: metadataDataStream, + ...this.commonInfo, + }) + ); } /** @@ -1790,7 +1812,7 @@ export class EndpointDocGenerator extends BaseDataGenerator { public generatePolicyResponse({ ts = new Date().getTime(), allStatus, - policyDataStream = policyDefaultDataStream, + policyDataStream = policyDefaultDataStream(), }: { ts?: number; allStatus?: HostPolicyResponseActionStatus; diff --git a/x-pack/plugins/security_solution/common/endpoint/index_data.ts b/x-pack/plugins/security_solution/common/endpoint/index_data.ts index 27012788bedf0d..3bbb49cb30707e 100644 --- a/x-pack/plugins/security_solution/common/endpoint/index_data.ts +++ b/x-pack/plugins/security_solution/common/endpoint/index_data.ts @@ -9,7 +9,8 @@ import type { Client } from '@elastic/elasticsearch'; import seedrandom from 'seedrandom'; import type { KbnClient } from '@kbn/test'; import type { CreatePackagePolicyResponse } from '@kbn/fleet-plugin/common'; -import { ToolingLog } from '@kbn/tooling-log'; +import type { ToolingLog } from '@kbn/tooling-log'; +import { usageTracker } from './data_loaders/usage_tracker'; import type { TreeOptions } from './generate_data'; import { EndpointDocGenerator } from './generate_data'; import type { @@ -23,7 +24,7 @@ import { import { enableFleetServerIfNecessary } from './data_loaders/index_fleet_server'; import { indexAlerts } from './data_loaders/index_alerts'; import { setupFleetForEndpoint } from './data_loaders/setup_fleet_for_endpoint'; -import { mergeAndAppendArrays } from './data_loaders/utils'; +import { createToolingLogger, mergeAndAppendArrays } from './data_loaders/utils'; import { waitForMetadataTransformsReady, stopMetadataTransforms, @@ -54,102 +55,105 @@ export type IndexedHostsAndAlertsResponse = IndexedHostsResponse; * @param alertIds * @param logger_ */ -export async function indexHostsAndAlerts( - client: Client, - kbnClient: KbnClient, - seed: string, - numHosts: number, - numDocs: number, - metadataIndex: string, - policyResponseIndex: string, - eventIndex: string, - alertIndex: string, - alertsPerHost: number, - fleet: boolean, - options: TreeOptions = {}, - DocGenerator: typeof EndpointDocGenerator = EndpointDocGenerator, - withResponseActions = true, - numResponseActions?: number, - alertIds?: string[], - logger_?: ToolingLog -): Promise { - const random = seedrandom(seed); - const logger = logger_ ?? new ToolingLog({ level: 'info', writeTo: process.stdout }); - const epmEndpointPackage = await getEndpointPackageInfo(kbnClient); - const response: IndexedHostsAndAlertsResponse = { - hosts: [], - policyResponses: [], - agents: [], - fleetAgentsIndex: '', - metadataIndex, - policyResponseIndex, - actionResponses: [], - responsesIndex: '', - actions: [], - actionsIndex: '', - endpointActions: [], - endpointActionsIndex: '', - endpointActionResponses: [], - endpointActionResponsesIndex: '', - integrationPolicies: [], - agentPolicies: [], - }; +export const indexHostsAndAlerts = usageTracker.track( + 'indexHostsAndAlerts', + async ( + client: Client, + kbnClient: KbnClient, + seed: string, + numHosts: number, + numDocs: number, + metadataIndex: string, + policyResponseIndex: string, + eventIndex: string, + alertIndex: string, + alertsPerHost: number, + fleet: boolean, + options: TreeOptions = {}, + DocGenerator: typeof EndpointDocGenerator = EndpointDocGenerator, + withResponseActions = true, + numResponseActions?: number, + alertIds?: string[], + logger_?: ToolingLog + ): Promise => { + const random = seedrandom(seed); + const logger = logger_ ?? createToolingLogger(); + const epmEndpointPackage = await getEndpointPackageInfo(kbnClient); + const response: IndexedHostsAndAlertsResponse = { + hosts: [], + policyResponses: [], + agents: [], + fleetAgentsIndex: '', + metadataIndex, + policyResponseIndex, + actionResponses: [], + responsesIndex: '', + actions: [], + actionsIndex: '', + endpointActions: [], + endpointActionsIndex: '', + endpointActionResponses: [], + endpointActionResponsesIndex: '', + integrationPolicies: [], + agentPolicies: [], + }; - // Ensure fleet is setup and endpoint package installed - await setupFleetForEndpoint(kbnClient, logger); + // Ensure fleet is setup and endpoint package installed + await setupFleetForEndpoint(kbnClient, logger); - // If `fleet` integration is true, then ensure a (fake) fleet-server is connected - if (fleet) { - await enableFleetServerIfNecessary(client); - } + // If `fleet` integration is true, then ensure a (fake) fleet-server is connected + if (fleet) { + await enableFleetServerIfNecessary(client); + } - // Keep a map of host applied policy ids (fake) to real ingest package configs (policy record) - const realPolicies: Record = {}; + // Keep a map of host applied policy ids (fake) to real ingest package configs (policy record) + const realPolicies: Record = {}; - const shouldWaitForEndpointMetadataDocs = fleet; - if (shouldWaitForEndpointMetadataDocs) { - await waitForMetadataTransformsReady(client); - await stopMetadataTransforms(client); - } + const shouldWaitForEndpointMetadataDocs = fleet; + if (shouldWaitForEndpointMetadataDocs) { + await waitForMetadataTransformsReady(client); + await stopMetadataTransforms(client); + } - for (let i = 0; i < numHosts; i++) { - const generator = new DocGenerator(random); - const indexedHosts = await indexEndpointHostDocs({ - numDocs, - client, - kbnClient, - realPolicies, - epmEndpointPackage, - metadataIndex, - policyResponseIndex, - enrollFleet: fleet, - generator, - withResponseActions, - numResponseActions, - alertIds, - }); + for (let i = 0; i < numHosts; i++) { + const generator = new DocGenerator(random); + const indexedHosts = await indexEndpointHostDocs({ + numDocs, + client, + kbnClient, + realPolicies, + epmEndpointPackage, + metadataIndex, + policyResponseIndex, + enrollFleet: fleet, + generator, + withResponseActions, + numResponseActions, + alertIds, + }); - mergeAndAppendArrays(response, indexedHosts); + mergeAndAppendArrays(response, indexedHosts); - await indexAlerts({ - client, - eventIndex, - alertIndex, - generator, - numAlerts: alertsPerHost, - options, - }); - } + await indexAlerts({ + client, + eventIndex, + alertIndex, + generator, + numAlerts: alertsPerHost, + options, + }); + } - if (shouldWaitForEndpointMetadataDocs) { - await startMetadataTransforms( - client, - response.agents.map((agent) => agent.id) - ); - } + if (shouldWaitForEndpointMetadataDocs) { + await startMetadataTransforms( + client, + response.agents.map((agent) => agent.agent?.id ?? '') + ); + } - return response; -} + return response; + } +); export type DeleteIndexedHostsAndAlertsResponse = DeleteIndexedEndpointHostsResponse; diff --git a/x-pack/plugins/security_solution/common/endpoint/utils/package.ts b/x-pack/plugins/security_solution/common/endpoint/utils/package.ts index 599fcabe24c9c1..b4f995d0c49c33 100644 --- a/x-pack/plugins/security_solution/common/endpoint/utils/package.ts +++ b/x-pack/plugins/security_solution/common/endpoint/utils/package.ts @@ -10,22 +10,24 @@ import type { AxiosResponse } from 'axios'; import type { KbnClient } from '@kbn/test'; import type { GetInfoResponse } from '@kbn/fleet-plugin/common'; import { API_VERSIONS, epmRouteService } from '@kbn/fleet-plugin/common'; +import { usageTracker } from '../data_loaders/usage_tracker'; -export const getEndpointPackageInfo = async ( - kbnClient: KbnClient -): Promise => { - const path = epmRouteService.getInfoPath('endpoint'); - const endpointPackage = ( - (await kbnClient.request({ - path, - headers: { 'Elastic-Api-Version': API_VERSIONS.public.v1 }, - method: 'GET', - })) as AxiosResponse - ).data.item; +export const getEndpointPackageInfo = usageTracker.track( + 'getEndpointPackageInfo', + async (kbnClient: KbnClient): Promise => { + const path = epmRouteService.getInfoPath('endpoint'); + const endpointPackage = ( + (await kbnClient.request({ + path, + headers: { 'Elastic-Api-Version': API_VERSIONS.public.v1 }, + method: 'GET', + })) as AxiosResponse + ).data.item; - if (!endpointPackage) { - throw new Error('EPM Endpoint package was not found!'); - } + if (!endpointPackage) { + throw new Error('EPM Endpoint package was not found!'); + } - return endpointPackage; -}; + return endpointPackage; + } +); diff --git a/x-pack/plugins/security_solution/common/endpoint/utils/transforms.ts b/x-pack/plugins/security_solution/common/endpoint/utils/transforms.ts index 5e604f2d15e4a8..b689a1d7c20e64 100644 --- a/x-pack/plugins/security_solution/common/endpoint/utils/transforms.ts +++ b/x-pack/plugins/security_solution/common/endpoint/utils/transforms.ts @@ -8,6 +8,7 @@ import type { Client } from '@elastic/elasticsearch'; import type { TransformGetTransformStatsTransformStats } from '@elastic/elasticsearch/lib/api/typesWithBodyKey'; +import { usageTracker } from '../data_loaders/usage_tracker'; import { metadataCurrentIndexPattern, metadataTransformPrefix, @@ -15,67 +16,76 @@ import { METADATA_UNITED_TRANSFORM, } from '../constants'; -export async function waitForMetadataTransformsReady(esClient: Client): Promise { - await waitFor(() => areMetadataTransformsReady(esClient)); -} - -export async function stopMetadataTransforms(esClient: Client): Promise { - const transformIds = await getMetadataTransformIds(esClient); - - await Promise.all( - transformIds.map((transformId) => - esClient.transform.stopTransform({ - transform_id: transformId, - force: true, - wait_for_completion: true, - allow_no_match: true, - }) - ) - ); -} - -export async function startMetadataTransforms( - esClient: Client, - // agentIds to wait for - agentIds: string[] -): Promise { - const transformIds = await getMetadataTransformIds(esClient); - const currentTransformId = transformIds.find((transformId) => - transformId.startsWith(metadataTransformPrefix) - ); - const unitedTransformId = transformIds.find((transformId) => - transformId.startsWith(METADATA_UNITED_TRANSFORM) - ); - if (!currentTransformId || !unitedTransformId) { - // eslint-disable-next-line no-console - console.warn('metadata transforms not found, skipping transform start'); - return; +export const waitForMetadataTransformsReady = usageTracker.track( + 'waitForMetadataTransformsReady', + async (esClient: Client): Promise => { + await waitFor(() => areMetadataTransformsReady(esClient)); } +); + +export const stopMetadataTransforms = usageTracker.track( + 'stopMetadataTransforms', + async (esClient: Client): Promise => { + const transformIds = await getMetadataTransformIds(esClient); + + await Promise.all( + transformIds.map((transformId) => + esClient.transform.stopTransform({ + transform_id: transformId, + force: true, + wait_for_completion: true, + allow_no_match: true, + }) + ) + ); + } +); + +export const startMetadataTransforms = usageTracker.track( + 'startMetadataTransforms', + async ( + esClient: Client, + // agentIds to wait for + agentIds: string[] + ): Promise => { + const transformIds = await getMetadataTransformIds(esClient); + const currentTransformId = transformIds.find((transformId) => + transformId.startsWith(metadataTransformPrefix) + ); + const unitedTransformId = transformIds.find((transformId) => + transformId.startsWith(METADATA_UNITED_TRANSFORM) + ); + if (!currentTransformId || !unitedTransformId) { + // eslint-disable-next-line no-console + console.warn('metadata transforms not found, skipping transform start'); + return; + } - try { - await esClient.transform.startTransform({ - transform_id: currentTransformId, - }); - } catch (err) { - // ignore if transform already started - if (err.statusCode !== 409) { - throw err; + try { + await esClient.transform.startTransform({ + transform_id: currentTransformId, + }); + } catch (err) { + // ignore if transform already started + if (err.statusCode !== 409) { + throw err; + } } - } - await waitForCurrentMetdataDocs(esClient, agentIds); + await waitForCurrentMetdataDocs(esClient, agentIds); - try { - await esClient.transform.startTransform({ - transform_id: unitedTransformId, - }); - } catch (err) { - // ignore if transform already started - if (err.statusCode !== 409) { - throw err; + try { + await esClient.transform.startTransform({ + transform_id: unitedTransformId, + }); + } catch (err) { + // ignore if transform already started + if (err.statusCode !== 409) { + throw err; + } } } -} +); async function getMetadataTransformStats( esClient: Client diff --git a/x-pack/plugins/security_solution/public/management/cypress/cypress_base.config.ts b/x-pack/plugins/security_solution/public/management/cypress/cypress_base.config.ts index f235600e403409..2e6023c7690a02 100644 --- a/x-pack/plugins/security_solution/public/management/cypress/cypress_base.config.ts +++ b/x-pack/plugins/security_solution/public/management/cypress/cypress_base.config.ts @@ -6,9 +6,12 @@ */ import { merge } from 'lodash'; +import { setupToolingLogLevel } from './support/setup_tooling_log_level'; +import { createToolingLogger } from '../../../common/endpoint/data_loaders/utils'; import { dataLoaders, dataLoadersForRealEndpoints } from './support/data_loaders'; import { responseActionTasks } from './support/response_actions'; import { agentActions } from './support/agent_actions'; +import { usageTracker } from '../../../common/endpoint/data_loaders/usage_tracker'; export const getCypressBaseConfig = ( overrides: Cypress.ConfigOptions = {} @@ -49,6 +52,10 @@ export const getCypressBaseConfig = ( ELASTICSEARCH_USERNAME: 'system_indices_superuser', ELASTICSEARCH_PASSWORD: 'changeme', + // Default log level for instance of `ToolingLog` created via `crateToolingLog()`. Set this + // to `debug` or `verbose` when wanting to debug tooling used by tests (ex. data indexer functions). + TOOLING_LOG_LEVEL: 'info', + // grep related configs grepFilterSpecs: true, grepOmitFiltered: true, @@ -63,6 +70,9 @@ export const getCypressBaseConfig = ( experimentalMemoryManagement: true, experimentalInteractiveRunEvents: true, setupNodeEvents: (on: Cypress.PluginEvents, config: Cypress.PluginConfigOptions) => { + // IMPORTANT: setting the log level should happen before any tooling is called + setupToolingLogLevel(config); + dataLoaders(on, config); // Data loaders specific to "real" Endpoint testing dataLoadersForRealEndpoints(on, config); @@ -74,6 +84,13 @@ export const getCypressBaseConfig = ( // eslint-disable-next-line @typescript-eslint/no-var-requires require('@cypress/grep/src/plugin')(config); + on('after:spec', () => { + createToolingLogger().info( + 'Tooling Usage Tracking summary:\n', + usageTracker.toSummaryTable() + ); + }); + return config; }, }, diff --git a/x-pack/plugins/security_solution/public/management/cypress/e2e/artifacts/artifact_tabs_in_policy_details.cy.ts b/x-pack/plugins/security_solution/public/management/cypress/e2e/artifacts/artifact_tabs_in_policy_details.cy.ts index a17024a0dbc380..52df24ab87826f 100644 --- a/x-pack/plugins/security_solution/public/management/cypress/e2e/artifacts/artifact_tabs_in_policy_details.cy.ts +++ b/x-pack/plugins/security_solution/public/management/cypress/e2e/artifacts/artifact_tabs_in_policy_details.cy.ts @@ -58,167 +58,162 @@ const visitArtifactTab = (tabId: string) => { cy.get(`#${tabId}`).click(); }; -describe( - 'Artifact tabs in Policy Details page', - // FIXME: Test needs to be refactored for serverless so that it uses a standard set of users that are also available in serverless - { tags: ['@ess', '@serverless', '@brokenInServerless'] }, - () => { - before(() => { - login(); - loadEndpointDataForEventFiltersIfNeeded(); - }); - - after(() => { - login(); - removeAllArtifacts(); - }); - - for (const testData of getArtifactsListTestsData()) { - describe(`${testData.title} tab`, () => { - beforeEach(() => { - login(); - removeExceptionsList(testData.createRequestBody.list_id); - }); +describe('Artifact tabs in Policy Details page', { tags: ['@ess'] }, () => { + before(() => { + login(); + loadEndpointDataForEventFiltersIfNeeded(); + }); + + after(() => { + login(); + removeAllArtifacts(); + }); + + for (const testData of getArtifactsListTestsData()) { + describe(`${testData.title} tab`, () => { + beforeEach(() => { + login(); + removeExceptionsList(testData.createRequestBody.list_id); + }); - it(`[NONE] User cannot see the tab for ${testData.title}`, () => { - loginWithPrivilegeNone(testData.privilegePrefix); - visitPolicyDetailsPage(); + it(`[NONE] User cannot see the tab for ${testData.title}`, () => { + loginWithPrivilegeNone(testData.privilegePrefix); + visitPolicyDetailsPage(); - cy.get(`#${testData.tabId}`).should('not.exist'); - }); + cy.get(`#${testData.tabId}`).should('not.exist'); + }); - context(`Given there are no ${testData.title} entries`, () => { - it(`[READ] User CANNOT add ${testData.title} artifact`, () => { - loginWithPrivilegeRead(testData.privilegePrefix); - visitArtifactTab(testData.tabId); + context(`Given there are no ${testData.title} entries`, () => { + it(`[READ] User CANNOT add ${testData.title} artifact`, () => { + loginWithPrivilegeRead(testData.privilegePrefix); + visitArtifactTab(testData.tabId); - cy.getByTestSubj('policy-artifacts-empty-unexisting').should('exist'); + cy.getByTestSubj('policy-artifacts-empty-unexisting').should('exist'); - cy.getByTestSubj('unexisting-manage-artifacts-button').should('not.exist'); - }); + cy.getByTestSubj('unexisting-manage-artifacts-button').should('not.exist'); + }); - it(`[ALL] User can add ${testData.title} artifact`, () => { - loginWithPrivilegeAll(); - visitArtifactTab(testData.tabId); + it(`[ALL] User can add ${testData.title} artifact`, () => { + loginWithPrivilegeAll(); + visitArtifactTab(testData.tabId); - cy.getByTestSubj('policy-artifacts-empty-unexisting').should('exist'); + cy.getByTestSubj('policy-artifacts-empty-unexisting').should('exist'); - cy.getByTestSubj('unexisting-manage-artifacts-button').should('exist').click(); + cy.getByTestSubj('unexisting-manage-artifacts-button').should('exist').click(); - const { formActions, checkResults } = testData.create; + const { formActions, checkResults } = testData.create; - performUserActions(formActions); + performUserActions(formActions); - // Add a per policy artifact - but not assign it to any policy - cy.get('[data-test-subj$="-perPolicy"]').click(); // test-subjects are generated in different formats, but all ends with -perPolicy - cy.getByTestSubj(`${testData.pagePrefix}-flyout-submitButton`).click(); + // Add a per policy artifact - but not assign it to any policy + cy.get('[data-test-subj$="-perPolicy"]').click(); // test-subjects are generated in different formats, but all ends with -perPolicy + cy.getByTestSubj(`${testData.pagePrefix}-flyout-submitButton`).click(); - // Check new artifact is in the list - for (const checkResult of checkResults) { - cy.getByTestSubj(checkResult.selector).should('have.text', checkResult.value); - } + // Check new artifact is in the list + for (const checkResult of checkResults) { + cy.getByTestSubj(checkResult.selector).should('have.text', checkResult.value); + } - cy.getByTestSubj('policyDetailsPage').should('not.exist'); - cy.getByTestSubj('backToOrigin').contains(/^Back to .+ policy$/); + cy.getByTestSubj('policyDetailsPage').should('not.exist'); + cy.getByTestSubj('backToOrigin').contains(/^Back to .+ policy$/); - cy.getByTestSubj('backToOrigin').click(); - cy.getByTestSubj('policyDetailsPage').should('exist'); - }); + cy.getByTestSubj('backToOrigin').click(); + cy.getByTestSubj('policyDetailsPage').should('exist'); }); + }); - context(`Given there are no assigned ${testData.title} entries`, () => { - beforeEach(() => { - login(); - createArtifactList(testData.createRequestBody.list_id); - createPerPolicyArtifact(testData.artifactName, testData.createRequestBody); - }); + context(`Given there are no assigned ${testData.title} entries`, () => { + beforeEach(() => { + login(); + createArtifactList(testData.createRequestBody.list_id); + createPerPolicyArtifact(testData.artifactName, testData.createRequestBody); + }); - it(`[READ] User CANNOT Manage or Assign ${testData.title} artifacts`, () => { - loginWithPrivilegeRead(testData.privilegePrefix); - visitArtifactTab(testData.tabId); + it(`[READ] User CANNOT Manage or Assign ${testData.title} artifacts`, () => { + loginWithPrivilegeRead(testData.privilegePrefix); + visitArtifactTab(testData.tabId); - cy.getByTestSubj('policy-artifacts-empty-unassigned').should('exist'); + cy.getByTestSubj('policy-artifacts-empty-unassigned').should('exist'); - cy.getByTestSubj('unassigned-manage-artifacts-button').should('not.exist'); - cy.getByTestSubj('unassigned-assign-artifacts-button').should('not.exist'); - }); + cy.getByTestSubj('unassigned-manage-artifacts-button').should('not.exist'); + cy.getByTestSubj('unassigned-assign-artifacts-button').should('not.exist'); + }); - it(`[ALL] User can Manage and Assign ${testData.title} artifacts`, () => { - loginWithPrivilegeAll(); - visitArtifactTab(testData.tabId); + it(`[ALL] User can Manage and Assign ${testData.title} artifacts`, () => { + loginWithPrivilegeAll(); + visitArtifactTab(testData.tabId); - cy.getByTestSubj('policy-artifacts-empty-unassigned').should('exist'); + cy.getByTestSubj('policy-artifacts-empty-unassigned').should('exist'); - // Manage artifacts - cy.getByTestSubj('unassigned-manage-artifacts-button').should('exist').click(); - cy.location('pathname').should( - 'equal', - `/app/security/administration/${testData.urlPath}` - ); - cy.getByTestSubj('backToOrigin').click(); + // Manage artifacts + cy.getByTestSubj('unassigned-manage-artifacts-button').should('exist').click(); + cy.location('pathname').should( + 'equal', + `/app/security/administration/${testData.urlPath}` + ); + cy.getByTestSubj('backToOrigin').click(); - // Assign artifacts - cy.getByTestSubj('unassigned-assign-artifacts-button').should('exist').click(); + // Assign artifacts + cy.getByTestSubj('unassigned-assign-artifacts-button').should('exist').click(); - cy.getByTestSubj('artifacts-assign-flyout').should('exist'); - cy.getByTestSubj('artifacts-assign-confirm-button').should('be.disabled'); + cy.getByTestSubj('artifacts-assign-flyout').should('exist'); + cy.getByTestSubj('artifacts-assign-confirm-button').should('be.disabled'); - cy.getByTestSubj(`${testData.artifactName}_checkbox`).click(); - cy.getByTestSubj('artifacts-assign-confirm-button').click(); - }); + cy.getByTestSubj(`${testData.artifactName}_checkbox`).click(); + cy.getByTestSubj('artifacts-assign-confirm-button').click(); }); + }); - context(`Given there are assigned ${testData.title} entries`, () => { - beforeEach(() => { - login(); - createArtifactList(testData.createRequestBody.list_id); - yieldFirstPolicyID().then((policyID) => { - createPerPolicyArtifact(testData.artifactName, testData.createRequestBody, policyID); - }); + context(`Given there are assigned ${testData.title} entries`, () => { + beforeEach(() => { + login(); + createArtifactList(testData.createRequestBody.list_id); + yieldFirstPolicyID().then((policyID) => { + createPerPolicyArtifact(testData.artifactName, testData.createRequestBody, policyID); }); + }); - it(`[READ] User can see ${testData.title} artifacts but CANNOT assign or remove from policy`, () => { - loginWithPrivilegeRead(testData.privilegePrefix); - visitArtifactTab(testData.tabId); + it(`[READ] User can see ${testData.title} artifacts but CANNOT assign or remove from policy`, () => { + loginWithPrivilegeRead(testData.privilegePrefix); + visitArtifactTab(testData.tabId); - // List of artifacts - cy.getByTestSubj('artifacts-collapsed-list-card').should('have.length', 1); - cy.getByTestSubj('artifacts-collapsed-list-card-header-titleHolder').contains( - testData.artifactName - ); + // List of artifacts + cy.getByTestSubj('artifacts-collapsed-list-card').should('have.length', 1); + cy.getByTestSubj('artifacts-collapsed-list-card-header-titleHolder').contains( + testData.artifactName + ); - // Cannot assign artifacts - cy.getByTestSubj('artifacts-assign-button').should('not.exist'); + // Cannot assign artifacts + cy.getByTestSubj('artifacts-assign-button').should('not.exist'); - // Cannot remove from policy - cy.getByTestSubj('artifacts-collapsed-list-card-header-actions-button').click(); - cy.getByTestSubj('remove-from-policy-action').should('not.exist'); - }); + // Cannot remove from policy + cy.getByTestSubj('artifacts-collapsed-list-card-header-actions-button').click(); + cy.getByTestSubj('remove-from-policy-action').should('not.exist'); + }); - it(`[ALL] User can see ${testData.title} artifacts and can assign or remove artifacts from policy`, () => { - loginWithPrivilegeAll(); - visitArtifactTab(testData.tabId); + it(`[ALL] User can see ${testData.title} artifacts and can assign or remove artifacts from policy`, () => { + loginWithPrivilegeAll(); + visitArtifactTab(testData.tabId); - // List of artifacts - cy.getByTestSubj('artifacts-collapsed-list-card').should('have.length', 1); - cy.getByTestSubj('artifacts-collapsed-list-card-header-titleHolder').contains( - testData.artifactName - ); + // List of artifacts + cy.getByTestSubj('artifacts-collapsed-list-card').should('have.length', 1); + cy.getByTestSubj('artifacts-collapsed-list-card-header-titleHolder').contains( + testData.artifactName + ); - // Assign artifacts - cy.getByTestSubj('artifacts-assign-button').should('exist').click(); - cy.getByTestSubj('artifacts-assign-flyout').should('exist'); - cy.getByTestSubj('artifacts-assign-cancel-button').click(); + // Assign artifacts + cy.getByTestSubj('artifacts-assign-button').should('exist').click(); + cy.getByTestSubj('artifacts-assign-flyout').should('exist'); + cy.getByTestSubj('artifacts-assign-cancel-button').click(); - // Remove from policy - cy.getByTestSubj('artifacts-collapsed-list-card-header-actions-button').click(); - cy.getByTestSubj('remove-from-policy-action').click(); - cy.getByTestSubj('confirmModalConfirmButton').click(); + // Remove from policy + cy.getByTestSubj('artifacts-collapsed-list-card-header-actions-button').click(); + cy.getByTestSubj('remove-from-policy-action').click(); + cy.getByTestSubj('confirmModalConfirmButton').click(); - cy.contains('Successfully removed'); - }); + cy.contains('Successfully removed'); }); }); - } + }); } -); +}); diff --git a/x-pack/plugins/security_solution/public/management/cypress/e2e/artifacts/artifacts.cy.ts b/x-pack/plugins/security_solution/public/management/cypress/e2e/artifacts/artifacts.cy.ts index 3850409f059112..32bf576b54cf96 100644 --- a/x-pack/plugins/security_solution/public/management/cypress/e2e/artifacts/artifacts.cy.ts +++ b/x-pack/plugins/security_solution/public/management/cypress/e2e/artifacts/artifacts.cy.ts @@ -37,7 +37,7 @@ const yieldAppliedEndpointRevision = (): Cypress.Chainable => const parseRevNumber = (revString: string) => Number(revString.match(/\d+/)?.[0]); // FLAKY: https://github.com/elastic/kibana/issues/168342 -describe.skip('Artifact pages', { tags: ['@ess', '@serverless', '@brokenInServerless'] }, () => { +describe.skip('Artifact pages', { tags: ['@ess', '@serverless'] }, () => { let indexedPolicy: IndexedFleetEndpointPolicyResponse; let policy: PolicyData; let createdHost: CreateAndEnrollEndpointHostResponse; diff --git a/x-pack/plugins/security_solution/public/management/cypress/e2e/artifacts/artifacts_mocked_data.cy.ts b/x-pack/plugins/security_solution/public/management/cypress/e2e/artifacts/artifacts_mocked_data.cy.ts index df0ad073ebdbfa..807502f93880c2 100644 --- a/x-pack/plugins/security_solution/public/management/cypress/e2e/artifacts/artifacts_mocked_data.cy.ts +++ b/x-pack/plugins/security_solution/public/management/cypress/e2e/artifacts/artifacts_mocked_data.cy.ts @@ -30,7 +30,7 @@ const loginWithoutAccess = (url: string) => { loadPage(url); }; -describe('Artifacts pages', { tags: ['@ess', '@serverless', '@brokenInServerless'] }, () => { +describe('Artifacts pages', { tags: ['@ess'] }, () => { before(() => { login(); loadEndpointDataForEventFiltersIfNeeded(); diff --git a/x-pack/plugins/security_solution/public/management/cypress/e2e/automated_response_actions/automated_response_actions.cy.ts b/x-pack/plugins/security_solution/public/management/cypress/e2e/automated_response_actions/automated_response_actions.cy.ts index 6f337adfc35fa6..f7257060e4ca97 100644 --- a/x-pack/plugins/security_solution/public/management/cypress/e2e/automated_response_actions/automated_response_actions.cy.ts +++ b/x-pack/plugins/security_solution/public/management/cypress/e2e/automated_response_actions/automated_response_actions.cy.ts @@ -23,7 +23,16 @@ import { enableAllPolicyProtections } from '../../tasks/endpoint_policy'; // FLAKY: https://github.com/elastic/kibana/issues/168340 describe.skip( 'Automated Response Actions', - { tags: ['@ess', '@serverless', '@brokenInServerless'] }, + { + tags: [ + '@ess', + '@serverless', + // Not supported in serverless! + // The `disableExpandableFlyoutAdvancedSettings()` fails because the API + // `internal/kibana/settings` is not accessible in serverless + '@brokenInServerless', + ], + }, () => { let indexedPolicy: IndexedFleetEndpointPolicyResponse; let policy: PolicyData; diff --git a/x-pack/plugins/security_solution/public/management/cypress/e2e/automated_response_actions/form.cy.ts b/x-pack/plugins/security_solution/public/management/cypress/e2e/automated_response_actions/form.cy.ts index 92289a6109d0ee..a370f2a89cb6f4 100644 --- a/x-pack/plugins/security_solution/public/management/cypress/e2e/automated_response_actions/form.cy.ts +++ b/x-pack/plugins/security_solution/public/management/cypress/e2e/automated_response_actions/form.cy.ts @@ -18,180 +18,194 @@ import { cleanupRule, generateRandomStringName, loadRule } from '../../tasks/api import { RESPONSE_ACTION_TYPES } from '../../../../../common/api/detection_engine'; import { login, ROLE } from '../../tasks/login'; -describe('Form', { tags: ['@ess', '@serverless', '@brokenInServerless'] }, () => { - // FLAKY: https://github.com/elastic/kibana/issues/169334 - describe.skip('User with no access can not create an endpoint response action', () => { - beforeEach(() => { - login(ROLE.endpoint_response_actions_no_access); - }); +describe( + 'Form', + { + tags: [ + '@ess', + '@serverless', + + // Not supported in serverless! Test suite uses custom roles + '@brokenInServerless', + ], + }, + () => { + // FLAKY: https://github.com/elastic/kibana/issues/169334 + describe.skip('User with no access can not create an endpoint response action', () => { + beforeEach(() => { + login(ROLE.endpoint_response_actions_no_access); + }); - it('no endpoint response action option during rule creation', () => { - fillUpNewRule(); - tryAddingDisabledResponseAction(); + it('no endpoint response action option during rule creation', () => { + fillUpNewRule(); + tryAddingDisabledResponseAction(); + }); }); - }); - - describe('User with access can create and save an endpoint response action', () => { - const testedCommand = 'isolate'; - let ruleId: string; - const [ruleName, ruleDescription] = generateRandomStringName(2); - beforeEach(() => { - login(ROLE.endpoint_response_actions_access); - }); - afterEach(() => { - cleanupRule(ruleId); - }); + describe('User with access can create and save an endpoint response action', () => { + const testedCommand = 'isolate'; + let ruleId: string; + const [ruleName, ruleDescription] = generateRandomStringName(2); - it('create and save endpoint response action inside of a rule', () => { - fillUpNewRule(ruleName, ruleDescription); - addEndpointResponseAction(); - focusAndOpenCommandDropdown(); - validateAvailableCommands(); - cy.getByTestSubj(`command-type-${testedCommand}`).click(); - addEndpointResponseAction(); - focusAndOpenCommandDropdown(1); - validateAvailableCommands(); - // tested command selected in previous action, should be disabled. - cy.getByTestSubj(`command-type-${testedCommand}`).should('have.attr', 'disabled'); - // Remove first response action, this should unlock tested command as an option - cy.getByTestSubj(`response-actions-list-item-0`).within(() => { - cy.getByTestSubj('remove-response-action').click(); + beforeEach(() => { + login(ROLE.endpoint_response_actions_access); }); - cy.getByTestSubj(`response-actions-list-item-0`).within(() => { - cy.getByTestSubj('commandTypeField').click(); + afterEach(() => { + if (ruleId) { + cleanupRule(ruleId); + } }); - cy.getByTestSubj(`command-type-${testedCommand}`).should('not.have.attr', 'disabled'); - cy.getByTestSubj(`command-type-${testedCommand}`).click(); - cy.intercept('POST', '/api/detection_engine/rules', (request) => { - const result = { - action_type_id: RESPONSE_ACTION_TYPES.ENDPOINT, - params: { - command: testedCommand, - comment: 'example1', - }, - }; - expect(request.body.response_actions[0]).to.deep.equal(result); - request.continue((response) => { - ruleId = response.body.id; - response.send(response.body); + + it('create and save endpoint response action inside of a rule', () => { + fillUpNewRule(ruleName, ruleDescription); + addEndpointResponseAction(); + focusAndOpenCommandDropdown(); + validateAvailableCommands(); + cy.getByTestSubj(`command-type-${testedCommand}`).click(); + addEndpointResponseAction(); + focusAndOpenCommandDropdown(1); + validateAvailableCommands(); + // tested command selected in previous action, should be disabled. + cy.getByTestSubj(`command-type-${testedCommand}`).should('have.attr', 'disabled'); + // Remove first response action, this should unlock tested command as an option + cy.getByTestSubj(`response-actions-list-item-0`).within(() => { + cy.getByTestSubj('remove-response-action').click(); }); + cy.getByTestSubj(`response-actions-list-item-0`).within(() => { + cy.getByTestSubj('commandTypeField').click(); + }); + cy.getByTestSubj(`command-type-${testedCommand}`).should('not.have.attr', 'disabled'); + cy.getByTestSubj(`command-type-${testedCommand}`).click(); + cy.intercept('POST', '/api/detection_engine/rules', (request) => { + const result = { + action_type_id: RESPONSE_ACTION_TYPES.ENDPOINT, + params: { + command: testedCommand, + comment: 'example1', + }, + }; + expect(request.body.response_actions[0]).to.deep.equal(result); + request.continue((response) => { + ruleId = response.body.id; + response.send(response.body); + }); + }); + cy.getByTestSubj('create-enabled-false').click(); + cy.contains(`${ruleName} was created`); }); - cy.getByTestSubj('create-enabled-false').click(); - cy.contains(`${ruleName} was created`); - }); - }); - - describe('User with access can edit and delete an endpoint response action', () => { - let ruleId: string; - let ruleName: string; - const testedCommand = 'isolate'; - const newDescription = 'Example isolate host description'; - - beforeEach(() => { - login(ROLE.endpoint_response_actions_access); - loadRule().then((res) => { - ruleId = res.id; - ruleName = res.name; - }); - }); - afterEach(() => { - cleanupRule(ruleId); }); - it('edit response action inside of a rule', () => { - visitRuleActions(ruleId); - cy.getByTestSubj('edit-rule-actions-tab').click(); - - cy.getByTestSubj(`response-actions-list-item-0`).within(() => { - cy.getByTestSubj('input').should('have.value', 'Isolate host'); - cy.getByTestSubj('input').should('have.value', 'Isolate host'); - cy.getByTestSubj('input').type(`{selectall}{backspace}${newDescription}`); - cy.getByTestSubj('commandTypeField').click(); + describe('User with access can edit and delete an endpoint response action', () => { + let ruleId: string; + let ruleName: string; + const testedCommand = 'isolate'; + const newDescription = 'Example isolate host description'; + + beforeEach(() => { + login(ROLE.endpoint_response_actions_access); + loadRule().then((res) => { + ruleId = res.id; + ruleName = res.name; + }); }); - validateAvailableCommands(); - cy.intercept('PUT', '/api/detection_engine/rules').as('updateResponseAction'); - cy.getByTestSubj('ruleEditSubmitButton').click(); - cy.wait('@updateResponseAction').should(({ request }) => { - const query = { - action_type_id: RESPONSE_ACTION_TYPES.ENDPOINT, - params: { - command: testedCommand, - comment: newDescription, - }, - }; - expect(request.body.response_actions[0]).to.deep.equal(query); + afterEach(() => { + cleanupRule(ruleId); }); - cy.contains(`${ruleName} was saved`).should('exist'); - }); - it('delete response action inside of a rule', () => { - visitRuleActions(ruleId); - cy.getByTestSubj('edit-rule-actions-tab').click(); + it('edit response action inside of a rule', () => { + visitRuleActions(ruleId); + cy.getByTestSubj('edit-rule-actions-tab').click(); - cy.getByTestSubj(`response-actions-list-item-0`).within(() => { - cy.getByTestSubj('remove-response-action').click(); + cy.getByTestSubj(`response-actions-list-item-0`).within(() => { + cy.getByTestSubj('input').should('have.value', 'Isolate host'); + cy.getByTestSubj('input').should('have.value', 'Isolate host'); + cy.getByTestSubj('input').type(`{selectall}{backspace}${newDescription}`); + cy.getByTestSubj('commandTypeField').click(); + }); + validateAvailableCommands(); + cy.intercept('PUT', '/api/detection_engine/rules').as('updateResponseAction'); + cy.getByTestSubj('ruleEditSubmitButton').click(); + cy.wait('@updateResponseAction').should(({ request }) => { + const query = { + action_type_id: RESPONSE_ACTION_TYPES.ENDPOINT, + params: { + command: testedCommand, + comment: newDescription, + }, + }; + expect(request.body.response_actions[0]).to.deep.equal(query); + }); + cy.contains(`${ruleName} was saved`).should('exist'); }); - cy.intercept('PUT', '/api/detection_engine/rules').as('deleteResponseAction'); - cy.getByTestSubj('ruleEditSubmitButton').click(); - cy.wait('@deleteResponseAction').should(({ request }) => { - expect(request.body.response_actions).to.be.equal(undefined); + + it('delete response action inside of a rule', () => { + visitRuleActions(ruleId); + cy.getByTestSubj('edit-rule-actions-tab').click(); + + cy.getByTestSubj(`response-actions-list-item-0`).within(() => { + cy.getByTestSubj('remove-response-action').click(); + }); + cy.intercept('PUT', '/api/detection_engine/rules').as('deleteResponseAction'); + cy.getByTestSubj('ruleEditSubmitButton').click(); + cy.wait('@deleteResponseAction').should(({ request }) => { + expect(request.body.response_actions).to.be.equal(undefined); + }); + cy.contains(`${ruleName} was saved`).should('exist'); }); - cy.contains(`${ruleName} was saved`).should('exist'); }); - }); - describe('User should not see endpoint action when no rbac', () => { - const [ruleName, ruleDescription] = generateRandomStringName(2); + describe('User should not see endpoint action when no rbac', () => { + const [ruleName, ruleDescription] = generateRandomStringName(2); - beforeEach(() => { - login(ROLE.endpoint_response_actions_no_access); - }); + beforeEach(() => { + login(ROLE.endpoint_response_actions_no_access); + }); - it('response actions are disabled', () => { - fillUpNewRule(ruleName, ruleDescription); - cy.getByTestSubj('response-actions-wrapper').within(() => { - cy.getByTestSubj('Endpoint Security-response-action-type-selection-option').should( - 'be.disabled' - ); + it('response actions are disabled', () => { + fillUpNewRule(ruleName, ruleDescription); + cy.getByTestSubj('response-actions-wrapper').within(() => { + cy.getByTestSubj('Endpoint Security-response-action-type-selection-option').should( + 'be.disabled' + ); + }); }); }); - }); - describe('User without access can not edit, add nor delete an endpoint response action', () => { - let ruleId: string; + describe('User without access can not edit, add nor delete an endpoint response action', () => { + let ruleId: string; - beforeEach(() => { - login(ROLE.endpoint_response_actions_no_access); - loadRule().then((res) => { - ruleId = res.id; + beforeEach(() => { + login(ROLE.endpoint_response_actions_no_access); + loadRule().then((res) => { + ruleId = res.id; + }); }); - }); - afterEach(() => { - cleanupRule(ruleId); - }); + afterEach(() => { + cleanupRule(ruleId); + }); - it('All response action controls are disabled', () => { - cy.intercept('GET', `${FIELDS_FOR_WILDCARD_PATH}*`).as('getFieldsForWildcard'); - visitRuleActions(ruleId); - cy.wait('@getFieldsForWildcard'); - cy.getByTestSubj('edit-rule-actions-tab').click(); + it('All response action controls are disabled', () => { + cy.intercept('GET', `${FIELDS_FOR_WILDCARD_PATH}*`).as('getFieldsForWildcard'); + visitRuleActions(ruleId); + cy.wait('@getFieldsForWildcard'); + cy.getByTestSubj('edit-rule-actions-tab').click(); - cy.getByTestSubj('response-actions-wrapper').within(() => { - cy.getByTestSubj('Endpoint Security-response-action-type-selection-option').should( - 'be.disabled' - ); - }); - cy.getByTestSubj(`response-actions-list-item-0`).within(() => { - cy.getByTestSubj('commandTypeField').should('have.text', 'isolate').and('be.disabled'); - cy.getByTestSubj('input').should('have.value', 'Isolate host').and('be.disabled'); - cy.getByTestSubj('remove-response-action').should('be.disabled'); - // Try removing action - cy.getByTestSubj('remove-response-action').click({ force: true }); + cy.getByTestSubj('response-actions-wrapper').within(() => { + cy.getByTestSubj('Endpoint Security-response-action-type-selection-option').should( + 'be.disabled' + ); + }); + cy.getByTestSubj(`response-actions-list-item-0`).within(() => { + cy.getByTestSubj('commandTypeField').should('have.text', 'isolate').and('be.disabled'); + cy.getByTestSubj('input').should('have.value', 'Isolate host').and('be.disabled'); + cy.getByTestSubj('remove-response-action').should('be.disabled'); + // Try removing action + cy.getByTestSubj('remove-response-action').click({ force: true }); + }); + cy.getByTestSubj(`response-actions-list-item-0`).should('exist'); + tryAddingDisabledResponseAction(1); }); - cy.getByTestSubj(`response-actions-list-item-0`).should('exist'); - tryAddingDisabledResponseAction(1); }); - }); -}); + } +); diff --git a/x-pack/plugins/security_solution/public/management/cypress/e2e/automated_response_actions/history_log.cy.ts b/x-pack/plugins/security_solution/public/management/cypress/e2e/automated_response_actions/history_log.cy.ts index dbe75b576ac9c9..cbf66d5b5cbbcb 100644 --- a/x-pack/plugins/security_solution/public/management/cypress/e2e/automated_response_actions/history_log.cy.ts +++ b/x-pack/plugins/security_solution/public/management/cypress/e2e/automated_response_actions/history_log.cy.ts @@ -14,7 +14,14 @@ import { login, ROLE } from '../../tasks/login'; describe( 'Response actions history page', - { tags: ['@ess', '@serverless', '@brokenInServerless'] }, + { + tags: [ + '@ess', + '@serverless', + // Not supported in serverless! Currently using a custom role that is not available in serverless + '@brokenInServerless', + ], + }, () => { let endpointData: ReturnTypeFromChainable | undefined; let endpointDataWithAutomated: ReturnTypeFromChainable | undefined; diff --git a/x-pack/plugins/security_solution/public/management/cypress/e2e/automated_response_actions/no_license.cy.ts b/x-pack/plugins/security_solution/public/management/cypress/e2e/automated_response_actions/no_license.cy.ts index d3c940b8698355..0869f10c73ef0b 100644 --- a/x-pack/plugins/security_solution/public/management/cypress/e2e/automated_response_actions/no_license.cy.ts +++ b/x-pack/plugins/security_solution/public/management/cypress/e2e/automated_response_actions/no_license.cy.ts @@ -34,8 +34,7 @@ describe('No License', { tags: '@ess', env: { ftrConfig: { license: 'basic' } } }); }); - // FIXME: Flaky. Needs fixing (security team issue #7763) - describe.skip('User cannot see results', () => { + describe('User cannot see results', () => { let endpointData: ReturnTypeFromChainable | undefined; let alertData: ReturnTypeFromChainable | undefined; const [endpointAgentId, endpointHostname] = generateRandomStringName(2); diff --git a/x-pack/plugins/security_solution/public/management/cypress/e2e/automated_response_actions/results.cy.ts b/x-pack/plugins/security_solution/public/management/cypress/e2e/automated_response_actions/results.cy.ts index 409fe4546ddbc5..10272e5600583e 100644 --- a/x-pack/plugins/security_solution/public/management/cypress/e2e/automated_response_actions/results.cy.ts +++ b/x-pack/plugins/security_solution/public/management/cypress/e2e/automated_response_actions/results.cy.ts @@ -15,7 +15,7 @@ import { indexEndpointRuleAlerts } from '../../tasks/index_endpoint_rule_alerts' import { login, ROLE } from '../../tasks/login'; -describe('Results', { tags: ['@ess', '@serverless', '@brokenInServerless'] }, () => { +describe('Results', { tags: ['@ess', '@serverless'] }, () => { let endpointData: ReturnTypeFromChainable | undefined; let alertData: ReturnTypeFromChainable | undefined; const [endpointAgentId, endpointHostname] = generateRandomStringName(2); @@ -50,39 +50,57 @@ describe('Results', { tags: ['@ess', '@serverless', '@brokenInServerless'] }, () } }); - describe('see results when has RBAC', () => { - before(() => { - login(ROLE.endpoint_response_actions_access); - disableExpandableFlyoutAdvancedSettings(); - }); + describe( + 'see results when has RBAC', + { + // Not supported in serverless! + // The `disableExpandableFlyoutAdvancedSettings()` fails because the API + // `internal/kibana/settings` is not accessible in serverless + tags: ['@brokenInServerless'], + }, + () => { + before(() => { + login(ROLE.endpoint_response_actions_access); + disableExpandableFlyoutAdvancedSettings(); + }); - it('see endpoint action', () => { - cy.visit(APP_ALERTS_PATH); - closeAllToasts(); - cy.getByTestSubj('expand-event').first().click(); - cy.getByTestSubj('response-actions-notification').should('not.have.text', '0'); - cy.getByTestSubj('responseActionsViewTab').click(); - cy.getByTestSubj('endpoint-results-comment'); - cy.contains(/isolate is pending|isolate completed successfully/g); - }); - }); - describe('do not see results results when does not have RBAC', () => { - before(() => { - login(ROLE.endpoint_response_actions_no_access); - disableExpandableFlyoutAdvancedSettings(); - }); + it('see endpoint action', () => { + cy.visit(APP_ALERTS_PATH); + closeAllToasts(); + cy.getByTestSubj('expand-event').first().click(); + cy.getByTestSubj('response-actions-notification').should('not.have.text', '0'); + cy.getByTestSubj('responseActionsViewTab').click(); + cy.getByTestSubj('endpoint-results-comment'); + cy.contains(/isolate is pending|isolate completed successfully/g); + }); + } + ); + describe( + 'do not see results results when does not have RBAC', + { + // Not supported in serverless! + // The `disableExpandableFlyoutAdvancedSettings()` fails because the API + // `internal/kibana/settings` is not accessible in serverless + tags: ['@brokenInServerless'], + }, + () => { + before(() => { + login(ROLE.endpoint_response_actions_no_access); + disableExpandableFlyoutAdvancedSettings(); + }); - it('show the permission denied callout', () => { - cy.visit(APP_ALERTS_PATH); - closeAllToasts(); + it('show the permission denied callout', () => { + cy.visit(APP_ALERTS_PATH); + closeAllToasts(); - cy.getByTestSubj('expand-event').first().click(); - cy.getByTestSubj('response-actions-notification').should('not.have.text', '0'); - cy.getByTestSubj('responseActionsViewTab').click(); - cy.contains('Permission denied'); - cy.contains( - 'To access these results, ask your administrator for Elastic Defend Kibana privileges.' - ); - }); - }); + cy.getByTestSubj('expand-event').first().click(); + cy.getByTestSubj('response-actions-notification').should('not.have.text', '0'); + cy.getByTestSubj('responseActionsViewTab').click(); + cy.contains('Permission denied'); + cy.contains( + 'To access these results, ask your administrator for Elastic Defend Kibana privileges.' + ); + }); + } + ); }); diff --git a/x-pack/plugins/security_solution/public/management/cypress/e2e/endpoint_alerts.cy.ts b/x-pack/plugins/security_solution/public/management/cypress/e2e/endpoint_alerts.cy.ts index d79d27a774eac7..bf6dc8c57a478b 100644 --- a/x-pack/plugins/security_solution/public/management/cypress/e2e/endpoint_alerts.cy.ts +++ b/x-pack/plugins/security_solution/public/management/cypress/e2e/endpoint_alerts.cy.ts @@ -20,80 +20,76 @@ import { EXECUTE_ROUTE } from '../../../../common/endpoint/constants'; import { waitForActionToComplete } from '../tasks/response_actions'; // FIXME: Flaky. Needs fixing (security team issue #7763) -describe.skip( - 'Endpoint generated alerts', - { tags: ['@ess', '@serverless', '@brokenInServerless'] }, - () => { - let indexedPolicy: IndexedFleetEndpointPolicyResponse; - let policy: PolicyData; - let createdHost: CreateAndEnrollEndpointHostResponse; +describe.skip('Endpoint generated alerts', { tags: ['@ess', '@serverless'] }, () => { + let indexedPolicy: IndexedFleetEndpointPolicyResponse; + let policy: PolicyData; + let createdHost: CreateAndEnrollEndpointHostResponse; - before(() => { - getEndpointIntegrationVersion().then((version) => { - createAgentPolicyTask(version, 'alerts test').then((data) => { - indexedPolicy = data; - policy = indexedPolicy.integrationPolicies[0]; + before(() => { + getEndpointIntegrationVersion().then((version) => { + createAgentPolicyTask(version, 'alerts test').then((data) => { + indexedPolicy = data; + policy = indexedPolicy.integrationPolicies[0]; - return enableAllPolicyProtections(policy.id).then(() => { - // Create and enroll a new Endpoint host - return createEndpointHost(policy.policy_id).then((host) => { - createdHost = host as CreateAndEnrollEndpointHostResponse; - }); + return enableAllPolicyProtections(policy.id).then(() => { + // Create and enroll a new Endpoint host + return createEndpointHost(policy.policy_id).then((host) => { + createdHost = host as CreateAndEnrollEndpointHostResponse; }); }); }); }); + }); - after(() => { - if (createdHost) { - cy.task('destroyEndpointHost', createdHost); - } + after(() => { + if (createdHost) { + cy.task('destroyEndpointHost', createdHost); + } - if (indexedPolicy) { - cy.task('deleteIndexedFleetEndpointPolicies', indexedPolicy); - } + if (indexedPolicy) { + cy.task('deleteIndexedFleetEndpointPolicies', indexedPolicy); + } - if (createdHost) { - deleteAllLoadedEndpointData({ endpointAgentIds: [createdHost.agentId] }); - } - }); + if (createdHost) { + deleteAllLoadedEndpointData({ endpointAgentIds: [createdHost.agentId] }); + } + }); - beforeEach(() => { - login(); - }); + beforeEach(() => { + login(); + }); - it('should create a Detection Engine alert from an endpoint alert', () => { - // Triggers a Malicious Behaviour alert on Linux system (`grep *` was added only to identify this specific alert) - const executeMaliciousCommand = `bash -c cat /dev/tcp/foo | grep ${Math.random() - .toString(16) - .substring(2)}`; + it('should create a Detection Engine alert from an endpoint alert', () => { + // Triggers a Malicious Behaviour alert on Linux system (`grep *` was added only to identify this specific alert) + const executeMaliciousCommand = `bash -c cat /dev/tcp/foo | grep ${Math.random() + .toString(16) + .substring(2)}`; - // Send `execute` command that triggers malicious behaviour using the `execute` response action - request({ - method: 'POST', - url: EXECUTE_ROUTE, - body: { - endpoint_ids: [createdHost.agentId], - parameters: { - command: executeMaliciousCommand, - }, + // Send `execute` command that triggers malicious behaviour using the `execute` response action + request({ + method: 'POST', + url: EXECUTE_ROUTE, + body: { + endpoint_ids: [createdHost.agentId], + parameters: { + command: executeMaliciousCommand, }, + }, + }) + .then((response) => waitForActionToComplete(response.body.data.id)) + .then(() => { + return waitForEndpointAlerts(createdHost.agentId, [ + { + term: { 'process.group_leader.args': executeMaliciousCommand }, + }, + ]); }) - .then((response) => waitForActionToComplete(response.body.data.id)) - .then(() => { - return waitForEndpointAlerts(createdHost.agentId, [ - { - term: { 'process.group_leader.args': executeMaliciousCommand }, - }, - ]); - }) - .then(() => { - return navigateToAlertsList( - `query=(language:kuery,query:'agent.id: "${createdHost.agentId}" ')` - ); - }); + .then(() => { + return navigateToAlertsList( + `query=(language:kuery,query:'agent.id: "${createdHost.agentId}" ')` + ); + }); - getAlertsTableRows().should('have.length.greaterThan', 0); - }); - } -); + getAlertsTableRows().should('have.length.greaterThan', 0); + }); +}); diff --git a/x-pack/plugins/security_solution/public/management/cypress/e2e/endpoint_list/endpoints.cy.ts b/x-pack/plugins/security_solution/public/management/cypress/e2e/endpoint_list/endpoints.cy.ts index 8e8c989612cbe2..b7d9244040aa0a 100644 --- a/x-pack/plugins/security_solution/public/management/cypress/e2e/endpoint_list/endpoints.cy.ts +++ b/x-pack/plugins/security_solution/public/management/cypress/e2e/endpoint_list/endpoints.cy.ts @@ -33,7 +33,7 @@ import { deleteAllLoadedEndpointData } from '../../tasks/delete_all_endpoint_dat import { enableAllPolicyProtections } from '../../tasks/endpoint_policy'; // FLAKY: https://github.com/elastic/kibana/issues/168284 -describe.skip('Endpoints page', { tags: ['@ess', '@serverless', '@brokenInServerless'] }, () => { +describe.skip('Endpoints page', { tags: ['@ess', '@serverless'] }, () => { let indexedPolicy: IndexedFleetEndpointPolicyResponse; let policy: PolicyData; let createdHost: CreateAndEnrollEndpointHostResponse; diff --git a/x-pack/plugins/security_solution/public/management/cypress/e2e/policy/policy_details.cy.ts b/x-pack/plugins/security_solution/public/management/cypress/e2e/policy/policy_details.cy.ts index c391fda353e41a..3cfa2a5c9287d3 100644 --- a/x-pack/plugins/security_solution/public/management/cypress/e2e/policy/policy_details.cy.ts +++ b/x-pack/plugins/security_solution/public/management/cypress/e2e/policy/policy_details.cy.ts @@ -19,7 +19,14 @@ import { disableExpandableFlyoutAdvancedSettings, loadPage } from '../../tasks/c describe( 'Policy Details', { - tags: ['@ess', '@serverless', '@brokenInServerless'], + tags: [ + '@ess', + '@serverless', + // Not supported in serverless! + // The `disableExpandableFlyoutAdvancedSettings()` fails because the API + // `internal/kibana/settings` is not accessible in serverless + '@brokenInServerless', + ], env: { ftrConfig: { enableExperimental: ['protectionUpdatesEnabled'] } }, }, () => { @@ -203,7 +210,7 @@ describe( const oneWeekAgo = moment.utc().subtract(1, 'weeks'); beforeEach(() => { - login(ROLE.endpoint_security_policy_management_read); + login(ROLE.t3_analyst); disableExpandableFlyoutAdvancedSettings(); getEndpointIntegrationVersion().then((version) => { createAgentPolicyTask(version).then((data) => { @@ -251,7 +258,7 @@ describe( const oneWeekAgo = moment.utc().subtract(1, 'weeks'); beforeEach(() => { - login(ROLE.endpoint_security_policy_management_read); + login(ROLE.t3_analyst); disableExpandableFlyoutAdvancedSettings(); getEndpointIntegrationVersion().then((version) => { createAgentPolicyTask(version).then((data) => { diff --git a/x-pack/plugins/security_solution/public/management/cypress/e2e/policy/policy_experimental_features_disabled.cy.ts b/x-pack/plugins/security_solution/public/management/cypress/e2e/policy/policy_experimental_features_disabled.cy.ts index 6605dd43a9e082..2e791b23f0d466 100644 --- a/x-pack/plugins/security_solution/public/management/cypress/e2e/policy/policy_experimental_features_disabled.cy.ts +++ b/x-pack/plugins/security_solution/public/management/cypress/e2e/policy/policy_experimental_features_disabled.cy.ts @@ -13,87 +13,100 @@ import { login } from '../../tasks/login'; import { createAgentPolicyTask, getEndpointIntegrationVersion } from '../../tasks/fleet'; // We need a way to disable experimental features in the Cypress tests -describe.skip('Disabled experimental features on: ', { tags: ['@ess', '@serverless'] }, () => { - describe('Policy list', () => { - describe('Renders policy list without protection updates feature flag', () => { - let indexedPolicy: IndexedFleetEndpointPolicyResponse; +describe.skip( + 'Disabled experimental features on: ', + { + tags: [ + '@ess', + '@serverless', + // Not supported in serverless! + // The `disableExpandableFlyoutAdvancedSettings()` fails because the API + // `internal/kibana/settings` is not accessible in serverless + '@brokenInServerless', + ], + }, + () => { + describe('Policy list', () => { + describe('Renders policy list without protection updates feature flag', () => { + let indexedPolicy: IndexedFleetEndpointPolicyResponse; - beforeEach(() => { - login(); - disableExpandableFlyoutAdvancedSettings(); - }); + beforeEach(() => { + login(); + disableExpandableFlyoutAdvancedSettings(); + }); - before(() => { - getEndpointIntegrationVersion().then((version) => { - createAgentPolicyTask(version).then((data) => { - indexedPolicy = data; + before(() => { + getEndpointIntegrationVersion().then((version) => { + createAgentPolicyTask(version).then((data) => { + indexedPolicy = data; + }); }); }); - }); - after(() => { - if (indexedPolicy) { - cy.task('deleteIndexedFleetEndpointPolicies', indexedPolicy); - } - }); + after(() => { + if (indexedPolicy) { + cy.task('deleteIndexedFleetEndpointPolicies', indexedPolicy); + } + }); - it('should render the list', () => { - loadPage('/app/security/administration/policy'); - cy.getByTestSubj('tableHeaderCell_Name_0'); - cy.getByTestSubj('tableHeaderCell_Deployed Version_1').should('not.exist'); - cy.getByTestSubj('tableHeaderCell_created_by_1'); - cy.getByTestSubj('tableHeaderCell_created_at_2'); - cy.getByTestSubj('tableHeaderCell_updated_by_3'); - cy.getByTestSubj('tableHeaderCell_updated_at_4'); - cy.getByTestSubj('tableHeaderCell_Endpoints_5'); - cy.getByTestSubj('policy-list-outdated-manifests-call-out').should('not.exist'); - cy.getByTestSubj('policyDeployedVersion').should('not.exist'); + it('should render the list', () => { + loadPage('/app/security/administration/policy'); + cy.getByTestSubj('tableHeaderCell_Name_0'); + cy.getByTestSubj('tableHeaderCell_Deployed Version_1').should('not.exist'); + cy.getByTestSubj('tableHeaderCell_created_by_1'); + cy.getByTestSubj('tableHeaderCell_created_at_2'); + cy.getByTestSubj('tableHeaderCell_updated_by_3'); + cy.getByTestSubj('tableHeaderCell_updated_at_4'); + cy.getByTestSubj('tableHeaderCell_Endpoints_5'); + cy.getByTestSubj('policy-list-outdated-manifests-call-out').should('not.exist'); + cy.getByTestSubj('policyDeployedVersion').should('not.exist'); + }); }); }); - }); - describe('Policy details', () => { - describe('Renders policy details without protection updates feature flag', () => { - let indexedPolicy: IndexedFleetEndpointPolicyResponse; - let policy: PolicyData; + describe('Policy details', () => { + describe('Renders policy details without protection updates feature flag', () => { + let indexedPolicy: IndexedFleetEndpointPolicyResponse; + let policy: PolicyData; - beforeEach(() => { - login(); - disableExpandableFlyoutAdvancedSettings(); - }); + beforeEach(() => { + login(); + disableExpandableFlyoutAdvancedSettings(); + }); - before(() => { - getEndpointIntegrationVersion().then((version) => { - createAgentPolicyTask(version).then((data) => { - indexedPolicy = data; - policy = indexedPolicy.integrationPolicies[0]; + before(() => { + getEndpointIntegrationVersion().then((version) => { + createAgentPolicyTask(version).then((data) => { + indexedPolicy = data; + policy = indexedPolicy.integrationPolicies[0]; + }); }); }); - }); - after(() => { - if (indexedPolicy) { - cy.task('deleteIndexedFleetEndpointPolicies', indexedPolicy); - } - }); + after(() => { + if (indexedPolicy) { + cy.task('deleteIndexedFleetEndpointPolicies', indexedPolicy); + } + }); - it('should return 404 on policyUpdates url', () => { - loadPage(`/app/security/administration/policy/${policy.id}/protectionUpdates`); - cy.getByTestSubj('notFoundPage'); - cy.getByTestSubj('protection-updates-automatic-updates-enabled').should('not.exist'); - }); + it('should return 404 on policyUpdates url', () => { + loadPage(`/app/security/administration/policy/${policy.id}/protectionUpdates`); + cy.getByTestSubj('notFoundPage'); + cy.getByTestSubj('protection-updates-automatic-updates-enabled').should('not.exist'); + }); - it('should render policy details without protection updates tab', () => { - loadPage(`/app/security/administration/policy/${policy.id}`); - cy.get('div[role="tablist"]').within(() => { - cy.contains('Protection updates').should('not.exist'); - cy.get('#settings'); - cy.get('#trustedApps'); - cy.get('#hostIsolationExceptions'); - cy.get('#blocklists'); - cy.get('#protectionUpdates').should('not.exist'); + it('should render policy details without protection updates tab', () => { + loadPage(`/app/security/administration/policy/${policy.id}`); + cy.get('div[role="tablist"]').within(() => { + cy.contains('Protection updates').should('not.exist'); + cy.get('#settings'); + cy.get('#trustedApps'); + cy.get('#hostIsolationExceptions'); + cy.get('#blocklists'); + cy.get('#protectionUpdates').should('not.exist'); + }); }); }); }); - }); -}); + } +); diff --git a/x-pack/plugins/security_solution/public/management/cypress/e2e/policy/policy_list.cy.ts b/x-pack/plugins/security_solution/public/management/cypress/e2e/policy/policy_list.cy.ts index cee11198408814..f5eb67a33c943d 100644 --- a/x-pack/plugins/security_solution/public/management/cypress/e2e/policy/policy_list.cy.ts +++ b/x-pack/plugins/security_solution/public/management/cypress/e2e/policy/policy_list.cy.ts @@ -16,6 +16,9 @@ import { createAgentPolicyTask, getEndpointIntegrationVersion } from '../../task describe( 'Policy List', { + // Not supported in serverless! + // The `disableExpandableFlyoutAdvancedSettings()` fails because the API + // `internal/kibana/settings` is not accessible in serverless tags: ['@ess', '@serverless', '@brokenInServerless'], env: { ftrConfig: { enableExperimental: ['protectionUpdatesEnabled'] } }, }, diff --git a/x-pack/plugins/security_solution/public/management/cypress/e2e/response_actions/isolate.cy.ts b/x-pack/plugins/security_solution/public/management/cypress/e2e/response_actions/isolate.cy.ts index ada452213b74d7..a81a921c397029 100644 --- a/x-pack/plugins/security_solution/public/management/cypress/e2e/response_actions/isolate.cy.ts +++ b/x-pack/plugins/security_solution/public/management/cypress/e2e/response_actions/isolate.cy.ts @@ -31,231 +31,245 @@ import { createEndpointHost } from '../../tasks/create_endpoint_host'; import { deleteAllLoadedEndpointData } from '../../tasks/delete_all_endpoint_data'; import { enableAllPolicyProtections } from '../../tasks/endpoint_policy'; -describe.skip('Isolate command', { tags: ['@ess', '@serverless', '@brokenInServerless'] }, () => { - let isolateComment: string; - let releaseComment: string; - let indexedPolicy: IndexedFleetEndpointPolicyResponse; - let policy: PolicyData; - let createdHost: CreateAndEnrollEndpointHostResponse; - - before(() => { - getEndpointIntegrationVersion().then((version) => { - createAgentPolicyTask(version).then((data) => { - indexedPolicy = data; - policy = indexedPolicy.integrationPolicies[0]; - - return enableAllPolicyProtections(policy.id).then(() => { - // Create and enroll a new Endpoint host - return createEndpointHost(policy.policy_id).then((host) => { - createdHost = host as CreateAndEnrollEndpointHostResponse; - isolateComment = `Isolating ${host.hostname}`; - releaseComment = `Releasing ${host.hostname}`; +describe.skip( + 'Isolate command', + { + tags: [ + '@ess', + '@serverless', + + // Not supported in serverless! + // The `disableExpandableFlyoutAdvancedSettings()` fails because the API + // `internal/kibana/settings` is not accessible in serverless + '@brokenInServerless', + ], + }, + () => { + let isolateComment: string; + let releaseComment: string; + let indexedPolicy: IndexedFleetEndpointPolicyResponse; + let policy: PolicyData; + let createdHost: CreateAndEnrollEndpointHostResponse; + + before(() => { + getEndpointIntegrationVersion().then((version) => { + createAgentPolicyTask(version).then((data) => { + indexedPolicy = data; + policy = indexedPolicy.integrationPolicies[0]; + + return enableAllPolicyProtections(policy.id).then(() => { + // Create and enroll a new Endpoint host + return createEndpointHost(policy.policy_id).then((host) => { + createdHost = host as CreateAndEnrollEndpointHostResponse; + isolateComment = `Isolating ${host.hostname}`; + releaseComment = `Releasing ${host.hostname}`; + }); }); }); }); }); - }); - - after(() => { - if (createdHost) { - cy.task('destroyEndpointHost', createdHost); - } - - if (indexedPolicy) { - cy.task('deleteIndexedFleetEndpointPolicies', indexedPolicy); - } - - if (createdHost) { - deleteAllLoadedEndpointData({ endpointAgentIds: [createdHost.agentId] }); - } - }); - - beforeEach(() => { - login(); - disableExpandableFlyoutAdvancedSettings(); - }); - - describe('From manage', () => { - it('should allow filtering endpoint by Isolated status', () => { - loadPage(APP_ENDPOINTS_PATH); - closeAllToasts(); - cy.getByTestSubj('globalLoadingIndicator-hidden').should('exist'); - checkEndpointListForOnlyUnIsolatedHosts(); - - filterOutIsolatedHosts(); - cy.contains('No items found'); - cy.getByTestSubj('adminSearchBar').type('{selectall}{backspace}'); - cy.getByTestSubj('querySubmitButton').click(); - cy.getByTestSubj('endpointTableRowActions').click(); - cy.getByTestSubj('isolateLink').click(); - - cy.contains(`Isolate host ${createdHost.hostname} from network.`); - cy.getByTestSubj('endpointHostIsolationForm'); - cy.getByTestSubj('host_isolation_comment').type(isolateComment); - cy.getByTestSubj('hostIsolateConfirmButton').click(); - cy.contains(`Isolation on host ${createdHost.hostname} successfully submitted`); - cy.getByTestSubj('euiFlyoutCloseButton').click(); - cy.getByTestSubj('rowHostStatus-actionStatuses').should('contain.text', 'Isolated'); - filterOutIsolatedHosts(); - - checkEndpointListForOnlyIsolatedHosts(); - - cy.getByTestSubj('endpointTableRowActions').click(); - cy.getByTestSubj('unIsolateLink').click(); - releaseHostWithComment(releaseComment, createdHost.hostname); - cy.contains('Confirm').click(); - cy.getByTestSubj('euiFlyoutCloseButton').click(); - cy.getByTestSubj('adminSearchBar').type('{selectall}{backspace}'); - cy.getByTestSubj('querySubmitButton').click(); - checkEndpointListForOnlyUnIsolatedHosts(); + + after(() => { + if (createdHost) { + cy.task('destroyEndpointHost', createdHost); + } + + if (indexedPolicy) { + cy.task('deleteIndexedFleetEndpointPolicies', indexedPolicy); + } + + if (createdHost) { + deleteAllLoadedEndpointData({ endpointAgentIds: [createdHost.agentId] }); + } }); - }); - describe('From alerts', () => { - let ruleId: string; - let ruleName: string; + beforeEach(() => { + login(); + disableExpandableFlyoutAdvancedSettings(); + }); - before(() => { - loadRule( - { query: `agent.name: ${createdHost.hostname} and agent.type: endpoint` }, - false - ).then((data) => { - ruleId = data.id; - ruleName = data.name; + describe('From manage', () => { + it('should allow filtering endpoint by Isolated status', () => { + loadPage(APP_ENDPOINTS_PATH); + closeAllToasts(); + cy.getByTestSubj('globalLoadingIndicator-hidden').should('exist'); + checkEndpointListForOnlyUnIsolatedHosts(); + + filterOutIsolatedHosts(); + cy.contains('No items found'); + cy.getByTestSubj('adminSearchBar').type('{selectall}{backspace}'); + cy.getByTestSubj('querySubmitButton').click(); + cy.getByTestSubj('endpointTableRowActions').click(); + cy.getByTestSubj('isolateLink').click(); + + cy.contains(`Isolate host ${createdHost.hostname} from network.`); + cy.getByTestSubj('endpointHostIsolationForm'); + cy.getByTestSubj('host_isolation_comment').type(isolateComment); + cy.getByTestSubj('hostIsolateConfirmButton').click(); + cy.contains(`Isolation on host ${createdHost.hostname} successfully submitted`); + cy.getByTestSubj('euiFlyoutCloseButton').click(); + cy.getByTestSubj('rowHostStatus-actionStatuses').should('contain.text', 'Isolated'); + filterOutIsolatedHosts(); + + checkEndpointListForOnlyIsolatedHosts(); + + cy.getByTestSubj('endpointTableRowActions').click(); + cy.getByTestSubj('unIsolateLink').click(); + releaseHostWithComment(releaseComment, createdHost.hostname); + cy.contains('Confirm').click(); + cy.getByTestSubj('euiFlyoutCloseButton').click(); + cy.getByTestSubj('adminSearchBar').type('{selectall}{backspace}'); + cy.getByTestSubj('querySubmitButton').click(); + checkEndpointListForOnlyUnIsolatedHosts(); }); }); - after(() => { - if (ruleId) { - cleanupRule(ruleId); - } - }); + describe('From alerts', () => { + let ruleId: string; + let ruleName: string; + + before(() => { + loadRule( + { query: `agent.name: ${createdHost.hostname} and agent.type: endpoint` }, + false + ).then((data) => { + ruleId = data.id; + ruleName = data.name; + }); + }); - it('should isolate and release host', () => { - loadPage(APP_ENDPOINTS_PATH); - cy.contains(createdHost.hostname).should('exist'); + after(() => { + if (ruleId) { + cleanupRule(ruleId); + } + }); + + it('should isolate and release host', () => { + loadPage(APP_ENDPOINTS_PATH); + cy.contains(createdHost.hostname).should('exist'); - toggleRuleOffAndOn(ruleName); - visitRuleAlerts(ruleName); + toggleRuleOffAndOn(ruleName); + visitRuleAlerts(ruleName); - closeAllToasts(); - openAlertDetailsView(); + closeAllToasts(); + openAlertDetailsView(); - isolateHostWithComment(isolateComment, createdHost.hostname); + isolateHostWithComment(isolateComment, createdHost.hostname); - cy.getByTestSubj('hostIsolateConfirmButton').click(); - cy.contains(`Isolation on host ${createdHost.hostname} successfully submitted`); + cy.getByTestSubj('hostIsolateConfirmButton').click(); + cy.contains(`Isolation on host ${createdHost.hostname} successfully submitted`); - cy.getByTestSubj('euiFlyoutCloseButton').click(); - openAlertDetailsView(); + cy.getByTestSubj('euiFlyoutCloseButton').click(); + openAlertDetailsView(); - checkFlyoutEndpointIsolation(); + checkFlyoutEndpointIsolation(); - releaseHostWithComment(releaseComment, createdHost.hostname); - cy.contains('Confirm').click(); + releaseHostWithComment(releaseComment, createdHost.hostname); + cy.contains('Confirm').click(); - cy.contains(`Release on host ${createdHost.hostname} successfully submitted`); - cy.getByTestSubj('euiFlyoutCloseButton').click(); - openAlertDetailsView(); - cy.getByTestSubj('event-field-agent.status').within(() => { - cy.get('[title="Isolated"]').should('not.exist'); + cy.contains(`Release on host ${createdHost.hostname} successfully submitted`); + cy.getByTestSubj('euiFlyoutCloseButton').click(); + openAlertDetailsView(); + cy.getByTestSubj('event-field-agent.status').within(() => { + cy.get('[title="Isolated"]').should('not.exist'); + }); }); }); - }); - describe('From cases', () => { - let ruleId: string; - let ruleName: string; - let caseId: string; + describe('From cases', () => { + let ruleId: string; + let ruleName: string; + let caseId: string; - const caseOwner = 'securitySolution'; + const caseOwner = 'securitySolution'; - before(() => { - loadRule( - { query: `agent.name: ${createdHost.hostname} and agent.type: endpoint` }, - false - ).then((data) => { - ruleId = data.id; - ruleName = data.name; - }); - loadCase(caseOwner).then((data) => { - caseId = data.id; + before(() => { + loadRule( + { query: `agent.name: ${createdHost.hostname} and agent.type: endpoint` }, + false + ).then((data) => { + ruleId = data.id; + ruleName = data.name; + }); + loadCase(caseOwner).then((data) => { + caseId = data.id; + }); }); - }); - beforeEach(() => { - login(); - }); + beforeEach(() => { + login(); + }); - after(() => { - if (ruleId) { - cleanupRule(ruleId); - } - if (caseId) { - cleanupCase(caseId); - } - }); + after(() => { + if (ruleId) { + cleanupRule(ruleId); + } + if (caseId) { + cleanupCase(caseId); + } + }); - it('should isolate and release host', () => { - loadPage(APP_ENDPOINTS_PATH); - cy.contains(createdHost.hostname).should('exist'); + it('should isolate and release host', () => { + loadPage(APP_ENDPOINTS_PATH); + cy.contains(createdHost.hostname).should('exist'); - toggleRuleOffAndOn(ruleName); + toggleRuleOffAndOn(ruleName); - visitRuleAlerts(ruleName); - closeAllToasts(); + visitRuleAlerts(ruleName); + closeAllToasts(); - openAlertDetailsView(); + openAlertDetailsView(); - cy.getByTestSubj('add-to-existing-case-action').click(); - cy.getByTestSubj(`cases-table-row-select-${caseId}`).click(); - cy.contains(`An alert was added to \"Test ${caseOwner} case`); + cy.getByTestSubj('add-to-existing-case-action').click(); + cy.getByTestSubj(`cases-table-row-select-${caseId}`).click(); + cy.contains(`An alert was added to \"Test ${caseOwner} case`); - cy.intercept('GET', `/api/cases/${caseId}/user_actions/_find*`).as('case'); - loadPage(`${APP_CASES_PATH}/${caseId}`); - cy.wait('@case', { timeout: 30000 }).then(({ response: res }) => { - const caseAlertId = res?.body.userActions[1].id; + cy.intercept('GET', `/api/cases/${caseId}/user_actions/_find*`).as('case'); + loadPage(`${APP_CASES_PATH}/${caseId}`); + cy.wait('@case', { timeout: 30000 }).then(({ response: res }) => { + const caseAlertId = res?.body.userActions[1].id; - closeAllToasts(); - openCaseAlertDetails(caseAlertId); - isolateHostWithComment(isolateComment, createdHost.hostname); - cy.getByTestSubj('hostIsolateConfirmButton').click(); + closeAllToasts(); + openCaseAlertDetails(caseAlertId); + isolateHostWithComment(isolateComment, createdHost.hostname); + cy.getByTestSubj('hostIsolateConfirmButton').click(); - cy.getByTestSubj('euiFlyoutCloseButton').click(); + cy.getByTestSubj('euiFlyoutCloseButton').click(); - cy.getByTestSubj('user-actions-list').within(() => { - cy.contains(isolateComment); - cy.get('[aria-label="lock"]').should('exist'); - cy.get('[aria-label="lockOpen"]').should('not.exist'); - }); + cy.getByTestSubj('user-actions-list').within(() => { + cy.contains(isolateComment); + cy.get('[aria-label="lock"]').should('exist'); + cy.get('[aria-label="lockOpen"]').should('not.exist'); + }); - waitForReleaseOption(caseAlertId); + waitForReleaseOption(caseAlertId); - releaseHostWithComment(releaseComment, createdHost.hostname); + releaseHostWithComment(releaseComment, createdHost.hostname); - cy.contains('Confirm').click(); + cy.contains('Confirm').click(); - cy.contains(`Release on host ${createdHost.hostname} successfully submitted`); - cy.getByTestSubj('euiFlyoutCloseButton').click(); + cy.contains(`Release on host ${createdHost.hostname} successfully submitted`); + cy.getByTestSubj('euiFlyoutCloseButton').click(); - cy.getByTestSubj('user-actions-list').within(() => { - cy.contains(releaseComment); - cy.contains(isolateComment); - cy.get('[aria-label="lock"]').should('exist'); - cy.get('[aria-label="lockOpen"]').should('exist'); - }); + cy.getByTestSubj('user-actions-list').within(() => { + cy.contains(releaseComment); + cy.contains(isolateComment); + cy.get('[aria-label="lock"]').should('exist'); + cy.get('[aria-label="lockOpen"]').should('exist'); + }); - openCaseAlertDetails(caseAlertId); + openCaseAlertDetails(caseAlertId); - cy.getByTestSubj('event-field-agent.status').then(($status) => { - if ($status.find('[title="Isolated"]').length > 0) { - cy.getByTestSubj('euiFlyoutCloseButton').click(); - cy.getByTestSubj(`comment-action-show-alert-${caseAlertId}`).click(); - cy.getByTestSubj('take-action-dropdown-btn').click(); - } - cy.get('[title="Isolated"]').should('not.exist'); + cy.getByTestSubj('event-field-agent.status').then(($status) => { + if ($status.find('[title="Isolated"]').length > 0) { + cy.getByTestSubj('euiFlyoutCloseButton').click(); + cy.getByTestSubj(`comment-action-show-alert-${caseAlertId}`).click(); + cy.getByTestSubj('take-action-dropdown-btn').click(); + } + cy.get('[title="Isolated"]').should('not.exist'); + }); }); }); }); - }); -}); + } +); diff --git a/x-pack/plugins/security_solution/public/management/cypress/e2e/response_actions/isolate_mocked_data.cy.ts b/x-pack/plugins/security_solution/public/management/cypress/e2e/response_actions/isolate_mocked_data.cy.ts index a630d8fc4ec010..a134e623370d03 100644 --- a/x-pack/plugins/security_solution/public/management/cypress/e2e/response_actions/isolate_mocked_data.cy.ts +++ b/x-pack/plugins/security_solution/public/management/cypress/e2e/response_actions/isolate_mocked_data.cy.ts @@ -29,7 +29,7 @@ import { indexNewCase } from '../../tasks/index_new_case'; import { indexEndpointHosts } from '../../tasks/index_endpoint_hosts'; import { indexEndpointRuleAlerts } from '../../tasks/index_endpoint_rule_alerts'; -describe('Isolate command', { tags: ['@ess', '@serverless'] }, () => { +describe('Isolate command', { tags: ['@ess', '@serverless', '@brokenInServerless'] }, () => { describe('from Manage', () => { let endpointData: ReturnTypeFromChainable | undefined; let isolatedEndpointData: ReturnTypeFromChainable | undefined; @@ -89,110 +89,119 @@ describe('Isolate command', { tags: ['@ess', '@serverless'] }, () => { }); }); - describe.skip('from Alerts', () => { - let endpointData: ReturnTypeFromChainable | undefined; - let alertData: ReturnTypeFromChainable | undefined; - let hostname: string; + describe.skip( + 'from Alerts', + { + // Not supported in serverless! + // The `disableExpandableFlyoutAdvancedSettings()` fails because the API + // `internal/kibana/settings` is not accessible in serverless + tags: ['@brokenInServerless'], + }, + () => { + let endpointData: ReturnTypeFromChainable | undefined; + let alertData: ReturnTypeFromChainable | undefined; + let hostname: string; + + before(() => { + disableExpandableFlyoutAdvancedSettings(); + indexEndpointHosts({ withResponseActions: false, isolation: false }).then( + (indexEndpoints) => { + endpointData = indexEndpoints; + hostname = endpointData.data.hosts[0].host.name; + + return indexEndpointRuleAlerts({ + endpointAgentId: endpointData.data.hosts[0].agent.id, + endpointHostname: endpointData.data.hosts[0].host.name, + endpointIsolated: false, + }); + } + ); + }); - before(() => { - disableExpandableFlyoutAdvancedSettings(); - indexEndpointHosts({ withResponseActions: false, isolation: false }).then( - (indexEndpoints) => { - endpointData = indexEndpoints; - hostname = endpointData.data.hosts[0].host.name; + after(() => { + if (endpointData) { + endpointData.cleanup(); + endpointData = undefined; + } - return indexEndpointRuleAlerts({ - endpointAgentId: endpointData.data.hosts[0].agent.id, - endpointHostname: endpointData.data.hosts[0].host.name, - endpointIsolated: false, - }); + if (alertData) { + alertData.cleanup(); + alertData = undefined; } - ); - }); + }); - after(() => { - if (endpointData) { - endpointData.cleanup(); - endpointData = undefined; - } + beforeEach(() => { + login(); + }); - if (alertData) { - alertData.cleanup(); - alertData = undefined; - } - }); + it('should isolate and release host', () => { + const isolateComment = `Isolating ${hostname}`; + const releaseComment = `Releasing ${hostname}`; + let isolateRequestResponse: ActionDetails; + let releaseRequestResponse: ActionDetails; - beforeEach(() => { - login(); - }); + loadPage(APP_ALERTS_PATH); + closeAllToasts(); - it('should isolate and release host', () => { - const isolateComment = `Isolating ${hostname}`; - const releaseComment = `Releasing ${hostname}`; - let isolateRequestResponse: ActionDetails; - let releaseRequestResponse: ActionDetails; + cy.getByTestSubj('alertsTable').within(() => { + cy.getByTestSubj('expand-event') + .first() + .within(() => { + cy.get(`[data-is-loading="true"]`).should('exist'); + }); + cy.getByTestSubj('expand-event') + .first() + .within(() => { + cy.get(`[data-is-loading="true"]`).should('not.exist'); + }); + }); - loadPage(APP_ALERTS_PATH); - closeAllToasts(); + openAlertDetailsView(); - cy.getByTestSubj('alertsTable').within(() => { - cy.getByTestSubj('expand-event') - .first() - .within(() => { - cy.get(`[data-is-loading="true"]`).should('exist'); - }); - cy.getByTestSubj('expand-event') - .first() - .within(() => { - cy.get(`[data-is-loading="true"]`).should('not.exist'); - }); - }); + isolateHostWithComment(isolateComment, hostname); - openAlertDetailsView(); + interceptActionRequests((responseBody) => { + isolateRequestResponse = responseBody; + }, 'isolate'); - isolateHostWithComment(isolateComment, hostname); + cy.getByTestSubj('hostIsolateConfirmButton').click(); - interceptActionRequests((responseBody) => { - isolateRequestResponse = responseBody; - }, 'isolate'); + cy.wait('@isolate').then(() => { + sendActionResponse(isolateRequestResponse); + }); - cy.getByTestSubj('hostIsolateConfirmButton').click(); + cy.contains(`Isolation on host ${hostname} successfully submitted`); - cy.wait('@isolate').then(() => { - sendActionResponse(isolateRequestResponse); - }); + cy.getByTestSubj('euiFlyoutCloseButton').click(); + // eslint-disable-next-line cypress/no-unnecessary-waiting + cy.wait(1000); + openAlertDetailsView(); - cy.contains(`Isolation on host ${hostname} successfully submitted`); + checkFlyoutEndpointIsolation(); - cy.getByTestSubj('euiFlyoutCloseButton').click(); - // eslint-disable-next-line cypress/no-unnecessary-waiting - cy.wait(1000); - openAlertDetailsView(); + releaseHostWithComment(releaseComment, hostname); - checkFlyoutEndpointIsolation(); + interceptActionRequests((responseBody) => { + releaseRequestResponse = responseBody; + }, 'release'); - releaseHostWithComment(releaseComment, hostname); - - interceptActionRequests((responseBody) => { - releaseRequestResponse = responseBody; - }, 'release'); + cy.contains('Confirm').click(); - cy.contains('Confirm').click(); - - cy.wait('@release').then(() => { - sendActionResponse(releaseRequestResponse); - }); + cy.wait('@release').then(() => { + sendActionResponse(releaseRequestResponse); + }); - cy.contains(`Release on host ${hostname} successfully submitted`); - cy.getByTestSubj('euiFlyoutCloseButton').click(); - openAlertDetailsView(); - cy.getByTestSubj('event-field-agent.status').within(() => { - cy.get('[title="Isolated"]').should('not.exist'); + cy.contains(`Release on host ${hostname} successfully submitted`); + cy.getByTestSubj('euiFlyoutCloseButton').click(); + openAlertDetailsView(); + cy.getByTestSubj('event-field-agent.status').within(() => { + cy.get('[title="Isolated"]').should('not.exist'); + }); }); - }); - }); + } + ); - describe('from Cases', { tags: ['@brokenInServerless'] }, () => { + describe('from Cases', () => { let endpointData: ReturnTypeFromChainable | undefined; let caseData: ReturnTypeFromChainable | undefined; let alertData: ReturnTypeFromChainable | undefined; diff --git a/x-pack/plugins/security_solution/public/management/cypress/e2e/response_actions/reponse_actions_history.cy.ts b/x-pack/plugins/security_solution/public/management/cypress/e2e/response_actions/reponse_actions_history.cy.ts index aedcca4e1dc996..4efd03c01d05bc 100644 --- a/x-pack/plugins/security_solution/public/management/cypress/e2e/response_actions/reponse_actions_history.cy.ts +++ b/x-pack/plugins/security_solution/public/management/cypress/e2e/response_actions/reponse_actions_history.cy.ts @@ -10,69 +10,65 @@ import { indexEndpointHosts } from '../../tasks/index_endpoint_hosts'; import { login } from '../../tasks/login'; import { loadPage } from '../../tasks/common'; -describe( - 'Response actions history page', - { tags: ['@ess', '@serverless', '@brokenInServerless'] }, - () => { - let endpointData: ReturnTypeFromChainable; - // let actionData: ReturnTypeFromChainable; +describe('Response actions history page', { tags: ['@ess', '@serverless'] }, () => { + let endpointData: ReturnTypeFromChainable; + // let actionData: ReturnTypeFromChainable; - before(() => { - indexEndpointHosts({ numResponseActions: 11 }).then((indexEndpoints) => { - endpointData = indexEndpoints; - }); + before(() => { + indexEndpointHosts({ numResponseActions: 11 }).then((indexEndpoints) => { + endpointData = indexEndpoints; }); + }); - beforeEach(() => { - login(); - }); + beforeEach(() => { + login(); + }); - after(() => { - if (endpointData) { - endpointData.cleanup(); - // @ts-expect-error ignore setting to undefined - endpointData = undefined; - } - }); + after(() => { + if (endpointData) { + endpointData.cleanup(); + // @ts-expect-error ignore setting to undefined + endpointData = undefined; + } + }); - it('retains expanded action details on page reload', () => { - loadPage(`/app/security/administration/response_actions_history`); - cy.getByTestSubj('response-actions-list-expand-button').eq(3).click(); // 4th row on 1st page - cy.getByTestSubj('response-actions-list-details-tray').should('exist'); - cy.url().should('include', 'withOutputs'); + it('retains expanded action details on page reload', () => { + loadPage(`/app/security/administration/response_actions_history`); + cy.getByTestSubj('response-actions-list-expand-button').eq(3).click(); // 4th row on 1st page + cy.getByTestSubj('response-actions-list-details-tray').should('exist'); + cy.url().should('include', 'withOutputs'); - // navigate to page 2 - cy.getByTestSubj('pagination-button-1').click(); - cy.getByTestSubj('response-actions-list-details-tray').should('not.exist'); + // navigate to page 2 + cy.getByTestSubj('pagination-button-1').click(); + cy.getByTestSubj('response-actions-list-details-tray').should('not.exist'); - // reload with URL params on page 2 with existing URL - cy.reload(); - cy.getByTestSubj('response-actions-list-details-tray').should('not.exist'); + // reload with URL params on page 2 with existing URL + cy.reload(); + cy.getByTestSubj('response-actions-list-details-tray').should('not.exist'); - // navigate to page 1 - cy.getByTestSubj('pagination-button-0').click(); - cy.getByTestSubj('response-actions-list-details-tray').should('exist'); - }); + // navigate to page 1 + cy.getByTestSubj('pagination-button-0').click(); + cy.getByTestSubj('response-actions-list-details-tray').should('exist'); + }); - it('collapses expanded tray with a single click', () => { - loadPage(`/app/security/administration/response_actions_history`); - // 2nd row on 1st page - cy.getByTestSubj('response-actions-list-expand-button').eq(1).as('2nd-row'); + it('collapses expanded tray with a single click', () => { + loadPage(`/app/security/administration/response_actions_history`); + // 2nd row on 1st page + cy.getByTestSubj('response-actions-list-expand-button').eq(1).as('2nd-row'); - // expand the row - cy.get('@2nd-row').click(); - cy.getByTestSubj('response-actions-list-details-tray').should('exist'); - cy.url().should('include', 'withOutputs'); + // expand the row + cy.get('@2nd-row').click(); + cy.getByTestSubj('response-actions-list-details-tray').should('exist'); + cy.url().should('include', 'withOutputs'); - // collapse the row - cy.intercept('GET', '/api/endpoint/action*').as('getResponses'); - cy.get('@2nd-row').click(); - // wait for the API response to come back - // and then see if the tray is actually closed - cy.wait('@getResponses', { timeout: 500 }).then(() => { - cy.getByTestSubj('response-actions-list-details-tray').should('not.exist'); - cy.url().should('not.include', 'withOutputs'); - }); + // collapse the row + cy.intercept('GET', '/api/endpoint/action*').as('getResponses'); + cy.get('@2nd-row').click(); + // wait for the API response to come back + // and then see if the tray is actually closed + cy.wait('@getResponses', { timeout: 500 }).then(() => { + cy.getByTestSubj('response-actions-list-details-tray').should('not.exist'); + cy.url().should('not.include', 'withOutputs'); }); - } -); + }); +}); diff --git a/x-pack/plugins/security_solution/public/management/cypress/e2e/response_actions/responder.cy.ts b/x-pack/plugins/security_solution/public/management/cypress/e2e/response_actions/responder.cy.ts index 9272f14eab4aeb..09e11e82abea55 100644 --- a/x-pack/plugins/security_solution/public/management/cypress/e2e/response_actions/responder.cy.ts +++ b/x-pack/plugins/security_solution/public/management/cypress/e2e/response_actions/responder.cy.ts @@ -30,7 +30,8 @@ describe('When accessing Endpoint Response Console', { tags: ['@ess', '@serverle closeResponderActionLogFlyout(); // Global kibana nav bar should remain accessible - cy.getByTestSubj('toggleNavButton').should('be.visible'); + // (the login user button seems to be common in both ESS and serverless) + cy.getByTestSubj('userMenuButton').should('be.visible'); closeResponder(); }; @@ -109,16 +110,12 @@ describe('When accessing Endpoint Response Console', { tags: ['@ess', '@serverle cy.getByTestSubj('endpointResponseActions-action-item').should('be.enabled'); }); - it( - 'should display Responder response action interface', - { tags: ['@brokenInServerless'] }, - () => { - loadPage(caseUrlPath); - closeAllToasts(); - openCaseAlertDetails(); - cy.getByTestSubj('endpointResponseActions-action-item').click(); - performResponderSanityChecks(); - } - ); + it('should display Responder response action interface', () => { + loadPage(caseUrlPath); + closeAllToasts(); + openCaseAlertDetails(); + cy.getByTestSubj('endpointResponseActions-action-item').click(); + performResponderSanityChecks(); + }); }); }); diff --git a/x-pack/plugins/security_solution/public/management/cypress/e2e/response_actions/response_console_actions.cy.ts b/x-pack/plugins/security_solution/public/management/cypress/e2e/response_actions/response_console_actions.cy.ts index b727697da17be8..858da349c51ad3 100644 --- a/x-pack/plugins/security_solution/public/management/cypress/e2e/response_actions/response_console_actions.cy.ts +++ b/x-pack/plugins/security_solution/public/management/cypress/e2e/response_actions/response_console_actions.cy.ts @@ -27,7 +27,7 @@ import { enableAllPolicyProtections } from '../../tasks/endpoint_policy'; import { createEndpointHost } from '../../tasks/create_endpoint_host'; import { deleteAllLoadedEndpointData } from '../../tasks/delete_all_endpoint_data'; -describe('Response console', { tags: ['@ess', '@serverless', '@brokenInServerless'] }, () => { +describe('Response console', { tags: ['@ess', '@serverless'] }, () => { beforeEach(() => { login(); }); diff --git a/x-pack/plugins/security_solution/public/management/cypress/e2e/response_actions/response_console_mocked_data.cy.ts b/x-pack/plugins/security_solution/public/management/cypress/e2e/response_actions/response_console_mocked_data.cy.ts index 11030ae8e77ba8..f80e3b17e6017e 100644 --- a/x-pack/plugins/security_solution/public/management/cypress/e2e/response_actions/response_console_mocked_data.cy.ts +++ b/x-pack/plugins/security_solution/public/management/cypress/e2e/response_actions/response_console_mocked_data.cy.ts @@ -24,12 +24,12 @@ import { } from '../../tasks/isolate'; import { login } from '../../tasks/login'; -describe('Response console', { tags: ['@ess', '@serverless'] }, () => { +describe('Response console', { tags: ['@ess', '@serverless', '@brokenInServerless'] }, () => { beforeEach(() => { login(); }); - describe('`isolate` command', { tags: ['@brokenInServerless'] }, () => { + describe('`isolate` command', () => { let endpointData: ReturnTypeFromChainable; let endpointHostname: string; let isolateRequestResponse: ActionDetails; @@ -71,7 +71,7 @@ describe('Response console', { tags: ['@ess', '@serverless'] }, () => { }); }); - describe('`release` command', { tags: ['@brokenInServerless'] }, () => { + describe('`release` command', () => { let endpointData: ReturnTypeFromChainable; let endpointHostname: string; let releaseRequestResponse: ActionDetails; diff --git a/x-pack/plugins/security_solution/public/management/cypress/support/data_loaders.ts b/x-pack/plugins/security_solution/public/management/cypress/support/data_loaders.ts index 82f9af7e114d2d..164afe89086d1b 100644 --- a/x-pack/plugins/security_solution/public/management/cypress/support/data_loaders.ts +++ b/x-pack/plugins/security_solution/public/management/cypress/support/data_loaders.ts @@ -183,7 +183,7 @@ export const dataLoaders = ( }, indexEndpointHosts: async (options: IndexEndpointHostsCyTaskOptions = {}) => { - const { kbnClient, esClient } = await stackServicesPromise; + const { kbnClient, esClient, log } = await stackServicesPromise; const { count: numHosts, version, @@ -194,7 +194,7 @@ export const dataLoaders = ( alertIds, } = options; - return cyLoadEndpointDataHandler(esClient, kbnClient, { + return cyLoadEndpointDataHandler(esClient, kbnClient, log, { numHosts, version, os, diff --git a/x-pack/plugins/security_solution/public/management/cypress/support/plugin_handlers/endpoint_data_loader.ts b/x-pack/plugins/security_solution/public/management/cypress/support/plugin_handlers/endpoint_data_loader.ts index 32b392ac32696e..b81a446a09a7df 100644 --- a/x-pack/plugins/security_solution/public/management/cypress/support/plugin_handlers/endpoint_data_loader.ts +++ b/x-pack/plugins/security_solution/public/management/cypress/support/plugin_handlers/endpoint_data_loader.ts @@ -9,6 +9,7 @@ import type { Client } from '@elastic/elasticsearch'; import type { KbnClient } from '@kbn/test'; import pRetry from 'p-retry'; import { kibanaPackageJson } from '@kbn/repo-info'; +import type { ToolingLog } from '@kbn/tooling-log'; import { STARTED_TRANSFORM_STATES } from '../../../../../common/constants'; import { ENDPOINT_ALERTS_INDEX, @@ -47,11 +48,13 @@ export interface CyLoadEndpointDataOptions * Cypress plugin for handling loading Endpoint data into ES * @param esClient * @param kbnClient + * @param log * @param options */ export const cyLoadEndpointDataHandler = async ( esClient: Client, kbnClient: KbnClient, + log: ToolingLog, options: Partial = {} ): Promise => { const { @@ -97,7 +100,8 @@ export const cyLoadEndpointDataHandler = async ( DocGenerator, withResponseActions, numResponseActions, - alertIds + alertIds, + log ); if (waitUntilTransformed) { diff --git a/x-pack/plugins/security_solution/public/management/cypress/support/setup_tooling_log_level.ts b/x-pack/plugins/security_solution/public/management/cypress/support/setup_tooling_log_level.ts new file mode 100644 index 00000000000000..c4c1acd428355b --- /dev/null +++ b/x-pack/plugins/security_solution/public/management/cypress/support/setup_tooling_log_level.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 { createToolingLogger } from '../../../../common/endpoint/data_loaders/utils'; + +/** + * Sets the default log level for `ToolingLog` instances crated via `createToolingLogger()` + * based on the `TOOLING_LOG_LEVEL` env. variable in the cypress config + * @param config + */ +export const setupToolingLogLevel = (config: Cypress.PluginConfigOptions) => { + const defaultToolingLogLevel = config.env.TOOLING_LOG_LEVEL; + + if (defaultToolingLogLevel && defaultToolingLogLevel !== createToolingLogger.defaultLogLevel) { + createToolingLogger.defaultLogLevel = defaultToolingLogLevel; + createToolingLogger().info( + `Default log level for 'createToolingLogger()' set to ${defaultToolingLogLevel}` + ); + } +}; diff --git a/x-pack/plugins/security_solution/scripts/endpoint/common/base_running_service.ts b/x-pack/plugins/security_solution/scripts/endpoint/common/base_running_service.ts index e195d7e1f60caa..1f0c78e65a9166 100644 --- a/x-pack/plugins/security_solution/scripts/endpoint/common/base_running_service.ts +++ b/x-pack/plugins/security_solution/scripts/endpoint/common/base_running_service.ts @@ -5,10 +5,11 @@ * 2.0. */ -import { ToolingLog } from '@kbn/tooling-log'; +import type { ToolingLog } from '@kbn/tooling-log'; import type { KbnClient } from '@kbn/test'; import type { Client } from '@elastic/elasticsearch'; import moment from 'moment'; +import { createToolingLogger } from '../../../common/endpoint/data_loaders/utils'; /** * A base class for creating a service that runs on a interval @@ -27,7 +28,7 @@ export class BaseRunningService { constructor( protected readonly esClient: Client, protected readonly kbnClient: KbnClient, - protected readonly logger: ToolingLog = new ToolingLog(), + protected readonly logger: ToolingLog = createToolingLogger(), protected readonly intervalMs: number = 30_000 // 30s ) { this.logPrefix = this.constructor.name ?? 'BaseRunningService'; diff --git a/x-pack/plugins/security_solution/scripts/endpoint/common/delete_all_endpoint_data.ts b/x-pack/plugins/security_solution/scripts/endpoint/common/delete_all_endpoint_data.ts index 6382964fda6436..9877fbd906a672 100644 --- a/x-pack/plugins/security_solution/scripts/endpoint/common/delete_all_endpoint_data.ts +++ b/x-pack/plugins/security_solution/scripts/endpoint/common/delete_all_endpoint_data.ts @@ -7,7 +7,7 @@ import type { Client, estypes } from '@elastic/elasticsearch'; import assert from 'assert'; -import { createEsClient } from './stack_services'; +import { createEsClient, isServerlessKibanaFlavor } from './stack_services'; import { createSecuritySuperuser } from './security_user_services'; export interface DeleteAllEndpointDataResponse { @@ -30,7 +30,10 @@ export const deleteAllEndpointData = async ( ): Promise => { assert(endpointAgentIds.length > 0, 'At least one endpoint agent id must be defined'); - const unrestrictedUser = await createSecuritySuperuser(esClient, 'super_superuser'); + const isServerless = await isServerlessKibanaFlavor(esClient); + const unrestrictedUser = isServerless + ? { password: 'changeme', username: 'system_indices_superuser', created: false } + : await createSecuritySuperuser(esClient, 'super_superuser'); const esUrl = getEsUrlFromClient(esClient); const esClientUnrestricted = createEsClient({ url: esUrl, diff --git a/x-pack/plugins/security_solution/scripts/endpoint/common/endpoint_host_services.ts b/x-pack/plugins/security_solution/scripts/endpoint/common/endpoint_host_services.ts index 0be12de4ade915..ef38b120c38bbe 100644 --- a/x-pack/plugins/security_solution/scripts/endpoint/common/endpoint_host_services.ts +++ b/x-pack/plugins/security_solution/scripts/endpoint/common/endpoint_host_services.ts @@ -178,6 +178,8 @@ const createVagrantVm = async ({ env: { VAGRANT_CWD, }, + // Only `pipe` STDERR to parent process + stdio: ['inherit', 'inherit', 'pipe'], }); // eslint-disable-next-line no-empty } catch (e) {} @@ -191,7 +193,8 @@ const createVagrantVm = async ({ CACHED_AGENT_SOURCE: cachedAgentDownload.fullFilePath, CACHED_AGENT_FILENAME: cachedAgentDownload.filename, }, - stdio: ['inherit', 'inherit', 'inherit'], + // Only `pipe` STDERR to parent process + stdio: ['inherit', 'inherit', 'pipe'], }); } catch (e) { log.error(e); @@ -319,7 +322,8 @@ const enrollHostWithFleet = async ({ env: { VAGRANT_CWD, }, - stdio: ['inherit', 'inherit', 'inherit'], + // Only `pipe` STDERR to parent process + stdio: ['inherit', 'inherit', 'pipe'], }); } else { log.verbose(`Command: multipass ${agentInstallArguments.join(' ')}`); diff --git a/x-pack/plugins/security_solution/scripts/endpoint/common/fleet_server/fleet_server_services.ts b/x-pack/plugins/security_solution/scripts/endpoint/common/fleet_server/fleet_server_services.ts index 838e94d8faa005..2cffcea50cda92 100644 --- a/x-pack/plugins/security_solution/scripts/endpoint/common/fleet_server/fleet_server_services.ts +++ b/x-pack/plugins/security_solution/scripts/endpoint/common/fleet_server/fleet_server_services.ts @@ -124,7 +124,7 @@ export const startFleetServer = async ({ // Only fetch/create a fleet-server policy const policyId = - policy ?? !isServerless ? await getOrCreateFleetServerAgentPolicyId(kbnClient, logger) : ''; + policy || !isServerless ? await getOrCreateFleetServerAgentPolicyId(kbnClient, logger) : ''; const serviceToken = isServerless ? '' : await generateFleetServiceToken(kbnClient, logger); const startedFleetServer = await startFleetServerWithDocker({ kbnClient, @@ -233,6 +233,7 @@ const startFleetServerWithDocker = async ({ const containerName = `dev-fleet-server.${port}`; const hostname = `dev-fleet-server.${port}.${Math.random().toString(32).substring(2, 6)}`; let containerId = ''; + let fleetServerVersionInfo = ''; if (isLocalhost(esURL.hostname)) { esURL.hostname = localhostRealIp; @@ -276,9 +277,10 @@ const startFleetServerWithDocker = async ({ ); }) .catch((error) => { - log.verbose(`Attempt to kill currently running fleet-server container (if any) with name [${containerName}] was unsuccessful: - ${error} - (This is ok if one was not running already)`); + if (!/no such container/i.test(error.message)) { + log.verbose(`Attempt to kill currently running fleet-server container with name [${containerName}] was unsuccessful: + ${error}`); + } }); log.verbose(`docker arguments:\n${dockerArgs.join(' ')}`); @@ -304,6 +306,19 @@ const startFleetServerWithDocker = async ({ log.verbose(`Fleet server enrolled agent:\n${JSON.stringify(fleetServerAgent, null, 2)}`); } + + fleetServerVersionInfo = ( + await execa('docker', [ + 'exec', + containerName, + '/bin/bash', + '-c', + './elastic-agent version', + ]).catch((err) => { + log.verbose(`Failed to retrieve agent version information from running instance.`, err); + return { stdout: 'Unable to retrieve version information' }; + }) + ).stdout; } catch (error) { log.error(dump(error)); throw error; @@ -311,6 +326,8 @@ const startFleetServerWithDocker = async ({ const info = `Container Name: ${containerName} Container Id: ${containerId} +Fleet-server version: + ${fleetServerVersionInfo.replace(/\n/g, '\n ')} View running output: ${chalk.cyan(`docker attach ---sig-proxy=false ${containerName}`)} Shell access: ${chalk.cyan(`docker exec -it ${containerName} /bin/bash`)} diff --git a/x-pack/plugins/security_solution/scripts/endpoint/common/fleet_services.ts b/x-pack/plugins/security_solution/scripts/endpoint/common/fleet_services.ts index 2a239ef3729412..a95b9f03caf2e9 100644 --- a/x-pack/plugins/security_solution/scripts/endpoint/common/fleet_services.ts +++ b/x-pack/plugins/security_solution/scripts/endpoint/common/fleet_services.ts @@ -25,7 +25,7 @@ import { APP_API_ROUTES, PACKAGE_POLICY_API_ROUTES, } from '@kbn/fleet-plugin/common'; -import { ToolingLog } from '@kbn/tooling-log'; +import type { ToolingLog } from '@kbn/tooling-log'; import type { KbnClient } from '@kbn/test'; import type { GetFleetServerHostsResponse } from '@kbn/fleet-plugin/common/types/rest_spec/fleet_server_hosts'; import { @@ -45,6 +45,7 @@ import nodeFetch from 'node-fetch'; import semver from 'semver'; import axios from 'axios'; import { + createToolingLogger, RETRYABLE_TRANSIENT_ERRORS, retryOnError, } from '../../../common/endpoint/data_loaders/utils'; @@ -59,7 +60,7 @@ export const checkInFleetAgent = async ( agentId: string, { agentStatus = 'online', - log = new ToolingLog(), + log = createToolingLogger(), }: Partial<{ /** The agent status to be sent. If set to `random`, then one will be randomly generated */ agentStatus: AgentStatus | 'random'; diff --git a/x-pack/plugins/security_solution/scripts/endpoint/common/stack_services.ts b/x-pack/plugins/security_solution/scripts/endpoint/common/stack_services.ts index 8bc4ca071cf6a5..a783b1fc731139 100644 --- a/x-pack/plugins/security_solution/scripts/endpoint/common/stack_services.ts +++ b/x-pack/plugins/security_solution/scripts/endpoint/common/stack_services.ts @@ -6,7 +6,7 @@ */ import { Client } from '@elastic/elasticsearch'; -import { ToolingLog } from '@kbn/tooling-log'; +import type { ToolingLog } from '@kbn/tooling-log'; import type { KbnClientOptions } from '@kbn/test'; import { KbnClient } from '@kbn/test'; import type { StatusResponse } from '@kbn/core-status-common-internal'; @@ -16,6 +16,7 @@ import { type AxiosResponse } from 'axios'; import type { ClientOptions } from '@elastic/elasticsearch/lib/client'; import fs from 'fs'; import { CA_CERT_PATH } from '@kbn/dev-utils'; +import { createToolingLogger } from '../../../common/endpoint/data_loaders/utils'; import { catchAxiosErrorFormatAndThrow } from './format_axios_error'; import { isLocalhost } from './is_localhost'; import { getLocalhostRealIp } from './network_services'; @@ -108,10 +109,11 @@ export const createRuntimeServices = async ({ apiKey, esUsername, esPassword, - log = new ToolingLog({ level: 'info', writeTo: process.stdout }), + log: _log, asSuperuser = false, noCertForSsl, }: CreateRuntimeServicesOptions): Promise => { + const log = _log ?? createToolingLogger(); let username = _username; let password = _password; @@ -252,7 +254,7 @@ export const createKbnClient = ({ username, password, apiKey, - log = new ToolingLog(), + log = createToolingLogger(), noCertForSsl, }: { url: string; @@ -324,17 +326,25 @@ export const waitForKibana = async (kbnClient: KbnClient): Promise => { ); }; -export const isServerlessKibanaFlavor = async (kbnClient: KbnClient): Promise => { - const kbnStatus = await fetchKibanaStatus(kbnClient); +/** + * Checks to see if Kibana/ES is running in serverless mode + * @param client + */ +export const isServerlessKibanaFlavor = async (client: KbnClient | Client): Promise => { + if (client instanceof KbnClient) { + const kbnStatus = await fetchKibanaStatus(client); + + // If we don't have status for plugins, then error + // the Status API will always return something (its an open API), but if auth was successful, + // it will also return more data. + if (!kbnStatus.status.plugins) { + throw new Error( + `Unable to retrieve Kibana plugins status (likely an auth issue with the username being used for kibana)` + ); + } - // If we don't have status for plugins, then error - // the Status API will always return something (its an open API), but if auth was successful, - // it will also return more data. - if (!kbnStatus.status.plugins) { - throw new Error( - `Unable to retrieve Kibana plugins status (likely an auth issue with the username being used for kibana)` - ); + return kbnStatus.status.plugins?.serverless?.level === 'available'; + } else { + return (await client.info()).version.build_flavor === 'serverless'; } - - return kbnStatus.status.plugins?.serverless?.level === 'available'; }; diff --git a/x-pack/plugins/security_solution/scripts/endpoint/endpoint_agent_runner/runtime.ts b/x-pack/plugins/security_solution/scripts/endpoint/endpoint_agent_runner/runtime.ts index c7680a42bbbbe3..ba3790e5bd7759 100644 --- a/x-pack/plugins/security_solution/scripts/endpoint/endpoint_agent_runner/runtime.ts +++ b/x-pack/plugins/security_solution/scripts/endpoint/endpoint_agent_runner/runtime.ts @@ -5,11 +5,11 @@ * 2.0. */ -import { ToolingLog } from '@kbn/tooling-log'; import { getAgentVersionMatchingCurrentStack } from '../common/fleet_services'; import type { StartRuntimeServicesOptions } from './types'; import type { RuntimeServices } from '../common/stack_services'; import { createRuntimeServices } from '../common/stack_services'; +import { createToolingLogger } from '../../../common/endpoint/data_loaders/utils'; interface EndpointRunnerRuntimeServices extends RuntimeServices { options: Omit< @@ -22,7 +22,7 @@ interface EndpointRunnerRuntimeServices extends RuntimeServices { let runtimeServices: undefined | EndpointRunnerRuntimeServices; export const startRuntimeServices = async ({ - log = new ToolingLog(), + log = createToolingLogger(), elasticUrl, kibanaUrl, fleetServerUrl, diff --git a/x-pack/plugins/security_solution/scripts/endpoint/resolver_generator_script.ts b/x-pack/plugins/security_solution/scripts/endpoint/resolver_generator_script.ts index 330bcf4589a74a..a14caafa3c5e9e 100644 --- a/x-pack/plugins/security_solution/scripts/endpoint/resolver_generator_script.ts +++ b/x-pack/plugins/security_solution/scripts/endpoint/resolver_generator_script.ts @@ -11,9 +11,10 @@ import fs from 'fs'; import { Client, errors } from '@elastic/elasticsearch'; import type { ClientOptions } from '@elastic/elasticsearch/lib/client'; import { CA_CERT_PATH } from '@kbn/dev-utils'; -import { ToolingLog } from '@kbn/tooling-log'; +import type { ToolingLog } from '@kbn/tooling-log'; import type { KbnClientOptions } from '@kbn/test'; import { KbnClient } from '@kbn/test'; +import { createToolingLogger } from '../../common/endpoint/data_loaders/utils'; import { EndpointSecurityTestRolesLoader } from './common/role_and_user_loader'; import { METADATA_DATASTREAM } from '../../common/endpoint/constants'; import { EndpointMetadataGenerator } from '../../common/endpoint/data_generators/endpoint_metadata_generator'; @@ -277,10 +278,7 @@ async function main() { let clientOptions: ClientOptions; let url: string; let node: string; - const logger = new ToolingLog({ - level: 'info', - writeTo: process.stdout, - }); + const logger = createToolingLogger(); const toolingLogOptions = { log: logger }; let kbnClientOptions: KbnClientOptions = { diff --git a/x-pack/plugins/security_solution/scripts/endpoint/trusted_apps/index.ts b/x-pack/plugins/security_solution/scripts/endpoint/trusted_apps/index.ts index ccd0561c8110ab..8d522ed859b813 100644 --- a/x-pack/plugins/security_solution/scripts/endpoint/trusted_apps/index.ts +++ b/x-pack/plugins/security_solution/scripts/endpoint/trusted_apps/index.ts @@ -18,13 +18,14 @@ import { EXCEPTION_LIST_URL, } from '@kbn/securitysolution-list-constants'; import type { CreateExceptionListSchema } from '@kbn/securitysolution-io-ts-list-types'; +import { createToolingLogger } from '../../../common/endpoint/data_loaders/utils'; import type { TrustedApp } from '../../../common/endpoint/types'; import { TrustedAppGenerator } from '../../../common/endpoint/data_generators/trusted_app_generator'; import { newTrustedAppToCreateExceptionListItem } from '../../../public/management/pages/trusted_apps/service/mappers'; import { randomPolicyIdGenerator } from '../common/random_policy_id_generator'; -const defaultLogger = new ToolingLog({ level: 'info', writeTo: process.stdout }); +const defaultLogger = createToolingLogger(); const separator = '----------------------------------------'; const trustedAppGenerator = new TrustedAppGenerator(); From 38ca94f8b716d9f7b20a3b5adf717e6fb7c2a165 Mon Sep 17 00:00:00 2001 From: Jeramy Soucy Date: Mon, 23 Oct 2023 11:02:36 -0400 Subject: [PATCH 08/68] Hides Spaces actions in serverless saved objects management (#169457) Closes #169424 ## Summary Adds check against `SpacesApi.hasOnlyDefaultSpace` to, when true, bypass registering the `share-to-space` and `copy-to-space` actions and the `Spaces` column in the saved objects management UI. ### Manual Testing - Start Elasticsearch with `yarn es serverless` - Start Kibana with `yarn start --serverless security` - Navigate to `Project Settings`->`Management`->`Content` -> `Saved Objects` - Verify that the `Spaces` column does not appear in the Saved Objects table - Verify that the `Actions` column does not contain either the `Copy-to-space` or `Share-to-space` actions for any object (will still contain `Inspect` and `View relationships`) - Stop Kibana and Elasticsearch - Start Elasticsearch with `yarn es snapshot --license=trial` - Start Kibana with `yarn start` - Add sample flight data to generate some saved objects - Navigate to `Stack Management`->`Kibana`->`Saved Objects` - Verify that the `Spaces` column does appear in the Saved Objects table - Verify that the `Actions` column does contain both the `Copy-to-space` or `Share-to-space` actions for applicable object types (e.g. data views) ### Automated Testing - src/plugins/saved_objects_management/public/services/action_service.test.ts - src/plugins/saved_objects_management/public/services/column_service.test.ts --------- Co-authored-by: kibanamachine <42973632+kibanamachine@users.noreply.github.com> --- .../public/services/action_service.test.ts | 12 ++++++++++++ .../public/services/action_service.ts | 2 +- .../public/services/column_service.test.ts | 9 +++++++++ .../public/services/column_service.ts | 2 +- x-pack/plugins/spaces/public/mocks.ts | 8 +++++--- 5 files changed, 28 insertions(+), 5 deletions(-) diff --git a/src/plugins/saved_objects_management/public/services/action_service.test.ts b/src/plugins/saved_objects_management/public/services/action_service.test.ts index 3068a55b728b14..69f97965f1ca47 100644 --- a/src/plugins/saved_objects_management/public/services/action_service.test.ts +++ b/src/plugins/saved_objects_management/public/services/action_service.test.ts @@ -64,6 +64,18 @@ describe('SavedObjectsManagementActionRegistry', () => { `"Saved Objects Management Action with id 'my-action' already exists"` ); }); + + it('does not register spaces share and copy actions when SpacesApi.hasOnlyDefaultSpace is true', () => { + const action = createAction('foo'); + setup.register(action); + const start = service.start(spacesPluginMock.createStartContract(true)); + expect(start.getAll()).toEqual( + expect.not.arrayContaining([ + expect.any(ShareToSpaceSavedObjectsManagementAction), + expect.any(CopyToSpaceSavedObjectsManagementAction), + ]) + ); + }); }); describe('#has', () => { diff --git a/src/plugins/saved_objects_management/public/services/action_service.ts b/src/plugins/saved_objects_management/public/services/action_service.ts index a13db8c590f8ac..b255ee9a7fa807 100644 --- a/src/plugins/saved_objects_management/public/services/action_service.ts +++ b/src/plugins/saved_objects_management/public/services/action_service.ts @@ -46,7 +46,7 @@ export class SavedObjectsManagementActionService { } start(spacesApi?: SpacesApi): SavedObjectsManagementActionServiceStart { - if (spacesApi) { + if (spacesApi && !spacesApi.hasOnlyDefaultSpace) { registerSpacesApiActions(this, spacesApi); } return { diff --git a/src/plugins/saved_objects_management/public/services/column_service.test.ts b/src/plugins/saved_objects_management/public/services/column_service.test.ts index a2a05288004273..46d0f3ba063b0b 100644 --- a/src/plugins/saved_objects_management/public/services/column_service.test.ts +++ b/src/plugins/saved_objects_management/public/services/column_service.test.ts @@ -58,5 +58,14 @@ describe('SavedObjectsManagementColumnRegistry', () => { `"Saved Objects Management Column with id 'my-column' already exists"` ); }); + + it('does not register space column when SpacesApi.hasOnlyDefaultSpace is true', () => { + const column = createColumn('foo'); + setup.register(column); + const start = service.start(spacesPluginMock.createStartContract(true)); + expect(start.getAll()).toEqual( + expect.not.arrayContaining([expect.any(ShareToSpaceSavedObjectsManagementColumn)]) + ); + }); }); }); diff --git a/src/plugins/saved_objects_management/public/services/column_service.ts b/src/plugins/saved_objects_management/public/services/column_service.ts index 1606948b41ca5d..665866df1b4b06 100644 --- a/src/plugins/saved_objects_management/public/services/column_service.ts +++ b/src/plugins/saved_objects_management/public/services/column_service.ts @@ -39,7 +39,7 @@ export class SavedObjectsManagementColumnService { } start(spacesApi?: SpacesApi): SavedObjectsManagementColumnServiceStart { - if (spacesApi) { + if (spacesApi && !spacesApi.hasOnlyDefaultSpace) { registerSpacesApiColumns(this, spacesApi); } return { diff --git a/x-pack/plugins/spaces/public/mocks.ts b/x-pack/plugins/spaces/public/mocks.ts index 66b916e459cc55..1499384f4ed725 100644 --- a/x-pack/plugins/spaces/public/mocks.ts +++ b/x-pack/plugins/spaces/public/mocks.ts @@ -11,11 +11,11 @@ import type { SpacesPluginStart } from './plugin'; import type { SpacesApi } from './types'; import type { SpacesApiUi, SpacesApiUiComponent } from './ui_api'; -const createApiMock = (): jest.Mocked => ({ +const createApiMock = (hasOnlyDefaultSpace: boolean): jest.Mocked => ({ getActiveSpace$: jest.fn().mockReturnValue(of()), getActiveSpace: jest.fn(), ui: createApiUiMock(), - hasOnlyDefaultSpace: false, + hasOnlyDefaultSpace, }); type SpacesApiUiMock = Omit, 'components'> & { @@ -48,7 +48,9 @@ const createApiUiComponentsMock = () => { return mock; }; -const createStartContract = (): jest.Mocked => createApiMock(); +const createStartContract = ( + hasOnlyDefaultSpace: boolean = false +): jest.Mocked => createApiMock(hasOnlyDefaultSpace); export const spacesPluginMock = { createStartContract, From 3156d8b9e38990f969f0cba481861c4167d255f1 Mon Sep 17 00:00:00 2001 From: Ying Mao Date: Mon, 23 Oct 2023 11:16:01 -0400 Subject: [PATCH 09/68] [Response Ops][Alerting] Skip alerts resource installation on `migrator` nodes (#169443) Resolves https://github.com/elastic/response-ops-team/issues/148 ## Summary This PR makes the following changes: * Skips the initialization of the `AlertsService` for migrator nodes. This bypasses the installation of alerts as data assets on migrator nodes, which are short-lived nodes used on Serverless * Changes error logs to debug logs when alert resource installation is cut short due to Kibana shutdown. ## To Verify Run Kibana with the following configs: * no config for `node.roles` - Kibana should start up and install alerts-as-data resources * `node.roles: ["background_tasks"]` - Kibana should start up and install alerts-as-data resources * `node.roles: ["ui"]` - Kibana should start up and install alerts-as-data resources * `node.roles: ["migrator"]` - Kibana should start up and not install alerts-as-data resources. No errors related to premature shutdown should be visible in the logs. --- .../alerts_service/alerts_service.test.ts | 6 ++-- .../server/alerts_service/alerts_service.ts | 12 +++++-- .../alerting/server/alerts_service/index.ts | 1 + .../server/alerts_service/lib/index.ts | 2 +- .../lib/install_with_timeout.test.ts | 2 +- .../lib/install_with_timeout.ts | 25 ++++++++++---- x-pack/plugins/alerting/server/index.ts | 1 + x-pack/plugins/alerting/server/plugin.test.ts | 17 ++++++++++ x-pack/plugins/alerting/server/plugin.ts | 34 +++++++++++-------- .../rule_data_plugin_service.ts | 19 +++++++++-- 10 files changed, 87 insertions(+), 32 deletions(-) diff --git a/x-pack/plugins/alerting/server/alerts_service/alerts_service.test.ts b/x-pack/plugins/alerting/server/alerts_service/alerts_service.test.ts index e6a8a2c38ea66e..b73f671ab0695c 100644 --- a/x-pack/plugins/alerting/server/alerts_service/alerts_service.test.ts +++ b/x-pack/plugins/alerting/server/alerts_service/alerts_service.test.ts @@ -2370,10 +2370,10 @@ describe('Alerts Service', () => { dataStreamAdapter, }); - await retryUntil('error logger called', async () => logger.error.mock.calls.length > 0); + await retryUntil('debug logger called', async () => logger.debug.mock.calls.length > 0); - expect(logger.error).toHaveBeenCalledWith( - new Error(`Server is stopping; must stop all async operations`) + expect(logger.debug).toHaveBeenCalledWith( + `Server is stopping; must stop all async operations` ); }); }); diff --git a/x-pack/plugins/alerting/server/alerts_service/alerts_service.ts b/x-pack/plugins/alerting/server/alerts_service/alerts_service.ts index 18c3e536159ecb..0f699d911037cd 100644 --- a/x-pack/plugins/alerting/server/alerts_service/alerts_service.ts +++ b/x-pack/plugins/alerting/server/alerts_service/alerts_service.ts @@ -40,6 +40,7 @@ import { createOrUpdateIndexTemplate, createConcreteWriteIndex, installWithTimeout, + InstallShutdownError, } from './lib'; import type { LegacyAlertsClientParams, AlertRuleData } from '../alerts_client'; import { AlertsClient } from '../alerts_client'; @@ -357,9 +358,14 @@ export class AlertsService implements IAlertsService { this.isInitializing = false; return successResult(); } catch (err) { - this.options.logger.error( - `Error installing common resources for AlertsService. No additional resources will be installed and rule execution may be impacted. - ${err.message}` - ); + if (err instanceof InstallShutdownError) { + this.options.logger.debug(err.message); + } else { + this.options.logger.error( + `Error installing common resources for AlertsService. No additional resources will be installed and rule execution may be impacted. - ${err.message}` + ); + } + this.initialized = false; this.isInitializing = false; return errorResult(err.message); diff --git a/x-pack/plugins/alerting/server/alerts_service/index.ts b/x-pack/plugins/alerting/server/alerts_service/index.ts index db6f205129980d..0b32802bdf250c 100644 --- a/x-pack/plugins/alerting/server/alerts_service/index.ts +++ b/x-pack/plugins/alerting/server/alerts_service/index.ts @@ -25,4 +25,5 @@ export { createConcreteWriteIndex, installWithTimeout, isValidAlertIndexName, + InstallShutdownError, } from './lib'; diff --git a/x-pack/plugins/alerting/server/alerts_service/lib/index.ts b/x-pack/plugins/alerting/server/alerts_service/lib/index.ts index e4829d83aa5ae2..5a5b4e98cbd464 100644 --- a/x-pack/plugins/alerting/server/alerts_service/lib/index.ts +++ b/x-pack/plugins/alerting/server/alerts_service/lib/index.ts @@ -9,5 +9,5 @@ export { createOrUpdateIlmPolicy } from './create_or_update_ilm_policy'; export { createOrUpdateComponentTemplate } from './create_or_update_component_template'; export { getIndexTemplate, createOrUpdateIndexTemplate } from './create_or_update_index_template'; export { createConcreteWriteIndex } from './create_concrete_write_index'; -export { installWithTimeout } from './install_with_timeout'; +export { installWithTimeout, InstallShutdownError } from './install_with_timeout'; export { isValidAlertIndexName } from './is_valid_alert_index_name'; diff --git a/x-pack/plugins/alerting/server/alerts_service/lib/install_with_timeout.test.ts b/x-pack/plugins/alerting/server/alerts_service/lib/install_with_timeout.test.ts index 536a5f45a36dbc..83961c1c8fbfde 100644 --- a/x-pack/plugins/alerting/server/alerts_service/lib/install_with_timeout.test.ts +++ b/x-pack/plugins/alerting/server/alerts_service/lib/install_with_timeout.test.ts @@ -61,7 +61,7 @@ describe('installWithTimeout', () => { timeoutMs: 10, }) ).rejects.toThrowErrorMatchingInlineSnapshot( - `"Failure during installation. Server is stopping; must stop all async operations"` + `"Server is stopping; must stop all async operations"` ); expect(logger.info).not.toHaveBeenCalled(); }); diff --git a/x-pack/plugins/alerting/server/alerts_service/lib/install_with_timeout.ts b/x-pack/plugins/alerting/server/alerts_service/lib/install_with_timeout.ts index 495efc54976521..759aeba71cd413 100644 --- a/x-pack/plugins/alerting/server/alerts_service/lib/install_with_timeout.ts +++ b/x-pack/plugins/alerting/server/alerts_service/lib/install_with_timeout.ts @@ -18,6 +18,13 @@ interface InstallWithTimeoutOpts { timeoutMs?: number; } +export class InstallShutdownError extends Error { + constructor() { + super('Server is stopping; must stop all async operations'); + Object.setPrototypeOf(this, InstallShutdownError.prototype); + } +} + export const installWithTimeout = async ({ description, installFn, @@ -43,18 +50,22 @@ export const installWithTimeout = async ({ firstValueFrom(pluginStop$).then(() => { clearTimeout(timeoutId); - reject(new Error('Server is stopping; must stop all async operations')); + reject(new InstallShutdownError()); }); }); }; await Promise.race([install(), throwTimeoutException()]); } catch (e) { - logger.error(e); - - const reason = e?.message || 'Unknown reason'; - throw new Error( - `Failure during installation${description ? ` of ${description}` : ''}. ${reason}` - ); + if (e instanceof InstallShutdownError) { + logger.debug(e.message); + throw e; + } else { + logger.error(e); + const reason = e?.message || 'Unknown reason'; + throw new Error( + `Failure during installation${description ? ` of ${description}` : ''}. ${reason}` + ); + } } }; diff --git a/x-pack/plugins/alerting/server/index.ts b/x-pack/plugins/alerting/server/index.ts index 6aa1c44fe6e81d..200fe93931f86d 100644 --- a/x-pack/plugins/alerting/server/index.ts +++ b/x-pack/plugins/alerting/server/index.ts @@ -66,6 +66,7 @@ export { createConcreteWriteIndex, installWithTimeout, isValidAlertIndexName, + InstallShutdownError, } from './alerts_service'; export { getDataStreamAdapter } from './alerts_service/lib/data_stream_adapter'; diff --git a/x-pack/plugins/alerting/server/plugin.test.ts b/x-pack/plugins/alerting/server/plugin.test.ts index b77674515f6c66..010fa5bfab6ea2 100644 --- a/x-pack/plugins/alerting/server/plugin.test.ts +++ b/x-pack/plugins/alerting/server/plugin.test.ts @@ -132,6 +132,23 @@ describe('Alerting Plugin', () => { expect(setupContract.frameworkAlerts.enabled()).toEqual(true); }); + it('should not initialize AlertsService if node.roles.migrator is true', async () => { + const context = coreMock.createPluginInitializerContext({ + ...generateAlertingConfig(), + enableFrameworkAlerts: true, + }); + context.node.roles.migrator = true; + plugin = new AlertingPlugin(context); + + // need await to test number of calls of setupMocks.status.set, because it is under async function which awaiting core.getStartServices() + const setupContract = plugin.setup(setupMocks, mockPlugins); + await waitForSetupComplete(setupMocks); + + expect(AlertsService).not.toHaveBeenCalled(); + + expect(setupContract.frameworkAlerts.enabled()).toEqual(true); + }); + it(`exposes configured minimumScheduleInterval()`, async () => { const context = coreMock.createPluginInitializerContext( generateAlertingConfig() diff --git a/x-pack/plugins/alerting/server/plugin.ts b/x-pack/plugins/alerting/server/plugin.ts index bb950973afae73..80b71a4dd8a7ce 100644 --- a/x-pack/plugins/alerting/server/plugin.ts +++ b/x-pack/plugins/alerting/server/plugin.ts @@ -215,6 +215,7 @@ export class AlertingPlugin { private alertsService: AlertsService | null; private pluginStop$: Subject; private dataStreamAdapter?: DataStreamAdapter; + private nodeRoles: PluginInitializerContext['node']['roles']; constructor(initializerContext: PluginInitializerContext) { this.config = initializerContext.config.get(); @@ -222,6 +223,7 @@ export class AlertingPlugin { this.taskRunnerFactory = new TaskRunnerFactory(); this.rulesClientFactory = new RulesClientFactory(); this.alertsService = null; + this.nodeRoles = initializerContext.node.roles; this.alertingAuthorizationClientFactory = new AlertingAuthorizationClientFactory(); this.rulesSettingsClientFactory = new RulesSettingsClientFactory(); this.maintenanceWindowClientFactory = new MaintenanceWindowClientFactory(); @@ -241,11 +243,6 @@ export class AlertingPlugin { const useDataStreamForAlerts = !!plugins.serverless; this.dataStreamAdapter = getDataStreamAdapter({ useDataStreamForAlerts }); - this.logger.info( - `using ${ - this.dataStreamAdapter.isUsingDataStreams() ? 'datastreams' : 'indexes and aliases' - } for persisting alerts` - ); core.capabilities.registerProvider(() => { return { @@ -278,15 +275,24 @@ export class AlertingPlugin { plugins.eventLog.registerProviderActions(EVENT_LOG_PROVIDER, Object.values(EVENT_LOG_ACTIONS)); if (this.config.enableFrameworkAlerts) { - this.alertsService = new AlertsService({ - logger: this.logger, - pluginStop$: this.pluginStop$, - kibanaVersion: this.kibanaVersion, - dataStreamAdapter: this.dataStreamAdapter!, - elasticsearchClientPromise: core - .getStartServices() - .then(([{ elasticsearch }]) => elasticsearch.client.asInternalUser), - }); + if (this.nodeRoles.migrator) { + this.logger.info(`Skipping initialization of AlertsService on migrator node`); + } else { + this.logger.info( + `using ${ + this.dataStreamAdapter.isUsingDataStreams() ? 'datastreams' : 'indexes and aliases' + } for persisting alerts` + ); + this.alertsService = new AlertsService({ + logger: this.logger, + pluginStop$: this.pluginStop$, + kibanaVersion: this.kibanaVersion, + dataStreamAdapter: this.dataStreamAdapter!, + elasticsearchClientPromise: core + .getStartServices() + .then(([{ elasticsearch }]) => elasticsearch.client.asInternalUser), + }); + } } const ruleTypeRegistry = new RuleTypeRegistry({ diff --git a/x-pack/plugins/rule_registry/server/rule_data_plugin_service/rule_data_plugin_service.ts b/x-pack/plugins/rule_registry/server/rule_data_plugin_service/rule_data_plugin_service.ts index b17b10d5b7d265..a5f160f05c5378 100644 --- a/x-pack/plugins/rule_registry/server/rule_data_plugin_service/rule_data_plugin_service.ts +++ b/x-pack/plugins/rule_registry/server/rule_data_plugin_service/rule_data_plugin_service.ts @@ -11,7 +11,11 @@ import type { ValidFeatureId } from '@kbn/rule-data-utils'; import type { ElasticsearchClient, Logger } from '@kbn/core/server'; -import type { PublicFrameworkAlertsService, DataStreamAdapter } from '@kbn/alerting-plugin/server'; +import { + PublicFrameworkAlertsService, + DataStreamAdapter, + InstallShutdownError, +} from '@kbn/alerting-plugin/server'; import { INDEX_PREFIX } from '../config'; import { type IRuleDataClient, RuleDataClient, WaitResult } from '../rule_data_client'; import { IndexInfo } from './index_info'; @@ -158,7 +162,12 @@ export class RuleDataService implements IRuleDataService { .installCommonResources() .then(() => right('ok' as const)) .catch((e) => { - this.options.logger.error(e); + if (e instanceof InstallShutdownError) { + this.options.logger.debug(e.message); + } else { + this.options.logger.error(e); + } + return left(e); // propagates it to the index initialization phase }); @@ -203,7 +212,11 @@ export class RuleDataService implements IRuleDataService { const clusterClient = await this.options.getClusterClient(); return right(clusterClient); } catch (e) { - this.options.logger.error(e); + if (e instanceof InstallShutdownError) { + this.options.logger.debug(e.message); + } else { + this.options.logger.error(e); + } return left(e); } }; From 33fe17e56bd10d91afa2dcf96bb788b530f54329 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Loix?= Date: Mon, 23 Oct 2023 16:18:58 +0100 Subject: [PATCH 10/68] [Serverless nav] Handle groups and vertical space (#169251) --- .../core/chrome/core-chrome-browser/index.ts | 1 + .../chrome/core-chrome-browser/src/index.ts | 1 + .../src/project_navigation.ts | 13 +- .../analytics/default_navigation.ts | 1 + .../devtools/default_navigation.ts | 1 + .../management/default_navigation.ts | 7 + packages/default-nav/ml/default_navigation.ts | 5 + .../default_navigation.test.tsx.snap | 6 + .../src/ui/components/navigation.test.tsx | 287 ++++++++++-------- .../components/navigation_item_open_panel.tsx | 19 +- .../ui/components/navigation_section_ui.tsx | 192 ++++++++---- .../ui/components/panel/default_content.tsx | 13 +- .../ui/components/panel/navigation_panel.tsx | 14 +- .../src/ui/components/panel/panel_group.tsx | 42 ++- .../src/ui/default_navigation.test.tsx | 99 +++--- .../navigation/src/ui/navigation.stories.tsx | 207 +++++++++++-- .../components/side_navigation/index.tsx | 13 +- .../serverless_search/public/layout/nav.tsx | 105 ++++--- 18 files changed, 690 insertions(+), 336 deletions(-) diff --git a/packages/core/chrome/core-chrome-browser/index.ts b/packages/core/chrome/core-chrome-browser/index.ts index 207864f16a8441..3f5f517578c7d8 100644 --- a/packages/core/chrome/core-chrome-browser/index.ts +++ b/packages/core/chrome/core-chrome-browser/index.ts @@ -43,4 +43,5 @@ export type { NodeDefinition, NodeDefinitionWithChildren, NodeRenderAs, + EuiThemeSize, } from './src'; diff --git a/packages/core/chrome/core-chrome-browser/src/index.ts b/packages/core/chrome/core-chrome-browser/src/index.ts index 6c9a68dc75018a..f5c6cd5f40482f 100644 --- a/packages/core/chrome/core-chrome-browser/src/index.ts +++ b/packages/core/chrome/core-chrome-browser/src/index.ts @@ -42,4 +42,5 @@ export type { NodeDefinition, NodeDefinitionWithChildren, RenderAs as NodeRenderAs, + EuiThemeSize, } from './project_navigation'; diff --git a/packages/core/chrome/core-chrome-browser/src/project_navigation.ts b/packages/core/chrome/core-chrome-browser/src/project_navigation.ts index 601e7391f4a0f8..23082fb9e03acf 100644 --- a/packages/core/chrome/core-chrome-browser/src/project_navigation.ts +++ b/packages/core/chrome/core-chrome-browser/src/project_navigation.ts @@ -8,7 +8,7 @@ import type { ComponentType } from 'react'; import type { Location } from 'history'; -import { EuiAccordionProps, IconType } from '@elastic/eui'; +import type { EuiAccordionProps, EuiThemeSizes, IconType } from '@elastic/eui'; import type { AppId as DevToolsApp, DeepLinkId as DevToolsLink } from '@kbn/deeplinks-devtools'; import type { AppId as AnalyticsApp, @@ -53,6 +53,8 @@ export type SideNavNodeStatus = 'hidden' | 'visible'; export type RenderAs = 'block' | 'accordion' | 'panelOpener' | 'item'; +export type EuiThemeSize = Exclude; + export type GetIsActiveFn = (params: { /** The current path name including the basePath + hash value but **without** any query params */ pathNameSerialized: string; @@ -93,16 +95,15 @@ interface NodeDefinitionBase { * Optional function to get the active state. This function is called whenever the location changes. */ getIsActive?: GetIsActiveFn; + /** + * Add vertical space before this node + */ + spaceBefore?: EuiThemeSize | null; /** * ---------------------------------------------------------------------------------------------- * ------------------------------- GROUP NODES ONLY PROPS --------------------------------------- * ---------------------------------------------------------------------------------------------- */ - /** - * ["group" nodes only] Optional flag to indicate if the node must be treated as a group title. - * Can not be used with `children` - */ - isGroupTitle?: boolean; /** * ["group" nodes only] Property to indicate how the group should be rendered. * - Accordion: wraps the items in an EuiAccordion diff --git a/packages/default-nav/analytics/default_navigation.ts b/packages/default-nav/analytics/default_navigation.ts index 0ea0b5cd822f1d..a31af527b426cf 100644 --- a/packages/default-nav/analytics/default_navigation.ts +++ b/packages/default-nav/analytics/default_navigation.ts @@ -19,6 +19,7 @@ export const defaultNavigation: AnalyticsNodeDefinition = { defaultMessage: 'Data exploration', }), icon: 'stats', + renderAs: 'accordion', children: [ { link: 'discover', diff --git a/packages/default-nav/devtools/default_navigation.ts b/packages/default-nav/devtools/default_navigation.ts index 8235af8b602a55..e1a29b6e9c35c5 100644 --- a/packages/default-nav/devtools/default_navigation.ts +++ b/packages/default-nav/devtools/default_navigation.ts @@ -19,6 +19,7 @@ export const defaultNavigation: DevToolsNodeDefinition = { }), id: 'rootNav:devtools', icon: 'editorCodeBlock', + renderAs: 'accordion', children: [ { link: 'dev_tools:console', diff --git a/packages/default-nav/management/default_navigation.ts b/packages/default-nav/management/default_navigation.ts index 180f9d74378f81..062163625f5654 100644 --- a/packages/default-nav/management/default_navigation.ts +++ b/packages/default-nav/management/default_navigation.ts @@ -27,6 +27,7 @@ export const defaultNavigation: ManagementNodeDefinition = { defaultMessage: 'Management', }), icon: 'gear', + renderAs: 'accordion', children: [ { link: 'monitoring', @@ -36,6 +37,7 @@ export const defaultNavigation: ManagementNodeDefinition = { title: i18n.translate('defaultNavigation.management.integrationManagement', { defaultMessage: 'Integration management', }), + renderAs: 'accordion', children: [ { link: 'integrations', @@ -53,12 +55,14 @@ export const defaultNavigation: ManagementNodeDefinition = { title: i18n.translate('defaultNavigation.management.stackManagement', { defaultMessage: 'Stack management', }), + renderAs: 'accordion', children: [ { id: 'ingest', title: i18n.translate('defaultNavigation.management.ingest', { defaultMessage: 'Ingest', }), + renderAs: 'accordion', children: [ { link: 'management:ingest_pipelines', @@ -73,6 +77,7 @@ export const defaultNavigation: ManagementNodeDefinition = { title: i18n.translate('defaultNavigation.management.stackManagementData', { defaultMessage: 'Data', }), + renderAs: 'accordion', children: [ { link: 'management:index_management', @@ -87,6 +92,7 @@ export const defaultNavigation: ManagementNodeDefinition = { title: i18n.translate('defaultNavigation.management.alertAndInsights', { defaultMessage: 'Alerts and insights', }), + renderAs: 'accordion', children: [ { // Rules @@ -108,6 +114,7 @@ export const defaultNavigation: ManagementNodeDefinition = { { id: 'kibana', title: 'Kibana', + renderAs: 'accordion', children: [ { link: 'management:dataViews', diff --git a/packages/default-nav/ml/default_navigation.ts b/packages/default-nav/ml/default_navigation.ts index 97f53d6346653a..9d388d92a861e8 100644 --- a/packages/default-nav/ml/default_navigation.ts +++ b/packages/default-nav/ml/default_navigation.ts @@ -38,6 +38,7 @@ export const defaultNavigation: MlNodeDefinition = { defaultMessage: 'Anomaly Detection', }), id: 'anomaly_detection', + renderAs: 'accordion', children: [ { title: i18n.translate('defaultNavigation.ml.jobs', { @@ -61,6 +62,7 @@ export const defaultNavigation: MlNodeDefinition = { title: i18n.translate('defaultNavigation.ml.dataFrameAnalytics', { defaultMessage: 'Data Frame Analytics', }), + renderAs: 'accordion', children: [ { title: 'Jobs', @@ -79,6 +81,7 @@ export const defaultNavigation: MlNodeDefinition = { title: i18n.translate('defaultNavigation.ml.modelManagement', { defaultMessage: 'Model Management', }), + renderAs: 'accordion', children: [ { link: 'ml:nodesOverview', @@ -93,6 +96,7 @@ export const defaultNavigation: MlNodeDefinition = { title: i18n.translate('defaultNavigation.ml.dataVisualizer', { defaultMessage: 'Data Visualizer', }), + renderAs: 'accordion', children: [ { title: i18n.translate('defaultNavigation.ml.file', { @@ -119,6 +123,7 @@ export const defaultNavigation: MlNodeDefinition = { title: i18n.translate('defaultNavigation.ml.aiopsLabs', { defaultMessage: 'AIOps labs', }), + renderAs: 'accordion', children: [ { link: 'ml:logRateAnalysis', diff --git a/packages/shared-ux/chrome/navigation/src/ui/__snapshots__/default_navigation.test.tsx.snap b/packages/shared-ux/chrome/navigation/src/ui/__snapshots__/default_navigation.test.tsx.snap index 734d4e459a8979..251b07e75da5c2 100644 --- a/packages/shared-ux/chrome/navigation/src/ui/__snapshots__/default_navigation.test.tsx.snap +++ b/packages/shared-ux/chrome/navigation/src/ui/__snapshots__/default_navigation.test.tsx.snap @@ -143,6 +143,7 @@ Array [ "path": Array [ "rootNav:analytics", ], + "renderAs": "accordion", "sideNavStatus": "visible", "title": "Data exploration", "type": "navGroup", @@ -285,6 +286,7 @@ Array [ "rootNav:ml", "anomaly_detection", ], + "renderAs": "accordion", "sideNavStatus": "visible", "title": "Anomaly Detection", }, @@ -363,6 +365,7 @@ Array [ "rootNav:ml", "data_frame_analytics", ], + "renderAs": "accordion", "sideNavStatus": "visible", "title": "Data Frame Analytics", }, @@ -420,6 +423,7 @@ Array [ "rootNav:ml", "model_management", ], + "renderAs": "accordion", "sideNavStatus": "visible", "title": "Model Management", }, @@ -498,6 +502,7 @@ Array [ "rootNav:ml", "data_visualizer", ], + "renderAs": "accordion", "sideNavStatus": "visible", "title": "Data Visualizer", }, @@ -576,6 +581,7 @@ Array [ "rootNav:ml", "aiops_labs", ], + "renderAs": "accordion", "sideNavStatus": "visible", "title": "AIOps labs", }, diff --git a/packages/shared-ux/chrome/navigation/src/ui/components/navigation.test.tsx b/packages/shared-ux/chrome/navigation/src/ui/components/navigation.test.tsx index bcf8650373b807..16a952281aec23 100644 --- a/packages/shared-ux/chrome/navigation/src/ui/components/navigation.test.tsx +++ b/packages/shared-ux/chrome/navigation/src/ui/components/navigation.test.tsx @@ -15,6 +15,8 @@ import { render } from '@testing-library/react'; import React from 'react'; import { act } from 'react-dom/test-utils'; import { BehaviorSubject, of, type Observable } from 'rxjs'; +import { EuiThemeProvider } from '@elastic/eui'; + import { getServicesMock } from '../../../mocks/src/jest'; import { NavigationProvider } from '../../services'; import { Navigation } from './navigation'; @@ -38,20 +40,32 @@ describe('', () => { const onProjectNavigationChange = jest.fn(); const { findByTestId } = render( - - - - - - - - - + + + + + + + + + + + - - - + + + ); await act(async () => { @@ -152,6 +166,7 @@ describe('', () => { "group1A", "group1A_1", ], + "renderAs": "accordion", "sideNavStatus": "visible", "title": "Group1A_1", }, @@ -165,6 +180,7 @@ describe('', () => { "group1", "group1A", ], + "renderAs": "accordion", "sideNavStatus": "visible", "title": "Group1A", }, @@ -177,6 +193,7 @@ describe('', () => { "path": Array [ "group1", ], + "renderAs": "accordion", "sideNavStatus": "visible", "title": "", }, @@ -198,23 +215,25 @@ describe('', () => { const onProjectNavigationChange = jest.fn(); render( - - - - - {/* Title from deeplink */} - id="item1" link="item1" /> - id="item2" link="item1" title="Overwrite deeplink title" /> - - Title in children + + + + + + {/* Title from deeplink */} + id="item1" link="item1" /> + id="item2" link="item1" title="Overwrite deeplink title" /> + + Title in children + - - - + + + ); await act(async () => { @@ -347,22 +366,28 @@ describe('', () => { const onProjectNavigationChange = jest.fn(); const { findByTestId } = render( - - - - - {/* Title from deeplink */} - id="item1" link="item1" /> - {/* Should not appear */} - id="unknownLink" link="unknown" title="Should NOT be there" /> + + + + + + {/* Title from deeplink */} + id="item1" link="item1" /> + {/* Should not appear */} + + id="unknownLink" + link="unknown" + title="Should NOT be there" + /> + - - - + + + ); await act(async () => { @@ -446,22 +471,24 @@ describe('', () => { const onProjectNavigationChange = jest.fn(); const { queryByTestId } = render( - - - - - id="item1" link="notRegistered" /> - - - id="item1" link="item1" /> + + + + + + id="item1" link="notRegistered" /> + + + id="item1" link="item1" /> + - - - + + + ); await act(async () => { @@ -550,14 +577,16 @@ describe('', () => { const onProjectNavigationChange = jest.fn(); render( - - - - - - - - + + + + + + + + + + ); await act(async () => { @@ -581,15 +610,17 @@ describe('', () => { ]); const { findByTestId } = render( - - - - - + + + + + + + - - - + + + ); await act(async () => { @@ -606,13 +637,15 @@ describe('', () => { const onProjectNavigationChange = jest.fn(); render( - - - - - - - + + + + + + + + + ); await act(async () => { @@ -670,13 +703,15 @@ describe('', () => { const expectToThrow = () => { render( - - - - - - - + + + + + + + + + ); }; @@ -722,14 +757,16 @@ describe('', () => { const getActiveNodes$ = () => activeNodes$; const { findByTestId } = render( - - - - link="item1" title="Item 1" /> - link="item2" title="Item 2" /> - - - + + + + + link="item1" title="Item 1" /> + link="item2" title="Item 2" /> + + + + ); expect((await findByTestId(/nav-item-group1.item1/)).dataset.testSubj).toMatch( @@ -791,24 +828,26 @@ describe('', () => { }; const { findByTestId } = render( - - - - - link="item1" - title="Item 1" - getIsActive={() => { - return true; - }} - /> - - - + + + + + + link="item1" + title="Item 1" + getIsActive={() => { + return true; + }} + /> + + + + ); jest.advanceTimersByTime(SET_NAVIGATION_DELAY); @@ -824,15 +863,17 @@ describe('', () => { const onProjectNavigationChange = jest.fn(); const { findByTestId } = render( - - - - - - - - - + + + + + + + + + + + ); expect(await findByTestId(/nav-item-group1.cloudLink1/)).toBeVisible(); diff --git a/packages/shared-ux/chrome/navigation/src/ui/components/navigation_item_open_panel.tsx b/packages/shared-ux/chrome/navigation/src/ui/components/navigation_item_open_panel.tsx index d38c3aa336be7f..99ed44565dec46 100644 --- a/packages/shared-ux/chrome/navigation/src/ui/components/navigation_item_open_panel.tsx +++ b/packages/shared-ux/chrome/navigation/src/ui/components/navigation_item_open_panel.tsx @@ -19,6 +19,7 @@ import { type EuiThemeComputed, useEuiTheme, transparentize, + useIsWithinMinBreakpoint, } from '@elastic/eui'; import type { ChromeProjectNavigationNode } from '@kbn/core-chrome-browser'; import type { NavigateToUrlFn } from '../../../types/internal'; @@ -53,6 +54,8 @@ export const NavigationItemOpenPanel: FC = ({ item, navigateToUrl }: Prop const { title, deepLink, isActive, children } = item; const id = nodePathToString(item); const href = deepLink?.url ?? item.href; + const isNotMobile = useIsWithinMinBreakpoint('s'); + const isIconVisible = isNotMobile && !!children && children.length > 0; const itemClassNames = classNames( 'sideNavItem', @@ -73,12 +76,16 @@ export const NavigationItemOpenPanel: FC = ({ item, navigateToUrl }: Prop ); const onIconClick = useCallback(() => { - openPanel(item); - }, [openPanel, item]); + if (selectedNode?.id === item.id) { + closePanel(); + } else { + openPanel(item); + } + }, [openPanel, closePanel, item, selectedNode]); return ( - + = ({ item, navigateToUrl }: Prop /> - {!!children && children.length > 0 && ( - + {isIconVisible && ( + = ({ item, navigateToUrl }: Prop aria-label={i18n.translate('sharedUXPackages.chrome.sideNavigation.togglePanel', { defaultMessage: 'Toggle panel navigation', })} - data-test-subj={`solutionSideNavItemButton-${id}`} + data-test-subj={`panelOpener-${id}`} /> )} diff --git a/packages/shared-ux/chrome/navigation/src/ui/components/navigation_section_ui.tsx b/packages/shared-ux/chrome/navigation/src/ui/components/navigation_section_ui.tsx index 11f7dfc898f90b..af0f0632a94a70 100644 --- a/packages/shared-ux/chrome/navigation/src/ui/components/navigation_section_ui.tsx +++ b/packages/shared-ux/chrome/navigation/src/ui/components/navigation_section_ui.tsx @@ -9,14 +9,16 @@ import React, { FC } from 'react'; import { - EuiAccordionProps, - EuiCollapsibleNavItem, - EuiCollapsibleNavItemProps, - EuiCollapsibleNavSubItemProps, EuiTitle, + EuiCollapsibleNavItem, + EuiSpacer, + type EuiAccordionProps, + type EuiCollapsibleNavItemProps, + type EuiCollapsibleNavSubItemProps, } from '@elastic/eui'; import type { ChromeProjectNavigationNode } from '@kbn/core-chrome-browser'; import classnames from 'classnames'; +import type { EuiThemeSize, RenderAs } from '@kbn/core-chrome-browser/src/project_navigation'; import type { NavigateToUrlFn } from '../../../types/internal'; import { useNavigation as useServices } from '../../services'; @@ -29,6 +31,8 @@ const nodeHasLink = (navNode: ChromeProjectNavigationNode) => const nodeHasChildren = (navNode: ChromeProjectNavigationNode) => Boolean(navNode.children?.length); +const DEFAULT_SPACE_BETWEEN_LEVEL_1_GROUPS: EuiThemeSize = 'm'; + /** * Predicate to determine if a node should be visible in the main side nav. * If it is not visible it will be filtered out and not rendered. @@ -36,11 +40,6 @@ const nodeHasChildren = (navNode: ChromeProjectNavigationNode) => Boolean(navNod const itemIsVisible = (item: ChromeProjectNavigationNode) => { if (item.sideNavStatus === 'hidden') return false; - const isGroupTitle = Boolean(item.isGroupTitle); - if (isGroupTitle) { - return true; - } - if (nodeHasLink(item)) { return true; } @@ -52,6 +51,12 @@ const itemIsVisible = (item: ChromeProjectNavigationNode) => { return false; }; +const getRenderAs = (navNode: ChromeProjectNavigationNode): RenderAs => { + if (navNode.renderAs) return navNode.renderAs; + if (!navNode.children) return 'item'; + return 'block'; +}; + const filterChildren = ( children?: ChromeProjectNavigationNode[] ): ChromeProjectNavigationNode[] | undefined => { @@ -60,13 +65,15 @@ const filterChildren = ( }; const serializeNavNode = (navNode: ChromeProjectNavigationNode) => { - const serialized = { + const serialized: ChromeProjectNavigationNode = { ...navNode, id: nodePathToString(navNode), children: filterChildren(navNode.children), href: getNavigationNodeHref(navNode), }; + serialized.renderAs = getRenderAs(serialized); + return { navNode: serialized, hasChildren: nodeHasChildren(serialized), @@ -83,6 +90,53 @@ const isEuiCollapsibleNavItemProps = ( ); }; +const renderBlockTitle: ( + { title }: ChromeProjectNavigationNode, + { spaceBefore }: { spaceBefore: EuiThemeSize | null } +) => Required['renderItem'] = + ({ title }, { spaceBefore }) => + () => + ( + { + return { + marginTop: spaceBefore ? euiTheme.size[spaceBefore] : undefined, + // marginTop: euiTheme.size.base, + paddingBlock: euiTheme.size.xs, + paddingInline: euiTheme.size.s, + }; + }} + > +
{title}
+
+ ); + +const renderGroup = ( + navGroup: ChromeProjectNavigationNode, + groupItems: Array, + { spaceBefore = DEFAULT_SPACE_BETWEEN_LEVEL_1_GROUPS }: { spaceBefore?: EuiThemeSize | null } = {} +): Required['items'] => { + let itemPrepend: EuiCollapsibleNavItemProps | EuiCollapsibleNavSubItemProps | null = null; + + if (!!navGroup.title) { + itemPrepend = { + renderItem: renderBlockTitle(navGroup, { spaceBefore }), + }; + } else if (spaceBefore) { + itemPrepend = { + renderItem: () => , + }; + } + + if (!itemPrepend) { + return groupItems; + } + + return [itemPrepend, ...groupItems]; +}; + // Generate the EuiCollapsible props for both the root component (EuiCollapsibleNavItem) and its // "items" props. Both are compatible with the exception of "renderItem" which is only used for // sub items. @@ -101,10 +155,22 @@ const nodeToEuiCollapsibleNavProps = ( isSideNavCollapsed: boolean; treeDepth: number; } -): { props: EuiCollapsibleNavItemProps | EuiCollapsibleNavSubItemProps; isVisible: boolean } => { +): { + items: Array; + isVisible: boolean; +} => { const { navNode, isItem, hasChildren, hasLink } = serializeNavNode(_navNode); - const { id, title, href, icon, renderAs, isActive, deepLink, isGroupTitle } = navNode; + const { + id, + title, + href, + icon, + renderAs, + isActive, + deepLink, + spaceBefore: _spaceBefore, + } = navNode; const isExternal = Boolean(href) && isAbsoluteLink(href!); const isSelected = hasChildren ? false : isActive; const dataTestSubj = classnames(`nav-item`, `nav-item-${id}`, { @@ -113,34 +179,25 @@ const nodeToEuiCollapsibleNavProps = ( [`nav-item-isActive`]: isSelected, }); - // Note: this can be replaced with an `isGroup` API or whatever you prefer - // Could also probably be pulled out to a separate component vs inlined - if (isGroupTitle) { - const props: EuiCollapsibleNavSubItemProps = { - renderItem: () => ( - ({ - marginTop: euiTheme.size.base, - paddingBlock: euiTheme.size.xs, - paddingInline: euiTheme.size.s, - })} - > -
- {title} -
-
- ), - }; - return { props, isVisible: true }; + let spaceBefore = _spaceBefore; + if (spaceBefore === undefined && treeDepth === 1 && hasChildren) { + // For groups at level 1 that don't have a space specified we default to add a "m" + // space. For all other groups, unless specified, there is no vertical space. + spaceBefore = DEFAULT_SPACE_BETWEEN_LEVEL_1_GROUPS; } if (renderAs === 'panelOpener') { - const props: EuiCollapsibleNavSubItemProps = { - renderItem: () => , - }; - return { props, isVisible: true }; + const items: EuiCollapsibleNavSubItemProps[] = [ + { + renderItem: () => , + }, + ]; + if (spaceBefore) { + items.unshift({ + renderItem: () => , + }); + } + return { items, isVisible: true }; } const onClick = (e: React.MouseEvent) => { @@ -152,7 +209,7 @@ const nodeToEuiCollapsibleNavProps = ( } }; - const items: EuiCollapsibleNavItemProps['items'] = isItem + const subItems: EuiCollapsibleNavItemProps['items'] | undefined = isItem ? undefined : navNode.children ?.map((child) => @@ -165,7 +222,11 @@ const nodeToEuiCollapsibleNavProps = ( }) ) .filter(({ isVisible }) => isVisible) - .map((res) => res.props); + .map((res) => { + const itemsFlattened: EuiCollapsibleNavItemProps['items'] = res.items.flat(); + return itemsFlattened; + }) + .flat(); const linkProps: EuiCollapsibleNavItemProps['linkProps'] | undefined = hasLink ? { @@ -190,22 +251,43 @@ const nodeToEuiCollapsibleNavProps = ( ...navNode.accordionProps, }; - const props: EuiCollapsibleNavItemProps = { - id, - title, - isSelected, - accordionProps, - linkProps, - onClick, - href, - items, - ['data-test-subj']: dataTestSubj, - icon, - iconProps: { size: treeDepth === 0 ? 'm' : 's' }, - }; + if (renderAs === 'block' && treeDepth > 0 && subItems) { + // Render as a group block (bold title + list of links underneath) + return { + items: [...renderGroup(navNode, subItems, { spaceBefore: spaceBefore ?? null })], + isVisible: subItems.length > 0, + }; + } + + // Render as an accordion or a link (handled by EUI) depending if + // "items" is undefined or not. If it is undefined --> a link, otherwise an + // accordion is rendered. + const items: Array = [ + { + id, + title, + isSelected, + accordionProps, + linkProps, + onClick, + href, + items: subItems, + ['data-test-subj']: dataTestSubj, + icon, + iconProps: { size: treeDepth === 0 ? 'm' : 's' }, + }, + ]; const hasVisibleChildren = (items?.length ?? 0) > 0; - return { props, isVisible: isItem || hasVisibleChildren }; + const isVisible = isItem || hasVisibleChildren; + + if (isVisible && spaceBefore) { + items.unshift({ + renderItem: () => , + }); + } + + return { items, isVisible }; }; interface Props { @@ -216,7 +298,7 @@ export const NavigationSectionUI: FC = ({ navNode }) => { const { navigateToUrl, isSideNavCollapsed } = useServices(); const { open: openPanel, close: closePanel } = usePanel(); - const { props, isVisible } = nodeToEuiCollapsibleNavProps(navNode, { + const { items, isVisible } = nodeToEuiCollapsibleNavProps(navNode, { navigateToUrl, openPanel, closePanel, @@ -224,6 +306,8 @@ export const NavigationSectionUI: FC = ({ navNode }) => { treeDepth: 0, }); + const [props] = items; + if (!isEuiCollapsibleNavItemProps(props)) { throw new Error(`Invalid EuiCollapsibleNavItem props for node ${props.id}`); } diff --git a/packages/shared-ux/chrome/navigation/src/ui/components/panel/default_content.tsx b/packages/shared-ux/chrome/navigation/src/ui/components/panel/default_content.tsx index fd1c56884f17ad..a678bad3aeaeee 100644 --- a/packages/shared-ux/chrome/navigation/src/ui/components/panel/default_content.tsx +++ b/packages/shared-ux/chrome/navigation/src/ui/components/panel/default_content.tsx @@ -6,7 +6,7 @@ * Side Public License, v 1. */ -import { EuiFlexGroup, EuiFlexItem, EuiSpacer, EuiTitle } from '@elastic/eui'; +import { EuiFlexGroup, EuiFlexItem, EuiTitle } from '@elastic/eui'; import { ChromeProjectNavigationNode } from '@kbn/core-chrome-browser'; import React, { Fragment, type FC } from 'react'; @@ -69,13 +69,10 @@ export const DefaultContent: FC = ({ selectedNode }) => { (child) => child.sideNavStatus !== 'hidden' ); const serializedChildren = serializeChildren({ ...selectedNode, children: filteredChildren }); - const totalChildren = serializedChildren?.length ?? 0; - const firstChildIsGroup = !!serializedChildren?.[0]?.children; - const firstGroupTitle = firstChildIsGroup && serializedChildren?.[0]?.title; - const firstGroupHasTitle = !!firstGroupTitle; return ( + {/* Panel title */} {typeof selectedNode.title === 'string' ? ( @@ -86,10 +83,9 @@ export const DefaultContent: FC = ({ selectedNode }) => { )} + {/* Panel navigation */} <> - {firstGroupHasTitle && } - {serializedChildren && ( <> {serializedChildren.map((child, i) => { @@ -103,9 +99,6 @@ export const DefaultContent: FC = ({ selectedNode }) => { isFirstInList={i === 0} hasHorizontalRuleBefore={hasHorizontalRuleBefore} /> - {i < totalChildren - 1 && ( - - )} ) : ( diff --git a/packages/shared-ux/chrome/navigation/src/ui/components/panel/navigation_panel.tsx b/packages/shared-ux/chrome/navigation/src/ui/components/panel/navigation_panel.tsx index 8cefab48569d31..616d1aca201cf7 100644 --- a/packages/shared-ux/chrome/navigation/src/ui/components/panel/navigation_panel.tsx +++ b/packages/shared-ux/chrome/navigation/src/ui/components/panel/navigation_panel.tsx @@ -22,7 +22,7 @@ import { getNavPanelStyles, getPanelWrapperStyles } from './styles'; export const NavigationPanel: FC = () => { const { euiTheme } = useEuiTheme(); - const { isOpen, close, getContent } = usePanel(); + const { isOpen, close, getContent, selectedNode } = usePanel(); // ESC key closes PanelNav const onKeyDown = useCallback( @@ -34,9 +34,15 @@ export const NavigationPanel: FC = () => { [close] ); - const onOutsideClick = useCallback(() => { - close(); - }, [close]); + const onOutsideClick = useCallback( + ({ target }: Event) => { + // Only close if we are not clicking on the currently selected nav node + if ((target as HTMLButtonElement).dataset.testSubj !== `panelOpener-${selectedNode?.id}`) { + close(); + } + }, + [close, selectedNode] + ); const panelWrapperClasses = getPanelWrapperStyles(); const sideNavPanelStyles = getNavPanelStyles(euiTheme); diff --git a/packages/shared-ux/chrome/navigation/src/ui/components/panel/panel_group.tsx b/packages/shared-ux/chrome/navigation/src/ui/components/panel/panel_group.tsx index 711adf401e7b1c..d3f39f291f25d9 100644 --- a/packages/shared-ux/chrome/navigation/src/ui/components/panel/panel_group.tsx +++ b/packages/shared-ux/chrome/navigation/src/ui/components/panel/panel_group.tsx @@ -5,7 +5,7 @@ * in compliance with, at your election, the Elastic License 2.0 or the Server * Side Public License, v 1. */ -import React, { FC, Fragment, useCallback } from 'react'; +import React, { FC, useCallback } from 'react'; import { EuiListGroup, EuiTitle, @@ -19,7 +19,7 @@ import { } from '@elastic/eui'; import { css } from '@emotion/css'; -import { ChromeProjectNavigationNode } from '@kbn/core-chrome-browser'; +import type { ChromeProjectNavigationNode } from '@kbn/core-chrome-browser'; import { PanelNavItem } from './panel_nav_item'; const accordionButtonClassName = 'sideNavPanelAccordion__button'; @@ -42,6 +42,16 @@ const getClassnames = (euiTheme: EuiThemeComputed<{}>) => ({ `, }); +const someChildIsVisible = (children: ChromeProjectNavigationNode[]) => { + return children.some((child) => { + if (child.renderAs === 'item') return true; + if (child.children) { + return child.children.every(({ sideNavStatus }) => sideNavStatus !== 'hidden'); + } + return true; + }); +}; + interface Props { navNode: ChromeProjectNavigationNode; /** Flag to indicate if the group is the first in the list of groups when looping */ @@ -52,15 +62,24 @@ interface Props { export const PanelGroup: FC = ({ navNode, isFirstInList, hasHorizontalRuleBefore }) => { const { euiTheme } = useEuiTheme(); - const { id, title, appendHorizontalRule } = navNode; + const { id, title, appendHorizontalRule, spaceBefore: _spaceBefore } = navNode; const filteredChildren = navNode.children?.filter((child) => child.sideNavStatus !== 'hidden'); - const totalChildren = filteredChildren?.length ?? 0; const classNames = getClassnames(euiTheme); const hasTitle = !!title && title !== ''; const removePaddingTop = !hasTitle && !isFirstInList; const someChildIsGroup = filteredChildren?.some((child) => !!child.children); const firstChildIsGroup = !!filteredChildren?.[0]?.children; + let spaceBefore = _spaceBefore; + if (spaceBefore === undefined) { + if (!hasTitle && isFirstInList) { + // If the first group has no title, we don't add any space. + spaceBefore = null; + } else { + spaceBefore = hasHorizontalRuleBefore ? 'm' : 'l'; + } + } + const renderChildren = useCallback(() => { if (!filteredChildren) return null; @@ -69,21 +88,19 @@ export const PanelGroup: FC = ({ navNode, isFirstInList, hasHorizontalRul return isItem ? ( ) : ( - - - {i < totalChildren - 1 && } - + ); }); - }, [filteredChildren, totalChildren]); + }, [filteredChildren]); - if (!filteredChildren?.length) { + if (!filteredChildren?.length || !someChildIsVisible(filteredChildren)) { return null; } if (navNode.renderAs === 'accordion') { return ( <> + {spaceBefore !== null && } = ({ navNode, isFirstInList, hasHorizontalRul buttonClassName={accordionButtonClassName} > <> - + {!firstChildIsGroup && } {renderChildren()} @@ -102,9 +119,10 @@ export const PanelGroup: FC = ({ navNode, isFirstInList, hasHorizontalRul return ( <> + {spaceBefore !== null && } {hasTitle && ( -

{navNode.title}

+

{title}

)} ', () => { ]; const { findAllByTestId } = render( - - - + + + + + ); await act(async () => { @@ -252,13 +255,15 @@ describe('', () => { ]; render( - - - + + + + + ); await act(async () => { @@ -494,9 +499,11 @@ describe('', () => { ]; render( - - - + + + + + ); await act(async () => { @@ -590,9 +597,11 @@ describe('', () => { const expectToThrow = () => { render( - - - + + + + + ); }; @@ -615,9 +624,11 @@ describe('', () => { ]; const { findByTestId } = render( - - - + + + + + ); await act(async () => { @@ -683,9 +694,11 @@ describe('', () => { const getActiveNodes$ = () => activeNodes$; const { findByTestId } = render( - - - + + + + + ); await act(async () => { @@ -741,14 +754,16 @@ describe('', () => { }; const { findByTestId } = render( - - - + + + + + ); await act(async () => { @@ -804,13 +819,15 @@ describe('', () => { ]; render( - - - + + + + + ); await act(async () => { @@ -833,9 +850,11 @@ describe('', () => { describe('cloud links', () => { test('render the cloud link', async () => { const { findByTestId } = render( - - - + + + + + ); expect( diff --git a/packages/shared-ux/chrome/navigation/src/ui/navigation.stories.tsx b/packages/shared-ux/chrome/navigation/src/ui/navigation.stories.tsx index 95a5dbe163668e..43c40ed39ab2ef 100644 --- a/packages/shared-ux/chrome/navigation/src/ui/navigation.stories.tsx +++ b/packages/shared-ux/chrome/navigation/src/ui/navigation.stories.tsx @@ -201,6 +201,154 @@ export const SimpleObjectDefinition = (args: NavigationServices) => { ); }; +const groupExamplesDefinition: ProjectNavigationDefinition = { + navigationTree: { + body: [ + // My custom project + { + type: 'navGroup', + id: 'example_projet', + title: 'Example project', + icon: 'logoObservability', + defaultIsCollapsed: false, + children: [ + { + title: 'Block group', + children: [ + { + id: 'item1', + link: 'item1', + title: 'Item 1', + }, + { + id: 'item2', + link: 'item1', + title: 'Item 2', + }, + { + id: 'item3', + link: 'item1', + title: 'Item 3', + }, + ], + }, + { + title: 'Accordion group', + renderAs: 'accordion', + children: [ + { + id: 'item1', + link: 'item1', + title: 'Item 1', + }, + { + id: 'item2', + link: 'item1', + title: 'Item 2', + }, + { + id: 'item3', + link: 'item1', + title: 'Item 3', + }, + ], + }, + { + children: [ + { + id: 'item1', + link: 'item1', + title: 'Block group', + }, + { + id: 'item2', + link: 'item1', + title: 'without', + }, + { + id: 'item3', + link: 'item1', + title: 'title', + }, + ], + }, + { + id: 'group:settings', + link: 'item1', + title: 'Panel group', + renderAs: 'panelOpener', + children: [ + { + title: 'Group 1', + children: [ + { + link: 'group:settings.logs', + title: 'Logs', + }, + { + link: 'group:settings.signals', + title: 'Signals', + }, + { + id: 'group:settings.signals-2', + link: 'group:settings.signals', + title: 'Signals - should NOT appear', + sideNavStatus: 'hidden', // Should not appear + }, + { + link: 'group:settings.tracing', + title: 'Tracing', + }, + ], + }, + { + id: 'group.nestedGroup', + link: 'group:settings.tracing', + title: 'Group 2', + children: [ + { + id: 'item1', + link: 'group:settings.signals', + title: 'Some link title', + }, + ], + }, + ], + }, + ], + }, + ], + footer: [ + { + type: 'navGroup', + ...getPresets('devtools'), + }, + ], + }, +}; + +export const GroupsExamples = (args: NavigationServices) => { + const services = storybookMock.getServices({ + ...args, + navLinks$: of([...navLinksMock, ...deepLinks]), + onProjectNavigationChange: (updated) => { + action('Update chrome navigation')(JSON.stringify(updated, null, 2)); + }, + recentlyAccessed$: of([ + { label: 'This is an example', link: '/app/example/39859', id: '39850' }, + { label: 'Another example', link: '/app/example/5235', id: '5235' }, + ]), + }); + + return ( + + + + + + ); +}; + const navigationDefinition: ProjectNavigationDefinition = { navigationTree: { body: [ @@ -216,6 +364,26 @@ const navigationDefinition: ProjectNavigationDefinition = { link: 'item1', title: 'Get started', }, + { + title: 'Group 1', + children: [ + { + id: 'item1', + link: 'item1', + title: 'Item 1', + }, + { + id: 'item2', + link: 'item1', + title: 'Item 2', + }, + { + id: 'item3', + link: 'item1', + title: 'Item 3', + }, + ], + }, { link: 'item2', title: 'Alerts', @@ -683,7 +851,7 @@ const navigationDefinitionWithPanel: ProjectNavigationDefinition = { id: 'root', children: [ { - title: 'Should act as item 1', + title: 'Group renders as "item" (1)', link: 'item1', renderAs: 'item', children: [ @@ -699,7 +867,7 @@ const navigationDefinitionWithPanel: ProjectNavigationDefinition = { }, { link: 'group:settings.logs', - title: 'Normal item', + title: 'Item 2', }, { link: 'group:settings.logs2', @@ -723,25 +891,7 @@ const navigationDefinitionWithPanel: ProjectNavigationDefinition = { ], }, { - title: 'Should act as item 2', - renderAs: 'item', // This group renders as a normal item - children: [ - { - link: 'group:settings.logs', - title: 'Logs', - }, - { - link: 'group:settings.signals', - title: 'Signals', - }, - ], - }, - ], - }, - { - children: [ - { - title: 'Another group as Item', + title: 'Group renders as "item" (2)', id: 'group2.renderAsItem', renderAs: 'item', children: [ @@ -797,7 +947,7 @@ const navigationDefinitionWithPanel: ProjectNavigationDefinition = { children: [ { id: 'group2-B', - title: 'Group 2 (render as Item)', + title: 'Group renders as "item" (3)', renderAs: 'item', // This group renders as a normal item children: [ { @@ -995,6 +1145,19 @@ export const WithUIComponents = (args: NavigationServices) => { + id="group:block" title="This is a block group"> + + link="group:settings.logs" title="Logs" /> + link="group:settings.signals" title="Signals" withBadge /> + link="group:settings.tracing" title="Tracing" /> + + + link="group:settings.logs" title="Logs" /> + link="group:settings.signals" title="Signals" /> + link="group:settings.tracing" title="Tracing" /> + + + id="group:openPanel" link="item1" diff --git a/x-pack/plugins/serverless_observability/public/components/side_navigation/index.tsx b/x-pack/plugins/serverless_observability/public/components/side_navigation/index.tsx index a55fedb0b6c79b..9a8b5350c68579 100644 --- a/x-pack/plugins/serverless_observability/public/components/side_navigation/index.tsx +++ b/x-pack/plugins/serverless_observability/public/components/side_navigation/index.tsx @@ -79,9 +79,11 @@ const navigationTree: NavigationTreeDefinition = { { id: 'aiops', title: 'AIOps', + renderAs: 'accordion', accordionProps: { arrowProps: { css: { display: 'none' } }, }, + spaceBefore: null, children: [ { title: i18n.translate('xpack.serverlessObservability.nav.ml.jobs', { @@ -115,15 +117,12 @@ const navigationTree: NavigationTreeDefinition = { }, ], }, - { - id: 'groups-spacer-1', - isGroupTitle: true, - }, { id: 'apm', title: i18n.translate('xpack.serverlessObservability.nav.applications', { defaultMessage: 'Applications', }), + renderAs: 'accordion', accordionProps: { arrowProps: { css: { display: 'none' } }, }, @@ -154,6 +153,7 @@ const navigationTree: NavigationTreeDefinition = { title: i18n.translate('xpack.serverlessObservability.nav.infrastructure', { defaultMessage: 'Infrastructure', }), + renderAs: 'accordion', accordionProps: { arrowProps: { css: { display: 'none' } }, }, @@ -172,10 +172,6 @@ const navigationTree: NavigationTreeDefinition = { }, ], }, - { - id: 'groups-spacer-2', - isGroupTitle: true, - }, ], }, ], @@ -186,7 +182,6 @@ const navigationTree: NavigationTreeDefinition = { defaultMessage: 'Get Started', }), link: 'observabilityOnboarding', - isGroupTitle: true, icon: 'launch', }, { diff --git a/x-pack/plugins/serverless_search/public/layout/nav.tsx b/x-pack/plugins/serverless_search/public/layout/nav.tsx index a4078ba841861f..fc71f9b05324c3 100644 --- a/x-pack/plugins/serverless_search/public/layout/nav.tsx +++ b/x-pack/plugins/serverless_search/public/layout/nav.tsx @@ -45,35 +45,36 @@ const navigationTree: NavigationTreeDefinition = { title: i18n.translate('xpack.serverlessSearch.nav.explore', { defaultMessage: 'Explore', }), - isGroupTitle: true, - }, - { - link: 'discover', - }, - { - link: 'dashboards', - getIsActive: ({ pathNameSerialized, prepend }) => { - return pathNameSerialized.startsWith(prepend('/app/dashboards')); - }, - }, - { - link: 'visualize', - title: i18n.translate('xpack.serverlessSearch.nav.visualize', { - defaultMessage: 'Visualizations', - }), - getIsActive: ({ pathNameSerialized, prepend }) => { - return ( - pathNameSerialized.startsWith(prepend('/app/visualize')) || - pathNameSerialized.startsWith(prepend('/app/lens')) || - pathNameSerialized.startsWith(prepend('/app/maps')) - ); - }, - }, - { - link: 'management:triggersActions', - title: i18n.translate('xpack.serverlessSearch.nav.alerts', { - defaultMessage: 'Alerts', - }), + children: [ + { + link: 'discover', + }, + { + link: 'dashboards', + getIsActive: ({ pathNameSerialized, prepend }) => { + return pathNameSerialized.startsWith(prepend('/app/dashboards')); + }, + }, + { + link: 'visualize', + title: i18n.translate('xpack.serverlessSearch.nav.visualize', { + defaultMessage: 'Visualizations', + }), + getIsActive: ({ pathNameSerialized, prepend }) => { + return ( + pathNameSerialized.startsWith(prepend('/app/visualize')) || + pathNameSerialized.startsWith(prepend('/app/lens')) || + pathNameSerialized.startsWith(prepend('/app/maps')) + ); + }, + }, + { + link: 'management:triggersActions', + title: i18n.translate('xpack.serverlessSearch.nav.alerts', { + defaultMessage: 'Alerts', + }), + }, + ], }, { @@ -81,33 +82,37 @@ const navigationTree: NavigationTreeDefinition = { title: i18n.translate('xpack.serverlessSearch.nav.content', { defaultMessage: 'Content', }), - isGroupTitle: true, - }, - { - title: i18n.translate('xpack.serverlessSearch.nav.content.indices', { - defaultMessage: 'Index Management', - }), - link: 'management:index_management', - breadcrumbStatus: 'hidden' /* management sub-pages set their breadcrumbs themselves */, + children: [ + { + title: i18n.translate('xpack.serverlessSearch.nav.content.indices', { + defaultMessage: 'Index Management', + }), + link: 'management:index_management', + breadcrumbStatus: + 'hidden' /* management sub-pages set their breadcrumbs themselves */, + }, + { + title: i18n.translate('xpack.serverlessSearch.nav.content.pipelines', { + defaultMessage: 'Pipelines', + }), + link: 'management:ingest_pipelines', + breadcrumbStatus: + 'hidden' /* management sub-pages set their breadcrumbs themselves */, + }, + ], }, - { - title: i18n.translate('xpack.serverlessSearch.nav.content.pipelines', { - defaultMessage: 'Pipelines', - }), - link: 'management:ingest_pipelines', - breadcrumbStatus: 'hidden' /* management sub-pages set their breadcrumbs themselves */, - }, - { id: 'security', title: i18n.translate('xpack.serverlessSearch.nav.security', { defaultMessage: 'Security', }), - isGroupTitle: true, - }, - { - link: 'management:api_keys', - breadcrumbStatus: 'hidden' /* management sub-pages set their breadcrumbs themselves */, + children: [ + { + link: 'management:api_keys', + breadcrumbStatus: + 'hidden' /* management sub-pages set their breadcrumbs themselves */, + }, + ], }, ], }, From 032a12606eea62efbed84da00847eefd347fc8b8 Mon Sep 17 00:00:00 2001 From: Shahzad Date: Mon, 23 Oct 2023 17:23:33 +0200 Subject: [PATCH 11/68] [Synthetics] Unskip alerting test (#168958) --- .../default_status_alert.journey.ts | 11 +++++----- .../e2e/synthetics/journeys/index.ts | 2 +- .../journeys/services/synthetics_services.ts | 5 +++-- .../synthetics/hooks/use_breadcrumbs.test.tsx | 21 ++++++++++++++++--- .../apps/synthetics/hooks/use_breadcrumbs.ts | 9 ++++++++ .../default_alerts/default_alert_service.ts | 12 ++++------- .../observability/synthetics_rule.ts | 4 ++-- .../synthetics/enable_default_alerting.ts | 4 ++-- 8 files changed, 44 insertions(+), 24 deletions(-) diff --git a/x-pack/plugins/synthetics/e2e/synthetics/journeys/alert_rules/default_status_alert.journey.ts b/x-pack/plugins/synthetics/e2e/synthetics/journeys/alert_rules/default_status_alert.journey.ts index 95a74d77db8104..35b2bbbbef5f69 100644 --- a/x-pack/plugins/synthetics/e2e/synthetics/journeys/alert_rules/default_status_alert.journey.ts +++ b/x-pack/plugins/synthetics/e2e/synthetics/journeys/alert_rules/default_status_alert.journey.ts @@ -57,10 +57,10 @@ journey(`DefaultStatusAlert`, async ({ page, params }) => { await page.click(byTestId('xpack.synthetics.alertsPopover.toggleButton')); await page.isDisabled(byTestId('xpack.synthetics.toggleAlertFlyout')); await page.click(byTestId('xpack.synthetics.toggleAlertFlyout')); - await page.waitForSelector('text=Edit rule'); + await page.waitForSelector('text=Monitor status rule'); expect(await page.locator(`[data-test-subj="intervalFormRow"]`).count()).toEqual(0); await page.click(byTestId('saveEditedRuleButton')); - await page.waitForSelector("text=Updated 'Synthetics internal alert'"); + await page.waitForSelector("text=Updated 'Synthetics status internal rule'"); }); step('Monitor is as up in overview page', async () => { @@ -108,7 +108,7 @@ journey(`DefaultStatusAlert`, async ({ page, params }) => { name: 'Test Monitor', location: 'North America - US Central', timestamp: downCheckTime, - status: 'is down.', + status: 'down', }); await retry.tryForTime(3 * 60 * 1000, async () => { @@ -169,7 +169,7 @@ journey(`DefaultStatusAlert`, async ({ page, params }) => { name, location: 'North America - US Central', timestamp: downCheckTime, - status: 'is down.', + status: 'down', }); await retry.tryForTime(3 * 60 * 1000, async () => { @@ -198,7 +198,6 @@ journey(`DefaultStatusAlert`, async ({ page, params }) => { await page.waitForTimeout(10 * 1000); await page.click('[aria-label="View in app"]'); - await page.click(byTestId('syntheticsMonitorOverviewTab')); - await page.waitForSelector('text=Monitor details'); + await page.click(byTestId('breadcrumb /app/synthetics/monitors')); }); }); diff --git a/x-pack/plugins/synthetics/e2e/synthetics/journeys/index.ts b/x-pack/plugins/synthetics/e2e/synthetics/journeys/index.ts index e38219a78ec95d..f7303beaba299e 100644 --- a/x-pack/plugins/synthetics/e2e/synthetics/journeys/index.ts +++ b/x-pack/plugins/synthetics/e2e/synthetics/journeys/index.ts @@ -18,7 +18,7 @@ export * from './private_locations.journey'; export * from './alerting_default.journey'; export * from './global_parameters.journey'; export * from './detail_flyout'; -// export * from './alert_rules/default_status_alert.journey'; +export * from './alert_rules/default_status_alert.journey'; export * from './test_now_mode.journey'; export * from './monitor_details_page/monitor_summary.journey'; export * from './test_run_details.journey'; diff --git a/x-pack/plugins/synthetics/e2e/synthetics/journeys/services/synthetics_services.ts b/x-pack/plugins/synthetics/e2e/synthetics/journeys/services/synthetics_services.ts index 47199b38f0a3b4..a418a52eae92ec 100644 --- a/x-pack/plugins/synthetics/e2e/synthetics/journeys/services/synthetics_services.ts +++ b/x-pack/plugins/synthetics/e2e/synthetics/journeys/services/synthetics_services.ts @@ -7,7 +7,7 @@ import axios from 'axios'; import type { Client } from '@elastic/elasticsearch'; -import { KbnClient, uriencode } from '@kbn/test'; +import { KbnClient } from '@kbn/test'; import pMap from 'p-map'; import { SyntheticsMonitor } from '../../../../common/runtime_types'; import { SYNTHETICS_API_URLS } from '../../../../common/constants'; @@ -100,12 +100,13 @@ export class SyntheticsServices { }); const { monitors = [] } = data as any; + await pMap( monitors, async (monitor: Record) => { await this.requester.request({ description: 'delete monitor', - path: uriencode`${SYNTHETICS_API_URLS.SYNTHETICS_MONITORS}/${monitor.id}`, + path: `${SYNTHETICS_API_URLS.SYNTHETICS_MONITORS}/${monitor.config_id}`, method: 'DELETE', }); }, diff --git a/x-pack/plugins/synthetics/public/apps/synthetics/hooks/use_breadcrumbs.test.tsx b/x-pack/plugins/synthetics/public/apps/synthetics/hooks/use_breadcrumbs.test.tsx index d2639da47e79e3..e5cb27e6200611 100644 --- a/x-pack/plugins/synthetics/public/apps/synthetics/hooks/use_breadcrumbs.test.tsx +++ b/x-pack/plugins/synthetics/public/apps/synthetics/hooks/use_breadcrumbs.test.tsx @@ -8,6 +8,7 @@ import { ChromeBreadcrumb } from '@kbn/core/public'; import { render } from '../utils/testing'; import React from 'react'; +import { i18n } from '@kbn/i18n'; import { Route } from 'react-router-dom'; import { OVERVIEW_ROUTE } from '../../../../common/constants'; import { KibanaContextProvider } from '@kbn/kibana-react-plugin/public'; @@ -22,13 +23,27 @@ describe('useBreadcrumbs', () => { const [getBreadcrumbs, core] = mockCore(); const expectedCrumbs: ChromeBreadcrumb[] = [ - { text: 'Crumb: ', href: 'http://href.example.net' }, - { text: 'Crumb II: Son of Crumb', href: 'http://href2.example.net' }, + { + text: 'Crumb: ', + 'data-test-subj': 'http://href.example.net', + href: 'http://href.example.net', + }, + { + text: 'Crumb II: Son of Crumb', + 'data-test-subj': 'http://href2.example.net', + href: 'http://href2.example.net', + }, ]; const Component = () => { useBreadcrumbs(expectedCrumbs); - return <>Hello; + return ( + <> + {i18n.translate('app_not_found_in_i18nrc.component.helloLabel', { + defaultMessage: 'Hello', + })} + + ); }; render( diff --git a/x-pack/plugins/synthetics/public/apps/synthetics/hooks/use_breadcrumbs.ts b/x-pack/plugins/synthetics/public/apps/synthetics/hooks/use_breadcrumbs.ts index 4225f888a09bb2..394b1f23634a03 100644 --- a/x-pack/plugins/synthetics/public/apps/synthetics/hooks/use_breadcrumbs.ts +++ b/x-pack/plugins/synthetics/public/apps/synthetics/hooks/use_breadcrumbs.ts @@ -32,6 +32,13 @@ function handleBreadcrumbClick( }, } : {}), + ...(bc['data-test-subj'] + ? { + 'data-test-subj': bc['data-test-subj'], + } + : { + 'data-test-subj': bc.href, + }), })); } @@ -54,12 +61,14 @@ export const makeBaseBreadcrumb = ( defaultMessage: 'Observability', }), href: observabilityPath, + 'data-test-subj': 'observabilityPathBreadcrumb', }, { text: i18n.translate('xpack.synthetics.breadcrumbs.overviewBreadcrumbText', { defaultMessage: 'Synthetics', }), href: uptimePath, + 'data-test-subj': 'syntheticsPathBreadcrumb', }, ]; }; diff --git a/x-pack/plugins/synthetics/server/routes/default_alerts/default_alert_service.ts b/x-pack/plugins/synthetics/server/routes/default_alerts/default_alert_service.ts index d1ac601db007bd..95b899d1fe03fe 100644 --- a/x-pack/plugins/synthetics/server/routes/default_alerts/default_alert_service.ts +++ b/x-pack/plugins/synthetics/server/routes/default_alerts/default_alert_service.ts @@ -58,7 +58,7 @@ export class DefaultAlertService { setupStatusRule() { return this.createDefaultAlertIfNotExist( SYNTHETICS_STATUS_RULE, - `Synthetics status internal alert`, + `Synthetics status internal rule`, '1m' ); } @@ -66,7 +66,7 @@ export class DefaultAlertService { setupTlsRule() { return this.createDefaultAlertIfNotExist( SYNTHETICS_TLS_RULE, - `Synthetics internal TLS alert`, + `Synthetics internal TLS rule`, '1m' ); } @@ -115,14 +115,10 @@ export class DefaultAlertService { } updateStatusRule() { - return this.updateDefaultAlert( - SYNTHETICS_STATUS_RULE, - `Synthetics status internal alert`, - '1m' - ); + return this.updateDefaultAlert(SYNTHETICS_STATUS_RULE, `Synthetics status internal rule`, '1m'); } updateTlsRule() { - return this.updateDefaultAlert(SYNTHETICS_TLS_RULE, `Synthetics internal TLS alert`, '1m'); + return this.updateDefaultAlert(SYNTHETICS_TLS_RULE, `Synthetics internal TLS rule`, '1m'); } async updateDefaultAlert(ruleType: DefaultRuleType, name: string, interval: string) { diff --git a/x-pack/test/alerting_api_integration/observability/synthetics_rule.ts b/x-pack/test/alerting_api_integration/observability/synthetics_rule.ts index 328384e8a96d12..3e836987939b3e 100644 --- a/x-pack/test/alerting_api_integration/observability/synthetics_rule.ts +++ b/x-pack/test/alerting_api_integration/observability/synthetics_rule.ts @@ -136,7 +136,7 @@ const statusRule = { consumer: 'uptime', alertTypeId: 'xpack.synthetics.alerts.monitorStatus', tags: ['SYNTHETICS_DEFAULT_ALERT'], - name: 'Synthetics status internal alert', + name: 'Synthetics status internal rule', enabled: true, throttle: null, apiKeyOwner: 'elastic', @@ -344,7 +344,7 @@ const tlsRule = { consumer: 'uptime', alertTypeId: 'xpack.synthetics.alerts.tls', tags: ['SYNTHETICS_DEFAULT_ALERT'], - name: 'Synthetics internal TLS alert', + name: 'Synthetics internal TLS rule', enabled: true, throttle: null, apiKeyOwner: 'elastic', diff --git a/x-pack/test/api_integration/apis/synthetics/enable_default_alerting.ts b/x-pack/test/api_integration/apis/synthetics/enable_default_alerting.ts index 1d3ed0c6084dc0..2f3ffb9dcaaa28 100644 --- a/x-pack/test/api_integration/apis/synthetics/enable_default_alerting.ts +++ b/x-pack/test/api_integration/apis/synthetics/enable_default_alerting.ts @@ -105,7 +105,7 @@ const defaultAlertRules = { consumer: 'uptime', alertTypeId: 'xpack.synthetics.alerts.monitorStatus', tags: ['SYNTHETICS_DEFAULT_ALERT'], - name: 'Synthetics status internal alert', + name: 'Synthetics status internal rule', enabled: true, throttle: null, apiKeyOwner: 'elastic', @@ -137,7 +137,7 @@ const defaultAlertRules = { consumer: 'uptime', alertTypeId: 'xpack.synthetics.alerts.tls', tags: ['SYNTHETICS_DEFAULT_ALERT'], - name: 'Synthetics internal TLS alert', + name: 'Synthetics internal TLS rule', enabled: true, throttle: null, apiKeyOwner: 'elastic', From 4df7a5416ea0b7342f14104b97988a77d1d3bbb6 Mon Sep 17 00:00:00 2001 From: Cee Chen <549407+cee-chen@users.noreply.github.com> Date: Mon, 23 Oct 2023 08:33:26 -0700 Subject: [PATCH 12/68] [Security] Remove unnecessary `ghost` colors from `EuiBottomBar` (#169308) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## Summary 👋 Hey y'all - EUI will shortly be deprecating the `ghost` color in all button components (see https://eui.elastic.co/v89.0.0/#/navigation/button#ghost-vs-dark-mode). In this PR, all components using `color="ghost"` are being used within an `EuiBottomBar` and as such already automatically inherit dark mode coloring. I'm opening this PR ahead of time for your team so you can test this migration and ensure no UI regressions have occurred as a result. ### Checklist - [x] Tested in light and dark mode --- .../public/account_management/user_profile/user_profile.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/x-pack/plugins/security/public/account_management/user_profile/user_profile.tsx b/x-pack/plugins/security/public/account_management/user_profile/user_profile.tsx index 337938713bdacb..782a14700ad594 100644 --- a/x-pack/plugins/security/public/account_management/user_profile/user_profile.tsx +++ b/x-pack/plugins/security/public/account_management/user_profile/user_profile.tsx @@ -964,7 +964,7 @@ export const SaveChangesBottomBar: FunctionComponent = () => {
- + Date: Mon, 23 Oct 2023 08:35:03 -0700 Subject: [PATCH 13/68] [fleet] Remove unnecessary `ghost` colors from `EuiBottomBar` (#169310) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## Summary 👋 Hey y'all - EUI will shortly be deprecating the `ghost` color in all button components (see https://eui.elastic.co/v89.0.0/#/navigation/button#ghost-vs-dark-mode). In this PR, all components using `color="ghost"` are being used within an `EuiBottomBar` and as such already automatically inherit dark mode coloring. I'm opening this PR ahead of time for your team so you can test this migration and ensure no UI regressions have occurred as a result. ### Checklist - [x] Tested in light and dark mode --- .../multi_page_layout/components/bottom_bar.tsx | 8 ++++---- .../single_page_layout/index.tsx | 4 ++-- .../details_page/components/settings/index.tsx | 4 ++-- .../agent_policy/edit_package_policy_page/index.tsx | 4 ++-- 4 files changed, 10 insertions(+), 10 deletions(-) diff --git a/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/create_package_policy_page/multi_page_layout/components/bottom_bar.tsx b/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/create_package_policy_page/multi_page_layout/components/bottom_bar.tsx index 7fbd1c48c363d6..64d13e12b36d6c 100644 --- a/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/create_package_policy_page/multi_page_layout/components/bottom_bar.tsx +++ b/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/create_package_policy_page/multi_page_layout/components/bottom_bar.tsx @@ -55,7 +55,7 @@ export const CreatePackagePolicyBottomBar: React.FC<{ {/* eslint-disable-next-line @elastic/eui/href-or-on-click */} - + {cancelMessage || ( {/* eslint-disable-next-line @elastic/eui/href-or-on-click */} - + - + {/* eslint-disable-next-line @elastic/eui/href-or-on-click */} 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 eb77e63fd2c82b..b3559fb876e1ff 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 @@ -187,7 +187,7 @@ export const SettingsView = memo<{ agentPolicy: AgentPolicy }>( { setAgentPolicy({ ...originalAgentPolicy }); setHasChanges(false); @@ -204,7 +204,7 @@ export const SettingsView = memo<{ agentPolicy: AgentPolicy }>( 0} btnProps={{ - color: 'ghost', + color: 'text', }} description={i18n.translate( 'xpack.fleet.editAgentPolicy.devtoolsRequestDescription', diff --git a/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/edit_package_policy_page/index.tsx b/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/edit_package_policy_page/index.tsx index 433bb278a581df..e3b36999ed0b6d 100644 --- a/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/edit_package_policy_page/index.tsx +++ b/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/edit_package_policy_page/index.tsx @@ -439,7 +439,7 @@ export const EditPackagePolicyForm = memo<{ - + Date: Mon, 23 Oct 2023 17:38:22 +0200 Subject: [PATCH 14/68] [Index Management][Serverless] Remove primaries and replicas in indices list (#169259) ## Summary Fixes https://github.com/elastic/kibana/issues/165905 This PR hides the columns "primaries" and "replicas" in the indices list on Serverless. I decided to reuse the config value `xpack.index_management.enableIndexStats` because these values fall closely together with other hidden columns on Serverless like "health", "storage size" etc. I also removed the width css for the index name column in that case to fix the table view, otherwise the column would stay always the 25% width of the table. ### Screeenshots Screenshot 2023-10-18 at 16 00 19 ### How to test 1. Start ES and Kibana in Serverless mode with `yarn es serverless --ssl` and `yarn serverless-es --ssl` 2. Navigate to Index Management and toggle the switch to display hidden indices because those have data stream names. --------- Co-authored-by: kibanamachine <42973632+kibanamachine@users.noreply.github.com> --- .../home/indices_tab.test.ts | 10 +--------- .../index_list/index_table/index_table.js | 19 ++++++++++--------- .../index_management/public/index.scss | 2 +- 3 files changed, 12 insertions(+), 19 deletions(-) diff --git a/x-pack/plugins/index_management/__jest__/client_integration/home/indices_tab.test.ts b/x-pack/plugins/index_management/__jest__/client_integration/home/indices_tab.test.ts index 902ead4a3b1d67..27f697ac48b8be 100644 --- a/x-pack/plugins/index_management/__jest__/client_integration/home/indices_tab.test.ts +++ b/x-pack/plugins/index_management/__jest__/client_integration/home/indices_tab.test.ts @@ -12,19 +12,11 @@ import { setupEnvironment, nextTick } from '../helpers'; import { IndicesTestBed, setup } from './indices_tab.helpers'; import { createDataStreamPayload, createNonDataStreamIndex } from './data_streams_tab.helpers'; -/** - * The below import is required to avoid a console error warn from the "brace" package - * console.warn ../node_modules/brace/index.js:3999 - Could not load worker ReferenceError: Worker is not defined - at createWorker (//node_modules/brace/index.js:17992:5) - */ -import { stubWebWorker } from '@kbn/test-jest-helpers'; import { createMemoryHistory } from 'history'; import { breadcrumbService, IndexManagementBreadcrumb, } from '../../../public/application/services/breadcrumbs'; -stubWebWorker(); describe('', () => { let testBed: IndicesTestBed; @@ -399,7 +391,7 @@ describe('', () => { const { table } = testBed; const { tableCellsValues } = table.getMetaData('indexTable'); - expect(tableCellsValues).toEqual([['', 'test', '1', '1', '']]); + expect(tableCellsValues).toEqual([['', 'test', '']]); }); }); }); diff --git a/x-pack/plugins/index_management/public/application/sections/home/index_list/index_table/index_table.js b/x-pack/plugins/index_management/public/application/sections/home/index_list/index_table/index_table.js index f68f04a020ce21..991242edfa2ff9 100644 --- a/x-pack/plugins/index_management/public/application/sections/home/index_list/index_table/index_table.js +++ b/x-pack/plugins/index_management/public/application/sections/home/index_list/index_table/index_table.js @@ -65,17 +65,15 @@ const getHeaders = ({ showIndexStats }) => { headers.status = i18n.translate('xpack.idxMgmt.indexTable.headers.statusHeader', { defaultMessage: 'Status', }); - } - headers.primary = i18n.translate('xpack.idxMgmt.indexTable.headers.primaryHeader', { - defaultMessage: 'Primaries', - }); + headers.primary = i18n.translate('xpack.idxMgmt.indexTable.headers.primaryHeader', { + defaultMessage: 'Primaries', + }); - headers.replica = i18n.translate('xpack.idxMgmt.indexTable.headers.replicaHeader', { - defaultMessage: 'Replicas', - }); + headers.replica = i18n.translate('xpack.idxMgmt.indexTable.headers.replicaHeader', { + defaultMessage: 'Replicas', + }); - if (showIndexStats) { headers.documents = i18n.translate('xpack.idxMgmt.indexTable.headers.documentsHeader', { defaultMessage: 'Docs count', }); @@ -265,13 +263,16 @@ export class IndexTable extends Component { const headers = getHeaders({ showIndexStats: config.enableIndexStats }); return Object.entries(headers).map(([fieldName, label]) => { const isSorted = sortField === fieldName; + // we only want to make index name column 25% width when there are more columns displayed + const widthClassName = + fieldName === 'name' && config.enableIndexStats ? 'indTable__header__width' : ''; return ( this.onSort(fieldName)} isSorted={isSorted} isSortAscending={isSortAscending} - className={'indTable__header--' + fieldName} + className={widthClassName} data-test-subj={`indexTableHeaderCell-${fieldName}`} > {label} diff --git a/x-pack/plugins/index_management/public/index.scss b/x-pack/plugins/index_management/public/index.scss index 9d634beb5bbb5e..a8952764cc39be 100644 --- a/x-pack/plugins/index_management/public/index.scss +++ b/x-pack/plugins/index_management/public/index.scss @@ -11,7 +11,7 @@ .indTable { // The index table is a bespoke table and can't make use of EuiBasicTable's width settings - thead th.indTable__header--name { // stylelint-disable-line selector-no-qualifying-type + thead th.indTable__header__width { // stylelint-disable-line selector-no-qualifying-type width: 25%; } From 04dc08ed413e499d82448e1b3e67a672e9d4b62d Mon Sep 17 00:00:00 2001 From: Enrico Zimuel Date: Mon, 23 Oct 2023 17:41:39 +0200 Subject: [PATCH 15/68] [Serverless search] Fixed the PHP get started page (#169489) As titled. Note: I found a way to install, using composer, all the alpha versions without the need to update the doc when a version is released, as follows: ``` composer require elastic/elasticsearch-serverless:*@alpha ``` --- .../public/application/components/languages/php.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/x-pack/plugins/serverless_search/public/application/components/languages/php.ts b/x-pack/plugins/serverless_search/public/application/components/languages/php.ts index 4bf4cca2923399..0a7dbe5758dd99 100644 --- a/x-pack/plugins/serverless_search/public/application/components/languages/php.ts +++ b/x-pack/plugins/serverless_search/public/application/components/languages/php.ts @@ -17,7 +17,7 @@ export const phpDefinition: LanguageDefinition = { $response = $client->search(index: "books", params: $params); print_r($response['hits']['hits']); # list of books`, configureClient: ({ url, apiKey }) => `$client = ClientBuilder::create() - ->setHosts(['${url}']) + ->setEndpoint('${url}') ->setApiKey('${apiKey}') ->build();`, docLink: docLinks.phpClient, @@ -61,7 +61,7 @@ $response = $client->bulk(body: $body); echo $response->getStatusCode(); echo (string) $response->getBody(); `, - installClient: 'composer require elastic/elasticsearch-serverless:0.1.0-alpha1', + installClient: 'composer require elastic/elasticsearch-serverless:*@alpha', name: i18n.translate('xpack.serverlessSearch.languages.php', { defaultMessage: 'PHP', }), From 27bea1cf3859e43eceb2c1e2ad6725957c0f710e Mon Sep 17 00:00:00 2001 From: Philippe Oberti Date: Mon, 23 Oct 2023 10:53:14 -0500 Subject: [PATCH 16/68] [Security Solution] cut off rule description text if too long (#169035) --- .../right/components/description.tsx | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/x-pack/plugins/security_solution/public/flyout/document_details/right/components/description.tsx b/x-pack/plugins/security_solution/public/flyout/document_details/right/components/description.tsx index 442af047127420..105d57ba4e7f6c 100644 --- a/x-pack/plugins/security_solution/public/flyout/document_details/right/components/description.tsx +++ b/x-pack/plugins/security_solution/public/flyout/document_details/right/components/description.tsx @@ -9,6 +9,7 @@ import { EuiButtonEmpty, EuiFlexGroup, EuiFlexItem, EuiTitle } from '@elastic/eu import type { FC } from 'react'; import React, { useMemo, useCallback } from 'react'; import { isEmpty } from 'lodash'; +import { css } from '@emotion/react'; import { useExpandableFlyoutContext } from '@kbn/expandable-flyout'; import { FormattedMessage } from '@kbn/i18n-react'; import { i18n } from '@kbn/i18n'; @@ -119,7 +120,17 @@ export const Description: FC = () => { - {isAlert ? alertRuleDescription : '-'} +

+ {isAlert ? alertRuleDescription : '-'} +

); From 91c8506eceeddf1a12ec1fa997aa2557f14fd611 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alejandro=20Fern=C3=A1ndez=20Haro?= Date: Mon, 23 Oct 2023 17:55:53 +0200 Subject: [PATCH 17/68] [LaunchDarkly] Add renovate (#169516) --- renovate.json | 23 ++++++++++++++++++++++- 1 file changed, 22 insertions(+), 1 deletion(-) diff --git a/renovate.json b/renovate.json index 7f33984498ed7a..e4c1e0672c7829 100644 --- a/renovate.json +++ b/renovate.json @@ -118,6 +118,27 @@ ], "enabled": true }, + { + "groupName": "LaunchDarkly", + "matchPackageNames": [ + "launchdarkly-js-client-sdk", + "launchdarkly-node-server-sdk" + ], + "reviewers": [ + "team:kibana-security", + "team:kibana-core" + ], + "matchBaseBranches": [ + "main" + ], + "labels": [ + "release_note:skip", + "Team:Security", + "Team:Core", + "backport:prev-minor" + ], + "enabled": true + }, { "groupName": "APM", "matchPackageNames": [ @@ -626,4 +647,4 @@ "enabled": true } ] -} \ No newline at end of file +} From 3f908ea0be49b39830fd061c12604cf6a5a0ca4b Mon Sep 17 00:00:00 2001 From: Tiago Costa Date: Mon, 23 Oct 2023 17:04:56 +0100 Subject: [PATCH 18/68] skip flaky suite (#169406) --- .../components/rules_setting/rules_settings_modal.test.tsx | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/x-pack/plugins/triggers_actions_ui/public/application/components/rules_setting/rules_settings_modal.test.tsx b/x-pack/plugins/triggers_actions_ui/public/application/components/rules_setting/rules_settings_modal.test.tsx index 54de45d909beb9..c91c6fc654ece0 100644 --- a/x-pack/plugins/triggers_actions_ui/public/application/components/rules_setting/rules_settings_modal.test.tsx +++ b/x-pack/plugins/triggers_actions_ui/public/application/components/rules_setting/rules_settings_modal.test.tsx @@ -94,7 +94,8 @@ const RulesSettingsModalWithProviders: React.FunctionComponent ); -describe('rules_settings_modal', () => { +// FLAKY: https://github.com/elastic/kibana/issues/169406 +describe.skip('rules_settings_modal', () => { beforeEach(async () => { const [ { From 264476bf1c556133b340264e490fe7bfc8b1e62a Mon Sep 17 00:00:00 2001 From: Tiago Costa Date: Mon, 23 Oct 2023 17:11:38 +0100 Subject: [PATCH 19/68] skip flaky suite (#169495) --- .../apm_api_integration/tests/alerts/anomaly_alert.spec.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/x-pack/test/apm_api_integration/tests/alerts/anomaly_alert.spec.ts b/x-pack/test/apm_api_integration/tests/alerts/anomaly_alert.spec.ts index 3475888a5407ea..e4f124cc92f869 100644 --- a/x-pack/test/apm_api_integration/tests/alerts/anomaly_alert.spec.ts +++ b/x-pack/test/apm_api_integration/tests/alerts/anomaly_alert.spec.ts @@ -82,7 +82,8 @@ export default function ApiTest({ getService }: FtrProviderContext) { } } - describe('with ml jobs', () => { + // FLAKY: https://github.com/elastic/kibana/issues/169495 + describe.skip('with ml jobs', () => { it('checks if alert is active', async () => { const createdRule = await createApmRule({ supertest, From 96b1829a446fa836b0275647dfb3fff3f5910d08 Mon Sep 17 00:00:00 2001 From: Cee Chen <549407+cee-chen@users.noreply.github.com> Date: Mon, 23 Oct 2023 09:39:01 -0700 Subject: [PATCH 20/68] [Security Solution] `color="ghost"` button cleanup (#169304) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## Summary 👋 Hey y'all - EUI will shortly be deprecating the `ghost` color in all button components (see https://eui.elastic.co/v89.0.0/#/navigation/button#ghost-vs-dark-mode). I'm opening this PR ahead of time for your team so you can test this migration and ensure no regressions have occurred as a result. ### Screenshots non-fullscreen mode fullscreen mode dark mode ### Checklist - [x] This renders correctly on smaller devices using a responsive layout. (You can test this [in your browser](https://www.browserstack.com/guide/responsive-testing-on-local-server)) - [x] This was checked for [cross-browser compatibility](https://www.elastic.co/support/matrix#matrix_browsers) --- x-pack/plugins/security_solution/common/constants.ts | 1 - .../common/components/header_actions/header_actions.tsx | 5 ++--- .../public/common/components/page/index.tsx | 7 ------- .../timeline/session_tab_content/use_session_view.tsx | 9 +++------ 4 files changed, 5 insertions(+), 17 deletions(-) diff --git a/x-pack/plugins/security_solution/common/constants.ts b/x-pack/plugins/security_solution/common/constants.ts index 30f84dfa04b522..f6f406692e50db 100644 --- a/x-pack/plugins/security_solution/common/constants.ts +++ b/x-pack/plugins/security_solution/common/constants.ts @@ -60,7 +60,6 @@ export const DEFAULT_INTERVAL_TYPE = 'manual' as const; export const DEFAULT_INTERVAL_VALUE = 300000 as const; // ms export const DEFAULT_TIMEPICKER_QUICK_RANGES = 'timepicker:quickRanges' as const; export const SCROLLING_DISABLED_CLASS_NAME = 'scrolling-disabled' as const; -export const FULL_SCREEN_TOGGLED_CLASS_NAME = 'fullScreenToggled' as const; export const NO_ALERT_INDEX = 'no-alert-index-049FC71A-4C2C-446F-9901-37XMC5024C51' as const; export const ENDPOINT_METADATA_INDEX = 'metrics-endpoint.metadata-*' as const; export const ENDPOINT_METRICS_INDEX = '.ds-metrics-endpoint.metrics-*' as const; diff --git a/x-pack/plugins/security_solution/public/common/components/header_actions/header_actions.tsx b/x-pack/plugins/security_solution/public/common/components/header_actions/header_actions.tsx index 8446e09d228271..231ed8f8b4e666 100644 --- a/x-pack/plugins/security_solution/public/common/components/header_actions/header_actions.tsx +++ b/x-pack/plugins/security_solution/public/common/components/header_actions/header_actions.tsx @@ -24,7 +24,6 @@ import { DEFAULT_ACTION_BUTTON_WIDTH } from '.'; import { EventsTh, EventsThContent } from '../../../timelines/components/timeline/styles'; import { StatefulRowRenderersBrowser } from '../../../timelines/components/row_renderers_browser'; import { EXIT_FULL_SCREEN } from '../exit_full_screen/translations'; -import { FULL_SCREEN_TOGGLED_CLASS_NAME } from '../../../../common/constants'; import { EventsSelect } from '../../../timelines/components/timeline/body/column_headers/events_select'; import * as i18n from './translations'; @@ -243,8 +242,8 @@ const HeaderActionsComponent: React.FC = ({ ? EXIT_FULL_SCREEN : i18n.FULL_SCREEN } - className={fullScreen ? FULL_SCREEN_TOGGLED_CLASS_NAME : ''} - color={fullScreen ? 'ghost' : 'primary'} + display={fullScreen ? 'fill' : 'empty'} + color="primary" data-test-subj={ // a full screen button gets created for timeline and for the host page // this sets the data-test-subj for each case so that tests can differentiate between them diff --git a/x-pack/plugins/security_solution/public/common/components/page/index.tsx b/x-pack/plugins/security_solution/public/common/components/page/index.tsx index 3ad806beea3a41..dd0af06904ef90 100644 --- a/x-pack/plugins/security_solution/public/common/components/page/index.tsx +++ b/x-pack/plugins/security_solution/public/common/components/page/index.tsx @@ -8,8 +8,6 @@ import { EuiBadge, EuiDescriptionList, EuiFlexGroup, EuiIcon } from '@elastic/eui'; import styled, { createGlobalStyle, css } from 'styled-components'; -import { FULL_SCREEN_TOGGLED_CLASS_NAME } from '../../../../common/constants'; - export const SecuritySolutionAppWrapper = styled.div` display: flex; flex-direction: column; @@ -89,11 +87,6 @@ export const AppGlobalStyle = createGlobalStyle<{ } } - /* applies a "toggled" button style to the Full Screen button */ - .${FULL_SCREEN_TOGGLED_CLASS_NAME} { - ${({ theme }) => `background-color: ${theme.eui.euiColorPrimary} !important`}; - } - /* EuiScreenReaderOnly has a default 1px height and width. These extra pixels were adding additional height to every table row in the alerts table on the diff --git a/x-pack/plugins/security_solution/public/timelines/components/timeline/session_tab_content/use_session_view.tsx b/x-pack/plugins/security_solution/public/timelines/components/timeline/session_tab_content/use_session_view.tsx index e16ac4ee9b7fdd..d4459f8de4a9a7 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/timeline/session_tab_content/use_session_view.tsx +++ b/x-pack/plugins/security_solution/public/timelines/components/timeline/session_tab_content/use_session_view.tsx @@ -24,10 +24,7 @@ import { TimelineTabs } from '../../../../../common/types/timeline'; import { useDetailPanel } from '../../side_panel/hooks/use_detail_panel'; import { SourcererScopeName } from '../../../../common/store/sourcerer/model'; import { isFullScreen } from '../body/column_headers'; -import { - SCROLLING_DISABLED_CLASS_NAME, - FULL_SCREEN_TOGGLED_CLASS_NAME, -} from '../../../../../common/constants'; +import { SCROLLING_DISABLED_CLASS_NAME } from '../../../../../common/constants'; import { FULL_SCREEN } from '../body/column_headers/translations'; import { EXIT_FULL_SCREEN } from '../../../../common/components/exit_full_screen/translations'; import { @@ -97,8 +94,8 @@ const NavigationComponent: React.FC = ({ ? EXIT_FULL_SCREEN : FULL_SCREEN } - className={fullScreen ? FULL_SCREEN_TOGGLED_CLASS_NAME : ''} - color={fullScreen ? 'ghost' : 'primary'} + display={fullScreen ? 'fill' : 'empty'} + color="primary" data-test-subj="full-screen" iconType="fullScreen" onClick={toggleFullScreen} From 3587c20835765ad24c131182173b0f9dccfb0c37 Mon Sep 17 00:00:00 2001 From: Christos Nasikas Date: Mon, 23 Oct 2023 19:41:23 +0300 Subject: [PATCH 21/68] [Actions] Sub actions framework: Get `Service` instance with a function (#169484) --- .../server/sub_action_framework/README.md | 4 ++-- .../sub_action_framework/executor.test.ts | 5 +++-- .../server/sub_action_framework/executor.ts | 2 +- .../sub_action_framework/register.test.ts | 4 +++- .../server/sub_action_framework/register.ts | 17 +---------------- .../server/sub_action_framework/types.ts | 2 +- .../sub_action_framework/validators.test.ts | 8 +++++--- .../server/connector_types/bedrock/index.ts | 2 +- .../server/connector_types/d3security/index.ts | 2 +- .../server/connector_types/openai/index.ts | 2 +- .../server/connector_types/opsgenie/index.ts | 2 +- .../server/connector_types/sentinelone/index.ts | 2 +- .../server/connector_types/tines/index.ts | 2 +- .../alerts/server/sub_action_connector.ts | 5 +++-- 14 files changed, 25 insertions(+), 34 deletions(-) diff --git a/x-pack/plugins/actions/server/sub_action_framework/README.md b/x-pack/plugins/actions/server/sub_action_framework/README.md index 4aa74f6e8362e7..28ff2e0e358fc0 100644 --- a/x-pack/plugins/actions/server/sub_action_framework/README.md +++ b/x-pack/plugins/actions/server/sub_action_framework/README.md @@ -350,7 +350,7 @@ plugins.actions.registerSubActionConnectorType({ name: 'Test: Sub action connector', minimumLicenseRequired: 'platinum' as const, schema: { config: TestConfigSchema, secrets: TestSecretsSchema }, - Service: TestSubActionConnector, + getService: (params) => new TestSubActionConnector(params), renderParameterTemplates: renderTestTemplate }); ``` @@ -368,6 +368,6 @@ plugins.actions.registerSubActionConnectorType({ minimumLicenseRequired: 'platinum' as const, schema: { config: TestConfigSchema, secrets: TestSecretsSchema }, validators: [{type: ValidatorType.CONFIG, validate: urlAllowListValidator('url')}] - Service: TestSubActionConnector, + getService: (params) => new TestSubActionConnector(params), }); ``` diff --git a/x-pack/plugins/actions/server/sub_action_framework/executor.test.ts b/x-pack/plugins/actions/server/sub_action_framework/executor.test.ts index 92467f049ae3ff..1280c70d0cd848 100644 --- a/x-pack/plugins/actions/server/sub_action_framework/executor.test.ts +++ b/x-pack/plugins/actions/server/sub_action_framework/executor.test.ts @@ -19,7 +19,7 @@ import { TestSecrets, TestExecutor, } from './mocks'; -import { IService } from './types'; +import { IService, ServiceParams } from './types'; describe('Executor', () => { const actionId = 'test-action-id'; @@ -40,7 +40,8 @@ describe('Executor', () => { config: TestConfigSchema, secrets: TestSecretsSchema, }, - Service, + getService: (serviceParams: ServiceParams) => + new Service(serviceParams), }; return buildExecutor({ configurationUtilities: mockedActionsConfig, logger, connector }); diff --git a/x-pack/plugins/actions/server/sub_action_framework/executor.ts b/x-pack/plugins/actions/server/sub_action_framework/executor.ts index 12368a834ea7e7..9ac7a63dc2e96a 100644 --- a/x-pack/plugins/actions/server/sub_action_framework/executor.ts +++ b/x-pack/plugins/actions/server/sub_action_framework/executor.ts @@ -33,7 +33,7 @@ export const buildExecutor = < const subAction = params.subAction; const subActionParams = params.subActionParams; - const service = new connector.Service({ + const service = connector.getService({ connector: { id: actionId, type: connector.id }, config, secrets, diff --git a/x-pack/plugins/actions/server/sub_action_framework/register.test.ts b/x-pack/plugins/actions/server/sub_action_framework/register.test.ts index 6788ca6e5e6fbe..df454a0f0020bd 100644 --- a/x-pack/plugins/actions/server/sub_action_framework/register.test.ts +++ b/x-pack/plugins/actions/server/sub_action_framework/register.test.ts @@ -16,6 +16,7 @@ import { TestSubActionConnector, } from './mocks'; import { register } from './register'; +import { ServiceParams } from './types'; describe('Registration', () => { const renderedVariables = { body: '' }; @@ -30,7 +31,8 @@ describe('Registration', () => { config: TestConfigSchema, secrets: TestSecretsSchema, }, - Service: TestSubActionConnector, + getService: (serviceParams: ServiceParams) => + new TestSubActionConnector(serviceParams), renderParameterTemplates: mockRenderParameterTemplates, }; diff --git a/x-pack/plugins/actions/server/sub_action_framework/register.ts b/x-pack/plugins/actions/server/sub_action_framework/register.ts index 9d5bd91a88866f..80331648244aee 100644 --- a/x-pack/plugins/actions/server/sub_action_framework/register.ts +++ b/x-pack/plugins/actions/server/sub_action_framework/register.ts @@ -9,24 +9,11 @@ import { PublicMethodsOf } from '@kbn/utility-types'; import { Logger } from '@kbn/core/server'; import { ActionsConfigurationUtilities } from '../actions_config'; import { ActionTypeRegistry } from '../action_type_registry'; -import { SubActionConnector } from './sub_action_connector'; -import { CaseConnector } from './case'; import { ActionTypeConfig, ActionTypeSecrets } from '../types'; import { buildExecutor } from './executor'; -import { ExecutorParams, SubActionConnectorType, IService } from './types'; +import { ExecutorParams, SubActionConnectorType } from './types'; import { buildValidators } from './validators'; -const validateService = (Service: IService) => { - if ( - !(Service.prototype instanceof CaseConnector) && - !(Service.prototype instanceof SubActionConnector) - ) { - throw new Error( - 'Service must be extend one of the abstract classes: SubActionConnector or CaseConnector' - ); - } -}; - export const register = ({ actionTypeRegistry, connector, @@ -38,8 +25,6 @@ export const register = ; logger: Logger; }) => { - validateService(connector.Service); - const validators = buildValidators({ connector, configurationUtilities }); const executor = buildExecutor({ connector, diff --git a/x-pack/plugins/actions/server/sub_action_framework/types.ts b/x-pack/plugins/actions/server/sub_action_framework/types.ts index 26b1fd20020d28..2f5ae6bad769b5 100644 --- a/x-pack/plugins/actions/server/sub_action_framework/types.ts +++ b/x-pack/plugins/actions/server/sub_action_framework/types.ts @@ -79,7 +79,7 @@ export interface SubActionConnectorType { secrets: Type; }; validators?: Array | SecretsValidator>; - Service: IService; + getService: (params: ServiceParams) => SubActionConnector; renderParameterTemplates?: RenderParameterTemplates; } diff --git a/x-pack/plugins/actions/server/sub_action_framework/validators.test.ts b/x-pack/plugins/actions/server/sub_action_framework/validators.test.ts index b28adc0b545bf2..244873c657431f 100644 --- a/x-pack/plugins/actions/server/sub_action_framework/validators.test.ts +++ b/x-pack/plugins/actions/server/sub_action_framework/validators.test.ts @@ -14,7 +14,7 @@ import { TestSecrets, TestSubActionConnector, } from './mocks'; -import { IService, SubActionConnectorType, ValidatorType } from './types'; +import { IService, ServiceParams, SubActionConnectorType, ValidatorType } from './types'; import { buildValidators } from './validators'; describe('Validators', () => { @@ -30,7 +30,8 @@ describe('Validators', () => { config: TestConfigSchema, secrets: TestSecretsSchema, }, - Service, + getService: (serviceParams: ServiceParams) => + new Service(serviceParams), }; return buildValidators({ configurationUtilities: mockedActionsConfig, connector }); @@ -59,7 +60,8 @@ describe('Validators', () => { validator: secretsValidator, }, ], - Service, + getService: (serviceParams: ServiceParams) => + new Service(serviceParams), }; return { diff --git a/x-pack/plugins/stack_connectors/server/connector_types/bedrock/index.ts b/x-pack/plugins/stack_connectors/server/connector_types/bedrock/index.ts index 02b2bff9a93ae2..e9ab583277282d 100644 --- a/x-pack/plugins/stack_connectors/server/connector_types/bedrock/index.ts +++ b/x-pack/plugins/stack_connectors/server/connector_types/bedrock/index.ts @@ -23,7 +23,7 @@ import { renderParameterTemplates } from './render'; export const getConnectorType = (): SubActionConnectorType => ({ id: BEDROCK_CONNECTOR_ID, name: BEDROCK_TITLE, - Service: BedrockConnector, + getService: (params) => new BedrockConnector(params), schema: { config: ConfigSchema, secrets: SecretsSchema, diff --git a/x-pack/plugins/stack_connectors/server/connector_types/d3security/index.ts b/x-pack/plugins/stack_connectors/server/connector_types/d3security/index.ts index d3fb6f0d326adc..4e989383358085 100644 --- a/x-pack/plugins/stack_connectors/server/connector_types/d3security/index.ts +++ b/x-pack/plugins/stack_connectors/server/connector_types/d3security/index.ts @@ -26,7 +26,7 @@ export function getConnectorType(): D3SecurityConnectorType { id: D3_SECURITY_CONNECTOR_ID, minimumLicenseRequired: 'gold', name: D3_SECURITY_TITLE, - Service: D3SecurityConnector, + getService: (params) => new D3SecurityConnector(params), supportedFeatureIds: [AlertingConnectorFeatureId, SecurityConnectorFeatureId], schema: { config: D3SecurityConfigSchema, diff --git a/x-pack/plugins/stack_connectors/server/connector_types/openai/index.ts b/x-pack/plugins/stack_connectors/server/connector_types/openai/index.ts index fb6a27b17bad51..9184b14b4f9c75 100644 --- a/x-pack/plugins/stack_connectors/server/connector_types/openai/index.ts +++ b/x-pack/plugins/stack_connectors/server/connector_types/openai/index.ts @@ -27,7 +27,7 @@ import { renderParameterTemplates } from './render'; export const getConnectorType = (): SubActionConnectorType => ({ id: OPENAI_CONNECTOR_ID, name: OPENAI_TITLE, - Service: OpenAIConnector, + getService: (params) => new OpenAIConnector(params), schema: { config: ConfigSchema, secrets: SecretsSchema, diff --git a/x-pack/plugins/stack_connectors/server/connector_types/opsgenie/index.ts b/x-pack/plugins/stack_connectors/server/connector_types/opsgenie/index.ts index 2f7a5d6b39680d..7e92a3b7f33320 100644 --- a/x-pack/plugins/stack_connectors/server/connector_types/opsgenie/index.ts +++ b/x-pack/plugins/stack_connectors/server/connector_types/opsgenie/index.ts @@ -24,7 +24,7 @@ import { renderParameterTemplates } from './render_template_variables'; export const getOpsgenieConnectorType = (): SubActionConnectorType => { return { - Service: OpsgenieConnector, + getService: (params) => new OpsgenieConnector(params), minimumLicenseRequired: 'platinum', name: i18n.OPSGENIE_NAME, id: OpsgenieConnectorTypeId, diff --git a/x-pack/plugins/stack_connectors/server/connector_types/sentinelone/index.ts b/x-pack/plugins/stack_connectors/server/connector_types/sentinelone/index.ts index 1ce534079e8294..849d54e276e110 100644 --- a/x-pack/plugins/stack_connectors/server/connector_types/sentinelone/index.ts +++ b/x-pack/plugins/stack_connectors/server/connector_types/sentinelone/index.ts @@ -26,7 +26,7 @@ export const getSentinelOneConnectorType = (): SubActionConnectorType< > => ({ id: SENTINELONE_CONNECTOR_ID, name: SENTINELONE_TITLE, - Service: SentinelOneConnector, + getService: (params) => new SentinelOneConnector(params), schema: { config: SentinelOneConfigSchema, secrets: SentinelOneSecretsSchema, diff --git a/x-pack/plugins/stack_connectors/server/connector_types/tines/index.ts b/x-pack/plugins/stack_connectors/server/connector_types/tines/index.ts index ba04fed6df58a5..1f0a4560c47b04 100644 --- a/x-pack/plugins/stack_connectors/server/connector_types/tines/index.ts +++ b/x-pack/plugins/stack_connectors/server/connector_types/tines/index.ts @@ -20,7 +20,7 @@ import { renderParameterTemplates } from './render'; export const getTinesConnectorType = (): SubActionConnectorType => ({ id: TINES_CONNECTOR_ID, name: TINES_TITLE, - Service: TinesConnector, + getService: (params) => new TinesConnector(params), schema: { config: TinesConfigSchema, secrets: TinesSecretsSchema, diff --git a/x-pack/test/alerting_api_integration/common/plugins/alerts/server/sub_action_connector.ts b/x-pack/test/alerting_api_integration/common/plugins/alerts/server/sub_action_connector.ts index daf2be6dd40eb0..7bd9db83dcc00d 100644 --- a/x-pack/test/alerting_api_integration/common/plugins/alerts/server/sub_action_connector.ts +++ b/x-pack/test/alerting_api_integration/common/plugins/alerts/server/sub_action_connector.ts @@ -79,13 +79,14 @@ export const getTestSubActionConnector = ( public async noData() {} } + return { id: 'test.sub-action-connector', name: 'Test: Sub action connector', minimumLicenseRequired: 'platinum' as const, supportedFeatureIds: ['alerting'], schema: { config: TestConfigSchema, secrets: TestSecretsSchema }, - Service: TestSubActionConnector, + getService: (params) => new TestSubActionConnector(params), }; }; @@ -106,6 +107,6 @@ export const getTestSubActionConnectorWithoutSubActions = ( minimumLicenseRequired: 'platinum' as const, supportedFeatureIds: ['alerting'], schema: { config: TestConfigSchema, secrets: TestSecretsSchema }, - Service: TestNoSubActions, + getService: (params) => new TestNoSubActions(params), }; }; From adf3b8b43606f9b361c94f8436c238d53cacfa7a Mon Sep 17 00:00:00 2001 From: Nathan Reese Date: Mon, 23 Oct 2023 10:59:17 -0600 Subject: [PATCH 22/68] [search source] return rawResponse on search failure (#168389) Closes https://github.com/elastic/kibana/issues/167099 #### Problem `/bsearch` and `/search` APIs only return `error` key from elasticsearch error response. This is problematic because Inspector needs `rawResponse` to populate "Clusters and shards" While working on this issue, I discovered another problem with how error responses are added to inspector requestResponder. The `Error` instance is added as `json` key. This is a little awkward since the response tab just stringifies the contents of `json`, thus stringifing the Error object instead of just the error body returned from API. This PR address this problem by setting `json` to either `attributes` or `{ message }`. #### Solution PR updates `/bsearch` and `/search` APIs to return `{ attributes: { error: ErrorCause, rawResponse }}` for failed responses. Solution avoided changing KbnServerError and reportServerError since these methods are used extensivly throughout Kibana (see https://github.com/elastic/kibana/pull/167544#discussion_r1342460941 for more details). Instead, KbnSearchError and reportSearchError are created to report search error messages. #### Test 1) install web logs sample data set 2) open discover 3) add filter ``` { "error_query": { "indices": [ { "error_type": "exception", "message": "local shard failure message 123", "name": "kibana_sample_data_logs", "shard_ids": [ 0 ] } ] } } ``` 4) Open inspector. Verify "Clusters and shards" tab is visible and populated. Verify "Response" tab shows "error" and "rawResponse" keys. Screenshot 2023-10-09 at 9 29 16 AM Screenshot 2023-10-09 at 9 29 06 AM --------- Co-authored-by: kibanamachine <42973632+kibanamachine@users.noreply.github.com> Co-authored-by: Gloria Hornero --- .../data/common/search/expressions/eql.ts | 2 +- .../data/common/search/expressions/esdsl.ts | 2 +- .../data/common/search/expressions/esql.ts | 4 +- .../data/common/search/expressions/essql.ts | 4 +- .../search/search_source/search_source.ts | 4 +- src/plugins/data/public/index.ts | 1 - .../public/search/errors/es_error.test.tsx | 27 +-- .../data/public/search/errors/es_error.tsx | 20 +- .../search/errors/painless_error.test.tsx | 6 +- .../public/search/errors/painless_error.tsx | 4 +- .../data/public/search/errors/types.ts | 34 +--- .../data/public/search/errors/utils.ts | 29 ++- .../search_interceptor.test.ts | 17 +- .../search_interceptor/search_interceptor.ts | 18 +- .../data/server/search/report_search_error.ts | 60 ++++++ .../data/server/search/routes/bsearch.ts | 7 +- .../data/server/search/routes/search.test.ts | 16 +- .../data/server/search/routes/search.ts | 3 +- .../es_search/es_search_strategy.test.ts | 12 +- .../es_search/es_search_strategy.ts | 8 +- .../ese_search/ese_search_strategy.test.ts | 9 +- .../ese_search/ese_search_strategy.ts | 11 +- .../esql_search/esql_search_strategy.ts | 8 +- .../sql_search/sql_search_strategy.test.ts | 10 +- .../sql_search/sql_search_strategy.ts | 5 +- .../apis/search/verify_error.ts | 3 +- .../editor_frame_service/error_helper.test.ts | 191 ++++++++++-------- .../editor_frame_service/error_helper.tsx | 22 +- .../common/hooks/use_app_toasts.test.ts | 12 +- .../public/common/hooks/use_app_toasts.ts | 6 +- .../timelines/public/hooks/use_app_toasts.ts | 6 +- .../api_integration/apis/search/search.ts | 6 +- .../common/search_oss/verify_error.ts | 3 +- .../test_suites/common/search_xpack/search.ts | 5 +- 34 files changed, 333 insertions(+), 242 deletions(-) create mode 100644 src/plugins/data/server/search/report_search_error.ts diff --git a/src/plugins/data/common/search/expressions/eql.ts b/src/plugins/data/common/search/expressions/eql.ts index f82f443ea00b9a..7caaa0c090466a 100644 --- a/src/plugins/data/common/search/expressions/eql.ts +++ b/src/plugins/data/common/search/expressions/eql.ts @@ -166,7 +166,7 @@ export const getEqlFn = ({ body: response.rawResponse, }; } catch (e) { - request.error({ json: e }); + request.error({ json: 'attributes' in e ? e.attributes : { message: e.message } }); throw e; } }, diff --git a/src/plugins/data/common/search/expressions/esdsl.ts b/src/plugins/data/common/search/expressions/esdsl.ts index 34a67223b4be59..a18e1e32400500 100644 --- a/src/plugins/data/common/search/expressions/esdsl.ts +++ b/src/plugins/data/common/search/expressions/esdsl.ts @@ -188,7 +188,7 @@ export const getEsdslFn = ({ body: rawResponse, }; } catch (e) { - request.error({ json: e }); + request.error({ json: 'attributes' in e ? e.attributes : { message: e.message } }); throw e; } }, diff --git a/src/plugins/data/common/search/expressions/esql.ts b/src/plugins/data/common/search/expressions/esql.ts index ba6600ba0039ee..30bf10a0f1bb7c 100644 --- a/src/plugins/data/common/search/expressions/esql.ts +++ b/src/plugins/data/common/search/expressions/esql.ts @@ -227,7 +227,9 @@ export const getEsqlFn = ({ getStartDependencies }: EsqlFnArguments) => { .ok({ json: rawResponse }); }, error(error) { - logInspectorRequest().error({ json: error }); + logInspectorRequest().error({ + json: 'attributes' in error ? error.attributes : { message: error.message }, + }); }, }) ); diff --git a/src/plugins/data/common/search/expressions/essql.ts b/src/plugins/data/common/search/expressions/essql.ts index a5db4674a7d145..d943b406ff7f5c 100644 --- a/src/plugins/data/common/search/expressions/essql.ts +++ b/src/plugins/data/common/search/expressions/essql.ts @@ -248,7 +248,9 @@ export const getEssqlFn = ({ getStartDependencies }: EssqlFnArguments) => { .ok({ json: rawResponse }); }, error(error) { - logInspectorRequest().error({ json: error }); + logInspectorRequest().error({ + json: 'attributes' in error ? error.attributes : { message: error.message }, + }); }, }) ); diff --git a/src/plugins/data/common/search/search_source/search_source.ts b/src/plugins/data/common/search/search_source/search_source.ts index b42cb7fdf4f250..4e5782a7468dd0 100644 --- a/src/plugins/data/common/search/search_source/search_source.ts +++ b/src/plugins/data/common/search/search_source/search_source.ts @@ -458,7 +458,9 @@ export class SearchSource { const last$ = s$ .pipe( catchError((e) => { - requestResponder?.error({ json: e }); + requestResponder?.error({ + json: 'attributes' in e ? e.attributes : { message: e.message }, + }); return EMPTY; }), last(undefined, null), diff --git a/src/plugins/data/public/index.ts b/src/plugins/data/public/index.ts index bf1e8c74a3d00f..a851e28f60829f 100644 --- a/src/plugins/data/public/index.ts +++ b/src/plugins/data/public/index.ts @@ -167,7 +167,6 @@ export type { SerializedSearchSourceFields, // errors IEsError, - Reason, WaitUntilNextSessionCompletesOptions, } from './search'; diff --git a/src/plugins/data/public/search/errors/es_error.test.tsx b/src/plugins/data/public/search/errors/es_error.test.tsx index 4d1bc8b03b8f22..1b7f57d24d4f96 100644 --- a/src/plugins/data/public/search/errors/es_error.test.tsx +++ b/src/plugins/data/public/search/errors/es_error.test.tsx @@ -7,6 +7,7 @@ */ import { EsError } from './es_error'; +import { IEsError } from './types'; describe('EsError', () => { it('contains the same body as the wrapped error', () => { @@ -19,7 +20,7 @@ describe('EsError', () => { reason: 'top-level reason', }, }, - } as any; + } as IEsError; const esError = new EsError(error); expect(typeof esError.attributes).toEqual('object'); @@ -33,20 +34,22 @@ describe('EsError', () => { 'x_content_parse_exception: [x_content_parse_exception] Reason: [1:78] [date_histogram] failed to parse field [calendar_interval]', statusCode: 400, attributes: { - root_cause: [ - { - type: 'x_content_parse_exception', - reason: '[1:78] [date_histogram] failed to parse field [calendar_interval]', + error: { + root_cause: [ + { + type: 'x_content_parse_exception', + reason: '[1:78] [date_histogram] failed to parse field [calendar_interval]', + }, + ], + type: 'x_content_parse_exception', + reason: '[1:78] [date_histogram] failed to parse field [calendar_interval]', + caused_by: { + type: 'illegal_argument_exception', + reason: 'The supplied interval [2q] could not be parsed as a calendar interval.', }, - ], - type: 'x_content_parse_exception', - reason: '[1:78] [date_histogram] failed to parse field [calendar_interval]', - caused_by: { - type: 'illegal_argument_exception', - reason: 'The supplied interval [2q] could not be parsed as a calendar interval.', }, }, - } as any; + } as IEsError; const esError = new EsError(error); expect(esError.message).toEqual( 'EsError: The supplied interval [2q] could not be parsed as a calendar interval.' diff --git a/src/plugins/data/public/search/errors/es_error.tsx b/src/plugins/data/public/search/errors/es_error.tsx index a8d73baaf4d71d..34d074a4271874 100644 --- a/src/plugins/data/public/search/errors/es_error.tsx +++ b/src/plugins/data/public/search/errors/es_error.tsx @@ -8,8 +8,8 @@ import React from 'react'; import { EuiCodeBlock, EuiSpacer } from '@elastic/eui'; -import { ApplicationStart } from '@kbn/core/public'; import { i18n } from '@kbn/i18n'; +import { ApplicationStart } from '@kbn/core/public'; import { KbnError } from '@kbn/kibana-utils-plugin/common'; import { IEsError } from './types'; import { getRootCause } from './utils'; @@ -20,7 +20,7 @@ export class EsError extends KbnError { constructor(protected readonly err: IEsError) { super( `EsError: ${ - getRootCause(err)?.reason || + getRootCause(err?.attributes?.error)?.reason || i18n.translate('data.esError.unknownRootCause', { defaultMessage: 'unknown' }) }` ); @@ -28,18 +28,20 @@ export class EsError extends KbnError { } public getErrorMessage(application: ApplicationStart) { - const rootCause = getRootCause(this.err)?.reason; - const topLevelCause = this.attributes?.reason; + if (!this.attributes?.error) { + return null; + } + + const rootCause = getRootCause(this.attributes.error)?.reason; + const topLevelCause = this.attributes.error.reason; const cause = rootCause ?? topLevelCause; return ( <> - {cause ? ( - - {cause} - - ) : null} + + {cause} + ); } diff --git a/src/plugins/data/public/search/errors/painless_error.test.tsx b/src/plugins/data/public/search/errors/painless_error.test.tsx index c4a540f7d21ab2..4bf79a6f5b5d93 100644 --- a/src/plugins/data/public/search/errors/painless_error.test.tsx +++ b/src/plugins/data/public/search/errors/painless_error.test.tsx @@ -23,11 +23,13 @@ describe('PainlessError', () => { const e = new PainlessError({ statusCode: 400, message: 'search_phase_execution_exception', - attributes: searchPhaseException.error, + attributes: { + error: searchPhaseException.error, + }, }); const component = mount(e.getErrorMessage(startMock.application)); - const failedShards = e.attributes?.failed_shards![0]; + const failedShards = searchPhaseException.error.failed_shards![0]; const stackTraceElem = findTestSubject(component, 'painlessStackTrace').getDOMNode(); const stackTrace = failedShards!.reason.script_stack!.splice(-2).join('\n'); diff --git a/src/plugins/data/public/search/errors/painless_error.tsx b/src/plugins/data/public/search/errors/painless_error.tsx index 64f6c586932af7..0435256f595cfa 100644 --- a/src/plugins/data/public/search/errors/painless_error.tsx +++ b/src/plugins/data/public/search/errors/painless_error.tsx @@ -31,7 +31,7 @@ export class PainlessError extends EsError { }); } - const rootCause = getRootCause(this.err); + const rootCause = getRootCause(this.err.attributes?.error); const scriptFromStackTrace = rootCause?.script_stack ? rootCause?.script_stack?.slice(-2).join('\n') : undefined; @@ -78,7 +78,7 @@ export class PainlessError extends EsError { export function isPainlessError(err: Error | IEsError) { if (!isEsError(err)) return false; - const rootCause = getRootCause(err as IEsError); + const rootCause = getRootCause((err as IEsError).attributes?.error); if (!rootCause) return false; const { lang } = rootCause; diff --git a/src/plugins/data/public/search/errors/types.ts b/src/plugins/data/public/search/errors/types.ts index b89d784731c947..de03350a6d41c8 100644 --- a/src/plugins/data/public/search/errors/types.ts +++ b/src/plugins/data/public/search/errors/types.ts @@ -5,39 +5,13 @@ * in compliance with, at your election, the Elastic License 2.0 or the Server * Side Public License, v 1. */ -import type * as estypes from '@elastic/elasticsearch/lib/api/typesWithBodyKey'; -import { KibanaServerError } from '@kbn/kibana-utils-plugin/common'; - -export interface FailedShard { - shard: number; - index: string; - node: string; - reason: Reason; -} -export interface Reason { - type: string; - reason?: string; - script_stack?: string[]; - position?: { - offset: number; - start: number; - end: number; - }; - lang?: estypes.ScriptLanguage; - script?: string; - caused_by?: { - type: string; - reason: string; - }; -} +import { estypes } from '@elastic/elasticsearch'; +import { KibanaServerError } from '@kbn/kibana-utils-plugin/common'; interface IEsErrorAttributes { - type: string; - reason: string; - root_cause?: Reason[]; - failed_shards?: FailedShard[]; - caused_by?: IEsErrorAttributes; + rawResponse?: estypes.SearchResponseBody; + error?: estypes.ErrorCause; } export type IEsError = KibanaServerError; diff --git a/src/plugins/data/public/search/errors/utils.ts b/src/plugins/data/public/search/errors/utils.ts index f90a1fb4618047..e1e2c51f87f3ca 100644 --- a/src/plugins/data/public/search/errors/utils.ts +++ b/src/plugins/data/public/search/errors/utils.ts @@ -5,26 +5,21 @@ * in compliance with, at your election, the Elastic License 2.0 or the Server * Side Public License, v 1. */ -import type { ErrorCause } from '@elastic/elasticsearch/lib/api/typesWithBodyKey'; -import { KibanaServerError } from '@kbn/kibana-utils-plugin/common'; -import type { FailedShard, Reason } from './types'; -export function getFailedShards(err: KibanaServerError): FailedShard | undefined { - const errorInfo = err.attributes; - const failedShards = errorInfo?.failed_shards || errorInfo?.caused_by?.failed_shards; - return failedShards ? failedShards[0] : undefined; +import { estypes } from '@elastic/elasticsearch'; + +function getFailedShardCause(error: estypes.ErrorCause): estypes.ErrorCause | undefined { + const failedShards = error.failed_shards || error.caused_by?.failed_shards; + return failedShards ? failedShards[0]?.reason : undefined; } -function getNestedCause(err: KibanaServerError | ErrorCause): Reason { - const attr = ((err as KibanaServerError).attributes || err) as ErrorCause; - const { type, reason, caused_by: causedBy } = attr; - if (causedBy) { - return getNestedCause(causedBy); - } - return { type, reason }; +function getNestedCause(error: estypes.ErrorCause): estypes.ErrorCause { + return error.caused_by ? getNestedCause(error.caused_by) : error; } -export function getRootCause(err: KibanaServerError) { - // Give shard failures priority, then try to get the error navigating nested objects - return getFailedShards(err)?.reason || getNestedCause(err); +export function getRootCause(error?: estypes.ErrorCause): estypes.ErrorCause | undefined { + return error + ? // Give shard failures priority, then try to get the error navigating nested objects + getFailedShardCause(error) || getNestedCause(error) + : undefined; } diff --git a/src/plugins/data/public/search/search_interceptor/search_interceptor.test.ts b/src/plugins/data/public/search/search_interceptor/search_interceptor.test.ts index 74b4a6cda7530b..013afb428931dd 100644 --- a/src/plugins/data/public/search/search_interceptor/search_interceptor.test.ts +++ b/src/plugins/data/public/search/search_interceptor/search_interceptor.test.ts @@ -22,6 +22,7 @@ import * as resourceNotFoundException from '../../../common/search/test_data/res import { BehaviorSubject } from 'rxjs'; import { dataPluginMock } from '../../mocks'; import { UI_SETTINGS } from '../../../common'; +import type { IEsError } from '../errors'; jest.mock('./utils', () => { const originalModule = jest.requireActual('./utils'); @@ -151,7 +152,9 @@ describe('SearchInterceptor', () => { new PainlessError({ statusCode: 400, message: 'search_phase_execution_exception', - attributes: searchPhaseException.error, + attributes: { + error: searchPhaseException.error, + }, }) ); expect(mockCoreSetup.notifications.toasts.addDanger).toBeCalledTimes(1); @@ -1452,10 +1455,12 @@ describe('SearchInterceptor', () => { }); test('Should throw Painless error on server error with OSS format', async () => { - const mockResponse: any = { + const mockResponse: IEsError = { statusCode: 400, message: 'search_phase_execution_exception', - attributes: searchPhaseException.error, + attributes: { + error: searchPhaseException.error, + }, }; fetchMock.mockRejectedValueOnce(mockResponse); const mockRequest: IEsSearchRequest = { @@ -1466,10 +1471,12 @@ describe('SearchInterceptor', () => { }); test('Should throw ES error on ES server error', async () => { - const mockResponse: any = { + const mockResponse: IEsError = { statusCode: 400, message: 'resource_not_found_exception', - attributes: resourceNotFoundException.error, + attributes: { + error: resourceNotFoundException.error, + }, }; fetchMock.mockRejectedValueOnce(mockResponse); const mockRequest: IEsSearchRequest = { diff --git a/src/plugins/data/public/search/search_interceptor/search_interceptor.ts b/src/plugins/data/public/search/search_interceptor/search_interceptor.ts index 87f2ffe97c034e..24b2e1c41216a8 100644 --- a/src/plugins/data/public/search/search_interceptor/search_interceptor.ts +++ b/src/plugins/data/public/search/search_interceptor/search_interceptor.ts @@ -194,18 +194,18 @@ export class SearchInterceptor { // The timeout error is shown any time a request times out, or once per session, if the request is part of a session. this.showTimeoutError(err, options?.sessionId); return err; - } else if (e instanceof AbortError || e instanceof BfetchRequestError) { + } + + if (e instanceof AbortError || e instanceof BfetchRequestError) { // In the case an application initiated abort, throw the existing AbortError, same with BfetchRequestErrors return e; - } else if (isEsError(e)) { - if (isPainlessError(e)) { - return new PainlessError(e, options?.indexPattern); - } else { - return new EsError(e); - } - } else { - return e instanceof Error ? e : new Error(e.message); } + + if (isEsError(e)) { + return isPainlessError(e) ? new PainlessError(e, options?.indexPattern) : new EsError(e); + } + + return e instanceof Error ? e : new Error(e.message); } private getSerializableOptions(options?: ISearchOptions) { diff --git a/src/plugins/data/server/search/report_search_error.ts b/src/plugins/data/server/search/report_search_error.ts new file mode 100644 index 00000000000000..dc6bf2399abf6c --- /dev/null +++ b/src/plugins/data/server/search/report_search_error.ts @@ -0,0 +1,60 @@ +/* + * 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 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 or the Server + * Side Public License, v 1. + */ + +import { errors } from '@elastic/elasticsearch'; +import { KibanaResponseFactory } from '@kbn/core/server'; +import { KbnError } from '@kbn/kibana-utils-plugin/common'; + +// Why not use just use kibana-utils-plugin KbnServerError and reportServerError? +// +// Search errors need to surface additional information +// such as rawResponse and sanitized requestParams. +// KbnServerError and reportServerError are used widely throughtout Kibana. +// KbnSearchError and reportSearchError exist to avoid polluting +// non-search usages of KbnServerError and reportServerError with extra information. +export class KbnSearchError extends KbnError { + public errBody?: Record; + constructor(message: string, public readonly statusCode: number, errBody?: Record) { + super(message); + this.errBody = errBody; + } +} + +/** + * Formats any error thrown into a standardized `KbnSearchError`. + * @param e `Error` or `ElasticsearchClientError` + * @returns `KbnSearchError` + */ +export function getKbnSearchError(e: Error) { + if (e instanceof KbnSearchError) return e; + return new KbnSearchError( + e.message ?? 'Unknown error', + e instanceof errors.ResponseError ? e.statusCode! : 500, + e instanceof errors.ResponseError ? e.body : undefined + ); +} + +/** + * + * @param res Formats a `KbnSearchError` into a server error response + * @param err + */ +export function reportSearchError(res: KibanaResponseFactory, err: KbnSearchError) { + return res.customError({ + statusCode: err.statusCode ?? 500, + body: { + message: err.message, + attributes: err.errBody + ? { + error: err.errBody.error, + rawResponse: err.errBody.response, + } + : undefined, + }, + }); +} diff --git a/src/plugins/data/server/search/routes/bsearch.ts b/src/plugins/data/server/search/routes/bsearch.ts index 95b094a3793cca..bf1aa4aaa3cbcf 100644 --- a/src/plugins/data/server/search/routes/bsearch.ts +++ b/src/plugins/data/server/search/routes/bsearch.ts @@ -48,7 +48,12 @@ export function registerBsearchRoute( throw { message: err.message, statusCode: err.statusCode, - attributes: err.errBody?.error, + attributes: err.errBody + ? { + error: err.errBody.error, + rawResponse: err.errBody.response, + } + : undefined, }; }) ) diff --git a/src/plugins/data/server/search/routes/search.test.ts b/src/plugins/data/server/search/routes/search.test.ts index 10b7755b2c30f4..26fad8b6890e2f 100644 --- a/src/plugins/data/server/search/routes/search.test.ts +++ b/src/plugins/data/server/search/routes/search.test.ts @@ -14,13 +14,13 @@ import { registerSearchRoute } from './search'; import { DataPluginStart } from '../../plugin'; import * as searchPhaseException from '../../../common/search/test_data/search_phase_execution_exception.json'; import * as indexNotFoundException from '../../../common/search/test_data/index_not_found_exception.json'; -import { KbnServerError } from '@kbn/kibana-utils-plugin/server'; +import { KbnSearchError } from '../report_search_error'; describe('Search service', () => { let mockCoreSetup: MockedKeys>; - function mockEsError(message: string, statusCode: number, attributes?: Record) { - return new KbnServerError(message, statusCode, attributes); + function mockEsError(message: string, statusCode: number, errBody?: Record) { + return new KbnSearchError(message, statusCode, errBody); } async function runMockSearch(mockContext: any, mockRequest: any, mockResponse: any) { @@ -112,7 +112,10 @@ describe('Search service', () => { const error: any = mockResponse.customError.mock.calls[0][0]; expect(error.statusCode).toBe(400); expect(error.body.message).toBe('search_phase_execution_exception'); - expect(error.body.attributes).toBe(searchPhaseException.error); + expect(error.body.attributes).toEqual({ + error: searchPhaseException.error, + rawResponse: undefined, + }); }); it('handler returns an error response if the search throws an index not found error', async () => { @@ -138,7 +141,10 @@ describe('Search service', () => { const error: any = mockResponse.customError.mock.calls[0][0]; expect(error.statusCode).toBe(404); expect(error.body.message).toBe('index_not_found_exception'); - expect(error.body.attributes).toBe(indexNotFoundException.error); + expect(error.body.attributes).toEqual({ + error: indexNotFoundException.error, + rawResponse: undefined, + }); }); it('handler returns an error response if the search throws a general error', async () => { diff --git a/src/plugins/data/server/search/routes/search.ts b/src/plugins/data/server/search/routes/search.ts index 9d338095f25c0c..8b302a81aea1ab 100644 --- a/src/plugins/data/server/search/routes/search.ts +++ b/src/plugins/data/server/search/routes/search.ts @@ -9,6 +9,7 @@ import { first } from 'rxjs/operators'; import { schema } from '@kbn/config-schema'; import { reportServerError } from '@kbn/kibana-utils-plugin/server'; +import { reportSearchError } from '../report_search_error'; import { getRequestAbortedSignal } from '../../lib'; import type { DataPluginRouter } from '../types'; @@ -71,7 +72,7 @@ export function registerSearchRoute(router: DataPluginRouter): void { return res.ok({ body: response }); } catch (err) { - return reportServerError(res, err); + return reportSearchError(res, err); } } ); diff --git a/src/plugins/data/server/search/strategies/es_search/es_search_strategy.test.ts b/src/plugins/data/server/search/strategies/es_search/es_search_strategy.test.ts index 15a6a4df7eed8d..9db6b00200bccc 100644 --- a/src/plugins/data/server/search/strategies/es_search/es_search_strategy.test.ts +++ b/src/plugins/data/server/search/strategies/es_search/es_search_strategy.test.ts @@ -14,7 +14,7 @@ import { SearchStrategyDependencies } from '../../types'; import * as indexNotFoundException from '../../../../common/search/test_data/index_not_found_exception.json'; import { errors } from '@elastic/elasticsearch'; -import { KbnServerError } from '@kbn/kibana-utils-plugin/server'; +import { KbnSearchError } from '../../report_search_error'; import { firstValueFrom } from 'rxjs'; describe('ES search strategy', () => { @@ -150,7 +150,7 @@ describe('ES search strategy', () => { .toPromise(); } catch (e) { expect(esClient.search).toBeCalled(); - expect(e).toBeInstanceOf(KbnServerError); + expect(e).toBeInstanceOf(KbnSearchError); expect(e.statusCode).toBe(404); expect(e.message).toBe(errResponse.message); expect(e.errBody).toBe(indexNotFoundException); @@ -167,7 +167,7 @@ describe('ES search strategy', () => { .toPromise(); } catch (e) { expect(esClient.search).toBeCalled(); - expect(e).toBeInstanceOf(KbnServerError); + expect(e).toBeInstanceOf(KbnSearchError); expect(e.statusCode).toBe(500); expect(e.message).toBe(errResponse.message); expect(e.errBody).toBe(undefined); @@ -184,14 +184,14 @@ describe('ES search strategy', () => { .toPromise(); } catch (e) { expect(esClient.search).toBeCalled(); - expect(e).toBeInstanceOf(KbnServerError); + expect(e).toBeInstanceOf(KbnSearchError); expect(e.statusCode).toBe(500); expect(e.message).toBe(errResponse.message); expect(e.errBody).toBe(undefined); } }); - it('throws KbnServerError for unknown index type', async () => { + it('throws KbnSearchError for unknown index type', async () => { const params = { index: 'logstash-*', ignore_unavailable: false, timeout: '1000ms' }; try { @@ -200,7 +200,7 @@ describe('ES search strategy', () => { .toPromise(); } catch (e) { expect(esClient.search).not.toBeCalled(); - expect(e).toBeInstanceOf(KbnServerError); + expect(e).toBeInstanceOf(KbnSearchError); expect(e.message).toBe('Unsupported index pattern type banana'); expect(e.statusCode).toBe(400); expect(e.errBody).toBe(undefined); diff --git a/src/plugins/data/server/search/strategies/es_search/es_search_strategy.ts b/src/plugins/data/server/search/strategies/es_search/es_search_strategy.ts index b2aed5804f2484..64b2234a573c82 100644 --- a/src/plugins/data/server/search/strategies/es_search/es_search_strategy.ts +++ b/src/plugins/data/server/search/strategies/es_search/es_search_strategy.ts @@ -9,7 +9,7 @@ import { firstValueFrom, from, Observable } from 'rxjs'; import { tap } from 'rxjs/operators'; import type { Logger, SharedGlobalConfig } from '@kbn/core/server'; -import { getKbnServerError, KbnServerError } from '@kbn/kibana-utils-plugin/server'; +import { getKbnSearchError, KbnSearchError } from '../../report_search_error'; import type { ISearchStrategy } from '../../types'; import type { SearchUsage } from '../../collectors/search'; import { getDefaultSearchParams, getShardTimeout } from './request_utils'; @@ -25,14 +25,14 @@ export const esSearchStrategyProvider = ( * @param request * @param options * @param deps - * @throws `KbnServerError` + * @throws `KbnSearchError` * @returns `Observable>` */ search: (request, { abortSignal, transport, ...options }, { esClient, uiSettingsClient }) => { // Only default index pattern type is supported here. // See ese for other type support. if (request.indexType) { - throw new KbnServerError(`Unsupported index pattern type ${request.indexType}`, 400); + throw new KbnSearchError(`Unsupported index pattern type ${request.indexType}`, 400); } const isPit = request.params?.body?.pit != null; @@ -57,7 +57,7 @@ export const esSearchStrategyProvider = ( const response = shimHitsTotal(body, options); return toKibanaSearchResponse(response); } catch (e) { - throw getKbnServerError(e); + throw getKbnSearchError(e); } }; diff --git a/src/plugins/data/server/search/strategies/ese_search/ese_search_strategy.test.ts b/src/plugins/data/server/search/strategies/ese_search/ese_search_strategy.test.ts index 96e401204978f5..6c1746984c86bc 100644 --- a/src/plugins/data/server/search/strategies/ese_search/ese_search_strategy.test.ts +++ b/src/plugins/data/server/search/strategies/ese_search/ese_search_strategy.test.ts @@ -8,6 +8,7 @@ import { BehaviorSubject, firstValueFrom } from 'rxjs'; import { KbnServerError } from '@kbn/kibana-utils-plugin/server'; +import { KbnSearchError } from '../../report_search_error'; import { errors } from '@elastic/elasticsearch'; import * as indexNotFoundException from '../../../../common/search/test_data/index_not_found_exception.json'; import * as xContentParseException from '../../../../common/search/test_data/x_content_parse_exception.json'; @@ -456,14 +457,14 @@ describe('ES search strategy', () => { mockLogger ); - let err: KbnServerError | undefined; + let err: KbnSearchError | undefined; try { await esSearch.search({ params }, {}, mockDeps).toPromise(); } catch (e) { err = e; } expect(mockSubmitCaller).toBeCalled(); - expect(err).toBeInstanceOf(KbnServerError); + expect(err).toBeInstanceOf(KbnSearchError); expect(err?.statusCode).toBe(404); expect(err?.message).toBe(errResponse.message); expect(err?.errBody).toBe(indexNotFoundException); @@ -481,14 +482,14 @@ describe('ES search strategy', () => { mockLogger ); - let err: KbnServerError | undefined; + let err: KbnSearchError | undefined; try { await esSearch.search({ params }, {}, mockDeps).toPromise(); } catch (e) { err = e; } expect(mockSubmitCaller).toBeCalled(); - expect(err).toBeInstanceOf(KbnServerError); + expect(err).toBeInstanceOf(KbnSearchError); expect(err?.statusCode).toBe(500); expect(err?.message).toBe(errResponse.message); expect(err?.errBody).toBe(undefined); diff --git a/src/plugins/data/server/search/strategies/ese_search/ese_search_strategy.ts b/src/plugins/data/server/search/strategies/ese_search/ese_search_strategy.ts index 88d1606935562c..460d8f95ed3e4d 100644 --- a/src/plugins/data/server/search/strategies/ese_search/ese_search_strategy.ts +++ b/src/plugins/data/server/search/strategies/ese_search/ese_search_strategy.ts @@ -11,7 +11,8 @@ import type { IScopedClusterClient, Logger, SharedGlobalConfig } from '@kbn/core import { catchError, tap } from 'rxjs/operators'; import type * as estypes from '@elastic/elasticsearch/lib/api/typesWithBodyKey'; import { firstValueFrom, from } from 'rxjs'; -import { getKbnServerError, KbnServerError } from '@kbn/kibana-utils-plugin/server'; +import { getKbnServerError } from '@kbn/kibana-utils-plugin/server'; +import { getKbnSearchError, KbnSearchError } from '../../report_search_error'; import type { ISearchStrategy, SearchStrategyDependencies } from '../../types'; import type { IAsyncSearchOptions, @@ -94,7 +95,7 @@ export const enhancedEsSearchStrategyProvider = ( tap((response) => (id = response.id)), tap(searchUsageObserver(logger, usage)), catchError((e) => { - throw getKbnServerError(e); + throw getKbnSearchError(e); }) ); } @@ -136,7 +137,7 @@ export const enhancedEsSearchStrategyProvider = ( ...getTotalLoaded(response), }; } catch (e) { - throw getKbnServerError(e); + throw getKbnSearchError(e); } } @@ -146,12 +147,12 @@ export const enhancedEsSearchStrategyProvider = ( * @param options * @param deps `SearchStrategyDependencies` * @returns `Observable>` - * @throws `KbnServerError` + * @throws `KbnSearchError` */ search: (request, options: IAsyncSearchOptions, deps) => { logger.debug(`search ${JSON.stringify(request.params) || request.id}`); if (request.indexType && request.indexType !== 'rollup') { - throw new KbnServerError('Unknown indexType', 400); + throw new KbnSearchError('Unknown indexType', 400); } if (request.indexType === undefined || !deps.rollupsEnabled) { diff --git a/src/plugins/data/server/search/strategies/esql_search/esql_search_strategy.ts b/src/plugins/data/server/search/strategies/esql_search/esql_search_strategy.ts index 2af032826189fb..460755a74df8f9 100644 --- a/src/plugins/data/server/search/strategies/esql_search/esql_search_strategy.ts +++ b/src/plugins/data/server/search/strategies/esql_search/esql_search_strategy.ts @@ -8,7 +8,7 @@ import { from } from 'rxjs'; import type { Logger } from '@kbn/core/server'; -import { getKbnServerError, KbnServerError } from '@kbn/kibana-utils-plugin/server'; +import { getKbnSearchError, KbnSearchError } from '../../report_search_error'; import type { ISearchStrategy } from '../../types'; const ES_TIMEOUT_IN_MS = 120000; @@ -21,7 +21,7 @@ export const esqlSearchStrategyProvider = ( * @param request * @param options * @param deps - * @throws `KbnServerError` + * @throws `KbnSearchError` * @returns `Observable>` */ search: (request, { abortSignal, ...options }, { esClient, uiSettingsClient }) => { @@ -39,7 +39,7 @@ export const esqlSearchStrategyProvider = ( // Only default index pattern type is supported here. // See ese for other type support. if (request.indexType) { - throw new KbnServerError(`Unsupported index pattern type ${request.indexType}`, 400); + throw new KbnSearchError(`Unsupported index pattern type ${request.indexType}`, 400); } const search = async () => { @@ -67,7 +67,7 @@ export const esqlSearchStrategyProvider = ( warning: headers?.warning, }; } catch (e) { - throw getKbnServerError(e); + throw getKbnSearchError(e); } }; diff --git a/src/plugins/data/server/search/strategies/sql_search/sql_search_strategy.test.ts b/src/plugins/data/server/search/strategies/sql_search/sql_search_strategy.test.ts index 530ee16ae75b9a..700c658de10c04 100644 --- a/src/plugins/data/server/search/strategies/sql_search/sql_search_strategy.test.ts +++ b/src/plugins/data/server/search/strategies/sql_search/sql_search_strategy.test.ts @@ -7,7 +7,7 @@ */ import { merge } from 'lodash'; -import { KbnServerError } from '@kbn/kibana-utils-plugin/server'; +import { KbnSearchError } from '../../report_search_error'; import { errors } from '@elastic/elasticsearch'; import * as indexNotFoundException from '../../../../common/search/test_data/index_not_found_exception.json'; import { SearchStrategyDependencies } from '../../types'; @@ -221,14 +221,14 @@ describe('SQL search strategy', () => { }; const esSearch = await sqlSearchStrategyProvider(mockSearchConfig, mockLogger); - let err: KbnServerError | undefined; + let err: KbnSearchError | undefined; try { await esSearch.search({ params }, {}, mockDeps).toPromise(); } catch (e) { err = e; } expect(mockSqlQuery).toBeCalled(); - expect(err).toBeInstanceOf(KbnServerError); + expect(err).toBeInstanceOf(KbnSearchError); expect(err?.statusCode).toBe(404); expect(err?.message).toBe(errResponse.message); expect(err?.errBody).toBe(indexNotFoundException); @@ -245,14 +245,14 @@ describe('SQL search strategy', () => { }; const esSearch = await sqlSearchStrategyProvider(mockSearchConfig, mockLogger); - let err: KbnServerError | undefined; + let err: KbnSearchError | undefined; try { await esSearch.search({ params }, {}, mockDeps).toPromise(); } catch (e) { err = e; } expect(mockSqlQuery).toBeCalled(); - expect(err).toBeInstanceOf(KbnServerError); + expect(err).toBeInstanceOf(KbnSearchError); expect(err?.statusCode).toBe(500); expect(err?.message).toBe(errResponse.message); expect(err?.errBody).toBe(undefined); diff --git a/src/plugins/data/server/search/strategies/sql_search/sql_search_strategy.ts b/src/plugins/data/server/search/strategies/sql_search/sql_search_strategy.ts index d5d1eafc5c2143..34134a1491cd0f 100644 --- a/src/plugins/data/server/search/strategies/sql_search/sql_search_strategy.ts +++ b/src/plugins/data/server/search/strategies/sql_search/sql_search_strategy.ts @@ -11,6 +11,7 @@ import type { IScopedClusterClient, Logger } from '@kbn/core/server'; import { catchError, tap } from 'rxjs/operators'; import { SqlQueryResponse } from '@elastic/elasticsearch/lib/api/types'; import { getKbnServerError } from '@kbn/kibana-utils-plugin/server'; +import { getKbnSearchError } from '../../report_search_error'; import type { ISearchStrategy, SearchStrategyDependencies } from '../../types'; import type { IAsyncSearchOptions, @@ -94,7 +95,7 @@ export const sqlSearchStrategyProvider = ( }).pipe( tap((response) => (id = response.id)), catchError((e) => { - throw getKbnServerError(e); + throw getKbnSearchError(e); }) ); } @@ -105,7 +106,7 @@ export const sqlSearchStrategyProvider = ( * @param options * @param deps `SearchStrategyDependencies` * @returns `Observable>` - * @throws `KbnServerError` + * @throws `KbnSearchError` */ search: (request, options: IAsyncSearchOptions, deps) => { logger.debug(`sql search: search request=${JSON.stringify(request)}`); diff --git a/test/api_integration/apis/search/verify_error.ts b/test/api_integration/apis/search/verify_error.ts index 1973fe4e4ab361..b7a38f1117fe23 100644 --- a/test/api_integration/apis/search/verify_error.ts +++ b/test/api_integration/apis/search/verify_error.ts @@ -20,7 +20,8 @@ export const verifyErrorResponse = ( } if (shouldHaveAttrs) { expect(r).to.have.property('attributes'); - expect(r.attributes).to.have.property('root_cause'); + expect(r.attributes).to.have.property('error'); + expect(r.attributes.error).to.have.property('root_cause'); } else { expect(r).not.to.have.property('attributes'); } diff --git a/x-pack/plugins/lens/public/editor_frame_service/error_helper.test.ts b/x-pack/plugins/lens/public/editor_frame_service/error_helper.test.ts index fe5c1f85f1e925..7e3b696a8e75f0 100644 --- a/x-pack/plugins/lens/public/editor_frame_service/error_helper.test.ts +++ b/x-pack/plugins/lens/public/editor_frame_service/error_helper.test.ts @@ -21,6 +21,45 @@ const runtimeFieldError = { message: 'status_exception', statusCode: 400, attributes: { + error: { + type: 'status_exception', + reason: 'error while executing search', + caused_by: { + type: 'search_phase_execution_exception', + reason: 'all shards failed', + phase: 'query', + grouped: true, + failed_shards: [ + { + shard: 0, + index: 'indexpattern_source', + node: 'jtqB1-UhQluyjeXIpQFqAA', + reason: { + type: 'script_exception', + reason: 'runtime error', + script_stack: [ + 'java.base/java.lang.NumberFormatException.forInputString(NumberFormatException.java:68)', + 'java.base/java.lang.Integer.parseInt(Integer.java:652)', + 'java.base/java.lang.Integer.parseInt(Integer.java:770)', + "emit(Integer.parseInt('hello'))", + ' ^---- HERE', + ], + script: "emit(Integer.parseInt('hello'))", + lang: 'painless', + position: { offset: 12, start: 0, end: 31 }, + caused_by: { + type: 'number_format_exception', + reason: 'For input string: "hello"', + }, + }, + }, + ], + }, + }, + }, + }, + attributes: { + error: { type: 'status_exception', reason: 'error while executing search', caused_by: { @@ -53,38 +92,6 @@ const runtimeFieldError = { }, }, }, - attributes: { - type: 'status_exception', - reason: 'error while executing search', - caused_by: { - type: 'search_phase_execution_exception', - reason: 'all shards failed', - phase: 'query', - grouped: true, - failed_shards: [ - { - shard: 0, - index: 'indexpattern_source', - node: 'jtqB1-UhQluyjeXIpQFqAA', - reason: { - type: 'script_exception', - reason: 'runtime error', - script_stack: [ - 'java.base/java.lang.NumberFormatException.forInputString(NumberFormatException.java:68)', - 'java.base/java.lang.Integer.parseInt(Integer.java:652)', - 'java.base/java.lang.Integer.parseInt(Integer.java:770)', - "emit(Integer.parseInt('hello'))", - ' ^---- HERE', - ], - script: "emit(Integer.parseInt('hello'))", - lang: 'painless', - position: { offset: 12, start: 0, end: 31 }, - caused_by: { type: 'number_format_exception', reason: 'For input string: "hello"' }, - }, - }, - ], - }, - }, }, }; @@ -99,6 +106,31 @@ const scriptedFieldError = { message: 'status_exception', statusCode: 500, attributes: { + error: { + type: 'status_exception', + reason: 'error while executing search', + caused_by: { + type: 'search_phase_execution_exception', + reason: 'all shards failed', + phase: 'query', + grouped: true, + failed_shards: [ + { + shard: 0, + index: 'indexpattern_source', + node: 'jtqB1-UhQluyjeXIpQFqAA', + reason: { + type: 'aggregation_execution_exception', + reason: 'Unsupported script value [hello], expected a number, date, or boolean', + }, + }, + ], + }, + }, + }, + }, + attributes: { + error: { type: 'status_exception', reason: 'error while executing search', caused_by: { @@ -120,27 +152,6 @@ const scriptedFieldError = { }, }, }, - attributes: { - type: 'status_exception', - reason: 'error while executing search', - caused_by: { - type: 'search_phase_execution_exception', - reason: 'all shards failed', - phase: 'query', - grouped: true, - failed_shards: [ - { - shard: 0, - index: 'indexpattern_source', - node: 'jtqB1-UhQluyjeXIpQFqAA', - reason: { - type: 'aggregation_execution_exception', - reason: 'Unsupported script value [hello], expected a number, date, or boolean', - }, - }, - ], - }, - }, }, }; @@ -174,41 +185,7 @@ const tsdbCounterUsedWithWrongOperationError = { name: 'Error', original: { attributes: { - type: 'status_exception', - reason: 'error while executing search', - caused_by: { - type: 'search_phase_execution_exception', - reason: 'all shards failed', - phase: 'query', - grouped: true, - failed_shards: [ - { - shard: 0, - index: 'tsdb_index', - reason: { - type: 'illegal_argument_exception', - reason: - 'Field [bytes_counter] of type [long][counter] is not supported for aggregation [sum]', - }, - }, - ], - caused_by: { - type: 'illegal_argument_exception', - reason: - 'Field [bytes_counter] of type [long][counter] is not supported for aggregation [sum]', - caused_by: { - type: 'illegal_argument_exception', - reason: - 'Field [bytes_counter] of type [long][counter] is not supported for aggregation [sum]', - }, - }, - }, - }, - err: { - message: - 'status_exception\n\tCaused by:\n\t\tsearch_phase_execution_exception: all shards failed', - statusCode: 400, - attributes: { + error: { type: 'status_exception', reason: 'error while executing search', caused_by: { @@ -240,6 +217,44 @@ const tsdbCounterUsedWithWrongOperationError = { }, }, }, + err: { + message: + 'status_exception\n\tCaused by:\n\t\tsearch_phase_execution_exception: all shards failed', + statusCode: 400, + attributes: { + error: { + type: 'status_exception', + reason: 'error while executing search', + caused_by: { + type: 'search_phase_execution_exception', + reason: 'all shards failed', + phase: 'query', + grouped: true, + failed_shards: [ + { + shard: 0, + index: 'tsdb_index', + reason: { + type: 'illegal_argument_exception', + reason: + 'Field [bytes_counter] of type [long][counter] is not supported for aggregation [sum]', + }, + }, + ], + caused_by: { + type: 'illegal_argument_exception', + reason: + 'Field [bytes_counter] of type [long][counter] is not supported for aggregation [sum]', + caused_by: { + type: 'illegal_argument_exception', + reason: + 'Field [bytes_counter] of type [long][counter] is not supported for aggregation [sum]', + }, + }, + }, + }, + }, + }, }, }; diff --git a/x-pack/plugins/lens/public/editor_frame_service/error_helper.tsx b/x-pack/plugins/lens/public/editor_frame_service/error_helper.tsx index fd98a0654983ef..c336101033eaea 100644 --- a/x-pack/plugins/lens/public/editor_frame_service/error_helper.tsx +++ b/x-pack/plugins/lens/public/editor_frame_service/error_helper.tsx @@ -7,18 +7,16 @@ import { i18n } from '@kbn/i18n'; import { isEqual, uniqWith } from 'lodash'; +import { estypes } from '@elastic/elasticsearch'; import { ExpressionRenderError } from '@kbn/expressions-plugin/public'; import type { CoreStart } from '@kbn/core/public'; import { isEsError } from '@kbn/data-plugin/public'; -import type { IEsError, Reason } from '@kbn/data-plugin/public'; import React from 'react'; import { EuiLink } from '@elastic/eui'; import { RemovableUserMessage } from '../types'; -type ErrorCause = Required['attributes']; - interface RequestError extends Error { - body?: { attributes?: { error: { caused_by: ErrorCause } } }; + body?: { attributes?: { error: { caused_by: estypes.ErrorCause } } }; } interface ReasonDescription { @@ -62,7 +60,7 @@ function getNestedErrorClauseWithContext({ caused_by: causedBy, lang, script, -}: Reason): ReasonDescription[] { +}: estypes.ErrorCause): ReasonDescription[] { if (!causedBy) { // scripted fields error has changed with no particular hint about painless in it, // so it tries to lookup in the message for the script word @@ -83,12 +81,12 @@ function getNestedErrorClauseWithContext({ return [{ ...payload, context: { type, reason } }]; } -function getNestedErrorClause(e: ErrorCause | Reason): ReasonDescription[] { +function getNestedErrorClause(e: estypes.ErrorCause): ReasonDescription[] { const { type, reason = '', caused_by: causedBy } = e; // Painless scripts errors are nested within the failed_shards property if ('failed_shards' in e) { if (e.failed_shards) { - return e.failed_shards.flatMap((shardCause) => + return (e.failed_shards as estypes.ShardFailure[]).flatMap((shardCause) => getNestedErrorClauseWithContext(shardCause.reason) ); } @@ -101,13 +99,15 @@ function getNestedErrorClause(e: ErrorCause | Reason): ReasonDescription[] { function getErrorSources(e: Error) { if (isRequestError(e)) { - return getNestedErrorClause(e.body!.attributes!.error as ErrorCause); + return getNestedErrorClause(e.body!.attributes!.error as estypes.ErrorCause); } if (isEsError(e)) { - if (e.attributes?.reason) { - return getNestedErrorClause(e.attributes); + if (e.attributes?.error?.reason) { + return getNestedErrorClause(e.attributes.error); + } + if (e.attributes?.error?.caused_by) { + return getNestedErrorClause(e.attributes.error.caused_by); } - return getNestedErrorClause(e.attributes?.caused_by as ErrorCause); } return []; } diff --git a/x-pack/plugins/security_solution/public/common/hooks/use_app_toasts.test.ts b/x-pack/plugins/security_solution/public/common/hooks/use_app_toasts.test.ts index 250c000575d07d..ad3334e536793b 100644 --- a/x-pack/plugins/security_solution/public/common/hooks/use_app_toasts.test.ts +++ b/x-pack/plugins/security_solution/public/common/hooks/use_app_toasts.test.ts @@ -234,7 +234,7 @@ describe('useAppToasts', () => { it('prefers the attributes reason if we have it for the message', async () => { const error: IEsError = { - attributes: { type: 'some type', reason: 'message we want' }, + attributes: { error: { type: 'some type', reason: 'message we want' } }, statusCode: 200, message: 'message we do not want', }; @@ -244,11 +244,11 @@ describe('useAppToasts', () => { it('works with an EsError, by using the inner error and not outer error if available', async () => { const error: MaybeESError = { - attributes: { type: 'some type', reason: 'message we want' }, + attributes: { error: { type: 'some type', reason: 'message we want' } }, statusCode: 400, err: { statusCode: 200, - attributes: { reason: 'attribute message we do not want' }, + attributes: { error: { reason: 'attribute message we do not want' } }, }, message: 'main message we do not want', }; @@ -258,11 +258,11 @@ describe('useAppToasts', () => { it('creates a stack trace of a EsError and not the outer object', async () => { const error: MaybeESError = { - attributes: { type: 'some type', reason: 'message we do not want' }, + attributes: { error: { type: 'some type', reason: 'message we do not want' } }, statusCode: 400, err: { statusCode: 200, - attributes: { reason: 'attribute message we do want' }, + attributes: { error: { reason: 'attribute message we do want' } }, }, message: 'main message we do not want', }; @@ -270,7 +270,7 @@ describe('useAppToasts', () => { const parsedStack = JSON.parse(result.stack ?? ''); expect(parsedStack).toEqual({ statusCode: 200, - attributes: { reason: 'attribute message we do want' }, + attributes: { error: { reason: 'attribute message we do want' } }, }); }); }); diff --git a/x-pack/plugins/security_solution/public/common/hooks/use_app_toasts.ts b/x-pack/plugins/security_solution/public/common/hooks/use_app_toasts.ts index 3c4ad68b221ea6..99500a42b8c35d 100644 --- a/x-pack/plugins/security_solution/public/common/hooks/use_app_toasts.ts +++ b/x-pack/plugins/security_solution/public/common/hooks/use_app_toasts.ts @@ -98,8 +98,10 @@ export const esErrorToErrorStack = (error: IEsError & MaybeESError): Error => { ? `(${error.statusCode})` : ''; const stringifiedError = getStringifiedStack(maybeUnWrapped); - const adaptedError = new Error(`${error.attributes?.reason ?? error.message} ${statusCode}`); - adaptedError.name = error.attributes?.reason ?? error.message; + const adaptedError = new Error( + `${error.attributes?.error?.reason ?? error.message} ${statusCode}` + ); + adaptedError.name = error.attributes?.error?.reason ?? error.message; if (stringifiedError != null) { adaptedError.stack = stringifiedError; } diff --git a/x-pack/plugins/timelines/public/hooks/use_app_toasts.ts b/x-pack/plugins/timelines/public/hooks/use_app_toasts.ts index 4a3cc315ae693f..a33ee86e0a31a4 100644 --- a/x-pack/plugins/timelines/public/hooks/use_app_toasts.ts +++ b/x-pack/plugins/timelines/public/hooks/use_app_toasts.ts @@ -93,8 +93,10 @@ export const esErrorToErrorStack = (error: IEsError & MaybeESError): Error => { ? `(${error.statusCode})` : ''; const stringifiedError = getStringifiedStack(maybeUnWrapped); - const adaptedError = new Error(`${error.attributes?.reason ?? error.message} ${statusCode}`); - adaptedError.name = error.attributes?.reason ?? error.message; + const adaptedError = new Error( + `${error.attributes?.error?.reason ?? error.message} ${statusCode}` + ); + adaptedError.name = error.attributes?.error?.reason ?? error.message; if (stringifiedError != null) { adaptedError.stack = stringifiedError; } diff --git a/x-pack/test/api_integration/apis/search/search.ts b/x-pack/test/api_integration/apis/search/search.ts index 48ff19e51623d5..391923601d7c59 100644 --- a/x-pack/test/api_integration/apis/search/search.ts +++ b/x-pack/test/api_integration/apis/search/search.ts @@ -411,7 +411,11 @@ export default function ({ getService }: FtrProviderContext) { .set('kbn-xsrf', 'foo') .send() .expect(400); - verifyErrorResponse(resp.body, 400, 'illegal_argument_exception', true); + + expect(resp.body.statusCode).to.be(400); + expect(resp.body.message).to.include.string('illegal_argument_exception'); + expect(resp.body).to.have.property('attributes'); + expect(resp.body.attributes).to.have.property('root_cause'); }); it('should delete an in-progress search', async function () { diff --git a/x-pack/test_serverless/api_integration/test_suites/common/search_oss/verify_error.ts b/x-pack/test_serverless/api_integration/test_suites/common/search_oss/verify_error.ts index 3523cefc8b33f1..be1ceaf1d535e7 100644 --- a/x-pack/test_serverless/api_integration/test_suites/common/search_oss/verify_error.ts +++ b/x-pack/test_serverless/api_integration/test_suites/common/search_oss/verify_error.ts @@ -19,7 +19,8 @@ export const verifyErrorResponse = ( } if (shouldHaveAttrs) { expect(r).to.have.property('attributes'); - expect(r.attributes).to.have.property('root_cause'); + expect(r.attributes).to.have.property('error'); + expect(r.attributes.error).to.have.property('root_cause'); } else { expect(r).not.to.have.property('attributes'); } diff --git a/x-pack/test_serverless/api_integration/test_suites/common/search_xpack/search.ts b/x-pack/test_serverless/api_integration/test_suites/common/search_xpack/search.ts index d820f22e725672..ecced2db57ee99 100644 --- a/x-pack/test_serverless/api_integration/test_suites/common/search_xpack/search.ts +++ b/x-pack/test_serverless/api_integration/test_suites/common/search_xpack/search.ts @@ -380,7 +380,10 @@ export default function ({ getService }: FtrProviderContext) { .set('kbn-xsrf', 'foo') .send() .expect(400); - verifyErrorResponse(resp.body, 400, 'illegal_argument_exception', true); + expect(resp.body.statusCode).to.be(400); + expect(resp.body.message).to.include.string('illegal_argument_exception'); + expect(resp.body).to.have.property('attributes'); + expect(resp.body.attributes).to.have.property('root_cause'); }); it('should delete an in-progress search', async function () { From 320eff2870c57001854ac48ad7fb3ea59b07d1c4 Mon Sep 17 00:00:00 2001 From: Tomasz Ciecierski Date: Mon, 23 Oct 2023 19:01:03 +0200 Subject: [PATCH 23/68] [EDR Workflows] Test metrics flakiness (#169527) --- .../osquery/cypress/e2e/all/metrics.cy.ts | 58 +++++++++---------- 1 file changed, 29 insertions(+), 29 deletions(-) diff --git a/x-pack/plugins/osquery/cypress/e2e/all/metrics.cy.ts b/x-pack/plugins/osquery/cypress/e2e/all/metrics.cy.ts index 3322f1551ef935..e0442be19ece59 100644 --- a/x-pack/plugins/osquery/cypress/e2e/all/metrics.cy.ts +++ b/x-pack/plugins/osquery/cypress/e2e/all/metrics.cy.ts @@ -11,52 +11,52 @@ import { loadSavedQuery, cleanupSavedQuery } from '../../tasks/api_fixtures'; import { triggerLoadData } from '../../tasks/inventory'; import { ServerlessRoleName } from '../../support/roles'; -// FLAKY: https://github.com/elastic/kibana/issues/169369 -// FLAKY: https://github.com/elastic/kibana/issues/169370 -describe.skip('ALL - Inventory', { tags: ['@ess'] }, () => { +describe('ALL - Inventory', { tags: ['@ess'] }, () => { let savedQueryName: string; let savedQueryId: string; - before(() => { + beforeEach(() => { loadSavedQuery().then((data) => { savedQueryId = data.saved_object_id; savedQueryName = data.id; }); }); - beforeEach(() => { - cy.login(ServerlessRoleName.SOC_MANAGER); - navigateTo('/app/osquery'); - }); - - after(() => { + afterEach(() => { cleanupSavedQuery(savedQueryId); }); - it('should be able to run the query', () => { - cy.getBySel('toggleNavButton').click(); - cy.contains('Infrastructure').click(); + describe('', () => { + beforeEach(() => { + cy.login(ServerlessRoleName.SOC_MANAGER); + navigateTo('/app/osquery'); + }); - triggerLoadData(); - cy.contains('Osquery').click(); - inputQuery('select * from uptime;'); + it('should be able to run the query', () => { + cy.getBySel('toggleNavButton').click(); + cy.contains('Infrastructure').click(); - submitQuery(); - checkResults(); - }); + triggerLoadData(); + cy.contains('Osquery').click(); + inputQuery('select * from uptime;'); + + submitQuery(); + checkResults(); + }); - it('should be able to run the previously saved query', () => { - cy.getBySel('toggleNavButton').click(); - cy.getBySel('collapsibleNavAppLink').contains('Infrastructure').click(); + it('should be able to run the previously saved query', () => { + cy.getBySel('toggleNavButton').click(); + cy.getBySel('collapsibleNavAppLink').contains('Infrastructure').click(); - triggerLoadData(); - cy.contains('Osquery').click(); + triggerLoadData(); + cy.contains('Osquery').click(); - cy.getBySel('comboBoxInput').first().click(); - cy.wait(500); - cy.getBySel('comboBoxInput').first().type(`${savedQueryName}{downArrow}{enter}`); + cy.getBySel('comboBoxInput').first().click(); + cy.wait(500); + cy.getBySel('comboBoxInput').first().type(`${savedQueryName}{downArrow}{enter}`); - submitQuery(); - checkResults(); + submitQuery(); + checkResults(); + }); }); }); From 6a6b83e60cfd0e0f3ad4f6802f852cd97fda15ca Mon Sep 17 00:00:00 2001 From: Elena Stoeva <59341489+ElenaStoeva@users.noreply.github.com> Date: Mon, 23 Oct 2023 18:05:23 +0100 Subject: [PATCH 24/68] [Serverless][Index Management] Hide Storage size column in Data streams (#169280) Fixes https://github.com/elastic/kibana/issues/167654 ## Summary This PR removes the Storage size column in Data stream in serverless as the data stream stats API on serverless doesn't currently return the storage size. ### How to test: Verify that the column is not displayed in serverless: 1. Start Es with `yarn es serverless` and Kibana with `yarn serverless-{es/oblt/security}` 2. Go to Stack Management -> Index Management -> Data Streams 3. Switch on the "Include stats" toggle 4. Verify that the "Storage size" column is not shown in the table. Verify that the column is displayed in stateful: 1. Start Es with `yarn es snapshot` and Kibana with `yarn start` 2. Go to Stack Management -> Index Management -> Data Streams 3. Switch on the "Include stats" toggle 4. Verify that the "Storage size" column is shown in the table. --- config/serverless.yml | 2 ++ .../test_suites/core_plugins/rendering.ts | 1 + .../helpers/setup_environment.tsx | 1 + .../home/data_streams_tab.test.ts | 29 +++++++++++++++++++ .../public/application/app_context.tsx | 1 + .../data_stream_table/data_stream_table.tsx | 24 ++++++++------- .../plugins/index_management/public/plugin.ts | 2 ++ .../plugins/index_management/public/types.ts | 1 + .../plugins/index_management/server/config.ts | 6 ++++ .../plugins/index_management/server/plugin.ts | 1 + .../register_privileges_route.test.ts | 2 ++ .../server/test/helpers/route_dependencies.ts | 1 + .../plugins/index_management/server/types.ts | 1 + 13 files changed, 62 insertions(+), 10 deletions(-) diff --git a/config/serverless.yml b/config/serverless.yml index 97a7e638eb2d84..f6e661c158f42b 100644 --- a/config/serverless.yml +++ b/config/serverless.yml @@ -44,6 +44,8 @@ xpack.index_management.enableLegacyTemplates: false xpack.index_management.enableIndexStats: false # Only limited index settings can be edited xpack.index_management.editableIndexSettings: limited +# Disable Storage size column in the Data streams table from Index Management UI +xpack.index_management.enableDataStreamsStorageColumn: false # Keep deeplinks visible so that they are shown in the sidenav dev_tools.deeplinks.navLinkStatus: visible diff --git a/test/plugin_functional/test_suites/core_plugins/rendering.ts b/test/plugin_functional/test_suites/core_plugins/rendering.ts index 88d354ff25a47b..177e643139e384 100644 --- a/test/plugin_functional/test_suites/core_plugins/rendering.ts +++ b/test/plugin_functional/test_suites/core_plugins/rendering.ts @@ -267,6 +267,7 @@ export default function ({ getService }: PluginFunctionalProviderContext) { 'xpack.index_management.enableLegacyTemplates (any)', 'xpack.index_management.enableIndexStats (any)', 'xpack.index_management.editableIndexSettings (any)', + 'xpack.index_management.enableDataStreamsStorageColumn (any)', 'xpack.infra.sources.default.fields.message (array)', /** * Feature flags bellow are conditional based on traditional/serverless offering diff --git a/x-pack/plugins/index_management/__jest__/client_integration/helpers/setup_environment.tsx b/x-pack/plugins/index_management/__jest__/client_integration/helpers/setup_environment.tsx index 5fb22ecd4d6e7a..f0e681e6c108d8 100644 --- a/x-pack/plugins/index_management/__jest__/client_integration/helpers/setup_environment.tsx +++ b/x-pack/plugins/index_management/__jest__/client_integration/helpers/setup_environment.tsx @@ -83,6 +83,7 @@ const appDependencies = { enableIndexActions: true, enableIndexStats: true, editableIndexSettings: 'all', + enableDataStreamsStorageColumn: true, }, } as any; diff --git a/x-pack/plugins/index_management/__jest__/client_integration/home/data_streams_tab.test.ts b/x-pack/plugins/index_management/__jest__/client_integration/home/data_streams_tab.test.ts index bbb8d924fcd028..dc4c228322bbd3 100644 --- a/x-pack/plugins/index_management/__jest__/client_integration/home/data_streams_tab.test.ts +++ b/x-pack/plugins/index_management/__jest__/client_integration/home/data_streams_tab.test.ts @@ -255,6 +255,35 @@ describe('Data Streams tab', () => { ]); }); + test('hides Storage size column from stats if enableDataStreamsStorageColumn===false', async () => { + testBed = await setup(httpSetup, { + config: { + enableDataStreamsStorageColumn: false, + }, + }); + + const { actions, component, table } = testBed; + + await act(async () => { + actions.goToDataStreamsList(); + }); + + component.update(); + + // Switching the stats on + await act(async () => { + actions.clickIncludeStatsSwitch(); + }); + component.update(); + + // The table renders with the stats columns except the Storage size column + const { tableCellsValues } = table.getMetaData('dataStreamTable'); + expect(tableCellsValues).toEqual([ + ['', 'dataStream1', 'green', 'December 31st, 1969 7:00:00 PM', '1', '7d', 'Delete'], + ['', 'dataStream2', 'green', 'December 31st, 1969 7:00:00 PM', '1', '7d', 'Delete'], + ]); + }); + test('clicking the indices count navigates to the backing indices', async () => { const { table, actions } = testBed; await actions.clickIndicesAt(0); diff --git a/x-pack/plugins/index_management/public/application/app_context.tsx b/x-pack/plugins/index_management/public/application/app_context.tsx index 0f2a03f76011a5..d105e1cb9a131c 100644 --- a/x-pack/plugins/index_management/public/application/app_context.tsx +++ b/x-pack/plugins/index_management/public/application/app_context.tsx @@ -54,6 +54,7 @@ export interface AppDependencies { enableLegacyTemplates: boolean; enableIndexStats: boolean; editableIndexSettings: 'all' | 'limited'; + enableDataStreamsStorageColumn: boolean; }; history: ScopedHistory; setBreadcrumbs: ManagementAppMountParams['setBreadcrumbs']; diff --git a/x-pack/plugins/index_management/public/application/sections/home/data_stream_list/data_stream_table/data_stream_table.tsx b/x-pack/plugins/index_management/public/application/sections/home/data_stream_list/data_stream_table/data_stream_table.tsx index 0bf6aa68347de1..1bf8886ccbf733 100644 --- a/x-pack/plugins/index_management/public/application/sections/home/data_stream_list/data_stream_table/data_stream_table.tsx +++ b/x-pack/plugins/index_management/public/application/sections/home/data_stream_list/data_stream_table/data_stream_table.tsx @@ -18,6 +18,7 @@ import { } from '@elastic/eui'; import { ScopedHistory } from '@kbn/core/public'; +import { useAppContext } from '../../../../app_context'; import { DataStream } from '../../../../../../common/types'; import { getLifecycleValue } from '../../../../lib/data_streams'; import { UseRequestResponse, reactRouterNavigate } from '../../../../../shared_imports'; @@ -46,6 +47,7 @@ export const DataStreamTable: React.FunctionComponent = ({ }) => { const [selection, setSelection] = useState([]); const [dataStreamsToDelete, setDataStreamsToDelete] = useState([]); + const { config } = useAppContext(); const columns: Array> = []; @@ -99,16 +101,18 @@ export const DataStreamTable: React.FunctionComponent = ({ }), }); - columns.push({ - field: 'storageSizeBytes', - name: i18n.translate('xpack.idxMgmt.dataStreamList.table.storageSizeColumnTitle', { - defaultMessage: 'Storage size', - }), - truncateText: true, - sortable: true, - render: (storageSizeBytes: DataStream['storageSizeBytes'], dataStream: DataStream) => - dataStream.storageSize, - }); + if (config.enableDataStreamsStorageColumn) { + columns.push({ + field: 'storageSizeBytes', + name: i18n.translate('xpack.idxMgmt.dataStreamList.table.storageSizeColumnTitle', { + defaultMessage: 'Storage size', + }), + truncateText: true, + sortable: true, + render: (storageSizeBytes: DataStream['storageSizeBytes'], dataStream: DataStream) => + dataStream.storageSize, + }); + } } columns.push({ diff --git a/x-pack/plugins/index_management/public/plugin.ts b/x-pack/plugins/index_management/public/plugin.ts index 8d043ab0af6bca..87b4ff5be220ca 100644 --- a/x-pack/plugins/index_management/public/plugin.ts +++ b/x-pack/plugins/index_management/public/plugin.ts @@ -42,6 +42,7 @@ export class IndexMgmtUIPlugin { enableLegacyTemplates, enableIndexStats, editableIndexSettings, + enableDataStreamsStorageColumn, } = this.ctx.config.get(); if (isIndexManagementUiEnabled) { @@ -52,6 +53,7 @@ export class IndexMgmtUIPlugin { enableLegacyTemplates: enableLegacyTemplates ?? true, enableIndexStats: enableIndexStats ?? true, editableIndexSettings: editableIndexSettings ?? 'all', + enableDataStreamsStorageColumn: enableDataStreamsStorageColumn ?? true, }; management.sections.section.data.registerApp({ id: PLUGIN.id, diff --git a/x-pack/plugins/index_management/public/types.ts b/x-pack/plugins/index_management/public/types.ts index 3a1958c5e7e93d..57ddf10c767fdd 100644 --- a/x-pack/plugins/index_management/public/types.ts +++ b/x-pack/plugins/index_management/public/types.ts @@ -36,4 +36,5 @@ export interface ClientConfigType { enableLegacyTemplates?: boolean; enableIndexStats?: boolean; editableIndexSettings?: 'all' | 'limited'; + enableDataStreamsStorageColumn?: boolean; } diff --git a/x-pack/plugins/index_management/server/config.ts b/x-pack/plugins/index_management/server/config.ts index e629669ed53112..7ee8afc5af5e44 100644 --- a/x-pack/plugins/index_management/server/config.ts +++ b/x-pack/plugins/index_management/server/config.ts @@ -47,6 +47,11 @@ const schemaLatest = schema.object( defaultValue: 'all', }), }), + enableDataStreamsStorageColumn: offeringBasedSchema({ + // The Storage size column in Data streams is disabled in serverless; refer to the serverless.yml file as the source of truth + // We take this approach in order to have a central place (serverless.yml) for serverless config across Kibana + serverless: schema.boolean({ defaultValue: true }), + }), }, { defaultValue: undefined } ); @@ -58,6 +63,7 @@ const configLatest: PluginConfigDescriptor = { enableLegacyTemplates: true, enableIndexStats: true, editableIndexSettings: true, + enableDataStreamsStorageColumn: true, }, schema: schemaLatest, deprecations: ({ unused }) => [unused('dev.enableIndexDetailsPage', { level: 'warning' })], diff --git a/x-pack/plugins/index_management/server/plugin.ts b/x-pack/plugins/index_management/server/plugin.ts index 645a1341b8015a..e7e2982a0e5c0b 100644 --- a/x-pack/plugins/index_management/server/plugin.ts +++ b/x-pack/plugins/index_management/server/plugin.ts @@ -56,6 +56,7 @@ export class IndexMgmtServerPlugin implements Plugin security !== undefined && security.license.isEnabled(), isLegacyTemplatesEnabled: this.config.enableLegacyTemplates, isIndexStatsEnabled: this.config.enableIndexStats, + isDataStreamsStorageColumnEnabled: this.config.enableDataStreamsStorageColumn, }, indexDataEnricher: this.indexDataEnricher, lib: { diff --git a/x-pack/plugins/index_management/server/routes/api/component_templates/register_privileges_route.test.ts b/x-pack/plugins/index_management/server/routes/api/component_templates/register_privileges_route.test.ts index 5582ee014b2c4e..3f6b1114896c64 100644 --- a/x-pack/plugins/index_management/server/routes/api/component_templates/register_privileges_route.test.ts +++ b/x-pack/plugins/index_management/server/routes/api/component_templates/register_privileges_route.test.ts @@ -48,6 +48,7 @@ describe('GET privileges', () => { isSecurityEnabled: () => true, isLegacyTemplatesEnabled: true, isIndexStatsEnabled: true, + isDataStreamsStorageColumnEnabled: true, }, indexDataEnricher: mockedIndexDataEnricher, lib: { @@ -116,6 +117,7 @@ describe('GET privileges', () => { isSecurityEnabled: () => false, isLegacyTemplatesEnabled: true, isIndexStatsEnabled: true, + isDataStreamsStorageColumnEnabled: true, }, indexDataEnricher: mockedIndexDataEnricher, lib: { diff --git a/x-pack/plugins/index_management/server/test/helpers/route_dependencies.ts b/x-pack/plugins/index_management/server/test/helpers/route_dependencies.ts index 241b1271620429..6bde838f3c212a 100644 --- a/x-pack/plugins/index_management/server/test/helpers/route_dependencies.ts +++ b/x-pack/plugins/index_management/server/test/helpers/route_dependencies.ts @@ -14,6 +14,7 @@ export const routeDependencies: Omit = { isSecurityEnabled: jest.fn().mockReturnValue(true), isLegacyTemplatesEnabled: true, isIndexStatsEnabled: true, + isDataStreamsStorageColumnEnabled: true, }, indexDataEnricher: new IndexDataEnricher(), lib: { diff --git a/x-pack/plugins/index_management/server/types.ts b/x-pack/plugins/index_management/server/types.ts index 25a946ee5ffcc4..3ba7ee84a1c555 100644 --- a/x-pack/plugins/index_management/server/types.ts +++ b/x-pack/plugins/index_management/server/types.ts @@ -25,6 +25,7 @@ export interface RouteDependencies { isSecurityEnabled: () => boolean; isLegacyTemplatesEnabled: boolean; isIndexStatsEnabled: boolean; + isDataStreamsStorageColumnEnabled: boolean; }; indexDataEnricher: IndexDataEnricher; lib: { From 0eb59252289a5ff1c2d23bfd26f1780d8c0d9292 Mon Sep 17 00:00:00 2001 From: Gloria Hornero Date: Mon, 23 Oct 2023 19:44:21 +0200 Subject: [PATCH 25/68] [Security Solution] Adds more cypress tests on serverless for investigations team (#169379) --- .../verify_es_serverless_image.yml | 2 +- .buildkite/pipelines/on_merge.yml | 2 +- .buildkite/pipelines/pull_request/base.yml | 2 +- .../investigations/alerts/alerts_charts.cy.ts | 77 +++++++++---------- .../timelines/bulk_add_to_timeline.cy.ts | 2 +- .../investigations/timelines/creation.cy.ts | 26 +++---- .../investigations/timelines/pagination.cy.ts | 10 +-- .../timelines/unsaved_timeline.cy.ts | 2 + 8 files changed, 58 insertions(+), 65 deletions(-) diff --git a/.buildkite/pipelines/es_serverless/verify_es_serverless_image.yml b/.buildkite/pipelines/es_serverless/verify_es_serverless_image.yml index 7538da0cfbd402..c8899ed03731e5 100644 --- a/.buildkite/pipelines/es_serverless/verify_es_serverless_image.yml +++ b/.buildkite/pipelines/es_serverless/verify_es_serverless_image.yml @@ -89,7 +89,7 @@ steps: queue: n2-4-spot depends_on: build timeout_in_minutes: 60 - parallelism: 4 + parallelism: 8 retry: automatic: - exit_status: '*' diff --git a/.buildkite/pipelines/on_merge.yml b/.buildkite/pipelines/on_merge.yml index 815e4d9adb5e2f..b03dc1cd9d913e 100644 --- a/.buildkite/pipelines/on_merge.yml +++ b/.buildkite/pipelines/on_merge.yml @@ -109,7 +109,7 @@ steps: queue: n2-4-spot depends_on: build timeout_in_minutes: 60 - parallelism: 4 + parallelism: 8 retry: automatic: - exit_status: '*' diff --git a/.buildkite/pipelines/pull_request/base.yml b/.buildkite/pipelines/pull_request/base.yml index c1cd68c6b04ab8..c93e2c0a6daf0f 100644 --- a/.buildkite/pipelines/pull_request/base.yml +++ b/.buildkite/pipelines/pull_request/base.yml @@ -87,7 +87,7 @@ steps: queue: n2-4-spot depends_on: build timeout_in_minutes: 60 - parallelism: 4 + parallelism: 8 retry: automatic: - exit_status: '*' diff --git a/x-pack/test/security_solution_cypress/cypress/e2e/investigations/alerts/alerts_charts.cy.ts b/x-pack/test/security_solution_cypress/cypress/e2e/investigations/alerts/alerts_charts.cy.ts index 86dd58889a0a89..91e68ac4d5c8b6 100644 --- a/x-pack/test/security_solution_cypress/cypress/e2e/investigations/alerts/alerts_charts.cy.ts +++ b/x-pack/test/security_solution_cypress/cypress/e2e/investigations/alerts/alerts_charts.cy.ts @@ -25,51 +25,46 @@ import { } from '../../../screens/search_bar'; import { TOASTER } from '../../../screens/alerts_detection_rules'; -// TODO: https://github.com/elastic/kibana/issues/161539 -describe( - 'Histogram legend hover actions', - { tags: ['@ess', '@serverless', '@brokenInServerless'] }, - () => { - const ruleConfigs = getNewRule(); +describe('Histogram legend hover actions', { tags: ['@ess', '@serverless'] }, () => { + const ruleConfigs = getNewRule(); - before(() => { - cleanKibana(); - }); + before(() => { + cleanKibana(); + }); - beforeEach(() => { - login(); - createRule(getNewRule({ rule_id: 'new custom rule' })); - visitWithTimeRange(ALERTS_URL); - selectAlertsHistogram(); - }); + beforeEach(() => { + login(); + createRule(getNewRule({ rule_id: 'new custom rule' })); + visitWithTimeRange(ALERTS_URL); + selectAlertsHistogram(); + }); - it('Filter in/out should add a filter to KQL bar', function () { - const expectedNumberOfAlerts = 2; - clickAlertsHistogramLegend(); - clickAlertsHistogramLegendFilterFor(ruleConfigs.name); - cy.get(GLOBAL_SEARCH_BAR_FILTER_ITEM).should( - 'have.text', - `kibana.alert.rule.name: ${ruleConfigs.name}` - ); - cy.get(ALERTS_COUNT).should('have.text', `${expectedNumberOfAlerts} alerts`); + it('Filter in/out should add a filter to KQL bar', function () { + const expectedNumberOfAlerts = 2; + clickAlertsHistogramLegend(); + clickAlertsHistogramLegendFilterFor(ruleConfigs.name); + cy.get(GLOBAL_SEARCH_BAR_FILTER_ITEM).should( + 'have.text', + `kibana.alert.rule.name: ${ruleConfigs.name}` + ); + cy.get(ALERTS_COUNT).should('have.text', `${expectedNumberOfAlerts} alerts`); - clickAlertsHistogramLegend(); - clickAlertsHistogramLegendFilterOut(ruleConfigs.name); - cy.get(GLOBAL_SEARCH_BAR_FILTER_ITEM).should( - 'have.text', - `NOT kibana.alert.rule.name: ${ruleConfigs.name}` - ); - cy.get(ALERTS_COUNT).should('not.exist'); + clickAlertsHistogramLegend(); + clickAlertsHistogramLegendFilterOut(ruleConfigs.name); + cy.get(GLOBAL_SEARCH_BAR_FILTER_ITEM).should( + 'have.text', + `NOT kibana.alert.rule.name: ${ruleConfigs.name}` + ); + cy.get(ALERTS_COUNT).should('not.exist'); - cy.get(GLOBAL_SEARCH_BAR_FILTER_ITEM_DELETE).click(); - cy.get(GLOBAL_SEARCH_BAR_FILTER_ITEM).should('not.exist'); - }); + cy.get(GLOBAL_SEARCH_BAR_FILTER_ITEM_DELETE).click(); + cy.get(GLOBAL_SEARCH_BAR_FILTER_ITEM).should('not.exist'); + }); - it('Add To Timeline', function () { - clickAlertsHistogramLegend(); - clickAlertsHistogramLegendAddToTimeline(ruleConfigs.name); + it('Add To Timeline', function () { + clickAlertsHistogramLegend(); + clickAlertsHistogramLegendAddToTimeline(ruleConfigs.name); - cy.get(TOASTER).should('have.text', `Added ${ruleConfigs.name} to timeline`); - }); - } -); + cy.get(TOASTER).should('have.text', `Added ${ruleConfigs.name} to timeline`); + }); +}); diff --git a/x-pack/test/security_solution_cypress/cypress/e2e/investigations/timelines/bulk_add_to_timeline.cy.ts b/x-pack/test/security_solution_cypress/cypress/e2e/investigations/timelines/bulk_add_to_timeline.cy.ts index a27be939c1a8eb..348b3a930a92b7 100644 --- a/x-pack/test/security_solution_cypress/cypress/e2e/investigations/timelines/bulk_add_to_timeline.cy.ts +++ b/x-pack/test/security_solution_cypress/cypress/e2e/investigations/timelines/bulk_add_to_timeline.cy.ts @@ -34,7 +34,7 @@ describe('Bulk Investigate in Timeline', { tags: ['@ess', '@serverless'] }, () = cy.task('esArchiverUnload', 'bulk_process'); }); - context('Alerts', { tags: ['@brokenInServerless'] }, () => { + context('Alerts', () => { before(() => { createRule(getNewRule()); }); diff --git a/x-pack/test/security_solution_cypress/cypress/e2e/investigations/timelines/creation.cy.ts b/x-pack/test/security_solution_cypress/cypress/e2e/investigations/timelines/creation.cy.ts index 54fc0978e6120e..b7236d7ea0d809 100644 --- a/x-pack/test/security_solution_cypress/cypress/e2e/investigations/timelines/creation.cy.ts +++ b/x-pack/test/security_solution_cypress/cypress/e2e/investigations/timelines/creation.cy.ts @@ -55,20 +55,16 @@ describe('Create a timeline from a template', { tags: ['@ess', '@serverless'] }, visit(TIMELINE_TEMPLATES_URL); }); - it( - 'Should have the same query and open the timeline modal', - { tags: '@brokenInServerless' }, - () => { - selectCustomTemplates(); - expandEventAction(); - clickingOnCreateTimelineFormTemplateBtn(); - - cy.get(TIMELINE_FLYOUT_WRAPPER).should('have.css', 'visibility', 'visible'); - cy.get(TIMELINE_DESCRIPTION).should('have.text', getTimeline().description); - cy.get(TIMELINE_QUERY).should('have.text', getTimeline().query); - closeTimeline(); - } - ); + it('Should have the same query and open the timeline modal', () => { + selectCustomTemplates(); + expandEventAction(); + clickingOnCreateTimelineFormTemplateBtn(); + + cy.get(TIMELINE_FLYOUT_WRAPPER).should('have.css', 'visibility', 'visible'); + cy.get(TIMELINE_DESCRIPTION).should('have.text', getTimeline().description); + cy.get(TIMELINE_QUERY).should('have.text', getTimeline().query); + closeTimeline(); + }); }); describe('Timelines', (): void => { @@ -112,7 +108,7 @@ describe('Timelines', (): void => { describe( 'Creates a timeline by clicking untitled timeline from bottom bar', - { tags: ['@ess', '@brokenInServerless'] }, + { tags: ['@ess', '@serverless'] }, () => { beforeEach(() => { login(); diff --git a/x-pack/test/security_solution_cypress/cypress/e2e/investigations/timelines/pagination.cy.ts b/x-pack/test/security_solution_cypress/cypress/e2e/investigations/timelines/pagination.cy.ts index 0037ae179c6335..482bf04c048bc3 100644 --- a/x-pack/test/security_solution_cypress/cypress/e2e/investigations/timelines/pagination.cy.ts +++ b/x-pack/test/security_solution_cypress/cypress/e2e/investigations/timelines/pagination.cy.ts @@ -46,15 +46,15 @@ describe('Pagination', { tags: ['@ess', '@serverless'] }, () => { cy.get(TIMELINE_EVENT).should('have.length', defaultPageSize); }); - it(`should select ${defaultPageSize} items per page by default`, () => { - cy.get(TIMELINE_EVENTS_COUNT_PER_PAGE).should('contain.text', defaultPageSize); - }); - - it('should be able to go to next / previous page', { tags: '@brokenInServerless' }, () => { + it('should be able to go to next / previous page', () => { cy.get(`${TIMELINE_FLYOUT} ${TIMELINE_EVENTS_COUNT_NEXT_PAGE}`).first().click(); cy.get(`${TIMELINE_FLYOUT} ${TIMELINE_EVENTS_COUNT_PREV_PAGE}`).first().click(); }); + it(`should select ${defaultPageSize} items per page by default`, () => { + cy.get(TIMELINE_EVENTS_COUNT_PER_PAGE).should('contain.text', defaultPageSize); + }); + it('should be able to change items count per page with the dropdown', () => { const itemsPerPage = 100; cy.get(TIMELINE_EVENTS_COUNT_PER_PAGE_BTN).first().click({ force: true }); diff --git a/x-pack/test/security_solution_cypress/cypress/e2e/investigations/timelines/unsaved_timeline.cy.ts b/x-pack/test/security_solution_cypress/cypress/e2e/investigations/timelines/unsaved_timeline.cy.ts index 6c5e91ba748dca..9f368ca7b1220f 100644 --- a/x-pack/test/security_solution_cypress/cypress/e2e/investigations/timelines/unsaved_timeline.cy.ts +++ b/x-pack/test/security_solution_cypress/cypress/e2e/investigations/timelines/unsaved_timeline.cy.ts @@ -34,6 +34,8 @@ import { } from '../../../tasks/timeline'; import { hostsUrl, MANAGE_URL } from '../../../urls/navigation'; +// https://github.com/elastic/kibana/issues/169021 + describe('Save Timeline Prompts', { tags: ['@ess', '@serverless', '@brokenInServerless'] }, () => { before(() => { cleanKibana(); From 14e636608bab799494a93f8cba53cae2316e649b Mon Sep 17 00:00:00 2001 From: Gloria Hornero Date: Mon, 23 Oct 2023 19:47:17 +0200 Subject: [PATCH 26/68] [Security Solution] Adds serverless specific tests for `pinned_filters` functionality (#169472) --- .../e2e/explore/filters/pinned_filters.cy.ts | 31 ++++++++++++++++++- .../cypress/tasks/serverless/navigation.ts | 18 +++++++++++ 2 files changed, 48 insertions(+), 1 deletion(-) create mode 100644 x-pack/test/security_solution_cypress/cypress/tasks/serverless/navigation.ts diff --git a/x-pack/test/security_solution_cypress/cypress/e2e/explore/filters/pinned_filters.cy.ts b/x-pack/test/security_solution_cypress/cypress/e2e/explore/filters/pinned_filters.cy.ts index e31ff95ea05f78..a9615f27984ea1 100644 --- a/x-pack/test/security_solution_cypress/cypress/e2e/explore/filters/pinned_filters.cy.ts +++ b/x-pack/test/security_solution_cypress/cypress/e2e/explore/filters/pinned_filters.cy.ts @@ -22,8 +22,9 @@ import { } from '../../../tasks/kibana_navigation'; import { ALERTS_PAGE } from '../../../screens/kibana_navigation'; import { postDataView } from '../../../tasks/common'; +import { navigateToAlertsPageInServerless } from '../../../tasks/serverless/navigation'; -describe('pinned filters', { tags: ['@ess', '@serverless', '@brokenInServerless'] }, () => { +describe('ESS - pinned filters', { tags: ['@ess'] }, () => { before(() => { postDataView('audit*'); }); @@ -52,3 +53,31 @@ describe('pinned filters', { tags: ['@ess', '@serverless', '@brokenInServerless' cy.get(GLOBAL_SEARCH_BAR_FILTER_ITEM).should('not.exist'); }); }); + +describe('SERVERLESS - pinned filters', { tags: ['@serverless'] }, () => { + before(() => { + postDataView('audit*'); + }); + + beforeEach(() => { + login(); + }); + + it('show pinned filters on security', () => { + visit(DISCOVER_WITH_PINNED_FILTER_URL); + + cy.get(GLOBAL_SEARCH_BAR_FILTER_ITEM).find(GLOBAL_SEARCH_BAR_PINNED_FILTER).should('exist'); + navigateToAlertsPageInServerless(); + + cy.get(GLOBAL_SEARCH_BAR_FILTER_ITEM).should('have.text', 'host.name: test-host'); + }); + + it('does not show discover filters on security', () => { + visit(DISCOVER_WITH_FILTER_URL); + cy.get(GLOBAL_SEARCH_BAR_FILTER_ITEM).should('exist'); + + navigateToAlertsPageInServerless(); + + cy.get(GLOBAL_SEARCH_BAR_FILTER_ITEM).should('not.exist'); + }); +}); diff --git a/x-pack/test/security_solution_cypress/cypress/tasks/serverless/navigation.ts b/x-pack/test/security_solution_cypress/cypress/tasks/serverless/navigation.ts new file mode 100644 index 00000000000000..3dd31a0ec981c7 --- /dev/null +++ b/x-pack/test/security_solution_cypress/cypress/tasks/serverless/navigation.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; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +const serverlessLocator = { + alerts: '[data-test-subj="solutionSideNavItemLink-alerts"]', +}; + +const navigateTo = (page: string) => { + cy.get(page).click(); +}; + +export const navigateToAlertsPageInServerless = () => { + navigateTo(serverlessLocator.alerts); +}; From 84bb14545e1a56200983f7547588ac3c819ccc9b Mon Sep 17 00:00:00 2001 From: Tiago Costa Date: Mon, 23 Oct 2023 18:56:42 +0100 Subject: [PATCH 27/68] skip flaky suite (#169349) --- .../components/rules_setting/rules_settings_modal.test.tsx | 1 + 1 file changed, 1 insertion(+) diff --git a/x-pack/plugins/triggers_actions_ui/public/application/components/rules_setting/rules_settings_modal.test.tsx b/x-pack/plugins/triggers_actions_ui/public/application/components/rules_setting/rules_settings_modal.test.tsx index c91c6fc654ece0..0a5d985c04ac08 100644 --- a/x-pack/plugins/triggers_actions_ui/public/application/components/rules_setting/rules_settings_modal.test.tsx +++ b/x-pack/plugins/triggers_actions_ui/public/application/components/rules_setting/rules_settings_modal.test.tsx @@ -95,6 +95,7 @@ const RulesSettingsModalWithProviders: React.FunctionComponent { beforeEach(async () => { const [ From 03a6a5cd62c9bca7f91e08ffad2785437aa32c91 Mon Sep 17 00:00:00 2001 From: Tiago Costa Date: Mon, 23 Oct 2023 18:58:08 +0100 Subject: [PATCH 28/68] skip flaky suite (#169329) --- .../components/rules_setting/rules_settings_modal.test.tsx | 1 + 1 file changed, 1 insertion(+) diff --git a/x-pack/plugins/triggers_actions_ui/public/application/components/rules_setting/rules_settings_modal.test.tsx b/x-pack/plugins/triggers_actions_ui/public/application/components/rules_setting/rules_settings_modal.test.tsx index 0a5d985c04ac08..75f70c5c094df2 100644 --- a/x-pack/plugins/triggers_actions_ui/public/application/components/rules_setting/rules_settings_modal.test.tsx +++ b/x-pack/plugins/triggers_actions_ui/public/application/components/rules_setting/rules_settings_modal.test.tsx @@ -96,6 +96,7 @@ const RulesSettingsModalWithProviders: React.FunctionComponent { beforeEach(async () => { const [ From 4af91754e02e1f055d4912b298fd0f7d68740b74 Mon Sep 17 00:00:00 2001 From: Jeramy Soucy Date: Mon, 23 Oct 2023 14:45:36 -0400 Subject: [PATCH 29/68] Fixes issue with removing spaces from related objects in share to space action (#169177) closes #168657 ## Summary Updates the `share to spaces` action to refrain from removing spaces from related objects (objects referenced by the target object). I have also updated the description of issue #130562, which essentially will replace much of the client-side implementation of this action, to explicitly include this behavior. ### Manual Testing - Create 2 spaces: A and B - Add a sample data set (e.g. flight) to space A - In Discover, create a saved query called "s1" (add a filter that uses the sample data logs data view, and use the filter menu button) - Go to `Stack Management->Saved` Objects and share the "s1" query to space B - Verify that the related data view is also shared to space B. - Un-share the "s1" query from space B - Verify that the related data view is still shared to space B. ### Automated Tests - x-pack/plugins/spaces/public/share_saved_objects_to_space/components/share_to_space_flyout_internal.test.tsx --------- Co-authored-by: kibanamachine <42973632+kibanamachine@users.noreply.github.com> --- .../components/selectable_spaces_control.tsx | 2 +- .../components/selectable_spaces_control.tsx | 2 +- .../components/share_mode_control.tsx | 5 +- .../share_to_space_flyout_internal.test.tsx | 104 ++++++++++++++++++ .../share_to_space_flyout_internal.tsx | 51 +++++++-- 5 files changed, 154 insertions(+), 10 deletions(-) diff --git a/x-pack/plugins/spaces/public/copy_saved_objects_to_space/components/selectable_spaces_control.tsx b/x-pack/plugins/spaces/public/copy_saved_objects_to_space/components/selectable_spaces_control.tsx index 5439a6150a7504..474e48f17c8509 100644 --- a/x-pack/plugins/spaces/public/copy_saved_objects_to_space/components/selectable_spaces_control.tsx +++ b/x-pack/plugins/spaces/public/copy_saved_objects_to_space/components/selectable_spaces_control.tsx @@ -42,7 +42,7 @@ export const SelectableSpacesControl = (props: Props) => { content={ } position="left" diff --git a/x-pack/plugins/spaces/public/share_saved_objects_to_space/components/selectable_spaces_control.tsx b/x-pack/plugins/spaces/public/share_saved_objects_to_space/components/selectable_spaces_control.tsx index 08062e0c93f564..99a525d8abf514 100644 --- a/x-pack/plugins/spaces/public/share_saved_objects_to_space/components/selectable_spaces_control.tsx +++ b/x-pack/plugins/spaces/public/share_saved_objects_to_space/components/selectable_spaces_control.tsx @@ -80,7 +80,7 @@ const APPEND_PROHIBITED = ( defaultMessage: 'Cannot share to this space', })} content={i18n.translate('xpack.spaces.shareToSpace.prohibitedSpaceTooltip', { - defaultMessage: 'A copy of this saved object exists in this space.', + defaultMessage: 'A copy of this saved object or a related object exists in this space.', })} position="left" type="iInCircle" diff --git a/x-pack/plugins/spaces/public/share_saved_objects_to_space/components/share_mode_control.tsx b/x-pack/plugins/spaces/public/share_saved_objects_to_space/components/share_mode_control.tsx index e5756b41d438f2..66baa2c5d97b91 100644 --- a/x-pack/plugins/spaces/public/share_saved_objects_to_space/components/share_mode_control.tsx +++ b/x-pack/plugins/spaces/public/share_saved_objects_to_space/components/share_mode_control.tsx @@ -75,7 +75,10 @@ const ALL_SPACES_PROHIBITED_TOOLTIP = ( )} content={i18n.translate( 'xpack.spaces.shareToSpace.shareModeControl.shareToAllSpaces.allSpacesProhibitedTooltipContent', - { defaultMessage: 'A copy of this saved object exists in at least one other space.' } + { + defaultMessage: + 'A copy of this saved object or a related object exists in at least one other space.', + } )} position="left" type="iInCircle" diff --git a/x-pack/plugins/spaces/public/share_saved_objects_to_space/components/share_to_space_flyout_internal.test.tsx b/x-pack/plugins/spaces/public/share_saved_objects_to_space/components/share_to_space_flyout_internal.test.tsx index 42a19fe367dee8..f7e4f3a9bbe6e4 100644 --- a/x-pack/plugins/spaces/public/share_saved_objects_to_space/components/share_to_space_flyout_internal.test.tsx +++ b/x-pack/plugins/spaces/public/share_saved_objects_to_space/components/share_to_space_flyout_internal.test.tsx @@ -388,6 +388,110 @@ describe('ShareToSpaceFlyout', () => { expect(onClose).toHaveBeenCalledTimes(1); }); + describe('handles related objects correctly', () => { + const relatedObject = { + type: 'index-pattern', + id: 'd3d7af60-4c81-11e8-b3d7-01146121b73d', + spaces: ['my-active-space', 'space-1'], + inboundReferences: [ + { + type: 'dashboard', + id: 'my-dash', + name: 'foo', + }, + ], + }; + + it('adds spaces to related objects when only adding spaces', async () => { + const { wrapper, onClose, mockSpacesManager, mockToastNotifications, savedObjectToShare } = + await setup({ + additionalShareableReferences: [relatedObject], + }); + + expect(wrapper.find(ShareToSpaceForm)).toHaveLength(1); + expect(wrapper.find(EuiLoadingSpinner)).toHaveLength(0); + expect(wrapper.find(NoSpacesAvailable)).toHaveLength(0); + + changeSpaceSelection(wrapper, ['space-1', 'space-2']); + await clickButton(wrapper, 'save'); + + const expectedObjects: Array<{ type: string; id: string }> = [ + savedObjectToShare, + relatedObject, + ].map(({ type, id }) => ({ + type, + id, + })); + expect(mockSpacesManager.updateSavedObjectsSpaces).toBeCalledTimes(1); + expect(mockSpacesManager.updateSavedObjectsSpaces).toHaveBeenCalledWith( + expectedObjects, + ['space-2'], + [] + ); + + expect(mockToastNotifications.addSuccess).toHaveBeenCalledTimes(1); + expect(mockToastNotifications.addError).not.toHaveBeenCalled(); + expect(onClose).toHaveBeenCalledTimes(1); + }); + + it('does not remove spaces from related objects when only removing spaces', async () => { + const { wrapper, onClose, mockSpacesManager, mockToastNotifications, savedObjectToShare } = + await setup({ + additionalShareableReferences: [relatedObject], + }); + + expect(wrapper.find(ShareToSpaceForm)).toHaveLength(1); + expect(wrapper.find(EuiLoadingSpinner)).toHaveLength(0); + expect(wrapper.find(NoSpacesAvailable)).toHaveLength(0); + + changeSpaceSelection(wrapper, []); + await clickButton(wrapper, 'save'); + + expect(mockSpacesManager.updateSavedObjectsSpaces).toBeCalledTimes(1); + expect(mockSpacesManager.updateSavedObjectsSpaces).toHaveBeenCalledWith( + [{ type: savedObjectToShare.type, id: savedObjectToShare.id }], + [], + ['space-1'] + ); + + expect(mockToastNotifications.addSuccess).toHaveBeenCalledTimes(1); + expect(mockToastNotifications.addError).not.toHaveBeenCalled(); + expect(onClose).toHaveBeenCalledTimes(1); + }); + + it('adds spaces but does not remove spaces from related objects when adding and removing spaces', async () => { + const { wrapper, onClose, mockSpacesManager, mockToastNotifications, savedObjectToShare } = + await setup({ + additionalShareableReferences: [relatedObject], + }); + + expect(wrapper.find(ShareToSpaceForm)).toHaveLength(1); + expect(wrapper.find(EuiLoadingSpinner)).toHaveLength(0); + expect(wrapper.find(NoSpacesAvailable)).toHaveLength(0); + + changeSpaceSelection(wrapper, ['space-2', 'space-3']); + await clickButton(wrapper, 'save'); + + expect(mockSpacesManager.updateSavedObjectsSpaces).toBeCalledTimes(2); + expect(mockSpacesManager.updateSavedObjectsSpaces).toHaveBeenNthCalledWith( + 1, + [{ type: savedObjectToShare.type, id: savedObjectToShare.id }], + ['space-2', 'space-3'], + ['space-1'] + ); + expect(mockSpacesManager.updateSavedObjectsSpaces).toHaveBeenNthCalledWith( + 2, + [{ type: relatedObject.type, id: relatedObject.id }], + ['space-2', 'space-3'], + [] + ); + + expect(mockToastNotifications.addSuccess).toHaveBeenCalledTimes(1); + expect(mockToastNotifications.addError).not.toHaveBeenCalled(); + expect(onClose).toHaveBeenCalledTimes(1); + }); + }); + describe('correctly renders share mode control', () => { function getDescriptionAndWarning(wrapper: ReactWrapper) { const descriptionNode = findTestSubject(wrapper, 'share-mode-control-description'); diff --git a/x-pack/plugins/spaces/public/share_saved_objects_to_space/components/share_to_space_flyout_internal.tsx b/x-pack/plugins/spaces/public/share_saved_objects_to_space/components/share_to_space_flyout_internal.tsx index 96ca0e2917c9d0..4c4404e953175a 100644 --- a/x-pack/plugins/spaces/public/share_saved_objects_to_space/components/share_to_space_flyout_internal.tsx +++ b/x-pack/plugins/spaces/public/share_saved_objects_to_space/components/share_to_space_flyout_internal.tsx @@ -85,27 +85,55 @@ function createDefaultChangeSpacesHandler( spacesToRemove: string[] ) => { const { title } = object; - const objectsToUpdate = objects.map(({ type, id }) => ({ type, id })); // only use 'type' and 'id' fields + const objectsToUpdate: Array<{ type: string; id: string }> = objects.map(({ type, id }) => ({ + type, + id, + })); // only use 'type' and 'id' fields const relativesCount = objects.length - 1; const toastTitle = i18n.translate('xpack.spaces.shareToSpace.shareSuccessTitle', { values: { objectNoun: object.noun }, defaultMessage: 'Updated {objectNoun}', description: `Object noun can be plural or singular, examples: "Updated objects", "Updated job"`, }); - await spacesManager.updateSavedObjectsSpaces(objectsToUpdate, spacesToAdd, spacesToRemove); + + // If removing spaces and there are referenced objects ("related objects" in UI), + // only remove spaces from the target object. + if (spacesToRemove.length > 0 && objectsToUpdate.length > 1) { + const indexOfTarget = objectsToUpdate.findIndex((element) => element.id === object.id); + if (indexOfTarget >= 0) { + objectsToUpdate.splice(indexOfTarget, 1); + } + + const updateTarget = spacesManager.updateSavedObjectsSpaces( + [{ type: object.type, id: object.id }], + spacesToAdd, + spacesToRemove + ); + + // Only if there are also spaces being added, affect any referenced/related objects + const updateRelated = + spacesToAdd.length > 0 + ? spacesManager.updateSavedObjectsSpaces(objectsToUpdate, spacesToAdd, []) + : undefined; + + await Promise.all([updateTarget, updateRelated]); + } else { + await spacesManager.updateSavedObjectsSpaces(objectsToUpdate, spacesToAdd, spacesToRemove); + } const isSharedToAllSpaces = spacesToAdd.includes(ALL_SPACES_ID); let toastText: string; + if (spacesToAdd.length > 0 && spacesToRemove.length > 0 && !isSharedToAllSpaces) { toastText = i18n.translate('xpack.spaces.shareToSpace.shareSuccessAddRemoveText', { - defaultMessage: `'{object}' {relativesCount, plural, =0 {was} =1 {and {relativesCount} related object were} other {and {relativesCount} related objects were}} added to {spacesTargetAdd} and removed from {spacesTargetRemove}.`, + defaultMessage: `'{object}' {relativesCount, plural, =0 {was} =1 {and {relativesCount} related object were} other {and {relativesCount} related objects were}} added to {spacesTargetAdd}. '{object}' was removed from {spacesTargetRemove}.`, values: { object: title, relativesCount, spacesTargetAdd: getSpacesTargetString(spacesToAdd), spacesTargetRemove: getSpacesTargetString(spacesToRemove), }, - description: `Uses output of xpack.spaces.shareToSpace.spacesTarget or xpack.spaces.shareToSpace.allSpacesTarget as 'spacesTarget...' inputs. Example strings: "'Finance dashboard' was added to 1 space and removed from 2 spaces.", "'Finance dashboard' and 2 related objects were added to 3 spaces and removed from all spaces."`, + description: `Uses output of xpack.spaces.shareToSpace.spacesTarget or xpack.spaces.shareToSpace.allSpacesTarget as 'spacesTarget...' inputs. Example strings: "'Finance dashboard' was added to 1 space. 'Finance dashboard' was removed from 2 spaces.", "'Finance dashboard' and 2 related objects were added to 3 spaces. 'Finance dashboard' was removed from all spaces."`, }); } else if (spacesToAdd.length > 0) { toastText = i18n.translate('xpack.spaces.shareToSpace.shareSuccessAddText', { @@ -119,13 +147,12 @@ function createDefaultChangeSpacesHandler( }); } else { toastText = i18n.translate('xpack.spaces.shareToSpace.shareSuccessRemoveText', { - defaultMessage: `'{object}' {relativesCount, plural, =0 {was} =1 {and {relativesCount} related object were} other {and {relativesCount} related objects were}} removed from {spacesTarget}.`, + defaultMessage: `'{object}' was removed from {spacesTarget}.`, values: { object: title, - relativesCount, spacesTarget: getSpacesTargetString(spacesToRemove), }, - description: `Uses output of xpack.spaces.shareToSpace.spacesTarget or xpack.spaces.shareToSpace.allSpacesTarget as 'spacesTarget' input. Example strings: "'Finance dashboard' was removed from 1 space.", "'Finance dashboard' and 2 related objects were removed from all spaces."`, + description: `Uses output of xpack.spaces.shareToSpace.spacesTarget or xpack.spaces.shareToSpace.allSpacesTarget as 'spacesTarget' input. Example string: "'Finance dashboard' was removed from 1 space.", "'Finance dashboard' was removed from all spaces."`, }); } toastNotifications.addSuccess({ title: toastTitle, text: toastText }); @@ -149,6 +176,7 @@ export const ShareToSpaceFlyoutInternal = (props: ShareToSpaceFlyoutProps) => { }), [object] ); + const { flyoutIcon, flyoutTitle = i18n.translate('xpack.spaces.shareToSpace.flyoutTitle', { @@ -322,6 +350,15 @@ export const ShareToSpaceFlyoutInternal = (props: ShareToSpaceFlyoutProps) => { title: i18n.translate('xpack.spaces.shareToSpace.shareErrorTitle', { values: { objectNoun: savedObjectTarget.noun }, defaultMessage: 'Error updating {objectNoun}', + description: `Object noun can be plural or singular, examples: "Failed to update objects", "Failed to update job"`, + }), + toastMessage: i18n.translate('xpack.spaces.shareToSpace.shareErrorText', { + defaultMessage: `Unable to update '{object}' {relativesCount, plural, =0 {} =1 {or {relativesCount} related object} other {or one or more of {relativesCount} related objects}}.`, + values: { + object: savedObjectTarget.title, + relativesCount: spacesToAdd.length > 0 ? referenceGraph.length - 1 : 0, + }, + description: `Uses output of xpack.spaces.shareToSpace.spacesTarget or xpack.spaces.shareToSpace.allSpacesTarget as 'spacesTarget...' inputs. Example strings: "'Finance dashboard' was added to 1 space. 'Finance dashboard' was removed from 2 spaces.", "'Finance dashboard' and 2 related objects were added to 3 spaces. 'Finance dashboard' was removed from all spaces."`, }), }); } From 0ec93317c1d099e29dbfac2327df449cc1da0a40 Mon Sep 17 00:00:00 2001 From: Jon Date: Mon, 23 Oct 2023 13:47:15 -0500 Subject: [PATCH 30/68] [ci/pull_requests] Disable kibana-kme-test (#169238) Introduced in https://github.com/elastic/kibana/pull/157334 This pipeline was/(is?) used for testing the new buildkite system. We're running into an issue where `trigger_comment_regex` matches on both the legacy and new systems, triggering builds in both. GitHub checks can end up conflicting making it difficult to find the correct build link. This disables the pr integration for kibana-kme-test. If we're done with the testing pipeline we can remove it, if not we can change the trigger word. I'm not sure what the current status is, ping @elastic/ci-systems . --- .buildkite/pull_requests.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.buildkite/pull_requests.json b/.buildkite/pull_requests.json index c9089007e87037..41de2dc843d4da 100644 --- a/.buildkite/pull_requests.json +++ b/.buildkite/pull_requests.json @@ -55,7 +55,7 @@ "repoName": "kibana", "pipelineSlug": "kibana-kme-test", - "enabled": true, + "enabled": false, "allow_org_users": true, "allowed_repo_permissions": ["admin", "write"], "allowed_list": ["barlowm", "renovate[bot]"], From b66c5c9ca578c6835a39e074cb624fc07084d59f Mon Sep 17 00:00:00 2001 From: Jon Date: Mon, 23 Oct 2023 13:49:58 -0500 Subject: [PATCH 31/68] [ci] Remove async from gpctl-promote trigger (#169464) This removes async so we can catch and route failure notifications. --- .buildkite/scripts/steps/artifacts/docker_image.sh | 1 - 1 file changed, 1 deletion(-) diff --git a/.buildkite/scripts/steps/artifacts/docker_image.sh b/.buildkite/scripts/steps/artifacts/docker_image.sh index 85df443af08b55..d57770cdaddf95 100755 --- a/.buildkite/scripts/steps/artifacts/docker_image.sh +++ b/.buildkite/scripts/steps/artifacts/docker_image.sh @@ -104,7 +104,6 @@ if [[ "$BUILDKITE_BRANCH" == "$KIBANA_BASE_BRANCH" ]] && [[ "${BUILDKITE_PULL_RE cat << EOF | buildkite-agent pipeline upload steps: - label: ":argo: Update kibana image tag for kibana-controller using gpctl" - async: true branches: main trigger: gpctl-promote-with-e2e-tests build: From 416a95417da98228b3243642ee95b3be3ec35dcd Mon Sep 17 00:00:00 2001 From: Nathan L Smith Date: Mon, 23 Oct 2023 13:50:50 -0500 Subject: [PATCH 32/68] Enable infra in serverless (#167559) Branch with Infra UI enabled in Serverless. This exists for us to have a working environment based on main, but with infra turned on. We could merge this at a later date when we plan to enable Infra on serverless. Fixes https://github.com/elastic/kibana/issues/167850 Fixes #168065 Fixes #168853 --- config/serverless.oblt.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/config/serverless.oblt.yml b/config/serverless.oblt.yml index a1d0edce6f168c..26b4d6cac9e29b 100644 --- a/config/serverless.oblt.yml +++ b/config/serverless.oblt.yml @@ -3,7 +3,7 @@ ## Disable plugins enterpriseSearch.enabled: false xpack.cloudSecurityPosture.enabled: false -xpack.infra.enabled: false +xpack.infra.enabled: true xpack.securitySolution.enabled: false xpack.uptime.enabled: false xpack.legacy_uptime.enabled: false @@ -56,8 +56,8 @@ xpack.fleet.packages: ## Disable APM UI components and API calls xpack.apm.featureFlags.agentConfigurationAvailable: false xpack.apm.featureFlags.configurableIndicesAvailable: false -xpack.apm.featureFlags.infrastructureTabAvailable: false -xpack.apm.featureFlags.infraUiAvailable: false +xpack.apm.featureFlags.infrastructureTabAvailable: true +xpack.apm.featureFlags.infraUiAvailable: true xpack.apm.featureFlags.migrationToFleetAvailable: false xpack.apm.featureFlags.sourcemapApiAvailable: false xpack.apm.featureFlags.storageExplorerAvailable: false From 2bbfd64668f201616c2d327bd0238cf324e2dad7 Mon Sep 17 00:00:00 2001 From: Kevin Delemme Date: Mon, 23 Oct 2023 15:26:20 -0400 Subject: [PATCH 33/68] feat(slo): return early when no update is made (#169546) --- .../server/services/slo/update_slo.test.ts | 119 ++++++++++++++++++ .../server/services/slo/update_slo.ts | 12 +- 2 files changed, 129 insertions(+), 2 deletions(-) diff --git a/x-pack/plugins/observability/server/services/slo/update_slo.test.ts b/x-pack/plugins/observability/server/services/slo/update_slo.test.ts index f5b6ec0e9bcb01..797f6eb2218ee0 100644 --- a/x-pack/plugins/observability/server/services/slo/update_slo.test.ts +++ b/x-pack/plugins/observability/server/services/slo/update_slo.test.ts @@ -7,6 +7,8 @@ import { ElasticsearchClient } from '@kbn/core/server'; import { elasticsearchServiceMock } from '@kbn/core/server/mocks'; +import { UpdateSLOParams } from '@kbn/slo-schema'; +import { cloneDeep, pick, omit } from 'lodash'; import { getSLOTransformId, @@ -38,6 +40,123 @@ describe('UpdateSLO', () => { updateSLO = new UpdateSLO(mockRepository, mockTransformManager, mockEsClient); }); + describe('when the update payload does not change the original SLO', () => { + function expectNoCallsToAnyMocks() { + expect(mockTransformManager.stop).not.toBeCalled(); + expect(mockTransformManager.uninstall).not.toBeCalled(); + expect(mockTransformManager.install).not.toBeCalled(); + expect(mockTransformManager.preview).not.toBeCalled(); + expect(mockTransformManager.start).not.toBeCalled(); + expect(mockEsClient.deleteByQuery).not.toBeCalled(); + } + + it('returns early with a full identical SLO payload', async () => { + const slo = createSLO(); + mockRepository.findById.mockResolvedValueOnce(slo); + const updatePayload: UpdateSLOParams = omit(cloneDeep(slo), [ + 'id', + 'revision', + 'createdAt', + 'updatedAt', + 'enabled', + ]); + + await updateSLO.execute(slo.id, updatePayload); + + expectNoCallsToAnyMocks(); + }); + + it('returns early with identical name', async () => { + const slo = createSLO(); + mockRepository.findById.mockResolvedValueOnce(slo); + const updatePayload: UpdateSLOParams = pick(cloneDeep(slo), ['name']); + + await updateSLO.execute(slo.id, updatePayload); + + expectNoCallsToAnyMocks(); + }); + + it('returns early with identical indicator', async () => { + const slo = createSLO(); + mockRepository.findById.mockResolvedValueOnce(slo); + const updatePayload: UpdateSLOParams = pick(cloneDeep(slo), ['indicator']); + + await updateSLO.execute(slo.id, updatePayload); + + expectNoCallsToAnyMocks(); + }); + + it('returns early with identical timeWindow', async () => { + const slo = createSLO(); + mockRepository.findById.mockResolvedValueOnce(slo); + const updatePayload: UpdateSLOParams = pick(cloneDeep(slo), ['timeWindow']); + + await updateSLO.execute(slo.id, updatePayload); + + expectNoCallsToAnyMocks(); + }); + + it('returns early with identical budgetingMethod', async () => { + const slo = createSLO(); + mockRepository.findById.mockResolvedValueOnce(slo); + const updatePayload: UpdateSLOParams = pick(cloneDeep(slo), ['budgetingMethod']); + + await updateSLO.execute(slo.id, updatePayload); + + expectNoCallsToAnyMocks(); + }); + + it('returns early with identical description', async () => { + const slo = createSLO(); + mockRepository.findById.mockResolvedValueOnce(slo); + const updatePayload: UpdateSLOParams = pick(cloneDeep(slo), ['description']); + + await updateSLO.execute(slo.id, updatePayload); + + expectNoCallsToAnyMocks(); + }); + + it('returns early with identical groupBy', async () => { + const slo = createSLO({ groupBy: 'project.id' }); + mockRepository.findById.mockResolvedValueOnce(slo); + const updatePayload: UpdateSLOParams = pick(cloneDeep(slo), ['groupBy']); + + await updateSLO.execute(slo.id, updatePayload); + + expectNoCallsToAnyMocks(); + }); + + it('returns early with identical objective', async () => { + const slo = createSLO(); + mockRepository.findById.mockResolvedValueOnce(slo); + const updatePayload: UpdateSLOParams = pick(cloneDeep(slo), ['objective']); + + await updateSLO.execute(slo.id, updatePayload); + + expectNoCallsToAnyMocks(); + }); + + it('returns early with identical tags', async () => { + const slo = createSLO(); + mockRepository.findById.mockResolvedValueOnce(slo); + const updatePayload: UpdateSLOParams = pick(cloneDeep(slo), ['tags']); + + await updateSLO.execute(slo.id, updatePayload); + + expectNoCallsToAnyMocks(); + }); + + it('returns early with identical settings', async () => { + const slo = createSLO(); + mockRepository.findById.mockResolvedValueOnce(slo); + const updatePayload: UpdateSLOParams = pick(cloneDeep(slo), ['settings']); + + await updateSLO.execute(slo.id, updatePayload); + + expectNoCallsToAnyMocks(); + }); + }); + it('updates the settings correctly', async () => { const slo = createSLO(); mockRepository.findById.mockResolvedValueOnce(slo); diff --git a/x-pack/plugins/observability/server/services/slo/update_slo.ts b/x-pack/plugins/observability/server/services/slo/update_slo.ts index 504d3658474580..97f6ed2e7bba3b 100644 --- a/x-pack/plugins/observability/server/services/slo/update_slo.ts +++ b/x-pack/plugins/observability/server/services/slo/update_slo.ts @@ -7,6 +7,7 @@ import { ElasticsearchClient } from '@kbn/core/server'; import { UpdateSLOParams, UpdateSLOResponse, updateSLOResponseSchema } from '@kbn/slo-schema'; +import { isEqual } from 'lodash'; import { getSLOTransformId, SLO_DESTINATION_INDEX_PATTERN, @@ -28,10 +29,17 @@ export class UpdateSLO { public async execute(sloId: string, params: UpdateSLOParams): Promise { const originalSlo = await this.repository.findById(sloId); - const updatedSlo: SLO = Object.assign({}, originalSlo, params, { + let updatedSlo: SLO = Object.assign({}, originalSlo, params, { + groupBy: !!params.groupBy ? params.groupBy : originalSlo.groupBy, + }); + + if (isEqual(originalSlo, updatedSlo)) { + return this.toResponse(originalSlo); + } + + updatedSlo = Object.assign(updatedSlo, { updatedAt: new Date(), revision: originalSlo.revision + 1, - groupBy: !!params.groupBy ? params.groupBy : originalSlo.groupBy, }); validateSLO(updatedSlo); From 513a31f83f454fbc83dfe983877620147c982833 Mon Sep 17 00:00:00 2001 From: Nick Peihl Date: Mon, 23 Oct 2023 15:28:04 -0400 Subject: [PATCH 34/68] [Dashboard navigation] Fix flaky test (#167896) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Fixes #167713 and #169276 ## Summary It appears the dashboard links were not ready (still loading) when the test was trying to click on them. When they finish loading the element was stale, triggering the StaleElement error. This PR calls the RenderCompleteDispatcher on the Links embeddable when all of the child components have finished loading. In a future PR, we should consider re-factoring such that the async dashboard fetching happens in the LinksComponent and the results are passed as props to the DashboardLinkComponents. This would be more React-like. I resisted making that change in this PR so that we can fix the reporting error for v8.11. ## Flaky test runner 🤞 https://buildkite.com/elastic/kibana-flaky-test-suite-runner/builds/3636 --------- Co-authored-by: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> --- .../dashboard_link_component.test.tsx | 75 +++++++++++++++++-- .../dashboard_link_component.tsx | 21 +++++- .../external_link_component.test.tsx | 18 ++++- .../external_link/external_link_component.tsx | 7 ++ .../public/components/links_component.tsx | 24 +++++- .../public/embeddable/links_embeddable.tsx | 24 +++++- .../links/links_navigation.ts | 38 +++++++--- 7 files changed, 180 insertions(+), 27 deletions(-) diff --git a/src/plugins/links/public/components/dashboard_link/dashboard_link_component.test.tsx b/src/plugins/links/public/components/dashboard_link/dashboard_link_component.test.tsx index 90dbdd434e2eb6..cb2479bfb5f51d 100644 --- a/src/plugins/links/public/components/dashboard_link/dashboard_link_component.test.tsx +++ b/src/plugins/links/public/components/dashboard_link/dashboard_link_component.test.tsx @@ -54,6 +54,9 @@ describe('Dashboard link component', () => { type: 'dashboardLink' as const, }; + const onLoading = jest.fn(); + const onRender = jest.fn(); + let linksEmbeddable: LinksEmbeddable; beforeEach(async () => { window.open = jest.fn(); @@ -76,10 +79,16 @@ describe('Dashboard link component', () => { test('by default uses navigateToApp to open in same tab', async () => { render( - + ); + await waitFor(() => expect(onLoading).toHaveBeenCalledTimes(1)); await waitFor(() => expect(fetchDashboard).toHaveBeenCalledTimes(1)); expect(fetchDashboard).toHaveBeenCalledWith(defaultLinkInfo.destination); expect(getDashboardLocator).toHaveBeenCalledTimes(1); @@ -90,6 +99,7 @@ describe('Dashboard link component', () => { }, linksEmbeddable, }); + await waitFor(() => expect(onRender).toHaveBeenCalledTimes(1)); const link = await screen.findByTestId('dashboardLink--foo'); expect(link).toHaveTextContent('another dashboard'); @@ -104,10 +114,17 @@ describe('Dashboard link component', () => { test('modified click does not trigger event.preventDefault', async () => { render( - + ); + await waitFor(() => expect(onLoading).toHaveBeenCalledTimes(1)); await waitFor(() => expect(fetchDashboard).toHaveBeenCalledTimes(1)); + await waitFor(() => expect(onRender).toHaveBeenCalledTimes(1)); const link = await screen.findByTestId('dashboardLink--foo'); const clickEvent = createEvent.click(link, { ctrlKey: true }); const preventDefault = jest.spyOn(clickEvent, 'preventDefault'); @@ -122,12 +139,19 @@ describe('Dashboard link component', () => { }; render( - + ); + await waitFor(() => expect(onLoading).toHaveBeenCalledTimes(1)); await waitFor(() => expect(fetchDashboard).toHaveBeenCalledTimes(1)); expect(fetchDashboard).toHaveBeenCalledWith(linkInfo.destination); expect(getDashboardLocator).toHaveBeenCalledWith({ link: linkInfo, linksEmbeddable }); + await waitFor(() => expect(onRender).toHaveBeenCalledTimes(1)); const link = await screen.findByTestId('dashboardLink--foo'); expect(link).toBeInTheDocument(); await userEvent.click(link); @@ -147,11 +171,18 @@ describe('Dashboard link component', () => { }; render( - + ); + await waitFor(() => expect(onLoading).toHaveBeenCalledTimes(1)); await waitFor(() => expect(fetchDashboard).toHaveBeenCalledTimes(1)); expect(getDashboardLocator).toHaveBeenCalledWith({ link: linkInfo, linksEmbeddable }); + await waitFor(() => expect(onRender).toHaveBeenCalledTimes(1)); }); test('shows an error when fetchDashboard fails', async () => { @@ -162,10 +193,17 @@ describe('Dashboard link component', () => { }; render( - + ); + await waitFor(() => expect(onLoading).toHaveBeenCalledTimes(1)); await waitFor(() => expect(fetchDashboard).toHaveBeenCalledTimes(1)); + await waitFor(() => expect(onRender).toHaveBeenCalledTimes(1)); const link = await screen.findByTestId('dashboardLink--notfound--error'); expect(link).toHaveTextContent(DashboardLinkStrings.getDashboardErrorLabel()); }); @@ -178,10 +216,17 @@ describe('Dashboard link component', () => { }; render( - + ); + await waitFor(() => expect(onLoading).toHaveBeenCalledTimes(1)); await waitFor(() => expect(fetchDashboard).toHaveBeenCalledTimes(1)); + await waitFor(() => expect(onRender).toHaveBeenCalledTimes(1)); const link = await screen.findByTestId('dashboardLink--bar'); expect(link).toHaveTextContent('current dashboard'); await userEvent.click(link); @@ -192,10 +237,17 @@ describe('Dashboard link component', () => { test('shows dashboard title and description in tooltip', async () => { render( - + ); + await waitFor(() => expect(onLoading).toHaveBeenCalledTimes(1)); await waitFor(() => expect(fetchDashboard).toHaveBeenCalledTimes(1)); + await waitFor(() => expect(onRender).toHaveBeenCalledTimes(1)); const link = await screen.findByTestId('dashboardLink--foo'); await userEvent.hover(link); const tooltip = await screen.findByTestId('dashboardLink--foo--tooltip'); @@ -211,10 +263,17 @@ describe('Dashboard link component', () => { }; render( - + ); + await waitFor(() => expect(onLoading).toHaveBeenCalledTimes(1)); await waitFor(() => expect(fetchDashboard).toHaveBeenCalledTimes(1)); + await waitFor(() => expect(onRender).toHaveBeenCalledTimes(1)); const link = await screen.findByTestId('dashboardLink--foo'); expect(link).toHaveTextContent(label); await userEvent.hover(link); diff --git a/src/plugins/links/public/components/dashboard_link/dashboard_link_component.tsx b/src/plugins/links/public/components/dashboard_link/dashboard_link_component.tsx index 563cf6277c796a..38097b478509af 100644 --- a/src/plugins/links/public/components/dashboard_link/dashboard_link_component.tsx +++ b/src/plugins/links/public/components/dashboard_link/dashboard_link_component.tsx @@ -8,7 +8,7 @@ import classNames from 'classnames'; import useAsync from 'react-use/lib/useAsync'; -import React, { useMemo, useState } from 'react'; +import React, { useEffect, useMemo, useState } from 'react'; import useObservable from 'react-use/lib/useObservable'; import { @@ -27,9 +27,13 @@ import { fetchDashboard, getDashboardHref, getDashboardLocator } from './dashboa export const DashboardLinkComponent = ({ link, layout, + onLoading, + onRender, }: { link: Link; layout: LinksLayoutType; + onLoading: () => void; + onRender: () => void; }) => { const linksEmbeddable = useLinks(); const [error, setError] = useState(); @@ -133,6 +137,21 @@ export const DashboardLinkComponent = ({ }; }, [link]); + useEffect(() => { + if (loadingDestinationDashboard || loadingOnClickProps) { + onLoading(); + } else { + onRender(); + } + }, [ + link, + linksEmbeddable, + loadingDestinationDashboard, + loadingOnClickProps, + onLoading, + onRender, + ]); + const id = `dashboardLink--${link.id}`; return loadingDestinationDashboard ? ( diff --git a/src/plugins/links/public/components/external_link/external_link_component.test.tsx b/src/plugins/links/public/components/external_link/external_link_component.test.tsx index 1afdc17c435636..02f984435f8ba7 100644 --- a/src/plugins/links/public/components/external_link/external_link_component.test.tsx +++ b/src/plugins/links/public/components/external_link/external_link_component.test.tsx @@ -17,6 +17,8 @@ import { ExternalLinkComponent } from './external_link_component'; import { coreServices } from '../../services/kibana_services'; import { DEFAULT_URL_DRILLDOWN_OPTIONS } from '@kbn/ui-actions-enhanced-plugin/public'; +const onRender = jest.fn(); + describe('external link component', () => { const defaultLinkInfo = { destination: 'https://example.com', @@ -38,10 +40,15 @@ describe('external link component', () => { test('by default opens in new tab', async () => { render( - + ); + expect(onRender).toBeCalledTimes(1); const link = await screen.findByTestId('externalLink--foo'); expect(link).toBeInTheDocument(); await userEvent.click(link); @@ -55,9 +62,10 @@ describe('external link component', () => { }; render( - + ); + expect(onRender).toBeCalledTimes(1); const link = await screen.findByTestId('externalLink--foo'); expect(link).toHaveTextContent('https://example.com'); const clickEvent = createEvent.click(link, { ctrlKey: true }); @@ -73,9 +81,10 @@ describe('external link component', () => { }; render( - + ); + expect(onRender).toBeCalledTimes(1); const link = await screen.findByTestId('externalLink--foo'); await userEvent.click(link); expect(coreServices.application.navigateToUrl).toBeCalledTimes(1); @@ -89,9 +98,10 @@ describe('external link component', () => { }; render( - + ); + expect(onRender).toBeCalledTimes(1); const link = await screen.findByTestId('externalLink--foo--error'); expect(link).toBeDisabled(); /** diff --git a/src/plugins/links/public/components/external_link/external_link_component.tsx b/src/plugins/links/public/components/external_link/external_link_component.tsx index 9c2231fe6b711a..ac409cfbac4cf8 100644 --- a/src/plugins/links/public/components/external_link/external_link_component.tsx +++ b/src/plugins/links/public/components/external_link/external_link_component.tsx @@ -7,6 +7,7 @@ */ import React, { useMemo, useState } from 'react'; +import useMount from 'react-use/lib/useMount'; import { UrlDrilldownOptions, @@ -21,12 +22,18 @@ import { Link, LinksLayoutType, LINKS_VERTICAL_LAYOUT } from '../../../common/co export const ExternalLinkComponent = ({ link, layout, + onRender, }: { link: Link; layout: LinksLayoutType; + onRender: () => void; }) => { const [error, setError] = useState(); + useMount(() => { + onRender(); + }); + const linkOptions = useMemo(() => { return { ...DEFAULT_URL_DRILLDOWN_OPTIONS, diff --git a/src/plugins/links/public/components/links_component.tsx b/src/plugins/links/public/components/links_component.tsx index 9400dc9fe7308e..c72c0db04fd570 100644 --- a/src/plugins/links/public/components/links_component.tsx +++ b/src/plugins/links/public/components/links_component.tsx @@ -6,7 +6,8 @@ * Side Public License, v 1. */ -import React, { useMemo } from 'react'; +import React, { useEffect, useMemo } from 'react'; +import useMap from 'react-use/lib/useMap'; import { EuiListGroup, EuiPanel } from '@elastic/eui'; import { useLinks } from '../embeddable/links_embeddable'; import { ExternalLinkComponent } from './external_link/external_link_component'; @@ -25,6 +26,22 @@ export const LinksComponent = () => { const links = linksEmbeddable.select((state) => state.componentState.links); const layout = linksEmbeddable.select((state) => state.componentState.layout); + const [linksLoading, { set: setLinkIsLoading }] = useMap( + Object.fromEntries( + (links ?? []).map((link) => { + return [link.id, true]; + }) + ) + ); + + useEffect(() => { + if (Object.values(linksLoading).includes(true)) { + linksEmbeddable.onLoading(); + } else { + linksEmbeddable.onRender(); + } + }, [linksLoading, linksEmbeddable]); + const orderedLinks = useMemo(() => { if (!links) return []; return memoizedGetOrderedLinkList(links); @@ -42,18 +59,21 @@ export const LinksComponent = () => { key={currentLink.id} link={currentLink} layout={layout ?? LINKS_VERTICAL_LAYOUT} + onLoading={() => setLinkIsLoading(currentLink.id, true)} + onRender={() => setLinkIsLoading(currentLink.id, false)} /> ) : ( setLinkIsLoading(currentLink.id, false)} /> ), }, }; }, {}); - }, [links, layout]); + }, [links, layout, setLinkIsLoading]); return ( diff --git a/test/functional/apps/dashboard_elements/links/links_navigation.ts b/test/functional/apps/dashboard_elements/links/links_navigation.ts index c4adf6e2c70420..d9f6f5b2bb6a9d 100644 --- a/test/functional/apps/dashboard_elements/links/links_navigation.ts +++ b/test/functional/apps/dashboard_elements/links/links_navigation.ts @@ -18,13 +18,17 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { const kibanaServer = getService('kibanaServer'); const dashboardAddPanel = getService('dashboardAddPanel'); - const { dashboard, common, timePicker } = getPageObjects(['dashboard', 'common', 'timePicker']); + const { dashboard, common, header, timePicker } = getPageObjects([ + 'dashboard', + 'common', + 'header', + 'timePicker', + ]); const FROM_TIME = 'Oct 22, 2018 @ 00:00:00.000'; const TO_TIME = 'Dec 3, 2018 @ 00:00:00.000'; - // Failing: See https://github.com/elastic/kibana/issues/167713 - describe.skip('links panel navigation', () => { + describe('links panel navigation', () => { before(async () => { await kibanaServer.savedObjects.cleanStandardList(); await security.testUser.setRoles([ @@ -84,6 +88,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { it('should disable link if dashboard does not exist', async () => { await dashboard.loadSavedDashboard('links 001'); + await dashboard.waitForRenderComplete(); expect(await testSubjects.exists('dashboardLink--link004--error')).to.be(true); expect(await testSubjects.isEnabled('dashboardLink--link004--error')).to.be(false); }); @@ -96,10 +101,13 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { * but should not override the date range. */ await dashboard.loadSavedDashboard('links 002'); - await testSubjects.click('dashboardLink--link001'); + await dashboard.waitForRenderComplete(); + await testSubjects.clickWhenNotDisabled('dashboardLink--link001'); + await header.waitUntilLoadingHasFinished(); expect(await dashboard.getDashboardIdFromCurrentUrl()).to.equal( '0930f310-5bc2-11ee-9a85-7b86504227bc' ); + await dashboard.waitForRenderComplete(); // Should pass the filters expect(await filterBar.getFilterCount()).to.equal(2); const filterLabels = await filterBar.getFiltersLabel(); @@ -127,10 +135,14 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { * but should not pass its filters. */ await dashboard.loadSavedDashboard('links 001'); - await testSubjects.click('dashboardLink--link002'); + await dashboard.waitForRenderComplete(); + await testSubjects.clickWhenNotDisabled('dashboardLink--link002'); + await header.waitUntilLoadingHasFinished(); expect(await dashboard.getDashboardIdFromCurrentUrl()).to.equal( '24751520-5bc2-11ee-9a85-7b86504227bc' ); + + await dashboard.waitForRenderComplete(); // Should pass the date range const time = await timePicker.getTimeConfig(); expect(time.start).to.be('Oct 31, 2018 @ 00:00:00.000'); @@ -157,7 +169,9 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { * to dashboard links003. */ await dashboard.loadSavedDashboard('links 001'); - await testSubjects.click('dashboardLink--link003'); + await dashboard.waitForRenderComplete(); + await testSubjects.clickWhenNotDisabled('dashboardLink--link003'); + await header.waitUntilLoadingHasFinished(); // Should have opened another tab const windowHandlers = await browser.getAllWindowHandles(); @@ -167,6 +181,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { '27398c50-5bc2-11ee-9a85-7b86504227bc' ); + await dashboard.waitForRenderComplete(); // Should not pass any filters expect((await filterBar.getFiltersLabel()).length).to.equal(0); @@ -180,6 +195,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { describe('external links', () => { before(async () => { await dashboard.loadSavedDashboard('dashboard with external links'); + await header.waitUntilLoadingHasFinished(); }); afterEach(async () => { @@ -197,8 +213,10 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { expect(isDisabled).to.be('true'); }); - it('should create an external link when openInNewTab is enabled', async () => { - await testSubjects.click('externalLink--link999'); + // TODO We should not be using an external website for our tests. This will be flaky + // if external network connectivity issues exist. + it.skip('should create an external link when openInNewTab is enabled', async () => { + await testSubjects.clickWhenNotDisabled('externalLink--link999'); // Should have opened another tab const windowHandlers = await browser.getAllWindowHandles(); @@ -208,8 +226,8 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { expect(currentUrl).to.be('https://example.com/1'); }); - it('should open in same tab when openInNewTab is disabled', async () => { - await testSubjects.click('externalLink--link888'); + it.skip('should open in same tab when openInNewTab is disabled', async () => { + await testSubjects.clickWhenNotDisabled('externalLink--link888'); // Should have opened in the same tab const windowHandlers = await browser.getAllWindowHandles(); From ccf07deb875ee3897e902e873d907989c5ee8e0f Mon Sep 17 00:00:00 2001 From: Jon Date: Mon, 23 Oct 2023 14:32:47 -0500 Subject: [PATCH 35/68] [ci] Move cypress burn tests out of base pull request pipeline (#169326) Currently operations does not have a good mechanism for communicating soft failures, leading to confusion on pull requests. We're tracking support for soft failures at https://github.com/elastic/kibana/issues/169244. For example, in https://github.com/elastic/kibana/pull/169309, it doesn't makes sense for the author to be responsible for fixing flakiness here, so we need to make it clear it can be ignored or find a way to skip this step in similar situations. This moves the cypress burn out of the base pull request pipeline, behind the `ci:all-cypress-suites` and `ci:cypress-burn` labels. I'm open to all improvements here, not sure this quite finds the right balance between stability and noise. --- .buildkite/pipelines/pull_request/base.yml | 43 ------------------- .../pipelines/pull_request/cypress_burn.yml | 43 +++++++++++++++++++ .../pipelines/pull_request/pipeline.ts | 7 +++ 3 files changed, 50 insertions(+), 43 deletions(-) create mode 100644 .buildkite/pipelines/pull_request/cypress_burn.yml diff --git a/.buildkite/pipelines/pull_request/base.yml b/.buildkite/pipelines/pull_request/base.yml index c93e2c0a6daf0f..21da1c794cd897 100644 --- a/.buildkite/pipelines/pull_request/base.yml +++ b/.buildkite/pipelines/pull_request/base.yml @@ -141,17 +141,6 @@ steps: - exit_status: '*' limit: 1 - - command: .buildkite/scripts/steps/functional/defend_workflows_burn.sh - label: 'Defend Workflows Cypress Tests, burning changed specs' - agents: - queue: n2-4-virt - depends_on: build - timeout_in_minutes: 60 - soft_fail: true - parallelism: 1 - retry: - automatic: false - - command: .buildkite/scripts/steps/functional/defend_workflows_serverless.sh label: 'Defend Workflows Cypress Tests on Serverless' agents: @@ -164,17 +153,6 @@ steps: - exit_status: '*' limit: 1 - - command: .buildkite/scripts/steps/functional/defend_workflows_serverless_burn.sh - label: 'Defend Workflows Cypress Tests on Serverless, burning changed specs' - agents: - queue: n2-4-virt - depends_on: build - timeout_in_minutes: 60 - soft_fail: true - parallelism: 1 - retry: - automatic: false - - command: .buildkite/scripts/steps/functional/threat_intelligence.sh label: 'Threat Intelligence Cypress Tests' agents: @@ -199,27 +177,6 @@ steps: - exit_status: '*' limit: 1 - - command: .buildkite/scripts/steps/functional/security_solution_burn.sh - label: 'Security Solution Cypress tests, burning changed specs' - agents: - queue: n2-4-spot - depends_on: build - timeout_in_minutes: 60 - parallelism: 1 - retry: - automatic: false - soft_fail: true - - - command: .buildkite/scripts/steps/functional/osquery_cypress_burn.sh - label: 'Osquery Cypress Tests, burning changed specs' - agents: - queue: n2-4-spot - depends_on: build - timeout_in_minutes: 50 - soft_fail: true - retry: - automatic: false - - command: .buildkite/scripts/steps/functional/security_serverless_osquery.sh label: 'Serverless Osquery Cypress Tests' agents: diff --git a/.buildkite/pipelines/pull_request/cypress_burn.yml b/.buildkite/pipelines/pull_request/cypress_burn.yml new file mode 100644 index 00000000000000..20dc2fd7a13b99 --- /dev/null +++ b/.buildkite/pipelines/pull_request/cypress_burn.yml @@ -0,0 +1,43 @@ +steps: + - command: .buildkite/scripts/steps/functional/defend_workflows_burn.sh + label: 'Defend Workflows Cypress Tests, burning changed specs' + agents: + queue: n2-4-virt + depends_on: build + timeout_in_minutes: 60 + soft_fail: true + parallelism: 1 + retry: + automatic: false + + - command: .buildkite/scripts/steps/functional/defend_workflows_serverless_burn.sh + label: 'Defend Workflows Cypress Tests on Serverless, burning changed specs' + agents: + queue: n2-4-virt + depends_on: build + timeout_in_minutes: 60 + soft_fail: true + parallelism: 1 + retry: + automatic: false + + - command: .buildkite/scripts/steps/functional/security_solution_burn.sh + label: 'Security Solution Cypress tests, burning changed specs' + agents: + queue: n2-4-spot + depends_on: build + timeout_in_minutes: 60 + parallelism: 1 + retry: + automatic: false + soft_fail: true + + - command: .buildkite/scripts/steps/functional/osquery_cypress_burn.sh + label: 'Osquery Cypress Tests, burning changed specs' + agents: + queue: n2-4-spot + depends_on: build + timeout_in_minutes: 50 + soft_fail: true + retry: + automatic: false \ No newline at end of file diff --git a/.buildkite/scripts/pipelines/pull_request/pipeline.ts b/.buildkite/scripts/pipelines/pull_request/pipeline.ts index 7a7fa0f59b9c70..3eb5fd250e2b75 100644 --- a/.buildkite/scripts/pipelines/pull_request/pipeline.ts +++ b/.buildkite/scripts/pipelines/pull_request/pipeline.ts @@ -164,6 +164,13 @@ const uploadPipeline = (pipelineContent: string | object) => { pipeline.push(getPipeline('.buildkite/pipelines/pull_request/check_next_docs.yml')); } + if ( + GITHUB_PR_LABELS.includes('ci:cypress-burn') || + GITHUB_PR_LABELS.includes('ci:all-cypress-suites') + ) { + pipeline.push(getPipeline('.buildkite/pipelines/pull_request/cypress_burn.yml')); + } + pipeline.push(getPipeline('.buildkite/pipelines/pull_request/post_build.yml')); // remove duplicated steps From 9d139f6192647a91010e95c84d651644158abc69 Mon Sep 17 00:00:00 2001 From: Jon Date: Mon, 23 Oct 2023 14:49:06 -0500 Subject: [PATCH 36/68] [build/docker] Upgrade Ubuntu base image to 22.04 (#162282) Release note: The default container's base image has been upgraded from Ubuntu 20.04 to 22.04 --- docs/setup/docker.asciidoc | 2 +- src/dev/build/tasks/os_packages/docker_generator/run.ts | 2 +- .../os_packages/docker_generator/templates/base/Dockerfile | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/setup/docker.asciidoc b/docs/setup/docker.asciidoc index 4dcd80d1bfd66b..d8c09b39a3cc4a 100644 --- a/docs/setup/docker.asciidoc +++ b/docs/setup/docker.asciidoc @@ -10,7 +10,7 @@ :es-docker-image: {es-docker-repo}:{version} Docker images for {kib} are available from the Elastic Docker registry. The -base image is https://hub.docker.com/_/ubuntu[ubuntu:20.04]. +base image is https://hub.docker.com/_/ubuntu[ubuntu:22.04]. A list of all published Docker images and tags is available at https://www.docker.elastic.co[www.docker.elastic.co]. The source code is in diff --git a/src/dev/build/tasks/os_packages/docker_generator/run.ts b/src/dev/build/tasks/os_packages/docker_generator/run.ts index f9da19183d866a..636096b921b07d 100644 --- a/src/dev/build/tasks/os_packages/docker_generator/run.ts +++ b/src/dev/build/tasks/os_packages/docker_generator/run.ts @@ -39,7 +39,7 @@ export async function runDockerGenerator( } ) { let baseImageName = ''; - if (flags.baseImage === 'ubuntu') baseImageName = 'ubuntu:20.04'; + if (flags.baseImage === 'ubuntu') baseImageName = 'ubuntu:22.04'; if (flags.baseImage === 'ubi8') baseImageName = 'docker.elastic.co/ubi8/ubi-minimal:latest'; if (flags.baseImage === 'ubi9') baseImageName = 'docker.elastic.co/ubi9/ubi-minimal:latest'; diff --git a/src/dev/build/tasks/os_packages/docker_generator/templates/base/Dockerfile b/src/dev/build/tasks/os_packages/docker_generator/templates/base/Dockerfile index 8db4b419a184af..73968d57529f62 100644 --- a/src/dev/build/tasks/os_packages/docker_generator/templates/base/Dockerfile +++ b/src/dev/build/tasks/os_packages/docker_generator/templates/base/Dockerfile @@ -189,7 +189,7 @@ ENTRYPOINT ["/bin/tini", "--"] CMD ["/app/kibana.sh"] # Generate a stub command that will be overwritten at runtime RUN mkdir /app && \ - echo -e '#!/bin/bash\nexec /usr/local/bin/kibana-docker' > /app/kibana.sh && \ + /usr/bin/echo -e '#!/bin/bash\nexec /usr/local/bin/kibana-docker' > /app/kibana.sh && \ chmod 0555 /app/kibana.sh {{/cloud}} From eea3b1b8f46071eb2f154b07d3fd472a9ae09964 Mon Sep 17 00:00:00 2001 From: Hannah Mudge Date: Mon, 23 Oct 2023 13:57:51 -0600 Subject: [PATCH 37/68] [Controls] Fix flaky time slider test (#169553) Closes https://github.com/elastic/kibana/issues/169404 ## Summary The `Pin start` tooltip has a tendency to get in the way of the `timeSlider-nextTimeWindow` button: ![image](https://github.com/elastic/kibana/assets/8698078/dc4855ab-6c59-4003-83f1-de778f97b0f8) To prevent this, I've made it so that the popover is closed **before** the `next` button is pressed. ### [Flaky Test Runner](https://buildkite.com/elastic/kibana-flaky-test-suite-runner/builds/3681) ![image](https://github.com/elastic/kibana/assets/8698078/d339d256-dced-4bbd-b287-e04cd1268835) ### Checklist - [x] [Unit or functional tests](https://www.elastic.co/guide/en/kibana/master/development-tests.html) were updated or added to match the most common scenarios ### For maintainers - [ ] This was checked for breaking API changes and was [labeled appropriately](https://www.elastic.co/guide/en/kibana/master/contributing.html#kibana-release-notes-process) --------- Co-authored-by: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> --- .../apps/dashboard_elements/controls/common/time_slider.ts | 1 - test/functional/page_objects/dashboard_page_controls.ts | 1 + 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/test/functional/apps/dashboard_elements/controls/common/time_slider.ts b/test/functional/apps/dashboard_elements/controls/common/time_slider.ts index 520ef6560735f1..c860af183d64e9 100644 --- a/test/functional/apps/dashboard_elements/controls/common/time_slider.ts +++ b/test/functional/apps/dashboard_elements/controls/common/time_slider.ts @@ -106,7 +106,6 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { const valueAfter = await dashboardControls.getTimeSliceFromTimeSlider(); expect(valueBefore).to.not.equal(valueAfter); - await dashboardControls.closeTimeSliderPopover(); await dashboard.clickCancelOutOfEditMode(); const valueNow = await dashboardControls.getTimeSliceFromTimeSlider(); expect(valueNow).to.equal(valueBefore); diff --git a/test/functional/page_objects/dashboard_page_controls.ts b/test/functional/page_objects/dashboard_page_controls.ts index f3d828a04d9cc9..effac6f9fbdf9a 100644 --- a/test/functional/page_objects/dashboard_page_controls.ts +++ b/test/functional/page_objects/dashboard_page_controls.ts @@ -721,6 +721,7 @@ export class DashboardPageControls extends FtrService { // Time slider functions public async gotoNextTimeSlice() { + await this.closeTimeSliderPopover(); // prevents the pin tooltip from getting in the way await this.testSubjects.click('timeSlider-nextTimeWindow'); } From 88beee900f563ed3a0abe972499693b8590e5337 Mon Sep 17 00:00:00 2001 From: Cee Chen <549407+cee-chen@users.noreply.github.com> Date: Mon, 23 Oct 2023 13:02:38 -0700 Subject: [PATCH 38/68] [triggers_actions_ui] Harden intermittently flaky RTL test (#169446) I noticed this test flaking on CI a separate PR that was not touching any related code and was able to repro 1 failure locally. Thought I'd push up a test util for y'all that DRYs out the `waitFor` logic and hardens your tests to not throw on `get`. --- .../rules_settings_modal.test.tsx | 72 +++++++++---------- 1 file changed, 34 insertions(+), 38 deletions(-) diff --git a/x-pack/plugins/triggers_actions_ui/public/application/components/rules_setting/rules_settings_modal.test.tsx b/x-pack/plugins/triggers_actions_ui/public/application/components/rules_setting/rules_settings_modal.test.tsx index 75f70c5c094df2..7552b3fac7e26c 100644 --- a/x-pack/plugins/triggers_actions_ui/public/application/components/rules_setting/rules_settings_modal.test.tsx +++ b/x-pack/plugins/triggers_actions_ui/public/application/components/rules_setting/rules_settings_modal.test.tsx @@ -8,7 +8,7 @@ import React from 'react'; import { QueryClient, QueryClientProvider } from '@tanstack/react-query'; import { __IntlProvider as IntlProvider } from '@kbn/i18n-react'; -import { render, fireEvent, cleanup, waitFor } from '@testing-library/react'; +import { render, screen, fireEvent, cleanup, waitFor } from '@testing-library/react'; import userEvent from '@testing-library/user-event'; import { coreMock } from '@kbn/core/public/mocks'; import { IToasts } from '@kbn/core/public'; @@ -94,10 +94,27 @@ const RulesSettingsModalWithProviders: React.FunctionComponent ); -// FLAKY: https://github.com/elastic/kibana/issues/169406 -// FLAKY: https://github.com/elastic/kibana/issues/169349 -// FLAKY: https://github.com/elastic/kibana/issues/169329 -describe.skip('rules_settings_modal', () => { +const waitForModalLoad = async (options?: { + flappingSection?: boolean; + queryDelaySection?: boolean; +}) => { + await waitFor(() => { + expect(screen.queryByTestId('centerJustifiedSpinner')).toBe(null); + }); + + const { flappingSection = true, queryDelaySection = true } = options || {}; + + await waitFor(() => { + if (flappingSection) { + expect(screen.queryByTestId('rulesSettingsFlappingSection')).toBeInTheDocument(); + } + if (queryDelaySection) { + expect(screen.queryByTestId('rulesSettingsQueryDelaySection')).toBeInTheDocument(); + } + }); +}; + +describe('rules_settings_modal', () => { beforeEach(async () => { const [ { @@ -138,9 +155,7 @@ describe.skip('rules_settings_modal', () => { test('renders flapping settings correctly', async () => { const result = render(); expect(getFlappingSettingsMock).toHaveBeenCalledTimes(1); - await waitFor(() => { - expect(result.queryByTestId('centerJustifiedSpinner')).toBe(null); - }); + await waitForModalLoad(); expect( result.getByTestId('rulesSettingsFlappingEnableSwitch').getAttribute('aria-checked') ).toBe('true'); @@ -153,9 +168,7 @@ describe.skip('rules_settings_modal', () => { test('can save flapping settings', async () => { const result = render(); - await waitFor(() => { - expect(result.queryByTestId('centerJustifiedSpinner')).toBe(null); - }); + await waitForModalLoad(); const lookBackWindowInput = result.getByTestId('lookBackWindowRangeInput'); const statusChangeThresholdInput = result.getByTestId('statusChangeThresholdRangeInput'); @@ -189,9 +202,7 @@ describe.skip('rules_settings_modal', () => { test('should prevent statusChangeThreshold from being greater than lookBackWindow', async () => { const result = render(); - await waitFor(() => { - expect(result.queryByTestId('centerJustifiedSpinner')).toBe(null); - }); + await waitForModalLoad(); const lookBackWindowInput = result.getByTestId('lookBackWindowRangeInput'); const statusChangeThresholdInput = result.getByTestId('statusChangeThresholdRangeInput'); @@ -214,9 +225,7 @@ describe.skip('rules_settings_modal', () => { updateFlappingSettingsMock.mockRejectedValue('failed!'); const result = render(); - await waitFor(() => { - expect(result.queryByTestId('centerJustifiedSpinner')).toBe(null); - }); + await waitForModalLoad(); const lookBackWindowInput = result.getByTestId('lookBackWindowRangeInput'); const statusChangeThresholdInput = result.getByTestId('statusChangeThresholdRangeInput'); @@ -240,9 +249,7 @@ describe.skip('rules_settings_modal', () => { test('displays flapping detection off prompt when flapping is disabled', async () => { const result = render(); - await waitFor(() => { - expect(result.queryByTestId('centerJustifiedSpinner')).toBe(null); - }); + await waitForModalLoad(); expect(result.queryByTestId('rulesSettingsFlappingOffPrompt')).toBe(null); userEvent.click(result.getByTestId('rulesSettingsFlappingEnableSwitch')); @@ -265,9 +272,7 @@ describe.skip('rules_settings_modal', () => { }, }; const result = render(); - await waitFor(() => { - expect(result.queryByTestId('centerJustifiedSpinner')).toBe(null); - }); + await waitForModalLoad({ queryDelaySection: false }); expect(result.getByTestId('rulesSettingsFlappingEnableSwitch')).toBeDisabled(); expect(result.getByTestId('lookBackWindowRangeInput')).toBeDisabled(); @@ -290,6 +295,7 @@ describe.skip('rules_settings_modal', () => { readFlappingSettingsUI: false, }, }; + await waitForModalLoad({ flappingSection: false, queryDelaySection: false }); const result = render(); await waitFor(() => { @@ -302,9 +308,7 @@ describe.skip('rules_settings_modal', () => { test('renders query delay settings correctly', async () => { const result = render(); expect(getQueryDelaySettingsMock).toHaveBeenCalledTimes(1); - await waitFor(() => { - expect(result.queryByTestId('centerJustifiedSpinner')).toBe(null); - }); + await waitForModalLoad(); expect(result.getByTestId('queryDelayRangeInput').getAttribute('value')).toBe('10'); expect(result.getByTestId('rulesSettingsModalCancelButton')).toBeInTheDocument(); @@ -313,9 +317,7 @@ describe.skip('rules_settings_modal', () => { test('can save query delay settings', async () => { const result = render(); - await waitFor(() => { - expect(result.queryByTestId('centerJustifiedSpinner')).toBe(null); - }); + await waitForModalLoad(); const queryDelayRangeInput = result.getByTestId('queryDelayRangeInput'); fireEvent.change(queryDelayRangeInput, { target: { value: 20 } }); @@ -344,9 +346,7 @@ describe.skip('rules_settings_modal', () => { updateQueryDelaySettingsMock.mockRejectedValue('failed!'); const result = render(); - await waitFor(() => { - expect(result.queryByTestId('centerJustifiedSpinner')).toBe(null); - }); + await waitForModalLoad(); const queryDelayRangeInput = result.getByTestId('queryDelayRangeInput'); fireEvent.change(queryDelayRangeInput, { target: { value: 20 } }); @@ -379,9 +379,7 @@ describe.skip('rules_settings_modal', () => { }, }; const result = render(); - await waitFor(() => { - expect(result.queryByTestId('centerJustifiedSpinner')).toBe(null); - }); + await waitForModalLoad({ flappingSection: false }); expect(result.getByTestId('queryDelayRangeInput')).toBeDisabled(); expect(result.getByTestId('rulesSettingsModalSaveButton')).toBeDisabled(); @@ -404,9 +402,7 @@ describe.skip('rules_settings_modal', () => { }; const result = render(); - await waitFor(() => { - expect(result.queryByTestId('centerJustifiedSpinner')).toBe(null); - }); + await waitForModalLoad({ flappingSection: false, queryDelaySection: false }); expect(result.queryByTestId('rulesSettingsQueryDelaySection')).toBe(null); }); From 1659434b94a8557e6f735166f7be59f0d692b3dd Mon Sep 17 00:00:00 2001 From: Lisa Cawley Date: Mon, 23 Oct 2023 13:24:13 -0700 Subject: [PATCH 39/68] [OAS] Custom fields in case APIs (#169327) --- .../plugins/cases/docs/openapi/bundled.json | 2047 +++++++++-------- .../plugins/cases/docs/openapi/bundled.yaml | 1324 +++++++---- .../examples/add_comment_response.yaml | 13 +- .../examples/create_case_request.yaml | 9 +- .../examples/create_case_response.yaml | 14 +- .../examples/find_case_activity_response.yaml | 31 +- .../examples/find_case_response.yaml | 23 +- .../examples/get_case_activity_response.yaml | 72 - .../get_case_configuration_response.yaml | 25 + .../examples/get_case_response.yaml | 36 +- .../examples/get_comment_response.yaml | 5 +- .../examples/get_reporters_response.yaml | 17 +- .../examples/get_status_response.yaml | 7 - .../set_case_configuration_request.yaml | 7 +- .../set_case_configuration_response.yaml | 10 +- .../update_case_configuration_request.yaml | 18 + .../update_case_configuration_response.yaml | 43 + .../examples/update_case_request.yaml | 16 +- .../examples/update_case_response.yaml | 25 +- .../examples/update_comment_response.yaml | 21 +- .../alert_comment_response_properties.yaml | 12 + .../schemas/case_configure_customfields.yaml | 24 + .../case_configure_response_properties.yaml | 16 + .../components/schemas/case_customfields.yaml | 25 + .../schemas/case_response_properties.yaml | 12 + .../schemas/create_case_request.yaml | 18 +- .../schemas/custom_fields_property.yaml | 31 - .../set_case_configuration_request.yaml | 25 +- .../update_case_configuration_request.yaml | 13 + .../schemas/update_case_request.yaml | 26 +- .../cases/docs/openapi/entrypoint.yaml | 6 +- .../cases/docs/openapi/paths/api@cases.yaml | 11 +- .../docs/openapi/paths/api@cases@_find.yaml | 4 - .../paths/api@cases@alerts@{alertid}.yaml | 6 +- .../openapi/paths/api@cases@configure.yaml | 13 +- .../api@cases@configure@connectors@_find.yaml | 4 - ...api@cases@configure@{configurationid}.yaml | 20 +- .../openapi/paths/api@cases@reporters.yaml | 10 +- .../docs/openapi/paths/api@cases@status.yaml | 7 - .../docs/openapi/paths/api@cases@tags.yaml | 6 +- .../openapi/paths/api@cases@{caseid}.yaml | 6 +- .../paths/api@cases@{caseid}@alerts.yaml | 6 +- .../paths/api@cases@{caseid}@comments.yaml | 11 - ...i@cases@{caseid}@comments@{commentid}.yaml | 8 +- ...caseid}@connector@{connectorid}@_push.yaml | 6 +- .../api@cases@{caseid}@user_actions.yaml | 7 - ...api@cases@{caseid}@user_actions@_find.yaml | 4 - .../openapi/paths/s@{spaceid}@api@cases.yaml | 9 - .../paths/s@{spaceid}@api@cases@_find.yaml | 4 - ...@{spaceid}@api@cases@alerts@{alertid}.yaml | 6 +- .../s@{spaceid}@api@cases@configure.yaml | 11 +- ...@api@cases@configure@connectors@_find.yaml | 4 - ...api@cases@configure@{configurationid}.yaml | 18 +- .../s@{spaceid}@api@cases@reporters.yaml | 8 +- .../paths/s@{spaceid}@api@cases@status.yaml | 8 +- .../paths/s@{spaceid}@api@cases@tags.yaml | 4 - .../paths/s@{spaceid}@api@cases@{caseid}.yaml | 4 - ...s@{spaceid}@api@cases@{caseid}@alerts.yaml | 4 - ...{spaceid}@api@cases@{caseid}@comments.yaml | 11 - ...id}@api@cases@{caseid}@comments@_find.yaml | 5 - ...i@cases@{caseid}@comments@{commentid}.yaml | 8 +- ...caseid}@connector@{connectorid}@_push.yaml | 4 - ...ceid}@api@cases@{caseid}@user_actions.yaml | 9 +- ...api@cases@{caseid}@user_actions@_find.yaml | 4 - 64 files changed, 2409 insertions(+), 1812 deletions(-) delete mode 100644 x-pack/plugins/cases/docs/openapi/components/examples/get_case_activity_response.yaml create mode 100644 x-pack/plugins/cases/docs/openapi/components/examples/get_case_configuration_response.yaml delete mode 100644 x-pack/plugins/cases/docs/openapi/components/examples/get_status_response.yaml create mode 100644 x-pack/plugins/cases/docs/openapi/components/examples/update_case_configuration_request.yaml create mode 100644 x-pack/plugins/cases/docs/openapi/components/examples/update_case_configuration_response.yaml create mode 100644 x-pack/plugins/cases/docs/openapi/components/schemas/case_configure_customfields.yaml create mode 100644 x-pack/plugins/cases/docs/openapi/components/schemas/case_customfields.yaml delete mode 100644 x-pack/plugins/cases/docs/openapi/components/schemas/custom_fields_property.yaml diff --git a/x-pack/plugins/cases/docs/openapi/bundled.json b/x-pack/plugins/cases/docs/openapi/bundled.json index 9ef79cb9203ed4..e0b2171463f985 100644 --- a/x-pack/plugins/cases/docs/openapi/bundled.json +++ b/x-pack/plugins/cases/docs/openapi/bundled.json @@ -14,8 +14,12 @@ }, "servers": [ { - "url": "http://localhost:5601", - "description": "local" + "url": "https://{kibanaUrl}", + "variables": { + "kibanaUrl": { + "default": "localhost:5601" + } + } } ], "security": [ @@ -87,12 +91,7 @@ } } } - }, - "servers": [ - { - "url": "https://localhost:5601" - } - ] + } }, "delete": { "summary": "Deletes one or more cases in the default space.", @@ -123,12 +122,7 @@ } } } - }, - "servers": [ - { - "url": "https://localhost:5601" - } - ] + } }, "patch": { "summary": "Updates one or more cases in the default space.", @@ -185,18 +179,8 @@ } } } - }, - "servers": [ - { - "url": "https://localhost:5601" - } - ] - }, - "servers": [ - { - "url": "https://localhost:5601" } - ] + } }, "/api/cases/_find": { "get": { @@ -309,18 +293,8 @@ } } } - }, - "servers": [ - { - "url": "https://localhost:5601" - } - ] - }, - "servers": [ - { - "url": "https://localhost:5601" } - ] + } }, "/api/cases/alerts/{alertId}": { "get": { @@ -380,18 +354,8 @@ } } } - }, - "servers": [ - { - "url": "https://localhost:5601" - } - ] - }, - "servers": [ - { - "url": "https://localhost:5601s" } - ] + } }, "/api/cases/configure": { "get": { @@ -419,6 +383,40 @@ "closure_type": { "$ref": "#/components/schemas/closure_types" }, + "customFields": { + "type": "array", + "x-technical-preview": true, + "description": "Custom fields configuration details.", + "items": { + "type": "object", + "properties": { + "key": { + "description": "A unique key for the custom field. Must be lower case and composed only of a-z, 0-9, '_', and '-' characters. It is used in API calls to refer to a specific custom field.\n", + "type": "string", + "minLength": 1, + "maxLength": 36 + }, + "label": { + "description": "The custom field label that is displayed in the case.", + "type": "string", + "minLength": 1, + "maxLength": 50 + }, + "required": { + "description": "Indicates whether the field is required. If `false`, the custom field can be set to null or omitted when a case is created or updated.\n", + "type": "boolean" + }, + "type": { + "description": "The type of the custom field.", + "type": "string", + "enum": [ + "text", + "toggle" + ] + } + } + } + }, "connector": { "type": "object", "properties": { @@ -449,6 +447,11 @@ }, "created_by": { "type": "object", + "required": [ + "email", + "full_name", + "username" + ], "properties": { "email": { "type": "string", @@ -511,6 +514,11 @@ }, "updated_by": { "type": "object", + "required": [ + "email", + "full_name", + "username" + ], "properties": { "email": { "type": "string", @@ -540,6 +548,11 @@ } } } + }, + "examples": { + "getConfigurationResponse": { + "$ref": "#/components/examples/get_case_configuration_response" + } } } } @@ -554,15 +567,10 @@ } } } - }, - "servers": [ - { - "url": "https://localhost:5601" - } - ] + } }, "post": { - "summary": "Sets external connection details, such as the closure type and default connector for cases in the default space.", + "summary": "Creates a case specific configuration that includes external connection details and custom fields.", "operationId": "setCaseConfigurationDefaultSpace", "description": "You must have `all` privileges for the **Cases** feature in the **Management**, **Observability**, or **Security** section of the Kibana feature privileges, depending on the owner of the case configuration. Connectors are used to interface with external systems. You must create a connector before you can use it in your cases. Refer to the add connectors API. If you set a default connector, it is automatically selected when you create cases in Kibana. If you use the create case API, however, you must still specify all of the connector details.\n", "tags": [ @@ -598,6 +606,40 @@ "closure_type": { "$ref": "#/components/schemas/closure_types" }, + "customFields": { + "type": "array", + "x-technical-preview": true, + "description": "Custom fields configuration details.", + "items": { + "type": "object", + "properties": { + "key": { + "description": "A unique key for the custom field. Must be lower case and composed only of a-z, 0-9, '_', and '-' characters. It is used in API calls to refer to a specific custom field.\n", + "type": "string", + "minLength": 1, + "maxLength": 36 + }, + "label": { + "description": "The custom field label that is displayed in the case.", + "type": "string", + "minLength": 1, + "maxLength": 50 + }, + "required": { + "description": "Indicates whether the field is required. If `false`, the custom field can be set to null or omitted when a case is created or updated.\n", + "type": "boolean" + }, + "type": { + "description": "The type of the custom field.", + "type": "string", + "enum": [ + "text", + "toggle" + ] + } + } + } + }, "connector": { "type": "object", "properties": { @@ -628,6 +670,11 @@ }, "created_by": { "type": "object", + "required": [ + "email", + "full_name", + "username" + ], "properties": { "email": { "type": "string", @@ -690,6 +737,11 @@ }, "updated_by": { "type": "object", + "required": [ + "email", + "full_name", + "username" + ], "properties": { "email": { "type": "string", @@ -737,18 +789,8 @@ } } } - }, - "servers": [ - { - "url": "https://localhost:5601" - } - ] - }, - "servers": [ - { - "url": "https://localhost:5601" } - ] + } }, "/api/cases/configure/{configurationId}": { "patch": { @@ -771,6 +813,11 @@ "application/json": { "schema": { "$ref": "#/components/schemas/update_case_configuration_request" + }, + "examples": { + "updateCaseConfigurationRequest": { + "$ref": "#/components/examples/update_case_configuration_request" + } } } } @@ -781,134 +828,180 @@ "content": { "application/json": { "schema": { - "type": "array", - "items": { - "type": "object", - "properties": { - "closure_type": { - "$ref": "#/components/schemas/closure_types" - }, - "connector": { - "type": "object", - "properties": { - "fields": { - "description": "The fields specified in the case configuration are not used and are not propagated to individual cases, therefore it is recommended to set it to `null`.", - "nullable": true, - "type": "object" - }, - "id": { - "description": "The identifier for the connector. If you do not want a default connector, use `none`. To retrieve connector IDs, use the find connectors API.", - "type": "string", - "example": "none" - }, - "name": { - "description": "The name of the connector. If you do not want a default connector, use `none`. To retrieve connector names, use the find connectors API.", - "type": "string", - "example": "none" - }, - "type": { - "$ref": "#/components/schemas/connector_types" - } - } - }, - "created_at": { - "type": "string", - "format": "date-time", - "example": "2022-06-01T17:07:17.767Z" - }, - "created_by": { + "type": "object", + "properties": { + "closure_type": { + "$ref": "#/components/schemas/closure_types" + }, + "customFields": { + "type": "array", + "x-technical-preview": true, + "description": "Custom fields configuration details.", + "items": { "type": "object", "properties": { - "email": { + "key": { + "description": "A unique key for the custom field. Must be lower case and composed only of a-z, 0-9, '_', and '-' characters. It is used in API calls to refer to a specific custom field.\n", "type": "string", - "example": null, - "nullable": true + "minLength": 1, + "maxLength": 36 }, - "full_name": { + "label": { + "description": "The custom field label that is displayed in the case.", "type": "string", - "example": null, - "nullable": true + "minLength": 1, + "maxLength": 50 }, - "username": { - "type": "string", - "example": "elastic", - "nullable": true + "required": { + "description": "Indicates whether the field is required. If `false`, the custom field can be set to null or omitted when a case is created or updated.\n", + "type": "boolean" }, - "profile_uid": { + "type": { + "description": "The type of the custom field.", "type": "string", - "example": "u_J41Oh6L9ki-Vo2tOogS8WRTENzhHurGtRc87NgEAlkc_0" + "enum": [ + "text", + "toggle" + ] } } - }, - "error": { - "type": "string", - "nullable": true, - "example": null - }, - "id": { - "type": "string", - "example": "4a97a440-e1cd-11ec-be9b-9b1838238ee6" - }, - "mappings": { - "type": "array", - "items": { - "type": "object", - "properties": { - "action_type": { - "type": "string", - "example": "overwrite" - }, - "source": { - "type": "string", - "example": "title" - }, - "target": { - "type": "string", - "example": "summary" - } - } + } + }, + "connector": { + "type": "object", + "properties": { + "fields": { + "description": "The fields specified in the case configuration are not used and are not propagated to individual cases, therefore it is recommended to set it to `null`.", + "nullable": true, + "type": "object" + }, + "id": { + "description": "The identifier for the connector. If you do not want a default connector, use `none`. To retrieve connector IDs, use the find connectors API.", + "type": "string", + "example": "none" + }, + "name": { + "description": "The name of the connector. If you do not want a default connector, use `none`. To retrieve connector names, use the find connectors API.", + "type": "string", + "example": "none" + }, + "type": { + "$ref": "#/components/schemas/connector_types" } - }, - "owner": { - "$ref": "#/components/schemas/owners" - }, - "updated_at": { - "type": "string", - "format": "date-time", - "nullable": true, - "example": "2022-06-01T19:58:48.169Z" - }, - "updated_by": { + } + }, + "created_at": { + "type": "string", + "format": "date-time", + "example": "2022-06-01T17:07:17.767Z" + }, + "created_by": { + "type": "object", + "required": [ + "email", + "full_name", + "username" + ], + "properties": { + "email": { + "type": "string", + "example": null, + "nullable": true + }, + "full_name": { + "type": "string", + "example": null, + "nullable": true + }, + "username": { + "type": "string", + "example": "elastic", + "nullable": true + }, + "profile_uid": { + "type": "string", + "example": "u_J41Oh6L9ki-Vo2tOogS8WRTENzhHurGtRc87NgEAlkc_0" + } + } + }, + "error": { + "type": "string", + "nullable": true, + "example": null + }, + "id": { + "type": "string", + "example": "4a97a440-e1cd-11ec-be9b-9b1838238ee6" + }, + "mappings": { + "type": "array", + "items": { "type": "object", "properties": { - "email": { - "type": "string", - "example": null, - "nullable": true - }, - "full_name": { + "action_type": { "type": "string", - "example": null, - "nullable": true + "example": "overwrite" }, - "username": { + "source": { "type": "string", - "example": "elastic", - "nullable": true + "example": "title" }, - "profile_uid": { + "target": { "type": "string", - "example": "u_J41Oh6L9ki-Vo2tOogS8WRTENzhHurGtRc87NgEAlkc_0" + "example": "summary" } - }, - "nullable": true - }, - "version": { - "type": "string", - "example": "WzIwNzMsMV0=" + } } + }, + "owner": { + "$ref": "#/components/schemas/owners" + }, + "updated_at": { + "type": "string", + "format": "date-time", + "nullable": true, + "example": "2022-06-01T19:58:48.169Z" + }, + "updated_by": { + "type": "object", + "required": [ + "email", + "full_name", + "username" + ], + "properties": { + "email": { + "type": "string", + "example": null, + "nullable": true + }, + "full_name": { + "type": "string", + "example": null, + "nullable": true + }, + "username": { + "type": "string", + "example": "elastic", + "nullable": true + }, + "profile_uid": { + "type": "string", + "example": "u_J41Oh6L9ki-Vo2tOogS8WRTENzhHurGtRc87NgEAlkc_0" + } + }, + "nullable": true + }, + "version": { + "type": "string", + "example": "WzIwNzMsMV0=" } } + }, + "examples": { + "updateCaseConfigurationResponse": { + "$ref": "#/components/examples/update_case_configuration_response" + } } } } @@ -923,18 +1016,8 @@ } } } - }, - "servers": [ - { - "url": "https://localhost:5601" - } - ] - }, - "servers": [ - { - "url": "https://localhost:5601" } - ] + } }, "/api/cases/reporters": { "get": { @@ -959,6 +1042,11 @@ "maxItems": 10000, "items": { "type": "object", + "required": [ + "email", + "full_name", + "username" + ], "properties": { "email": { "type": "string", @@ -1000,18 +1088,8 @@ } } } - }, - "servers": [ - { - "url": "https://localhost:5601" - } - ] - }, - "servers": [ - { - "url": "https://localhost:5601" } - ] + } }, "/api/cases/status": { "get": { @@ -1045,11 +1123,6 @@ "type": "integer" } } - }, - "examples": { - "getStatusResponse": { - "$ref": "#/components/examples/get_status_response" - } } } } @@ -1064,18 +1137,8 @@ } } } - }, - "servers": [ - { - "url": "https://localhost:5601" - } - ] - }, - "servers": [ - { - "url": "https://localhost:5601" } - ] + } }, "/api/cases/tags": { "get": { @@ -1120,18 +1183,8 @@ } } } - }, - "servers": [ - { - "url": "https://localhost:5601" - } - ] - }, - "servers": [ - { - "url": "https://localhost:5601" } - ] + } }, "/api/cases/{caseId}": { "get": { @@ -1175,18 +1228,8 @@ } } } - }, - "servers": [ - { - "url": "https://localhost:5601" - } - ] - }, - "servers": [ - { - "url": "https://localhost:5601" } - ] + } }, "/api/cases/{caseId}/alerts": { "get": { @@ -1231,18 +1274,8 @@ } } } - }, - "servers": [ - { - "url": "https://localhost:5601" - } - ] - }, - "servers": [ - { - "url": "https://localhost:5601" } - ] + } }, "/api/cases/{caseId}/comments": { "post": { @@ -1301,12 +1334,7 @@ } } } - }, - "servers": [ - { - "url": "https://localhost:5601" - } - ] + } }, "delete": { "summary": "Deletes all comments and alerts from a case in the default space.", @@ -1337,12 +1365,7 @@ } } } - }, - "servers": [ - { - "url": "https://localhost:5601" - } - ] + } }, "patch": { "summary": "Updates a comment or alert in a case in the default space.", @@ -1400,12 +1423,7 @@ } } } - }, - "servers": [ - { - "url": "https://localhost:5601" - } - ] + } }, "get": { "summary": "Retrieves all the comments from a case in the default space.", @@ -1441,18 +1459,8 @@ } } } - }, - "servers": [ - { - "url": "https://localhost:5601" - } - ] - }, - "servers": [ - { - "url": "https://localhost:5601" } - ] + } }, "/api/cases/{caseId}/comments/{commentId}": { "delete": { @@ -1487,12 +1495,7 @@ } } } - }, - "servers": [ - { - "url": "https://localhost:5601" - } - ] + } }, "get": { "summary": "Retrieves a comment from a case in the default space.", @@ -1542,18 +1545,8 @@ } } } - }, - "servers": [ - { - "url": "https://localhost:5601" - } - ] - }, - "servers": [ - { - "url": "https://localhost:5601" } - ] + } }, "/api/cases/{caseId}/connector/{connectorId}/_push": { "post": { @@ -1610,18 +1603,8 @@ } } } - }, - "servers": [ - { - "url": "https://localhost:5601" - } - ] - }, - "servers": [ - { - "url": "https://localhost:5601" } - ] + } }, "/api/cases/{caseId}/user_actions": { "get": { @@ -1647,11 +1630,6 @@ "items": { "$ref": "#/components/schemas/user_actions_response_properties" } - }, - "examples": { - "getCaseActivityResponse": { - "$ref": "#/components/examples/get_case_activity_response" - } } } } @@ -1666,18 +1644,8 @@ } } } - }, - "servers": [ - { - "url": "https://localhost:5601" - } - ] - }, - "servers": [ - { - "url": "https://localhost:5601" } - ] + } }, "/api/cases/{caseId}/user_actions/_find": { "get": { @@ -1748,18 +1716,8 @@ } } } - }, - "servers": [ - { - "url": "https://localhost:5601" - } - ] - }, - "servers": [ - { - "url": "https://localhost:5601" } - ] + } }, "/api/cases/configure/connectors/_find": { "get": { @@ -1834,18 +1792,8 @@ } } } - }, - "servers": [ - { - "url": "https://localhost:5601" - } - ] - }, - "servers": [ - { - "url": "https://localhost:5601" } - ] + } }, "/s/{spaceId}/api/cases": { "post": { @@ -1904,12 +1852,7 @@ } } } - }, - "servers": [ - { - "url": "https://localhost:5601" - } - ] + } }, "delete": { "summary": "Deletes one or more cases.", @@ -1943,12 +1886,7 @@ } } } - }, - "servers": [ - { - "url": "https://localhost:5601" - } - ] + } }, "patch": { "summary": "Updates one or more cases.", @@ -2008,18 +1946,8 @@ } } } - }, - "servers": [ - { - "url": "https://localhost:5601" - } - ] - }, - "servers": [ - { - "url": "https://localhost:5601" } - ] + } }, "/s/{spaceId}/api/cases/_find": { "get": { @@ -2134,18 +2062,8 @@ } } } - }, - "servers": [ - { - "url": "https://localhost:5601" - } - ] - }, - "servers": [ - { - "url": "https://localhost:5601" } - ] + } }, "/s/{spaceId}/api/cases/alerts/{alertId}": { "get": { @@ -2207,18 +2125,8 @@ } } } - }, - "servers": [ - { - "url": "https://localhost:5601" - } - ] - }, - "servers": [ - { - "url": "https://localhost:5601" } - ] + } }, "/s/{spaceId}/api/cases/configure": { "get": { @@ -2249,6 +2157,40 @@ "closure_type": { "$ref": "#/components/schemas/closure_types" }, + "customFields": { + "type": "array", + "x-technical-preview": true, + "description": "Custom fields configuration details.", + "items": { + "type": "object", + "properties": { + "key": { + "description": "A unique key for the custom field. Must be lower case and composed only of a-z, 0-9, '_', and '-' characters. It is used in API calls to refer to a specific custom field.\n", + "type": "string", + "minLength": 1, + "maxLength": 36 + }, + "label": { + "description": "The custom field label that is displayed in the case.", + "type": "string", + "minLength": 1, + "maxLength": 50 + }, + "required": { + "description": "Indicates whether the field is required. If `false`, the custom field can be set to null or omitted when a case is created or updated.\n", + "type": "boolean" + }, + "type": { + "description": "The type of the custom field.", + "type": "string", + "enum": [ + "text", + "toggle" + ] + } + } + } + }, "connector": { "type": "object", "properties": { @@ -2279,6 +2221,11 @@ }, "created_by": { "type": "object", + "required": [ + "email", + "full_name", + "username" + ], "properties": { "email": { "type": "string", @@ -2341,6 +2288,11 @@ }, "updated_by": { "type": "object", + "required": [ + "email", + "full_name", + "username" + ], "properties": { "email": { "type": "string", @@ -2370,6 +2322,11 @@ } } } + }, + "examples": { + "getConfigurationResponse": { + "$ref": "#/components/examples/get_case_configuration_response" + } } } } @@ -2384,15 +2341,10 @@ } } } - }, - "servers": [ - { - "url": "https://localhost:5601" - } - ] + } }, "post": { - "summary": "Sets external connection details, such as the closure type and default connector for cases.", + "summary": "Creates a case specific configuration that includes external connection details and custom fields.", "operationId": "setCaseConfiguration", "description": "You must have `all` privileges for the **Cases** feature in the **Management**, **Observability**, or **Security** section of the Kibana feature privileges, depending on the owner of the case configuration. Connectors are used to interface with external systems. You must create a connector before you can use it in your cases. Refer to the add connectors API. If you set a default connector, it is automatically selected when you create cases in Kibana. If you use the create case API, however, you must still specify all of the connector details.\n", "tags": [ @@ -2431,6 +2383,40 @@ "closure_type": { "$ref": "#/components/schemas/closure_types" }, + "customFields": { + "type": "array", + "x-technical-preview": true, + "description": "Custom fields configuration details.", + "items": { + "type": "object", + "properties": { + "key": { + "description": "A unique key for the custom field. Must be lower case and composed only of a-z, 0-9, '_', and '-' characters. It is used in API calls to refer to a specific custom field.\n", + "type": "string", + "minLength": 1, + "maxLength": 36 + }, + "label": { + "description": "The custom field label that is displayed in the case.", + "type": "string", + "minLength": 1, + "maxLength": 50 + }, + "required": { + "description": "Indicates whether the field is required. If `false`, the custom field can be set to null or omitted when a case is created or updated.\n", + "type": "boolean" + }, + "type": { + "description": "The type of the custom field.", + "type": "string", + "enum": [ + "text", + "toggle" + ] + } + } + } + }, "connector": { "type": "object", "properties": { @@ -2461,6 +2447,11 @@ }, "created_by": { "type": "object", + "required": [ + "email", + "full_name", + "username" + ], "properties": { "email": { "type": "string", @@ -2523,6 +2514,11 @@ }, "updated_by": { "type": "object", + "required": [ + "email", + "full_name", + "username" + ], "properties": { "email": { "type": "string", @@ -2570,18 +2566,8 @@ } } } - }, - "servers": [ - { - "url": "https://localhost:5601" - } - ] - }, - "servers": [ - { - "url": "https://localhost:5601" } - ] + } }, "/s/{spaceId}/api/cases/configure/{configurationId}": { "patch": { @@ -2607,6 +2593,11 @@ "application/json": { "schema": { "$ref": "#/components/schemas/update_case_configuration_request" + }, + "examples": { + "updateCaseConfigurationRequest": { + "$ref": "#/components/examples/update_case_configuration_request" + } } } } @@ -2617,134 +2608,180 @@ "content": { "application/json": { "schema": { - "type": "array", - "items": { - "type": "object", - "properties": { - "closure_type": { - "$ref": "#/components/schemas/closure_types" - }, - "connector": { - "type": "object", - "properties": { - "fields": { - "description": "The fields specified in the case configuration are not used and are not propagated to individual cases, therefore it is recommended to set it to `null`.", - "nullable": true, - "type": "object" - }, - "id": { - "description": "The identifier for the connector. If you do not want a default connector, use `none`. To retrieve connector IDs, use the find connectors API.", - "type": "string", - "example": "none" - }, - "name": { - "description": "The name of the connector. If you do not want a default connector, use `none`. To retrieve connector names, use the find connectors API.", - "type": "string", - "example": "none" - }, - "type": { - "$ref": "#/components/schemas/connector_types" - } - } - }, - "created_at": { - "type": "string", - "format": "date-time", - "example": "2022-06-01T17:07:17.767Z" - }, - "created_by": { + "type": "object", + "properties": { + "closure_type": { + "$ref": "#/components/schemas/closure_types" + }, + "customFields": { + "type": "array", + "x-technical-preview": true, + "description": "Custom fields configuration details.", + "items": { "type": "object", "properties": { - "email": { + "key": { + "description": "A unique key for the custom field. Must be lower case and composed only of a-z, 0-9, '_', and '-' characters. It is used in API calls to refer to a specific custom field.\n", "type": "string", - "example": null, - "nullable": true + "minLength": 1, + "maxLength": 36 }, - "full_name": { + "label": { + "description": "The custom field label that is displayed in the case.", "type": "string", - "example": null, - "nullable": true + "minLength": 1, + "maxLength": 50 }, - "username": { - "type": "string", - "example": "elastic", - "nullable": true + "required": { + "description": "Indicates whether the field is required. If `false`, the custom field can be set to null or omitted when a case is created or updated.\n", + "type": "boolean" }, - "profile_uid": { + "type": { + "description": "The type of the custom field.", "type": "string", - "example": "u_J41Oh6L9ki-Vo2tOogS8WRTENzhHurGtRc87NgEAlkc_0" + "enum": [ + "text", + "toggle" + ] } } - }, - "error": { - "type": "string", - "nullable": true, - "example": null - }, - "id": { - "type": "string", - "example": "4a97a440-e1cd-11ec-be9b-9b1838238ee6" - }, - "mappings": { - "type": "array", - "items": { - "type": "object", - "properties": { - "action_type": { - "type": "string", - "example": "overwrite" - }, - "source": { - "type": "string", - "example": "title" - }, - "target": { - "type": "string", - "example": "summary" - } - } + } + }, + "connector": { + "type": "object", + "properties": { + "fields": { + "description": "The fields specified in the case configuration are not used and are not propagated to individual cases, therefore it is recommended to set it to `null`.", + "nullable": true, + "type": "object" + }, + "id": { + "description": "The identifier for the connector. If you do not want a default connector, use `none`. To retrieve connector IDs, use the find connectors API.", + "type": "string", + "example": "none" + }, + "name": { + "description": "The name of the connector. If you do not want a default connector, use `none`. To retrieve connector names, use the find connectors API.", + "type": "string", + "example": "none" + }, + "type": { + "$ref": "#/components/schemas/connector_types" } - }, - "owner": { - "$ref": "#/components/schemas/owners" - }, - "updated_at": { - "type": "string", - "format": "date-time", - "nullable": true, - "example": "2022-06-01T19:58:48.169Z" - }, - "updated_by": { + } + }, + "created_at": { + "type": "string", + "format": "date-time", + "example": "2022-06-01T17:07:17.767Z" + }, + "created_by": { + "type": "object", + "required": [ + "email", + "full_name", + "username" + ], + "properties": { + "email": { + "type": "string", + "example": null, + "nullable": true + }, + "full_name": { + "type": "string", + "example": null, + "nullable": true + }, + "username": { + "type": "string", + "example": "elastic", + "nullable": true + }, + "profile_uid": { + "type": "string", + "example": "u_J41Oh6L9ki-Vo2tOogS8WRTENzhHurGtRc87NgEAlkc_0" + } + } + }, + "error": { + "type": "string", + "nullable": true, + "example": null + }, + "id": { + "type": "string", + "example": "4a97a440-e1cd-11ec-be9b-9b1838238ee6" + }, + "mappings": { + "type": "array", + "items": { "type": "object", "properties": { - "email": { - "type": "string", - "example": null, - "nullable": true - }, - "full_name": { + "action_type": { "type": "string", - "example": null, - "nullable": true + "example": "overwrite" }, - "username": { + "source": { "type": "string", - "example": "elastic", - "nullable": true + "example": "title" }, - "profile_uid": { + "target": { "type": "string", - "example": "u_J41Oh6L9ki-Vo2tOogS8WRTENzhHurGtRc87NgEAlkc_0" + "example": "summary" } + } + } + }, + "owner": { + "$ref": "#/components/schemas/owners" + }, + "updated_at": { + "type": "string", + "format": "date-time", + "nullable": true, + "example": "2022-06-01T19:58:48.169Z" + }, + "updated_by": { + "type": "object", + "required": [ + "email", + "full_name", + "username" + ], + "properties": { + "email": { + "type": "string", + "example": null, + "nullable": true }, - "nullable": true + "full_name": { + "type": "string", + "example": null, + "nullable": true + }, + "username": { + "type": "string", + "example": "elastic", + "nullable": true + }, + "profile_uid": { + "type": "string", + "example": "u_J41Oh6L9ki-Vo2tOogS8WRTENzhHurGtRc87NgEAlkc_0" + } }, - "version": { - "type": "string", - "example": "WzIwNzMsMV0=" - } + "nullable": true + }, + "version": { + "type": "string", + "example": "WzIwNzMsMV0=" } } + }, + "examples": { + "updateCaseConfigurationResponse": { + "$ref": "#/components/examples/update_case_configuration_response" + } } } } @@ -2759,18 +2796,8 @@ } } } - }, - "servers": [ - { - "url": "https://localhost:5601" - } - ] - }, - "servers": [ - { - "url": "https://localhost:5601" } - ] + } }, "/s/{spaceId}/api/cases/configure/connectors/_find": { "get": { @@ -2849,18 +2876,8 @@ } } } - }, - "servers": [ - { - "url": "https://localhost:5601" - } - ] - }, - "servers": [ - { - "url": "https://localhost:5601" } - ] + } }, "/s/{spaceId}/api/cases/reporters": { "get": { @@ -2887,6 +2904,11 @@ "type": "array", "items": { "type": "object", + "required": [ + "email", + "full_name", + "username" + ], "properties": { "email": { "type": "string", @@ -2928,18 +2950,8 @@ } } } - }, - "servers": [ - { - "url": "https://localhost:5601" - } - ] - }, - "servers": [ - { - "url": "https://localhost:5601" } - ] + } }, "/s/{spaceId}/api/cases/status": { "get": { @@ -2976,11 +2988,6 @@ "type": "integer" } } - }, - "examples": { - "getStatusResponse": { - "$ref": "#/components/examples/get_status_response" - } } } } @@ -2995,18 +3002,8 @@ } } } - }, - "servers": [ - { - "url": "https://localhost:5601" - } - ] - }, - "servers": [ - { - "url": "https://localhost:5601" } - ] + } }, "/s/{spaceId}/api/cases/tags": { "get": { @@ -3053,18 +3050,8 @@ } } } - }, - "servers": [ - { - "url": "https://localhost:5601" - } - ] - }, - "servers": [ - { - "url": "https://localhost:5601" } - ] + } }, "/s/{spaceId}/api/cases/{caseId}": { "get": { @@ -3111,18 +3098,8 @@ } } } - }, - "servers": [ - { - "url": "https://localhost:5601" - } - ] - }, - "servers": [ - { - "url": "https://localhost:5601" } - ] + } }, "/s/{spaceId}/api/cases/{caseId}/alerts": { "get": { @@ -3170,18 +3147,8 @@ } } } - }, - "servers": [ - { - "url": "https://localhost:5601" - } - ] - }, - "servers": [ - { - "url": "https://localhost:5601" } - ] + } }, "/s/{spaceId}/api/cases/{caseId}/comments": { "post": { @@ -3243,12 +3210,7 @@ } } } - }, - "servers": [ - { - "url": "https://localhost:5601" - } - ] + } }, "delete": { "summary": "Deletes all comments and alerts from a case.", @@ -3282,12 +3244,7 @@ } } } - }, - "servers": [ - { - "url": "https://localhost:5601" - } - ] + } }, "patch": { "summary": "Updates a comment or alert in a case.", @@ -3348,12 +3305,7 @@ } } } - }, - "servers": [ - { - "url": "https://localhost:5601" - } - ] + } }, "get": { "summary": "Retrieves all the comments from a case.", @@ -3392,18 +3344,8 @@ } } } - }, - "servers": [ - { - "url": "https://localhost:5601" - } - ] - }, - "servers": [ - { - "url": "https://localhost:5601" } - ] + } }, "/s/{spaceId}/api/cases/{caseId}/comments/_find": { "get": { @@ -3451,18 +3393,8 @@ } } } - }, - "servers": [ - { - "url": "https://localhost:5601" - } - ] - }, - "servers": [ - { - "url": "https://localhost:5601" } - ] + } }, "/s/{spaceId}/api/cases/{caseId}/comments/{commentId}": { "delete": { @@ -3500,12 +3432,7 @@ } } } - }, - "servers": [ - { - "url": "https://localhost:5601" - } - ] + } }, "get": { "summary": "Retrieves a comment from a case.", @@ -3558,18 +3485,8 @@ } } } - }, - "servers": [ - { - "url": "https://localhost:5601" - } - ] - }, - "servers": [ - { - "url": "https://localhost:5601" } - ] + } }, "/s/{spaceId}/api/cases/{caseId}/connector/{connectorId}/_push": { "post": { @@ -3629,18 +3546,8 @@ } } } - }, - "servers": [ - { - "url": "https://localhost:5601" - } - ] - }, - "servers": [ - { - "url": "https://localhost:5601" } - ] + } }, "/s/{spaceId}/api/cases/{caseId}/user_actions": { "get": { @@ -3669,11 +3576,6 @@ "items": { "$ref": "#/components/schemas/user_actions_response_properties" } - }, - "examples": { - "getCaseActivityResponse": { - "$ref": "#/components/examples/get_case_activity_response" - } } } } @@ -3688,18 +3590,8 @@ } } } - }, - "servers": [ - { - "url": "https://localhost:5601" - } - ] - }, - "servers": [ - { - "url": "https://localhost:5601" } - ] + } }, "/s/{spaceId}/api/cases/{caseId}/user_actions/_find": { "get": { @@ -3773,18 +3665,8 @@ } } } - }, - "servers": [ - { - "url": "https://localhost:5601" - } - ] - }, - "servers": [ - { - "url": "https://localhost:5601" } - ] + } } }, "components": { @@ -4579,54 +4461,6 @@ ], "default": "low" }, - "custom_fields_property": { - "type": "array", - "description": "Values for custom fields of a case", - "minItems": 0, - "maxItems": 5, - "items": { - "type": "object", - "required": [ - "key", - "type", - "field" - ], - "properties": { - "key": { - "description": "The key identifying the custom field.", - "type": "string" - }, - "type": { - "description": "The type of the custom field. Should match the key and how the custom field was configured", - "type": "string" - }, - "field": { - "description": "An object containing the value of the field.", - "type": "object", - "required": [ - "value" - ], - "properties": { - "value": { - "description": "The value of the field.", - "nullable": true, - "type": "array", - "items": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "boolean" - } - ] - } - } - } - } - } - } - }, "create_case_request": { "title": "Create case request", "description": "The create case API request body varies depending on the type of connector.", @@ -4692,7 +4526,7 @@ } }, "category": { - "description": "Category for the case. It could be a word or a phrase to categorize the case.", + "description": "A word or phrase that categorizes the case.", "type": "string", "maxLength": 50 }, @@ -4702,7 +4536,47 @@ "maxLength": 160 }, "customFields": { - "$ref": "#/components/schemas/custom_fields_property" + "type": "array", + "description": "Custom field values for a case. Any optional custom fields that are not specified in the request are set to null.\n", + "x-technical-preview": true, + "minItems": 0, + "maxItems": 10, + "items": { + "type": "object", + "required": [ + "key", + "type", + "value" + ], + "properties": { + "key": { + "description": "The unique identifier for the custom field. The key value must exist in the case configuration settings.\n", + "type": "string" + }, + "type": { + "description": "The custom field type. It must match the type specified in the case configuration settings.\n", + "type": "string", + "enum": [ + "text", + "toggle" + ] + }, + "value": { + "description": "The custom field value. If the custom field is required, it cannot be explicitly set to null. However, for cases that existed when the required custom field was added, the default value stored in Elasticsearch is `undefined`. The value returned in the API and user interface in this case is `null`.\n", + "oneOf": [ + { + "type": "string", + "minLength": 1, + "maxLength": 160, + "nullable": true + }, + { + "type": "boolean" + } + ] + } + } + } } } }, @@ -4755,6 +4629,11 @@ }, "created_by": { "type": "object", + "required": [ + "email", + "full_name", + "username" + ], "properties": { "email": { "type": "string", @@ -4796,6 +4675,11 @@ }, "pushed_by": { "type": "object", + "required": [ + "email", + "full_name", + "username" + ], "properties": { "email": { "type": "string", @@ -4848,6 +4732,11 @@ }, "updated_by": { "type": "object", + "required": [ + "email", + "full_name", + "username" + ], "properties": { "email": { "type": "string", @@ -5114,6 +5003,11 @@ "assignees": { "$ref": "#/components/schemas/assignees" }, + "category": { + "type": "string", + "description": "The case category.", + "nullable": true + }, "closed_at": { "type": "string", "format": "date-time", @@ -5178,6 +5072,42 @@ "created_by": { "$ref": "#/components/schemas/case_response_created_by_properties" }, + "customFields": { + "type": "array", + "description": "Custom field values for the case.", + "x-technical-preview": true, + "items": { + "type": "object", + "properties": { + "key": { + "description": "The unique identifier for the custom field. The key value must exist in the case configuration settings.\n", + "type": "string" + }, + "type": { + "description": "The custom field type. It must match the type specified in the case configuration settings.\n", + "type": "string", + "enum": [ + "text", + "toggle" + ] + }, + "value": { + "description": "The custom field value. If the custom field is required, it cannot be explicitly set to null. However, for cases that existed when the required custom field was added, the default value stored in Elasticsearch is `undefined`. The value returned in the API and user interface in this case is `null`.\n", + "oneOf": [ + { + "type": "string", + "minLength": 1, + "maxLength": 160, + "nullable": true + }, + { + "type": "boolean" + } + ] + } + } + } + }, "description": { "type": "string", "example": "A case description." @@ -5282,6 +5212,11 @@ "assignees": { "$ref": "#/components/schemas/assignees" }, + "category": { + "description": "A word or phrase that categorizes the case.", + "type": "string", + "maxLength": 50 + }, "connector": { "oneOf": [ { @@ -5307,6 +5242,49 @@ } ] }, + "customFields": { + "type": "array", + "description": "Custom field values for a case. Any optional custom fields that are not specified in the request are set to null.\n", + "x-technical-preview": true, + "minItems": 0, + "maxItems": 10, + "items": { + "type": "object", + "required": [ + "key", + "type", + "value" + ], + "properties": { + "key": { + "description": "The unique identifier for the custom field. The key value must exist in the case configuration settings.\n", + "type": "string" + }, + "type": { + "description": "The custom field type. It must match the type specified in the case configuration settings.\n", + "type": "string", + "enum": [ + "text", + "toggle" + ] + }, + "value": { + "description": "The custom field value. If the custom field is required, it cannot be explicitly set to null. However, for cases that existed when the required custom field was added, the default value stored in Elasticsearch is `undefined`. The value returned in the API and user interface in this case is `null`.\n", + "oneOf": [ + { + "type": "string", + "minLength": 1, + "maxLength": 160, + "nullable": true + }, + { + "type": "boolean" + } + ] + } + } + } + }, "description": { "description": "An updated description for the case.", "type": "string" @@ -5334,11 +5312,6 @@ "maxLength": 256 } }, - "category": { - "description": "Category for the case. It could be a word or a phrase to categorize the case.", - "type": "string", - "maxLength": 50 - }, "title": { "description": "A title for the case.", "type": "string", @@ -5347,9 +5320,6 @@ "version": { "description": "The current version of the case. To determine this value, use the get case or find cases APIs.", "type": "string" - }, - "customFields": { - "$ref": "#/components/schemas/custom_fields_property" } } } @@ -5430,22 +5400,50 @@ "type" ] }, + "customFields": { + "type": "array", + "description": "Custom fields case configuration.", + "x-technical-preview": true, + "minItems": 0, + "maxItems": 10, + "items": { + "type": "object", + "required": [ + "key", + "label", + "required", + "type" + ], + "properties": { + "key": { + "description": "A unique key for the custom field. Must be lower case and composed only of a-z, 0-9, '_', and '-' characters. It is used in API calls to refer to a specific custom field.\n", + "type": "string", + "minLength": 1, + "maxLength": 36 + }, + "label": { + "description": "The custom field label that is displayed in the case.", + "type": "string", + "minLength": 1, + "maxLength": 50 + }, + "required": { + "description": "Indicates whether the field is required. If `false`, the custom field can be set to null or omitted when a case is created or updated.\n", + "type": "boolean" + }, + "type": { + "description": "The type of the custom field.", + "type": "string", + "enum": [ + "text", + "toggle" + ] + } + } + } + }, "owner": { "$ref": "#/components/schemas/owners" - }, - "settings": { - "description": "An object that contains the case settings.", - "type": "object", - "properties": { - "syncAlerts": { - "description": "Turns alert syncing on or off.", - "type": "boolean", - "example": true - } - }, - "required": [ - "syncAlerts" - ] } } }, @@ -5482,13 +5480,53 @@ "type": { "$ref": "#/components/schemas/connector_types" } - }, - "required": [ - "fields", - "id", - "name", - "type" - ] + }, + "required": [ + "fields", + "id", + "name", + "type" + ] + }, + "customFields": { + "type": "array", + "description": "Custom fields case configuration.", + "x-technical-preview": true, + "items": { + "type": "object", + "required": [ + "key", + "label", + "required", + "type" + ], + "properties": { + "key": { + "description": "A unique key for the custom field. Must be lower case and composed only of a-z, 0-9, '_', and '-' characters. It is used in API calls to refer to a specific custom field.\n", + "type": "string", + "minLength": 1, + "maxLength": 36 + }, + "label": { + "description": "The custom field label that is displayed in the case.", + "type": "string", + "minLength": 1, + "maxLength": 50 + }, + "required": { + "description": "Indicates whether the field is required. If `false`, the custom field can be set to null or omitted when a case is created or updated.\n", + "type": "boolean" + }, + "type": { + "description": "The type of the custom field.", + "type": "string", + "enum": [ + "text", + "toggle" + ] + } + } + } }, "version": { "description": "The version of the connector. To retrieve the version value, use the get configuration API.\n", @@ -6430,7 +6468,14 @@ "settings": { "syncAlerts": true }, - "owner": "cases" + "owner": "cases", + "customFields": [ + { + "type": "text", + "key": "d312efda-ec2b-42ec-9e2c-84981795c581", + "value": "My field value" + } + ] } }, "create_case_response": { @@ -6440,7 +6485,7 @@ "totalAlerts": 0, "id": "66b9aa00-94fa-11ea-9f74-e7e108796192", "version": "WzUzMiwxXQ==", - "totalComment": 1, + "totalComment": 0, "title": "Case title 1", "tags": [ "tag 1" @@ -6448,18 +6493,31 @@ "assignees": [], "description": "A case description.", "settings": { - "syncAlerts": false + "syncAlerts": true }, "owner": "cases", + "customFields": [ + { + "key": "d312efda-ec2b-42ec-9e2c-84981795c581", + "type": "text", + "value": "My field value" + }, + { + "key": "fcc6840d-eb14-42df-8aaf-232201a705ec", + "type": "toggle", + "value": null + } + ], "duration": null, "severity": "low", "closed_at": null, "closed_by": null, - "created_at": "2022-03-24T00:37:03.906Z", + "created_at": "2022-10-13T15:33:50.604Z", "created_by": { "username": "elastic", "full_name": null, - "email": null + "email": null, + "profile_uid": "u_mGBROF_q5bmFCATbLXAcCwKa0k8JvONAwSruelyKA5E_0" }, "status": "open", "updated_at": null, @@ -6500,7 +6558,19 @@ ], "settings": { "syncAlerts": true - } + }, + "customFields": [ + { + "key": "fcc6840d-eb14-42df-8aaf-232201a705ec", + "type": "toggle", + "value": false + }, + { + "key": "d312efda-ec2b-42ec-9e2c-84981795c581", + "type": "text", + "value": "My new field value" + } + ] } ] } @@ -6527,20 +6597,35 @@ "severity": "low", "closed_at": null, "closed_by": null, - "created_at": "2022-05-13T09:16:17.416Z", + "created_at": "2023-10-13T09:16:17.416Z", "created_by": { "email": null, "full_name": null, - "username": "elastic" + "username": "elastic", + "profile_uid": "u_mGBROF_q5bmFCATbLXAcCwKa0k8JvONAwSruelyKA5E_0" }, "status": "open", - "updated_at": "2022-05-13T09:48:33.043Z", + "updated_at": "2023-10-13T09:48:33.043Z", "updated_by": { "email": null, "full_name": null, - "username": "elastic" + "username": "elastic", + "profile_uid": "u_mGBROF_q5bmFCATbLXAcCwKa0k8JvONAwSruelyKA5E_0" }, "assignees": [], + "category": null, + "customFields": [ + { + "key": "d312efda-ec2b-42ec-9e2c-84981795c581", + "type": "text", + "value": "My new field value" + }, + { + "key": "fcc6840d-eb14-42df-8aaf-232201a705ec", + "type": "toggle", + "value": false + } + ], "connector": { "id": "131d4448-abe0-4789-939d-8ef60680b498", "name": "My connector", @@ -6559,7 +6644,7 @@ "username": "elastic" }, "external_url": "https://hms.atlassian.net/browse/IS-4", - "pushed_at": "2022-05-13T09:20:40.672Z", + "pushed_at": "2023-10-13T09:20:40.672Z", "connector_id": "05da469f-1fde-4058-99a3-91e4807e2de8", "external_id": "10003", "connector_name": "Jira" @@ -6589,24 +6674,39 @@ "syncAlerts": true }, "owner": "cases", + "customFields": [ + { + "type": "text", + "key": "d312efda-ec2b-42ec-9e2c-84981795c581", + "value": "My field value" + }, + { + "key": "fcc6840d-eb14-42df-8aaf-232201a705ec", + "type": "toggle", + "value": null + } + ], "duration": null, "severity": "low", "closed_at": null, "closed_by": null, - "created_at": "2022-05-12T00:16:36.371Z", + "created_at": "2023-10-12T00:16:36.371Z", "created_by": { "email": null, "full_name": null, - "username": "elastic" + "username": "elastic", + "profile_uid": "u_mGBROF_q5bmFCATbLXAcCwKa0k8JvONAwSruelyKA5E_0" }, "status": "open", - "updated_at": "2022-05-12T00:27:58.162Z", + "updated_at": "2023-10-12T00:27:58.162Z", "updated_by": { "email": null, "full_name": null, - "username": "elastic" + "username": "elastic", + "profile_uid": "u_mGBROF_q5bmFCATbLXAcCwKa0k8JvONAwSruelyKA5E_0" }, "assignees": [], + "category": null, "connector": { "id": "none", "name": "none", @@ -6621,6 +6721,41 @@ "count_closed_cases": 0 } }, + "get_case_configuration_response": { + "summary": "Get the case configuration.", + "value": [ + { + "id": "856ee650-6c82-11ee-a20a-6164169afa58", + "closure_type": "close-by-user", + "customFields": [ + { + "key": "d312efda-ec2b-42ec-9e2c-84981795c581", + "label": "my-text-field", + "required": false, + "type": "text" + } + ], + "owner": "cases", + "created_at": "2023-06-01T17:07:17.767Z", + "created_by": { + "username": "elastic", + "email": null, + "full_name": null + }, + "updated_at": null, + "updated_by": null, + "connector": { + "id": "none", + "name": "none", + "type": ".none", + "fields": null + }, + "mappings": [], + "version": "WzUxLDRd", + "error": null + } + ] + }, "set_case_configuration_request": { "summary": "Set the closure type and default connector for Stack Management cases.", "value": { @@ -6631,19 +6766,36 @@ "type": ".jira", "fields": null }, - "closure_type": "close-by-user" + "closure_type": "close-by-user", + "customFields": [ + { + "key": "d312efda-ec2b-42ec-9e2c-84981795c581", + "label": "my-text-field", + "required": false, + "type": "text" + } + ] } }, "set_case_configuration_response": { - "summary": "This is an example response when the case configuration was updated.", + "summary": "This is an example response for case settings.", "value": { "closure_type": "close-by-user", + "customFields": [ + { + "key": "d312efda-ec2b-42ec-9e2c-84981795c581", + "label": "my-text-field", + "required": false, + "type": "text" + } + ], "owner": "cases", - "created_at": "2022-06-01T17:07:17.767Z", + "created_at": "2023-10-01T17:07:17.767Z", "created_by": { "username": "elastic", "email": "null,", - "full_name": null + "full_name": null, + "profile_uid": "u_mGBROF_q5bmFCATbLXAcCwKa0k8JvONAwSruelyKA5E_0" }, "updated_at": null, "updated_by": null, @@ -6675,34 +6827,111 @@ "id": "4a97a440-e1cd-11ec-be9b-9b1838238ee6" } }, + "update_case_configuration_request": { + "summary": "Update the case settings.", + "value": { + "version": "WzExOSw0XQ==", + "connector": { + "id": "5e656730-e1ca-11ec-be9b-9b1838238ee6", + "name": "my-jira-connector", + "type": ".jira", + "fields": null + }, + "closure_type": "close-by-user", + "customFields": [ + { + "key": "d312efda-ec2b-42ec-9e2c-84981795c581", + "label": "my-text-field", + "required": true, + "type": "text" + }, + { + "key": "fcc6840d-eb14-42df-8aaf-232201a705ec", + "label": "my-toggle", + "required": false, + "type": "toggle" + } + ] + } + }, + "update_case_configuration_response": { + "summary": "This is an example response when the case configuration was updated.", + "value": { + "closure_type": "close-by-user", + "customFields": [ + { + "key": "d312efda-ec2b-42ec-9e2c-84981795c581", + "label": "my-text-field", + "required": true, + "type": "text" + }, + { + "key": "fcc6840d-eb14-42df-8aaf-232201a705ec", + "label": "my-toggle", + "required": false, + "type": "toggle" + } + ], + "owner": "cases", + "created_at": "2023-10-01T17:07:17.767Z", + "created_by": { + "username": "elastic", + "email": "null,", + "full_name": null, + "profile_uid": "u_mGBROF_q5bmFCATbLXAcCwKa0k8JvONAwSruelyKA5E_0" + }, + "updated_at": "2023-10-19T00:52:42.401Z", + "updated_by": { + "username": "elastic", + "full_name": null, + "email": null, + "profile_uid": "u_mGBROF_q5bmFCATbLXAcCwKa0k8JvONAwSruelyKA5E_0" + }, + "connector": { + "id": "5e656730-e1ca-11ec-be9b-9b1838238ee6", + "name": "my-jira-connector", + "type": ".jira", + "fields": null + }, + "mappings": [ + { + "source": "title", + "target": "summary", + "action_type": "overwrite" + }, + { + "source": "description", + "target": "description", + "action_type": "overwrite" + }, + { + "source": "comments", + "target": "comments", + "action_type": "append" + } + ], + "version": "zEzNSw1XQ==", + "error": null, + "id": "4a97a440-e1cd-11ec-be9b-9b1838238ee6" + } + }, "get_reporters_response": { - "summary": "A list of three users that opened cases", + "summary": "A list of two users that opened cases", "value": [ { "username": "elastic", "full_name": null, - "email": null - }, - { - "username": "user1", - "full_name": "User 1", - "email": "user1@elastic.co" + "email": null, + "profile_uid": "u_mGBROF_q5bmFCATbLXAcCwKa0k8JvONAwSruelyKA5E_0" }, { - "username": "user2", - "full_name": "User 2", - "email": "user2@elastic.co" + "username": "jdoe", + "full_name": "Jane Doe", + "email": "jdoe@example.com", + "profile_uid": "u_0wpfV1MqYDaXzLtRVY-gLMrddKDEmfz51Fszhj7hWC8_0" } ] }, - "get_status_response": { - "summary": "Get the number of cases in each state.", - "value": { - "count_open_cases": 27, - "count_in_progress_cases": 50, - "count_closed_cases": 198 - } - }, "get_tags_response": { "summary": "A list of tags that are used in cases", "value": [ @@ -6724,11 +6953,12 @@ "type": "user", "owner": "cases", "comment": "A new comment", - "created_at": "2022-07-13T15:40:32.335Z", + "created_at": "2023-10-13T15:40:32.335Z", "created_by": { "email": null, "full_name": null, - "username": "elastic" + "username": "elastic", + "profile_uid": "u_mGBROF_q5bmFCATbLXAcCwKa0k8JvONAwSruelyKA5E_0" }, "pushed_at": null, "pushed_by": null, @@ -6746,23 +6976,37 @@ "syncAlerts": true }, "owner": "cases", + "customFields": [ + { + "type": "text", + "key": "d312efda-ec2b-42ec-9e2c-84981795c581", + "value": "My field value" + }, + { + "key": "fcc6840d-eb14-42df-8aaf-232201a705ec", + "type": "toggle", + "value": null + } + ], "description": "A case description", "duration": null, "severity": "low", "closed_at": null, "closed_by": null, - "created_at": "2022-07-13T15:33:50.604Z", + "created_at": "2023-10-13T15:33:50.604Z", "created_by": { "username": "elastic", "email": null, - "full_name": null + "full_name": null, + "profile_uid": "u_mGBROF_q5bmFCATbLXAcCwKa0k8JvONAwSruelyKA5E_0" }, "status": "open", - "updated_at": "2022-07-13T15:40:32.335Z", + "updated_at": "2023-10-13T15:40:32.335Z", "updated_by": { "full_name": null, "email": null, - "username": "elastic" + "username": "elastic", + "profile_uid": "u_mGBROF_q5bmFCATbLXAcCwKa0k8JvONAwSruelyKA5E_0" }, "assignees": [ { @@ -6806,7 +7050,7 @@ "type": "user", "owner": "cases", "comment": "A new comment.", - "created_at": "2022-06-02T00:49:47.716Z", + "created_at": "2022-10-02T00:49:47.716Z", "created_by": { "username": "elastic", "email": null, @@ -6823,6 +7067,20 @@ "tag 1" ], "description": "A case description.", + "category": null, + "assignees": [], + "customFields": [ + { + "key": "d312efda-ec2b-42ec-9e2c-84981795c581", + "type": "text", + "value": "Field value" + }, + { + "key": "fcc6840d-eb14-42df-8aaf-232201a705ec", + "type": "toggle", + "value": true + } + ], "settings": { "syncAlerts": false }, @@ -6835,14 +7093,16 @@ "created_by": { "username": "elastic", "full_name": null, - "email": null + "email": null, + "profile_uid": "u_mGBROF_q5bmFCATbLXAcCwKa0k8JvONAwSruelyKA5E_0" }, "status": "open", "updated_at": "2022-06-03T00:49:47.716Z", "updated_by": { "username": "elastic", "email": null, - "full_name": null + "full_name": null, + "profile_uid": "u_mGBROF_q5bmFCATbLXAcCwKa0k8JvONAwSruelyKA5E_0" }, "connector": { "id": "none", @@ -6873,19 +7133,21 @@ "comment": "An updated comment.", "type": "user", "owner": "cases", - "created_at": "2022-03-24T00:37:10.832Z", + "created_at": "2023-10-24T00:37:10.832Z", "created_by": { "username": "elastic", "full_name": null, - "email": null + "email": null, + "profile_uid": "u_mGBROF_q5bmFCATbLXAcCwKa0k8JvONAwSruelyKA5E_0" }, "pushed_at": null, "pushed_by": null, - "updated_at": "2022-03-24T01:27:06.210Z", + "updated_at": "2023-10-24T01:27:06.210Z", "updated_by": { "username": "elastic", "full_name": null, - "email": null + "email": null, + "profile_uid": "u_mGBROF_q5bmFCATbLXAcCwKa0k8JvONAwSruelyKA5E_0" } } ], @@ -6902,22 +7164,38 @@ "syncAlerts": false }, "owner": "cases", + "category": null, + "assignees": [], + "customFields": [ + { + "key": "d312efda-ec2b-42ec-9e2c-84981795c581", + "type": "text", + "value": "My new field value" + }, + { + "key": "fcc6840d-eb14-42df-8aaf-232201a705ec", + "type": "toggle", + "value": false + } + ], "duration": null, "severity": "low", "closed_at": null, "closed_by": null, - "created_at": "2022-03-24T00:37:03.906Z", + "created_at": "2023-10-24T00:37:03.906Z", "created_by": { "username": "elastic", "full_name": null, - "email": null + "email": null, + "profile_uid": "u_mGBROF_q5bmFCATbLXAcCwKa0k8JvONAwSruelyKA5E_0" }, "status": "open", - "updated_at": "2022-03-24T01:27:06.210Z", + "updated_at": "2023-10-24T01:27:06.210Z", "updated_by": { "username": "elastic", "full_name": null, - "email": null + "email": null, + "profile_uid": "u_mGBROF_q5bmFCATbLXAcCwKa0k8JvONAwSruelyKA5E_0" }, "connector": { "id": "none", @@ -6936,11 +7214,12 @@ "type": "user", "owner": "cases", "comment": "A new comment", - "created_at": "2022-07-07T19:32:13.104Z", + "created_at": "2023-10-07T19:32:13.104Z", "created_by": { "email": null, "full_name": null, - "username": "elastic" + "username": "elastic", + "profile_uid": "u_mGBROF_q5bmFCATbLXAcCwKa0k8JvONAwSruelyKA5E_0" }, "pushed_at": null, "pushed_by": null, @@ -7007,151 +7286,71 @@ } } }, - "get_case_activity_response": { - "summary": "Retrieves all activity for a case", - "value": [ - { - "action_id": "b4cd0770-07c9-11ed-a5fd-47154cb8767e", - "action": "create", - "case_id": "22df07d0-03b1-11ed-920c-974bfa104448", - "comment_id": "578608d0-03b1-11ed-920c-974bfa104448", - "created_at": "2022-07-20T01:17:22.150Z", - "created_by": { - "username": "elastic", - "email": null, - "full_name": null - }, - "owner": "cases", - "payload": { - "assignees": null, - "connector": { - "name": "none", - "type": ".none", - "fields": null, - "id": "none" - }, - "description": "test", - "tags": [ - "mine" - ], - "title": "test-case", - "owner": "cases", - "settings": { - "syncAlerts": false - }, - "severity": "low", - "status": "open", - "type": "create_case" - }, - "type": "comment" - }, - { - "action_id": "57af14a0-03b1-11ed-920c-974bfa104448", - "action": "create", - "case_id": "22df07d0-03b1-11ed-920c-974bfa104448", - "comment_id": "578608d0-03b1-11ed-920c-974bfa104448", - "created_at": "2022-07-14T20:12:53.354Z", - "created_by": { - "username": "elastic", - "email": null, - "full_name": null - }, - "owner": "cases", - "payload": { - "comment": "A new comment", - "owner": "cases", - "type": "user" - }, - "type": "comment" - }, - { - "action_id": "573c6980-6123-11ed-aa41-81a0a61fe447", - "action": "add", - "case_id": "22df07d0-03b1-11ed-920c-974bfa104448", - "comment_id": null, - "created_at": "2022-07-20T01:10:28.238Z", - "created_by": { - "username": "elastic", - "email": null, - "full_name": null, - "profile_uid": "u_mGBROF_q5bmFCATbLXAcCwKa0k8JvONAwSruelyKA5E_0" - }, - "owner": "cases", - "payload": { - "assignees": { - "uid": "u_mGBROF_q5bmFCATbLXAcCwKa0k8JvONAwSruelyKA5E_0" - } - }, - "type": "assignees" - }, - { - "action_id": "fff460e0-07c9-11ed-a5fd-47154cb8767e", - "action": "delete", - "case_id": "22df07d0-03b1-11ed-920c-974bfa104448", - "comment_id": null, - "created_at": "2022-07-20T01:19:28.238Z", - "created_by": { - "username": "elastic", - "email": null, - "full_name": null - }, - "owner": "cases", - "payload": null, - "type": "delete_case" - } - ] - }, "find_case_activity_response": { "summary": "Retrieves all activity for a case", "value": { "page": 1, "perPage": 20, - "total": 4, + "total": 3, "userActions": [ { "id": "b4cd0770-07c9-11ed-a5fd-47154cb8767e", "action": "create", - "comment_id": "578608d0-03b1-11ed-920c-974bfa104448", - "created_at": "2022-07-20T01:17:22.150Z", + "comment_id": null, + "created_at": "2023-10-20T01:17:22.150Z", "created_by": { "username": "elastic", "email": null, - "full_name": null + "full_name": null, + "profile_uid": "u_mGBROF_q5bmFCATbLXAcCwKa0k8JvONAwSruelyKA5E_0" }, "owner": "cases", "payload": { - "assignees": null, + "assignees": [], "connector": { "name": "none", "type": ".none", "fields": null, "id": "none" }, - "description": "test", + "description": "A case description.", "tags": [ - "mine" + "tag 1" ], - "title": "test-case", + "title": "Case title 1", "owner": "cases", "settings": { "syncAlerts": false }, "severity": "low", "status": "open", - "type": "create_case" + "category": null, + "customFields": [ + { + "key": "d312efda-ec2b-42ec-9e2c-84981795c581", + "type": "text", + "value": "My field value" + }, + { + "key": "fcc6840d-eb14-42df-8aaf-232201a705ec", + "type": "toggle", + "value": null + } + ] }, "version": "WzM1ODg4LDFd", - "type": "comment" + "type": "create_case" }, { "id": "57af14a0-03b1-11ed-920c-974bfa104448", "action": "create", "comment_id": "578608d0-03b1-11ed-920c-974bfa104448", - "created_at": "2022-07-14T20:12:53.354Z", + "created_at": "2023-10-14T20:12:53.354Z", "created_by": { "username": "elastic", "email": null, - "full_name": null + "full_name": null, + "profile_uid": "u_mGBROF_q5bmFCATbLXAcCwKa0k8JvONAwSruelyKA5E_0" }, "owner": "cases", "payload": { @@ -7166,7 +7365,7 @@ "id": "573c6980-6123-11ed-aa41-81a0a61fe447", "action": "add", "comment_id": null, - "created_at": "2022-07-20T01:10:28.238Z", + "created_at": "2023-10-20T01:10:28.238Z", "created_by": { "username": "elastic", "email": null, diff --git a/x-pack/plugins/cases/docs/openapi/bundled.yaml b/x-pack/plugins/cases/docs/openapi/bundled.yaml index c24f9f3c67fa37..96b6bdebaa864a 100644 --- a/x-pack/plugins/cases/docs/openapi/bundled.yaml +++ b/x-pack/plugins/cases/docs/openapi/bundled.yaml @@ -9,8 +9,10 @@ info: name: Elastic License 2.0 url: https://www.elastic.co/licensing/elastic-license servers: - - url: http://localhost:5601 - description: local + - url: https://{kibanaUrl} + variables: + kibanaUrl: + default: localhost:5601 security: - basicAuth: [] - apiKeyAuth: [] @@ -53,8 +55,6 @@ paths: application/json: schema: $ref: '#/components/schemas/4xx_response' - servers: - - url: https://localhost:5601 delete: summary: Deletes one or more cases in the default space. operationId: deleteCaseDefaultSpace @@ -74,8 +74,6 @@ paths: application/json: schema: $ref: '#/components/schemas/4xx_response' - servers: - - url: https://localhost:5601 patch: summary: Updates one or more cases in the default space. operationId: updateCaseDefaultSpace @@ -111,10 +109,6 @@ paths: application/json: schema: $ref: '#/components/schemas/4xx_response' - servers: - - url: https://localhost:5601 - servers: - - url: https://localhost:5601 /api/cases/_find: get: summary: Retrieves a paginated subset of cases in the default space. @@ -174,10 +168,6 @@ paths: application/json: schema: $ref: '#/components/schemas/4xx_response' - servers: - - url: https://localhost:5601 - servers: - - url: https://localhost:5601 /api/cases/alerts/{alertId}: get: summary: Returns the cases associated with a specific alert in the default space. @@ -216,10 +206,6 @@ paths: application/json: schema: $ref: '#/components/schemas/4xx_response' - servers: - - url: https://localhost:5601 - servers: - - url: https://localhost:5601s /api/cases/configure: get: summary: Retrieves external connection details, such as the closure type and default connector for cases in the default space. @@ -242,6 +228,34 @@ paths: properties: closure_type: $ref: '#/components/schemas/closure_types' + customFields: + type: array + x-technical-preview: true + description: Custom fields configuration details. + items: + type: object + properties: + key: + description: | + A unique key for the custom field. Must be lower case and composed only of a-z, 0-9, '_', and '-' characters. It is used in API calls to refer to a specific custom field. + type: string + minLength: 1 + maxLength: 36 + label: + description: The custom field label that is displayed in the case. + type: string + minLength: 1 + maxLength: 50 + required: + description: | + Indicates whether the field is required. If `false`, the custom field can be set to null or omitted when a case is created or updated. + type: boolean + type: + description: The type of the custom field. + type: string + enum: + - text + - toggle connector: type: object properties: @@ -265,6 +279,10 @@ paths: example: '2022-06-01T17:07:17.767Z' created_by: type: object + required: + - email + - full_name + - username properties: email: type: string @@ -311,6 +329,10 @@ paths: example: '2022-06-01T19:58:48.169Z' updated_by: type: object + required: + - email + - full_name + - username properties: email: type: string @@ -331,16 +353,17 @@ paths: version: type: string example: WzIwNzMsMV0= + examples: + getConfigurationResponse: + $ref: '#/components/examples/get_case_configuration_response' '401': description: Authorization information is missing or invalid. content: application/json: schema: $ref: '#/components/schemas/4xx_response' - servers: - - url: https://localhost:5601 post: - summary: Sets external connection details, such as the closure type and default connector for cases in the default space. + summary: Creates a case specific configuration that includes external connection details and custom fields. operationId: setCaseConfigurationDefaultSpace description: | You must have `all` privileges for the **Cases** feature in the **Management**, **Observability**, or **Security** section of the Kibana feature privileges, depending on the owner of the case configuration. Connectors are used to interface with external systems. You must create a connector before you can use it in your cases. Refer to the add connectors API. If you set a default connector, it is automatically selected when you create cases in Kibana. If you use the create case API, however, you must still specify all of the connector details. @@ -366,6 +389,34 @@ paths: properties: closure_type: $ref: '#/components/schemas/closure_types' + customFields: + type: array + x-technical-preview: true + description: Custom fields configuration details. + items: + type: object + properties: + key: + description: | + A unique key for the custom field. Must be lower case and composed only of a-z, 0-9, '_', and '-' characters. It is used in API calls to refer to a specific custom field. + type: string + minLength: 1 + maxLength: 36 + label: + description: The custom field label that is displayed in the case. + type: string + minLength: 1 + maxLength: 50 + required: + description: | + Indicates whether the field is required. If `false`, the custom field can be set to null or omitted when a case is created or updated. + type: boolean + type: + description: The type of the custom field. + type: string + enum: + - text + - toggle connector: type: object properties: @@ -389,6 +440,10 @@ paths: example: '2022-06-01T17:07:17.767Z' created_by: type: object + required: + - email + - full_name + - username properties: email: type: string @@ -435,6 +490,10 @@ paths: example: '2022-06-01T19:58:48.169Z' updated_by: type: object + required: + - email + - full_name + - username properties: email: type: string @@ -464,10 +523,6 @@ paths: application/json: schema: $ref: '#/components/schemas/4xx_response' - servers: - - url: https://localhost:5601 - servers: - - url: https://localhost:5601 /api/cases/configure/{configurationId}: patch: summary: Updates external connection details, such as the closure type and default connector for cases in the default space. @@ -484,117 +539,153 @@ paths: application/json: schema: $ref: '#/components/schemas/update_case_configuration_request' + examples: + updateCaseConfigurationRequest: + $ref: '#/components/examples/update_case_configuration_request' responses: '200': description: Indicates a successful call. content: application/json: schema: - type: array - items: - type: object - properties: - closure_type: - $ref: '#/components/schemas/closure_types' - connector: + type: object + properties: + closure_type: + $ref: '#/components/schemas/closure_types' + customFields: + type: array + x-technical-preview: true + description: Custom fields configuration details. + items: type: object properties: - fields: - description: The fields specified in the case configuration are not used and are not propagated to individual cases, therefore it is recommended to set it to `null`. - nullable: true - type: object - id: - description: The identifier for the connector. If you do not want a default connector, use `none`. To retrieve connector IDs, use the find connectors API. + key: + description: | + A unique key for the custom field. Must be lower case and composed only of a-z, 0-9, '_', and '-' characters. It is used in API calls to refer to a specific custom field. type: string - example: none - name: - description: The name of the connector. If you do not want a default connector, use `none`. To retrieve connector names, use the find connectors API. + minLength: 1 + maxLength: 36 + label: + description: The custom field label that is displayed in the case. type: string - example: none + minLength: 1 + maxLength: 50 + required: + description: | + Indicates whether the field is required. If `false`, the custom field can be set to null or omitted when a case is created or updated. + type: boolean type: - $ref: '#/components/schemas/connector_types' - created_at: - type: string - format: date-time - example: '2022-06-01T17:07:17.767Z' - created_by: - type: object - properties: - email: + description: The type of the custom field. type: string - example: null - nullable: true - full_name: - type: string - example: null - nullable: true - username: - type: string - example: elastic - nullable: true - profile_uid: - type: string - example: u_J41Oh6L9ki-Vo2tOogS8WRTENzhHurGtRc87NgEAlkc_0 - error: - type: string - nullable: true - example: null - id: - type: string - example: 4a97a440-e1cd-11ec-be9b-9b1838238ee6 - mappings: - type: array - items: + enum: + - text + - toggle + connector: + type: object + properties: + fields: + description: The fields specified in the case configuration are not used and are not propagated to individual cases, therefore it is recommended to set it to `null`. + nullable: true type: object - properties: - action_type: - type: string - example: overwrite - source: - type: string - example: title - target: - type: string - example: summary - owner: - $ref: '#/components/schemas/owners' - updated_at: - type: string - format: date-time - nullable: true - example: '2022-06-01T19:58:48.169Z' - updated_by: + id: + description: The identifier for the connector. If you do not want a default connector, use `none`. To retrieve connector IDs, use the find connectors API. + type: string + example: none + name: + description: The name of the connector. If you do not want a default connector, use `none`. To retrieve connector names, use the find connectors API. + type: string + example: none + type: + $ref: '#/components/schemas/connector_types' + created_at: + type: string + format: date-time + example: '2022-06-01T17:07:17.767Z' + created_by: + type: object + required: + - email + - full_name + - username + properties: + email: + type: string + example: null + nullable: true + full_name: + type: string + example: null + nullable: true + username: + type: string + example: elastic + nullable: true + profile_uid: + type: string + example: u_J41Oh6L9ki-Vo2tOogS8WRTENzhHurGtRc87NgEAlkc_0 + error: + type: string + nullable: true + example: null + id: + type: string + example: 4a97a440-e1cd-11ec-be9b-9b1838238ee6 + mappings: + type: array + items: type: object properties: - email: - type: string - example: null - nullable: true - full_name: + action_type: type: string - example: null - nullable: true - username: + example: overwrite + source: type: string - example: elastic - nullable: true - profile_uid: + example: title + target: type: string - example: u_J41Oh6L9ki-Vo2tOogS8WRTENzhHurGtRc87NgEAlkc_0 - nullable: true - version: - type: string - example: WzIwNzMsMV0= + example: summary + owner: + $ref: '#/components/schemas/owners' + updated_at: + type: string + format: date-time + nullable: true + example: '2022-06-01T19:58:48.169Z' + updated_by: + type: object + required: + - email + - full_name + - username + properties: + email: + type: string + example: null + nullable: true + full_name: + type: string + example: null + nullable: true + username: + type: string + example: elastic + nullable: true + profile_uid: + type: string + example: u_J41Oh6L9ki-Vo2tOogS8WRTENzhHurGtRc87NgEAlkc_0 + nullable: true + version: + type: string + example: WzIwNzMsMV0= + examples: + updateCaseConfigurationResponse: + $ref: '#/components/examples/update_case_configuration_response' '401': description: Authorization information is missing or invalid. content: application/json: schema: $ref: '#/components/schemas/4xx_response' - servers: - - url: https://localhost:5601 - servers: - - url: https://localhost:5601 /api/cases/reporters: get: summary: Returns information about the users who opened cases in the default space. @@ -615,6 +706,10 @@ paths: maxItems: 10000 items: type: object + required: + - email + - full_name + - username properties: email: type: string @@ -640,10 +735,6 @@ paths: application/json: schema: $ref: '#/components/schemas/4xx_response' - servers: - - url: https://localhost:5601 - servers: - - url: https://localhost:5601 /api/cases/status: get: summary: Returns the number of cases that are open, closed, and in progress in the default space. @@ -669,19 +760,12 @@ paths: type: integer count_open_cases: type: integer - examples: - getStatusResponse: - $ref: '#/components/examples/get_status_response' '401': description: Authorization information is missing or invalid. content: application/json: schema: $ref: '#/components/schemas/4xx_response' - servers: - - url: https://localhost:5601 - servers: - - url: https://localhost:5601 /api/cases/tags: get: summary: Aggregates and returns a list of case tags in the default space. @@ -711,10 +795,6 @@ paths: application/json: schema: $ref: '#/components/schemas/4xx_response' - servers: - - url: https://localhost:5601 - servers: - - url: https://localhost:5601 /api/cases/{caseId}: get: summary: Retrieves information about a case in the default space. @@ -742,10 +822,6 @@ paths: application/json: schema: $ref: '#/components/schemas/4xx_response' - servers: - - url: https://localhost:5601 - servers: - - url: https://localhost:5601 /api/cases/{caseId}/alerts: get: summary: Gets all alerts attached to a case in the default space. @@ -775,10 +851,6 @@ paths: application/json: schema: $ref: '#/components/schemas/4xx_response' - servers: - - url: https://localhost:5601 - servers: - - url: https://localhost:5601 /api/cases/{caseId}/comments: post: summary: Adds a comment or alert to a case in the default space. @@ -815,8 +887,6 @@ paths: application/json: schema: $ref: '#/components/schemas/4xx_response' - servers: - - url: https://localhost:5601 delete: summary: Deletes all comments and alerts from a case in the default space. operationId: deleteCaseCommentsDefaultSpace @@ -836,8 +906,6 @@ paths: application/json: schema: $ref: '#/components/schemas/4xx_response' - servers: - - url: https://localhost:5601 patch: summary: Updates a comment or alert in a case in the default space. operationId: updateCaseCommentDefaultSpace @@ -873,8 +941,6 @@ paths: application/json: schema: $ref: '#/components/schemas/4xx_response' - servers: - - url: https://localhost:5601 get: summary: Retrieves all the comments from a case in the default space. operationId: getAllCaseCommentsDefaultSpace @@ -898,10 +964,6 @@ paths: application/json: schema: $ref: '#/components/schemas/4xx_response' - servers: - - url: https://localhost:5601 - servers: - - url: https://localhost:5601 /api/cases/{caseId}/comments/{commentId}: delete: summary: Deletes a comment or alert from a case in the default space. @@ -923,8 +985,6 @@ paths: application/json: schema: $ref: '#/components/schemas/4xx_response' - servers: - - url: https://localhost:5601 get: summary: Retrieves a comment from a case in the default space. operationId: getCaseCommentDefaultSpace @@ -953,10 +1013,6 @@ paths: application/json: schema: $ref: '#/components/schemas/4xx_response' - servers: - - url: https://localhost:5601 - servers: - - url: https://localhost:5601 /api/cases/{caseId}/connector/{connectorId}/_push: post: summary: Pushes a case in the default space to an external service. @@ -991,10 +1047,6 @@ paths: application/json: schema: $ref: '#/components/schemas/4xx_response' - servers: - - url: https://localhost:5601 - servers: - - url: https://localhost:5601 /api/cases/{caseId}/user_actions: get: summary: Returns all user activity for a case in the default space. @@ -1015,19 +1067,12 @@ paths: type: array items: $ref: '#/components/schemas/user_actions_response_properties' - examples: - getCaseActivityResponse: - $ref: '#/components/examples/get_case_activity_response' '401': description: Authorization information is missing or invalid. content: application/json: schema: $ref: '#/components/schemas/4xx_response' - servers: - - url: https://localhost:5601 - servers: - - url: https://localhost:5601 /api/cases/{caseId}/user_actions/_find: get: summary: Finds user activity for a case in the default space. @@ -1070,10 +1115,6 @@ paths: application/json: schema: $ref: '#/components/schemas/4xx_response' - servers: - - url: https://localhost:5601 - servers: - - url: https://localhost:5601 /api/cases/configure/connectors/_find: get: summary: Retrieves information about connectors in the default space. @@ -1124,10 +1165,6 @@ paths: application/json: schema: $ref: '#/components/schemas/4xx_response' - servers: - - url: https://localhost:5601 - servers: - - url: https://localhost:5601 /s/{spaceId}/api/cases: post: summary: Creates a case. @@ -1164,8 +1201,6 @@ paths: application/json: schema: $ref: '#/components/schemas/4xx_response' - servers: - - url: https://localhost:5601 delete: summary: Deletes one or more cases. operationId: deleteCase @@ -1186,8 +1221,6 @@ paths: application/json: schema: $ref: '#/components/schemas/4xx_response' - servers: - - url: https://localhost:5601 patch: summary: Updates one or more cases. operationId: updateCase @@ -1224,10 +1257,6 @@ paths: application/json: schema: $ref: '#/components/schemas/4xx_response' - servers: - - url: https://localhost:5601 - servers: - - url: https://localhost:5601 /s/{spaceId}/api/cases/_find: get: summary: Retrieves a paginated subset of cases. @@ -1287,10 +1316,6 @@ paths: application/json: schema: $ref: '#/components/schemas/4xx_response' - servers: - - url: https://localhost:5601 - servers: - - url: https://localhost:5601 /s/{spaceId}/api/cases/alerts/{alertId}: get: summary: Returns the cases associated with a specific alert. @@ -1329,10 +1354,6 @@ paths: application/json: schema: $ref: '#/components/schemas/4xx_response' - servers: - - url: https://localhost:5601 - servers: - - url: https://localhost:5601 /s/{spaceId}/api/cases/configure: get: summary: Retrieves external connection details, such as the closure type and default connector for cases. @@ -1356,6 +1377,34 @@ paths: properties: closure_type: $ref: '#/components/schemas/closure_types' + customFields: + type: array + x-technical-preview: true + description: Custom fields configuration details. + items: + type: object + properties: + key: + description: | + A unique key for the custom field. Must be lower case and composed only of a-z, 0-9, '_', and '-' characters. It is used in API calls to refer to a specific custom field. + type: string + minLength: 1 + maxLength: 36 + label: + description: The custom field label that is displayed in the case. + type: string + minLength: 1 + maxLength: 50 + required: + description: | + Indicates whether the field is required. If `false`, the custom field can be set to null or omitted when a case is created or updated. + type: boolean + type: + description: The type of the custom field. + type: string + enum: + - text + - toggle connector: type: object properties: @@ -1379,6 +1428,10 @@ paths: example: '2022-06-01T17:07:17.767Z' created_by: type: object + required: + - email + - full_name + - username properties: email: type: string @@ -1425,6 +1478,10 @@ paths: example: '2022-06-01T19:58:48.169Z' updated_by: type: object + required: + - email + - full_name + - username properties: email: type: string @@ -1445,16 +1502,17 @@ paths: version: type: string example: WzIwNzMsMV0= + examples: + getConfigurationResponse: + $ref: '#/components/examples/get_case_configuration_response' '401': description: Authorization information is missing or invalid. content: application/json: schema: $ref: '#/components/schemas/4xx_response' - servers: - - url: https://localhost:5601 post: - summary: Sets external connection details, such as the closure type and default connector for cases. + summary: Creates a case specific configuration that includes external connection details and custom fields. operationId: setCaseConfiguration description: | You must have `all` privileges for the **Cases** feature in the **Management**, **Observability**, or **Security** section of the Kibana feature privileges, depending on the owner of the case configuration. Connectors are used to interface with external systems. You must create a connector before you can use it in your cases. Refer to the add connectors API. If you set a default connector, it is automatically selected when you create cases in Kibana. If you use the create case API, however, you must still specify all of the connector details. @@ -1481,6 +1539,34 @@ paths: properties: closure_type: $ref: '#/components/schemas/closure_types' + customFields: + type: array + x-technical-preview: true + description: Custom fields configuration details. + items: + type: object + properties: + key: + description: | + A unique key for the custom field. Must be lower case and composed only of a-z, 0-9, '_', and '-' characters. It is used in API calls to refer to a specific custom field. + type: string + minLength: 1 + maxLength: 36 + label: + description: The custom field label that is displayed in the case. + type: string + minLength: 1 + maxLength: 50 + required: + description: | + Indicates whether the field is required. If `false`, the custom field can be set to null or omitted when a case is created or updated. + type: boolean + type: + description: The type of the custom field. + type: string + enum: + - text + - toggle connector: type: object properties: @@ -1504,6 +1590,10 @@ paths: example: '2022-06-01T17:07:17.767Z' created_by: type: object + required: + - email + - full_name + - username properties: email: type: string @@ -1550,6 +1640,10 @@ paths: example: '2022-06-01T19:58:48.169Z' updated_by: type: object + required: + - email + - full_name + - username properties: email: type: string @@ -1579,10 +1673,6 @@ paths: application/json: schema: $ref: '#/components/schemas/4xx_response' - servers: - - url: https://localhost:5601 - servers: - - url: https://localhost:5601 /s/{spaceId}/api/cases/configure/{configurationId}: patch: summary: Updates external connection details, such as the closure type and default connector for cases. @@ -1600,117 +1690,153 @@ paths: application/json: schema: $ref: '#/components/schemas/update_case_configuration_request' + examples: + updateCaseConfigurationRequest: + $ref: '#/components/examples/update_case_configuration_request' responses: '200': description: Indicates a successful call. content: application/json: schema: - type: array - items: - type: object - properties: - closure_type: - $ref: '#/components/schemas/closure_types' - connector: + type: object + properties: + closure_type: + $ref: '#/components/schemas/closure_types' + customFields: + type: array + x-technical-preview: true + description: Custom fields configuration details. + items: type: object properties: - fields: - description: The fields specified in the case configuration are not used and are not propagated to individual cases, therefore it is recommended to set it to `null`. - nullable: true - type: object - id: - description: The identifier for the connector. If you do not want a default connector, use `none`. To retrieve connector IDs, use the find connectors API. + key: + description: | + A unique key for the custom field. Must be lower case and composed only of a-z, 0-9, '_', and '-' characters. It is used in API calls to refer to a specific custom field. type: string - example: none - name: - description: The name of the connector. If you do not want a default connector, use `none`. To retrieve connector names, use the find connectors API. + minLength: 1 + maxLength: 36 + label: + description: The custom field label that is displayed in the case. type: string - example: none + minLength: 1 + maxLength: 50 + required: + description: | + Indicates whether the field is required. If `false`, the custom field can be set to null or omitted when a case is created or updated. + type: boolean type: - $ref: '#/components/schemas/connector_types' - created_at: - type: string - format: date-time - example: '2022-06-01T17:07:17.767Z' - created_by: - type: object - properties: - email: - type: string - example: null - nullable: true - full_name: - type: string - example: null - nullable: true - username: - type: string - example: elastic - nullable: true - profile_uid: + description: The type of the custom field. type: string - example: u_J41Oh6L9ki-Vo2tOogS8WRTENzhHurGtRc87NgEAlkc_0 - error: - type: string - nullable: true - example: null - id: - type: string - example: 4a97a440-e1cd-11ec-be9b-9b1838238ee6 - mappings: - type: array - items: + enum: + - text + - toggle + connector: + type: object + properties: + fields: + description: The fields specified in the case configuration are not used and are not propagated to individual cases, therefore it is recommended to set it to `null`. + nullable: true type: object - properties: - action_type: - type: string - example: overwrite - source: - type: string - example: title - target: - type: string - example: summary - owner: - $ref: '#/components/schemas/owners' - updated_at: - type: string - format: date-time - nullable: true - example: '2022-06-01T19:58:48.169Z' - updated_by: - type: object - properties: - email: - type: string - example: null - nullable: true - full_name: + id: + description: The identifier for the connector. If you do not want a default connector, use `none`. To retrieve connector IDs, use the find connectors API. + type: string + example: none + name: + description: The name of the connector. If you do not want a default connector, use `none`. To retrieve connector names, use the find connectors API. + type: string + example: none + type: + $ref: '#/components/schemas/connector_types' + created_at: + type: string + format: date-time + example: '2022-06-01T17:07:17.767Z' + created_by: + type: object + required: + - email + - full_name + - username + properties: + email: + type: string + example: null + nullable: true + full_name: + type: string + example: null + nullable: true + username: + type: string + example: elastic + nullable: true + profile_uid: + type: string + example: u_J41Oh6L9ki-Vo2tOogS8WRTENzhHurGtRc87NgEAlkc_0 + error: + type: string + nullable: true + example: null + id: + type: string + example: 4a97a440-e1cd-11ec-be9b-9b1838238ee6 + mappings: + type: array + items: + type: object + properties: + action_type: type: string - example: null - nullable: true - username: + example: overwrite + source: type: string - example: elastic - nullable: true - profile_uid: + example: title + target: type: string - example: u_J41Oh6L9ki-Vo2tOogS8WRTENzhHurGtRc87NgEAlkc_0 - nullable: true - version: - type: string - example: WzIwNzMsMV0= + example: summary + owner: + $ref: '#/components/schemas/owners' + updated_at: + type: string + format: date-time + nullable: true + example: '2022-06-01T19:58:48.169Z' + updated_by: + type: object + required: + - email + - full_name + - username + properties: + email: + type: string + example: null + nullable: true + full_name: + type: string + example: null + nullable: true + username: + type: string + example: elastic + nullable: true + profile_uid: + type: string + example: u_J41Oh6L9ki-Vo2tOogS8WRTENzhHurGtRc87NgEAlkc_0 + nullable: true + version: + type: string + example: WzIwNzMsMV0= + examples: + updateCaseConfigurationResponse: + $ref: '#/components/examples/update_case_configuration_response' '401': description: Authorization information is missing or invalid. content: application/json: schema: $ref: '#/components/schemas/4xx_response' - servers: - - url: https://localhost:5601 - servers: - - url: https://localhost:5601 /s/{spaceId}/api/cases/configure/connectors/_find: get: summary: Retrieves information about connectors. @@ -1762,10 +1888,6 @@ paths: application/json: schema: $ref: '#/components/schemas/4xx_response' - servers: - - url: https://localhost:5601 - servers: - - url: https://localhost:5601 /s/{spaceId}/api/cases/reporters: get: summary: Returns information about the users who opened cases. @@ -1786,6 +1908,10 @@ paths: type: array items: type: object + required: + - email + - full_name + - username properties: email: type: string @@ -1811,10 +1937,6 @@ paths: application/json: schema: $ref: '#/components/schemas/4xx_response' - servers: - - url: https://localhost:5601 - servers: - - url: https://localhost:5601 /s/{spaceId}/api/cases/status: get: summary: Returns the number of cases that are open, closed, and in progress. @@ -1841,19 +1963,12 @@ paths: type: integer count_open_cases: type: integer - examples: - getStatusResponse: - $ref: '#/components/examples/get_status_response' '401': description: Authorization information is missing or invalid. content: application/json: schema: $ref: '#/components/schemas/4xx_response' - servers: - - url: https://localhost:5601 - servers: - - url: https://localhost:5601 /s/{spaceId}/api/cases/tags: get: summary: Aggregates and returns a list of case tags. @@ -1883,10 +1998,6 @@ paths: application/json: schema: $ref: '#/components/schemas/4xx_response' - servers: - - url: https://localhost:5601 - servers: - - url: https://localhost:5601 /s/{spaceId}/api/cases/{caseId}: get: summary: Retrieves information about a case. @@ -1915,10 +2026,6 @@ paths: application/json: schema: $ref: '#/components/schemas/4xx_response' - servers: - - url: https://localhost:5601 - servers: - - url: https://localhost:5601 /s/{spaceId}/api/cases/{caseId}/alerts: get: summary: Gets all alerts attached to a case. @@ -1949,10 +2056,6 @@ paths: application/json: schema: $ref: '#/components/schemas/4xx_response' - servers: - - url: https://localhost:5601 - servers: - - url: https://localhost:5601 /s/{spaceId}/api/cases/{caseId}/comments: post: summary: Adds a comment or alert to a case. @@ -1990,8 +2093,6 @@ paths: application/json: schema: $ref: '#/components/schemas/4xx_response' - servers: - - url: https://localhost:5601 delete: summary: Deletes all comments and alerts from a case. operationId: deleteCaseComments @@ -2012,8 +2113,6 @@ paths: application/json: schema: $ref: '#/components/schemas/4xx_response' - servers: - - url: https://localhost:5601 patch: summary: Updates a comment or alert in a case. operationId: updateCaseComment @@ -2050,8 +2149,6 @@ paths: application/json: schema: $ref: '#/components/schemas/4xx_response' - servers: - - url: https://localhost:5601 get: summary: Retrieves all the comments from a case. operationId: getAllCaseComments @@ -2076,10 +2173,6 @@ paths: application/json: schema: $ref: '#/components/schemas/4xx_response' - servers: - - url: https://localhost:5601 - servers: - - url: https://localhost:5601 /s/{spaceId}/api/cases/{caseId}/comments/_find: get: summary: Retrieves all the user comments from a case. @@ -2107,10 +2200,6 @@ paths: application/json: schema: $ref: '#/components/schemas/4xx_response' - servers: - - url: https://localhost:5601 - servers: - - url: https://localhost:5601 /s/{spaceId}/api/cases/{caseId}/comments/{commentId}: delete: summary: Deletes a comment or alert from a case. @@ -2133,8 +2222,6 @@ paths: application/json: schema: $ref: '#/components/schemas/4xx_response' - servers: - - url: https://localhost:5601 get: summary: Retrieves a comment from a case. operationId: getCaseComment @@ -2164,10 +2251,6 @@ paths: application/json: schema: $ref: '#/components/schemas/4xx_response' - servers: - - url: https://localhost:5601 - servers: - - url: https://localhost:5601 /s/{spaceId}/api/cases/{caseId}/connector/{connectorId}/_push: post: summary: Pushes a case to an external service. @@ -2203,10 +2286,6 @@ paths: application/json: schema: $ref: '#/components/schemas/4xx_response' - servers: - - url: https://localhost:5601 - servers: - - url: https://localhost:5601 /s/{spaceId}/api/cases/{caseId}/user_actions: get: summary: Returns all user activity for a case. @@ -2228,19 +2307,12 @@ paths: type: array items: $ref: '#/components/schemas/user_actions_response_properties' - examples: - getCaseActivityResponse: - $ref: '#/components/examples/get_case_activity_response' '401': description: Authorization information is missing or invalid. content: application/json: schema: $ref: '#/components/schemas/4xx_response' - servers: - - url: https://localhost:5601 - servers: - - url: https://localhost:5601 /s/{spaceId}/api/cases/{caseId}/user_actions/_find: get: summary: Finds user activity for a case. @@ -2284,10 +2356,6 @@ paths: application/json: schema: $ref: '#/components/schemas/4xx_response' - servers: - - url: https://localhost:5601 - servers: - - url: https://localhost:5601 components: securitySchemes: basicAuth: @@ -2890,38 +2958,6 @@ components: - low - medium default: low - custom_fields_property: - type: array - description: Values for custom fields of a case - minItems: 0 - maxItems: 5 - items: - type: object - required: - - key - - type - - field - properties: - key: - description: The key identifying the custom field. - type: string - type: - description: The type of the custom field. Should match the key and how the custom field was configured - type: string - field: - description: An object containing the value of the field. - type: object - required: - - value - properties: - value: - description: The value of the field. - nullable: true - type: array - items: - anyOf: - - type: string - - type: boolean create_case_request: title: Create case request description: The create case API request body varies depending on the type of connector. @@ -2963,7 +2999,7 @@ components: type: string maxLength: 256 category: - description: Category for the case. It could be a word or a phrase to categorize the case. + description: A word or phrase that categorizes the case. type: string maxLength: 50 title: @@ -2971,7 +3007,39 @@ components: type: string maxLength: 160 customFields: - $ref: '#/components/schemas/custom_fields_property' + type: array + description: | + Custom field values for a case. Any optional custom fields that are not specified in the request are set to null. + x-technical-preview: true + minItems: 0 + maxItems: 10 + items: + type: object + required: + - key + - type + - value + properties: + key: + description: | + The unique identifier for the custom field. The key value must exist in the case configuration settings. + type: string + type: + description: | + The custom field type. It must match the type specified in the case configuration settings. + type: string + enum: + - text + - toggle + value: + description: | + The custom field value. If the custom field is required, it cannot be explicitly set to null. However, for cases that existed when the required custom field was added, the default value stored in Elasticsearch is `undefined`. The value returned in the API and user interface in this case is `null`. + oneOf: + - type: string + minLength: 1 + maxLength: 160 + nullable: true + - type: boolean case_response_closed_by_properties: title: Case response properties for closed_by type: object @@ -3011,6 +3079,10 @@ components: example: '2022-03-24T02:31:03.210Z' created_by: type: object + required: + - email + - full_name + - username properties: email: type: string @@ -3042,6 +3114,10 @@ components: nullable: true pushed_by: type: object + required: + - email + - full_name + - username properties: email: type: string @@ -3081,6 +3157,10 @@ components: example: null updated_by: type: object + required: + - email + - full_name + - username properties: email: type: string @@ -3284,6 +3364,10 @@ components: properties: assignees: $ref: '#/components/schemas/assignees' + category: + type: string + description: The case category. + nullable: true closed_at: type: string format: date-time @@ -3319,6 +3403,33 @@ components: example: '2022-05-13T09:16:17.416Z' created_by: $ref: '#/components/schemas/case_response_created_by_properties' + customFields: + type: array + description: Custom field values for the case. + x-technical-preview: true + items: + type: object + properties: + key: + description: | + The unique identifier for the custom field. The key value must exist in the case configuration settings. + type: string + type: + description: | + The custom field type. It must match the type specified in the case configuration settings. + type: string + enum: + - text + - toggle + value: + description: | + The custom field value. If the custom field is required, it cannot be explicitly set to null. However, for cases that existed when the required custom field was added, the default value stored in Elasticsearch is `undefined`. The value returned in the API and user interface in this case is `null`. + oneOf: + - type: string + minLength: 1 + maxLength: 160 + nullable: true + - type: boolean description: type: string example: A case description. @@ -3397,6 +3508,10 @@ components: properties: assignees: $ref: '#/components/schemas/assignees' + category: + description: A word or phrase that categorizes the case. + type: string + maxLength: 50 connector: oneOf: - $ref: '#/components/schemas/connector_properties_none' @@ -3406,6 +3521,40 @@ components: - $ref: '#/components/schemas/connector_properties_servicenow' - $ref: '#/components/schemas/connector_properties_servicenow_sir' - $ref: '#/components/schemas/connector_properties_swimlane' + customFields: + type: array + description: | + Custom field values for a case. Any optional custom fields that are not specified in the request are set to null. + x-technical-preview: true + minItems: 0 + maxItems: 10 + items: + type: object + required: + - key + - type + - value + properties: + key: + description: | + The unique identifier for the custom field. The key value must exist in the case configuration settings. + type: string + type: + description: | + The custom field type. It must match the type specified in the case configuration settings. + type: string + enum: + - text + - toggle + value: + description: | + The custom field value. If the custom field is required, it cannot be explicitly set to null. However, for cases that existed when the required custom field was added, the default value stored in Elasticsearch is `undefined`. The value returned in the API and user interface in this case is `null`. + oneOf: + - type: string + minLength: 1 + maxLength: 160 + nullable: true + - type: boolean description: description: An updated description for the case. type: string @@ -3426,10 +3575,6 @@ components: items: type: string maxLength: 256 - category: - description: Category for the case. It could be a word or a phrase to categorize the case. - type: string - maxLength: 50 title: description: A title for the case. type: string @@ -3437,8 +3582,6 @@ components: version: description: The current version of the case. To determine this value, use the get case or find cases APIs. type: string - customFields: - $ref: '#/components/schemas/custom_fields_property' searchFieldsType: type: string description: The fields to perform the `simple_query_string` parsed query against. @@ -3498,18 +3641,43 @@ components: - id - name - type + customFields: + type: array + description: Custom fields case configuration. + x-technical-preview: true + minItems: 0 + maxItems: 10 + items: + type: object + required: + - key + - label + - required + - type + properties: + key: + description: | + A unique key for the custom field. Must be lower case and composed only of a-z, 0-9, '_', and '-' characters. It is used in API calls to refer to a specific custom field. + type: string + minLength: 1 + maxLength: 36 + label: + description: The custom field label that is displayed in the case. + type: string + minLength: 1 + maxLength: 50 + required: + description: | + Indicates whether the field is required. If `false`, the custom field can be set to null or omitted when a case is created or updated. + type: boolean + type: + description: The type of the custom field. + type: string + enum: + - text + - toggle owner: $ref: '#/components/schemas/owners' - settings: - description: An object that contains the case settings. - type: object - properties: - syncAlerts: - description: Turns alert syncing on or off. - type: boolean - example: true - required: - - syncAlerts update_case_configuration_request: title: Update case configuration request description: External connection details, such as the closure type and default connector for cases. @@ -3542,6 +3710,39 @@ components: - id - name - type + customFields: + type: array + description: Custom fields case configuration. + x-technical-preview: true + items: + type: object + required: + - key + - label + - required + - type + properties: + key: + description: | + A unique key for the custom field. Must be lower case and composed only of a-z, 0-9, '_', and '-' characters. It is used in API calls to refer to a specific custom field. + type: string + minLength: 1 + maxLength: 36 + label: + description: The custom field label that is displayed in the case. + type: string + minLength: 1 + maxLength: 50 + required: + description: | + Indicates whether the field is required. If `false`, the custom field can be set to null or omitted when a case is created or updated. + type: boolean + type: + description: The type of the custom field. + type: string + enum: + - text + - toggle version: description: | The version of the connector. To retrieve the version value, use the get configuration API. @@ -4195,6 +4396,10 @@ components: settings: syncAlerts: true owner: cases + customFields: + - type: text + key: d312efda-ec2b-42ec-9e2c-84981795c581 + value: My field value create_case_response: summary: The create case API returns a JSON object that contains details about the case. value: @@ -4202,24 +4407,32 @@ components: totalAlerts: 0 id: 66b9aa00-94fa-11ea-9f74-e7e108796192 version: WzUzMiwxXQ== - totalComment: 1 + totalComment: 0 title: Case title 1 tags: - tag 1 assignees: [] description: A case description. settings: - syncAlerts: false + syncAlerts: true owner: cases + customFields: + - key: d312efda-ec2b-42ec-9e2c-84981795c581 + type: text + value: My field value + - key: fcc6840d-eb14-42df-8aaf-232201a705ec + type: toggle + value: null duration: null severity: low closed_at: null closed_by: null - created_at: '2022-03-24T00:37:03.906Z' + created_at: '2022-10-13T15:33:50.604Z' created_by: username: elastic full_name: null email: null + profile_uid: u_mGBROF_q5bmFCATbLXAcCwKa0k8JvONAwSruelyKA5E_0 status: open updated_at: null updated_by: null @@ -4251,6 +4464,13 @@ components: - tag-1 settings: syncAlerts: true + customFields: + - key: fcc6840d-eb14-42df-8aaf-232201a705ec + type: toggle + value: false + - key: d312efda-ec2b-42ec-9e2c-84981795c581 + type: text + value: My new field value update_case_response: summary: This is an example response when the case description, tags, and connector were updated. value: @@ -4270,18 +4490,28 @@ components: severity: low closed_at: null closed_by: null - created_at: '2022-05-13T09:16:17.416Z' + created_at: '2023-10-13T09:16:17.416Z' created_by: email: null full_name: null username: elastic + profile_uid: u_mGBROF_q5bmFCATbLXAcCwKa0k8JvONAwSruelyKA5E_0 status: open - updated_at: '2022-05-13T09:48:33.043Z' + updated_at: '2023-10-13T09:48:33.043Z' updated_by: email: null full_name: null username: elastic + profile_uid: u_mGBROF_q5bmFCATbLXAcCwKa0k8JvONAwSruelyKA5E_0 assignees: [] + category: null + customFields: + - key: d312efda-ec2b-42ec-9e2c-84981795c581 + type: text + value: My new field value + - key: fcc6840d-eb14-42df-8aaf-232201a705ec + type: toggle + value: false connector: id: 131d4448-abe0-4789-939d-8ef60680b498 name: My connector @@ -4297,7 +4527,7 @@ components: email: null username: elastic external_url: https://hms.atlassian.net/browse/IS-4 - pushed_at: '2022-05-13T09:20:40.672Z' + pushed_at: '2023-10-13T09:20:40.672Z' connector_id: 05da469f-1fde-4058-99a3-91e4807e2de8 external_id: '10003' connector_name: Jira @@ -4320,22 +4550,32 @@ components: settings: syncAlerts: true owner: cases + customFields: + - type: text + key: d312efda-ec2b-42ec-9e2c-84981795c581 + value: My field value + - key: fcc6840d-eb14-42df-8aaf-232201a705ec + type: toggle + value: null duration: null severity: low closed_at: null closed_by: null - created_at: '2022-05-12T00:16:36.371Z' + created_at: '2023-10-12T00:16:36.371Z' created_by: email: null full_name: null username: elastic + profile_uid: u_mGBROF_q5bmFCATbLXAcCwKa0k8JvONAwSruelyKA5E_0 status: open - updated_at: '2022-05-12T00:27:58.162Z' + updated_at: '2023-10-12T00:27:58.162Z' updated_by: email: null full_name: null username: elastic + profile_uid: u_mGBROF_q5bmFCATbLXAcCwKa0k8JvONAwSruelyKA5E_0 assignees: [] + category: null connector: id: none name: none @@ -4345,6 +4585,32 @@ components: count_open_cases: 1 count_in_progress_cases: 0 count_closed_cases: 0 + get_case_configuration_response: + summary: Get the case configuration. + value: + - id: 856ee650-6c82-11ee-a20a-6164169afa58 + closure_type: close-by-user + customFields: + - key: d312efda-ec2b-42ec-9e2c-84981795c581 + label: my-text-field + required: false + type: text + owner: cases + created_at: '2023-06-01T17:07:17.767Z' + created_by: + username: elastic + email: null + full_name: null + updated_at: null + updated_by: null + connector: + id: none + name: none + type: .none + fields: null + mappings: [] + version: WzUxLDRd + error: null set_case_configuration_request: summary: Set the closure type and default connector for Stack Management cases. value: @@ -4355,16 +4621,27 @@ components: type: .jira fields: null closure_type: close-by-user + customFields: + - key: d312efda-ec2b-42ec-9e2c-84981795c581 + label: my-text-field + required: false + type: text set_case_configuration_response: - summary: This is an example response when the case configuration was updated. + summary: This is an example response for case settings. value: closure_type: close-by-user + customFields: + - key: d312efda-ec2b-42ec-9e2c-84981795c581 + label: my-text-field + required: false + type: text owner: cases - created_at: '2022-06-01T17:07:17.767Z' + created_at: '2023-10-01T17:07:17.767Z' created_by: username: elastic email: null, full_name: null + profile_uid: u_mGBROF_q5bmFCATbLXAcCwKa0k8JvONAwSruelyKA5E_0 updated_at: null updated_by: null connector: @@ -4385,24 +4662,80 @@ components: version: WzIwNzMsMV0= error: null id: 4a97a440-e1cd-11ec-be9b-9b1838238ee6 + update_case_configuration_request: + summary: Update the case settings. + value: + version: WzExOSw0XQ== + connector: + id: 5e656730-e1ca-11ec-be9b-9b1838238ee6 + name: my-jira-connector + type: .jira + fields: null + closure_type: close-by-user + customFields: + - key: d312efda-ec2b-42ec-9e2c-84981795c581 + label: my-text-field + required: true + type: text + - key: fcc6840d-eb14-42df-8aaf-232201a705ec + label: my-toggle + required: false + type: toggle + update_case_configuration_response: + summary: This is an example response when the case configuration was updated. + value: + closure_type: close-by-user + customFields: + - key: d312efda-ec2b-42ec-9e2c-84981795c581 + label: my-text-field + required: true + type: text + - key: fcc6840d-eb14-42df-8aaf-232201a705ec + label: my-toggle + required: false + type: toggle + owner: cases + created_at: '2023-10-01T17:07:17.767Z' + created_by: + username: elastic + email: null, + full_name: null + profile_uid: u_mGBROF_q5bmFCATbLXAcCwKa0k8JvONAwSruelyKA5E_0 + updated_at: '2023-10-19T00:52:42.401Z' + updated_by: + username: elastic + full_name: null + email: null + profile_uid: u_mGBROF_q5bmFCATbLXAcCwKa0k8JvONAwSruelyKA5E_0 + connector: + id: 5e656730-e1ca-11ec-be9b-9b1838238ee6 + name: my-jira-connector + type: .jira + fields: null + mappings: + - source: title + target: summary + action_type: overwrite + - source: description + target: description + action_type: overwrite + - source: comments + target: comments + action_type: append + version: zEzNSw1XQ== + error: null + id: 4a97a440-e1cd-11ec-be9b-9b1838238ee6 get_reporters_response: - summary: A list of three users that opened cases + summary: A list of two users that opened cases value: - username: elastic full_name: null email: null - - username: user1 - full_name: User 1 - email: user1@elastic.co - - username: user2 - full_name: User 2 - email: user2@elastic.co - get_status_response: - summary: Get the number of cases in each state. - value: - count_open_cases: 27 - count_in_progress_cases: 50 - count_closed_cases: 198 + profile_uid: u_mGBROF_q5bmFCATbLXAcCwKa0k8JvONAwSruelyKA5E_0 + - username: jdoe + full_name: Jane Doe + email: jdoe@example.com + profile_uid: u_0wpfV1MqYDaXzLtRVY-gLMrddKDEmfz51Fszhj7hWC8_0 get_tags_response: summary: A list of tags that are used in cases value: @@ -4421,11 +4754,12 @@ components: type: user owner: cases comment: A new comment - created_at: '2022-07-13T15:40:32.335Z' + created_at: '2023-10-13T15:40:32.335Z' created_by: email: null full_name: null username: elastic + profile_uid: u_mGBROF_q5bmFCATbLXAcCwKa0k8JvONAwSruelyKA5E_0 pushed_at: null pushed_by: null updated_at: null @@ -4438,22 +4772,31 @@ components: settings: syncAlerts: true owner: cases + customFields: + - type: text + key: d312efda-ec2b-42ec-9e2c-84981795c581 + value: My field value + - key: fcc6840d-eb14-42df-8aaf-232201a705ec + type: toggle + value: null description: A case description duration: null severity: low closed_at: null closed_by: null - created_at: '2022-07-13T15:33:50.604Z' + created_at: '2023-10-13T15:33:50.604Z' created_by: username: elastic email: null full_name: null + profile_uid: u_mGBROF_q5bmFCATbLXAcCwKa0k8JvONAwSruelyKA5E_0 status: open - updated_at: '2022-07-13T15:40:32.335Z' + updated_at: '2023-10-13T15:40:32.335Z' updated_by: full_name: null email: null username: elastic + profile_uid: u_mGBROF_q5bmFCATbLXAcCwKa0k8JvONAwSruelyKA5E_0 assignees: - uid: u_mGBROF_q5bmFCATbLXAcCwKa0k8JvONAwSruelyKA5E_0 connector: @@ -4483,7 +4826,7 @@ components: type: user owner: cases comment: A new comment. - created_at: '2022-06-02T00:49:47.716Z' + created_at: '2022-10-02T00:49:47.716Z' created_by: username: elastic email: null @@ -4496,6 +4839,15 @@ components: tags: - tag 1 description: A case description. + category: null + assignees: [] + customFields: + - key: d312efda-ec2b-42ec-9e2c-84981795c581 + type: text + value: Field value + - key: fcc6840d-eb14-42df-8aaf-232201a705ec + type: toggle + value: true settings: syncAlerts: false owner: cases @@ -4508,12 +4860,14 @@ components: username: elastic full_name: null email: null + profile_uid: u_mGBROF_q5bmFCATbLXAcCwKa0k8JvONAwSruelyKA5E_0 status: open updated_at: '2022-06-03T00:49:47.716Z' updated_by: username: elastic email: null full_name: null + profile_uid: u_mGBROF_q5bmFCATbLXAcCwKa0k8JvONAwSruelyKA5E_0 connector: id: none name: none @@ -4537,18 +4891,20 @@ components: comment: An updated comment. type: user owner: cases - created_at: '2022-03-24T00:37:10.832Z' + created_at: '2023-10-24T00:37:10.832Z' created_by: username: elastic full_name: null email: null + profile_uid: u_mGBROF_q5bmFCATbLXAcCwKa0k8JvONAwSruelyKA5E_0 pushed_at: null pushed_by: null - updated_at: '2022-03-24T01:27:06.210Z' + updated_at: '2023-10-24T01:27:06.210Z' updated_by: username: elastic full_name: null email: null + profile_uid: u_mGBROF_q5bmFCATbLXAcCwKa0k8JvONAwSruelyKA5E_0 totalAlerts: 0 id: 293f1bc0-74f6-11ea-b83a-553aecdb28b6 version: WzIwNjM2LDFd @@ -4560,21 +4916,32 @@ components: settings: syncAlerts: false owner: cases + category: null + assignees: [] + customFields: + - key: d312efda-ec2b-42ec-9e2c-84981795c581 + type: text + value: My new field value + - key: fcc6840d-eb14-42df-8aaf-232201a705ec + type: toggle + value: false duration: null severity: low closed_at: null closed_by: null - created_at: '2022-03-24T00:37:03.906Z' + created_at: '2023-10-24T00:37:03.906Z' created_by: username: elastic full_name: null email: null + profile_uid: u_mGBROF_q5bmFCATbLXAcCwKa0k8JvONAwSruelyKA5E_0 status: open - updated_at: '2022-03-24T01:27:06.210Z' + updated_at: '2023-10-24T01:27:06.210Z' updated_by: username: elastic full_name: null email: null + profile_uid: u_mGBROF_q5bmFCATbLXAcCwKa0k8JvONAwSruelyKA5E_0 connector: id: none name: none @@ -4589,11 +4956,12 @@ components: type: user owner: cases comment: A new comment - created_at: '2022-07-07T19:32:13.104Z' + created_at: '2023-10-07T19:32:13.104Z' created_by: email: null full_name: null username: elastic + profile_uid: u_mGBROF_q5bmFCATbLXAcCwKa0k8JvONAwSruelyKA5E_0 pushed_at: null pushed_by: null updated_at: null @@ -4647,122 +5015,58 @@ components: external_title: ES-554 external_url: https://cases.jira.com connector_id: 09f8c0b0-0eda-11ed-bd18-65557fe66949 - get_case_activity_response: - summary: Retrieves all activity for a case - value: - - action_id: b4cd0770-07c9-11ed-a5fd-47154cb8767e - action: create - case_id: 22df07d0-03b1-11ed-920c-974bfa104448 - comment_id: 578608d0-03b1-11ed-920c-974bfa104448 - created_at: '2022-07-20T01:17:22.150Z' - created_by: - username: elastic - email: null - full_name: null - owner: cases - payload: - assignees: null - connector: - name: none - type: .none - fields: null - id: none - description: test - tags: - - mine - title: test-case - owner: cases - settings: - syncAlerts: false - severity: low - status: open - type: create_case - type: comment - - action_id: 57af14a0-03b1-11ed-920c-974bfa104448 - action: create - case_id: 22df07d0-03b1-11ed-920c-974bfa104448 - comment_id: 578608d0-03b1-11ed-920c-974bfa104448 - created_at: '2022-07-14T20:12:53.354Z' - created_by: - username: elastic - email: null - full_name: null - owner: cases - payload: - comment: A new comment - owner: cases - type: user - type: comment - - action_id: 573c6980-6123-11ed-aa41-81a0a61fe447 - action: add - case_id: 22df07d0-03b1-11ed-920c-974bfa104448 - comment_id: null - created_at: '2022-07-20T01:10:28.238Z' - created_by: - username: elastic - email: null - full_name: null - profile_uid: u_mGBROF_q5bmFCATbLXAcCwKa0k8JvONAwSruelyKA5E_0 - owner: cases - payload: - assignees: - uid: u_mGBROF_q5bmFCATbLXAcCwKa0k8JvONAwSruelyKA5E_0 - type: assignees - - action_id: fff460e0-07c9-11ed-a5fd-47154cb8767e - action: delete - case_id: 22df07d0-03b1-11ed-920c-974bfa104448 - comment_id: null - created_at: '2022-07-20T01:19:28.238Z' - created_by: - username: elastic - email: null - full_name: null - owner: cases - payload: null - type: delete_case find_case_activity_response: summary: Retrieves all activity for a case value: page: 1 perPage: 20 - total: 4 + total: 3 userActions: - id: b4cd0770-07c9-11ed-a5fd-47154cb8767e action: create - comment_id: 578608d0-03b1-11ed-920c-974bfa104448 - created_at: '2022-07-20T01:17:22.150Z' + comment_id: null + created_at: '2023-10-20T01:17:22.150Z' created_by: username: elastic email: null full_name: null + profile_uid: u_mGBROF_q5bmFCATbLXAcCwKa0k8JvONAwSruelyKA5E_0 owner: cases payload: - assignees: null + assignees: [] connector: name: none type: .none fields: null id: none - description: test + description: A case description. tags: - - mine - title: test-case + - tag 1 + title: Case title 1 owner: cases settings: syncAlerts: false severity: low status: open - type: create_case + category: null + customFields: + - key: d312efda-ec2b-42ec-9e2c-84981795c581 + type: text + value: My field value + - key: fcc6840d-eb14-42df-8aaf-232201a705ec + type: toggle + value: null version: WzM1ODg4LDFd - type: comment + type: create_case - id: 57af14a0-03b1-11ed-920c-974bfa104448 action: create comment_id: 578608d0-03b1-11ed-920c-974bfa104448 - created_at: '2022-07-14T20:12:53.354Z' + created_at: '2023-10-14T20:12:53.354Z' created_by: username: elastic email: null full_name: null + profile_uid: u_mGBROF_q5bmFCATbLXAcCwKa0k8JvONAwSruelyKA5E_0 owner: cases payload: comment: A new comment @@ -4773,7 +5077,7 @@ components: - id: 573c6980-6123-11ed-aa41-81a0a61fe447 action: add comment_id: null - created_at: '2022-07-20T01:10:28.238Z' + created_at: '2023-10-20T01:10:28.238Z' created_by: username: elastic email: null diff --git a/x-pack/plugins/cases/docs/openapi/components/examples/add_comment_response.yaml b/x-pack/plugins/cases/docs/openapi/components/examples/add_comment_response.yaml index 382629e4fab085..d47129cad1defb 100644 --- a/x-pack/plugins/cases/docs/openapi/components/examples/add_comment_response.yaml +++ b/x-pack/plugins/cases/docs/openapi/components/examples/add_comment_response.yaml @@ -6,7 +6,7 @@ value: type: user owner: cases comment: A new comment. - created_at: '2022-06-02T00:49:47.716Z' + created_at: '2022-10-02T00:49:47.716Z' created_by: username: elastic email: null @@ -19,6 +19,15 @@ value: tags: - tag 1 description: A case description. + category: null + assignees: [] + customFields: + - key: d312efda-ec2b-42ec-9e2c-84981795c581 + type: text + value: Field value + - key: fcc6840d-eb14-42df-8aaf-232201a705ec + type: toggle + value: true settings: syncAlerts: false owner: cases @@ -31,12 +40,14 @@ value: username: elastic full_name: null email: null + profile_uid: u_mGBROF_q5bmFCATbLXAcCwKa0k8JvONAwSruelyKA5E_0 status: open updated_at: '2022-06-03T00:49:47.716Z' updated_by: username: elastic email: null full_name: null + profile_uid: u_mGBROF_q5bmFCATbLXAcCwKa0k8JvONAwSruelyKA5E_0 connector: id: none name: none diff --git a/x-pack/plugins/cases/docs/openapi/components/examples/create_case_request.yaml b/x-pack/plugins/cases/docs/openapi/components/examples/create_case_request.yaml index 0e5b6c01aa3b69..7f726021ad550a 100644 --- a/x-pack/plugins/cases/docs/openapi/components/examples/create_case_request.yaml +++ b/x-pack/plugins/cases/docs/openapi/components/examples/create_case_request.yaml @@ -17,5 +17,12 @@ value: "settings": { "syncAlerts": true }, - "owner": "cases" + "owner": "cases", + "customFields": [ + { + "type": "text", + "key": "d312efda-ec2b-42ec-9e2c-84981795c581", + "value": "My field value" + } + ] } diff --git a/x-pack/plugins/cases/docs/openapi/components/examples/create_case_response.yaml b/x-pack/plugins/cases/docs/openapi/components/examples/create_case_response.yaml index 8cd80595abf30e..3fd4a41b87ae4a 100644 --- a/x-pack/plugins/cases/docs/openapi/components/examples/create_case_response.yaml +++ b/x-pack/plugins/cases/docs/openapi/components/examples/create_case_response.yaml @@ -4,24 +4,32 @@ value: totalAlerts: 0 id: 66b9aa00-94fa-11ea-9f74-e7e108796192 version: WzUzMiwxXQ== - totalComment: 1 + totalComment: 0 title: Case title 1 tags: - tag 1 assignees: [] description: A case description. settings: - syncAlerts: false + syncAlerts: true owner: cases + customFields: + - key: d312efda-ec2b-42ec-9e2c-84981795c581 + type: text + value: My field value + - key: fcc6840d-eb14-42df-8aaf-232201a705ec + type: toggle + value: null duration: null severity: low closed_at: null closed_by: null - created_at: '2022-03-24T00:37:03.906Z' + created_at: '2022-10-13T15:33:50.604Z' created_by: username: elastic full_name: null email: null + profile_uid: u_mGBROF_q5bmFCATbLXAcCwKa0k8JvONAwSruelyKA5E_0 status: open updated_at: null updated_by: null diff --git a/x-pack/plugins/cases/docs/openapi/components/examples/find_case_activity_response.yaml b/x-pack/plugins/cases/docs/openapi/components/examples/find_case_activity_response.yaml index 49d5bd7684a740..cb5f9570845aa5 100644 --- a/x-pack/plugins/cases/docs/openapi/components/examples/find_case_activity_response.yaml +++ b/x-pack/plugins/cases/docs/openapi/components/examples/find_case_activity_response.yaml @@ -2,44 +2,53 @@ summary: Retrieves all activity for a case value: page: 1 perPage: 20 - total: 4 + total: 3 userActions: - id: b4cd0770-07c9-11ed-a5fd-47154cb8767e action: create - comment_id: 578608d0-03b1-11ed-920c-974bfa104448 - created_at: 2022-07-20T01:17:22.150Z + comment_id: null + created_at: 2023-10-20T01:17:22.150Z created_by: username: elastic email: null full_name: null + profile_uid: u_mGBROF_q5bmFCATbLXAcCwKa0k8JvONAwSruelyKA5E_0 owner: cases payload: - assignees: + assignees: [] connector: name: none type: .none fields: null id: none - description: test + description: A case description. tags: - - mine - title: test-case + - tag 1 + title: Case title 1 owner: cases settings: syncAlerts: false severity: low status: open - type: create_case + category: null + customFields: + - key: d312efda-ec2b-42ec-9e2c-84981795c581 + type: text + value: My field value + - key: fcc6840d-eb14-42df-8aaf-232201a705ec + type: toggle + value: null version: WzM1ODg4LDFd - type: comment + type: create_case - id: 57af14a0-03b1-11ed-920c-974bfa104448 action: create comment_id: 578608d0-03b1-11ed-920c-974bfa104448 - created_at: 2022-07-14T20:12:53.354Z + created_at: 2023-10-14T20:12:53.354Z created_by: username: elastic email: null full_name: null + profile_uid: u_mGBROF_q5bmFCATbLXAcCwKa0k8JvONAwSruelyKA5E_0 owner: cases payload: comment: A new comment @@ -50,7 +59,7 @@ value: - id: 573c6980-6123-11ed-aa41-81a0a61fe447 action: add comment_id: null - created_at: 2022-07-20T01:10:28.238Z + created_at: 2023-10-20T01:10:28.238Z created_by: username: elastic email: null diff --git a/x-pack/plugins/cases/docs/openapi/components/examples/find_case_response.yaml b/x-pack/plugins/cases/docs/openapi/components/examples/find_case_response.yaml index 6f744d03a1365d..4c7448c12a9ab1 100644 --- a/x-pack/plugins/cases/docs/openapi/components/examples/find_case_response.yaml +++ b/x-pack/plugins/cases/docs/openapi/components/examples/find_case_response.yaml @@ -16,24 +16,39 @@ value: "description": "Case description", "settings": { "syncAlerts": true }, "owner": "cases", + "customFields": [ + { + "type": "text", + "key": "d312efda-ec2b-42ec-9e2c-84981795c581", + "value": "My field value" + }, + { + "key": "fcc6840d-eb14-42df-8aaf-232201a705ec", + "type": "toggle", + "value": null + } + ], "duration": null, "severity": "low", "closed_at": null, "closed_by": null, - "created_at": "2022-05-12T00:16:36.371Z", + "created_at": "2023-10-12T00:16:36.371Z", "created_by": { "email": null, "full_name": null, - "username": "elastic" + "username": "elastic", + "profile_uid": "u_mGBROF_q5bmFCATbLXAcCwKa0k8JvONAwSruelyKA5E_0" }, "status": "open", - "updated_at": "2022-05-12T00:27:58.162Z", + "updated_at": "2023-10-12T00:27:58.162Z", "updated_by": { "email": null, "full_name": null, - "username": "elastic" + "username": "elastic", + "profile_uid": "u_mGBROF_q5bmFCATbLXAcCwKa0k8JvONAwSruelyKA5E_0" }, "assignees": [], + "category": null, "connector": { "id": "none", "name": "none", diff --git a/x-pack/plugins/cases/docs/openapi/components/examples/get_case_activity_response.yaml b/x-pack/plugins/cases/docs/openapi/components/examples/get_case_activity_response.yaml deleted file mode 100644 index 3cdafb4b26ef89..00000000000000 --- a/x-pack/plugins/cases/docs/openapi/components/examples/get_case_activity_response.yaml +++ /dev/null @@ -1,72 +0,0 @@ -summary: Retrieves all activity for a case -value: - - action_id: b4cd0770-07c9-11ed-a5fd-47154cb8767e - action: create - case_id: 22df07d0-03b1-11ed-920c-974bfa104448 - comment_id: 578608d0-03b1-11ed-920c-974bfa104448 - created_at: 2022-07-20T01:17:22.150Z - created_by: - username: elastic - email: null - full_name: null - owner: cases - payload: - assignees: - connector: - name: none - type: .none - fields: null - id: none - description: test - tags: - - mine - title: test-case - owner: cases - settings: - syncAlerts: false - severity: low - status: open - type: create_case - type: comment - - action_id: 57af14a0-03b1-11ed-920c-974bfa104448 - action: create - case_id: 22df07d0-03b1-11ed-920c-974bfa104448 - comment_id: 578608d0-03b1-11ed-920c-974bfa104448 - created_at: 2022-07-14T20:12:53.354Z - created_by: - username: elastic - email: null - full_name: null - owner: cases - payload: - comment: A new comment - owner: cases - type: user - type: comment - - action_id: 573c6980-6123-11ed-aa41-81a0a61fe447 - action: add - case_id: 22df07d0-03b1-11ed-920c-974bfa104448 - comment_id: null - created_at: 2022-07-20T01:10:28.238Z - created_by: - username: elastic - email: null - full_name: null - profile_uid: u_mGBROF_q5bmFCATbLXAcCwKa0k8JvONAwSruelyKA5E_0 - owner: cases - payload: - assignees: - uid: u_mGBROF_q5bmFCATbLXAcCwKa0k8JvONAwSruelyKA5E_0 - type: assignees - - action_id: fff460e0-07c9-11ed-a5fd-47154cb8767e - action: delete - case_id: 22df07d0-03b1-11ed-920c-974bfa104448 - comment_id: null - created_at: 2022-07-20T01:19:28.238Z - created_by: - username: elastic - email: null - full_name: null - owner: cases - payload: - type: delete_case \ No newline at end of file diff --git a/x-pack/plugins/cases/docs/openapi/components/examples/get_case_configuration_response.yaml b/x-pack/plugins/cases/docs/openapi/components/examples/get_case_configuration_response.yaml new file mode 100644 index 00000000000000..8b9197600917f1 --- /dev/null +++ b/x-pack/plugins/cases/docs/openapi/components/examples/get_case_configuration_response.yaml @@ -0,0 +1,25 @@ +summary: Get the case configuration. +value: + - id: 856ee650-6c82-11ee-a20a-6164169afa58 + closure_type: close-by-user + customFields: + - key: d312efda-ec2b-42ec-9e2c-84981795c581 + label: my-text-field + required: false + type: text + owner: cases + created_at: 2023-06-01T17:07:17.767Z + created_by: + username: elastic + email: null + full_name: null + updated_at: null + updated_by: null + connector: + id: none + name: none + type: .none + fields: null + mappings: [] + version: WzUxLDRd + error: null diff --git a/x-pack/plugins/cases/docs/openapi/components/examples/get_case_response.yaml b/x-pack/plugins/cases/docs/openapi/components/examples/get_case_response.yaml index bd74fa423bb9c5..d4fc3db97a169a 100644 --- a/x-pack/plugins/cases/docs/openapi/components/examples/get_case_response.yaml +++ b/x-pack/plugins/cases/docs/openapi/components/examples/get_case_response.yaml @@ -9,11 +9,12 @@ value: "type":"user", "owner":"cases", "comment":"A new comment", - "created_at":"2022-07-13T15:40:32.335Z", + "created_at":"2023-10-13T15:40:32.335Z", "created_by":{ "email":null, "full_name":null, - "username":"elastic" + "username":"elastic", + "profile_uid": "u_mGBROF_q5bmFCATbLXAcCwKa0k8JvONAwSruelyKA5E_0" }, "pushed_at":null, "pushed_by":null, @@ -26,15 +27,38 @@ value: "tags":["tag 1"], "settings":{"syncAlerts":true}, "owner":"cases", + "customFields": [ + { + "type": "text", + "key": "d312efda-ec2b-42ec-9e2c-84981795c581", + "value": "My field value" + }, + { + "key": "fcc6840d-eb14-42df-8aaf-232201a705ec", + "type": "toggle", + "value": null + } + ], "description":"A case description", "duration":null, "severity":"low", "closed_at":null, "closed_by":null, - "created_at":"2022-07-13T15:33:50.604Z", - "created_by":{"username":"elastic","email":null,"full_name":null},"status":"open", - "updated_at":"2022-07-13T15:40:32.335Z", - "updated_by":{"full_name":null,"email":null,"username":"elastic"}, + "created_at":"2023-10-13T15:33:50.604Z", + "created_by":{ + "username":"elastic", + "email":null, + "full_name":null, + "profile_uid": "u_mGBROF_q5bmFCATbLXAcCwKa0k8JvONAwSruelyKA5E_0" + }, + "status":"open", + "updated_at":"2023-10-13T15:40:32.335Z", + "updated_by":{ + "full_name":null, + "email":null, + "username":"elastic", + "profile_uid": "u_mGBROF_q5bmFCATbLXAcCwKa0k8JvONAwSruelyKA5E_0" + }, "assignees":[{"uid":"u_mGBROF_q5bmFCATbLXAcCwKa0k8JvONAwSruelyKA5E_0"}], "connector":{ "id":"none", diff --git a/x-pack/plugins/cases/docs/openapi/components/examples/get_comment_response.yaml b/x-pack/plugins/cases/docs/openapi/components/examples/get_comment_response.yaml index dd2baedd8eda35..8a022ae7d7503a 100644 --- a/x-pack/plugins/cases/docs/openapi/components/examples/get_comment_response.yaml +++ b/x-pack/plugins/cases/docs/openapi/components/examples/get_comment_response.yaml @@ -6,11 +6,12 @@ value: "type":"user", "owner":"cases", "comment":"A new comment", - "created_at":"2022-07-07T19:32:13.104Z", + "created_at":"2023-10-07T19:32:13.104Z", "created_by":{ "email":null, "full_name":null, - "username":"elastic" + "username":"elastic", + "profile_uid": "u_mGBROF_q5bmFCATbLXAcCwKa0k8JvONAwSruelyKA5E_0" }, "pushed_at":null, "pushed_by":null, diff --git a/x-pack/plugins/cases/docs/openapi/components/examples/get_reporters_response.yaml b/x-pack/plugins/cases/docs/openapi/components/examples/get_reporters_response.yaml index 3651f31c97d6bf..f68df281fb5094 100644 --- a/x-pack/plugins/cases/docs/openapi/components/examples/get_reporters_response.yaml +++ b/x-pack/plugins/cases/docs/openapi/components/examples/get_reporters_response.yaml @@ -1,7 +1,16 @@ -summary: A list of three users that opened cases +summary: A list of two users that opened cases value: [ - {"username":"elastic","full_name":null,"email":null}, - {"username":"user1","full_name":"User 1","email":"user1@elastic.co"}, - {"username":"user2","full_name":"User 2","email":"user2@elastic.co"} + { + "username":"elastic", + "full_name":null, + "email":null, + "profile_uid": "u_mGBROF_q5bmFCATbLXAcCwKa0k8JvONAwSruelyKA5E_0" + }, + { + "username":"jdoe", + "full_name":"Jane Doe", + "email":"jdoe@example.com", + "profile_uid": "u_0wpfV1MqYDaXzLtRVY-gLMrddKDEmfz51Fszhj7hWC8_0" + } ] \ No newline at end of file diff --git a/x-pack/plugins/cases/docs/openapi/components/examples/get_status_response.yaml b/x-pack/plugins/cases/docs/openapi/components/examples/get_status_response.yaml deleted file mode 100644 index 8a3883fe928730..00000000000000 --- a/x-pack/plugins/cases/docs/openapi/components/examples/get_status_response.yaml +++ /dev/null @@ -1,7 +0,0 @@ -summary: Get the number of cases in each state. -value: - { - "count_open_cases": 27, - "count_in_progress_cases": 50, - "count_closed_cases": 198 - } \ No newline at end of file diff --git a/x-pack/plugins/cases/docs/openapi/components/examples/set_case_configuration_request.yaml b/x-pack/plugins/cases/docs/openapi/components/examples/set_case_configuration_request.yaml index 4aa5a56b1ad0fe..472a33d9feacbc 100644 --- a/x-pack/plugins/cases/docs/openapi/components/examples/set_case_configuration_request.yaml +++ b/x-pack/plugins/cases/docs/openapi/components/examples/set_case_configuration_request.yaml @@ -6,4 +6,9 @@ value: name: my-jira-connector type: .jira fields: null - closure_type: close-by-user \ No newline at end of file + closure_type: close-by-user + customFields: + - key: d312efda-ec2b-42ec-9e2c-84981795c581 + label: my-text-field + required: false + type: text \ No newline at end of file diff --git a/x-pack/plugins/cases/docs/openapi/components/examples/set_case_configuration_response.yaml b/x-pack/plugins/cases/docs/openapi/components/examples/set_case_configuration_response.yaml index 9290e1ed432685..d5a9f7205e23db 100644 --- a/x-pack/plugins/cases/docs/openapi/components/examples/set_case_configuration_response.yaml +++ b/x-pack/plugins/cases/docs/openapi/components/examples/set_case_configuration_response.yaml @@ -1,12 +1,18 @@ -summary: This is an example response when the case configuration was updated. +summary: This is an example response for case settings. value: closure_type: close-by-user + customFields: + - key: d312efda-ec2b-42ec-9e2c-84981795c581 + label: my-text-field + required: false + type: text owner: cases - created_at: 2022-06-01T17:07:17.767Z + created_at: 2023-10-01T17:07:17.767Z created_by: username: elastic email: null, full_name: null + profile_uid: u_mGBROF_q5bmFCATbLXAcCwKa0k8JvONAwSruelyKA5E_0 updated_at: null updated_by: null connector: diff --git a/x-pack/plugins/cases/docs/openapi/components/examples/update_case_configuration_request.yaml b/x-pack/plugins/cases/docs/openapi/components/examples/update_case_configuration_request.yaml new file mode 100644 index 00000000000000..83d617b17946b1 --- /dev/null +++ b/x-pack/plugins/cases/docs/openapi/components/examples/update_case_configuration_request.yaml @@ -0,0 +1,18 @@ +summary: Update the case settings. +value: + version: WzExOSw0XQ== + connector: + id: 5e656730-e1ca-11ec-be9b-9b1838238ee6 + name: my-jira-connector + type: .jira + fields: null + closure_type: close-by-user + customFields: + - key: d312efda-ec2b-42ec-9e2c-84981795c581 + label: my-text-field + required: true + type: text + - key: fcc6840d-eb14-42df-8aaf-232201a705ec + label: my-toggle + required: false + type: toggle \ No newline at end of file diff --git a/x-pack/plugins/cases/docs/openapi/components/examples/update_case_configuration_response.yaml b/x-pack/plugins/cases/docs/openapi/components/examples/update_case_configuration_response.yaml new file mode 100644 index 00000000000000..6dd1da4d6f1f10 --- /dev/null +++ b/x-pack/plugins/cases/docs/openapi/components/examples/update_case_configuration_response.yaml @@ -0,0 +1,43 @@ +summary: This is an example response when the case configuration was updated. +value: + closure_type: close-by-user + customFields: + - key: d312efda-ec2b-42ec-9e2c-84981795c581 + label: my-text-field + required: true + type: text + - key: fcc6840d-eb14-42df-8aaf-232201a705ec + label: my-toggle + required: false + type: toggle + owner: cases + created_at: 2023-10-01T17:07:17.767Z + created_by: + username: elastic + email: null, + full_name: null + profile_uid: u_mGBROF_q5bmFCATbLXAcCwKa0k8JvONAwSruelyKA5E_0 + updated_at: 2023-10-19T00:52:42.401Z + updated_by: + username: elastic + full_name: null + email: null + profile_uid: u_mGBROF_q5bmFCATbLXAcCwKa0k8JvONAwSruelyKA5E_0 + connector: + id: 5e656730-e1ca-11ec-be9b-9b1838238ee6 + name: my-jira-connector + type: .jira + fields: null + mappings: + - source: title + target: summary + action_type: overwrite + - source: description + target: description + action_type: overwrite + - source: comments + target: comments + action_type: append + version: zEzNSw1XQ== + error: null + id: 4a97a440-e1cd-11ec-be9b-9b1838238ee6 \ No newline at end of file diff --git a/x-pack/plugins/cases/docs/openapi/components/examples/update_case_request.yaml b/x-pack/plugins/cases/docs/openapi/components/examples/update_case_request.yaml index 0cc85214566701..948227a85ee6d1 100644 --- a/x-pack/plugins/cases/docs/openapi/components/examples/update_case_request.yaml +++ b/x-pack/plugins/cases/docs/openapi/components/examples/update_case_request.yaml @@ -19,7 +19,19 @@ value: "tags": [ "tag-1" ], "settings": { "syncAlerts": true - } + }, + "customFields": [ + { + "key": "fcc6840d-eb14-42df-8aaf-232201a705ec", + "type": "toggle", + "value": false + }, + { + "key": "d312efda-ec2b-42ec-9e2c-84981795c581", + "type": "text", + "value": "My new field value" + } + ] } ] -} \ No newline at end of file + } \ No newline at end of file diff --git a/x-pack/plugins/cases/docs/openapi/components/examples/update_case_response.yaml b/x-pack/plugins/cases/docs/openapi/components/examples/update_case_response.yaml index eaf421771b51e9..7a40d9a3a7cf90 100644 --- a/x-pack/plugins/cases/docs/openapi/components/examples/update_case_response.yaml +++ b/x-pack/plugins/cases/docs/openapi/components/examples/update_case_response.yaml @@ -18,20 +18,35 @@ value: "severity": "low", "closed_at": null, "closed_by": null, - "created_at": "2022-05-13T09:16:17.416Z", + "created_at": "2023-10-13T09:16:17.416Z", "created_by": { "email": null, "full_name": null, - "username": "elastic" + "username": "elastic", + "profile_uid": "u_mGBROF_q5bmFCATbLXAcCwKa0k8JvONAwSruelyKA5E_0" }, "status": "open", - "updated_at": "2022-05-13T09:48:33.043Z", + "updated_at": "2023-10-13T09:48:33.043Z", "updated_by": { "email": null, "full_name": null, - "username": "elastic" + "username": "elastic", + "profile_uid": "u_mGBROF_q5bmFCATbLXAcCwKa0k8JvONAwSruelyKA5E_0" }, "assignees": [], + "category": null, + "customFields": [ + { + "key": "d312efda-ec2b-42ec-9e2c-84981795c581", + "type": "text", + "value": "My new field value" + }, + { + "key": "fcc6840d-eb14-42df-8aaf-232201a705ec", + "type": "toggle", + "value": false + } + ], "connector": { "id": "131d4448-abe0-4789-939d-8ef60680b498", "name": "My connector", @@ -50,7 +65,7 @@ value: "username": "elastic" }, "external_url": "https://hms.atlassian.net/browse/IS-4", - "pushed_at": "2022-05-13T09:20:40.672Z", + "pushed_at": "2023-10-13T09:20:40.672Z", "connector_id": "05da469f-1fde-4058-99a3-91e4807e2de8", "external_id": "10003", "connector_name": "Jira" diff --git a/x-pack/plugins/cases/docs/openapi/components/examples/update_comment_response.yaml b/x-pack/plugins/cases/docs/openapi/components/examples/update_comment_response.yaml index 4c81e759a92f98..bbd32c3b1e9fd7 100644 --- a/x-pack/plugins/cases/docs/openapi/components/examples/update_comment_response.yaml +++ b/x-pack/plugins/cases/docs/openapi/components/examples/update_comment_response.yaml @@ -6,18 +6,20 @@ value: comment: An updated comment. type: user owner: cases - created_at: '2022-03-24T00:37:10.832Z' + created_at: '2023-10-24T00:37:10.832Z' created_by: username: elastic full_name: null email: null + profile_uid: u_mGBROF_q5bmFCATbLXAcCwKa0k8JvONAwSruelyKA5E_0 pushed_at: null pushed_by: null - updated_at: '2022-03-24T01:27:06.210Z' + updated_at: '2023-10-24T01:27:06.210Z' updated_by: username: elastic full_name: null email: null + profile_uid: u_mGBROF_q5bmFCATbLXAcCwKa0k8JvONAwSruelyKA5E_0 totalAlerts: 0 id: 293f1bc0-74f6-11ea-b83a-553aecdb28b6 version: WzIwNjM2LDFd @@ -29,21 +31,32 @@ value: settings: syncAlerts: false owner: cases + category: null + assignees: [] + customFields: + - key: d312efda-ec2b-42ec-9e2c-84981795c581 + type: text + value: My new field value + - key: fcc6840d-eb14-42df-8aaf-232201a705ec + type: toggle + value: false duration: null severity: low closed_at: null closed_by: null - created_at: '2022-03-24T00:37:03.906Z' + created_at: '2023-10-24T00:37:03.906Z' created_by: username: elastic full_name: null email: null + profile_uid: u_mGBROF_q5bmFCATbLXAcCwKa0k8JvONAwSruelyKA5E_0 status: open - updated_at: '2022-03-24T01:27:06.210Z' + updated_at: '2023-10-24T01:27:06.210Z' updated_by: username: elastic full_name: null email: null + profile_uid: u_mGBROF_q5bmFCATbLXAcCwKa0k8JvONAwSruelyKA5E_0 connector: id: none name: none diff --git a/x-pack/plugins/cases/docs/openapi/components/schemas/alert_comment_response_properties.yaml b/x-pack/plugins/cases/docs/openapi/components/schemas/alert_comment_response_properties.yaml index 056abad0a300bf..aa39aad1381a02 100644 --- a/x-pack/plugins/cases/docs/openapi/components/schemas/alert_comment_response_properties.yaml +++ b/x-pack/plugins/cases/docs/openapi/components/schemas/alert_comment_response_properties.yaml @@ -12,6 +12,10 @@ properties: example: 2022-03-24T02:31:03.210Z created_by: type: object + required: + - email + - full_name + - username properties: $ref: 'user_properties.yaml' id: @@ -29,6 +33,10 @@ properties: nullable: true pushed_by: type: object + required: + - email + - full_name + - username properties: $ref: 'user_properties.yaml' nullable: true @@ -47,6 +55,10 @@ properties: example: null updated_by: type: object + required: + - email + - full_name + - username properties: $ref: 'user_properties.yaml' version: diff --git a/x-pack/plugins/cases/docs/openapi/components/schemas/case_configure_customfields.yaml b/x-pack/plugins/cases/docs/openapi/components/schemas/case_configure_customfields.yaml new file mode 100644 index 00000000000000..344e17b00617dc --- /dev/null +++ b/x-pack/plugins/cases/docs/openapi/components/schemas/case_configure_customfields.yaml @@ -0,0 +1,24 @@ +key: + description: > + A unique key for the custom field. + Must be lower case and composed only of a-z, 0-9, '_', and '-' characters. + It is used in API calls to refer to a specific custom field. + type: string + minLength: 1 + maxLength: 36 +label: + description: The custom field label that is displayed in the case. + type: string + minLength: 1 + maxLength: 50 +required: + description: > + Indicates whether the field is required. + If `false`, the custom field can be set to null or omitted when a case is created or updated. + type: boolean +type: + description: The type of the custom field. + type: string + enum: + - text + - toggle \ No newline at end of file diff --git a/x-pack/plugins/cases/docs/openapi/components/schemas/case_configure_response_properties.yaml b/x-pack/plugins/cases/docs/openapi/components/schemas/case_configure_response_properties.yaml index 90c969990f2e5f..62bddb7a2597b2 100644 --- a/x-pack/plugins/cases/docs/openapi/components/schemas/case_configure_response_properties.yaml +++ b/x-pack/plugins/cases/docs/openapi/components/schemas/case_configure_response_properties.yaml @@ -1,5 +1,13 @@ closure_type: $ref: 'closure_types.yaml' +customFields: + type: array + x-technical-preview: true + description: Custom fields configuration details. + items: + type: object + properties: + $ref: 'case_configure_customfields.yaml' connector: type: object properties: @@ -10,6 +18,10 @@ created_at: example: 2022-06-01T17:07:17.767Z created_by: type: object + required: + - email + - full_name + - username properties: $ref: 'user_properties.yaml' error: @@ -42,6 +54,10 @@ updated_at: example: 2022-06-01T19:58:48.169Z updated_by: type: object + required: + - email + - full_name + - username properties: $ref: 'user_properties.yaml' nullable: true diff --git a/x-pack/plugins/cases/docs/openapi/components/schemas/case_customfields.yaml b/x-pack/plugins/cases/docs/openapi/components/schemas/case_customfields.yaml new file mode 100644 index 00000000000000..4170833e818cc8 --- /dev/null +++ b/x-pack/plugins/cases/docs/openapi/components/schemas/case_customfields.yaml @@ -0,0 +1,25 @@ +key: + description: > + The unique identifier for the custom field. + The key value must exist in the case configuration settings. + type: string +type: + description: > + The custom field type. + It must match the type specified in the case configuration settings. + type: string + enum: + - text + - toggle +value: + description: > + The custom field value. + If the custom field is required, it cannot be explicitly set to null. + However, for cases that existed when the required custom field was added, the default value stored in Elasticsearch is `undefined`. + The value returned in the API and user interface in this case is `null`. + oneOf: + - type: string + minLength: 1 + maxLength: 160 + nullable: true + - type: boolean diff --git a/x-pack/plugins/cases/docs/openapi/components/schemas/case_response_properties.yaml b/x-pack/plugins/cases/docs/openapi/components/schemas/case_response_properties.yaml index cda4361ab4cc4f..60c6520d2f4c3d 100644 --- a/x-pack/plugins/cases/docs/openapi/components/schemas/case_response_properties.yaml +++ b/x-pack/plugins/cases/docs/openapi/components/schemas/case_response_properties.yaml @@ -25,6 +25,10 @@ required: properties: assignees: $ref: 'assignees.yaml' + category: + type: string + description: The case category. + nullable: true closed_at: type: string format: date-time @@ -60,6 +64,14 @@ properties: example: '2022-05-13T09:16:17.416Z' created_by: $ref: 'case_response_created_by_properties.yaml' + customFields: + type: array + description: Custom field values for the case. + x-technical-preview: true + items: + type: object + properties: + $ref: 'case_customfields.yaml' description: type: string example: A case description. diff --git a/x-pack/plugins/cases/docs/openapi/components/schemas/create_case_request.yaml b/x-pack/plugins/cases/docs/openapi/components/schemas/create_case_request.yaml index 7b3d8d8219ff79..71d3e036ac94b4 100644 --- a/x-pack/plugins/cases/docs/openapi/components/schemas/create_case_request.yaml +++ b/x-pack/plugins/cases/docs/openapi/components/schemas/create_case_request.yaml @@ -39,7 +39,7 @@ properties: type: string maxLength: 256 category: - description: Category for the case. It could be a word or a phrase to categorize the case. + description: A word or phrase that categorizes the case. type: string maxLength: 50 title: @@ -47,4 +47,18 @@ properties: type: string maxLength: 160 customFields: - $ref: 'custom_fields_property.yaml' + type: array + description: > + Custom field values for a case. + Any optional custom fields that are not specified in the request are set to null. + x-technical-preview: true + minItems: 0 + maxItems: 10 + items: + type: object + required: + - key + - type + - value + properties: + $ref: 'case_customfields.yaml' diff --git a/x-pack/plugins/cases/docs/openapi/components/schemas/custom_fields_property.yaml b/x-pack/plugins/cases/docs/openapi/components/schemas/custom_fields_property.yaml deleted file mode 100644 index 2b682960bd1f0e..00000000000000 --- a/x-pack/plugins/cases/docs/openapi/components/schemas/custom_fields_property.yaml +++ /dev/null @@ -1,31 +0,0 @@ -type: array -description: Values for custom fields of a case -minItems: 0 -maxItems: 5 -items: - type: object - required: - - key - - type - - field - properties: - key: - description: The key identifying the custom field. - type: string - type: - description: The type of the custom field. Should match the key and how the custom field was configured - type: string - field: - description: An object containing the value of the field. - type: object - required: - - value - properties: - value: - description: The value of the field. - nullable: true - type: array - items: - anyOf: - - type: string - - type: boolean diff --git a/x-pack/plugins/cases/docs/openapi/components/schemas/set_case_configuration_request.yaml b/x-pack/plugins/cases/docs/openapi/components/schemas/set_case_configuration_request.yaml index 44a3a8709a9399..043febb36c8b6c 100644 --- a/x-pack/plugins/cases/docs/openapi/components/schemas/set_case_configuration_request.yaml +++ b/x-pack/plugins/cases/docs/openapi/components/schemas/set_case_configuration_request.yaml @@ -18,15 +18,20 @@ properties: - id - name - type + customFields: + type: array + description: Custom fields case configuration. + x-technical-preview: true + minItems: 0 + maxItems: 10 + items: + type: object + required: + - key + - label + - required + - type + properties: + $ref: 'case_configure_customfields.yaml' owner: $ref: 'owners.yaml' - settings: - description: An object that contains the case settings. - type: object - properties: - syncAlerts: - description: Turns alert syncing on or off. - type: boolean - example: true - required: - - syncAlerts diff --git a/x-pack/plugins/cases/docs/openapi/components/schemas/update_case_configuration_request.yaml b/x-pack/plugins/cases/docs/openapi/components/schemas/update_case_configuration_request.yaml index 89c03715944c47..86ba2794ea19d2 100644 --- a/x-pack/plugins/cases/docs/openapi/components/schemas/update_case_configuration_request.yaml +++ b/x-pack/plugins/cases/docs/openapi/components/schemas/update_case_configuration_request.yaml @@ -16,6 +16,19 @@ properties: - id - name - type + customFields: + type: array + description: Custom fields case configuration. + x-technical-preview: true + items: + type: object + required: + - key + - label + - required + - type + properties: + $ref: 'case_configure_customfields.yaml' version: description: > The version of the connector. diff --git a/x-pack/plugins/cases/docs/openapi/components/schemas/update_case_request.yaml b/x-pack/plugins/cases/docs/openapi/components/schemas/update_case_request.yaml index 4bbac95630e47d..3fa99d40e50026 100644 --- a/x-pack/plugins/cases/docs/openapi/components/schemas/update_case_request.yaml +++ b/x-pack/plugins/cases/docs/openapi/components/schemas/update_case_request.yaml @@ -18,6 +18,10 @@ properties: properties: assignees: $ref: 'assignees.yaml' + category: + description: A word or phrase that categorizes the case. + type: string + maxLength: 50 connector: oneOf: - $ref: 'connector_properties_none.yaml' @@ -27,6 +31,22 @@ properties: - $ref: 'connector_properties_servicenow.yaml' - $ref: 'connector_properties_servicenow_sir.yaml' - $ref: 'connector_properties_swimlane.yaml' + customFields: + type: array + description: > + Custom field values for a case. + Any optional custom fields that are not specified in the request are set to null. + x-technical-preview: true + minItems: 0 + maxItems: 10 + items: + type: object + required: + - key + - type + - value + properties: + $ref: 'case_customfields.yaml' description: description: An updated description for the case. type: string @@ -47,10 +67,6 @@ properties: items: type: string maxLength: 256 - category: - description: Category for the case. It could be a word or a phrase to categorize the case. - type: string - maxLength: 50 title: description: A title for the case. type: string @@ -58,5 +74,3 @@ properties: version: description: The current version of the case. To determine this value, use the get case or find cases APIs. type: string - customFields: - $ref: 'custom_fields_property.yaml' diff --git a/x-pack/plugins/cases/docs/openapi/entrypoint.yaml b/x-pack/plugins/cases/docs/openapi/entrypoint.yaml index 142dcd2706fd38..fed1e2011b38fc 100644 --- a/x-pack/plugins/cases/docs/openapi/entrypoint.yaml +++ b/x-pack/plugins/cases/docs/openapi/entrypoint.yaml @@ -12,8 +12,10 @@ tags: - name: cases description: Case APIs enable you to open and track issues. servers: - - url: 'http://localhost:5601' - description: local + - url: https://{kibanaUrl} + variables: + kibanaUrl: + default: localhost:5601 paths: # Paths in the default space '/api/cases': diff --git a/x-pack/plugins/cases/docs/openapi/paths/api@cases.yaml b/x-pack/plugins/cases/docs/openapi/paths/api@cases.yaml index 98e97b6af7d5bb..f92df59625dc27 100644 --- a/x-pack/plugins/cases/docs/openapi/paths/api@cases.yaml +++ b/x-pack/plugins/cases/docs/openapi/paths/api@cases.yaml @@ -34,9 +34,7 @@ post: application/json: schema: $ref: '../components/schemas/4xx_response.yaml' - servers: - - url: https://localhost:5601 - + delete: summary: Deletes one or more cases in the default space. operationId: deleteCaseDefaultSpace @@ -59,8 +57,6 @@ delete: application/json: schema: $ref: '../components/schemas/4xx_response.yaml' - servers: - - url: https://localhost:5601 patch: summary: Updates one or more cases in the default space. @@ -99,8 +95,3 @@ patch: application/json: schema: $ref: '../components/schemas/4xx_response.yaml' - servers: - - url: https://localhost:5601 - -servers: - - url: https://localhost:5601 \ No newline at end of file diff --git a/x-pack/plugins/cases/docs/openapi/paths/api@cases@_find.yaml b/x-pack/plugins/cases/docs/openapi/paths/api@cases@_find.yaml index 6fd7f65ced3ad6..aa926636802a28 100644 --- a/x-pack/plugins/cases/docs/openapi/paths/api@cases@_find.yaml +++ b/x-pack/plugins/cases/docs/openapi/paths/api@cases@_find.yaml @@ -58,7 +58,3 @@ get: application/json: schema: $ref: '../components/schemas/4xx_response.yaml' - servers: - - url: https://localhost:5601 -servers: - - url: https://localhost:5601 diff --git a/x-pack/plugins/cases/docs/openapi/paths/api@cases@alerts@{alertid}.yaml b/x-pack/plugins/cases/docs/openapi/paths/api@cases@alerts@{alertid}.yaml index 24e91369a6422a..64ff49d17b8cd1 100644 --- a/x-pack/plugins/cases/docs/openapi/paths/api@cases@alerts@{alertid}.yaml +++ b/x-pack/plugins/cases/docs/openapi/paths/api@cases@alerts@{alertid}.yaml @@ -36,8 +36,4 @@ get: content: application/json: schema: - $ref: '../components/schemas/4xx_response.yaml' - servers: - - url: https://localhost:5601 -servers: - - url: https://localhost:5601s \ No newline at end of file + $ref: '../components/schemas/4xx_response.yaml' \ No newline at end of file diff --git a/x-pack/plugins/cases/docs/openapi/paths/api@cases@configure.yaml b/x-pack/plugins/cases/docs/openapi/paths/api@cases@configure.yaml index ebbae5e333103c..5de3de67182b0c 100644 --- a/x-pack/plugins/cases/docs/openapi/paths/api@cases@configure.yaml +++ b/x-pack/plugins/cases/docs/openapi/paths/api@cases@configure.yaml @@ -20,17 +20,18 @@ get: type: object properties: $ref: '../components/schemas/case_configure_response_properties.yaml' + examples: + getConfigurationResponse: + $ref: '../components/examples/get_case_configuration_response.yaml' '401': description: Authorization information is missing or invalid. content: application/json: schema: $ref: '../components/schemas/4xx_response.yaml' - servers: - - url: https://localhost:5601 post: - summary: Sets external connection details, such as the closure type and default connector for cases in the default space. + summary: Creates a case specific configuration that includes external connection details and custom fields. operationId: setCaseConfigurationDefaultSpace description: > You must have `all` privileges for the **Cases** feature in the **Management**, **Observability**, or **Security** section of the Kibana feature privileges, depending on the owner of the case configuration. @@ -67,8 +68,4 @@ post: content: application/json: schema: - $ref: '../components/schemas/4xx_response.yaml' - servers: - - url: https://localhost:5601 -servers: - - url: https://localhost:5601 \ No newline at end of file + $ref: '../components/schemas/4xx_response.yaml' \ No newline at end of file diff --git a/x-pack/plugins/cases/docs/openapi/paths/api@cases@configure@connectors@_find.yaml b/x-pack/plugins/cases/docs/openapi/paths/api@cases@configure@connectors@_find.yaml index b0b3111094218f..53a5ebf537e576 100644 --- a/x-pack/plugins/cases/docs/openapi/paths/api@cases@configure@connectors@_find.yaml +++ b/x-pack/plugins/cases/docs/openapi/paths/api@cases@configure@connectors@_find.yaml @@ -28,7 +28,3 @@ get: application/json: schema: $ref: '../components/schemas/4xx_response.yaml' - servers: - - url: https://localhost:5601 -servers: - - url: https://localhost:5601 diff --git a/x-pack/plugins/cases/docs/openapi/paths/api@cases@configure@{configurationid}.yaml b/x-pack/plugins/cases/docs/openapi/paths/api@cases@configure@{configurationid}.yaml index 507842e6f47f44..d31299128b076f 100644 --- a/x-pack/plugins/cases/docs/openapi/paths/api@cases@configure@{configurationid}.yaml +++ b/x-pack/plugins/cases/docs/openapi/paths/api@cases@configure@{configurationid}.yaml @@ -16,24 +16,24 @@ patch: application/json: schema: $ref: '../components/schemas/update_case_configuration_request.yaml' + examples: + updateCaseConfigurationRequest: + $ref: '../components/examples/update_case_configuration_request.yaml' responses: '200': description: Indicates a successful call. content: application/json: schema: - type: array - items: - type: object - properties: - $ref: '../components/schemas/case_configure_response_properties.yaml' + type: object + properties: + $ref: '../components/schemas/case_configure_response_properties.yaml' + examples: + updateCaseConfigurationResponse: + $ref: '../components/examples/update_case_configuration_response.yaml' '401': description: Authorization information is missing or invalid. content: application/json: schema: - $ref: '../components/schemas/4xx_response.yaml' - servers: - - url: https://localhost:5601 -servers: - - url: https://localhost:5601 \ No newline at end of file + $ref: '../components/schemas/4xx_response.yaml' \ No newline at end of file diff --git a/x-pack/plugins/cases/docs/openapi/paths/api@cases@reporters.yaml b/x-pack/plugins/cases/docs/openapi/paths/api@cases@reporters.yaml index 7bf256e3c33a35..15fca2baef2476 100644 --- a/x-pack/plugins/cases/docs/openapi/paths/api@cases@reporters.yaml +++ b/x-pack/plugins/cases/docs/openapi/paths/api@cases@reporters.yaml @@ -19,6 +19,10 @@ get: maxItems: 10000 items: type: object + required: + - email + - full_name + - username properties: $ref: '../components/schemas/user_properties.yaml' examples: @@ -29,8 +33,4 @@ get: content: application/json: schema: - $ref: '../components/schemas/4xx_response.yaml' - servers: - - url: https://localhost:5601 -servers: - - url: https://localhost:5601 + $ref: '../components/schemas/4xx_response.yaml' \ No newline at end of file diff --git a/x-pack/plugins/cases/docs/openapi/paths/api@cases@status.yaml b/x-pack/plugins/cases/docs/openapi/paths/api@cases@status.yaml index 17dedefd164506..cd0792b7b3174e 100644 --- a/x-pack/plugins/cases/docs/openapi/paths/api@cases@status.yaml +++ b/x-pack/plugins/cases/docs/openapi/paths/api@cases@status.yaml @@ -25,16 +25,9 @@ get: type: integer count_open_cases: type: integer - examples: - getStatusResponse: - $ref: '../components/examples/get_status_response.yaml' '401': description: Authorization information is missing or invalid. content: application/json: schema: $ref: '../components/schemas/4xx_response.yaml' - servers: - - url: https://localhost:5601 -servers: - - url: https://localhost:5601 diff --git a/x-pack/plugins/cases/docs/openapi/paths/api@cases@tags.yaml b/x-pack/plugins/cases/docs/openapi/paths/api@cases@tags.yaml index 3ce4e0578178e9..5f0083d087b5c9 100644 --- a/x-pack/plugins/cases/docs/openapi/paths/api@cases@tags.yaml +++ b/x-pack/plugins/cases/docs/openapi/paths/api@cases@tags.yaml @@ -25,8 +25,4 @@ get: content: application/json: schema: - $ref: '../components/schemas/4xx_response.yaml' - servers: - - url: https://localhost:5601 -servers: - - url: https://localhost:5601 + $ref: '../components/schemas/4xx_response.yaml' \ No newline at end of file diff --git a/x-pack/plugins/cases/docs/openapi/paths/api@cases@{caseid}.yaml b/x-pack/plugins/cases/docs/openapi/paths/api@cases@{caseid}.yaml index 48238dcdcf4de8..9629049c9b3428 100644 --- a/x-pack/plugins/cases/docs/openapi/paths/api@cases@{caseid}.yaml +++ b/x-pack/plugins/cases/docs/openapi/paths/api@cases@{caseid}.yaml @@ -25,8 +25,4 @@ get: content: application/json: schema: - $ref: '../components/schemas/4xx_response.yaml' - servers: - - url: https://localhost:5601 -servers: - - url: https://localhost:5601 + $ref: '../components/schemas/4xx_response.yaml' \ No newline at end of file diff --git a/x-pack/plugins/cases/docs/openapi/paths/api@cases@{caseid}@alerts.yaml b/x-pack/plugins/cases/docs/openapi/paths/api@cases@{caseid}@alerts.yaml index 80e40933031369..525fb25f4b6d58 100644 --- a/x-pack/plugins/cases/docs/openapi/paths/api@cases@{caseid}@alerts.yaml +++ b/x-pack/plugins/cases/docs/openapi/paths/api@cases@{caseid}@alerts.yaml @@ -27,8 +27,4 @@ get: content: application/json: schema: - $ref: '../components/schemas/4xx_response.yaml' - servers: - - url: https://localhost:5601 -servers: - - url: https://localhost:5601 \ No newline at end of file + $ref: '../components/schemas/4xx_response.yaml' \ No newline at end of file diff --git a/x-pack/plugins/cases/docs/openapi/paths/api@cases@{caseid}@comments.yaml b/x-pack/plugins/cases/docs/openapi/paths/api@cases@{caseid}@comments.yaml index 160a5a5f221ca5..fa25d6263143df 100644 --- a/x-pack/plugins/cases/docs/openapi/paths/api@cases@{caseid}@comments.yaml +++ b/x-pack/plugins/cases/docs/openapi/paths/api@cases@{caseid}@comments.yaml @@ -36,8 +36,6 @@ post: application/json: schema: $ref: '../components/schemas/4xx_response.yaml' - servers: - - url: https://localhost:5601 delete: summary: Deletes all comments and alerts from a case in the default space. @@ -60,8 +58,6 @@ delete: application/json: schema: $ref: '../components/schemas/4xx_response.yaml' - servers: - - url: https://localhost:5601 patch: summary: Updates a comment or alert in a case in the default space. @@ -101,8 +97,6 @@ patch: application/json: schema: $ref: '../components/schemas/4xx_response.yaml' - servers: - - url: https://localhost:5601 get: summary: Retrieves all the comments from a case in the default space. @@ -131,8 +125,3 @@ get: application/json: schema: $ref: '../components/schemas/4xx_response.yaml' - servers: - - url: https://localhost:5601 - -servers: - - url: https://localhost:5601 diff --git a/x-pack/plugins/cases/docs/openapi/paths/api@cases@{caseid}@comments@{commentid}.yaml b/x-pack/plugins/cases/docs/openapi/paths/api@cases@{caseid}@comments@{commentid}.yaml index 0eb35a7bb1c9af..354b0082014060 100644 --- a/x-pack/plugins/cases/docs/openapi/paths/api@cases@{caseid}@comments@{commentid}.yaml +++ b/x-pack/plugins/cases/docs/openapi/paths/api@cases@{caseid}@comments@{commentid}.yaml @@ -20,8 +20,6 @@ delete: application/json: schema: $ref: '../components/schemas/4xx_response.yaml' - servers: - - url: https://localhost:5601 get: summary: Retrieves a comment from a case in the default space. @@ -52,8 +50,4 @@ get: content: application/json: schema: - $ref: '../components/schemas/4xx_response.yaml' - servers: - - url: https://localhost:5601 -servers: - - url: https://localhost:5601 \ No newline at end of file + $ref: '../components/schemas/4xx_response.yaml' \ No newline at end of file diff --git a/x-pack/plugins/cases/docs/openapi/paths/api@cases@{caseid}@connector@{connectorid}@_push.yaml b/x-pack/plugins/cases/docs/openapi/paths/api@cases@{caseid}@connector@{connectorid}@_push.yaml index 4731c69bab76a2..321f2f6938c508 100644 --- a/x-pack/plugins/cases/docs/openapi/paths/api@cases@{caseid}@connector@{connectorid}@_push.yaml +++ b/x-pack/plugins/cases/docs/openapi/paths/api@cases@{caseid}@connector@{connectorid}@_push.yaml @@ -31,8 +31,4 @@ post: content: application/json: schema: - $ref: '../components/schemas/4xx_response.yaml' - servers: - - url: https://localhost:5601 -servers: - - url: https://localhost:5601 \ No newline at end of file + $ref: '../components/schemas/4xx_response.yaml' \ No newline at end of file diff --git a/x-pack/plugins/cases/docs/openapi/paths/api@cases@{caseid}@user_actions.yaml b/x-pack/plugins/cases/docs/openapi/paths/api@cases@{caseid}@user_actions.yaml index b0e38a119fd34e..83657ecc123b3a 100644 --- a/x-pack/plugins/cases/docs/openapi/paths/api@cases@{caseid}@user_actions.yaml +++ b/x-pack/plugins/cases/docs/openapi/paths/api@cases@{caseid}@user_actions.yaml @@ -20,16 +20,9 @@ get: type: array items: $ref: '../components/schemas/user_actions_response_properties.yaml' - examples: - getCaseActivityResponse: - $ref: '../components/examples/get_case_activity_response.yaml' '401': description: Authorization information is missing or invalid. content: application/json: schema: $ref: '../components/schemas/4xx_response.yaml' - servers: - - url: https://localhost:5601 -servers: - - url: https://localhost:5601 diff --git a/x-pack/plugins/cases/docs/openapi/paths/api@cases@{caseid}@user_actions@_find.yaml b/x-pack/plugins/cases/docs/openapi/paths/api@cases@{caseid}@user_actions@_find.yaml index ab8c16a641fdcb..99caec414b1324 100644 --- a/x-pack/plugins/cases/docs/openapi/paths/api@cases@{caseid}@user_actions@_find.yaml +++ b/x-pack/plugins/cases/docs/openapi/paths/api@cases@{caseid}@user_actions@_find.yaml @@ -41,7 +41,3 @@ get: application/json: schema: $ref: '../components/schemas/4xx_response.yaml' - servers: - - url: https://localhost:5601 -servers: - - url: https://localhost:5601 diff --git a/x-pack/plugins/cases/docs/openapi/paths/s@{spaceid}@api@cases.yaml b/x-pack/plugins/cases/docs/openapi/paths/s@{spaceid}@api@cases.yaml index 58e73f6a68d171..1703dc5eecdc59 100644 --- a/x-pack/plugins/cases/docs/openapi/paths/s@{spaceid}@api@cases.yaml +++ b/x-pack/plugins/cases/docs/openapi/paths/s@{spaceid}@api@cases.yaml @@ -35,8 +35,6 @@ post: application/json: schema: $ref: '../components/schemas/4xx_response.yaml' - servers: - - url: https://localhost:5601 delete: summary: Deletes one or more cases. @@ -61,8 +59,6 @@ delete: application/json: schema: $ref: '../components/schemas/4xx_response.yaml' - servers: - - url: https://localhost:5601 patch: summary: Updates one or more cases. @@ -102,8 +98,3 @@ patch: application/json: schema: $ref: '../components/schemas/4xx_response.yaml' - servers: - - url: https://localhost:5601 - -servers: - - url: https://localhost:5601 diff --git a/x-pack/plugins/cases/docs/openapi/paths/s@{spaceid}@api@cases@_find.yaml b/x-pack/plugins/cases/docs/openapi/paths/s@{spaceid}@api@cases@_find.yaml index fa9687b439f84b..a688b10389ecd4 100644 --- a/x-pack/plugins/cases/docs/openapi/paths/s@{spaceid}@api@cases@_find.yaml +++ b/x-pack/plugins/cases/docs/openapi/paths/s@{spaceid}@api@cases@_find.yaml @@ -58,7 +58,3 @@ get: application/json: schema: $ref: '../components/schemas/4xx_response.yaml' - servers: - - url: https://localhost:5601 -servers: - - url: https://localhost:5601 diff --git a/x-pack/plugins/cases/docs/openapi/paths/s@{spaceid}@api@cases@alerts@{alertid}.yaml b/x-pack/plugins/cases/docs/openapi/paths/s@{spaceid}@api@cases@alerts@{alertid}.yaml index 940f343c893868..f1e287e05d304c 100644 --- a/x-pack/plugins/cases/docs/openapi/paths/s@{spaceid}@api@cases@alerts@{alertid}.yaml +++ b/x-pack/plugins/cases/docs/openapi/paths/s@{spaceid}@api@cases@alerts@{alertid}.yaml @@ -36,8 +36,4 @@ get: content: application/json: schema: - $ref: '../components/schemas/4xx_response.yaml' - servers: - - url: https://localhost:5601 -servers: - - url: https://localhost:5601 \ No newline at end of file + $ref: '../components/schemas/4xx_response.yaml' \ No newline at end of file diff --git a/x-pack/plugins/cases/docs/openapi/paths/s@{spaceid}@api@cases@configure.yaml b/x-pack/plugins/cases/docs/openapi/paths/s@{spaceid}@api@cases@configure.yaml index c991005af9d700..d12262379df810 100644 --- a/x-pack/plugins/cases/docs/openapi/paths/s@{spaceid}@api@cases@configure.yaml +++ b/x-pack/plugins/cases/docs/openapi/paths/s@{spaceid}@api@cases@configure.yaml @@ -21,17 +21,18 @@ get: type: object properties: $ref: '../components/schemas/case_configure_response_properties.yaml' + examples: + getConfigurationResponse: + $ref: '../components/examples/get_case_configuration_response.yaml' '401': description: Authorization information is missing or invalid. content: application/json: schema: $ref: '../components/schemas/4xx_response.yaml' - servers: - - url: https://localhost:5601 post: - summary: Sets external connection details, such as the closure type and default connector for cases. + summary: Creates a case specific configuration that includes external connection details and custom fields. operationId: setCaseConfiguration description: > You must have `all` privileges for the **Cases** feature in the @@ -73,7 +74,3 @@ post: application/json: schema: $ref: '../components/schemas/4xx_response.yaml' - servers: - - url: https://localhost:5601 -servers: - - url: https://localhost:5601 \ No newline at end of file diff --git a/x-pack/plugins/cases/docs/openapi/paths/s@{spaceid}@api@cases@configure@connectors@_find.yaml b/x-pack/plugins/cases/docs/openapi/paths/s@{spaceid}@api@cases@configure@connectors@_find.yaml index bfe60072b8f50a..f04f802ba3245f 100644 --- a/x-pack/plugins/cases/docs/openapi/paths/s@{spaceid}@api@cases@configure@connectors@_find.yaml +++ b/x-pack/plugins/cases/docs/openapi/paths/s@{spaceid}@api@cases@configure@connectors@_find.yaml @@ -29,7 +29,3 @@ get: application/json: schema: $ref: '../components/schemas/4xx_response.yaml' - servers: - - url: https://localhost:5601 -servers: - - url: https://localhost:5601 diff --git a/x-pack/plugins/cases/docs/openapi/paths/s@{spaceid}@api@cases@configure@{configurationid}.yaml b/x-pack/plugins/cases/docs/openapi/paths/s@{spaceid}@api@cases@configure@{configurationid}.yaml index 749f1ece724b25..c8656181aca937 100644 --- a/x-pack/plugins/cases/docs/openapi/paths/s@{spaceid}@api@cases@configure@{configurationid}.yaml +++ b/x-pack/plugins/cases/docs/openapi/paths/s@{spaceid}@api@cases@configure@{configurationid}.yaml @@ -18,24 +18,24 @@ patch: application/json: schema: $ref: '../components/schemas/update_case_configuration_request.yaml' + examples: + updateCaseConfigurationRequest: + $ref: '../components/examples/update_case_configuration_request.yaml' responses: '200': description: Indicates a successful call. content: application/json: schema: - type: array - items: - type: object - properties: - $ref: '../components/schemas/case_configure_response_properties.yaml' + type: object + properties: + $ref: '../components/schemas/case_configure_response_properties.yaml' + examples: + updateCaseConfigurationResponse: + $ref: '../components/examples/update_case_configuration_response.yaml' '401': description: Authorization information is missing or invalid. content: application/json: schema: $ref: '../components/schemas/4xx_response.yaml' - servers: - - url: https://localhost:5601 -servers: - - url: https://localhost:5601 \ No newline at end of file diff --git a/x-pack/plugins/cases/docs/openapi/paths/s@{spaceid}@api@cases@reporters.yaml b/x-pack/plugins/cases/docs/openapi/paths/s@{spaceid}@api@cases@reporters.yaml index 51e57615f12164..b2a3bd11d5c9ce 100644 --- a/x-pack/plugins/cases/docs/openapi/paths/s@{spaceid}@api@cases@reporters.yaml +++ b/x-pack/plugins/cases/docs/openapi/paths/s@{spaceid}@api@cases@reporters.yaml @@ -23,6 +23,10 @@ get: type: array items: type: object + required: + - email + - full_name + - username properties: $ref: '../components/schemas/user_properties.yaml' examples: @@ -34,7 +38,3 @@ get: application/json: schema: $ref: '../components/schemas/4xx_response.yaml' - servers: - - url: https://localhost:5601 -servers: - - url: https://localhost:5601 diff --git a/x-pack/plugins/cases/docs/openapi/paths/s@{spaceid}@api@cases@status.yaml b/x-pack/plugins/cases/docs/openapi/paths/s@{spaceid}@api@cases@status.yaml index d3c4b40fa3aea9..d4a6292e6e0fbd 100644 --- a/x-pack/plugins/cases/docs/openapi/paths/s@{spaceid}@api@cases@status.yaml +++ b/x-pack/plugins/cases/docs/openapi/paths/s@{spaceid}@api@cases@status.yaml @@ -26,16 +26,10 @@ get: type: integer count_open_cases: type: integer - examples: - getStatusResponse: - $ref: '../components/examples/get_status_response.yaml' '401': description: Authorization information is missing or invalid. content: application/json: schema: $ref: '../components/schemas/4xx_response.yaml' - servers: - - url: https://localhost:5601 -servers: - - url: https://localhost:5601 + diff --git a/x-pack/plugins/cases/docs/openapi/paths/s@{spaceid}@api@cases@tags.yaml b/x-pack/plugins/cases/docs/openapi/paths/s@{spaceid}@api@cases@tags.yaml index ff448041dd712a..88025633b12d1b 100644 --- a/x-pack/plugins/cases/docs/openapi/paths/s@{spaceid}@api@cases@tags.yaml +++ b/x-pack/plugins/cases/docs/openapi/paths/s@{spaceid}@api@cases@tags.yaml @@ -28,7 +28,3 @@ get: application/json: schema: $ref: '../components/schemas/4xx_response.yaml' - servers: - - url: https://localhost:5601 -servers: - - url: https://localhost:5601 diff --git a/x-pack/plugins/cases/docs/openapi/paths/s@{spaceid}@api@cases@{caseid}.yaml b/x-pack/plugins/cases/docs/openapi/paths/s@{spaceid}@api@cases@{caseid}.yaml index fb4f735f322eb7..32e3434f15adda 100644 --- a/x-pack/plugins/cases/docs/openapi/paths/s@{spaceid}@api@cases@{caseid}.yaml +++ b/x-pack/plugins/cases/docs/openapi/paths/s@{spaceid}@api@cases@{caseid}.yaml @@ -27,7 +27,3 @@ get: application/json: schema: $ref: '../components/schemas/4xx_response.yaml' - servers: - - url: https://localhost:5601 -servers: - - url: https://localhost:5601 diff --git a/x-pack/plugins/cases/docs/openapi/paths/s@{spaceid}@api@cases@{caseid}@alerts.yaml b/x-pack/plugins/cases/docs/openapi/paths/s@{spaceid}@api@cases@{caseid}@alerts.yaml index aca587fe4886c7..7784c49bf9ca0c 100644 --- a/x-pack/plugins/cases/docs/openapi/paths/s@{spaceid}@api@cases@{caseid}@alerts.yaml +++ b/x-pack/plugins/cases/docs/openapi/paths/s@{spaceid}@api@cases@{caseid}@alerts.yaml @@ -29,7 +29,3 @@ get: application/json: schema: $ref: '../components/schemas/4xx_response.yaml' - servers: - - url: https://localhost:5601 -servers: - - url: https://localhost:5601 \ No newline at end of file diff --git a/x-pack/plugins/cases/docs/openapi/paths/s@{spaceid}@api@cases@{caseid}@comments.yaml b/x-pack/plugins/cases/docs/openapi/paths/s@{spaceid}@api@cases@{caseid}@comments.yaml index 1e1c73838abb9b..0551151b613f1d 100644 --- a/x-pack/plugins/cases/docs/openapi/paths/s@{spaceid}@api@cases@{caseid}@comments.yaml +++ b/x-pack/plugins/cases/docs/openapi/paths/s@{spaceid}@api@cases@{caseid}@comments.yaml @@ -37,8 +37,6 @@ post: application/json: schema: $ref: '../components/schemas/4xx_response.yaml' - servers: - - url: https://localhost:5601 delete: summary: Deletes all comments and alerts from a case. @@ -62,8 +60,6 @@ delete: application/json: schema: $ref: '../components/schemas/4xx_response.yaml' - servers: - - url: https://localhost:5601 patch: summary: Updates a comment or alert in a case. @@ -104,8 +100,6 @@ patch: application/json: schema: $ref: '../components/schemas/4xx_response.yaml' - servers: - - url: https://localhost:5601 get: summary: Retrieves all the comments from a case. @@ -135,8 +129,3 @@ get: application/json: schema: $ref: '../components/schemas/4xx_response.yaml' - servers: - - url: https://localhost:5601 - -servers: - - url: https://localhost:5601 diff --git a/x-pack/plugins/cases/docs/openapi/paths/s@{spaceid}@api@cases@{caseid}@comments@_find.yaml b/x-pack/plugins/cases/docs/openapi/paths/s@{spaceid}@api@cases@{caseid}@comments@_find.yaml index b1dd32a6595153..b027660aaf1eae 100644 --- a/x-pack/plugins/cases/docs/openapi/paths/s@{spaceid}@api@cases@{caseid}@comments@_find.yaml +++ b/x-pack/plugins/cases/docs/openapi/paths/s@{spaceid}@api@cases@{caseid}@comments@_find.yaml @@ -26,8 +26,3 @@ get: application/json: schema: $ref: '../components/schemas/4xx_response.yaml' - servers: - - url: https://localhost:5601 - -servers: - - url: https://localhost:5601 diff --git a/x-pack/plugins/cases/docs/openapi/paths/s@{spaceid}@api@cases@{caseid}@comments@{commentid}.yaml b/x-pack/plugins/cases/docs/openapi/paths/s@{spaceid}@api@cases@{caseid}@comments@{commentid}.yaml index e43a2b2d81d65b..2db1929ae43734 100644 --- a/x-pack/plugins/cases/docs/openapi/paths/s@{spaceid}@api@cases@{caseid}@comments@{commentid}.yaml +++ b/x-pack/plugins/cases/docs/openapi/paths/s@{spaceid}@api@cases@{caseid}@comments@{commentid}.yaml @@ -21,8 +21,6 @@ delete: application/json: schema: $ref: '../components/schemas/4xx_response.yaml' - servers: - - url: https://localhost:5601 get: summary: Retrieves a comment from a case. @@ -54,8 +52,4 @@ get: content: application/json: schema: - $ref: '../components/schemas/4xx_response.yaml' - servers: - - url: https://localhost:5601 -servers: - - url: https://localhost:5601 \ No newline at end of file + $ref: '../components/schemas/4xx_response.yaml' \ No newline at end of file diff --git a/x-pack/plugins/cases/docs/openapi/paths/s@{spaceid}@api@cases@{caseid}@connector@{connectorid}@_push.yaml b/x-pack/plugins/cases/docs/openapi/paths/s@{spaceid}@api@cases@{caseid}@connector@{connectorid}@_push.yaml index c378192592ce94..bee91522dde299 100644 --- a/x-pack/plugins/cases/docs/openapi/paths/s@{spaceid}@api@cases@{caseid}@connector@{connectorid}@_push.yaml +++ b/x-pack/plugins/cases/docs/openapi/paths/s@{spaceid}@api@cases@{caseid}@connector@{connectorid}@_push.yaml @@ -36,7 +36,3 @@ post: application/json: schema: $ref: '../components/schemas/4xx_response.yaml' - servers: - - url: https://localhost:5601 -servers: - - url: https://localhost:5601 \ No newline at end of file diff --git a/x-pack/plugins/cases/docs/openapi/paths/s@{spaceid}@api@cases@{caseid}@user_actions.yaml b/x-pack/plugins/cases/docs/openapi/paths/s@{spaceid}@api@cases@{caseid}@user_actions.yaml index 4aa52bdbc44b55..0cb3770be5b13b 100644 --- a/x-pack/plugins/cases/docs/openapi/paths/s@{spaceid}@api@cases@{caseid}@user_actions.yaml +++ b/x-pack/plugins/cases/docs/openapi/paths/s@{spaceid}@api@cases@{caseid}@user_actions.yaml @@ -21,16 +21,9 @@ get: type: array items: $ref: '../components/schemas/user_actions_response_properties.yaml' - examples: - getCaseActivityResponse: - $ref: '../components/examples/get_case_activity_response.yaml' '401': description: Authorization information is missing or invalid. content: application/json: schema: - $ref: '../components/schemas/4xx_response.yaml' - servers: - - url: https://localhost:5601 -servers: - - url: https://localhost:5601 + $ref: '../components/schemas/4xx_response.yaml' \ No newline at end of file diff --git a/x-pack/plugins/cases/docs/openapi/paths/s@{spaceid}@api@cases@{caseid}@user_actions@_find.yaml b/x-pack/plugins/cases/docs/openapi/paths/s@{spaceid}@api@cases@{caseid}@user_actions@_find.yaml index 61a1290c7c5a6f..0b5a6e660da8b9 100644 --- a/x-pack/plugins/cases/docs/openapi/paths/s@{spaceid}@api@cases@{caseid}@user_actions@_find.yaml +++ b/x-pack/plugins/cases/docs/openapi/paths/s@{spaceid}@api@cases@{caseid}@user_actions@_find.yaml @@ -42,7 +42,3 @@ get: application/json: schema: $ref: '../components/schemas/4xx_response.yaml' - servers: - - url: https://localhost:5601 -servers: - - url: https://localhost:5601 From c2e4d40a23d7d9a43bd22427fcd94844fcdadf4b Mon Sep 17 00:00:00 2001 From: Julia Date: Mon, 23 Oct 2023 22:28:10 +0200 Subject: [PATCH 40/68] [RAM] Create serverless functional tests for rule details (#168101) Serverless functional tests for rule details on Search. I did not copy all rule details tests to serverless. Some of them will be copied after soon rules changes: https://github.com/elastic/kibana/issues/168965 --------- Co-authored-by: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> --- .../functional/page_objects/index.ts | 2 + .../page_objects/svl_rule_details_ui_page.ts | 123 ++++ .../functional/test_suites/search/index.ts | 2 +- .../test_suites/search/rules/rule_details.ts | 669 ++++++++++++++++++ 4 files changed, 795 insertions(+), 1 deletion(-) create mode 100644 x-pack/test_serverless/functional/page_objects/svl_rule_details_ui_page.ts create mode 100644 x-pack/test_serverless/functional/test_suites/search/rules/rule_details.ts diff --git a/x-pack/test_serverless/functional/page_objects/index.ts b/x-pack/test_serverless/functional/page_objects/index.ts index 8a3a253198f88c..f9626a88b31034 100644 --- a/x-pack/test_serverless/functional/page_objects/index.ts +++ b/x-pack/test_serverless/functional/page_objects/index.ts @@ -17,6 +17,7 @@ import { SvlObltOverviewPageProvider } from './svl_oblt_overview_page'; import { SvlSearchLandingPageProvider } from './svl_search_landing_page'; import { SvlSecLandingPageProvider } from './svl_sec_landing_page'; import { SvlTriggersActionsPageProvider } from './svl_triggers_actions_ui_page'; +import { SvlRuleDetailsPageProvider } from './svl_rule_details_ui_page'; export const pageObjects = { ...xpackFunctionalPageObjects, @@ -30,4 +31,5 @@ export const pageObjects = { svlSearchLandingPage: SvlSearchLandingPageProvider, svlSecLandingPage: SvlSecLandingPageProvider, svlTriggersActionsUI: SvlTriggersActionsPageProvider, + svlRuleDetailsUI: SvlRuleDetailsPageProvider, }; diff --git a/x-pack/test_serverless/functional/page_objects/svl_rule_details_ui_page.ts b/x-pack/test_serverless/functional/page_objects/svl_rule_details_ui_page.ts new file mode 100644 index 00000000000000..bd6ae5e0ce971b --- /dev/null +++ b/x-pack/test_serverless/functional/page_objects/svl_rule_details_ui_page.ts @@ -0,0 +1,123 @@ +/* + * 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/expect'; +import { FtrProviderContext } from '../ftr_provider_context'; + +export function SvlRuleDetailsPageProvider({ getService }: FtrProviderContext) { + const testSubjects = getService('testSubjects'); + const find = getService('find'); + const log = getService('log'); + const retry = getService('retry'); + + return { + async getHeadingText() { + return await testSubjects.getVisibleText('ruleDetailsTitle'); + }, + async getRuleType() { + return await testSubjects.getVisibleText('ruleTypeLabel'); + }, + async getAPIKeyOwner() { + return await testSubjects.getVisibleText('apiKeyOwnerLabel'); + }, + async getAlertsList() { + const table = await find.byCssSelector( + '.euiBasicTable[data-test-subj="alertsList"]:not(.euiBasicTable-loading)' + ); + const $ = await table.parseDomContent(); + return $.findTestSubjects('alert-row') + .toArray() + .map((row) => { + return { + alert: $(row) + .findTestSubject('alertsTableCell-alert') + .find('.euiTableCellContent') + .text(), + status: $(row) + .findTestSubject('alertsTableCell-status') + .find('.euiTableCellContent') + .text(), + start: $(row) + .findTestSubject('alertsTableCell-start') + .find('.euiTableCellContent') + .text(), + duration: $(row) + .findTestSubject('alertsTableCell-duration') + .find('.euiTableCellContent') + .text(), + }; + }); + }, + async getAlertDurationEpoch(): Promise { + const alertDurationEpoch = await find.byCssSelector( + 'input[data-test-subj="alertsDurationEpoch"]' + ); + return parseInt(await alertDurationEpoch.getAttribute('value'), 10); + }, + async clickAlertMuteButton(alert: string) { + const muteAlertButton = await testSubjects.find(`muteAlertButton_${alert}`); + await muteAlertButton.click(); + }, + async ensureAlertMuteState(alert: string, isMuted: boolean) { + await retry.try(async () => { + const muteAlertButton = await testSubjects.find(`muteAlertButton_${alert}`); + log.debug(`checked:${await muteAlertButton.getAttribute('aria-checked')}`); + expect(await muteAlertButton.getAttribute('aria-checked')).to.eql( + isMuted ? 'true' : 'false' + ); + }); + }, + async ensureAlertExistence(alert: string, shouldExist: boolean) { + await retry.try(async () => { + const table = await find.byCssSelector( + '.euiBasicTable[data-test-subj="alertsList"]:not(.euiBasicTable-loading)' + ); + const $ = await table.parseDomContent(); + expect( + $.findTestSubjects('alert-row') + .toArray() + .filter( + (row) => + $(row) + .findTestSubject('alertsTableCell-alert') + .find('.euiTableCellContent') + .text() === alert + ) + ).to.eql(shouldExist ? 1 : 0); + }); + }, + async clickPaginationNextPage() { + const nextButton = await testSubjects.find(`pagination-button-next`); + nextButton.click(); + }, + async isViewInAppDisabled() { + await retry.try(async () => { + const viewInAppButton = await testSubjects.find(`ruleDetails-viewInApp`); + expect(await viewInAppButton.getAttribute('disabled')).to.eql('true'); + }); + return true; + }, + async isViewInAppEnabled() { + await retry.try(async () => { + const viewInAppButton = await testSubjects.find(`ruleDetails-viewInApp`); + await new Promise((resolve) => {}); + expect(await viewInAppButton.getAttribute('disabled')).to.not.eql('true'); + }); + return true; + }, + async clickViewInApp() { + return await testSubjects.click('ruleDetails-viewInApp'); + }, + async getNoOpAppTitle() { + await retry.try(async () => { + const title = await testSubjects.find('noop-title'); + expect(title.isDisplayed()).to.eql(true); + }); + return await testSubjects.getVisibleText('noop-title'); + }, + }; +} diff --git a/x-pack/test_serverless/functional/test_suites/search/index.ts b/x-pack/test_serverless/functional/test_suites/search/index.ts index 6415d8cad90927..6ed8a9f62c2222 100644 --- a/x-pack/test_serverless/functional/test_suites/search/index.ts +++ b/x-pack/test_serverless/functional/test_suites/search/index.ts @@ -13,10 +13,10 @@ export default function ({ loadTestFile }: FtrProviderContext) { loadTestFile(require.resolve('./empty_page')); loadTestFile(require.resolve('./navigation')); loadTestFile(require.resolve('./cases/attachment_framework')); - loadTestFile(require.resolve('./dashboards/build_dashboard')); loadTestFile(require.resolve('./dashboards/import_dashboard')); loadTestFile(require.resolve('./advanced_settings')); + loadTestFile(require.resolve('./rules/rule_details')); loadTestFile(require.resolve('./ml')); }); diff --git a/x-pack/test_serverless/functional/test_suites/search/rules/rule_details.ts b/x-pack/test_serverless/functional/test_suites/search/rules/rule_details.ts new file mode 100644 index 00000000000000..1b3fb12f0b6922 --- /dev/null +++ b/x-pack/test_serverless/functional/test_suites/search/rules/rule_details.ts @@ -0,0 +1,669 @@ +/* + * 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 'expect'; +import { v4 as uuidv4 } from 'uuid'; +import { FtrProviderContext } from '../../../ftr_provider_context'; +import { + createEsQueryRule as createRule, + createSlackConnector, + createIndexConnector, +} from '../../../../api_integration/test_suites/common/alerting/helpers/alerting_api_helper'; + +export enum RuleNotifyWhen { + CHANGE = 'onActionGroupChange', + ACTIVE = 'onActiveAlert', + THROTTLE = 'onThrottleInterval', +} + +export default ({ getPageObject, getService }: FtrProviderContext) => { + const svlCommonPage = getPageObject('svlCommonPage'); + const svlCommonNavigation = getPageObject('svlCommonNavigation'); + const svlTriggersActionsUI = getPageObject('svlTriggersActionsUI'); + const svlRuleDetailsUI = getPageObject('svlRuleDetailsUI'); + const svlSearchNavigation = getService('svlSearchNavigation'); + const testSubjects = getService('testSubjects'); + const supertest = getService('supertest'); + const find = getService('find'); + const retry = getService('retry'); + const toasts = getService('toasts'); + const comboBox = getService('comboBox'); + + const openFirstRule = async (ruleName: string) => { + await svlTriggersActionsUI.searchRules(ruleName); + await find.clickDisplayedByCssSelector(`[data-test-subj="rulesList"] [title="${ruleName}"]`); + }; + + const openRulesSection = async () => { + await svlSearchNavigation.navigateToLandingPage(); + await svlCommonNavigation.sidenav.clickLink({ text: 'Alerts' }); + }; + + const navigateToConnectors = async () => { + await svlSearchNavigation.navigateToLandingPage(); + await svlCommonNavigation.sidenav.openSection('project_settings_project_nav'); + await svlCommonNavigation.sidenav.clickLink({ deepLinkId: 'management' }); + await testSubjects.click('app-card-triggersActionsConnectors'); + }; + + const deleteConnector = async (connectorName: string) => { + await svlTriggersActionsUI.searchConnectors(connectorName); + await testSubjects.click('deleteConnector'); + await testSubjects.existOrFail('deleteIdsConfirmation'); + await testSubjects.click('deleteIdsConfirmation > confirmModalConfirmButton'); + await testSubjects.missingOrFail('deleteIdsConfirmation'); + }; + + describe('Rule details', () => { + let ruleIdList: string[]; + let connectorIdList: string[]; + + before(async () => { + await svlCommonPage.login(); + }); + + after(async () => { + await svlCommonPage.forceLogout(); + }); + + describe('Header', () => { + const testRunUuid = uuidv4(); + const ruleName = `test-rule-${testRunUuid}`; + const RULE_TYPE_ID = '.es-query'; + + before(async () => { + const rule = await createRule({ + supertest, + consumer: 'alerts', + name: ruleName, + ruleTypeId: RULE_TYPE_ID, + params: { + size: 100, + thresholdComparator: '>', + threshold: [-1], + index: ['alert-test-data'], + timeField: 'date', + esQuery: `{\n \"query\":{\n \"match_all\" : {}\n }\n}`, + timeWindowSize: 20, + timeWindowUnit: 's', + }, + actions: [], + }); + + ruleIdList = [rule.id]; + + await openRulesSection(); + await testSubjects.existOrFail('rulesList'); + await openFirstRule(rule.name); + }); + + after(async () => { + await Promise.all( + ruleIdList.map(async (ruleId) => { + await supertest + .delete(`/api/alerting/rule/${ruleId}`) + .set('kbn-xsrf', 'foo') + .set('x-elastic-internal-origin', 'foo'); + }) + ); + }); + + it('renders the rule details', async () => { + const headingText = await testSubjects.getVisibleText('ruleDetailsTitle'); + expect(headingText.includes(`test-rule-${testRunUuid}`)).toBe(true); + const ruleType = await testSubjects.getVisibleText('ruleTypeLabel'); + expect(ruleType).toEqual('Elasticsearch query'); + const owner = await testSubjects.getVisibleText('apiKeyOwnerLabel'); + expect(owner).toEqual('elastic_serverless'); + }); + + it('should disable the rule', async () => { + const actionsDropdown = await testSubjects.find('statusDropdown'); + + expect(await actionsDropdown.getVisibleText()).toEqual('Enabled'); + + await actionsDropdown.click(); + const actionsMenuElem = await testSubjects.find('ruleStatusMenu'); + const actionsMenuItemElem = await actionsMenuElem.findAllByClassName('euiContextMenuItem'); + + await actionsMenuItemElem.at(1)?.click(); + + await retry.try(async () => { + expect(await actionsDropdown.getVisibleText()).toEqual('Disabled'); + }); + }); + + it('should allow you to snooze a disabled rule', async () => { + const actionsDropdown = await testSubjects.find('statusDropdown'); + + expect(await actionsDropdown.getVisibleText()).toEqual('Disabled'); + + let snoozeBadge = await testSubjects.find('rulesListNotifyBadge-unsnoozed'); + await snoozeBadge.click(); + + const snoozeIndefinite = await testSubjects.find('ruleSnoozeIndefiniteApply'); + await snoozeIndefinite.click(); + + await retry.try(async () => { + await testSubjects.existOrFail('rulesListNotifyBadge-snoozedIndefinitely'); + }); + + // Unsnooze the rule for the next test + snoozeBadge = await testSubjects.find('rulesListNotifyBadge-snoozedIndefinitely'); + await snoozeBadge.click(); + + const snoozeCancel = await testSubjects.find('ruleSnoozeCancel'); + await snoozeCancel.click(); + }); + + it('should reenable a disabled the rule', async () => { + const actionsDropdown = await testSubjects.find('statusDropdown'); + + expect(await actionsDropdown.getVisibleText()).toEqual('Disabled'); + + await actionsDropdown.click(); + const actionsMenuElem = await testSubjects.find('ruleStatusMenu'); + const actionsMenuItemElem = await actionsMenuElem.findAllByClassName('euiContextMenuItem'); + + await actionsMenuItemElem.at(0)?.click(); + + await retry.try(async () => { + expect(await actionsDropdown.getVisibleText()).toEqual('Enabled'); + }); + }); + + it('should snooze the rule', async () => { + let snoozeBadge = await testSubjects.find('rulesListNotifyBadge-unsnoozed'); + await snoozeBadge.click(); + + const snoozeIndefinite = await testSubjects.find('ruleSnoozeIndefiniteApply'); + await snoozeIndefinite.click(); + + await retry.try(async () => { + await testSubjects.existOrFail('rulesListNotifyBadge-snoozedIndefinitely'); + }); + + // Unsnooze the rule for the next test + snoozeBadge = await testSubjects.find('rulesListNotifyBadge-snoozedIndefinitely'); + await snoozeBadge.click(); + + const snoozeCancel = await testSubjects.find('ruleSnoozeCancel'); + await snoozeCancel.click(); + }); + + it('should snooze the rule for a set duration', async () => { + let snoozeBadge = await testSubjects.find('rulesListNotifyBadge-unsnoozed'); + await snoozeBadge.click(); + + const snooze8h = await testSubjects.find('linkSnooze8h'); + await snooze8h.click(); + + await retry.try(async () => { + await testSubjects.existOrFail('rulesListNotifyBadge-snoozed'); + }); + + // Unsnooze the rule for the next test + snoozeBadge = await testSubjects.find('rulesListNotifyBadge-snoozed'); + await snoozeBadge.click(); + + const snoozeCancel = await testSubjects.find('ruleSnoozeCancel'); + await snoozeCancel.click(); + }); + + it('should add snooze schedule', async () => { + let snoozeBadge = await testSubjects.find('rulesListNotifyBadge-unsnoozed'); + await snoozeBadge.click(); + + const addScheduleButton = await testSubjects.find('ruleAddSchedule'); + await addScheduleButton.click(); + + const saveScheduleButton = await testSubjects.find('scheduler-saveSchedule'); + await saveScheduleButton.click(); + + await retry.try(async () => { + await testSubjects.existOrFail('rulesListNotifyBadge-scheduled'); + }); + + // Unsnooze the rule for the next test + snoozeBadge = await testSubjects.find('rulesListNotifyBadge-scheduled'); + await snoozeBadge.click(); + + const snoozeCancel = await testSubjects.find('ruleRemoveAllSchedules'); + await snoozeCancel.click(); + + const confirmButton = await testSubjects.find('confirmModalConfirmButton'); + await confirmButton.click(); + }); + }); + + describe('Edit rule button', () => { + const testRunUuid = uuidv4(); + const ruleName = `${testRunUuid}`; + const updatedRuleName = `Changed Rule Name ${ruleName}`; + const RULE_TYPE_ID = '.es-query'; + + before(async () => { + const rule = await createRule({ + supertest, + consumer: 'alerts', + name: ruleName, + ruleTypeId: RULE_TYPE_ID, + params: { + size: 100, + thresholdComparator: '>', + threshold: [-1], + index: ['alert-test-data'], + timeField: 'date', + esQuery: `{\n \"query\":{\n \"match_all\" : {}\n }\n}`, + timeWindowSize: 20, + timeWindowUnit: 's', + }, + actions: [], + }); + + ruleIdList = [rule.id]; + + await openRulesSection(); + await testSubjects.existOrFail('rulesList'); + await openFirstRule(rule.name); + }); + + after(async () => { + await Promise.all( + ruleIdList.map(async (ruleId) => { + await supertest + .delete(`/api/alerting/rule/${ruleId}`) + .set('kbn-xsrf', 'foo') + .set('x-elastic-internal-origin', 'foo'); + }) + ); + }); + + it('should open edit rule flyout', async () => { + const editButton = await testSubjects.find('openEditRuleFlyoutButton'); + await editButton.click(); + expect(await testSubjects.exists('hasActionsDisabled')).toBe(false); + + await testSubjects.setValue('ruleNameInput', updatedRuleName, { + clearWithKeyboard: true, + }); + + await find.clickByCssSelector('[data-test-subj="saveEditedRuleButton"]:not(disabled)'); + + await retry.try(async () => { + const resultToast = await toasts.getToastElement(1); + const toastText = await resultToast.getVisibleText(); + expect(toastText).toEqual(`Updated '${updatedRuleName}'`); + }); + + await retry.tryForTime(30 * 1000, async () => { + const headingText = await testSubjects.getVisibleText('ruleDetailsTitle'); + expect(headingText.includes(updatedRuleName)).toBe(true); + }); + }); + + it('should reset rule when canceling an edit', async () => { + const editButton = await testSubjects.find('openEditRuleFlyoutButton'); + await editButton.click(); + + await testSubjects.setValue('ruleNameInput', uuidv4(), { + clearWithKeyboard: true, + }); + + await testSubjects.click('cancelSaveEditedRuleButton'); + await testSubjects.existOrFail('confirmRuleCloseModal'); + await testSubjects.click('confirmRuleCloseModal > confirmModalConfirmButton'); + await find.waitForDeletedByCssSelector('[data-test-subj="cancelSaveEditedRuleButton"]'); + + await editButton.click(); + + const nameInputAfterCancel = await testSubjects.find('ruleNameInput'); + const textAfterCancel = await nameInputAfterCancel.getAttribute('value'); + expect(textAfterCancel).toEqual(updatedRuleName); + }); + }); + + describe('Edit rule with deleted connector', () => { + const ALERT_ACTION_INDEX = 'alert-action-es-query'; + const RULE_TYPE_ID = '.es-query'; + + afterEach(async () => { + await Promise.all( + ruleIdList.map(async (ruleId) => { + await supertest + .delete(`/api/alerting/rule/${ruleId}`) + .set('kbn-xsrf', 'foo') + .set('x-elastic-internal-origin', 'foo'); + }) + ); + await Promise.all( + connectorIdList.map(async (connectorId) => { + await supertest + .delete(`/api/actions/connector/${connectorId}`) + .set('kbn-xsrf', 'foo') + .set('x-elastic-internal-origin', 'foo'); + }) + ); + }); + + it('should show and update deleted connectors when there are existing connectors of the same type', async () => { + const testRunUuid = uuidv4(); + + const connector1 = await createSlackConnector({ + supertest, + name: `slack-${testRunUuid}-${0}`, + }); + + const connector2 = await createSlackConnector({ + supertest, + name: `slack-${testRunUuid}-${1}`, + }); + + connectorIdList = [connector2.id]; + + const rule = await createRule({ + supertest, + consumer: 'alerts', + name: testRunUuid, + ruleTypeId: RULE_TYPE_ID, + schedule: { interval: '1m' }, + params: { + size: 100, + thresholdComparator: '>', + threshold: [-1], + index: ['alert-test-data'], + timeField: 'date', + esQuery: `{\n \"query\":{\n \"match_all\" : {}\n }\n}`, + timeWindowSize: 20, + timeWindowUnit: 's', + }, + actions: [ + { + group: 'query matched', + id: connector1.id, + params: { level: 'info', message: ' {{context.message}}' }, + frequency: { + summary: false, + notify_when: RuleNotifyWhen.THROTTLE, + throttle: '1m', + }, + }, + ], + }); + + ruleIdList = [rule.id]; + + await openRulesSection(); + await testSubjects.existOrFail('rulesList'); + await navigateToConnectors(); + + await deleteConnector(connector1.name); + + await retry.try(async () => { + const resultToast = await toasts.getToastElement(1); + const toastText = await resultToast.getVisibleText(); + expect(toastText).toEqual('Deleted 1 connector'); + }); + + await openRulesSection(); + await openFirstRule(rule.name); + + const editButton = await testSubjects.find('openEditRuleFlyoutButton'); + await editButton.click(); + expect(await testSubjects.exists('hasActionsDisabled')).toEqual(false); + + expect(await testSubjects.exists('addNewActionConnectorActionGroup-0')).toEqual(false); + expect(await testSubjects.exists('alertActionAccordion-0')).toEqual(true); + + expect(await testSubjects.exists('selectActionConnector-.slack-0')).toEqual(true); + // click the super selector the reveal the options + await testSubjects.click('selectActionConnector-.slack-0'); + await testSubjects.click(`dropdown-connector-${connector2.id}`); + expect(await testSubjects.exists('addNewActionConnectorActionGroup-0')).toEqual(true); + }); + + it('should show and update deleted connectors when there are no existing connectors of the same type', async () => { + const testRunUuid = uuidv4(); + const connector = await createIndexConnector({ + supertest, + name: `index-${testRunUuid}-${2}`, + indexName: ALERT_ACTION_INDEX, + }); + + const rule = await createRule({ + supertest, + consumer: 'alerts', + name: testRunUuid, + ruleTypeId: RULE_TYPE_ID, + schedule: { interval: '1m' }, + params: { + size: 100, + thresholdComparator: '>', + threshold: [-1], + index: ['alert-test-data'], + timeField: 'date', + esQuery: `{\n \"query\":{\n \"match_all\" : {}\n }\n}`, + timeWindowSize: 20, + timeWindowUnit: 's', + }, + actions: [ + { + group: 'query matched', + id: connector.id, + params: { level: 'info', message: ' {{context.message}}' }, + frequency: { + summary: false, + notify_when: RuleNotifyWhen.THROTTLE, + throttle: '1m', + }, + }, + { + group: 'recovered', + id: connector.id, + params: { level: 'info', message: ' {{context.message}}' }, + frequency: { + summary: false, + notify_when: RuleNotifyWhen.THROTTLE, + throttle: '1m', + }, + }, + ], + }); + ruleIdList = [rule.id]; + + await openRulesSection(); + await testSubjects.existOrFail('rulesList'); + await navigateToConnectors(); + await deleteConnector(connector.name); + + await retry.try(async () => { + const resultToast = await toasts.getToastElement(1); + const toastText = await resultToast.getVisibleText(); + expect(toastText).toEqual('Deleted 1 connector'); + }); + + await openRulesSection(); + await openFirstRule(rule.name); + + const editButton = await testSubjects.find('openEditRuleFlyoutButton'); + await editButton.click(); + expect(await testSubjects.exists('hasActionsDisabled')).toEqual(false); + + expect(await testSubjects.exists('addNewActionConnectorActionGroup-0')).toEqual(false); + expect(await testSubjects.exists('alertActionAccordion-0')).toEqual(true); + expect(await testSubjects.exists('addNewActionConnectorActionGroup-1')).toEqual(false); + expect(await testSubjects.exists('alertActionAccordion-1')).toEqual(true); + + await testSubjects.click('createActionConnectorButton-0'); + + await testSubjects.existOrFail('connectorAddModal'); + await testSubjects.setValue('nameInput', 'new connector'); + await retry.try(async () => { + // At times we find the driver controlling the ComboBox in tests + // can select the wrong item, this ensures we always select the correct index + await comboBox.set('connectorIndexesComboBox', 'test-index'); + expect( + await comboBox.isOptionSelected( + await testSubjects.find('connectorIndexesComboBox'), + 'test-index' + ) + ).toEqual(true); + }); + await testSubjects.click('connectorAddModal > saveActionButtonModal'); + await testSubjects.missingOrFail('deleteIdsConfirmation'); + + expect(await testSubjects.exists('addNewActionConnectorActionGroup-0')).toEqual(true); + expect(await testSubjects.exists('addNewActionConnectorActionGroup-1')).toEqual(true); + + await openRulesSection(); + await testSubjects.existOrFail('rulesList'); + await navigateToConnectors(); + await deleteConnector('new connector'); + }); + }); + + describe('Edit rule with legacy rule-level notify values', () => { + afterEach(async () => { + await Promise.all( + ruleIdList.map(async (ruleId) => { + await supertest + .delete(`/api/alerting/rule/${ruleId}`) + .set('kbn-xsrf', 'foo') + .set('x-elastic-internal-origin', 'foo'); + }) + ); + await Promise.all( + connectorIdList.map(async (connectorId) => { + await supertest + .delete(`/api/actions/connector/${connectorId}`) + .set('kbn-xsrf', 'foo') + .set('x-elastic-internal-origin', 'foo'); + }) + ); + }); + + it('should convert rule-level params to action-level params and save the alert successfully', async () => { + const testRunUuid = uuidv4(); + const RULE_TYPE_ID = '.es-query'; + + const connector1 = await createSlackConnector({ + supertest, + name: `slack-${testRunUuid}-${0}`, + }); + + const connector2 = await createSlackConnector({ + supertest, + name: `slack-${testRunUuid}-${1}`, + }); + + connectorIdList = [connector1.id, connector2.id]; + + const rule = await createRule({ + supertest, + consumer: 'alerts', + name: `test-rule-${testRunUuid}`, + ruleTypeId: RULE_TYPE_ID, + schedule: { interval: '1m' }, + params: { + size: 100, + thresholdComparator: '>', + threshold: [-1], + index: ['alert-test-data'], + timeField: 'date', + esQuery: `{\n \"query\":{\n \"match_all\" : {}\n }\n}`, + timeWindowSize: 20, + timeWindowUnit: 's', + }, + actions: [connector1, connector2].map((connector) => ({ + id: connector.id, + group: 'query matched', + params: { + message: 'from alert 1s', + level: 'warn', + }, + frequency: { + summary: false, + notify_when: RuleNotifyWhen.THROTTLE, + throttle: '2d', + }, + })), + }); + ruleIdList = [rule.id]; + + const updatedRuleName = `Changed rule ${rule.name}`; + + await openRulesSection(); + await testSubjects.existOrFail('rulesList'); + await openFirstRule(rule.name); + + const editButton = await testSubjects.find('openEditRuleFlyoutButton'); + await editButton.click(); + const notifyWhenSelect = await testSubjects.find('notifyWhenSelect'); + expect(await notifyWhenSelect.getVisibleText()).toEqual('On custom action intervals'); + const throttleInput = await testSubjects.find('throttleInput'); + const throttleUnitInput = await testSubjects.find('throttleUnitInput'); + expect(await throttleInput.getAttribute('value')).toEqual('2'); + expect(await throttleUnitInput.getAttribute('value')).toEqual('d'); + await testSubjects.setValue('ruleNameInput', updatedRuleName, { + clearWithKeyboard: true, + }); + + await find.clickByCssSelector('[data-test-subj="saveEditedRuleButton"]:not(disabled)'); + + await retry.try(async () => { + const resultToast = await toasts.getToastElement(1); + const toastText = await resultToast.getVisibleText(); + expect(toastText).toEqual(`Updated '${updatedRuleName}'`); + }); + }); + }); + + describe('View In App', () => { + const ruleName = uuidv4(); + const RULE_TYPE_ID = '.es-query'; + + afterEach(async () => { + await Promise.all( + ruleIdList.map(async (ruleId) => { + await supertest + .delete(`/api/alerting/rule/${ruleId}`) + .set('kbn-xsrf', 'foo') + .set('x-elastic-internal-origin', 'foo'); + }) + ); + }); + + it('renders a disabled rule details view in app button', async () => { + const rule = await createRule({ + supertest, + consumer: 'alerts', + name: ruleName, + ruleTypeId: RULE_TYPE_ID, + params: { + size: 100, + thresholdComparator: '>', + threshold: [-1], + index: ['alert-test-data'], + timeField: 'date', + esQuery: `{\n \"query\":{\n \"match_all\" : {}\n }\n}`, + timeWindowSize: 20, + timeWindowUnit: 's', + }, + actions: [], + }); + + ruleIdList = [rule.id]; + + await openRulesSection(); + await testSubjects.existOrFail('rulesList'); + await openFirstRule(rule.name); + + expect(await svlRuleDetailsUI.isViewInAppDisabled()).toEqual(true); + }); + }); + }); +}; From f5d7c86cc4e0e22c5ea22712d4320536805247f7 Mon Sep 17 00:00:00 2001 From: Lisa Cawley Date: Mon, 23 Oct 2023 13:31:03 -0700 Subject: [PATCH 41/68] [DOCS] Automate screenshot for Amazon bedrock connector (#169463) --- .../connectors/action-types/bedrock.asciidoc | 4 +- .../connectors/images/bedrock-connector.png | Bin 297037 -> 290335 bytes .../connectors/images/bedrock-params.png | Bin 194017 -> 177141 bytes .../stack_connectors/bedrock_connector.ts | 37 ++++++++++++++++++ .../stack_connectors/index.ts | 1 + 5 files changed, 40 insertions(+), 2 deletions(-) create mode 100644 x-pack/test/screenshot_creation/apps/response_ops_docs/stack_connectors/bedrock_connector.ts diff --git a/docs/management/connectors/action-types/bedrock.asciidoc b/docs/management/connectors/action-types/bedrock.asciidoc index 80a8ba5b183f28..ab08e697daa532 100644 --- a/docs/management/connectors/action-types/bedrock.asciidoc +++ b/docs/management/connectors/action-types/bedrock.asciidoc @@ -18,8 +18,8 @@ The {bedrock} connector uses https://github.com/axios/axios[axios] to send a POS You can create connectors in *{stack-manage-app} > {connectors-ui}*. For example: [role="screenshot"] -// TODO: need logo before screenshot image::management/connectors/images/bedrock-connector.png[{bedrock} connector] +// NOTE: This is an autogenerated screenshot. Do not edit it directly. [float] [[bedrock-connector-configuration]] @@ -41,8 +41,8 @@ You can test connectors with the <> or as you're creating or editing the connector in {kib}. For example: [role="screenshot"] -// TODO: need logo before screenshot image::management/connectors/images/bedrock-params.png[{bedrock} params test] +// NOTE: This is an autogenerated screenshot. Do not edit it directly. The {bedrock} actions have the following configuration properties. diff --git a/docs/management/connectors/images/bedrock-connector.png b/docs/management/connectors/images/bedrock-connector.png index cfdb19f3fc6c2fdebcd771b69991ce13d17cf48f..d64cd6ab2ea96b36c0e3297d998520e82d4ddf14 100644 GIT binary patch literal 290335 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� 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

{^WT6 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%0D&UW&3?34V_H z*<#NY7_Rhp-ci(*CX-oud-pw}TnfdE(_5>R(U3oqqvXw{fnJX&q#dn6-r9Ku6s+fb zN=&lY5{{RgY0-zIZy$|>5E$N_NRE|III6Q{gE(fP+3MJ@ndv_L)|QyJ9{7}HJL4C7 zc%ItG*erJ)0)*2N^P#=$NJ-`hiI2T(XtL_xe_4Ib3w%!WweoUcsg5natgPxru;>YW z)>4>3<=`wLtOt3!Uu-pN5YjyXRD;#-h<|OWh4BE#3ok6Qo4Ze|X&E+{fEoCVm9egK z4{+|1Wcy|62o`ME_!@q%5a(w#;Bii=l{GfI+Fc-uPXZemQQ^D5fkcW9`LZb6mmFEN zl%WDB#tL}GTPZ2d@VWS-r=FSjlL zh-r+5{=2UwM|!HeE`u3`jEEc9HSRCK9Y|T59Yp|&2rGq|e?!UI>yZ8xJWX4G;PPRu zG-~WIBV#e7v}0k)^Vb$w@8?^72?^<$!9&Tf9p~F?eTnV6Tb-tiF<3LT$U3Oc6^ba5 zvjk{h09drsmjop{^6wB&r~Q|4dVi}zhQB$ZqEx1$ZYqsr%X?kTqS_QyRowGJuu6z} zvQrzVV!??K@Gw+*-?p+*iUd{i%PqGJ@7<^?&jwWOvWy;o^EgO&-MFmyGe2ZqHF%28 zd$F^0<7UIs2CX^@{YN|Z zw^XXcPe2$<=w?%qg7?e=R?(XWhM}%tf$;(tOC-OlS64sWx#G`%IWeNM@UOQwpIYJj zV@E~pxm(vW{>{(2|Mh4~lfpssq6NixYv}{Q3qYii^>-){lfFTB(AbRm|xzz!S#&YgT`Q|P0nv`8wBsWIM2&x!mj zKBYAj4EF>uK(Ez^1<>;Oc7}uN#9TSYufMxwt49G z^~x9LKNwbYo=tK6gI_lYmWIggGNjBsok1(eps|GU#ew15hp(uAicwZj%iH#er{kbh z&8$gBeDeC%7udp;kD_?zD>N`PBuAFt1P|!=3|NL2v_L+minM(ZP0|rmN=2_ks`WRb zW?-b<^z*J4GY%-0ob(XSKn*N3kYj8&KVmao`7M;FSrLTM1o~{nENDbluT&GcTyL8` zFtLmfF|VVaYSe-}3Whc;gyiU85Z>R2T!Pm*`m7nBSVf5WjGMEvpVBMIx& z{izy`;!8#qaGO@$_14w0aW?hYCNp6&_Rbkp!ue91byT(?);v$ki%s*E`aT6MYplNf zsx5MRWT$ZmWxWoacy+wcy5-dGB*-_^^fcfOo=ZUDun@wWL;rIUSc*4ufo^y2V+A?z zZGjfISdS?7R6n8PQfneYFF#C^?|Sf7>w*>HXX}ZE$-zHCk`5tD3I6HjoycP=K5m9J z{a-RxC+p(m%%hi<>y~i0%dR4(gF(52_T(>XFZ&f%qiHND>I+WW*tnR~s vo>Kd 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ŭ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%0D0T6C%HZ%$~TwegZ&q0REK|5c57-jiZG`s-baDv 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�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

^-ArpzGu!EB&0z5)z1p-NBnF#ktWucI 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

O=%=5m`X^dVuE%EaJ)A%-K+aSk6CU}wyrkA968 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 diff --git a/x-pack/test/screenshot_creation/apps/response_ops_docs/stack_connectors/bedrock_connector.ts b/x-pack/test/screenshot_creation/apps/response_ops_docs/stack_connectors/bedrock_connector.ts new file mode 100644 index 00000000000000..8450e48093b967 --- /dev/null +++ b/x-pack/test/screenshot_creation/apps/response_ops_docs/stack_connectors/bedrock_connector.ts @@ -0,0 +1,37 @@ +/* + * 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 { FtrProviderContext } from '../../../ftr_provider_context'; + +export default function ({ getService, getPageObjects }: FtrProviderContext) { + const commonScreenshots = getService('commonScreenshots'); + const screenshotDirectories = ['response_ops_docs', 'stack_connectors']; + const pageObjects = getPageObjects(['common', 'header']); + const actions = getService('actions'); + const testSubjects = getService('testSubjects'); + + describe('Amazon bedrock connector', function () { + it('Amazon bedrock connector screenshots', async () => { + await pageObjects.common.navigateToApp('connectors'); + await pageObjects.header.waitUntilLoadingHasFinished(); + await actions.common.openNewConnectorForm('bedrock'); + await testSubjects.setValue('nameInput', 'Bedrock test connector'); + await testSubjects.setValue('secrets.accessKey-input', 'testkey'); + await testSubjects.setValue('secrets.secret-input', 'testsecret'); + await commonScreenshots.takeScreenshot( + 'bedrock-connector', + screenshotDirectories, + 1920, + 1200 + ); + await testSubjects.click('create-connector-flyout-save-test-btn'); + await testSubjects.click('toastCloseButton'); + await commonScreenshots.takeScreenshot('bedrock-params', screenshotDirectories); + await testSubjects.click('euiFlyoutCloseButton'); + }); + }); +} diff --git a/x-pack/test/screenshot_creation/apps/response_ops_docs/stack_connectors/index.ts b/x-pack/test/screenshot_creation/apps/response_ops_docs/stack_connectors/index.ts index 8a754742646767..c3bc4ba0f4f090 100644 --- a/x-pack/test/screenshot_creation/apps/response_ops_docs/stack_connectors/index.ts +++ b/x-pack/test/screenshot_creation/apps/response_ops_docs/stack_connectors/index.ts @@ -54,6 +54,7 @@ export default function ({ loadTestFile, getService }: FtrProviderContext) { }); loadTestFile(require.resolve('./connectors')); + loadTestFile(require.resolve('./bedrock_connector')); loadTestFile(require.resolve('./email_connector')); loadTestFile(require.resolve('./generative_ai_connector')); loadTestFile(require.resolve('./index_connector')); From 93636d9fc0899f99f27acd29990f182f0d493825 Mon Sep 17 00:00:00 2001 From: Garrett Spong Date: Mon, 23 Oct 2023 16:01:16 -0600 Subject: [PATCH 42/68] [Security Solution] [Elastic AI Assistant] Fixes `ES|QL` codeblocks from not being able to be sent to Timeline (#169478) ## Summary Fixes `ES|QL` codeblocks from not being able to be sent to Timeline.

## Test instructions Either request the assistant to generate an ESQL query or just paste this codeblock into the conversation to test the action directly from the user message. Be sure to declare the codeblock language as `esql` or include one of the [string match patterns](https://github.com/elastic/kibana/pull/169478/files#diff-f70f0b96568e024e53bfbb62adcca72051f0a2e824d4ab22664eed0e149be248R38) above the code block so the action can be recognized. ```` Below is an `Elasticsearch Query Language` query: ```esql FROM logs-endpoint* | WHERE event.category == \"process\" | STATS proc_count = COUNT(process.name) BY host.name | KEEP host.name, proc_count ``` ```` Note: The `send to timeline` actions appear to only reliably show up when using the Assistant instance within Timeline. Now that we have a more reliable way of attaching actions via markdown plugins/parsers, we should refactor this code to use that method as opposed to the code block/dom inspection route that is used currently. In the meantime I will see if there is a low-impact fix that can be made here. --- .../assistant/use_conversation/helpers.ts | 3 +- .../security_solution/public/app/app.tsx | 40 +++++++-------- .../custom_codeblock/custom_code_block.tsx | 41 +++++++++++++++ .../custom_codeblock_markdown_plugin.tsx | 35 +++++++++++++ .../public/assistant/get_comments/index.tsx | 50 +++++++++++++++++-- .../public/assistant/helpers.tsx | 8 ++- .../assistant/send_to_timeline/index.tsx | 38 ++++++++++++-- 7 files changed, 184 insertions(+), 31 deletions(-) create mode 100644 x-pack/plugins/security_solution/public/assistant/get_comments/custom_codeblock/custom_code_block.tsx create mode 100644 x-pack/plugins/security_solution/public/assistant/get_comments/custom_codeblock/custom_codeblock_markdown_plugin.tsx diff --git a/x-pack/packages/kbn-elastic-assistant/impl/assistant/use_conversation/helpers.ts b/x-pack/packages/kbn-elastic-assistant/impl/assistant/use_conversation/helpers.ts index d9a98aa5a45052..de766085e1aee7 100644 --- a/x-pack/packages/kbn-elastic-assistant/impl/assistant/use_conversation/helpers.ts +++ b/x-pack/packages/kbn-elastic-assistant/impl/assistant/use_conversation/helpers.ts @@ -18,7 +18,7 @@ export interface CodeBlockDetails { button?: React.ReactNode; } -export type QueryType = 'eql' | 'kql' | 'dsl' | 'json' | 'no-type'; +export type QueryType = 'eql' | 'esql' | 'kql' | 'dsl' | 'json' | 'no-type' | 'sql'; /** * `analyzeMarkdown` is a helper that enriches content returned from a query @@ -35,6 +35,7 @@ export const analyzeMarkdown = (markdown: string): CodeBlockDetails[] => { // If your codeblocks aren't getting tagged with the right language, add keywords to the array. const types = { eql: ['Event Query Language', 'EQL sequence query', 'EQL'], + esql: ['Elasticsearch Query Language', 'ESQL', 'ES|QL', 'SQL'], kql: ['Kibana Query Language', 'KQL Query', 'KQL'], dsl: [ 'Elasticsearch QueryDSL', diff --git a/x-pack/plugins/security_solution/public/app/app.tsx b/x-pack/plugins/security_solution/public/app/app.tsx index fcf4fd666a58ae..7c3d82fac80ceb 100644 --- a/x-pack/plugins/security_solution/public/app/app.tsx +++ b/x-pack/plugins/security_solution/public/app/app.tsx @@ -66,29 +66,29 @@ const StartAppComponent: FC = ({ - - - - - - - - - + + + + + + + + + {children} - - - - - - - - - + + + + + + + + + diff --git a/x-pack/plugins/security_solution/public/assistant/get_comments/custom_codeblock/custom_code_block.tsx b/x-pack/plugins/security_solution/public/assistant/get_comments/custom_codeblock/custom_code_block.tsx new file mode 100644 index 00000000000000..90e406f500ba89 --- /dev/null +++ b/x-pack/plugins/security_solution/public/assistant/get_comments/custom_codeblock/custom_code_block.tsx @@ -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 { EuiCodeBlock, EuiFlexGroup, EuiFlexItem, EuiPanel, useEuiTheme } from '@elastic/eui'; +import { css } from '@emotion/css'; +import React from 'react'; + +export const CustomCodeBlock = ({ value }: { value: string }) => { + const theme = useEuiTheme(); + + return ( + + + + + {value} + + + + + ); +}; diff --git a/x-pack/plugins/security_solution/public/assistant/get_comments/custom_codeblock/custom_codeblock_markdown_plugin.tsx b/x-pack/plugins/security_solution/public/assistant/get_comments/custom_codeblock/custom_codeblock_markdown_plugin.tsx new file mode 100644 index 00000000000000..19f566537a2b68 --- /dev/null +++ b/x-pack/plugins/security_solution/public/assistant/get_comments/custom_codeblock/custom_codeblock_markdown_plugin.tsx @@ -0,0 +1,35 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import type { Node } from 'unist'; +import type { Parent } from 'mdast'; + +export const customCodeBlockLanguagePlugin = () => { + const visitor = (node: Node, parent?: Parent) => { + if ('children' in node) { + const nodeAsParent = node as Parent; + nodeAsParent.children.forEach((child) => { + visitor(child, nodeAsParent); + }); + } + + if ( + node.type === 'code' && + (node.lang === 'eql' || + node.lang === 'esql' || + node.lang === 'kql' || + node.lang === 'dsl' || + node.lang === 'json') + ) { + node.type = 'customCodeBlock'; + } + }; + + return (tree: Node) => { + visitor(tree); + }; +}; diff --git a/x-pack/plugins/security_solution/public/assistant/get_comments/index.tsx b/x-pack/plugins/security_solution/public/assistant/get_comments/index.tsx index b87de5bc648748..f51f434a4638a2 100644 --- a/x-pack/plugins/security_solution/public/assistant/get_comments/index.tsx +++ b/x-pack/plugins/security_solution/public/assistant/get_comments/index.tsx @@ -7,7 +7,15 @@ import type { EuiCommentProps } from '@elastic/eui'; import type { Conversation } from '@kbn/elastic-assistant'; -import { EuiAvatar, EuiMarkdownFormat, EuiText, tint } from '@elastic/eui'; +import { + EuiAvatar, + EuiMarkdownFormat, + EuiSpacer, + EuiText, + getDefaultEuiMarkdownParsingPlugins, + getDefaultEuiMarkdownProcessingPlugins, + tint, +} from '@elastic/eui'; import React from 'react'; import { AssistantAvatar } from '@kbn/elastic-assistant'; @@ -15,6 +23,8 @@ import { css } from '@emotion/react'; import { euiThemeVars } from '@kbn/ui-theme'; import { CommentActions } from '../comment_actions'; import * as i18n from './translations'; +import { customCodeBlockLanguagePlugin } from './custom_codeblock/custom_codeblock_markdown_plugin'; +import { CustomCodeBlock } from './custom_codeblock/custom_code_block'; export const getComments = ({ currentConversation, @@ -24,8 +34,29 @@ export const getComments = ({ currentConversation: Conversation; lastCommentRef: React.MutableRefObject; showAnonymizedValues: boolean; -}): EuiCommentProps[] => - currentConversation.messages.map((message, index) => { +}): EuiCommentProps[] => { + const parsingPlugins = getDefaultEuiMarkdownParsingPlugins(); + const processingPlugins = getDefaultEuiMarkdownProcessingPlugins(); + + const { components } = processingPlugins[1][1]; + + processingPlugins[1][1].components = { + ...components, + customCodeBlock: (props) => { + return ( + <> + + + + ); + }, + }; + + // Fun fact: must spread existing parsingPlugins last + const parsingPluginList = [customCodeBlockLanguagePlugin, ...parsingPlugins]; + const processingPluginList = processingPlugins; + + return currentConversation.messages.map((message, index) => { const isUser = message.role === 'user'; const replacements = currentConversation.replacements; const messageContentWithReplacements = @@ -45,13 +76,21 @@ export const getComments = ({ children: index !== currentConversation.messages.length - 1 ? ( - + {showAnonymizedValues ? message.content : transformedMessage.content} ) : ( - + {showAnonymizedValues ? message.content : transformedMessage.content} @@ -82,3 +121,4 @@ export const getComments = ({ : {}), }; }); +}; diff --git a/x-pack/plugins/security_solution/public/assistant/helpers.tsx b/x-pack/plugins/security_solution/public/assistant/helpers.tsx index 6915796ca89cad..04bba339edd5da 100644 --- a/x-pack/plugins/security_solution/public/assistant/helpers.tsx +++ b/x-pack/plugins/security_solution/public/assistant/helpers.tsx @@ -49,7 +49,13 @@ export const getPromptContextFromEventDetailsItem = (data: TimelineEventsDetails return getFieldsAsCsv(allFields); }; -const sendToTimelineEligibleQueryTypes: Array = ['kql', 'dsl', 'eql']; +const sendToTimelineEligibleQueryTypes: Array = [ + 'kql', + 'dsl', + 'eql', + 'esql', + 'sql', // Models often put the code block language as sql, for esql, so adding this as a fallback +]; /** * Returns message contents with replacements applied. diff --git a/x-pack/plugins/security_solution/public/assistant/send_to_timeline/index.tsx b/x-pack/plugins/security_solution/public/assistant/send_to_timeline/index.tsx index 9e7f5c0320b28d..3bd29dc53edae9 100644 --- a/x-pack/plugins/security_solution/public/assistant/send_to_timeline/index.tsx +++ b/x-pack/plugins/security_solution/public/assistant/send_to_timeline/index.tsx @@ -26,9 +26,11 @@ import { applyKqlFilterQuery, setActiveTabTimeline, setFilters, + showTimeline, updateDataView, updateEqlOptions, } from '../../timelines/store/timeline/actions'; +import { useDiscoverInTimelineContext } from '../../common/components/discover_in_timeline/use_discover_in_timeline_context'; export interface SendToTimelineButtonProps { asEmptyButton: boolean; @@ -50,6 +52,8 @@ export const SendToTimelineButton: React.FunctionComponent { const dispatch = useDispatch(); + const { discoverStateContainer } = useDiscoverInTimelineContext(); + const getDataViewsSelector = useMemo( () => sourcererSelectors.getSourcererDataViewsSelector(), [] @@ -68,6 +72,30 @@ export const SendToTimelineButton: React.FunctionComponent { if (dataProviders || filters) { + // If esql, don't reset filters or mess with dataview & time range + if (dataProviders?.[0]?.queryType === 'esql' || dataProviders?.[0]?.queryType === 'sql') { + discoverStateContainer.current?.appState.update({ + query: { + query: dataProviders[0].kqlQuery, + language: 'esql', + }, + }); + + dispatch( + setActiveTabTimeline({ + id: TimelineId.active, + activeTab: TimelineTabs.esql, + }) + ); + dispatch( + showTimeline({ + id: TimelineId.active, + show: true, + }) + ); + return; + } + // Reset the current timeline if (timeRange) { clearTimeline({ @@ -147,6 +175,7 @@ export const SendToTimelineButton: React.FunctionComponent Date: Mon, 23 Oct 2023 18:08:57 -0400 Subject: [PATCH 43/68] [RAM] Wrap rule name (#169560) ## Summary FIX => https://github.com/elastic/response-ops-team/issues/146 Before: image After: image --- .../sections/rules_list/components/rules_list_table.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/x-pack/plugins/triggers_actions_ui/public/application/sections/rules_list/components/rules_list_table.tsx b/x-pack/plugins/triggers_actions_ui/public/application/sections/rules_list/components/rules_list_table.tsx index afe42369176db3..0f7420a926d6f9 100644 --- a/x-pack/plugins/triggers_actions_ui/public/application/sections/rules_list/components/rules_list_table.tsx +++ b/x-pack/plugins/triggers_actions_ui/public/application/sections/rules_list/components/rules_list_table.tsx @@ -340,7 +340,7 @@ export const RulesListTable = (props: RulesListTableProps) => { { defaultMessage: 'Name' } ), sortable: true, - truncateText: true, + truncateText: false, width: '22%', 'data-test-subj': 'rulesTableCell-name', render: (name: string, rule: RuleTableItem) => { From 8fe2e1ac687678e0fe5558ca61853614b287adc0 Mon Sep 17 00:00:00 2001 From: Youhei Sakurai Date: Tue, 24 Oct 2023 07:42:30 +0900 Subject: [PATCH 44/68] Fix autocomplete triggering on URL tokens (#168956) ## Summary This PR fixes autocomplete triggering on URL tokens ~~for url parameters to work with a single character~~. Fixes #168017 (which is a regression introduced by #163233) ![fix-autocomplete-168017](https://github.com/elastic/kibana/assets/721858/94e6f773-53c9-4bc1-991c-fb572ddf7ffd) ### Checklist - [x] [Unit or functional tests](https://www.elastic.co/guide/en/kibana/master/development-tests.html) were updated or added to match the most common scenarios ### Notes - No functional tests are added because they would also go flaky. - ~~No unit tests are added because of the lack of existing unit tests.~~ - ~~The change is kept minimal by accepting the growing if-else block.~~ ### For maintainers - [x] This was checked for breaking API changes and was [labeled appropriately](https://www.elastic.co/guide/en/kibana/master/contributing.html#kibana-release-notes-process) --------- Co-authored-by: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> --- .../public/lib/autocomplete/autocomplete.ts | 41 +--- .../autocomplete/looks_like_typing_in.test.ts | 219 ++++++++++++++++++ .../lib/autocomplete/looks_like_typing_in.ts | 101 ++++++++ 3 files changed, 323 insertions(+), 38 deletions(-) create mode 100644 src/plugins/console/public/lib/autocomplete/looks_like_typing_in.test.ts create mode 100644 src/plugins/console/public/lib/autocomplete/looks_like_typing_in.ts diff --git a/src/plugins/console/public/lib/autocomplete/autocomplete.ts b/src/plugins/console/public/lib/autocomplete/autocomplete.ts index 79adee3bd42b7d..ec543a1663d98a 100644 --- a/src/plugins/console/public/lib/autocomplete/autocomplete.ts +++ b/src/plugins/console/public/lib/autocomplete/autocomplete.ts @@ -26,6 +26,7 @@ import * as utils from '../utils'; import { populateContext } from './engine'; import type { AutoCompleteContext, DataAutoCompleteRulesOneOf, ResultTerm } from './types'; import { URL_PATH_END_MARKER, ConstantComponent } from './components'; +import { looksLikeTypingIn } from './looks_like_typing_in'; let lastEvaluatedToken: Token | null = null; @@ -1137,44 +1138,8 @@ export default function ({ return; // wait for the next typing. } - if ( - lastEvaluatedToken.position.column + 1 === currentToken.position.column && - lastEvaluatedToken.position.lineNumber === currentToken.position.lineNumber && - (lastEvaluatedToken.type === 'url.slash' || lastEvaluatedToken.type === 'url.comma') && - currentToken.type === 'url.part' && - currentToken.value.length === 1 - ) { - // do not suppress autocomplete for a single character immediately following a slash or comma in URL - } else if ( - lastEvaluatedToken.position.column < currentToken.position.column && - lastEvaluatedToken.position.lineNumber === currentToken.position.lineNumber && - lastEvaluatedToken.type === 'method' && - currentToken.type === 'url.part' && - currentToken.value.length === 1 - ) { - // do not suppress autocomplete for a single character following method in URL - } else if ( - lastEvaluatedToken.position.column < currentToken.position.column && - lastEvaluatedToken.position.lineNumber === currentToken.position.lineNumber && - !lastEvaluatedToken.type && - currentToken.type === 'method' && - currentToken.value.length === 1 - ) { - // do not suppress autocompletion for the first character of method - } else if ( - // if the column or the line number have changed for the last token or - // user did not provided a new value, then we should not show autocomplete - // this guards against triggering autocomplete when clicking around the editor - lastEvaluatedToken.position.column !== currentToken.position.column || - lastEvaluatedToken.position.lineNumber !== currentToken.position.lineNumber || - lastEvaluatedToken.value === currentToken.value - ) { - tracer( - 'not starting autocomplete since the change looks like a click', - lastEvaluatedToken, - '->', - currentToken - ); + if (!looksLikeTypingIn(lastEvaluatedToken, currentToken, editor)) { + tracer('not starting autocomplete', lastEvaluatedToken, '->', currentToken); // not on the same place or nothing changed, cache and wait for the next time lastEvaluatedToken = currentToken; return; diff --git a/src/plugins/console/public/lib/autocomplete/looks_like_typing_in.test.ts b/src/plugins/console/public/lib/autocomplete/looks_like_typing_in.test.ts new file mode 100644 index 00000000000000..969f06f8d994f2 --- /dev/null +++ b/src/plugins/console/public/lib/autocomplete/looks_like_typing_in.test.ts @@ -0,0 +1,219 @@ +/* + * 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 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 or the Server + * Side Public License, v 1. + */ + +import '../../application/models/sense_editor/sense_editor.test.mocks'; + +import { looksLikeTypingIn } from './looks_like_typing_in'; +import { create } from '../../application/models'; +import type { SenseEditor } from '../../application/models'; +import type { CoreEditor, Position, Token, TokensProvider } from '../../types'; + +describe('looksLikeTypingIn', () => { + let editor: SenseEditor; + let coreEditor: CoreEditor; + let tokenProvider: TokensProvider; + + beforeEach(() => { + document.body.innerHTML = `
+
+
+
+
`; + editor = create(document.getElementById('ConAppEditor')!); + coreEditor = editor.getCoreEditor(); + tokenProvider = coreEditor.getTokenProvider(); + }); + + afterEach(async () => { + await editor.update('', true); + }); + + describe('general typing in', () => { + interface RunTestArgs { + preamble: string; + autocomplete?: string; + input: string; + } + + const runTest = async ({ preamble, autocomplete, input }: RunTestArgs) => { + const pos: Position = { lineNumber: 1, column: 1 }; + + await editor.update(preamble, true); + pos.column += preamble.length; + const lastEvaluatedToken = tokenProvider.getTokenAt(pos); + + if (autocomplete !== undefined) { + await editor.update(coreEditor.getValue() + autocomplete, true); + pos.column += autocomplete.length; + } + + await editor.update(coreEditor.getValue() + input, true); + pos.column += input.length; + const currentToken = tokenProvider.getTokenAt(pos); + + expect(lastEvaluatedToken).not.toBeNull(); + expect(currentToken).not.toBeNull(); + expect(looksLikeTypingIn(lastEvaluatedToken!, currentToken!, coreEditor)).toBe(true); + }; + + const cases: RunTestArgs[] = [ + { preamble: 'G', input: 'E' }, + { preamble: 'GET .kibana', input: '/' }, + { preamble: 'GET .kibana', input: ',' }, + { preamble: 'GET .kibana', input: '?' }, + { preamble: 'GET .kibana/', input: '_' }, + { preamble: 'GET .kibana/', input: '?' }, + { preamble: 'GET .kibana,', input: '.' }, + { preamble: 'GET .kibana,', input: '?' }, + { preamble: 'GET .kibana?', input: 'k' }, + { preamble: 'GET .kibana?k', input: '=' }, + { preamble: 'GET .kibana?k=', input: 'v' }, + { preamble: 'GET .kibana?k=v', input: '&' }, + { preamble: 'GET .kibana?k', input: '&' }, + { preamble: 'GET .kibana?k&', input: 'k' }, + { preamble: 'GET ', autocomplete: '.kibana', input: '/' }, + { preamble: 'GET ', autocomplete: '.kibana', input: ',' }, + { preamble: 'GET ', autocomplete: '.kibana', input: '?' }, + { preamble: 'GET .ki', autocomplete: 'bana', input: '/' }, + { preamble: 'GET .ki', autocomplete: 'bana', input: ',' }, + { preamble: 'GET .ki', autocomplete: 'bana', input: '?' }, + { preamble: 'GET _nodes/', autocomplete: 'stats', input: '/' }, + { preamble: 'GET _nodes/sta', autocomplete: 'ts', input: '/' }, + { preamble: 'GET _nodes/', autocomplete: 'jvm', input: ',' }, + { preamble: 'GET _nodes/j', autocomplete: 'vm', input: ',' }, + { preamble: 'GET _nodes/jvm,', autocomplete: 'os', input: ',' }, + { preamble: 'GET .kibana,', autocomplete: '.security', input: ',' }, + { preamble: 'GET .kibana,.sec', autocomplete: 'urity', input: ',' }, + { preamble: 'GET .kibana,', autocomplete: '.security', input: '/' }, + { preamble: 'GET .kibana,.sec', autocomplete: 'urity', input: '/' }, + { preamble: 'GET .kibana,', autocomplete: '.security', input: '?' }, + { preamble: 'GET .kibana,.sec', autocomplete: 'urity', input: '?' }, + { preamble: 'GET .kibana/', autocomplete: '_search', input: '?' }, + { preamble: 'GET .kibana/_se', autocomplete: 'arch', input: '?' }, + { preamble: 'GET .kibana/_search?', autocomplete: 'expand_wildcards', input: '=' }, + { preamble: 'GET .kibana/_search?exp', autocomplete: 'and_wildcards', input: '=' }, + { preamble: 'GET .kibana/_search?expand_wildcards=', autocomplete: 'all', input: '&' }, + { preamble: 'GET .kibana/_search?expand_wildcards=a', autocomplete: 'll', input: '&' }, + { preamble: 'GET _cat/indices?s=index&', autocomplete: 'expand_wildcards', input: '=' }, + { preamble: 'GET _cat/indices?s=index&exp', autocomplete: 'and_wildcards', input: '=' }, + { preamble: 'GET _cat/indices?v&', autocomplete: 'expand_wildcards', input: '=' }, + { preamble: 'GET _cat/indices?v&exp', autocomplete: 'and_wildcards', input: '=' }, + ]; + for (const c of cases) { + const name = + c.autocomplete === undefined + ? `'${c.preamble}' -> '${c.input}'` + : `'${c.preamble}' -> '${c.autocomplete}' (autocomplte) -> '${c.input}'`; + test(name, async () => runTest(c)); + } + }); + + describe('first typing in', () => { + test(`'' -> 'G'`, () => { + // this is based on an implementation within the evaluateCurrentTokenAfterAChange function + const lastEvaluatedToken = { position: { column: 0, lineNumber: 0 }, value: '', type: '' }; + lastEvaluatedToken.position.lineNumber = coreEditor.getCurrentPosition().lineNumber; + + const currentToken = { position: { column: 1, lineNumber: 1 }, value: 'G', type: 'method' }; + expect(looksLikeTypingIn(lastEvaluatedToken, currentToken, coreEditor)).toBe(true); + }); + }); + + const matrices = [ + ` +GET .kibana/ + + +` + .slice(1, -1) + .split('\n'), + ` + + POST test/_doc +{"message": "test"} + +GET /_cat/indices?v&s= + +DE +` + .slice(1, -1) + .split('\n'), + ` + +PUT test/_doc/1 +{"field": "value"} +` + .slice(1, -1) + .split('\n'), + ]; + + describe('navigating the editor via keyboard arrow keys', () => { + const runHorizontalZigzagWalkTest = async (matrix: string[]) => { + const width = matrix[0].length; + const height = matrix.length; + + await editor.update(matrix.join('\n'), true); + let lastEvaluatedToken = tokenProvider.getTokenAt(coreEditor.getCurrentPosition()); + let currentToken: Token | null; + + for (let i = 1; i < height * width * 2; i++) { + const pos = { + column: 1 + (i % width), + lineNumber: 1 + Math.floor(i / width), + }; + if (pos.lineNumber % 2 === 0) { + pos.column = width - pos.column + 1; + } + if (pos.lineNumber > height) { + pos.lineNumber = 2 * height - pos.lineNumber + 1; + } + + currentToken = tokenProvider.getTokenAt(pos); + expect(lastEvaluatedToken).not.toBeNull(); + expect(currentToken).not.toBeNull(); + expect(looksLikeTypingIn(lastEvaluatedToken!, currentToken!, coreEditor)).toBe(false); + lastEvaluatedToken = currentToken; + } + }; + + for (const matrix of matrices) { + test(`horizontal zigzag walk ${matrix[0].length}x${matrix.length} map`, () => + runHorizontalZigzagWalkTest(matrix)); + } + }); + + describe('clicking around the editor', () => { + const runRandomClickingTest = async (matrix: string[], attempts: number) => { + const width = matrix[0].length; + const height = matrix.length; + + await editor.update(matrix.join('\n'), true); + let lastEvaluatedToken = tokenProvider.getTokenAt(coreEditor.getCurrentPosition()); + let currentToken: Token | null; + + for (let i = 1; i < attempts; i++) { + const pos = { + column: Math.ceil(Math.random() * width), + lineNumber: Math.ceil(Math.random() * height), + }; + + currentToken = tokenProvider.getTokenAt(pos); + expect(lastEvaluatedToken).not.toBeNull(); + expect(currentToken).not.toBeNull(); + expect(looksLikeTypingIn(lastEvaluatedToken!, currentToken!, coreEditor)).toBe(false); + lastEvaluatedToken = currentToken; + } + }; + + for (const matrix of matrices) { + const attempts = 4 * matrix[0].length * matrix.length; + test(`random clicking ${matrix[0].length}x${matrix.length} map ${attempts} times`, () => + runRandomClickingTest(matrix, attempts)); + } + }); +}); diff --git a/src/plugins/console/public/lib/autocomplete/looks_like_typing_in.ts b/src/plugins/console/public/lib/autocomplete/looks_like_typing_in.ts new file mode 100644 index 00000000000000..a679aa2eda1176 --- /dev/null +++ b/src/plugins/console/public/lib/autocomplete/looks_like_typing_in.ts @@ -0,0 +1,101 @@ +/* + * 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 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 or the Server + * Side Public License, v 1. + */ + +import type { CoreEditor, Position, Token } from '../../types'; + +enum Move { + ForwardOneCharacter = 1, + ForwardOneToken, // the column position may jump to the next token by autocomplete +} + +const knownTypingInTokenTypes = new Map>>([ + [ + Move.ForwardOneCharacter, + new Map>([ + // a pair of the last evaluated token type and a set of the current token types + ['', new Set(['method'])], + ['url.amp', new Set(['url.param'])], + ['url.comma', new Set(['url.part', 'url.questionmark'])], + ['url.equal', new Set(['url.value'])], + ['url.param', new Set(['url.amp', 'url.equal'])], + ['url.questionmark', new Set(['url.param'])], + ['url.slash', new Set(['url.part', 'url.questionmark'])], + ['url.value', new Set(['url.amp'])], + ]), + ], + [ + Move.ForwardOneToken, + new Map>([ + ['method', new Set(['url.part'])], + ['url.amp', new Set(['url.amp', 'url.equal'])], + ['url.comma', new Set(['url.comma', 'url.questionmark', 'url.slash'])], + ['url.equal', new Set(['url.amp'])], + ['url.param', new Set(['url.equal'])], + ['url.part', new Set(['url.comma', 'url.questionmark', 'url.slash'])], + ['url.questionmark', new Set(['url.equal'])], + ['url.slash', new Set(['url.comma', 'url.questionmark', 'url.slash'])], + ['url.value', new Set(['url.amp'])], + ['whitespace', new Set(['url.comma', 'url.questionmark', 'url.slash'])], + ]), + ], +]); + +const getOneCharacterNextOnTheRight = (pos: Position, coreEditor: CoreEditor): string => { + const range = { + start: { column: pos.column + 1, lineNumber: pos.lineNumber }, + end: { column: pos.column + 2, lineNumber: pos.lineNumber }, + }; + return coreEditor.getValueInRange(range); +}; + +/** + * Examines a change from the last evaluated to the current token and one + * character next to the current token position on the right. Returns true if + * the change looks like typing in, false otherwise. + * + * This function is supposed to filter out situations where autocomplete is not + * preferable, such as clicking around the editor, navigating the editor via + * keyboard arrow keys, etc. + */ +export const looksLikeTypingIn = ( + lastEvaluatedToken: Token, + currentToken: Token, + coreEditor: CoreEditor +): boolean => { + // if the column position moves to the right in the same line and the current + // token length is 1, then user is possibly typing in a character. + if ( + lastEvaluatedToken.position.column < currentToken.position.column && + lastEvaluatedToken.position.lineNumber === currentToken.position.lineNumber && + currentToken.value.length === 1 && + getOneCharacterNextOnTheRight(currentToken.position, coreEditor) === '' + ) { + const move = + lastEvaluatedToken.position.column + 1 === currentToken.position.column + ? Move.ForwardOneCharacter + : Move.ForwardOneToken; + const tokenTypesPairs = knownTypingInTokenTypes.get(move) ?? new Map>(); + const currentTokenTypes = tokenTypesPairs.get(lastEvaluatedToken.type) ?? new Set(); + if (currentTokenTypes.has(currentToken.type)) { + return true; + } + } + + // if the column or the line number have changed for the last token or + // user did not provided a new value, then we should not show autocomplete + // this guards against triggering autocomplete when clicking around the editor + if ( + lastEvaluatedToken.position.column !== currentToken.position.column || + lastEvaluatedToken.position.lineNumber !== currentToken.position.lineNumber || + lastEvaluatedToken.value === currentToken.value + ) { + return false; + } + + return true; +}; From aaa6c369b3143d47a6fdd835eb8b25e6805dda94 Mon Sep 17 00:00:00 2001 From: Lisa Cawley Date: Mon, 23 Oct 2023 16:26:16 -0700 Subject: [PATCH 45/68] [DOCS] Custom fields in cases (#169057) --- docs/management/cases/add-connectors.asciidoc | 13 +- docs/management/cases/images/cases-create.png | Bin 0 -> 242438 bytes .../cases/images/cases-custom-fields-add.png | Bin 0 -> 140772 bytes .../cases/images/cases-custom-fields-view.png | Bin 0 -> 199788 bytes .../cases/images/cases-custom-fields.png | Bin 0 -> 353829 bytes ...ases-connectors.png => cases-settings.png} | Bin docs/management/cases/index.asciidoc | 2 +- docs/management/cases/manage-cases.asciidoc | 123 +++++++++++++----- docs/management/cases/setup-cases.asciidoc | 2 +- .../stack_cases/custom_fields.ts | 53 ++++++++ .../stack_cases/details_view.ts | 54 ++------ .../stack_cases/external_connections.ts | 2 +- .../response_ops_docs/stack_cases/index.ts | 40 +++++- .../stack_cases/list_view.ts | 17 --- 14 files changed, 202 insertions(+), 104 deletions(-) create mode 100644 docs/management/cases/images/cases-create.png create mode 100644 docs/management/cases/images/cases-custom-fields-add.png create mode 100644 docs/management/cases/images/cases-custom-fields-view.png create mode 100644 docs/management/cases/images/cases-custom-fields.png rename docs/management/cases/images/{cases-connectors.png => cases-settings.png} (100%) create mode 100644 x-pack/test/screenshot_creation/apps/response_ops_docs/stack_cases/custom_fields.ts diff --git a/docs/management/cases/add-connectors.asciidoc b/docs/management/cases/add-connectors.asciidoc index e5fc4e3791082d..0ab72287a5384c 100644 --- a/docs/management/cases/add-connectors.asciidoc +++ b/docs/management/cases/add-connectors.asciidoc @@ -1,10 +1,12 @@ [[add-case-connectors]] -== Add connectors - +== Add connectors to cases :frontmatter-description: Configure connectors to push case details to external incident management systems. :frontmatter-tags-products: [kibana] :frontmatter-tags-content-type: [how-to] :frontmatter-tags-user-goals: [configure] +++++ +Add connectors +++++ You can add connectors to cases to push information to these external incident management systems: @@ -23,6 +25,11 @@ appropriate {kib} feature privileges. Refer to <>. [[create-case-connectors]] == Create connectors +:frontmatter-description: Open and track issues in {kib} cases. +:frontmatter-tags-products: [kibana] +:frontmatter-tags-content-type: [overview] +:frontmatter-tags-user-goals: [analyze] + You can create connectors in *{stack-manage-app} > {connectors-ui}*, as described in <>. Alternatively, you can create them in *{stack-manage-app} > Cases*: @@ -31,7 +38,7 @@ as described in <>. Alternatively, you can create them in + -- [role="screenshot"] -image::images/cases-connectors.png[] +image::images/cases-settings.png[View case settings] // NOTE: This is an autogenerated screenshot. Do not edit it directly. -- diff --git a/docs/management/cases/images/cases-create.png b/docs/management/cases/images/cases-create.png new file mode 100644 index 0000000000000000000000000000000000000000..1629348293d3099f8c0eb03aa088a4e5d382f50f GIT binary patch literal 242438 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
!VaV$0#J^e?* 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 M)qYT+Z1w!V03ndm0ssI2 literal 0 HcmV?d00001 diff --git a/docs/management/cases/images/cases-custom-fields-add.png b/docs/management/cases/images/cases-custom-fields-add.png new file mode 100644 index 0000000000000000000000000000000000000000..1938ab29500535040e1b24cc570b22137d597e5c GIT binary patch literal 140772 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
MSQL1pzm)Gk05sn^`R)eSG)@ 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 H9PobtBea5z literal 0 HcmV?d00001 diff --git a/docs/management/cases/images/cases-custom-fields-view.png b/docs/management/cases/images/cases-custom-fields-view.png new file mode 100644 index 0000000000000000000000000000000000000000..c97f9f9dd75b56df3c247ae266f69fd7fa52a4bd GIT binary patch literal 199788 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≈J{KF=}K^_+FX5tTiz`^Kjy48SvQAuzjIe7ka! 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�BQWzBocl^+(Hyze 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

b;!M3$u|b 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

OBzX$HT= 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 literal 0 HcmV?d00001 diff --git a/docs/management/cases/images/cases-connectors.png b/docs/management/cases/images/cases-settings.png similarity index 100% rename from docs/management/cases/images/cases-connectors.png rename to docs/management/cases/images/cases-settings.png diff --git a/docs/management/cases/index.asciidoc b/docs/management/cases/index.asciidoc index 981c8a9821a99a..b48aafc45f8836 100644 --- a/docs/management/cases/index.asciidoc +++ b/docs/management/cases/index.asciidoc @@ -1,4 +1,4 @@ include::cases.asciidoc[] include::setup-cases.asciidoc[leveloffset=+1] include::manage-cases.asciidoc[leveloffset=+1] -include::add-connectors.asciidoc[leveloffset=+1] \ No newline at end of file +include::add-connectors.asciidoc[leveloffset=+1] diff --git a/docs/management/cases/manage-cases.asciidoc b/docs/management/cases/manage-cases.asciidoc index bccfd315ca4456..a531299b957976 100644 --- a/docs/management/cases/manage-cases.asciidoc +++ b/docs/management/cases/manage-cases.asciidoc @@ -12,6 +12,12 @@ Open a new case to keep track of issues and share their details with colleagues. . Go to *Management > {stack-manage-app} > Cases*, then click *Create case*. ++ +-- +[role="screenshot"] +image::images/cases-create.png[Create a case in {stack-manage-app}] +// NOTE: This is an autogenerated screenshot. Do not edit it directly. +-- . Give the case a name, severity, and description. + @@ -22,11 +28,90 @@ text. . Optionally, add a category, assignees, and tags. You can add users only if they meet the necessary <>. -. For *External incident management system*, select a connector. For more +. preview:[] If you defined any custom fields, they appear in the *Additional fields* section. +Check out <>. + +. For the *External incident management system*, select a connector. For more information, refer to <>. . After you've completed all of the required fields, click *Create case*. +[[case-custom-fields]] +=== Add custom fields + +preview::[] + +You can add optional and required fields for customized case collaboration. + +. Go to *{stack-manage-app} > Cases* and click *Settings*. ++ +-- +[role="screenshot"] +image::images/cases-custom-fields-view.png[View custom fields in case settings] +// NOTE: This is an autogenerated screenshot. Do not edit it directly. + +NOTE: To view and change case settings, you must have the appropriate {kib} feature privileges. Refer to <>. +-- + +. In the *Custom fields* section, click *Add field*. ++ +-- +[role="screenshot"] +image::images/cases-custom-fields-add.png[Add a custom field in case settings] +// NOTE: This is an autogenerated screenshot. Do not edit it directly. +-- + +. Enter a field label. + +. Choose a field type: text or toggle. + +. If you want the text field to be mandatory in all cases, select *Make this field required*. + +. Click *Save field*. + +You can subsequently remove or edit custom fields on the *Settings* page. + +After you create custom fields, they're added to all new and existing cases. + +Existing cases have null values for the new text fields until you set them in each case. +For example, you must click the pencil icon next to `my-field` to set it: + +[role="screenshot"] +image::images/cases-custom-fields.png[A case that has an unset custom field] +// NOTE: This is an autogenerated screenshot. Do not edit it directly. + +[[add-case-notifications]] +=== Add email notifications + +You can configure email notifications that occur when users are assigned to +cases. + +For hosted {kib} on {ess}: + +. Add the email domains to the {cloud}/ec-organizations-notifications-domain-allowlist.html[notifications domain allowlist]. ++ +-- +You do not need to take any more steps to configure an email connector or update +{kib} user settings, since the preconfigured Elastic-Cloud-SMTP connector is +used by default. +-- + +For self-managed {kib}: + +. Create a preconfigured email connector. ++ +-- +NOTE: At this time, email notifications support only preconfigured connectors, +which are defined in the `kibana.yml` file. +For examples, refer to <> and <>. +-- +. Set the `notifications.connectors.default.email` {kib} setting to the name of +your email connector. +. If you want the email notifications to contain links back to the case, you +must configure the <> setting. + +When you subsequently add assignees to cases, they receive an email. + [[add-case-files]] === Add files @@ -48,7 +133,7 @@ When you export cases as <>, the case file ============================================================================ [[add-case-visualization]] -=== Add a visualization +=== Add visualizations You can also optionally add visualizations. For example, you can portray event and alert data through charts and graphs. @@ -79,40 +164,6 @@ Alternatively, while viewing a <> you can open a panel's me After a visualization has been added to a case, you can modify or interact with it by clicking the *Open Visualization* option in the case's comment menu. -[[add-case-notifications]] -=== Add email notifications - -// tag::case-notifications[] -You can configure email notifications that occur when users are assigned to -cases. - -For hosted {kib} on {ess}: - -. Add the email domains to the {cloud}/ec-organizations-notifications-domain-allowlist.html[notifications domain allowlist]. -+ --- -You do not need to take any more steps to configure an email connector or update -{kib} user settings, since the preconfigured Elastic-Cloud-SMTP connector is -used by default. --- - -For self-managed {kib}: - -. Create a preconfigured email connector. -+ --- -NOTE: At this time, email notifications support only preconfigured connectors, -which are defined in the `kibana.yml` file. -For examples, refer to <> and <>. --- -. Set the `notifications.connectors.default.email` {kib} setting to the name of -your email connector. -. If you want the email notifications to contain links back to the case, you -must configure the <> setting. - -When you subsequently add assignees to cases, they receive an email. -// end::case-notifications[] - [[manage-case]] === Manage cases diff --git a/docs/management/cases/setup-cases.asciidoc b/docs/management/cases/setup-cases.asciidoc index 5e04d3a1366056..a404042bf3f604 100644 --- a/docs/management/cases/setup-cases.asciidoc +++ b/docs/management/cases/setup-cases.asciidoc @@ -13,7 +13,7 @@ privileges: |=== | Action | {kib} privileges -| Give full access to manage cases +| Give full access to manage cases and settings a| * `All` for the *Cases* feature under *Management*. * `All` for the *{connectors-feature}* feature under *Management*. diff --git a/x-pack/test/screenshot_creation/apps/response_ops_docs/stack_cases/custom_fields.ts b/x-pack/test/screenshot_creation/apps/response_ops_docs/stack_cases/custom_fields.ts new file mode 100644 index 00000000000000..1c82037274222c --- /dev/null +++ b/x-pack/test/screenshot_creation/apps/response_ops_docs/stack_cases/custom_fields.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 { FtrProviderContext } from '../../../ftr_provider_context'; +export default function ({ getPageObject, getService }: FtrProviderContext) { + const cases = getService('cases'); + const commonScreenshots = getService('commonScreenshots'); + const find = getService('find'); + const header = getPageObject('header'); + const testSubjects = getService('testSubjects'); + const screenshotDirectories = ['response_ops_docs', 'stack_cases']; + + describe('add custom fields', function () { + it('case settings screenshot', async () => { + await cases.navigation.navigateToApp(); + await cases.navigation.navigateToConfigurationPage(); + await testSubjects.click('add-custom-field'); + await commonScreenshots.takeScreenshot( + 'cases-custom-fields-add', + screenshotDirectories, + 1400, + 600 + ); + await testSubjects.setValue('custom-field-label-input', 'my-field'); + await testSubjects.click('custom-field-flyout-save'); + await commonScreenshots.takeScreenshot( + 'cases-custom-fields-view', + screenshotDirectories, + 1400, + 1024 + ); + await cases.navigation.navigateToApp(); + await cases.casesTable.waitForCasesToBeListed(); + await cases.casesTable.goToFirstListedCase(); + await header.waitUntilLoadingHasFinished(); + await find.byCssSelector('[data-test-subj="no-custom-field-value"]'); + await commonScreenshots.takeScreenshot( + 'cases-custom-fields', + screenshotDirectories, + 1400, + 1400 + ); + await cases.navigation.navigateToApp(); + await testSubjects.click('createNewCaseBtn'); + await commonScreenshots.takeScreenshot('cases-create', screenshotDirectories, 1400, 1900); + await testSubjects.click('create-case-cancel'); + }); + }); +} diff --git a/x-pack/test/screenshot_creation/apps/response_ops_docs/stack_cases/details_view.ts b/x-pack/test/screenshot_creation/apps/response_ops_docs/stack_cases/details_view.ts index 014df7ebbf9342..e38b2bdc8cf47d 100644 --- a/x-pack/test/screenshot_creation/apps/response_ops_docs/stack_cases/details_view.ts +++ b/x-pack/test/screenshot_creation/apps/response_ops_docs/stack_cases/details_view.ts @@ -6,61 +6,24 @@ */ import { FtrProviderContext } from '../../../ftr_provider_context'; -import { createAndUploadFile } from '../../../../cases_api_integration/common/lib/api'; -import { CASES_FILE_KIND } from '../../../../cases_api_integration/common/lib/constants'; +import { caseTitle } from '.'; export default function ({ getService }: FtrProviderContext) { + const browser = getService('browser'); const cases = getService('cases'); const commonScreenshots = getService('commonScreenshots'); const testSubjects = getService('testSubjects'); const screenshotDirectories = ['response_ops_docs', 'stack_cases']; - const supertest = getService('supertest'); - let CASE_ID: string; - let CASE_OWNER: string; describe('details view', function () { - before(async () => { - const testCase = await cases.api.createCase({ - title: 'Web transactions', - tags: ['e-commerce'], - description: 'Investigate e-commerce sample data.', - }); - CASE_ID = testCase.id; - CASE_OWNER = testCase.owner; - - await createAndUploadFile({ - supertest, - createFileParams: { - name: 'testfile', - kind: CASES_FILE_KIND, - mimeType: 'image/png', - meta: { - caseIds: [CASE_ID], - owner: [CASE_OWNER], - }, - }, - data: 'abc', - }); - }); - - after(async () => { - await cases.api.deleteAllCases(); - }); - - it('case files screenshot', async () => { + it('case details screenshots', async () => { await cases.navigation.navigateToApp(); - await cases.navigation.navigateToSingleCase('cases', CASE_ID); - const filesTab = await testSubjects.find('case-view-tab-title-files'); - await filesTab.click(); - await commonScreenshots.takeScreenshot('cases-files', screenshotDirectories, 1400, 1024); - }); - - it('cases visualization screenshot', async () => { - await cases.navigation.navigateToApp(); - await cases.navigation.navigateToSingleCase('cases', CASE_ID); + await testSubjects.setValue('search-cases', caseTitle); + await browser.pressKeys(browser.keys.ENTER); + const caseLink = await testSubjects.find('case-details-link'); + await caseLink.click(); await cases.singleCase.addVisualizationToNewComment('[Logs] Bytes distribution'); - await cases.singleCase.openVisualizationButtonTooltip(); await commonScreenshots.takeScreenshot( 'cases-visualization', @@ -68,6 +31,9 @@ export default function ({ getService }: FtrProviderContext) { 1400, 1024 ); + const filesTab = await testSubjects.find('case-view-tab-title-files'); + await filesTab.click(); + await commonScreenshots.takeScreenshot('cases-files', screenshotDirectories, 1400, 1024); }); }); } diff --git a/x-pack/test/screenshot_creation/apps/response_ops_docs/stack_cases/external_connections.ts b/x-pack/test/screenshot_creation/apps/response_ops_docs/stack_cases/external_connections.ts index 4af31cfba2feb7..cb880f79d02ce2 100644 --- a/x-pack/test/screenshot_creation/apps/response_ops_docs/stack_cases/external_connections.ts +++ b/x-pack/test/screenshot_creation/apps/response_ops_docs/stack_cases/external_connections.ts @@ -17,7 +17,7 @@ export default function ({ getService }: FtrProviderContext) { it('cases configure screenshot', async () => { await cases.navigation.navigateToApp(); await cases.navigation.navigateToConfigurationPage(); - await commonScreenshots.takeScreenshot('cases-connectors', screenshotDirectories, 1400, 1024); + await commonScreenshots.takeScreenshot('cases-settings', screenshotDirectories, 1400, 1024); }); }); } diff --git a/x-pack/test/screenshot_creation/apps/response_ops_docs/stack_cases/index.ts b/x-pack/test/screenshot_creation/apps/response_ops_docs/stack_cases/index.ts index 497805b1f00859..97d48aa70df4d0 100644 --- a/x-pack/test/screenshot_creation/apps/response_ops_docs/stack_cases/index.ts +++ b/x-pack/test/screenshot_creation/apps/response_ops_docs/stack_cases/index.ts @@ -5,12 +5,50 @@ * 2.0. */ +import { AttachmentType } from '@kbn/cases-plugin/common/types/domain'; +import { createAndUploadFile } from '../../../../cases_api_integration/common/lib/api'; +import { CASES_FILE_KIND } from '../../../../cases_api_integration/common/lib/constants'; import { FtrProviderContext } from '../../../ftr_provider_context'; -export default function ({ loadTestFile }: FtrProviderContext) { +export const caseTitle = 'Web transactions'; + +export default function ({ getService, loadTestFile }: FtrProviderContext) { + const cases = getService('cases'); + const supertest = getService('supertest'); + describe('stack cases', function () { + before(async () => { + const { id: caseId, owner: caseOwner } = await cases.api.createCase({ + title: caseTitle, + tags: ['e-commerce'], + description: 'Investigate e-commerce sample data.', + }); + await cases.api.createAttachment({ + caseId, + params: { comment: 'test comment', type: AttachmentType.user, owner: caseOwner }, + }); + await createAndUploadFile({ + supertest, + createFileParams: { + name: 'testfile', + kind: CASES_FILE_KIND, + mimeType: 'image/png', + meta: { + caseIds: [caseId], + owner: [caseOwner], + }, + }, + data: 'abc', + }); + }); + + after(async () => { + await cases.api.deleteAllCases(); + }); + loadTestFile(require.resolve('./list_view')); loadTestFile(require.resolve('./details_view')); loadTestFile(require.resolve('./external_connections')); + loadTestFile(require.resolve('./custom_fields')); }); } diff --git a/x-pack/test/screenshot_creation/apps/response_ops_docs/stack_cases/list_view.ts b/x-pack/test/screenshot_creation/apps/response_ops_docs/stack_cases/list_view.ts index 136f1d448d3b15..ce659c47c331b7 100644 --- a/x-pack/test/screenshot_creation/apps/response_ops_docs/stack_cases/list_view.ts +++ b/x-pack/test/screenshot_creation/apps/response_ops_docs/stack_cases/list_view.ts @@ -5,7 +5,6 @@ * 2.0. */ -import { AttachmentType } from '@kbn/cases-plugin/common/types/domain'; import { FtrProviderContext } from '../../../ftr_provider_context'; export default function ({ getService }: FtrProviderContext) { @@ -15,22 +14,6 @@ export default function ({ getService }: FtrProviderContext) { const screenshotDirectories = ['response_ops_docs', 'stack_cases']; describe('list view', function () { - before(async () => { - const { id: caseId } = await cases.api.createCase({ - title: 'Web transactions', - tags: ['e-commerce'], - description: 'Investigate e-commerce sample data.', - }); - await cases.api.createAttachment({ - caseId, - params: { comment: 'test comment', type: AttachmentType.user, owner: 'cases' }, - }); - }); - - after(async () => { - await cases.api.deleteAllCases(); - }); - it('cases list screenshot', async () => { await cases.navigation.navigateToApp(); await commonScreenshots.takeScreenshot('cases', screenshotDirectories, 1400, 1024); From 01ebda0cf43613f0dfbfa2b4f674981774b4dcfc Mon Sep 17 00:00:00 2001 From: Lukas Olson Date: Mon, 23 Oct 2023 16:41:48 -0700 Subject: [PATCH 46/68] Fix EQL search snapshots (#169437) ## Summary Fixes the snapshots from https://github.com/elastic/kibana/pull/169181. It was accidentally merged before I could address feedback. ### Checklist Delete any items that are not applicable to this PR. - [ ] Any text added follows [EUI's writing guidelines](https://elastic.github.io/eui/#/guidelines/writing), uses sentence case text and includes [i18n support](https://github.com/elastic/kibana/blob/main/packages/kbn-i18n/README.md) - [ ] [Documentation](https://www.elastic.co/guide/en/kibana/master/development-documentation.html) was added for features that require explanation or tutorials - [ ] [Unit or functional tests](https://www.elastic.co/guide/en/kibana/master/development-tests.html) were updated or added to match the most common scenarios - [ ] Any UI touched in this PR is usable by keyboard only (learn more about [keyboard accessibility](https://webaim.org/techniques/keyboard/)) - [ ] Any UI touched in this PR does not create any new axe failures (run axe in browser: [FF](https://addons.mozilla.org/en-US/firefox/addon/axe-devtools/), [Chrome](https://chrome.google.com/webstore/detail/axe-web-accessibility-tes/lhdoppojpmngadmnindnejefpokejbdd?hl=en-US)) - [ ] If a plugin configuration key changed, check if it needs to be allowlisted in the cloud and added to the [docker list](https://github.com/elastic/kibana/blob/main/src/dev/build/tasks/os_packages/docker_generator/resources/base/bin/kibana-docker) - [ ] This renders correctly on smaller devices using a responsive layout. (You can test this [in your browser](https://www.browserstack.com/guide/responsive-testing-on-local-server)) - [ ] This was checked for [cross-browser compatibility](https://www.elastic.co/support/matrix#matrix_browsers) ### Risk Matrix Delete this section if it is not applicable to this PR. Before closing this PR, invite QA, stakeholders, and other developers to identify risks that should be tested prior to the change/feature release. When forming the risk matrix, consider some of the following examples and how they may potentially impact the change: | Risk | Probability | Severity | Mitigation/Notes | |---------------------------|-------------|----------|-------------------------| | Multiple Spaces—unexpected behavior in non-default Kibana Space. | Low | High | Integration tests will verify that all features are still supported in non-default Kibana Space and when user switches between spaces. | | Multiple nodes—Elasticsearch polling might have race conditions when multiple Kibana nodes are polling for the same tasks. | High | Low | Tasks are idempotent, so executing them multiple times will not result in logical error, but will degrade performance. To test for this case we add plenty of unit tests around this logic and document manual testing procedure. | | Code should gracefully handle cases when feature X or plugin Y are disabled. | Medium | High | Unit tests will verify that any feature flag or plugin combination still results in our service operational. | | [See more potential risk examples](https://github.com/elastic/kibana/blob/main/RISK_MATRIX.mdx) | ### For maintainers - [ ] This was checked for breaking API changes and was [labeled appropriately](https://www.elastic.co/guide/en/kibana/master/contributing.html#kibana-release-notes-process) --- .../timeline/eql/__mocks__/index.ts | 1770 ++++++++--------- .../timeline/eql/helpers.test.ts | 545 ++++- 2 files changed, 1423 insertions(+), 892 deletions(-) diff --git a/x-pack/plugins/timelines/server/search_strategy/timeline/eql/__mocks__/index.ts b/x-pack/plugins/timelines/server/search_strategy/timeline/eql/__mocks__/index.ts index 1cfb1459f7fe98..8ed7dd627d517d 100644 --- a/x-pack/plugins/timelines/server/search_strategy/timeline/eql/__mocks__/index.ts +++ b/x-pack/plugins/timelines/server/search_strategy/timeline/eql/__mocks__/index.ts @@ -10,923 +10,913 @@ import { EqlSearchResponse } from '../../../../../common/search_strategy'; export const sequenceResponse = { rawResponse: { - body: { - is_partial: false, - is_running: false, - took: 527, - timed_out: false, - hits: { - total: { - value: 10, - relation: 'eq', - }, - sequences: [ - { - join_keys: ['win2019-endpoint-mr-pedro'], - events: [ - { - _index: '.ds-logs-endpoint.events.security-default-2021.02.05-000005', - _id: 'qhymg3cBX5UUcOOYP3Ec', - fields: { - 'agent.id': ['1d15cf9e-3dc7-5b97-f586-743f7c2518b2'], - 'agent.type': ['endpoint'], - 'agent.version': ['7.10.0'], - '@timestamp': ['2021-02-08T21:50:28.3377092Z'], - message: ['Endpoint security event'], - 'process.Ext.ancestry': [ - 'MWQxNWNmOWUtM2RjNy01Yjk3LWY1ODYtNzQzZjdjMjUxOGIyLTIzODAtMTMyNTUwNzg2ODkuOTY1Nzg1NTAw', - 'MWQxNWNmOWUtM2RjNy01Yjk3LWY1ODYtNzQzZjdjMjUxOGIyLTU2OC0xMzI1NTA3ODY2Ny4zMjk3MDY2MDA=', - 'MWQxNWNmOWUtM2RjNy01Yjk3LWY1ODYtNzQzZjdjMjUxOGIyLTQ2OC0xMzI1NTA3ODY2NS42Mzg5MzY1MDA=', - ], - 'process.name': ['C:\\Program Files\\OpenSSH-Win64\\sshd.exe'], - 'process.entity_id': [ - 'MWQxNWNmOWUtM2RjNy01Yjk3LWY1ODYtNzQzZjdjMjUxOGIyLTUyODQtMTMyNTcyOTQ2MjMuOTk2NTkxMDAw', - ], - 'process.executable': ['C:\\Program Files\\OpenSSH-Win64\\sshd.exe'], - 'ecs.version': ['1.5.0'], - 'data_stream.namespace': ['default'], - 'data_stream.type': ['logs'], - 'data_stream.dataset': ['endpoint.events.security'], - 'elastic.agent.id': ['f5dec71e-438c-424e-ac9b-0281f10412b9'], - 'host.hostname': ['win2019-endpoint-mr-pedro'], - 'host.os.Ext.variant': ['Windows Server 2019 Datacenter'], - 'host.os.name': ['Windows'], - 'host.os.kernel': ['1809 (10.0.17763.1697)'], - 'host.os.family': ['windows'], - 'host.os.version': ['1809 (10.0.17763.1697)'], - 'host.os.platform': ['windows'], - 'host.os.full': ['Windows Server 2019 Datacenter 1809 (10.0.17763.1697)'], - 'host.ip': ['10.128.0.57', 'fe80::9ced:8f1c:880b:3e1f', '127.0.0.1', '::1'], - 'host.name': ['win2019-endpoint-mr-pedro'], - 'host.id': ['d8ad572e-d224-4044-a57d-f5a84c0dfe5d'], - 'host.mac': ['42:01:0a:80:00:39'], - 'host.architecture': ['x86_64'], - 'event.sequence': [3293866], - 'event.ingested': ['2021-02-08T21:57:26.417559711Z'], - 'event.created': ['2021-02-08T21:50:28.3377092Z'], - 'event.kind': ['event'], - 'event.module': ['endpoint'], - 'event.action': ['log_on'], - 'event.id': ['LzzWB9jjGmCwGMvk++++FG/O'], - 'event.category': ['authentication', 'session'], - 'event.type': ['start'], - 'event.dataset': ['endpoint.events.security'], - 'event.outcome': ['success'], - 'user.domain': ['NT AUTHORITY'], - 'user.name': ['SYSTEM'], - }, + is_partial: false, + is_running: false, + took: 527, + timed_out: false, + hits: { + total: { + value: 10, + relation: 'eq', + }, + sequences: [ + { + join_keys: ['win2019-endpoint-mr-pedro'], + events: [ + { + _index: '.ds-logs-endpoint.events.security-default-2021.02.05-000005', + _id: 'qhymg3cBX5UUcOOYP3Ec', + fields: { + 'agent.id': ['1d15cf9e-3dc7-5b97-f586-743f7c2518b2'], + 'agent.type': ['endpoint'], + 'agent.version': ['7.10.0'], + '@timestamp': ['2021-02-08T21:50:28.3377092Z'], + message: ['Endpoint security event'], + 'process.Ext.ancestry': [ + 'MWQxNWNmOWUtM2RjNy01Yjk3LWY1ODYtNzQzZjdjMjUxOGIyLTIzODAtMTMyNTUwNzg2ODkuOTY1Nzg1NTAw', + 'MWQxNWNmOWUtM2RjNy01Yjk3LWY1ODYtNzQzZjdjMjUxOGIyLTU2OC0xMzI1NTA3ODY2Ny4zMjk3MDY2MDA=', + 'MWQxNWNmOWUtM2RjNy01Yjk3LWY1ODYtNzQzZjdjMjUxOGIyLTQ2OC0xMzI1NTA3ODY2NS42Mzg5MzY1MDA=', + ], + 'process.name': ['C:\\Program Files\\OpenSSH-Win64\\sshd.exe'], + 'process.entity_id': [ + 'MWQxNWNmOWUtM2RjNy01Yjk3LWY1ODYtNzQzZjdjMjUxOGIyLTUyODQtMTMyNTcyOTQ2MjMuOTk2NTkxMDAw', + ], + 'process.executable': ['C:\\Program Files\\OpenSSH-Win64\\sshd.exe'], + 'ecs.version': ['1.5.0'], + 'data_stream.namespace': ['default'], + 'data_stream.type': ['logs'], + 'data_stream.dataset': ['endpoint.events.security'], + 'elastic.agent.id': ['f5dec71e-438c-424e-ac9b-0281f10412b9'], + 'host.hostname': ['win2019-endpoint-mr-pedro'], + 'host.os.Ext.variant': ['Windows Server 2019 Datacenter'], + 'host.os.name': ['Windows'], + 'host.os.kernel': ['1809 (10.0.17763.1697)'], + 'host.os.family': ['windows'], + 'host.os.version': ['1809 (10.0.17763.1697)'], + 'host.os.platform': ['windows'], + 'host.os.full': ['Windows Server 2019 Datacenter 1809 (10.0.17763.1697)'], + 'host.ip': ['10.128.0.57', 'fe80::9ced:8f1c:880b:3e1f', '127.0.0.1', '::1'], + 'host.name': ['win2019-endpoint-mr-pedro'], + 'host.id': ['d8ad572e-d224-4044-a57d-f5a84c0dfe5d'], + 'host.mac': ['42:01:0a:80:00:39'], + 'host.architecture': ['x86_64'], + 'event.sequence': [3293866], + 'event.ingested': ['2021-02-08T21:57:26.417559711Z'], + 'event.created': ['2021-02-08T21:50:28.3377092Z'], + 'event.kind': ['event'], + 'event.module': ['endpoint'], + 'event.action': ['log_on'], + 'event.id': ['LzzWB9jjGmCwGMvk++++FG/O'], + 'event.category': ['authentication', 'session'], + 'event.type': ['start'], + 'event.dataset': ['endpoint.events.security'], + 'event.outcome': ['success'], + 'user.domain': ['NT AUTHORITY'], + 'user.name': ['SYSTEM'], }, - { - _index: '.ds-logs-endpoint.events.security-default-2021.02.05-000005', - _id: 'qxymg3cBX5UUcOOYP3Ec', - fields: { - 'agent.id': ['1d15cf9e-3dc7-5b97-f586-743f7c2518b2'], - 'agent.type': ['endpoint'], - 'agent.version': ['7.10.0'], - '@timestamp': ['2021-02-08T21:50:28.3377142Z'], - message: ['Endpoint security event'], - 'process.Ext.ancestry': [ - 'MWQxNWNmOWUtM2RjNy01Yjk3LWY1ODYtNzQzZjdjMjUxOGIyLTQ2OC0xMzI1NTA3ODY2NS42Mzg5MzY1MDA=', - ], - 'process.entity_id': [ - 'MWQxNWNmOWUtM2RjNy01Yjk3LWY1ODYtNzQzZjdjMjUxOGIyLTU4MC0xMzI1NTA3ODY2Ny45MTg5Njc1MDA=', - ], - 'process.executable': ['C:\\Windows\\System32\\lsass.exe'], - 'ecs.version': ['1.5.0'], - 'data_stream.namespace': ['default'], - 'data_stream.type': ['logs'], - 'data_stream.dataset': ['endpoint.events.security'], - 'elastic.agent.id': ['f5dec71e-438c-424e-ac9b-0281f10412b9'], - 'host.hostname': ['win2019-endpoint-mr-pedro'], - 'host.os.Ext.variant': ['Windows Server 2019 Datacenter'], - 'host.os.name': ['Windows'], - 'host.os.kernel': ['1809 (10.0.17763.1697)'], - 'host.os.family': ['windows'], - 'host.os.version': ['1809 (10.0.17763.1697)'], - 'host.os.platform': ['windows'], - 'host.os.full': ['Windows Server 2019 Datacenter 1809 (10.0.17763.1697)'], - 'host.ip': ['10.128.0.57', 'fe80::9ced:8f1c:880b:3e1f', '127.0.0.1', '::1'], - 'host.name': ['win2019-endpoint-mr-pedro'], - 'host.id': ['d8ad572e-d224-4044-a57d-f5a84c0dfe5d'], - 'host.mac': ['42:01:0a:80:00:39'], - 'host.architecture': ['x86_64'], - 'event.sequence': [3293867], - 'event.ingested': ['2021-02-08T21:57:26.417596906Z'], - 'event.created': ['2021-02-08T21:50:28.3377142Z'], - 'event.kind': ['event'], - 'event.module': ['endpoint'], - 'event.action': ['log_on'], - 'event.id': ['LzzWB9jjGmCwGMvk++++FG/P'], - 'event.category': ['authentication', 'session'], - 'event.type': ['start'], - 'event.dataset': ['endpoint.events.security'], - 'event.outcome': ['success'], - 'user.domain': ['NT AUTHORITY'], - 'user.name': ['SYSTEM'], - }, + }, + { + _index: '.ds-logs-endpoint.events.security-default-2021.02.05-000005', + _id: 'qxymg3cBX5UUcOOYP3Ec', + fields: { + 'agent.id': ['1d15cf9e-3dc7-5b97-f586-743f7c2518b2'], + 'agent.type': ['endpoint'], + 'agent.version': ['7.10.0'], + '@timestamp': ['2021-02-08T21:50:28.3377142Z'], + message: ['Endpoint security event'], + 'process.Ext.ancestry': [ + 'MWQxNWNmOWUtM2RjNy01Yjk3LWY1ODYtNzQzZjdjMjUxOGIyLTQ2OC0xMzI1NTA3ODY2NS42Mzg5MzY1MDA=', + ], + 'process.entity_id': [ + 'MWQxNWNmOWUtM2RjNy01Yjk3LWY1ODYtNzQzZjdjMjUxOGIyLTU4MC0xMzI1NTA3ODY2Ny45MTg5Njc1MDA=', + ], + 'process.executable': ['C:\\Windows\\System32\\lsass.exe'], + 'ecs.version': ['1.5.0'], + 'data_stream.namespace': ['default'], + 'data_stream.type': ['logs'], + 'data_stream.dataset': ['endpoint.events.security'], + 'elastic.agent.id': ['f5dec71e-438c-424e-ac9b-0281f10412b9'], + 'host.hostname': ['win2019-endpoint-mr-pedro'], + 'host.os.Ext.variant': ['Windows Server 2019 Datacenter'], + 'host.os.name': ['Windows'], + 'host.os.kernel': ['1809 (10.0.17763.1697)'], + 'host.os.family': ['windows'], + 'host.os.version': ['1809 (10.0.17763.1697)'], + 'host.os.platform': ['windows'], + 'host.os.full': ['Windows Server 2019 Datacenter 1809 (10.0.17763.1697)'], + 'host.ip': ['10.128.0.57', 'fe80::9ced:8f1c:880b:3e1f', '127.0.0.1', '::1'], + 'host.name': ['win2019-endpoint-mr-pedro'], + 'host.id': ['d8ad572e-d224-4044-a57d-f5a84c0dfe5d'], + 'host.mac': ['42:01:0a:80:00:39'], + 'host.architecture': ['x86_64'], + 'event.sequence': [3293867], + 'event.ingested': ['2021-02-08T21:57:26.417596906Z'], + 'event.created': ['2021-02-08T21:50:28.3377142Z'], + 'event.kind': ['event'], + 'event.module': ['endpoint'], + 'event.action': ['log_on'], + 'event.id': ['LzzWB9jjGmCwGMvk++++FG/P'], + 'event.category': ['authentication', 'session'], + 'event.type': ['start'], + 'event.dataset': ['endpoint.events.security'], + 'event.outcome': ['success'], + 'user.domain': ['NT AUTHORITY'], + 'user.name': ['SYSTEM'], }, - { - _index: '.ds-logs-endpoint.events.security-default-2021.02.05-000005', - _id: 'rBymg3cBX5UUcOOYP3Ec', - fields: { - 'agent.id': ['1d15cf9e-3dc7-5b97-f586-743f7c2518b2'], - 'agent.type': ['endpoint'], - 'agent.version': ['7.10.0'], - '@timestamp': ['2021-02-08T21:50:28.3381013Z'], - message: ['Endpoint security event'], - 'process.Ext.ancestry': [ - 'MWQxNWNmOWUtM2RjNy01Yjk3LWY1ODYtNzQzZjdjMjUxOGIyLTQ2OC0xMzI1NTA3ODY2NS42Mzg5MzY1MDA=', - ], - 'process.entity_id': [ - 'MWQxNWNmOWUtM2RjNy01Yjk3LWY1ODYtNzQzZjdjMjUxOGIyLTU4MC0xMzI1NTA3ODY2Ny45MTg5Njc1MDA=', - ], - 'process.executable': ['C:\\Windows\\System32\\lsass.exe'], - 'ecs.version': ['1.5.0'], - 'data_stream.namespace': ['default'], - 'data_stream.type': ['logs'], - 'data_stream.dataset': ['endpoint.events.security'], - 'elastic.agent.id': ['f5dec71e-438c-424e-ac9b-0281f10412b9'], - 'host.hostname': ['win2019-endpoint-mr-pedro'], - 'host.os.Ext.variant': ['Windows Server 2019 Datacenter'], - 'host.os.name': ['Windows'], - 'host.os.kernel': ['1809 (10.0.17763.1697)'], - 'host.os.family': ['windows'], - 'host.os.version': ['1809 (10.0.17763.1697)'], - 'host.os.platform': ['windows'], - 'host.os.full': ['Windows Server 2019 Datacenter 1809 (10.0.17763.1697)'], - 'host.ip': ['10.128.0.57', 'fe80::9ced:8f1c:880b:3e1f', '127.0.0.1', '::1'], - 'host.name': ['win2019-endpoint-mr-pedro'], - 'host.id': ['d8ad572e-d224-4044-a57d-f5a84c0dfe5d'], - 'host.mac': ['42:01:0a:80:00:39'], - 'host.architecture': ['x86_64'], - 'event.sequence': [3293868], - 'event.ingested': ['2021-02-08T21:57:26.417632166Z'], - 'event.created': ['2021-02-08T21:50:28.3381013Z'], - 'event.kind': ['event'], - 'event.module': ['endpoint'], - 'event.action': ['log_on'], - 'event.id': ['LzzWB9jjGmCwGMvk++++FG/Q'], - 'event.category': ['authentication', 'session'], - 'event.type': ['start'], - 'event.dataset': ['endpoint.events.security'], - 'event.outcome': ['success'], - 'user.domain': ['NT AUTHORITY'], - 'user.name': ['SYSTEM'], - }, + }, + { + _index: '.ds-logs-endpoint.events.security-default-2021.02.05-000005', + _id: 'rBymg3cBX5UUcOOYP3Ec', + fields: { + 'agent.id': ['1d15cf9e-3dc7-5b97-f586-743f7c2518b2'], + 'agent.type': ['endpoint'], + 'agent.version': ['7.10.0'], + '@timestamp': ['2021-02-08T21:50:28.3381013Z'], + message: ['Endpoint security event'], + 'process.Ext.ancestry': [ + 'MWQxNWNmOWUtM2RjNy01Yjk3LWY1ODYtNzQzZjdjMjUxOGIyLTQ2OC0xMzI1NTA3ODY2NS42Mzg5MzY1MDA=', + ], + 'process.entity_id': [ + 'MWQxNWNmOWUtM2RjNy01Yjk3LWY1ODYtNzQzZjdjMjUxOGIyLTU4MC0xMzI1NTA3ODY2Ny45MTg5Njc1MDA=', + ], + 'process.executable': ['C:\\Windows\\System32\\lsass.exe'], + 'ecs.version': ['1.5.0'], + 'data_stream.namespace': ['default'], + 'data_stream.type': ['logs'], + 'data_stream.dataset': ['endpoint.events.security'], + 'elastic.agent.id': ['f5dec71e-438c-424e-ac9b-0281f10412b9'], + 'host.hostname': ['win2019-endpoint-mr-pedro'], + 'host.os.Ext.variant': ['Windows Server 2019 Datacenter'], + 'host.os.name': ['Windows'], + 'host.os.kernel': ['1809 (10.0.17763.1697)'], + 'host.os.family': ['windows'], + 'host.os.version': ['1809 (10.0.17763.1697)'], + 'host.os.platform': ['windows'], + 'host.os.full': ['Windows Server 2019 Datacenter 1809 (10.0.17763.1697)'], + 'host.ip': ['10.128.0.57', 'fe80::9ced:8f1c:880b:3e1f', '127.0.0.1', '::1'], + 'host.name': ['win2019-endpoint-mr-pedro'], + 'host.id': ['d8ad572e-d224-4044-a57d-f5a84c0dfe5d'], + 'host.mac': ['42:01:0a:80:00:39'], + 'host.architecture': ['x86_64'], + 'event.sequence': [3293868], + 'event.ingested': ['2021-02-08T21:57:26.417632166Z'], + 'event.created': ['2021-02-08T21:50:28.3381013Z'], + 'event.kind': ['event'], + 'event.module': ['endpoint'], + 'event.action': ['log_on'], + 'event.id': ['LzzWB9jjGmCwGMvk++++FG/Q'], + 'event.category': ['authentication', 'session'], + 'event.type': ['start'], + 'event.dataset': ['endpoint.events.security'], + 'event.outcome': ['success'], + 'user.domain': ['NT AUTHORITY'], + 'user.name': ['SYSTEM'], }, - ], - }, - { - join_keys: ['win2019-endpoint-mr-pedro'], - events: [ - { - _index: '.ds-logs-endpoint.events.security-default-2021.02.05-000005', - _id: 'qhymg3cBX5UUcOOYP3Ec', - fields: { - 'agent.id': ['1d15cf9e-3dc7-5b97-f586-743f7c2518b2'], - 'agent.type': ['endpoint'], - 'agent.version': ['7.10.0'], - '@timestamp': ['2021-02-08T21:50:28.3377142Z'], - message: ['Endpoint security event'], - 'process.Ext.ancestry': [ - 'MWQxNWNmOWUtM2RjNy01Yjk3LWY1ODYtNzQzZjdjMjUxOGIyLTQ2OC0xMzI1NTA3ODY2NS42Mzg5MzY1MDA=', - ], - 'process.entity_id': [ - 'MWQxNWNmOWUtM2RjNy01Yjk3LWY1ODYtNzQzZjdjMjUxOGIyLTU4MC0xMzI1NTA3ODY2Ny45MTg5Njc1MDA=', - ], - 'process.executable': ['C:\\Windows\\System32\\lsass.exe'], - 'ecs.version': ['1.5.0'], - 'data_stream.namespace': ['default'], - 'data_stream.type': ['logs'], - 'data_stream.dataset': ['endpoint.events.security'], - 'elastic.agent.id': ['f5dec71e-438c-424e-ac9b-0281f10412b9'], - 'host.hostname': ['win2019-endpoint-mr-pedro'], - 'host.os.Ext.variant': ['Windows Server 2019 Datacenter'], - 'host.os.name': ['Windows'], - 'host.os.kernel': ['1809 (10.0.17763.1697)'], - 'host.os.family': ['windows'], - 'host.os.version': ['1809 (10.0.17763.1697)'], - 'host.os.platform': ['windows'], - 'host.os.full': ['Windows Server 2019 Datacenter 1809 (10.0.17763.1697)'], - 'host.ip': ['10.128.0.57', 'fe80::9ced:8f1c:880b:3e1f', '127.0.0.1', '::1'], - 'host.name': ['win2019-endpoint-mr-pedro'], - 'host.id': ['d8ad572e-d224-4044-a57d-f5a84c0dfe5d'], - 'host.mac': ['42:01:0a:80:00:39'], - 'host.architecture': ['x86_64'], - 'event.sequence': [3293867], - 'event.ingested': ['2021-02-08T21:57:26.417596906Z'], - 'event.created': ['2021-02-08T21:50:28.3377142Z'], - 'event.kind': ['event'], - 'event.module': ['endpoint'], - 'event.action': ['log_on'], - 'event.id': ['LzzWB9jjGmCwGMvk++++FG/P'], - 'event.category': ['authentication', 'session'], - 'event.type': ['start'], - 'event.dataset': ['endpoint.events.security'], - 'event.outcome': ['success'], - 'user.domain': ['NT AUTHORITY'], - 'user.name': ['SYSTEM'], - }, + }, + ], + }, + { + join_keys: ['win2019-endpoint-mr-pedro'], + events: [ + { + _index: '.ds-logs-endpoint.events.security-default-2021.02.05-000005', + _id: 'qhymg3cBX5UUcOOYP3Ec', + fields: { + 'agent.id': ['1d15cf9e-3dc7-5b97-f586-743f7c2518b2'], + 'agent.type': ['endpoint'], + 'agent.version': ['7.10.0'], + '@timestamp': ['2021-02-08T21:50:28.3377142Z'], + message: ['Endpoint security event'], + 'process.Ext.ancestry': [ + 'MWQxNWNmOWUtM2RjNy01Yjk3LWY1ODYtNzQzZjdjMjUxOGIyLTQ2OC0xMzI1NTA3ODY2NS42Mzg5MzY1MDA=', + ], + 'process.entity_id': [ + 'MWQxNWNmOWUtM2RjNy01Yjk3LWY1ODYtNzQzZjdjMjUxOGIyLTU4MC0xMzI1NTA3ODY2Ny45MTg5Njc1MDA=', + ], + 'process.executable': ['C:\\Windows\\System32\\lsass.exe'], + 'ecs.version': ['1.5.0'], + 'data_stream.namespace': ['default'], + 'data_stream.type': ['logs'], + 'data_stream.dataset': ['endpoint.events.security'], + 'elastic.agent.id': ['f5dec71e-438c-424e-ac9b-0281f10412b9'], + 'host.hostname': ['win2019-endpoint-mr-pedro'], + 'host.os.Ext.variant': ['Windows Server 2019 Datacenter'], + 'host.os.name': ['Windows'], + 'host.os.kernel': ['1809 (10.0.17763.1697)'], + 'host.os.family': ['windows'], + 'host.os.version': ['1809 (10.0.17763.1697)'], + 'host.os.platform': ['windows'], + 'host.os.full': ['Windows Server 2019 Datacenter 1809 (10.0.17763.1697)'], + 'host.ip': ['10.128.0.57', 'fe80::9ced:8f1c:880b:3e1f', '127.0.0.1', '::1'], + 'host.name': ['win2019-endpoint-mr-pedro'], + 'host.id': ['d8ad572e-d224-4044-a57d-f5a84c0dfe5d'], + 'host.mac': ['42:01:0a:80:00:39'], + 'host.architecture': ['x86_64'], + 'event.sequence': [3293867], + 'event.ingested': ['2021-02-08T21:57:26.417596906Z'], + 'event.created': ['2021-02-08T21:50:28.3377142Z'], + 'event.kind': ['event'], + 'event.module': ['endpoint'], + 'event.action': ['log_on'], + 'event.id': ['LzzWB9jjGmCwGMvk++++FG/P'], + 'event.category': ['authentication', 'session'], + 'event.type': ['start'], + 'event.dataset': ['endpoint.events.security'], + 'event.outcome': ['success'], + 'user.domain': ['NT AUTHORITY'], + 'user.name': ['SYSTEM'], }, - { - _index: '.ds-logs-endpoint.events.security-default-2021.02.05-000005', - _id: 'rBymg3cBX5UUcOOYP3Ec', - fields: { - 'agent.id': ['1d15cf9e-3dc7-5b97-f586-743f7c2518b2'], - 'agent.type': ['endpoint'], - 'agent.version': ['7.10.0'], - '@timestamp': ['2021-02-08T21:50:28.3381013Z'], - message: ['Endpoint security event'], - 'process.Ext.ancestry': [ - 'MWQxNWNmOWUtM2RjNy01Yjk3LWY1ODYtNzQzZjdjMjUxOGIyLTQ2OC0xMzI1NTA3ODY2NS42Mzg5MzY1MDA=', - ], - 'process.entity_id': [ - 'MWQxNWNmOWUtM2RjNy01Yjk3LWY1ODYtNzQzZjdjMjUxOGIyLTU4MC0xMzI1NTA3ODY2Ny45MTg5Njc1MDA=', - ], - 'process.executable': ['C:\\Windows\\System32\\lsass.exe'], - 'ecs.version': ['1.5.0'], - 'data_stream.namespace': ['default'], - 'data_stream.type': ['logs'], - 'data_stream.dataset': ['endpoint.events.security'], - 'elastic.agent.id': ['f5dec71e-438c-424e-ac9b-0281f10412b9'], - 'host.hostname': ['win2019-endpoint-mr-pedro'], - 'host.os.Ext.variant': ['Windows Server 2019 Datacenter'], - 'host.os.name': ['Windows'], - 'host.os.kernel': ['1809 (10.0.17763.1697)'], - 'host.os.family': ['windows'], - 'host.os.version': ['1809 (10.0.17763.1697)'], - 'host.os.platform': ['windows'], - 'host.os.full': ['Windows Server 2019 Datacenter 1809 (10.0.17763.1697)'], - 'host.ip': ['10.128.0.57', 'fe80::9ced:8f1c:880b:3e1f', '127.0.0.1', '::1'], - 'host.name': ['win2019-endpoint-mr-pedro'], - 'host.id': ['d8ad572e-d224-4044-a57d-f5a84c0dfe5d'], - 'host.mac': ['42:01:0a:80:00:39'], - 'host.architecture': ['x86_64'], - 'event.sequence': [3293868], - 'event.ingested': ['2021-02-08T21:57:26.417632166Z'], - 'event.created': ['2021-02-08T21:50:28.3381013Z'], - 'event.kind': ['event'], - 'event.module': ['endpoint'], - 'event.action': ['log_on'], - 'event.id': ['LzzWB9jjGmCwGMvk++++FG/Q'], - 'event.category': ['authentication', 'session'], - 'event.type': ['start'], - 'event.dataset': ['endpoint.events.security'], - 'event.outcome': ['success'], - 'user.domain': ['NT AUTHORITY'], - 'user.name': ['SYSTEM'], - }, + }, + { + _index: '.ds-logs-endpoint.events.security-default-2021.02.05-000005', + _id: 'rBymg3cBX5UUcOOYP3Ec', + fields: { + 'agent.id': ['1d15cf9e-3dc7-5b97-f586-743f7c2518b2'], + 'agent.type': ['endpoint'], + 'agent.version': ['7.10.0'], + '@timestamp': ['2021-02-08T21:50:28.3381013Z'], + message: ['Endpoint security event'], + 'process.Ext.ancestry': [ + 'MWQxNWNmOWUtM2RjNy01Yjk3LWY1ODYtNzQzZjdjMjUxOGIyLTQ2OC0xMzI1NTA3ODY2NS42Mzg5MzY1MDA=', + ], + 'process.entity_id': [ + 'MWQxNWNmOWUtM2RjNy01Yjk3LWY1ODYtNzQzZjdjMjUxOGIyLTU4MC0xMzI1NTA3ODY2Ny45MTg5Njc1MDA=', + ], + 'process.executable': ['C:\\Windows\\System32\\lsass.exe'], + 'ecs.version': ['1.5.0'], + 'data_stream.namespace': ['default'], + 'data_stream.type': ['logs'], + 'data_stream.dataset': ['endpoint.events.security'], + 'elastic.agent.id': ['f5dec71e-438c-424e-ac9b-0281f10412b9'], + 'host.hostname': ['win2019-endpoint-mr-pedro'], + 'host.os.Ext.variant': ['Windows Server 2019 Datacenter'], + 'host.os.name': ['Windows'], + 'host.os.kernel': ['1809 (10.0.17763.1697)'], + 'host.os.family': ['windows'], + 'host.os.version': ['1809 (10.0.17763.1697)'], + 'host.os.platform': ['windows'], + 'host.os.full': ['Windows Server 2019 Datacenter 1809 (10.0.17763.1697)'], + 'host.ip': ['10.128.0.57', 'fe80::9ced:8f1c:880b:3e1f', '127.0.0.1', '::1'], + 'host.name': ['win2019-endpoint-mr-pedro'], + 'host.id': ['d8ad572e-d224-4044-a57d-f5a84c0dfe5d'], + 'host.mac': ['42:01:0a:80:00:39'], + 'host.architecture': ['x86_64'], + 'event.sequence': [3293868], + 'event.ingested': ['2021-02-08T21:57:26.417632166Z'], + 'event.created': ['2021-02-08T21:50:28.3381013Z'], + 'event.kind': ['event'], + 'event.module': ['endpoint'], + 'event.action': ['log_on'], + 'event.id': ['LzzWB9jjGmCwGMvk++++FG/Q'], + 'event.category': ['authentication', 'session'], + 'event.type': ['start'], + 'event.dataset': ['endpoint.events.security'], + 'event.outcome': ['success'], + 'user.domain': ['NT AUTHORITY'], + 'user.name': ['SYSTEM'], }, - { - _index: '.ds-logs-endpoint.events.process-default-2021.02.02-000005', - _id: 'pxymg3cBX5UUcOOYP3Ec', - fields: { - 'agent.id': ['1d15cf9e-3dc7-5b97-f586-743f7c2518b2'], - 'agent.type': ['endpoint'], - 'agent.version': ['7.10.0'], - '@timestamp': ['2021-02-08T21:50:28.3446355Z'], - message: ['Endpoint security event'], - 'process.Ext.ancestry': [ - 'MWQxNWNmOWUtM2RjNy01Yjk3LWY1ODYtNzQzZjdjMjUxOGIyLTUyODQtMTMyNTcyOTQ2MjMuOTk2NTkxMDAw', - 'MWQxNWNmOWUtM2RjNy01Yjk3LWY1ODYtNzQzZjdjMjUxOGIyLTIzODAtMTMyNTUwNzg2ODkuOTY1Nzg1NTAw', - 'MWQxNWNmOWUtM2RjNy01Yjk3LWY1ODYtNzQzZjdjMjUxOGIyLTU2OC0xMzI1NTA3ODY2Ny4zMjk3MDY2MDA=', - 'MWQxNWNmOWUtM2RjNy01Yjk3LWY1ODYtNzQzZjdjMjUxOGIyLTQ2OC0xMzI1NTA3ODY2NS42Mzg5MzY1MDA=', - ], - 'process.Ext.code_signature': [ - { - trusted: true, - subject_name: 'Microsoft Corporation', - exists: true, - status: 'trusted', - }, - ], - 'process.Ext.token.integrity_level_name': ['high'], - 'process.Ext.token.elevation_level': ['default'], - 'process.entity_id': [ - 'MWQxNWNmOWUtM2RjNy01Yjk3LWY1ODYtNzQzZjdjMjUxOGIyLTYzNjgtMTMyNTcyOTQ2MjguMzQ0NjM1NTAw', - ], - 'process.args': ['C:\\Program Files\\OpenSSH-Win64\\sshd.exe', '-y'], - 'process.parent.args': ['C:\\Program Files\\OpenSSH-Win64\\sshd.exe', '-R'], - 'process.parent.name': ['sshd.exe'], - 'process.parent.pid': [5284], - 'process.parent.args_count': [2], - 'process.parent.entity_id': [ - 'MWQxNWNmOWUtM2RjNy01Yjk3LWY1ODYtNzQzZjdjMjUxOGIyLTUyODQtMTMyNTcyOTQ2MjMuOTk2NTkxMDAw', - ], - 'process.parent.command_line': [ - '"C:\\Program Files\\OpenSSH-Win64\\sshd.exe" -R', - ], - 'process.parent.executable': ['C:\\Program Files\\OpenSSH-Win64\\sshd.exe'], - 'process.code_signature.trusted': [true], - 'process.code_signature.subject_name': ['Microsoft Corporation'], - 'process.code_signature.exists': [true], - 'process.code_signature.status': ['trusted'], - 'process.name': ['sshd.exe'], - 'process.pid': [6368], - 'process.args_count': [2], - 'process.command_line': ['"C:\\Program Files\\OpenSSH-Win64\\sshd.exe" -y'], - 'process.hash.sha1': ['631244d731f406394c17c7dfd85203e317c74814'], - 'process.hash.sha256': [ - 'e6a972f9db27de18be225095b3b3141b945be8aadc4014c8704ae5acafe3e8e0', - ], - 'process.hash.md5': ['331ba0e529810ef718dd3efbd1242302'], - 'process.executable': ['C:\\Program Files\\OpenSSH-Win64\\sshd.exe'], - 'ecs.version': ['1.5.0'], - 'data_stream.namespace': ['default'], - 'data_stream.type': ['logs'], - 'data_stream.dataset': ['endpoint.events.security'], - 'elastic.agent.id': ['f5dec71e-438c-424e-ac9b-0281f10412b9'], - 'host.hostname': ['win2019-endpoint-mr-pedro'], - 'host.os.Ext.variant': ['Windows Server 2019 Datacenter'], - 'host.os.name': ['Windows'], - 'host.os.kernel': ['1809 (10.0.17763.1697)'], - 'host.os.family': ['windows'], - 'host.os.version': ['1809 (10.0.17763.1697)'], - 'host.os.platform': ['windows'], - 'host.os.full': ['Windows Server 2019 Datacenter 1809 (10.0.17763.1697)'], - 'host.ip': ['10.128.0.57', 'fe80::9ced:8f1c:880b:3e1f', '127.0.0.1', '::1'], - 'host.name': ['win2019-endpoint-mr-pedro'], - 'host.id': ['d8ad572e-d224-4044-a57d-f5a84c0dfe5d'], - 'host.mac': ['42:01:0a:80:00:39'], - 'host.architecture': ['x86_64'], - 'event.sequence': [3293863], - 'event.ingested': ['2021-02-08T21:57:26.417387865Z'], - 'event.created': ['2021-02-08T21:50:28.3446355Z'], - 'event.kind': ['event'], - 'event.module': ['endpoint'], - 'event.action': ['log_on'], - 'event.id': ['LzzWB9jjGmCwGMvk++++FG/K'], - 'event.category': ['authentication', 'session'], - 'event.type': ['start'], - 'event.dataset': ['endpoint.events.security'], - 'event.outcome': ['success'], - 'user.domain': [''], - 'user.name': [''], - }, + }, + { + _index: '.ds-logs-endpoint.events.process-default-2021.02.02-000005', + _id: 'pxymg3cBX5UUcOOYP3Ec', + fields: { + 'agent.id': ['1d15cf9e-3dc7-5b97-f586-743f7c2518b2'], + 'agent.type': ['endpoint'], + 'agent.version': ['7.10.0'], + '@timestamp': ['2021-02-08T21:50:28.3446355Z'], + message: ['Endpoint security event'], + 'process.Ext.ancestry': [ + 'MWQxNWNmOWUtM2RjNy01Yjk3LWY1ODYtNzQzZjdjMjUxOGIyLTUyODQtMTMyNTcyOTQ2MjMuOTk2NTkxMDAw', + 'MWQxNWNmOWUtM2RjNy01Yjk3LWY1ODYtNzQzZjdjMjUxOGIyLTIzODAtMTMyNTUwNzg2ODkuOTY1Nzg1NTAw', + 'MWQxNWNmOWUtM2RjNy01Yjk3LWY1ODYtNzQzZjdjMjUxOGIyLTU2OC0xMzI1NTA3ODY2Ny4zMjk3MDY2MDA=', + 'MWQxNWNmOWUtM2RjNy01Yjk3LWY1ODYtNzQzZjdjMjUxOGIyLTQ2OC0xMzI1NTA3ODY2NS42Mzg5MzY1MDA=', + ], + 'process.Ext.code_signature': [ + { + trusted: true, + subject_name: 'Microsoft Corporation', + exists: true, + status: 'trusted', + }, + ], + 'process.Ext.token.integrity_level_name': ['high'], + 'process.Ext.token.elevation_level': ['default'], + 'process.entity_id': [ + 'MWQxNWNmOWUtM2RjNy01Yjk3LWY1ODYtNzQzZjdjMjUxOGIyLTYzNjgtMTMyNTcyOTQ2MjguMzQ0NjM1NTAw', + ], + 'process.args': ['C:\\Program Files\\OpenSSH-Win64\\sshd.exe', '-y'], + 'process.parent.args': ['C:\\Program Files\\OpenSSH-Win64\\sshd.exe', '-R'], + 'process.parent.name': ['sshd.exe'], + 'process.parent.pid': [5284], + 'process.parent.args_count': [2], + 'process.parent.entity_id': [ + 'MWQxNWNmOWUtM2RjNy01Yjk3LWY1ODYtNzQzZjdjMjUxOGIyLTUyODQtMTMyNTcyOTQ2MjMuOTk2NTkxMDAw', + ], + 'process.parent.command_line': ['"C:\\Program Files\\OpenSSH-Win64\\sshd.exe" -R'], + 'process.parent.executable': ['C:\\Program Files\\OpenSSH-Win64\\sshd.exe'], + 'process.code_signature.trusted': [true], + 'process.code_signature.subject_name': ['Microsoft Corporation'], + 'process.code_signature.exists': [true], + 'process.code_signature.status': ['trusted'], + 'process.name': ['sshd.exe'], + 'process.pid': [6368], + 'process.args_count': [2], + 'process.command_line': ['"C:\\Program Files\\OpenSSH-Win64\\sshd.exe" -y'], + 'process.hash.sha1': ['631244d731f406394c17c7dfd85203e317c74814'], + 'process.hash.sha256': [ + 'e6a972f9db27de18be225095b3b3141b945be8aadc4014c8704ae5acafe3e8e0', + ], + 'process.hash.md5': ['331ba0e529810ef718dd3efbd1242302'], + 'process.executable': ['C:\\Program Files\\OpenSSH-Win64\\sshd.exe'], + 'ecs.version': ['1.5.0'], + 'data_stream.namespace': ['default'], + 'data_stream.type': ['logs'], + 'data_stream.dataset': ['endpoint.events.security'], + 'elastic.agent.id': ['f5dec71e-438c-424e-ac9b-0281f10412b9'], + 'host.hostname': ['win2019-endpoint-mr-pedro'], + 'host.os.Ext.variant': ['Windows Server 2019 Datacenter'], + 'host.os.name': ['Windows'], + 'host.os.kernel': ['1809 (10.0.17763.1697)'], + 'host.os.family': ['windows'], + 'host.os.version': ['1809 (10.0.17763.1697)'], + 'host.os.platform': ['windows'], + 'host.os.full': ['Windows Server 2019 Datacenter 1809 (10.0.17763.1697)'], + 'host.ip': ['10.128.0.57', 'fe80::9ced:8f1c:880b:3e1f', '127.0.0.1', '::1'], + 'host.name': ['win2019-endpoint-mr-pedro'], + 'host.id': ['d8ad572e-d224-4044-a57d-f5a84c0dfe5d'], + 'host.mac': ['42:01:0a:80:00:39'], + 'host.architecture': ['x86_64'], + 'event.sequence': [3293863], + 'event.ingested': ['2021-02-08T21:57:26.417387865Z'], + 'event.created': ['2021-02-08T21:50:28.3446355Z'], + 'event.kind': ['event'], + 'event.module': ['endpoint'], + 'event.action': ['log_on'], + 'event.id': ['LzzWB9jjGmCwGMvk++++FG/K'], + 'event.category': ['authentication', 'session'], + 'event.type': ['start'], + 'event.dataset': ['endpoint.events.security'], + 'event.outcome': ['success'], + 'user.domain': [''], + 'user.name': [''], }, - ], - }, - { - join_keys: ['win2019-endpoint-mr-pedro'], - events: [ - { - _index: '.ds-logs-endpoint.events.security-default-2021.02.05-000005', - _id: 'rBymg3cBX5UUcOOYP3Ec', - fields: { - 'agent.id': ['1d15cf9e-3dc7-5b97-f586-743f7c2518b2'], - 'agent.type': ['endpoint'], - 'agent.version': ['7.10.0'], - '@timestamp': ['2021-02-08T21:50:28.3381013Z'], - message: ['Endpoint security event'], - 'process.Ext.ancestry': [ - 'MWQxNWNmOWUtM2RjNy01Yjk3LWY1ODYtNzQzZjdjMjUxOGIyLTQ2OC0xMzI1NTA3ODY2NS42Mzg5MzY1MDA=', - ], - 'process.entity_id': [ - 'MWQxNWNmOWUtM2RjNy01Yjk3LWY1ODYtNzQzZjdjMjUxOGIyLTU4MC0xMzI1NTA3ODY2Ny45MTg5Njc1MDA=', - ], - 'process.executable': ['C:\\Windows\\System32\\lsass.exe'], - 'ecs.version': ['1.5.0'], - 'data_stream.namespace': ['default'], - 'data_stream.type': ['logs'], - 'data_stream.dataset': ['endpoint.events.security'], - 'elastic.agent.id': ['f5dec71e-438c-424e-ac9b-0281f10412b9'], - 'host.hostname': ['win2019-endpoint-mr-pedro'], - 'host.os.Ext.variant': ['Windows Server 2019 Datacenter'], - 'host.os.name': ['Windows'], - 'host.os.kernel': ['1809 (10.0.17763.1697)'], - 'host.os.family': ['windows'], - 'host.os.version': ['1809 (10.0.17763.1697)'], - 'host.os.platform': ['windows'], - 'host.os.full': ['Windows Server 2019 Datacenter 1809 (10.0.17763.1697)'], - 'host.ip': ['10.128.0.57', 'fe80::9ced:8f1c:880b:3e1f', '127.0.0.1', '::1'], - 'host.name': ['win2019-endpoint-mr-pedro'], - 'host.id': ['d8ad572e-d224-4044-a57d-f5a84c0dfe5d'], - 'host.mac': ['42:01:0a:80:00:39'], - 'host.architecture': ['x86_64'], - 'event.sequence': [3293868], - 'event.ingested': ['2021-02-08T21:57:26.417632166Z'], - 'event.created': ['2021-02-08T21:50:28.3381013Z'], - 'event.kind': ['event'], - 'event.module': ['endpoint'], - 'event.id': ['LzzWB9jjGmCwGMvk++++FG/Q'], - 'event.category': [], - 'event.type': [], - 'event.dataset': ['endpoint.events.security'], - 'user.domain': ['NT AUTHORITY'], - 'user.name': ['SYSTEM'], - }, + }, + ], + }, + { + join_keys: ['win2019-endpoint-mr-pedro'], + events: [ + { + _index: '.ds-logs-endpoint.events.security-default-2021.02.05-000005', + _id: 'rBymg3cBX5UUcOOYP3Ec', + fields: { + 'agent.id': ['1d15cf9e-3dc7-5b97-f586-743f7c2518b2'], + 'agent.type': ['endpoint'], + 'agent.version': ['7.10.0'], + '@timestamp': ['2021-02-08T21:50:28.3381013Z'], + message: ['Endpoint security event'], + 'process.Ext.ancestry': [ + 'MWQxNWNmOWUtM2RjNy01Yjk3LWY1ODYtNzQzZjdjMjUxOGIyLTQ2OC0xMzI1NTA3ODY2NS42Mzg5MzY1MDA=', + ], + 'process.entity_id': [ + 'MWQxNWNmOWUtM2RjNy01Yjk3LWY1ODYtNzQzZjdjMjUxOGIyLTU4MC0xMzI1NTA3ODY2Ny45MTg5Njc1MDA=', + ], + 'process.executable': ['C:\\Windows\\System32\\lsass.exe'], + 'ecs.version': ['1.5.0'], + 'data_stream.namespace': ['default'], + 'data_stream.type': ['logs'], + 'data_stream.dataset': ['endpoint.events.security'], + 'elastic.agent.id': ['f5dec71e-438c-424e-ac9b-0281f10412b9'], + 'host.hostname': ['win2019-endpoint-mr-pedro'], + 'host.os.Ext.variant': ['Windows Server 2019 Datacenter'], + 'host.os.name': ['Windows'], + 'host.os.kernel': ['1809 (10.0.17763.1697)'], + 'host.os.family': ['windows'], + 'host.os.version': ['1809 (10.0.17763.1697)'], + 'host.os.platform': ['windows'], + 'host.os.full': ['Windows Server 2019 Datacenter 1809 (10.0.17763.1697)'], + 'host.ip': ['10.128.0.57', 'fe80::9ced:8f1c:880b:3e1f', '127.0.0.1', '::1'], + 'host.name': ['win2019-endpoint-mr-pedro'], + 'host.id': ['d8ad572e-d224-4044-a57d-f5a84c0dfe5d'], + 'host.mac': ['42:01:0a:80:00:39'], + 'host.architecture': ['x86_64'], + 'event.sequence': [3293868], + 'event.ingested': ['2021-02-08T21:57:26.417632166Z'], + 'event.created': ['2021-02-08T21:50:28.3381013Z'], + 'event.kind': ['event'], + 'event.module': ['endpoint'], + 'event.id': ['LzzWB9jjGmCwGMvk++++FG/Q'], + 'event.category': [], + 'event.type': [], + 'event.dataset': ['endpoint.events.security'], + 'user.domain': ['NT AUTHORITY'], + 'user.name': ['SYSTEM'], }, - { - _index: '.ds-logs-endpoint.events.process-default-2021.02.02-000005', - _id: 'pxymg3cBX5UUcOOYP3Ec', - fields: { - 'agent.id': ['1d15cf9e-3dc7-5b97-f586-743f7c2518b2'], - 'agent.type': ['endpoint'], - 'agent.version': ['7.10.0'], - '@timestamp': ['2021-02-08T21:50:28.3446355Z'], - message: ['Endpoint process event'], - 'process.Ext.ancestry': [ - 'MWQxNWNmOWUtM2RjNy01Yjk3LWY1ODYtNzQzZjdjMjUxOGIyLTUyODQtMTMyNTcyOTQ2MjMuOTk2NTkxMDAw', - 'MWQxNWNmOWUtM2RjNy01Yjk3LWY1ODYtNzQzZjdjMjUxOGIyLTIzODAtMTMyNTUwNzg2ODkuOTY1Nzg1NTAw', - 'MWQxNWNmOWUtM2RjNy01Yjk3LWY1ODYtNzQzZjdjMjUxOGIyLTU2OC0xMzI1NTA3ODY2Ny4zMjk3MDY2MDA=', - 'MWQxNWNmOWUtM2RjNy01Yjk3LWY1ODYtNzQzZjdjMjUxOGIyLTQ2OC0xMzI1NTA3ODY2NS42Mzg5MzY1MDA=', - ], - 'process.Ext.code_signature': [ - { - trusted: true, - subject_name: 'Microsoft Corporation', - exists: true, - status: 'trusted', - }, - ], - 'process.Ext.token.integrity_level_name': ['high'], - 'process.Ext.token.elevation_level': ['default'], - 'process.entity_id': [ - 'MWQxNWNmOWUtM2RjNy01Yjk3LWY1ODYtNzQzZjdjMjUxOGIyLTYzNjgtMTMyNTcyOTQ2MjguMzQ0NjM1NTAw', - ], - 'process.args': ['C:\\Program Files\\OpenSSH-Win64\\sshd.exe', '-y'], - 'process.parent.args': ['C:\\Program Files\\OpenSSH-Win64\\sshd.exe', '-R'], - 'process.parent.name': ['sshd.exe'], - 'process.parent.pid': [5284], - 'process.parent.args_count': [2], - 'process.parent.entity_id': [ - 'MWQxNWNmOWUtM2RjNy01Yjk3LWY1ODYtNzQzZjdjMjUxOGIyLTUyODQtMTMyNTcyOTQ2MjMuOTk2NTkxMDAw', - ], - 'process.parent.command_line': [ - '"C:\\Program Files\\OpenSSH-Win64\\sshd.exe" -R', - ], - 'process.parent.executable': ['C:\\Program Files\\OpenSSH-Win64\\sshd.exe'], - 'process.code_signature.trusted': [true], - 'process.code_signature.subject_name': ['Microsoft Corporation'], - 'process.code_signature.exists': [true], - 'process.code_signature.status': ['trusted'], - 'process.name': ['sshd.exe'], - 'process.pid': [6368], - 'process.args_count': [2], - 'process.command_line': ['"C:\\Program Files\\OpenSSH-Win64\\sshd.exe" -y'], - 'process.hash.sha1': ['631244d731f406394c17c7dfd85203e317c74814'], - 'process.hash.sha256': [ - 'e6a972f9db27de18be225095b3b3141b945be8aadc4014c8704ae5acafe3e8e0', - ], - 'process.hash.md5': ['331ba0e529810ef718dd3efbd1242302'], - 'process.executable': ['C:\\Program Files\\OpenSSH-Win64\\sshd.exe'], - 'ecs.version': ['1.5.0'], - 'data_stream.namespace': ['default'], - 'data_stream.type': ['logs'], - 'data_stream.dataset': ['endpoint.events.process'], - 'elastic.agent.id': ['f5dec71e-438c-424e-ac9b-0281f10412b9'], - 'host.hostname': ['win2019-endpoint-mr-pedro'], - 'host.os.Ext.variant': ['Windows Server 2019 Datacenter'], - 'host.os.name': ['Windows'], - 'host.os.kernel': ['1809 (10.0.17763.1697)'], - 'host.os.family': ['windows'], - 'host.os.version': ['1809 (10.0.17763.1697)'], - 'host.os.platform': ['windows'], - 'host.os.full': ['Windows Server 2019 Datacenter 1809 (10.0.17763.1697)'], - 'host.ip': ['10.128.0.57', 'fe80::9ced:8f1c:880b:3e1f', '127.0.0.1', '::1'], - 'host.name': ['win2019-endpoint-mr-pedro'], - 'host.id': ['d8ad572e-d224-4044-a57d-f5a84c0dfe5d'], - 'host.mac': ['42:01:0a:80:00:39'], - 'host.architecture': ['x86_64'], - 'event.sequence': [3293863], - 'event.ingested': ['2021-02-08T21:57:26.417387865Z'], - 'event.created': ['2021-02-08T21:50:28.3446355Z'], - 'event.kind': ['event'], - 'event.module': ['endpoint'], - 'event.action': ['start'], - 'event.id': ['LzzWB9jjGmCwGMvk++++FG/K'], - 'event.category': ['process'], - 'event.type': ['start'], - 'event.dataset': ['endpoint.events.process'], - 'user.domain': [''], - 'user.name': [''], - }, + }, + { + _index: '.ds-logs-endpoint.events.process-default-2021.02.02-000005', + _id: 'pxymg3cBX5UUcOOYP3Ec', + fields: { + 'agent.id': ['1d15cf9e-3dc7-5b97-f586-743f7c2518b2'], + 'agent.type': ['endpoint'], + 'agent.version': ['7.10.0'], + '@timestamp': ['2021-02-08T21:50:28.3446355Z'], + message: ['Endpoint process event'], + 'process.Ext.ancestry': [ + 'MWQxNWNmOWUtM2RjNy01Yjk3LWY1ODYtNzQzZjdjMjUxOGIyLTUyODQtMTMyNTcyOTQ2MjMuOTk2NTkxMDAw', + 'MWQxNWNmOWUtM2RjNy01Yjk3LWY1ODYtNzQzZjdjMjUxOGIyLTIzODAtMTMyNTUwNzg2ODkuOTY1Nzg1NTAw', + 'MWQxNWNmOWUtM2RjNy01Yjk3LWY1ODYtNzQzZjdjMjUxOGIyLTU2OC0xMzI1NTA3ODY2Ny4zMjk3MDY2MDA=', + 'MWQxNWNmOWUtM2RjNy01Yjk3LWY1ODYtNzQzZjdjMjUxOGIyLTQ2OC0xMzI1NTA3ODY2NS42Mzg5MzY1MDA=', + ], + 'process.Ext.code_signature': [ + { + trusted: true, + subject_name: 'Microsoft Corporation', + exists: true, + status: 'trusted', + }, + ], + 'process.Ext.token.integrity_level_name': ['high'], + 'process.Ext.token.elevation_level': ['default'], + 'process.entity_id': [ + 'MWQxNWNmOWUtM2RjNy01Yjk3LWY1ODYtNzQzZjdjMjUxOGIyLTYzNjgtMTMyNTcyOTQ2MjguMzQ0NjM1NTAw', + ], + 'process.args': ['C:\\Program Files\\OpenSSH-Win64\\sshd.exe', '-y'], + 'process.parent.args': ['C:\\Program Files\\OpenSSH-Win64\\sshd.exe', '-R'], + 'process.parent.name': ['sshd.exe'], + 'process.parent.pid': [5284], + 'process.parent.args_count': [2], + 'process.parent.entity_id': [ + 'MWQxNWNmOWUtM2RjNy01Yjk3LWY1ODYtNzQzZjdjMjUxOGIyLTUyODQtMTMyNTcyOTQ2MjMuOTk2NTkxMDAw', + ], + 'process.parent.command_line': ['"C:\\Program Files\\OpenSSH-Win64\\sshd.exe" -R'], + 'process.parent.executable': ['C:\\Program Files\\OpenSSH-Win64\\sshd.exe'], + 'process.code_signature.trusted': [true], + 'process.code_signature.subject_name': ['Microsoft Corporation'], + 'process.code_signature.exists': [true], + 'process.code_signature.status': ['trusted'], + 'process.name': ['sshd.exe'], + 'process.pid': [6368], + 'process.args_count': [2], + 'process.command_line': ['"C:\\Program Files\\OpenSSH-Win64\\sshd.exe" -y'], + 'process.hash.sha1': ['631244d731f406394c17c7dfd85203e317c74814'], + 'process.hash.sha256': [ + 'e6a972f9db27de18be225095b3b3141b945be8aadc4014c8704ae5acafe3e8e0', + ], + 'process.hash.md5': ['331ba0e529810ef718dd3efbd1242302'], + 'process.executable': ['C:\\Program Files\\OpenSSH-Win64\\sshd.exe'], + 'ecs.version': ['1.5.0'], + 'data_stream.namespace': ['default'], + 'data_stream.type': ['logs'], + 'data_stream.dataset': ['endpoint.events.process'], + 'elastic.agent.id': ['f5dec71e-438c-424e-ac9b-0281f10412b9'], + 'host.hostname': ['win2019-endpoint-mr-pedro'], + 'host.os.Ext.variant': ['Windows Server 2019 Datacenter'], + 'host.os.name': ['Windows'], + 'host.os.kernel': ['1809 (10.0.17763.1697)'], + 'host.os.family': ['windows'], + 'host.os.version': ['1809 (10.0.17763.1697)'], + 'host.os.platform': ['windows'], + 'host.os.full': ['Windows Server 2019 Datacenter 1809 (10.0.17763.1697)'], + 'host.ip': ['10.128.0.57', 'fe80::9ced:8f1c:880b:3e1f', '127.0.0.1', '::1'], + 'host.name': ['win2019-endpoint-mr-pedro'], + 'host.id': ['d8ad572e-d224-4044-a57d-f5a84c0dfe5d'], + 'host.mac': ['42:01:0a:80:00:39'], + 'host.architecture': ['x86_64'], + 'event.sequence': [3293863], + 'event.ingested': ['2021-02-08T21:57:26.417387865Z'], + 'event.created': ['2021-02-08T21:50:28.3446355Z'], + 'event.kind': ['event'], + 'event.module': ['endpoint'], + 'event.action': ['start'], + 'event.id': ['LzzWB9jjGmCwGMvk++++FG/K'], + 'event.category': ['process'], + 'event.type': ['start'], + 'event.dataset': ['endpoint.events.process'], + 'user.domain': [''], + 'user.name': [''], }, - { - _index: '.ds-logs-endpoint.events.network-default-2021.02.02-000005', - _id: 'qBymg3cBX5UUcOOYP3Ec', - fields: { - 'agent.id': ['1d15cf9e-3dc7-5b97-f586-743f7c2518b2'], - 'agent.type': ['endpoint'], - 'agent.version': ['7.10.0'], - '@timestamp': ['2021-02-08T21:50:28.5553532Z'], - message: ['Endpoint network event'], - 'process.Ext.ancestry': [ - 'MWQxNWNmOWUtM2RjNy01Yjk3LWY1ODYtNzQzZjdjMjUxOGIyLTU2OC0xMzI1NTA3ODY2Ny4zMjk3MDY2MDA=', - 'MWQxNWNmOWUtM2RjNy01Yjk3LWY1ODYtNzQzZjdjMjUxOGIyLTQ2OC0xMzI1NTA3ODY2NS42Mzg5MzY1MDA=', - ], - 'process.name': ['svchost.exe'], - 'process.entity_id': [ - 'MWQxNWNmOWUtM2RjNy01Yjk3LWY1ODYtNzQzZjdjMjUxOGIyLTk2OC0xMzI1NTA3ODY3My4yNjQyNDcyMDA=', - ], - 'process.executable': ['C:\\Windows\\System32\\svchost.exe'], - 'ecs.version': ['1.5.0'], - 'destination.address': ['10.128.0.57'], - 'destination.port': [3389], - 'destination.bytes': [1681], - 'destination.ip': ['10.128.0.57'], - 'source.address': ['142.202.189.139'], - 'source.port': [16151], - 'source.bytes': [1224], - 'source.ip': ['142.202.189.139'], - 'network.transport': ['tcp'], - 'network.type': ['ipv4'], - 'network.direction': ['incoming'], - 'data_stream.namespace': ['default'], - 'data_stream.type': ['logs'], - 'data_stream.dataset': ['endpoint.events.security'], - 'elastic.agent.id': ['f5dec71e-438c-424e-ac9b-0281f10412b9'], - 'host.hostname': ['win2019-endpoint-mr-pedro'], - 'host.os.Ext.variant': ['Windows Server 2019 Datacenter'], - 'host.os.name': ['Windows'], - 'host.os.kernel': ['1809 (10.0.17763.1697)'], - 'host.os.family': ['windows'], - 'host.os.version': ['1809 (10.0.17763.1697)'], - 'host.os.platform': ['windows'], - 'host.os.full': ['Windows Server 2019 Datacenter 1809 (10.0.17763.1697)'], - 'host.ip': ['10.128.0.57', 'fe80::9ced:8f1c:880b:3e1f', '127.0.0.1', '::1'], - 'host.name': ['win2019-endpoint-mr-pedro'], - 'host.id': ['d8ad572e-d224-4044-a57d-f5a84c0dfe5d'], - 'host.mac': ['42:01:0a:80:00:39'], - 'host.architecture': ['x86_64'], - 'event.sequence': [3293864], - 'event.ingested': ['2021-02-08T21:57:26.417451347Z'], - 'event.created': ['2021-02-08T21:50:28.5553532Z'], - 'event.kind': ['event'], - 'event.module': ['endpoint'], - 'event.action': ['disconnect_received'], - 'event.id': ['LzzWB9jjGmCwGMvk++++FG/L'], - 'event.category': ['network'], - 'event.type': ['start'], - 'event.dataset': ['endpoint.events.network'], - 'user.domain': ['NT AUTHORITY'], - 'user.name': ['SYSTEM'], - }, + }, + { + _index: '.ds-logs-endpoint.events.network-default-2021.02.02-000005', + _id: 'qBymg3cBX5UUcOOYP3Ec', + fields: { + 'agent.id': ['1d15cf9e-3dc7-5b97-f586-743f7c2518b2'], + 'agent.type': ['endpoint'], + 'agent.version': ['7.10.0'], + '@timestamp': ['2021-02-08T21:50:28.5553532Z'], + message: ['Endpoint network event'], + 'process.Ext.ancestry': [ + 'MWQxNWNmOWUtM2RjNy01Yjk3LWY1ODYtNzQzZjdjMjUxOGIyLTU2OC0xMzI1NTA3ODY2Ny4zMjk3MDY2MDA=', + 'MWQxNWNmOWUtM2RjNy01Yjk3LWY1ODYtNzQzZjdjMjUxOGIyLTQ2OC0xMzI1NTA3ODY2NS42Mzg5MzY1MDA=', + ], + 'process.name': ['svchost.exe'], + 'process.entity_id': [ + 'MWQxNWNmOWUtM2RjNy01Yjk3LWY1ODYtNzQzZjdjMjUxOGIyLTk2OC0xMzI1NTA3ODY3My4yNjQyNDcyMDA=', + ], + 'process.executable': ['C:\\Windows\\System32\\svchost.exe'], + 'ecs.version': ['1.5.0'], + 'destination.address': ['10.128.0.57'], + 'destination.port': [3389], + 'destination.bytes': [1681], + 'destination.ip': ['10.128.0.57'], + 'source.address': ['142.202.189.139'], + 'source.port': [16151], + 'source.bytes': [1224], + 'source.ip': ['142.202.189.139'], + 'network.transport': ['tcp'], + 'network.type': ['ipv4'], + 'network.direction': ['incoming'], + 'data_stream.namespace': ['default'], + 'data_stream.type': ['logs'], + 'data_stream.dataset': ['endpoint.events.security'], + 'elastic.agent.id': ['f5dec71e-438c-424e-ac9b-0281f10412b9'], + 'host.hostname': ['win2019-endpoint-mr-pedro'], + 'host.os.Ext.variant': ['Windows Server 2019 Datacenter'], + 'host.os.name': ['Windows'], + 'host.os.kernel': ['1809 (10.0.17763.1697)'], + 'host.os.family': ['windows'], + 'host.os.version': ['1809 (10.0.17763.1697)'], + 'host.os.platform': ['windows'], + 'host.os.full': ['Windows Server 2019 Datacenter 1809 (10.0.17763.1697)'], + 'host.ip': ['10.128.0.57', 'fe80::9ced:8f1c:880b:3e1f', '127.0.0.1', '::1'], + 'host.name': ['win2019-endpoint-mr-pedro'], + 'host.id': ['d8ad572e-d224-4044-a57d-f5a84c0dfe5d'], + 'host.mac': ['42:01:0a:80:00:39'], + 'host.architecture': ['x86_64'], + 'event.sequence': [3293864], + 'event.ingested': ['2021-02-08T21:57:26.417451347Z'], + 'event.created': ['2021-02-08T21:50:28.5553532Z'], + 'event.kind': ['event'], + 'event.module': ['endpoint'], + 'event.action': ['disconnect_received'], + 'event.id': ['LzzWB9jjGmCwGMvk++++FG/L'], + 'event.category': ['network'], + 'event.type': ['start'], + 'event.dataset': ['endpoint.events.network'], + 'user.domain': ['NT AUTHORITY'], + 'user.name': ['SYSTEM'], }, - ], - }, - ], - }, + }, + ], + }, + ], }, statusCode: 200, headers: {}, meta: {}, - hits: {}, }, } as unknown as EqlSearchStrategyResponse>; export const eventsResponse = { rawResponse: { - body: { - is_partial: false, - is_running: false, - took: 527, - timed_out: false, - hits: { - total: { - value: 10, - relation: 'eq', - }, - events: [ - { - _index: '.ds-logs-endpoint.events.security-default-2021.02.05-000005', - _id: 'qhymg3cBX5UUcOOYP3Ec', - fields: { - 'agent.id': ['1d15cf9e-3dc7-5b97-f586-743f7c2518b2'], - 'agent.type': ['endpoint'], - 'agent.version': ['7.10.0'], - '@timestamp': ['2021-02-08T21:50:28.3377092Z'], - message: ['Endpoint security event'], - 'process.Ext.ancestry': [ - 'MWQxNWNmOWUtM2RjNy01Yjk3LWY1ODYtNzQzZjdjMjUxOGIyLTIzODAtMTMyNTUwNzg2ODkuOTY1Nzg1NTAw', - 'MWQxNWNmOWUtM2RjNy01Yjk3LWY1ODYtNzQzZjdjMjUxOGIyLTU2OC0xMzI1NTA3ODY2Ny4zMjk3MDY2MDA=', - 'MWQxNWNmOWUtM2RjNy01Yjk3LWY1ODYtNzQzZjdjMjUxOGIyLTQ2OC0xMzI1NTA3ODY2NS42Mzg5MzY1MDA=', - ], - 'process.name': ['C:\\Program Files\\OpenSSH-Win64\\sshd.exe'], - 'process.entity_id': [ - 'MWQxNWNmOWUtM2RjNy01Yjk3LWY1ODYtNzQzZjdjMjUxOGIyLTUyODQtMTMyNTcyOTQ2MjMuOTk2NTkxMDAw', - ], - 'process.executable': ['C:\\Program Files\\OpenSSH-Win64\\sshd.exe'], - 'ecs.version': ['1.5.0'], - 'data_stream.namespace': ['default'], - 'data_stream.type': ['logs'], - 'data_stream.dataset': ['endpoint.events.security'], - 'elastic.agent.id': ['f5dec71e-438c-424e-ac9b-0281f10412b9'], - 'host.hostname': ['win2019-endpoint-mr-pedro'], - 'host.os.Ext.variant': ['Windows Server 2019 Datacenter'], - 'host.os.name': ['Windows'], - 'host.os.kernel': ['1809 (10.0.17763.1697)'], - 'host.os.family': ['windows'], - 'host.os.version': ['1809 (10.0.17763.1697)'], - 'host.os.platform': ['windows'], - 'host.os.full': ['Windows Server 2019 Datacenter 1809 (10.0.17763.1697)'], - 'host.ip': ['10.128.0.57', 'fe80::9ced:8f1c:880b:3e1f', '127.0.0.1', '::1'], - 'host.name': ['win2019-endpoint-mr-pedro'], - 'host.id': ['d8ad572e-d224-4044-a57d-f5a84c0dfe5d'], - 'host.mac': ['42:01:0a:80:00:39'], - 'host.architecture': ['x86_64'], - 'event.sequence': [3293866], - 'event.ingested': ['2021-02-08T21:57:26.417559711Z'], - 'event.created': ['2021-02-08T21:50:28.3377092Z'], - 'event.kind': ['event'], - 'event.module': ['endpoint'], - 'event.action': ['log_on'], - 'event.id': ['LzzWB9jjGmCwGMvk++++FG/O'], - 'event.category': ['authentication', 'session'], - 'event.type': ['start'], - 'event.dataset': ['endpoint.events.security'], - 'event.outcome': ['success'], - 'user.domain': ['NT AUTHORITY'], - 'user.name': ['SYSTEM'], - }, + is_partial: false, + is_running: false, + took: 527, + timed_out: false, + hits: { + total: { + value: 10, + relation: 'eq', + }, + events: [ + { + _index: '.ds-logs-endpoint.events.security-default-2021.02.05-000005', + _id: 'qhymg3cBX5UUcOOYP3Ec', + fields: { + 'agent.id': ['1d15cf9e-3dc7-5b97-f586-743f7c2518b2'], + 'agent.type': ['endpoint'], + 'agent.version': ['7.10.0'], + '@timestamp': ['2021-02-08T21:50:28.3377092Z'], + message: ['Endpoint security event'], + 'process.Ext.ancestry': [ + 'MWQxNWNmOWUtM2RjNy01Yjk3LWY1ODYtNzQzZjdjMjUxOGIyLTIzODAtMTMyNTUwNzg2ODkuOTY1Nzg1NTAw', + 'MWQxNWNmOWUtM2RjNy01Yjk3LWY1ODYtNzQzZjdjMjUxOGIyLTU2OC0xMzI1NTA3ODY2Ny4zMjk3MDY2MDA=', + 'MWQxNWNmOWUtM2RjNy01Yjk3LWY1ODYtNzQzZjdjMjUxOGIyLTQ2OC0xMzI1NTA3ODY2NS42Mzg5MzY1MDA=', + ], + 'process.name': ['C:\\Program Files\\OpenSSH-Win64\\sshd.exe'], + 'process.entity_id': [ + 'MWQxNWNmOWUtM2RjNy01Yjk3LWY1ODYtNzQzZjdjMjUxOGIyLTUyODQtMTMyNTcyOTQ2MjMuOTk2NTkxMDAw', + ], + 'process.executable': ['C:\\Program Files\\OpenSSH-Win64\\sshd.exe'], + 'ecs.version': ['1.5.0'], + 'data_stream.namespace': ['default'], + 'data_stream.type': ['logs'], + 'data_stream.dataset': ['endpoint.events.security'], + 'elastic.agent.id': ['f5dec71e-438c-424e-ac9b-0281f10412b9'], + 'host.hostname': ['win2019-endpoint-mr-pedro'], + 'host.os.Ext.variant': ['Windows Server 2019 Datacenter'], + 'host.os.name': ['Windows'], + 'host.os.kernel': ['1809 (10.0.17763.1697)'], + 'host.os.family': ['windows'], + 'host.os.version': ['1809 (10.0.17763.1697)'], + 'host.os.platform': ['windows'], + 'host.os.full': ['Windows Server 2019 Datacenter 1809 (10.0.17763.1697)'], + 'host.ip': ['10.128.0.57', 'fe80::9ced:8f1c:880b:3e1f', '127.0.0.1', '::1'], + 'host.name': ['win2019-endpoint-mr-pedro'], + 'host.id': ['d8ad572e-d224-4044-a57d-f5a84c0dfe5d'], + 'host.mac': ['42:01:0a:80:00:39'], + 'host.architecture': ['x86_64'], + 'event.sequence': [3293866], + 'event.ingested': ['2021-02-08T21:57:26.417559711Z'], + 'event.created': ['2021-02-08T21:50:28.3377092Z'], + 'event.kind': ['event'], + 'event.module': ['endpoint'], + 'event.action': ['log_on'], + 'event.id': ['LzzWB9jjGmCwGMvk++++FG/O'], + 'event.category': ['authentication', 'session'], + 'event.type': ['start'], + 'event.dataset': ['endpoint.events.security'], + 'event.outcome': ['success'], + 'user.domain': ['NT AUTHORITY'], + 'user.name': ['SYSTEM'], }, - { - _index: '.ds-logs-endpoint.events.security-default-2021.02.05-000005', - _id: 'qxymg3cBX5UUcOOYP3Ec', - fields: { - 'agent.id': ['1d15cf9e-3dc7-5b97-f586-743f7c2518b2'], - 'agent.type': ['endpoint'], - 'agent.version': ['7.10.0'], - '@timestamp': ['2021-02-08T21:50:28.3377142Z'], - message: ['Endpoint security event'], - 'process.Ext.ancestry': [ - 'MWQxNWNmOWUtM2RjNy01Yjk3LWY1ODYtNzQzZjdjMjUxOGIyLTQ2OC0xMzI1NTA3ODY2NS42Mzg5MzY1MDA=', - ], - 'process.entity_id': [ - 'MWQxNWNmOWUtM2RjNy01Yjk3LWY1ODYtNzQzZjdjMjUxOGIyLTU4MC0xMzI1NTA3ODY2Ny45MTg5Njc1MDA=', - ], - 'process.executable': ['C:\\Windows\\System32\\lsass.exe'], - 'ecs.version': ['1.5.0'], - 'data_stream.namespace': ['default'], - 'data_stream.type': ['logs'], - 'data_stream.dataset': ['endpoint.events.security'], - 'elastic.agent.id': ['f5dec71e-438c-424e-ac9b-0281f10412b9'], - 'host.hostname': ['win2019-endpoint-mr-pedro'], - 'host.os.Ext.variant': ['Windows Server 2019 Datacenter'], - 'host.os.name': ['Windows'], - 'host.os.kernel': ['1809 (10.0.17763.1697)'], - 'host.os.family': ['windows'], - 'host.os.version': ['1809 (10.0.17763.1697)'], - 'host.os.platform': ['windows'], - 'host.os.full': ['Windows Server 2019 Datacenter 1809 (10.0.17763.1697)'], - 'host.ip': ['10.128.0.57', 'fe80::9ced:8f1c:880b:3e1f', '127.0.0.1', '::1'], - 'host.name': ['win2019-endpoint-mr-pedro'], - 'host.id': ['d8ad572e-d224-4044-a57d-f5a84c0dfe5d'], - 'host.mac': ['42:01:0a:80:00:39'], - 'host.architecture': ['x86_64'], - 'event.sequence': [3293867], - 'event.ingested': ['2021-02-08T21:57:26.417596906Z'], - 'event.created': ['2021-02-08T21:50:28.3377142Z'], - 'event.kind': ['event'], - 'event.module': ['endpoint'], - 'event.action': ['log_on'], - 'event.id': ['LzzWB9jjGmCwGMvk++++FG/P'], - 'event.category': ['authentication', 'session'], - 'event.type': ['start'], - 'event.dataset': ['endpoint.events.security'], - 'event.outcome': ['success'], - 'user.domain': ['NT AUTHORITY'], - 'user.name': ['SYSTEM'], - }, + }, + { + _index: '.ds-logs-endpoint.events.security-default-2021.02.05-000005', + _id: 'qxymg3cBX5UUcOOYP3Ec', + fields: { + 'agent.id': ['1d15cf9e-3dc7-5b97-f586-743f7c2518b2'], + 'agent.type': ['endpoint'], + 'agent.version': ['7.10.0'], + '@timestamp': ['2021-02-08T21:50:28.3377142Z'], + message: ['Endpoint security event'], + 'process.Ext.ancestry': [ + 'MWQxNWNmOWUtM2RjNy01Yjk3LWY1ODYtNzQzZjdjMjUxOGIyLTQ2OC0xMzI1NTA3ODY2NS42Mzg5MzY1MDA=', + ], + 'process.entity_id': [ + 'MWQxNWNmOWUtM2RjNy01Yjk3LWY1ODYtNzQzZjdjMjUxOGIyLTU4MC0xMzI1NTA3ODY2Ny45MTg5Njc1MDA=', + ], + 'process.executable': ['C:\\Windows\\System32\\lsass.exe'], + 'ecs.version': ['1.5.0'], + 'data_stream.namespace': ['default'], + 'data_stream.type': ['logs'], + 'data_stream.dataset': ['endpoint.events.security'], + 'elastic.agent.id': ['f5dec71e-438c-424e-ac9b-0281f10412b9'], + 'host.hostname': ['win2019-endpoint-mr-pedro'], + 'host.os.Ext.variant': ['Windows Server 2019 Datacenter'], + 'host.os.name': ['Windows'], + 'host.os.kernel': ['1809 (10.0.17763.1697)'], + 'host.os.family': ['windows'], + 'host.os.version': ['1809 (10.0.17763.1697)'], + 'host.os.platform': ['windows'], + 'host.os.full': ['Windows Server 2019 Datacenter 1809 (10.0.17763.1697)'], + 'host.ip': ['10.128.0.57', 'fe80::9ced:8f1c:880b:3e1f', '127.0.0.1', '::1'], + 'host.name': ['win2019-endpoint-mr-pedro'], + 'host.id': ['d8ad572e-d224-4044-a57d-f5a84c0dfe5d'], + 'host.mac': ['42:01:0a:80:00:39'], + 'host.architecture': ['x86_64'], + 'event.sequence': [3293867], + 'event.ingested': ['2021-02-08T21:57:26.417596906Z'], + 'event.created': ['2021-02-08T21:50:28.3377142Z'], + 'event.kind': ['event'], + 'event.module': ['endpoint'], + 'event.action': ['log_on'], + 'event.id': ['LzzWB9jjGmCwGMvk++++FG/P'], + 'event.category': ['authentication', 'session'], + 'event.type': ['start'], + 'event.dataset': ['endpoint.events.security'], + 'event.outcome': ['success'], + 'user.domain': ['NT AUTHORITY'], + 'user.name': ['SYSTEM'], }, - { - _index: '.ds-logs-endpoint.events.security-default-2021.02.05-000005', - _id: 'rBymg3cBX5UUcOOYP3Ec', - fields: { - 'agent.id': ['1d15cf9e-3dc7-5b97-f586-743f7c2518b2'], - 'agent.type': ['endpoint'], - 'agent.version': ['7.10.0'], - '@timestamp': ['2021-02-08T21:50:28.3381013Z'], - message: ['Endpoint security event'], - 'process.Ext.ancestry': [ - 'MWQxNWNmOWUtM2RjNy01Yjk3LWY1ODYtNzQzZjdjMjUxOGIyLTQ2OC0xMzI1NTA3ODY2NS42Mzg5MzY1MDA=', - ], - 'process.entity_id': [ - 'MWQxNWNmOWUtM2RjNy01Yjk3LWY1ODYtNzQzZjdjMjUxOGIyLTU4MC0xMzI1NTA3ODY2Ny45MTg5Njc1MDA=', - ], - 'process.executable': ['C:\\Windows\\System32\\lsass.exe'], - 'ecs.version': ['1.5.0'], - 'data_stream.namespace': ['default'], - 'data_stream.type': ['logs'], - 'data_stream.dataset': ['endpoint.events.security'], - 'elastic.agent.id': ['f5dec71e-438c-424e-ac9b-0281f10412b9'], - 'host.hostname': ['win2019-endpoint-mr-pedro'], - 'host.os.Ext.variant': ['Windows Server 2019 Datacenter'], - 'host.os.name': ['Windows'], - 'host.os.kernel': ['1809 (10.0.17763.1697)'], - 'host.os.family': ['windows'], - 'host.os.version': ['1809 (10.0.17763.1697)'], - 'host.os.platform': ['windows'], - 'host.os.full': ['Windows Server 2019 Datacenter 1809 (10.0.17763.1697)'], - 'host.ip': ['10.128.0.57', 'fe80::9ced:8f1c:880b:3e1f', '127.0.0.1', '::1'], - 'host.name': ['win2019-endpoint-mr-pedro'], - 'host.id': ['d8ad572e-d224-4044-a57d-f5a84c0dfe5d'], - 'host.mac': ['42:01:0a:80:00:39'], - 'host.architecture': ['x86_64'], - 'event.sequence': [3293868], - 'event.ingested': ['2021-02-08T21:57:26.417632166Z'], - 'event.created': ['2021-02-08T21:50:28.3381013Z'], - 'event.kind': ['event'], - 'event.module': ['endpoint'], - 'event.action': ['log_on'], - 'event.id': ['LzzWB9jjGmCwGMvk++++FG/Q'], - 'event.category': ['authentication', 'session'], - 'event.type': ['start'], - 'event.dataset': ['endpoint.events.security'], - 'event.outcome': ['success'], - 'user.domain': ['NT AUTHORITY'], - 'user.name': ['SYSTEM'], - }, + }, + { + _index: '.ds-logs-endpoint.events.security-default-2021.02.05-000005', + _id: 'rBymg3cBX5UUcOOYP3Ec', + fields: { + 'agent.id': ['1d15cf9e-3dc7-5b97-f586-743f7c2518b2'], + 'agent.type': ['endpoint'], + 'agent.version': ['7.10.0'], + '@timestamp': ['2021-02-08T21:50:28.3381013Z'], + message: ['Endpoint security event'], + 'process.Ext.ancestry': [ + 'MWQxNWNmOWUtM2RjNy01Yjk3LWY1ODYtNzQzZjdjMjUxOGIyLTQ2OC0xMzI1NTA3ODY2NS42Mzg5MzY1MDA=', + ], + 'process.entity_id': [ + 'MWQxNWNmOWUtM2RjNy01Yjk3LWY1ODYtNzQzZjdjMjUxOGIyLTU4MC0xMzI1NTA3ODY2Ny45MTg5Njc1MDA=', + ], + 'process.executable': ['C:\\Windows\\System32\\lsass.exe'], + 'ecs.version': ['1.5.0'], + 'data_stream.namespace': ['default'], + 'data_stream.type': ['logs'], + 'data_stream.dataset': ['endpoint.events.security'], + 'elastic.agent.id': ['f5dec71e-438c-424e-ac9b-0281f10412b9'], + 'host.hostname': ['win2019-endpoint-mr-pedro'], + 'host.os.Ext.variant': ['Windows Server 2019 Datacenter'], + 'host.os.name': ['Windows'], + 'host.os.kernel': ['1809 (10.0.17763.1697)'], + 'host.os.family': ['windows'], + 'host.os.version': ['1809 (10.0.17763.1697)'], + 'host.os.platform': ['windows'], + 'host.os.full': ['Windows Server 2019 Datacenter 1809 (10.0.17763.1697)'], + 'host.ip': ['10.128.0.57', 'fe80::9ced:8f1c:880b:3e1f', '127.0.0.1', '::1'], + 'host.name': ['win2019-endpoint-mr-pedro'], + 'host.id': ['d8ad572e-d224-4044-a57d-f5a84c0dfe5d'], + 'host.mac': ['42:01:0a:80:00:39'], + 'host.architecture': ['x86_64'], + 'event.sequence': [3293868], + 'event.ingested': ['2021-02-08T21:57:26.417632166Z'], + 'event.created': ['2021-02-08T21:50:28.3381013Z'], + 'event.kind': ['event'], + 'event.module': ['endpoint'], + 'event.action': ['log_on'], + 'event.id': ['LzzWB9jjGmCwGMvk++++FG/Q'], + 'event.category': ['authentication', 'session'], + 'event.type': ['start'], + 'event.dataset': ['endpoint.events.security'], + 'event.outcome': ['success'], + 'user.domain': ['NT AUTHORITY'], + 'user.name': ['SYSTEM'], }, - { - _index: '.ds-logs-endpoint.events.security-default-2021.02.05-000005', - _id: 'qxymg3cBX5UUcOOYP3Ec', - fields: { - 'agent.id': ['1d15cf9e-3dc7-5b97-f586-743f7c2518b2'], - 'agent.type': ['endpoint'], - 'agent.version': ['7.10.0'], - '@timestamp': ['2021-02-08T21:50:28.3377142Z'], - message: ['Endpoint security event'], - 'process.Ext.ancestry': [ - 'MWQxNWNmOWUtM2RjNy01Yjk3LWY1ODYtNzQzZjdjMjUxOGIyLTQ2OC0xMzI1NTA3ODY2NS42Mzg5MzY1MDA=', - ], - 'process.entity_id': [ - 'MWQxNWNmOWUtM2RjNy01Yjk3LWY1ODYtNzQzZjdjMjUxOGIyLTU4MC0xMzI1NTA3ODY2Ny45MTg5Njc1MDA=', - ], - 'process.executable': ['C:\\Windows\\System32\\lsass.exe'], - 'ecs.version': ['1.5.0'], - 'data_stream.namespace': ['default'], - 'data_stream.type': ['logs'], - 'data_stream.dataset': ['endpoint.events.security'], - 'elastic.agent.id': ['f5dec71e-438c-424e-ac9b-0281f10412b9'], - 'host.hostname': ['win2019-endpoint-mr-pedro'], - 'host.os.Ext.variant': ['Windows Server 2019 Datacenter'], - 'host.os.name': ['Windows'], - 'host.os.kernel': ['1809 (10.0.17763.1697)'], - 'host.os.family': ['windows'], - 'host.os.version': ['1809 (10.0.17763.1697)'], - 'host.os.platform': ['windows'], - 'host.os.full': ['Windows Server 2019 Datacenter 1809 (10.0.17763.1697)'], - 'host.ip': ['10.128.0.57', 'fe80::9ced:8f1c:880b:3e1f', '127.0.0.1', '::1'], - 'host.name': ['win2019-endpoint-mr-pedro'], - 'host.id': ['d8ad572e-d224-4044-a57d-f5a84c0dfe5d'], - 'host.mac': ['42:01:0a:80:00:39'], - 'host.architecture': ['x86_64'], - 'event.sequence': [3293867], - 'event.ingested': ['2021-02-08T21:57:26.417596906Z'], - 'event.created': ['2021-02-08T21:50:28.3377142Z'], - 'event.kind': ['event'], - 'event.module': ['endpoint'], - 'event.action': ['log_on'], - 'event.id': ['LzzWB9jjGmCwGMvk++++FG/P'], - 'event.category': ['authentication', 'session'], - 'event.type': ['start'], - 'event.dataset': ['endpoint.events.security'], - 'event.outcome': ['success'], - 'user.domain': ['NT AUTHORITY'], - 'user.name': ['SYSTEM'], - }, + }, + { + _index: '.ds-logs-endpoint.events.security-default-2021.02.05-000005', + _id: 'qxymg3cBX5UUcOOYP3Ec', + fields: { + 'agent.id': ['1d15cf9e-3dc7-5b97-f586-743f7c2518b2'], + 'agent.type': ['endpoint'], + 'agent.version': ['7.10.0'], + '@timestamp': ['2021-02-08T21:50:28.3377142Z'], + message: ['Endpoint security event'], + 'process.Ext.ancestry': [ + 'MWQxNWNmOWUtM2RjNy01Yjk3LWY1ODYtNzQzZjdjMjUxOGIyLTQ2OC0xMzI1NTA3ODY2NS42Mzg5MzY1MDA=', + ], + 'process.entity_id': [ + 'MWQxNWNmOWUtM2RjNy01Yjk3LWY1ODYtNzQzZjdjMjUxOGIyLTU4MC0xMzI1NTA3ODY2Ny45MTg5Njc1MDA=', + ], + 'process.executable': ['C:\\Windows\\System32\\lsass.exe'], + 'ecs.version': ['1.5.0'], + 'data_stream.namespace': ['default'], + 'data_stream.type': ['logs'], + 'data_stream.dataset': ['endpoint.events.security'], + 'elastic.agent.id': ['f5dec71e-438c-424e-ac9b-0281f10412b9'], + 'host.hostname': ['win2019-endpoint-mr-pedro'], + 'host.os.Ext.variant': ['Windows Server 2019 Datacenter'], + 'host.os.name': ['Windows'], + 'host.os.kernel': ['1809 (10.0.17763.1697)'], + 'host.os.family': ['windows'], + 'host.os.version': ['1809 (10.0.17763.1697)'], + 'host.os.platform': ['windows'], + 'host.os.full': ['Windows Server 2019 Datacenter 1809 (10.0.17763.1697)'], + 'host.ip': ['10.128.0.57', 'fe80::9ced:8f1c:880b:3e1f', '127.0.0.1', '::1'], + 'host.name': ['win2019-endpoint-mr-pedro'], + 'host.id': ['d8ad572e-d224-4044-a57d-f5a84c0dfe5d'], + 'host.mac': ['42:01:0a:80:00:39'], + 'host.architecture': ['x86_64'], + 'event.sequence': [3293867], + 'event.ingested': ['2021-02-08T21:57:26.417596906Z'], + 'event.created': ['2021-02-08T21:50:28.3377142Z'], + 'event.kind': ['event'], + 'event.module': ['endpoint'], + 'event.action': ['log_on'], + 'event.id': ['LzzWB9jjGmCwGMvk++++FG/P'], + 'event.category': ['authentication', 'session'], + 'event.type': ['start'], + 'event.dataset': ['endpoint.events.security'], + 'event.outcome': ['success'], + 'user.domain': ['NT AUTHORITY'], + 'user.name': ['SYSTEM'], }, - { - _index: '.ds-logs-endpoint.events.security-default-2021.02.05-000005', - _id: 'rBymg3cBX5UUcOOYP3Ec', - fields: { - 'agent.id': ['1d15cf9e-3dc7-5b97-f586-743f7c2518b2'], - 'agent.type': ['endpoint'], - 'agent.version': ['7.10.0'], - '@timestamp': ['2021-02-08T21:50:28.3381013Z'], - message: ['Endpoint security event'], - 'process.Ext.ancestry': [ - 'MWQxNWNmOWUtM2RjNy01Yjk3LWY1ODYtNzQzZjdjMjUxOGIyLTQ2OC0xMzI1NTA3ODY2NS42Mzg5MzY1MDA=', - ], - 'process.entity_id': [ - 'MWQxNWNmOWUtM2RjNy01Yjk3LWY1ODYtNzQzZjdjMjUxOGIyLTU4MC0xMzI1NTA3ODY2Ny45MTg5Njc1MDA=', - ], - 'process.executable': ['C:\\Windows\\System32\\lsass.exe'], - 'ecs.version': ['1.5.0'], - 'data_stream.namespace': ['default'], - 'data_stream.type': ['logs'], - 'data_stream.dataset': ['endpoint.events.security'], - 'elastic.agent.id': ['f5dec71e-438c-424e-ac9b-0281f10412b9'], - 'host.hostname': ['win2019-endpoint-mr-pedro'], - 'host.os.Ext.variant': ['Windows Server 2019 Datacenter'], - 'host.os.name': ['Windows'], - 'host.os.kernel': ['1809 (10.0.17763.1697)'], - 'host.os.family': ['windows'], - 'host.os.version': ['1809 (10.0.17763.1697)'], - 'host.os.platform': ['windows'], - 'host.os.full': ['Windows Server 2019 Datacenter 1809 (10.0.17763.1697)'], - 'host.ip': ['10.128.0.57', 'fe80::9ced:8f1c:880b:3e1f', '127.0.0.1', '::1'], - 'host.name': ['win2019-endpoint-mr-pedro'], - 'host.id': ['d8ad572e-d224-4044-a57d-f5a84c0dfe5d'], - 'host.mac': ['42:01:0a:80:00:39'], - 'host.architecture': ['x86_64'], - 'event.sequence': [3293868], - 'event.ingested': ['2021-02-08T21:57:26.417632166Z'], - 'event.created': ['2021-02-08T21:50:28.3381013Z'], - 'event.kind': ['event'], - 'event.module': ['endpoint'], - 'event.action': ['log_on'], - 'event.id': ['LzzWB9jjGmCwGMvk++++FG/Q'], - 'event.category': ['authentication', 'session'], - 'event.type': ['start'], - 'event.dataset': ['endpoint.events.security'], - 'event.outcome': ['success'], - 'user.domain': ['NT AUTHORITY'], - 'user.name': ['SYSTEM'], - }, + }, + { + _index: '.ds-logs-endpoint.events.security-default-2021.02.05-000005', + _id: 'rBymg3cBX5UUcOOYP3Ec', + fields: { + 'agent.id': ['1d15cf9e-3dc7-5b97-f586-743f7c2518b2'], + 'agent.type': ['endpoint'], + 'agent.version': ['7.10.0'], + '@timestamp': ['2021-02-08T21:50:28.3381013Z'], + message: ['Endpoint security event'], + 'process.Ext.ancestry': [ + 'MWQxNWNmOWUtM2RjNy01Yjk3LWY1ODYtNzQzZjdjMjUxOGIyLTQ2OC0xMzI1NTA3ODY2NS42Mzg5MzY1MDA=', + ], + 'process.entity_id': [ + 'MWQxNWNmOWUtM2RjNy01Yjk3LWY1ODYtNzQzZjdjMjUxOGIyLTU4MC0xMzI1NTA3ODY2Ny45MTg5Njc1MDA=', + ], + 'process.executable': ['C:\\Windows\\System32\\lsass.exe'], + 'ecs.version': ['1.5.0'], + 'data_stream.namespace': ['default'], + 'data_stream.type': ['logs'], + 'data_stream.dataset': ['endpoint.events.security'], + 'elastic.agent.id': ['f5dec71e-438c-424e-ac9b-0281f10412b9'], + 'host.hostname': ['win2019-endpoint-mr-pedro'], + 'host.os.Ext.variant': ['Windows Server 2019 Datacenter'], + 'host.os.name': ['Windows'], + 'host.os.kernel': ['1809 (10.0.17763.1697)'], + 'host.os.family': ['windows'], + 'host.os.version': ['1809 (10.0.17763.1697)'], + 'host.os.platform': ['windows'], + 'host.os.full': ['Windows Server 2019 Datacenter 1809 (10.0.17763.1697)'], + 'host.ip': ['10.128.0.57', 'fe80::9ced:8f1c:880b:3e1f', '127.0.0.1', '::1'], + 'host.name': ['win2019-endpoint-mr-pedro'], + 'host.id': ['d8ad572e-d224-4044-a57d-f5a84c0dfe5d'], + 'host.mac': ['42:01:0a:80:00:39'], + 'host.architecture': ['x86_64'], + 'event.sequence': [3293868], + 'event.ingested': ['2021-02-08T21:57:26.417632166Z'], + 'event.created': ['2021-02-08T21:50:28.3381013Z'], + 'event.kind': ['event'], + 'event.module': ['endpoint'], + 'event.action': ['log_on'], + 'event.id': ['LzzWB9jjGmCwGMvk++++FG/Q'], + 'event.category': ['authentication', 'session'], + 'event.type': ['start'], + 'event.dataset': ['endpoint.events.security'], + 'event.outcome': ['success'], + 'user.domain': ['NT AUTHORITY'], + 'user.name': ['SYSTEM'], }, - { - _index: '.ds-logs-endpoint.events.process-default-2021.02.02-000005', - _id: 'pxymg3cBX5UUcOOYP3Ec', - fields: { - 'agent.id': ['1d15cf9e-3dc7-5b97-f586-743f7c2518b2'], - 'agent.type': ['endpoint'], - 'agent.version': ['7.10.0'], - '@timestamp': ['2021-02-08T21:50:28.3446355Z'], - message: ['Endpoint security event'], - 'process.Ext.ancestry': [ - 'MWQxNWNmOWUtM2RjNy01Yjk3LWY1ODYtNzQzZjdjMjUxOGIyLTUyODQtMTMyNTcyOTQ2MjMuOTk2NTkxMDAw', - 'MWQxNWNmOWUtM2RjNy01Yjk3LWY1ODYtNzQzZjdjMjUxOGIyLTIzODAtMTMyNTUwNzg2ODkuOTY1Nzg1NTAw', - 'MWQxNWNmOWUtM2RjNy01Yjk3LWY1ODYtNzQzZjdjMjUxOGIyLTU2OC0xMzI1NTA3ODY2Ny4zMjk3MDY2MDA=', - 'MWQxNWNmOWUtM2RjNy01Yjk3LWY1ODYtNzQzZjdjMjUxOGIyLTQ2OC0xMzI1NTA3ODY2NS42Mzg5MzY1MDA=', - ], - 'process.Ext.code_signature': [ - { - trusted: true, - subject_name: 'Microsoft Corporation', - exists: true, - status: 'trusted', - }, - ], - 'process.Ext.token.integrity_level_name': ['high'], - 'process.Ext.token.elevation_level': ['default'], - 'process.entity_id': [ - 'MWQxNWNmOWUtM2RjNy01Yjk3LWY1ODYtNzQzZjdjMjUxOGIyLTYzNjgtMTMyNTcyOTQ2MjguMzQ0NjM1NTAw', - ], - 'process.args': ['C:\\Program Files\\OpenSSH-Win64\\sshd.exe', '-y'], - 'process.parent.args': ['C:\\Program Files\\OpenSSH-Win64\\sshd.exe', '-R'], - 'process.parent.name': ['sshd.exe'], - 'process.parent.pid': [5284], - 'process.parent.args_count': [2], - 'process.parent.entity_id': [ - 'MWQxNWNmOWUtM2RjNy01Yjk3LWY1ODYtNzQzZjdjMjUxOGIyLTUyODQtMTMyNTcyOTQ2MjMuOTk2NTkxMDAw', - ], - 'process.parent.command_line': ['"C:\\Program Files\\OpenSSH-Win64\\sshd.exe" -R'], - 'process.parent.executable': ['C:\\Program Files\\OpenSSH-Win64\\sshd.exe'], - 'process.code_signature.trusted': [true], - 'process.code_signature.subject_name': ['Microsoft Corporation'], - 'process.code_signature.exists': [true], - 'process.code_signature.status': ['trusted'], - 'process.name': ['sshd.exe'], - 'process.pid': [6368], - 'process.args_count': [2], - 'process.command_line': ['"C:\\Program Files\\OpenSSH-Win64\\sshd.exe" -y'], - 'process.hash.sha1': ['631244d731f406394c17c7dfd85203e317c74814'], - 'process.hash.sha256': [ - 'e6a972f9db27de18be225095b3b3141b945be8aadc4014c8704ae5acafe3e8e0', - ], - 'process.hash.md5': ['331ba0e529810ef718dd3efbd1242302'], - 'process.executable': ['C:\\Program Files\\OpenSSH-Win64\\sshd.exe'], - 'ecs.version': ['1.5.0'], - 'data_stream.namespace': ['default'], - 'data_stream.type': ['logs'], - 'data_stream.dataset': ['endpoint.events.security'], - 'elastic.agent.id': ['f5dec71e-438c-424e-ac9b-0281f10412b9'], - 'host.hostname': ['win2019-endpoint-mr-pedro'], - 'host.os.Ext.variant': ['Windows Server 2019 Datacenter'], - 'host.os.name': ['Windows'], - 'host.os.kernel': ['1809 (10.0.17763.1697)'], - 'host.os.family': ['windows'], - 'host.os.version': ['1809 (10.0.17763.1697)'], - 'host.os.platform': ['windows'], - 'host.os.full': ['Windows Server 2019 Datacenter 1809 (10.0.17763.1697)'], - 'host.ip': ['10.128.0.57', 'fe80::9ced:8f1c:880b:3e1f', '127.0.0.1', '::1'], - 'host.name': ['win2019-endpoint-mr-pedro'], - 'host.id': ['d8ad572e-d224-4044-a57d-f5a84c0dfe5d'], - 'host.mac': ['42:01:0a:80:00:39'], - 'host.architecture': ['x86_64'], - 'event.sequence': [3293863], - 'event.ingested': ['2021-02-08T21:57:26.417387865Z'], - 'event.created': ['2021-02-08T21:50:28.3446355Z'], - 'event.kind': ['event'], - 'event.module': ['endpoint'], - 'event.action': ['log_on'], - 'event.id': ['LzzWB9jjGmCwGMvk++++FG/K'], - 'event.category': ['authentication', 'session'], - 'event.type': ['start'], - 'event.dataset': ['endpoint.events.security'], - 'event.outcome': ['success'], - 'user.domain': [''], - 'user.name': [''], - }, + }, + { + _index: '.ds-logs-endpoint.events.process-default-2021.02.02-000005', + _id: 'pxymg3cBX5UUcOOYP3Ec', + fields: { + 'agent.id': ['1d15cf9e-3dc7-5b97-f586-743f7c2518b2'], + 'agent.type': ['endpoint'], + 'agent.version': ['7.10.0'], + '@timestamp': ['2021-02-08T21:50:28.3446355Z'], + message: ['Endpoint security event'], + 'process.Ext.ancestry': [ + 'MWQxNWNmOWUtM2RjNy01Yjk3LWY1ODYtNzQzZjdjMjUxOGIyLTUyODQtMTMyNTcyOTQ2MjMuOTk2NTkxMDAw', + 'MWQxNWNmOWUtM2RjNy01Yjk3LWY1ODYtNzQzZjdjMjUxOGIyLTIzODAtMTMyNTUwNzg2ODkuOTY1Nzg1NTAw', + 'MWQxNWNmOWUtM2RjNy01Yjk3LWY1ODYtNzQzZjdjMjUxOGIyLTU2OC0xMzI1NTA3ODY2Ny4zMjk3MDY2MDA=', + 'MWQxNWNmOWUtM2RjNy01Yjk3LWY1ODYtNzQzZjdjMjUxOGIyLTQ2OC0xMzI1NTA3ODY2NS42Mzg5MzY1MDA=', + ], + 'process.Ext.code_signature': [ + { + trusted: true, + subject_name: 'Microsoft Corporation', + exists: true, + status: 'trusted', + }, + ], + 'process.Ext.token.integrity_level_name': ['high'], + 'process.Ext.token.elevation_level': ['default'], + 'process.entity_id': [ + 'MWQxNWNmOWUtM2RjNy01Yjk3LWY1ODYtNzQzZjdjMjUxOGIyLTYzNjgtMTMyNTcyOTQ2MjguMzQ0NjM1NTAw', + ], + 'process.args': ['C:\\Program Files\\OpenSSH-Win64\\sshd.exe', '-y'], + 'process.parent.args': ['C:\\Program Files\\OpenSSH-Win64\\sshd.exe', '-R'], + 'process.parent.name': ['sshd.exe'], + 'process.parent.pid': [5284], + 'process.parent.args_count': [2], + 'process.parent.entity_id': [ + 'MWQxNWNmOWUtM2RjNy01Yjk3LWY1ODYtNzQzZjdjMjUxOGIyLTUyODQtMTMyNTcyOTQ2MjMuOTk2NTkxMDAw', + ], + 'process.parent.command_line': ['"C:\\Program Files\\OpenSSH-Win64\\sshd.exe" -R'], + 'process.parent.executable': ['C:\\Program Files\\OpenSSH-Win64\\sshd.exe'], + 'process.code_signature.trusted': [true], + 'process.code_signature.subject_name': ['Microsoft Corporation'], + 'process.code_signature.exists': [true], + 'process.code_signature.status': ['trusted'], + 'process.name': ['sshd.exe'], + 'process.pid': [6368], + 'process.args_count': [2], + 'process.command_line': ['"C:\\Program Files\\OpenSSH-Win64\\sshd.exe" -y'], + 'process.hash.sha1': ['631244d731f406394c17c7dfd85203e317c74814'], + 'process.hash.sha256': [ + 'e6a972f9db27de18be225095b3b3141b945be8aadc4014c8704ae5acafe3e8e0', + ], + 'process.hash.md5': ['331ba0e529810ef718dd3efbd1242302'], + 'process.executable': ['C:\\Program Files\\OpenSSH-Win64\\sshd.exe'], + 'ecs.version': ['1.5.0'], + 'data_stream.namespace': ['default'], + 'data_stream.type': ['logs'], + 'data_stream.dataset': ['endpoint.events.security'], + 'elastic.agent.id': ['f5dec71e-438c-424e-ac9b-0281f10412b9'], + 'host.hostname': ['win2019-endpoint-mr-pedro'], + 'host.os.Ext.variant': ['Windows Server 2019 Datacenter'], + 'host.os.name': ['Windows'], + 'host.os.kernel': ['1809 (10.0.17763.1697)'], + 'host.os.family': ['windows'], + 'host.os.version': ['1809 (10.0.17763.1697)'], + 'host.os.platform': ['windows'], + 'host.os.full': ['Windows Server 2019 Datacenter 1809 (10.0.17763.1697)'], + 'host.ip': ['10.128.0.57', 'fe80::9ced:8f1c:880b:3e1f', '127.0.0.1', '::1'], + 'host.name': ['win2019-endpoint-mr-pedro'], + 'host.id': ['d8ad572e-d224-4044-a57d-f5a84c0dfe5d'], + 'host.mac': ['42:01:0a:80:00:39'], + 'host.architecture': ['x86_64'], + 'event.sequence': [3293863], + 'event.ingested': ['2021-02-08T21:57:26.417387865Z'], + 'event.created': ['2021-02-08T21:50:28.3446355Z'], + 'event.kind': ['event'], + 'event.module': ['endpoint'], + 'event.action': ['log_on'], + 'event.id': ['LzzWB9jjGmCwGMvk++++FG/K'], + 'event.category': ['authentication', 'session'], + 'event.type': ['start'], + 'event.dataset': ['endpoint.events.security'], + 'event.outcome': ['success'], + 'user.domain': [''], + 'user.name': [''], }, - ], - }, + }, + ], }, statusCode: 200, headers: {}, meta: {}, - hits: {}, }, } as unknown as EqlSearchStrategyResponse>; diff --git a/x-pack/plugins/timelines/server/search_strategy/timeline/eql/helpers.test.ts b/x-pack/plugins/timelines/server/search_strategy/timeline/eql/helpers.test.ts index 0eeb757a453ebb..c0e145aa501f6d 100644 --- a/x-pack/plugins/timelines/server/search_strategy/timeline/eql/helpers.test.ts +++ b/x-pack/plugins/timelines/server/search_strategy/timeline/eql/helpers.test.ts @@ -178,7 +178,273 @@ describe('Search Strategy EQL helper', () => { eventsResponse ); - expect(result.edges).toMatchInlineSnapshot(`Array []`); + expect(result.edges).toMatchInlineSnapshot(` + Array [ + Object { + "cursor": Object { + "tiebreaker": null, + "value": "", + }, + "node": Object { + "_id": "qhymg3cBX5UUcOOYP3Ec", + "_index": ".ds-logs-endpoint.events.security-default-2021.02.05-000005", + "data": Array [ + Object { + "field": "@timestamp", + "value": Array [ + "2021-02-08T21:50:28.3377092Z", + ], + }, + Object { + "field": "event.action", + "value": Array [ + "log_on", + ], + }, + Object { + "field": "event.category", + "value": Array [ + "authentication", + "session", + ], + }, + Object { + "field": "host.name", + "value": Array [ + "win2019-endpoint-mr-pedro", + ], + }, + Object { + "field": "message", + "value": Array [ + "Endpoint security event", + ], + }, + ], + "ecs": Object { + "@timestamp": Array [ + "2021-02-08T21:50:28.3377092Z", + ], + "_id": "qhymg3cBX5UUcOOYP3Ec", + "_index": ".ds-logs-endpoint.events.security-default-2021.02.05-000005", + "agent": Object { + "id": Array [ + "1d15cf9e-3dc7-5b97-f586-743f7c2518b2", + ], + "type": Array [ + "endpoint", + ], + }, + "event": Object { + "action": Array [ + "log_on", + ], + "category": Array [ + "authentication", + "session", + ], + "created": Array [ + "2021-02-08T21:50:28.3377092Z", + ], + "dataset": Array [ + "endpoint.events.security", + ], + "id": Array [ + "LzzWB9jjGmCwGMvk++++FG/O", + ], + "kind": Array [ + "event", + ], + "module": Array [ + "endpoint", + ], + "outcome": Array [ + "success", + ], + "type": Array [ + "start", + ], + }, + "host": Object { + "id": Array [ + "d8ad572e-d224-4044-a57d-f5a84c0dfe5d", + ], + "ip": Array [ + "10.128.0.57", + "fe80::9ced:8f1c:880b:3e1f", + "127.0.0.1", + "::1", + ], + "name": Array [ + "win2019-endpoint-mr-pedro", + ], + "os": Object { + "family": Array [ + "windows", + ], + "name": Array [ + "Windows", + ], + }, + }, + "message": Array [ + "Endpoint security event", + ], + "process": Object { + "entity_id": Array [ + "MWQxNWNmOWUtM2RjNy01Yjk3LWY1ODYtNzQzZjdjMjUxOGIyLTUyODQtMTMyNTcyOTQ2MjMuOTk2NTkxMDAw", + ], + "executable": Array [ + "C:\\\\Program Files\\\\OpenSSH-Win64\\\\sshd.exe", + ], + "name": Array [ + "C:\\\\Program Files\\\\OpenSSH-Win64\\\\sshd.exe", + ], + }, + "timestamp": "2021-02-08T21:50:28.3377092Z", + "user": Object { + "domain": Array [ + "NT AUTHORITY", + ], + "name": Array [ + "SYSTEM", + ], + }, + }, + }, + }, + Object { + "cursor": Object { + "tiebreaker": null, + "value": "", + }, + "node": Object { + "_id": "qxymg3cBX5UUcOOYP3Ec", + "_index": ".ds-logs-endpoint.events.security-default-2021.02.05-000005", + "data": Array [ + Object { + "field": "@timestamp", + "value": Array [ + "2021-02-08T21:50:28.3377142Z", + ], + }, + Object { + "field": "event.action", + "value": Array [ + "log_on", + ], + }, + Object { + "field": "event.category", + "value": Array [ + "authentication", + "session", + ], + }, + Object { + "field": "host.name", + "value": Array [ + "win2019-endpoint-mr-pedro", + ], + }, + Object { + "field": "message", + "value": Array [ + "Endpoint security event", + ], + }, + ], + "ecs": Object { + "@timestamp": Array [ + "2021-02-08T21:50:28.3377142Z", + ], + "_id": "qxymg3cBX5UUcOOYP3Ec", + "_index": ".ds-logs-endpoint.events.security-default-2021.02.05-000005", + "agent": Object { + "id": Array [ + "1d15cf9e-3dc7-5b97-f586-743f7c2518b2", + ], + "type": Array [ + "endpoint", + ], + }, + "event": Object { + "action": Array [ + "log_on", + ], + "category": Array [ + "authentication", + "session", + ], + "created": Array [ + "2021-02-08T21:50:28.3377142Z", + ], + "dataset": Array [ + "endpoint.events.security", + ], + "id": Array [ + "LzzWB9jjGmCwGMvk++++FG/P", + ], + "kind": Array [ + "event", + ], + "module": Array [ + "endpoint", + ], + "outcome": Array [ + "success", + ], + "type": Array [ + "start", + ], + }, + "host": Object { + "id": Array [ + "d8ad572e-d224-4044-a57d-f5a84c0dfe5d", + ], + "ip": Array [ + "10.128.0.57", + "fe80::9ced:8f1c:880b:3e1f", + "127.0.0.1", + "::1", + ], + "name": Array [ + "win2019-endpoint-mr-pedro", + ], + "os": Object { + "family": Array [ + "windows", + ], + "name": Array [ + "Windows", + ], + }, + }, + "message": Array [ + "Endpoint security event", + ], + "process": Object { + "entity_id": Array [ + "MWQxNWNmOWUtM2RjNy01Yjk3LWY1ODYtNzQzZjdjMjUxOGIyLTU4MC0xMzI1NTA3ODY2Ny45MTg5Njc1MDA=", + ], + "executable": Array [ + "C:\\\\Windows\\\\System32\\\\lsass.exe", + ], + }, + "timestamp": "2021-02-08T21:50:28.3377142Z", + "user": Object { + "domain": Array [ + "NT AUTHORITY", + ], + "name": Array [ + "SYSTEM", + ], + }, + }, + }, + }, + ] + `); }); it('sequence events', async () => { const result = await parseEqlResponse( @@ -201,7 +467,282 @@ describe('Search Strategy EQL helper', () => { }, sequenceResponse ); - expect(result.edges).toMatchInlineSnapshot(`Array []`); + expect(result.edges).toMatchInlineSnapshot(` + Array [ + Object { + "cursor": Object { + "tiebreaker": null, + "value": "", + }, + "node": Object { + "_id": "rBymg3cBX5UUcOOYP3Ec", + "_index": ".ds-logs-endpoint.events.security-default-2021.02.05-000005", + "data": Array [ + Object { + "field": "@timestamp", + "value": Array [ + "2021-02-08T21:50:28.3381013Z", + ], + }, + Object { + "field": "event.category", + "value": Array [], + }, + Object { + "field": "host.name", + "value": Array [ + "win2019-endpoint-mr-pedro", + ], + }, + Object { + "field": "message", + "value": Array [ + "Endpoint security event", + ], + }, + ], + "ecs": Object { + "@timestamp": Array [ + "2021-02-08T21:50:28.3381013Z", + ], + "_id": "rBymg3cBX5UUcOOYP3Ec", + "_index": ".ds-logs-endpoint.events.security-default-2021.02.05-000005", + "agent": Object { + "id": Array [ + "1d15cf9e-3dc7-5b97-f586-743f7c2518b2", + ], + "type": Array [ + "endpoint", + ], + }, + "eql": Object { + "parentId": "rBymg3cBX5UUcOOYP3Ec", + "sequenceNumber": "2-0", + }, + "event": Object { + "category": Array [], + "created": Array [ + "2021-02-08T21:50:28.3381013Z", + ], + "dataset": Array [ + "endpoint.events.security", + ], + "id": Array [ + "LzzWB9jjGmCwGMvk++++FG/Q", + ], + "kind": Array [ + "event", + ], + "module": Array [ + "endpoint", + ], + "type": Array [], + }, + "host": Object { + "id": Array [ + "d8ad572e-d224-4044-a57d-f5a84c0dfe5d", + ], + "ip": Array [ + "10.128.0.57", + "fe80::9ced:8f1c:880b:3e1f", + "127.0.0.1", + "::1", + ], + "name": Array [ + "win2019-endpoint-mr-pedro", + ], + "os": Object { + "family": Array [ + "windows", + ], + "name": Array [ + "Windows", + ], + }, + }, + "message": Array [ + "Endpoint security event", + ], + "process": Object { + "entity_id": Array [ + "MWQxNWNmOWUtM2RjNy01Yjk3LWY1ODYtNzQzZjdjMjUxOGIyLTU4MC0xMzI1NTA3ODY2Ny45MTg5Njc1MDA=", + ], + "executable": Array [ + "C:\\\\Windows\\\\System32\\\\lsass.exe", + ], + }, + "timestamp": "2021-02-08T21:50:28.3381013Z", + "user": Object { + "domain": Array [ + "NT AUTHORITY", + ], + "name": Array [ + "SYSTEM", + ], + }, + }, + }, + }, + Object { + "cursor": Object { + "tiebreaker": null, + "value": "", + }, + "node": Object { + "_id": "pxymg3cBX5UUcOOYP3Ec", + "_index": ".ds-logs-endpoint.events.process-default-2021.02.02-000005", + "data": Array [ + Object { + "field": "@timestamp", + "value": Array [ + "2021-02-08T21:50:28.3446355Z", + ], + }, + Object { + "field": "event.action", + "value": Array [ + "start", + ], + }, + Object { + "field": "event.category", + "value": Array [ + "process", + ], + }, + Object { + "field": "host.name", + "value": Array [ + "win2019-endpoint-mr-pedro", + ], + }, + Object { + "field": "message", + "value": Array [ + "Endpoint process event", + ], + }, + ], + "ecs": Object { + "@timestamp": Array [ + "2021-02-08T21:50:28.3446355Z", + ], + "_id": "pxymg3cBX5UUcOOYP3Ec", + "_index": ".ds-logs-endpoint.events.process-default-2021.02.02-000005", + "agent": Object { + "id": Array [ + "1d15cf9e-3dc7-5b97-f586-743f7c2518b2", + ], + "type": Array [ + "endpoint", + ], + }, + "eql": Object { + "parentId": "rBymg3cBX5UUcOOYP3Ec", + "sequenceNumber": "2-1", + }, + "event": Object { + "action": Array [ + "start", + ], + "category": Array [ + "process", + ], + "created": Array [ + "2021-02-08T21:50:28.3446355Z", + ], + "dataset": Array [ + "endpoint.events.process", + ], + "id": Array [ + "LzzWB9jjGmCwGMvk++++FG/K", + ], + "kind": Array [ + "event", + ], + "module": Array [ + "endpoint", + ], + "type": Array [ + "start", + ], + }, + "host": Object { + "id": Array [ + "d8ad572e-d224-4044-a57d-f5a84c0dfe5d", + ], + "ip": Array [ + "10.128.0.57", + "fe80::9ced:8f1c:880b:3e1f", + "127.0.0.1", + "::1", + ], + "name": Array [ + "win2019-endpoint-mr-pedro", + ], + "os": Object { + "family": Array [ + "windows", + ], + "name": Array [ + "Windows", + ], + }, + }, + "message": Array [ + "Endpoint process event", + ], + "process": Object { + "args": Array [ + "C:\\\\Program Files\\\\OpenSSH-Win64\\\\sshd.exe", + "-y", + ], + "entity_id": Array [ + "MWQxNWNmOWUtM2RjNy01Yjk3LWY1ODYtNzQzZjdjMjUxOGIyLTYzNjgtMTMyNTcyOTQ2MjguMzQ0NjM1NTAw", + ], + "executable": Array [ + "C:\\\\Program Files\\\\OpenSSH-Win64\\\\sshd.exe", + ], + "hash": Object { + "md5": Array [ + "331ba0e529810ef718dd3efbd1242302", + ], + "sha1": Array [ + "631244d731f406394c17c7dfd85203e317c74814", + ], + "sha256": Array [ + "e6a972f9db27de18be225095b3b3141b945be8aadc4014c8704ae5acafe3e8e0", + ], + }, + "name": Array [ + "sshd.exe", + ], + "parent": Object { + "name": Array [ + "sshd.exe", + ], + "pid": Array [ + "5284", + ], + }, + "pid": Array [ + "6368", + ], + }, + "timestamp": "2021-02-08T21:50:28.3446355Z", + "user": Object { + "domain": Array [ + "", + ], + "name": Array [ + "", + ], + }, + }, + }, + }, + ] + `); }); }); }); From 1b7b094767a40036ec3dce79091c3134d2b81d40 Mon Sep 17 00:00:00 2001 From: Cee Chen <549407+cee-chen@users.noreply.github.com> Date: Mon, 23 Oct 2023 17:04:35 -0700 Subject: [PATCH 47/68] [Session View] Remove `color="ghost"` buttons (#169305) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## Summary 👋 Hey y'all - EUI will shortly be deprecating the `ghost` color in all button components (see https://eui.elastic.co/v89.0.0/#/navigation/button#ghost-vs-dark-mode). I'm opening this PR ahead of time for your team so you can test this migration and ensure no regressions have occurred as a result. While I'm confident in the theory of the changes, I'm not totally sure how to get to this actual terminal UI to test that the changes look good in-browser - I'd appreciate your team's help QAing! ### Checklist - [x] Tested in light and dark mode --- .../public/components/tty_player/index.tsx | 51 +++++++++++-------- .../components/tty_player_controls/index.tsx | 4 +- .../components/tty_text_sizer/index.tsx | 4 +- 3 files changed, 34 insertions(+), 25 deletions(-) diff --git a/x-pack/plugins/session_view/public/components/tty_player/index.tsx b/x-pack/plugins/session_view/public/components/tty_player/index.tsx index 2c795dfdccb5ab..98e8dad8840cb7 100644 --- a/x-pack/plugins/session_view/public/components/tty_player/index.tsx +++ b/x-pack/plugins/session_view/public/components/tty_player/index.tsx @@ -5,7 +5,14 @@ * 2.0. */ import React, { useRef, useState, useCallback, useMemo, useEffect } from 'react'; -import { EuiPanel, EuiFlexGroup, EuiFlexItem, EuiButtonIcon, EuiButton } from '@elastic/eui'; +import { + EuiPanel, + EuiFlexGroup, + EuiFlexItem, + EuiButtonIcon, + EuiButton, + EuiThemeProvider, +} from '@elastic/eui'; import { useKibana } from '@kbn/kibana-react-plugin/public'; import { CoreStart } from '@kbn/core/public'; import useResizeObserver from 'use-resize-observer'; @@ -217,26 +224,28 @@ export const TTYPlayer = ({
- - } - /> + + + } + /> +

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 |EF*L-=kfwN8ndv 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 literal 0 HcmV?d00001 diff --git a/docs/management/cases/images/cases-custom-fields.png b/docs/management/cases/images/cases-custom-fields.png new file mode 100644 index 0000000000000000000000000000000000000000..07c3b4c2a089580a3b2e8b04e472f57763f5008e GIT binary patch literal 353829 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

); }; diff --git a/x-pack/plugins/session_view/public/components/tty_player_controls/index.tsx b/x-pack/plugins/session_view/public/components/tty_player_controls/index.tsx index e244907cd74ac9..841ec30fa5d561 100644 --- a/x-pack/plugins/session_view/public/components/tty_player_controls/index.tsx +++ b/x-pack/plugins/session_view/public/components/tty_player_controls/index.tsx @@ -59,7 +59,7 @@ export const TTYPlayerControls = ({ const commonButtonProps: Partial = { display: 'empty', size: 's', - color: 'ghost', + color: 'text', css: styles.controlButton, }; @@ -188,7 +188,7 @@ export const TTYPlayerControls = ({ onClick={handleViewInSession} iconType="arrowRight" aria-label={VIEW_IN_SESSION} - color="ghost" + color="text" > {VIEW_IN_SESSION} diff --git a/x-pack/plugins/session_view/public/components/tty_text_sizer/index.tsx b/x-pack/plugins/session_view/public/components/tty_text_sizer/index.tsx index 9f5f409922439f..a8b4a034223672 100644 --- a/x-pack/plugins/session_view/public/components/tty_text_sizer/index.tsx +++ b/x-pack/plugins/session_view/public/components/tty_text_sizer/index.tsx @@ -28,7 +28,7 @@ export interface TTYTextSizerDeps { const commonButtonProps: Partial = { display: 'empty', size: 's', - color: 'ghost', + color: 'text', }; const LINE_HEIGHT_SCALE_RATIO = 1.3; @@ -95,7 +95,7 @@ export const TTYTextSizer = ({ iconType={fit ? 'expand' : 'minimize'} onClick={onToggleFit} size="s" - color="ghost" + color="text" /> From c295c67b802c7482466c9c02e4929b79f75638f0 Mon Sep 17 00:00:00 2001 From: Yara Tercero Date: Mon, 23 Oct 2023 17:21:10 -0700 Subject: [PATCH 48/68] [Security Solution][DE] Investigation fields telemetry (#169482) ## Summary Adds telemetry to determine the number of users utilizing `investigation_fields` in 8.10. We want to eventually deprecate use of this field as an array (in 8.10) in favor of the new object type. Utilizes the telemetry detections rule usage logic to add a new field `legacy_investigation_fields` - which is a total count of the number of rules utilizing the legacy `investigation_fields` (the field as an array). --- .../server/usage/collector.ts | 56 ++++ .../usage/detections/get_metrics.test.ts | 8 + .../detections/rules/get_initial_usage.ts | 8 + .../get_rule_object_correlations.ts | 1 + .../server/usage/detections/rules/types.ts | 2 + .../detections/rules/update_usage.test.ts | 107 ++++--- .../rules/usage_utils/update_query_usage.ts | 3 + .../rules/usage_utils/update_total_usage.ts | 3 + .../schema/xpack_plugins.json | 48 ++++ .../usage_collector/detection_rules.ts | 62 ++++ .../legacy_investigation_fields/data.json | 271 ++++++++++++++++++ 11 files changed, 530 insertions(+), 39 deletions(-) create mode 100644 x-pack/test/functional/es_archives/security_solution/legacy_investigation_fields/data.json diff --git a/x-pack/plugins/security_solution/server/usage/collector.ts b/x-pack/plugins/security_solution/server/usage/collector.ts index d458f280c5899e..39635b9abda948 100644 --- a/x-pack/plugins/security_solution/server/usage/collector.ts +++ b/x-pack/plugins/security_solution/server/usage/collector.ts @@ -71,6 +71,13 @@ export const registerCollector: RegisterCollector = ({ type: 'long', _meta: { description: 'Number of notifications enabled' }, }, + legacy_investigation_fields: { + type: 'long', + _meta: { + description: + 'Number of rules using the legacy investigation fields type introduced only in 8.10 ESS', + }, + }, }, threshold: { enabled: { @@ -107,6 +114,13 @@ export const registerCollector: RegisterCollector = ({ type: 'long', _meta: { description: 'Number of notifications enabled' }, }, + legacy_investigation_fields: { + type: 'long', + _meta: { + description: + 'Number of rules using the legacy investigation fields type introduced only in 8.10 ESS', + }, + }, }, eql: { enabled: { type: 'long', _meta: { description: 'Number of eql rules enabled' } }, @@ -135,6 +149,13 @@ export const registerCollector: RegisterCollector = ({ type: 'long', _meta: { description: 'Number of notifications enabled' }, }, + legacy_investigation_fields: { + type: 'long', + _meta: { + description: + 'Number of rules using the legacy investigation fields type introduced only in 8.10 ESS', + }, + }, }, machine_learning: { enabled: { @@ -171,6 +192,13 @@ export const registerCollector: RegisterCollector = ({ type: 'long', _meta: { description: 'Number of notifications enabled' }, }, + legacy_investigation_fields: { + type: 'long', + _meta: { + description: + 'Number of rules using the legacy investigation fields type introduced only in 8.10 ESS', + }, + }, }, threat_match: { enabled: { @@ -207,6 +235,13 @@ export const registerCollector: RegisterCollector = ({ type: 'long', _meta: { description: 'Number of notifications enabled' }, }, + legacy_investigation_fields: { + type: 'long', + _meta: { + description: + 'Number of rules using the legacy investigation fields type introduced only in 8.10 ESS', + }, + }, }, new_terms: { enabled: { @@ -243,6 +278,13 @@ export const registerCollector: RegisterCollector = ({ type: 'long', _meta: { description: 'Number of notifications enabled' }, }, + legacy_investigation_fields: { + type: 'long', + _meta: { + description: + 'Number of rules using the legacy investigation fields type introduced only in 8.10 ESS', + }, + }, }, elastic_total: { enabled: { type: 'long', _meta: { description: 'Number of elastic rules enabled' } }, @@ -274,6 +316,13 @@ export const registerCollector: RegisterCollector = ({ type: 'long', _meta: { description: 'Number of notifications enabled' }, }, + legacy_investigation_fields: { + type: 'long', + _meta: { + description: + 'Number of rules using the legacy investigation fields type introduced only in 8.10 ESS', + }, + }, }, custom_total: { enabled: { type: 'long', _meta: { description: 'Number of custom rules enabled' } }, @@ -302,6 +351,13 @@ export const registerCollector: RegisterCollector = ({ type: 'long', _meta: { description: 'Number of notifications enabled' }, }, + legacy_investigation_fields: { + type: 'long', + _meta: { + description: + 'Number of rules using the legacy investigation fields type introduced only in 8.10 ESS', + }, + }, }, }, detection_rule_detail: { diff --git a/x-pack/plugins/security_solution/server/usage/detections/get_metrics.test.ts b/x-pack/plugins/security_solution/server/usage/detections/get_metrics.test.ts index afed10119756ed..6c4d3c5a377d9e 100644 --- a/x-pack/plugins/security_solution/server/usage/detections/get_metrics.test.ts +++ b/x-pack/plugins/security_solution/server/usage/detections/get_metrics.test.ts @@ -99,6 +99,7 @@ describe('Detections Usage and Metrics', () => { updated_on: '2021-03-23T17:15:59.634Z', has_legacy_notification: false, has_notification: false, + has_legacy_investigation_field: false, }, ], detection_rule_usage: { @@ -112,6 +113,7 @@ describe('Detections Usage and Metrics', () => { legacy_notifications_disabled: 0, notifications_enabled: 0, notifications_disabled: 0, + legacy_investigation_fields: 0, }, elastic_total: { alerts: 3400, @@ -122,6 +124,7 @@ describe('Detections Usage and Metrics', () => { legacy_notifications_disabled: 0, notifications_enabled: 0, notifications_disabled: 0, + legacy_investigation_fields: 0, }, }, }, @@ -163,6 +166,7 @@ describe('Detections Usage and Metrics', () => { legacy_notifications_disabled: 0, notifications_enabled: 0, notifications_disabled: 0, + legacy_investigation_fields: 0, }, query: { alerts: 800, @@ -173,6 +177,7 @@ describe('Detections Usage and Metrics', () => { legacy_notifications_disabled: 0, notifications_enabled: 0, notifications_disabled: 0, + legacy_investigation_fields: 0, }, }, }, @@ -217,6 +222,7 @@ describe('Detections Usage and Metrics', () => { updated_on: '2021-03-23T17:15:59.634Z', has_legacy_notification: false, has_notification: false, + has_legacy_investigation_field: false, }, ], detection_rule_usage: { @@ -230,6 +236,7 @@ describe('Detections Usage and Metrics', () => { legacy_notifications_disabled: 0, notifications_enabled: 0, notifications_disabled: 0, + legacy_investigation_fields: 0, }, query: { alerts: 0, @@ -240,6 +247,7 @@ describe('Detections Usage and Metrics', () => { legacy_notifications_disabled: 0, notifications_enabled: 0, notifications_disabled: 0, + legacy_investigation_fields: 0, }, }, }, diff --git a/x-pack/plugins/security_solution/server/usage/detections/rules/get_initial_usage.ts b/x-pack/plugins/security_solution/server/usage/detections/rules/get_initial_usage.ts index 3ad6b5740b53ee..dfe19bff7079af 100644 --- a/x-pack/plugins/security_solution/server/usage/detections/rules/get_initial_usage.ts +++ b/x-pack/plugins/security_solution/server/usage/detections/rules/get_initial_usage.ts @@ -26,6 +26,7 @@ export const getInitialRulesUsage = (): RulesTypeUsage => ({ legacy_notifications_disabled: 0, notifications_enabled: 0, notifications_disabled: 0, + legacy_investigation_fields: 0, }, threshold: { enabled: 0, @@ -36,6 +37,7 @@ export const getInitialRulesUsage = (): RulesTypeUsage => ({ legacy_notifications_disabled: 0, notifications_enabled: 0, notifications_disabled: 0, + legacy_investigation_fields: 0, }, eql: { enabled: 0, @@ -46,6 +48,7 @@ export const getInitialRulesUsage = (): RulesTypeUsage => ({ legacy_notifications_disabled: 0, notifications_enabled: 0, notifications_disabled: 0, + legacy_investigation_fields: 0, }, machine_learning: { enabled: 0, @@ -56,6 +59,7 @@ export const getInitialRulesUsage = (): RulesTypeUsage => ({ legacy_notifications_disabled: 0, notifications_enabled: 0, notifications_disabled: 0, + legacy_investigation_fields: 0, }, threat_match: { enabled: 0, @@ -66,6 +70,7 @@ export const getInitialRulesUsage = (): RulesTypeUsage => ({ legacy_notifications_disabled: 0, notifications_enabled: 0, notifications_disabled: 0, + legacy_investigation_fields: 0, }, new_terms: { enabled: 0, @@ -76,6 +81,7 @@ export const getInitialRulesUsage = (): RulesTypeUsage => ({ legacy_notifications_disabled: 0, notifications_enabled: 0, notifications_disabled: 0, + legacy_investigation_fields: 0, }, elastic_total: { enabled: 0, @@ -86,6 +92,7 @@ export const getInitialRulesUsage = (): RulesTypeUsage => ({ legacy_notifications_disabled: 0, notifications_enabled: 0, notifications_disabled: 0, + legacy_investigation_fields: 0, }, custom_total: { enabled: 0, @@ -96,6 +103,7 @@ export const getInitialRulesUsage = (): RulesTypeUsage => ({ legacy_notifications_disabled: 0, notifications_enabled: 0, notifications_disabled: 0, + legacy_investigation_fields: 0, }, }); diff --git a/x-pack/plugins/security_solution/server/usage/detections/rules/transform_utils/get_rule_object_correlations.ts b/x-pack/plugins/security_solution/server/usage/detections/rules/transform_utils/get_rule_object_correlations.ts index 5387c63aace3e6..116015b25db9d8 100644 --- a/x-pack/plugins/security_solution/server/usage/detections/rules/transform_utils/get_rule_object_correlations.ts +++ b/x-pack/plugins/security_solution/server/usage/detections/rules/transform_utils/get_rule_object_correlations.ts @@ -55,6 +55,7 @@ export const getRuleObjectCorrelations = ({ cases_count_total: casesRuleIds.get(ruleId) || 0, has_legacy_notification: hasLegacyNotification, has_notification: hasNotification, + has_legacy_investigation_field: Array.isArray(attributes.params.investigationFields), }; }); }; diff --git a/x-pack/plugins/security_solution/server/usage/detections/rules/types.ts b/x-pack/plugins/security_solution/server/usage/detections/rules/types.ts index 84fb656f793d41..1bbe1b8f01f0ed 100644 --- a/x-pack/plugins/security_solution/server/usage/detections/rules/types.ts +++ b/x-pack/plugins/security_solution/server/usage/detections/rules/types.ts @@ -14,6 +14,7 @@ export interface FeatureTypeUsage { legacy_notifications_disabled: number; notifications_enabled: number; notifications_disabled: number; + legacy_investigation_fields: number; } export interface RulesTypeUsage { @@ -46,6 +47,7 @@ export interface RuleMetric { cases_count_total: number; has_legacy_notification: boolean; has_notification: boolean; + has_legacy_investigation_field: boolean; } /** diff --git a/x-pack/plugins/security_solution/server/usage/detections/rules/update_usage.test.ts b/x-pack/plugins/security_solution/server/usage/detections/rules/update_usage.test.ts index b029d37e0082de..8bdb4c582f0ee7 100644 --- a/x-pack/plugins/security_solution/server/usage/detections/rules/update_usage.test.ts +++ b/x-pack/plugins/security_solution/server/usage/detections/rules/update_usage.test.ts @@ -17,6 +17,7 @@ interface StubRuleOptions { caseCount: number; hasLegacyNotification: boolean; hasNotification: boolean; + hasLegacyInvestigationField: boolean; } const createStubRule = ({ @@ -27,6 +28,7 @@ const createStubRule = ({ caseCount, hasLegacyNotification, hasNotification, + hasLegacyInvestigationField, }: StubRuleOptions): RuleMetric => ({ rule_name: 'rule-name', rule_id: 'id-123', @@ -40,6 +42,7 @@ const createStubRule = ({ cases_count_total: caseCount, has_legacy_notification: hasLegacyNotification, has_notification: hasNotification, + has_legacy_investigation_field: hasLegacyInvestigationField, }); describe('Detections Usage and Metrics', () => { @@ -53,6 +56,7 @@ describe('Detections Usage and Metrics', () => { caseCount: 1, hasLegacyNotification: false, hasNotification: false, + hasLegacyInvestigationField: false, }); const usage = updateRuleUsage(stubRule, getInitialRulesUsage()); @@ -67,6 +71,7 @@ describe('Detections Usage and Metrics', () => { legacy_notifications_disabled: 0, notifications_enabled: 0, notifications_disabled: 0, + legacy_investigation_fields: 0, }, eql: { alerts: 1, @@ -77,6 +82,7 @@ describe('Detections Usage and Metrics', () => { legacy_notifications_disabled: 0, notifications_enabled: 0, notifications_disabled: 0, + legacy_investigation_fields: 0, }, }); }); @@ -90,6 +96,7 @@ describe('Detections Usage and Metrics', () => { caseCount: 1, hasLegacyNotification: false, hasNotification: false, + hasLegacyInvestigationField: false, }); const stubQueryRuleOne = createStubRule({ ruleType: 'query', @@ -99,6 +106,7 @@ describe('Detections Usage and Metrics', () => { caseCount: 2, hasLegacyNotification: false, hasNotification: false, + hasLegacyInvestigationField: true, }); const stubQueryRuleTwo = createStubRule({ ruleType: 'query', @@ -108,6 +116,7 @@ describe('Detections Usage and Metrics', () => { caseCount: 2, hasLegacyNotification: false, hasNotification: false, + hasLegacyInvestigationField: false, }); const stubMachineLearningOne = createStubRule({ ruleType: 'machine_learning', @@ -117,6 +126,7 @@ describe('Detections Usage and Metrics', () => { caseCount: 10, hasLegacyNotification: false, hasNotification: false, + hasLegacyInvestigationField: false, }); const stubMachineLearningTwo = createStubRule({ ruleType: 'machine_learning', @@ -126,6 +136,7 @@ describe('Detections Usage and Metrics', () => { caseCount: 44, hasLegacyNotification: false, hasNotification: false, + hasLegacyInvestigationField: false, }); let usage = updateRuleUsage(stubEqlRule, getInitialRulesUsage()); @@ -145,6 +156,7 @@ describe('Detections Usage and Metrics', () => { legacy_notifications_disabled: 0, notifications_enabled: 0, notifications_disabled: 0, + legacy_investigation_fields: 0, }, elastic_total: { alerts: 28, @@ -155,6 +167,7 @@ describe('Detections Usage and Metrics', () => { legacy_notifications_disabled: 0, notifications_enabled: 0, notifications_disabled: 0, + legacy_investigation_fields: 1, }, eql: { alerts: 1, @@ -165,6 +178,7 @@ describe('Detections Usage and Metrics', () => { legacy_notifications_disabled: 0, notifications_enabled: 0, notifications_disabled: 0, + legacy_investigation_fields: 0, }, machine_learning: { alerts: 22, @@ -175,6 +189,7 @@ describe('Detections Usage and Metrics', () => { legacy_notifications_disabled: 0, notifications_enabled: 0, notifications_disabled: 0, + legacy_investigation_fields: 0, }, query: { alerts: 10, @@ -185,51 +200,58 @@ describe('Detections Usage and Metrics', () => { legacy_notifications_disabled: 0, notifications_enabled: 0, notifications_disabled: 0, + legacy_investigation_fields: 1, }, }); }); - describe('table tests of "ruleType", "enabled", "elasticRule", and "legacyNotification"', () => { + describe('table tests of "ruleType", "enabled", "elasticRule", "legacyNotification", and "hasLegacyInvestigationField"', () => { test.each` - ruleType | enabled | hasLegacyNotification | hasNotification | expectedLegacyNotificationsEnabled | expectedLegacyNotificationsDisabled | expectedNotificationsEnabled | expectedNotificationsDisabled - ${'eql'} | ${true} | ${true} | ${false} | ${1} | ${0} | ${0} | ${0} - ${'eql'} | ${true} | ${false} | ${true} | ${0} | ${0} | ${1} | ${0} - ${'eql'} | ${false} | ${false} | ${true} | ${0} | ${0} | ${0} | ${1} - ${'eql'} | ${true} | ${false} | ${true} | ${0} | ${0} | ${1} | ${0} - ${'eql'} | ${false} | ${true} | ${false} | ${0} | ${1} | ${0} | ${0} - ${'eql'} | ${false} | ${false} | ${false} | ${0} | ${0} | ${0} | ${0} - ${'query'} | ${true} | ${true} | ${false} | ${1} | ${0} | ${0} | ${0} - ${'query'} | ${true} | ${false} | ${true} | ${0} | ${0} | ${1} | ${0} - ${'query'} | ${false} | ${false} | ${true} | ${0} | ${0} | ${0} | ${1} - ${'query'} | ${true} | ${false} | ${true} | ${0} | ${0} | ${1} | ${0} - ${'query'} | ${false} | ${true} | ${false} | ${0} | ${1} | ${0} | ${0} - ${'query'} | ${false} | ${false} | ${false} | ${0} | ${0} | ${0} | ${0} - ${'threshold'} | ${true} | ${true} | ${false} | ${1} | ${0} | ${0} | ${0} - ${'threshold'} | ${true} | ${false} | ${true} | ${0} | ${0} | ${1} | ${0} - ${'threshold'} | ${false} | ${false} | ${true} | ${0} | ${0} | ${0} | ${1} - ${'threshold'} | ${true} | ${false} | ${true} | ${0} | ${0} | ${1} | ${0} - ${'threshold'} | ${false} | ${true} | ${false} | ${0} | ${1} | ${0} | ${0} - ${'threshold'} | ${false} | ${false} | ${false} | ${0} | ${0} | ${0} | ${0} - ${'machine_learning'} | ${true} | ${true} | ${false} | ${1} | ${0} | ${0} | ${0} - ${'machine_learning'} | ${true} | ${false} | ${true} | ${0} | ${0} | ${1} | ${0} - ${'machine_learning'} | ${false} | ${false} | ${true} | ${0} | ${0} | ${0} | ${1} - ${'machine_learning'} | ${true} | ${false} | ${true} | ${0} | ${0} | ${1} | ${0} - ${'machine_learning'} | ${false} | ${true} | ${false} | ${0} | ${1} | ${0} | ${0} - ${'machine_learning'} | ${false} | ${false} | ${false} | ${0} | ${0} | ${0} | ${0} - ${'threat_match'} | ${true} | ${true} | ${false} | ${1} | ${0} | ${0} | ${0} - ${'threat_match'} | ${true} | ${false} | ${true} | ${0} | ${0} | ${1} | ${0} - ${'threat_match'} | ${false} | ${false} | ${true} | ${0} | ${0} | ${0} | ${1} - ${'threat_match'} | ${true} | ${false} | ${true} | ${0} | ${0} | ${1} | ${0} - ${'threat_match'} | ${false} | ${true} | ${false} | ${0} | ${1} | ${0} | ${0} - ${'threat_match'} | ${false} | ${false} | ${false} | ${0} | ${0} | ${0} | ${0} - ${'new_terms'} | ${true} | ${true} | ${false} | ${1} | ${0} | ${0} | ${0} - ${'new_terms'} | ${true} | ${false} | ${true} | ${0} | ${0} | ${1} | ${0} - ${'new_terms'} | ${false} | ${false} | ${true} | ${0} | ${0} | ${0} | ${1} - ${'new_terms'} | ${true} | ${false} | ${true} | ${0} | ${0} | ${1} | ${0} - ${'new_terms'} | ${false} | ${true} | ${false} | ${0} | ${1} | ${0} | ${0} - ${'new_terms'} | ${false} | ${false} | ${false} | ${0} | ${0} | ${0} | ${0} + ruleType | enabled | hasLegacyNotification | hasNotification | expectedLegacyNotificationsEnabled | expectedLegacyNotificationsDisabled | expectedNotificationsEnabled | expectedNotificationsDisabled | hasLegacyInvestigationField + ${'eql'} | ${true} | ${true} | ${false} | ${1} | ${0} | ${0} | ${0} | ${0} + ${'eql'} | ${true} | ${false} | ${true} | ${0} | ${0} | ${1} | ${0} | ${0} + ${'eql'} | ${false} | ${false} | ${true} | ${0} | ${0} | ${0} | ${1} | ${0} + ${'eql'} | ${true} | ${false} | ${true} | ${0} | ${0} | ${1} | ${0} | ${0} + ${'eql'} | ${false} | ${true} | ${false} | ${0} | ${1} | ${0} | ${0} | ${0} + ${'eql'} | ${false} | ${false} | ${false} | ${0} | ${0} | ${0} | ${0} | ${0} + ${'eql'} | ${false} | ${false} | ${false} | ${0} | ${0} | ${0} | ${0} | ${1} + ${'query'} | ${true} | ${true} | ${false} | ${1} | ${0} | ${0} | ${0} | ${0} + ${'query'} | ${true} | ${false} | ${true} | ${0} | ${0} | ${1} | ${0} | ${0} + ${'query'} | ${false} | ${false} | ${true} | ${0} | ${0} | ${0} | ${1} | ${0} + ${'query'} | ${true} | ${false} | ${true} | ${0} | ${0} | ${1} | ${0} | ${0} + ${'query'} | ${false} | ${true} | ${false} | ${0} | ${1} | ${0} | ${0} | ${0} + ${'query'} | ${false} | ${false} | ${false} | ${0} | ${0} | ${0} | ${0} | ${0} + ${'query'} | ${false} | ${false} | ${false} | ${0} | ${0} | ${0} | ${0} | ${1} + ${'threshold'} | ${true} | ${true} | ${false} | ${1} | ${0} | ${0} | ${0} | ${0} + ${'threshold'} | ${true} | ${false} | ${true} | ${0} | ${0} | ${1} | ${0} | ${0} + ${'threshold'} | ${false} | ${false} | ${true} | ${0} | ${0} | ${0} | ${1} | ${0} + ${'threshold'} | ${true} | ${false} | ${true} | ${0} | ${0} | ${1} | ${0} | ${0} + ${'threshold'} | ${false} | ${true} | ${false} | ${0} | ${1} | ${0} | ${0} | ${0} + ${'threshold'} | ${false} | ${false} | ${false} | ${0} | ${0} | ${0} | ${0} | ${0} + ${'threshold'} | ${false} | ${false} | ${false} | ${0} | ${0} | ${0} | ${0} | ${1} + ${'machine_learning'} | ${true} | ${true} | ${false} | ${1} | ${0} | ${0} | ${0} | ${0} + ${'machine_learning'} | ${true} | ${false} | ${true} | ${0} | ${0} | ${1} | ${0} | ${0} + ${'machine_learning'} | ${false} | ${false} | ${true} | ${0} | ${0} | ${0} | ${1} | ${0} + ${'machine_learning'} | ${true} | ${false} | ${true} | ${0} | ${0} | ${1} | ${0} | ${0} + ${'machine_learning'} | ${false} | ${true} | ${false} | ${0} | ${1} | ${0} | ${0} | ${0} + ${'machine_learning'} | ${false} | ${false} | ${false} | ${0} | ${0} | ${0} | ${0} | ${0} + ${'machine_learning'} | ${false} | ${false} | ${false} | ${0} | ${0} | ${0} | ${0} | ${1} + ${'threat_match'} | ${true} | ${true} | ${false} | ${1} | ${0} | ${0} | ${0} | ${0} + ${'threat_match'} | ${true} | ${false} | ${true} | ${0} | ${0} | ${1} | ${0} | ${0} + ${'threat_match'} | ${false} | ${false} | ${true} | ${0} | ${0} | ${0} | ${1} | ${0} + ${'threat_match'} | ${true} | ${false} | ${true} | ${0} | ${0} | ${1} | ${0} | ${0} + ${'threat_match'} | ${false} | ${true} | ${false} | ${0} | ${1} | ${0} | ${0} | ${0} + ${'threat_match'} | ${false} | ${false} | ${false} | ${0} | ${0} | ${0} | ${0} | ${0} + ${'threat_match'} | ${false} | ${false} | ${false} | ${0} | ${0} | ${0} | ${0} | ${1} + ${'new_terms'} | ${true} | ${true} | ${false} | ${1} | ${0} | ${0} | ${0} | ${0} + ${'new_terms'} | ${true} | ${false} | ${true} | ${0} | ${0} | ${1} | ${0} | ${0} + ${'new_terms'} | ${false} | ${false} | ${true} | ${0} | ${0} | ${0} | ${1} | ${0} + ${'new_terms'} | ${true} | ${false} | ${true} | ${0} | ${0} | ${1} | ${0} | ${0} + ${'new_terms'} | ${false} | ${true} | ${false} | ${0} | ${1} | ${0} | ${0} | ${0} + ${'new_terms'} | ${false} | ${false} | ${false} | ${0} | ${0} | ${0} | ${0} | ${0} + ${'new_terms'} | ${false} | ${false} | ${false} | ${0} | ${0} | ${0} | ${0} | ${1} `( - 'expect { "ruleType": $ruleType, "enabled": $enabled, "hasLegacyNotification": $hasLegacyNotification, "hasNotification": $hasNotification } to equal { legacy_notifications_enabled: $expectedLegacyNotificationsEnabled, legacy_notifications_disabled: $expectedLegacyNotificationsDisabled, notifications_enabled: $expectedNotificationsEnabled, notifications_disabled, $expectedNotificationsDisabled }', + 'expect { "ruleType": $ruleType, "enabled": $enabled, "hasLegacyNotification": $hasLegacyNotification, "hasNotification": $hasNotification, hasLegacyInvestigationField: $hasLegacyInvestigationField } to equal { legacy_notifications_enabled: $expectedLegacyNotificationsEnabled, legacy_notifications_disabled: $expectedLegacyNotificationsDisabled, notifications_enabled: $expectedNotificationsEnabled, notifications_disabled, $expectedNotificationsDisabled, hasLegacyInvestigationField: $hasLegacyInvestigationField }', ({ ruleType, enabled, @@ -239,6 +261,7 @@ describe('Detections Usage and Metrics', () => { expectedLegacyNotificationsDisabled, expectedNotificationsEnabled, expectedNotificationsDisabled, + hasLegacyInvestigationField, }) => { const rule1 = createStubRule({ ruleType, @@ -248,6 +271,7 @@ describe('Detections Usage and Metrics', () => { hasNotification, alertCount: 0, caseCount: 0, + hasLegacyInvestigationField, }); const usage = updateRuleUsage(rule1, getInitialRulesUsage()) as ReturnType< typeof updateRuleUsage @@ -258,6 +282,7 @@ describe('Detections Usage and Metrics', () => { legacy_notifications_disabled: expectedLegacyNotificationsDisabled, notifications_enabled: expectedNotificationsEnabled, notifications_disabled: expectedNotificationsDisabled, + legacy_investigation_fields: hasLegacyInvestigationField ? 1 : 0, }) ); @@ -270,6 +295,7 @@ describe('Detections Usage and Metrics', () => { hasNotification, alertCount: 0, caseCount: 0, + hasLegacyInvestigationField, }); const usageAddedByOne = updateRuleUsage(rule2, usage) as ReturnType< typeof updateRuleUsage @@ -289,6 +315,9 @@ describe('Detections Usage and Metrics', () => { expectedNotificationsEnabled !== 0 ? expectedNotificationsEnabled + 1 : 0, notifications_disabled: expectedNotificationsDisabled !== 0 ? expectedNotificationsDisabled + 1 : 0, + legacy_investigation_fields: hasLegacyInvestigationField + ? hasLegacyInvestigationField + 1 + : 0, }) ); } diff --git a/x-pack/plugins/security_solution/server/usage/detections/rules/usage_utils/update_query_usage.ts b/x-pack/plugins/security_solution/server/usage/detections/rules/usage_utils/update_query_usage.ts index 7f40ceec21c8ac..e6c4e897b0b9ba 100644 --- a/x-pack/plugins/security_solution/server/usage/detections/rules/usage_utils/update_query_usage.ts +++ b/x-pack/plugins/security_solution/server/usage/detections/rules/usage_utils/update_query_usage.ts @@ -44,5 +44,8 @@ export const updateQueryUsage = ({ notifications_disabled: notificationDisabled ? usage[ruleType].notifications_disabled + 1 : usage[ruleType].notifications_disabled, + legacy_investigation_fields: detectionRuleMetric.has_legacy_investigation_field + ? usage[ruleType].legacy_investigation_fields + 1 + : usage[ruleType].legacy_investigation_fields, }; }; diff --git a/x-pack/plugins/security_solution/server/usage/detections/rules/usage_utils/update_total_usage.ts b/x-pack/plugins/security_solution/server/usage/detections/rules/usage_utils/update_total_usage.ts index ed0ff37e2a3284..3a63af1ce081ae 100644 --- a/x-pack/plugins/security_solution/server/usage/detections/rules/usage_utils/update_total_usage.ts +++ b/x-pack/plugins/security_solution/server/usage/detections/rules/usage_utils/update_total_usage.ts @@ -47,5 +47,8 @@ export const updateTotalUsage = ({ notifications_disabled: notificationDisabled ? updatedUsage[totalType].notifications_disabled + 1 : updatedUsage[totalType].notifications_disabled, + legacy_investigation_fields: detectionRuleMetric.has_legacy_investigation_field + ? updatedUsage[totalType].legacy_investigation_fields + 1 + : updatedUsage[totalType].legacy_investigation_fields, }; }; 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 abc8827e31ef72..e0d132b13648f9 100644 --- a/x-pack/plugins/telemetry_collection_xpack/schema/xpack_plugins.json +++ b/x-pack/plugins/telemetry_collection_xpack/schema/xpack_plugins.json @@ -12388,6 +12388,12 @@ "_meta": { "description": "Number of notifications enabled" } + }, + "legacy_investigation_fields": { + "type": "long", + "_meta": { + "description": "Number of rules using the legacy investigation fields type introduced only in 8.10 ESS" + } } } }, @@ -12440,6 +12446,12 @@ "_meta": { "description": "Number of notifications enabled" } + }, + "legacy_investigation_fields": { + "type": "long", + "_meta": { + "description": "Number of rules using the legacy investigation fields type introduced only in 8.10 ESS" + } } } }, @@ -12492,6 +12504,12 @@ "_meta": { "description": "Number of notifications enabled" } + }, + "legacy_investigation_fields": { + "type": "long", + "_meta": { + "description": "Number of rules using the legacy investigation fields type introduced only in 8.10 ESS" + } } } }, @@ -12544,6 +12562,12 @@ "_meta": { "description": "Number of notifications enabled" } + }, + "legacy_investigation_fields": { + "type": "long", + "_meta": { + "description": "Number of rules using the legacy investigation fields type introduced only in 8.10 ESS" + } } } }, @@ -12596,6 +12620,12 @@ "_meta": { "description": "Number of notifications enabled" } + }, + "legacy_investigation_fields": { + "type": "long", + "_meta": { + "description": "Number of rules using the legacy investigation fields type introduced only in 8.10 ESS" + } } } }, @@ -12648,6 +12678,12 @@ "_meta": { "description": "Number of notifications enabled" } + }, + "legacy_investigation_fields": { + "type": "long", + "_meta": { + "description": "Number of rules using the legacy investigation fields type introduced only in 8.10 ESS" + } } } }, @@ -12700,6 +12736,12 @@ "_meta": { "description": "Number of notifications enabled" } + }, + "legacy_investigation_fields": { + "type": "long", + "_meta": { + "description": "Number of rules using the legacy investigation fields type introduced only in 8.10 ESS" + } } } }, @@ -12752,6 +12794,12 @@ "_meta": { "description": "Number of notifications enabled" } + }, + "legacy_investigation_fields": { + "type": "long", + "_meta": { + "description": "Number of rules using the legacy investigation fields type introduced only in 8.10 ESS" + } } } } diff --git a/x-pack/test/detection_engine_api_integration/security_and_spaces/group4/telemetry/usage_collector/detection_rules.ts b/x-pack/test/detection_engine_api_integration/security_and_spaces/group4/telemetry/usage_collector/detection_rules.ts index c913b8d6e8a687..73d377fa87f2dd 100644 --- a/x-pack/test/detection_engine_api_integration/security_and_spaces/group4/telemetry/usage_collector/detection_rules.ts +++ b/x-pack/test/detection_engine_api_integration/security_and_spaces/group4/telemetry/usage_collector/detection_rules.ts @@ -81,6 +81,7 @@ export default ({ getService }: FtrProviderContext) => { notifications_disabled: 0, legacy_notifications_disabled: 0, legacy_notifications_enabled: 0, + legacy_investigation_fields: 0, }, custom_total: { ...getInitialDetectionMetrics().detection_rules.detection_rule_usage.custom_total, @@ -89,6 +90,7 @@ export default ({ getService }: FtrProviderContext) => { notifications_disabled: 0, legacy_notifications_disabled: 0, legacy_notifications_enabled: 0, + legacy_investigation_fields: 0, }, }; expect(stats.detection_rules.detection_rule_usage).to.eql(expected); @@ -112,6 +114,7 @@ export default ({ getService }: FtrProviderContext) => { notifications_disabled: 0, legacy_notifications_disabled: 0, legacy_notifications_enabled: 0, + legacy_investigation_fields: 0, }, custom_total: { ...getInitialDetectionMetrics().detection_rules.detection_rule_usage.custom_total, @@ -121,6 +124,7 @@ export default ({ getService }: FtrProviderContext) => { notifications_disabled: 0, legacy_notifications_disabled: 0, legacy_notifications_enabled: 0, + legacy_investigation_fields: 0, }, }; expect(stats.detection_rules.detection_rule_usage).to.eql(expected); @@ -235,6 +239,44 @@ export default ({ getService }: FtrProviderContext) => { expect(stats.detection_rules.detection_rule_usage).to.eql(expected); }); }); + + describe('legacy investigation fields', () => { + before(async () => { + await esArchiver.load( + 'x-pack/test/functional/es_archives/security_solution/legacy_investigation_fields' + ); + }); + + after(async () => { + await esArchiver.unload( + 'x-pack/test/functional/es_archives/security_solution/legacy_investigation_fields' + ); + }); + + it('should show "legacy_investigation_fields" to be greater than 0 when a rule has "investigation_fields" set to array or empty array', async () => { + await retry.try(async () => { + const stats = await getStats(supertest, log); + const expected: RulesTypeUsage = { + ...getInitialDetectionMetrics().detection_rules.detection_rule_usage, + query: { + ...getInitialDetectionMetrics().detection_rules.detection_rule_usage.query, + alerts: 0, + enabled: 0, + disabled: 3, + legacy_investigation_fields: 2, + }, + custom_total: { + ...getInitialDetectionMetrics().detection_rules.detection_rule_usage.custom_total, + alerts: 0, + enabled: 0, + disabled: 3, + legacy_investigation_fields: 2, + }, + }; + expect(stats.detection_rules.detection_rule_usage).to.eql(expected); + }); + }); + }); }); describe('"eql" rule type', () => { @@ -283,6 +325,7 @@ export default ({ getService }: FtrProviderContext) => { notifications_disabled: 0, legacy_notifications_disabled: 0, legacy_notifications_enabled: 0, + legacy_investigation_fields: 0, }, custom_total: { ...getInitialDetectionMetrics().detection_rules.detection_rule_usage.custom_total, @@ -292,6 +335,7 @@ export default ({ getService }: FtrProviderContext) => { notifications_disabled: 0, legacy_notifications_disabled: 0, legacy_notifications_enabled: 0, + legacy_investigation_fields: 0, }, }; expect(stats.detection_rules.detection_rule_usage).to.eql(expected); @@ -428,6 +472,7 @@ export default ({ getService }: FtrProviderContext) => { notifications_disabled: 0, legacy_notifications_disabled: 0, legacy_notifications_enabled: 0, + legacy_investigation_fields: 0, }, custom_total: { ...getInitialDetectionMetrics().detection_rules.detection_rule_usage.custom_total, @@ -436,6 +481,7 @@ export default ({ getService }: FtrProviderContext) => { notifications_disabled: 0, legacy_notifications_disabled: 0, legacy_notifications_enabled: 0, + legacy_investigation_fields: 0, }, }; expect(stats.detection_rules.detection_rule_usage).to.eql(expected); @@ -465,6 +511,7 @@ export default ({ getService }: FtrProviderContext) => { notifications_disabled: 0, legacy_notifications_disabled: 0, legacy_notifications_enabled: 0, + legacy_investigation_fields: 0, }, custom_total: { ...getInitialDetectionMetrics().detection_rules.detection_rule_usage.custom_total, @@ -474,6 +521,7 @@ export default ({ getService }: FtrProviderContext) => { notifications_disabled: 0, legacy_notifications_disabled: 0, legacy_notifications_enabled: 0, + legacy_investigation_fields: 0, }, }; expect(stats.detection_rules.detection_rule_usage).to.eql(expected); @@ -629,6 +677,7 @@ export default ({ getService }: FtrProviderContext) => { notifications_disabled: 0, legacy_notifications_disabled: 0, legacy_notifications_enabled: 0, + legacy_investigation_fields: 0, }, custom_total: { ...getInitialDetectionMetrics().detection_rules.detection_rule_usage.custom_total, @@ -637,6 +686,7 @@ export default ({ getService }: FtrProviderContext) => { notifications_disabled: 0, legacy_notifications_disabled: 0, legacy_notifications_enabled: 0, + legacy_investigation_fields: 0, }, }; expect(stats.detection_rules.detection_rule_usage).to.eql(expected); @@ -657,6 +707,7 @@ export default ({ getService }: FtrProviderContext) => { notifications_disabled: 0, legacy_notifications_disabled: 0, legacy_notifications_enabled: 0, + legacy_investigation_fields: 0, }, custom_total: { ...getInitialDetectionMetrics().detection_rules.detection_rule_usage.custom_total, @@ -665,6 +716,7 @@ export default ({ getService }: FtrProviderContext) => { notifications_disabled: 0, legacy_notifications_disabled: 0, legacy_notifications_enabled: 0, + legacy_investigation_fields: 0, }, }; expect(stats.detection_rules.detection_rule_usage).to.eql(expected); @@ -787,6 +839,7 @@ export default ({ getService }: FtrProviderContext) => { notifications_disabled: 0, legacy_notifications_disabled: 0, legacy_notifications_enabled: 0, + legacy_investigation_fields: 0, }, custom_total: { ...getInitialDetectionMetrics().detection_rules.detection_rule_usage.custom_total, @@ -795,6 +848,7 @@ export default ({ getService }: FtrProviderContext) => { notifications_disabled: 0, legacy_notifications_disabled: 0, legacy_notifications_enabled: 0, + legacy_investigation_fields: 0, }, }; expect(stats.detection_rules.detection_rule_usage).to.eql(expected); @@ -833,6 +887,7 @@ export default ({ getService }: FtrProviderContext) => { notifications_disabled: 0, legacy_notifications_disabled: 0, legacy_notifications_enabled: 0, + legacy_investigation_fields: 0, }, custom_total: { ...getInitialDetectionMetrics().detection_rules.detection_rule_usage.custom_total, @@ -842,6 +897,7 @@ export default ({ getService }: FtrProviderContext) => { notifications_disabled: 0, legacy_notifications_disabled: 0, legacy_notifications_enabled: 0, + legacy_investigation_fields: 0, }, }; expect(stats.detection_rules.detection_rule_usage).to.eql(expected); @@ -1016,6 +1072,7 @@ export default ({ getService }: FtrProviderContext) => { legacy_notifications_disabled: 0, notifications_enabled: 0, notifications_disabled: 0, + legacy_investigation_fields: 0, }); }); }); @@ -1046,6 +1103,7 @@ export default ({ getService }: FtrProviderContext) => { cases_count_total: 0, has_legacy_notification: false, has_notification: false, + has_legacy_investigation_field: false, }); }); }); @@ -1083,6 +1141,7 @@ export default ({ getService }: FtrProviderContext) => { cases_count_total: 0, has_notification: true, has_legacy_notification: false, + has_legacy_investigation_field: false, }); expect( stats.detection_rules.detection_rule_usage.elastic_total.notifications_disabled @@ -1135,6 +1194,7 @@ export default ({ getService }: FtrProviderContext) => { cases_count_total: 0, has_notification: true, has_legacy_notification: false, + has_legacy_investigation_field: false, }); expect( stats.detection_rules.detection_rule_usage.elastic_total.notifications_disabled @@ -1187,6 +1247,7 @@ export default ({ getService }: FtrProviderContext) => { cases_count_total: 0, has_notification: false, has_legacy_notification: true, + has_legacy_investigation_field: false, }); expect( stats.detection_rules.detection_rule_usage.elastic_total.notifications_disabled @@ -1239,6 +1300,7 @@ export default ({ getService }: FtrProviderContext) => { cases_count_total: 0, has_notification: false, has_legacy_notification: true, + has_legacy_investigation_field: false, }); expect( stats.detection_rules.detection_rule_usage.elastic_total.notifications_disabled diff --git a/x-pack/test/functional/es_archives/security_solution/legacy_investigation_fields/data.json b/x-pack/test/functional/es_archives/security_solution/legacy_investigation_fields/data.json new file mode 100644 index 00000000000000..f16c2d1a9f9d51 --- /dev/null +++ b/x-pack/test/functional/es_archives/security_solution/legacy_investigation_fields/data.json @@ -0,0 +1,271 @@ +{ + "type": "doc", + "value": { + "index": ".kibana_alerting_cases", + "id": "alert:9095ee90-b075-11ec-bb3f-1f063f8e1234", + "source": { + "alert": { + "name":"Test investigation fields", + "tags":["migration"], + "alertTypeId": "siem.queryRule", + "consumer": "siem", + "revision": 0, + "params": { + "author": [], + "description": "a", + "ruleId": "2297be91-894c-4831-830f-b424a0ec84f0", + "falsePositives": [], + "from": "now-360s", + "immutable": false, + "license": "", + "outputIndex": "", + "investigationFields":["client.address","agent.name"], + "meta": { + "from": "1m", + "kibana_siem_app_url": "https://actions.kb.us-central1.gcp.cloud.es.io:9243/app/security" + }, + "maxSignals": 100, + "riskScore": 21, + "riskScoreMapping": [], + "severity": "low", + "severityMapping": [], + "threat": [], + "to": "now", + "references": [], + "version": 1, + "exceptionsList": [], + "type": "query", + "language": "kuery", + "index": [ + "apm-*-transaction*", + "traces-apm*", + "auditbeat-*", + "endgame-*", + "filebeat-*", + "logs-*", + "packetbeat-*", + "winlogbeat-*" + ], + "query": "*:*", + "filters": [] + }, + "schedule": { + "interval": "5m" + }, + "enabled": false, + "actions": [], + "throttle": null, + "notifyWhen": "onActiveAlert", + "apiKeyOwner": null, + "apiKey": null, + "createdBy": "1527796724", + "updatedBy": "1527796724", + "createdAt": "2022-03-30T22:05:53.511Z", + "updatedAt": "2022-03-30T22:05:53.511Z", + "muteAll": false, + "mutedInstanceIds": [], + "executionStatus": { + "status": "ok", + "lastExecutionDate": "2022-03-31T19:53:37.507Z", + "error": null, + "lastDuration": 2377 + }, + "meta": { + "versionApiKeyLastmodified": "8.10.0" + }, + "scheduledTaskId": null, + "legacyId": "9095ee90-b075-11ec-bb3f-1f063f8e0abc" + }, + "type": "alert", + "references": [], + "namespaces": [ + "default" + ], + "typeMigrationVersion": "8.10.0", + "coreMigrationVersion":"8.10.0", + "updated_at": "2022-03-31T19:53:39.885Z" + } + } +} + +{ + "type": "doc", + "value": { + "index": ".kibana_alerting_cases", + "id": "alert:9095ee90-b075-11ec-bb3f-1f063f8e5678", + "source": { + "alert": { + "name":"Test investigation fields empty array", + "tags":["migration"], + "alertTypeId": "siem.queryRule", + "consumer": "siem", + "revision": 0, + "params": { + "author": [], + "description": "a", + "ruleId": "2297be91-894c-4831-830f-b424a0ec5678", + "falsePositives": [], + "from": "now-360s", + "immutable": false, + "license": "", + "outputIndex": "", + "investigationFields":[], + "meta": { + "from": "1m", + "kibana_siem_app_url": "https://actions.kb.us-central1.gcp.cloud.es.io:9243/app/security" + }, + "maxSignals": 100, + "riskScore": 21, + "riskScoreMapping": [], + "severity": "low", + "severityMapping": [], + "threat": [], + "to": "now", + "references": [], + "version": 1, + "exceptionsList": [], + "type": "query", + "language": "kuery", + "index": [ + "apm-*-transaction*", + "traces-apm*", + "auditbeat-*", + "endgame-*", + "filebeat-*", + "logs-*", + "packetbeat-*", + "winlogbeat-*" + ], + "query": "*:*", + "filters": [] + }, + "schedule": { + "interval": "5m" + }, + "enabled": false, + "actions": [], + "throttle": null, + "notifyWhen": "onActiveAlert", + "apiKeyOwner": null, + "apiKey": null, + "createdBy": "1527796724", + "updatedBy": "1527796724", + "createdAt": "2022-03-30T22:05:53.511Z", + "updatedAt": "2022-03-30T22:05:53.511Z", + "muteAll": false, + "mutedInstanceIds": [], + "executionStatus": { + "status": "ok", + "lastExecutionDate": "2022-03-31T19:53:37.507Z", + "error": null, + "lastDuration": 2377 + }, + "meta": { + "versionApiKeyLastmodified": "8.10.0" + }, + "scheduledTaskId": null, + "legacyId": "9095ee90-b075-11ec-bb3f-1f063f8e0def" + }, + "type": "alert", + "references": [], + "namespaces": [ + "default" + ], + "typeMigrationVersion": "8.10.0", + "coreMigrationVersion":"8.10.0", + "updated_at": "2022-03-31T19:53:39.885Z" + } + } +} + +{ + "type": "doc", + "value": { + "index": ".kibana_alerting_cases", + "id": "alert:9095ee90-b075-11ec-bb3f-1f063f8e9102", + "source": { + "alert": { + "name":"Test investigation fields object", + "tags":["migration"], + "alertTypeId": "siem.queryRule", + "consumer": "siem", + "revision": 0, + "params": { + "author": [], + "description": "a", + "ruleId": "2297be91-894c-4831-830f-b424a0ec9102", + "falsePositives": [], + "from": "now-360s", + "immutable": false, + "license": "", + "outputIndex": "", + "investigationFields": { + "field_names": ["host.name"] + }, + "meta": { + "from": "1m", + "kibana_siem_app_url": "https://actions.kb.us-central1.gcp.cloud.es.io:9243/app/security" + }, + "maxSignals": 100, + "riskScore": 21, + "riskScoreMapping": [], + "severity": "low", + "severityMapping": [], + "threat": [], + "to": "now", + "references": [], + "version": 1, + "exceptionsList": [], + "type": "query", + "language": "kuery", + "index": [ + "apm-*-transaction*", + "traces-apm*", + "auditbeat-*", + "endgame-*", + "filebeat-*", + "logs-*", + "packetbeat-*", + "winlogbeat-*" + ], + "query": "*:*", + "filters": [] + }, + "schedule": { + "interval": "5m" + }, + "enabled": false, + "actions": [], + "throttle": null, + "notifyWhen": "onActiveAlert", + "apiKeyOwner": null, + "apiKey": null, + "createdBy": "1527796724", + "updatedBy": "1527796724", + "createdAt": "2022-03-30T22:05:53.511Z", + "updatedAt": "2022-03-30T22:05:53.511Z", + "muteAll": false, + "mutedInstanceIds": [], + "executionStatus": { + "status": "ok", + "lastExecutionDate": "2022-03-31T19:53:37.507Z", + "error": null, + "lastDuration": 2377 + }, + "meta": { + "versionApiKeyLastmodified": "8.11.0" + }, + "scheduledTaskId": null, + "legacyId": "9095ee90-b075-11ec-bb3f-1f063f8e0ghi" + }, + "type": "alert", + "references": [], + "namespaces": [ + "default" + ], + "typeMigrationVersion": "8.11.0", + "coreMigrationVersion":"8.11.0", + "updated_at": "2022-03-31T19:53:39.885Z" + } + } +} \ No newline at end of file From f790f8320f6ab4dd727d37f63361ac1a1dd40701 Mon Sep 17 00:00:00 2001 From: Tiago Costa Date: Tue, 24 Oct 2023 02:36:08 +0100 Subject: [PATCH 49/68] skip flaky suite (#149061) --- .../sections/rules_list/components/rules_list.test.tsx | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/x-pack/plugins/triggers_actions_ui/public/application/sections/rules_list/components/rules_list.test.tsx b/x-pack/plugins/triggers_actions_ui/public/application/sections/rules_list/components/rules_list.test.tsx index da7a78956348e7..05a9638fe233fa 100644 --- a/x-pack/plugins/triggers_actions_ui/public/application/sections/rules_list/components/rules_list.test.tsx +++ b/x-pack/plugins/triggers_actions_ui/public/application/sections/rules_list/components/rules_list.test.tsx @@ -458,7 +458,8 @@ describe('rules_list ', () => { }); }); - describe('rules_list component with items', () => { + // FLAKY: https://github.com/elastic/kibana/issues/149061 + describe.skip('rules_list component with items', () => { it('should render basic table and its row', async () => { renderWithProviders(); await waitFor(() => expect(screen.queryAllByTestId('rule-row')).toHaveLength(6)); From 255e32a756379d79a9427db90b64c0fe4276fe97 Mon Sep 17 00:00:00 2001 From: Tiago Costa Date: Tue, 24 Oct 2023 02:55:18 +0100 Subject: [PATCH 50/68] skip flaky suite (#166199) --- .../migrations/group3/actions/actions_test_suite.ts | 3 ++- 1 file changed, 2 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 3abfaaaedc9774..4a31ff0f692907 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 @@ -1451,7 +1451,8 @@ export const runActionTestSuite = ({ }); }); - describe('waitForPickupUpdatedMappingsTask', () => { + // FLAKY: https://github.com/elastic/kibana/issues/166199 + describe.skip('waitForPickupUpdatedMappingsTask', () => { it('rejects if there are failures', async () => { const res = (await pickupUpdatedMappings( client, From 81c801d9648eb44348bd7eba7570bca7bac176d8 Mon Sep 17 00:00:00 2001 From: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> Date: Tue, 24 Oct 2023 01:05:11 -0400 Subject: [PATCH 51/68] [api-docs] 2023-10-24 Daily api_docs build (#169605) Generated by https://buildkite.com/elastic/kibana-api-docs-daily/builds/500 --- api_docs/actions.mdx | 2 +- api_docs/advanced_settings.mdx | 2 +- api_docs/aiops.mdx | 2 +- api_docs/alerting.devdocs.json | 40 +++++++ api_docs/alerting.mdx | 4 +- api_docs/apm.mdx | 2 +- api_docs/apm_data_access.mdx | 2 +- api_docs/asset_manager.mdx | 2 +- api_docs/banners.mdx | 2 +- api_docs/bfetch.mdx | 2 +- api_docs/canvas.mdx | 2 +- api_docs/cases.mdx | 2 +- api_docs/charts.mdx | 2 +- api_docs/cloud.mdx | 2 +- api_docs/cloud_data_migration.mdx | 2 +- api_docs/cloud_defend.mdx | 2 +- api_docs/cloud_experiments.mdx | 2 +- api_docs/cloud_security_posture.mdx | 2 +- api_docs/console.mdx | 2 +- api_docs/content_management.mdx | 2 +- api_docs/controls.mdx | 2 +- api_docs/custom_integrations.mdx | 2 +- api_docs/dashboard.mdx | 2 +- api_docs/dashboard_enhanced.mdx | 2 +- api_docs/data.mdx | 4 +- api_docs/data_query.mdx | 4 +- api_docs/data_search.devdocs.json | 109 ------------------ api_docs/data_search.mdx | 4 +- api_docs/data_view_editor.mdx | 2 +- api_docs/data_view_field_editor.mdx | 2 +- api_docs/data_view_management.mdx | 2 +- api_docs/data_views.mdx | 2 +- api_docs/data_visualizer.mdx | 2 +- api_docs/deprecations_by_api.mdx | 2 +- api_docs/deprecations_by_plugin.mdx | 2 +- api_docs/deprecations_by_team.mdx | 2 +- api_docs/dev_tools.mdx | 2 +- api_docs/discover.mdx | 2 +- api_docs/discover_enhanced.mdx | 2 +- api_docs/ecs_data_quality_dashboard.mdx | 2 +- api_docs/elastic_assistant.mdx | 2 +- api_docs/embeddable.mdx | 2 +- api_docs/embeddable_enhanced.mdx | 2 +- api_docs/encrypted_saved_objects.mdx | 2 +- api_docs/enterprise_search.mdx | 2 +- api_docs/es_ui_shared.mdx | 2 +- api_docs/event_annotation.mdx | 2 +- api_docs/event_annotation_listing.mdx | 2 +- api_docs/event_log.mdx | 2 +- api_docs/exploratory_view.mdx | 2 +- api_docs/expression_error.mdx | 2 +- api_docs/expression_gauge.mdx | 2 +- api_docs/expression_heatmap.mdx | 2 +- api_docs/expression_image.mdx | 2 +- api_docs/expression_legacy_metric_vis.mdx | 2 +- api_docs/expression_metric.mdx | 2 +- api_docs/expression_metric_vis.mdx | 2 +- api_docs/expression_partition_vis.mdx | 2 +- api_docs/expression_repeat_image.mdx | 2 +- api_docs/expression_reveal_image.mdx | 2 +- api_docs/expression_shape.mdx | 2 +- api_docs/expression_tagcloud.mdx | 2 +- api_docs/expression_x_y.mdx | 2 +- api_docs/expressions.mdx | 2 +- api_docs/features.mdx | 2 +- api_docs/field_formats.mdx | 2 +- api_docs/file_upload.mdx | 2 +- api_docs/files.mdx | 2 +- api_docs/files_management.mdx | 2 +- api_docs/fleet.mdx | 2 +- api_docs/global_search.mdx | 2 +- api_docs/guided_onboarding.mdx | 2 +- api_docs/home.mdx | 2 +- api_docs/image_embeddable.mdx | 2 +- api_docs/index_lifecycle_management.mdx | 2 +- api_docs/index_management.devdocs.json | 2 +- api_docs/index_management.mdx | 2 +- api_docs/infra.mdx | 2 +- api_docs/inspector.mdx | 2 +- api_docs/interactive_setup.mdx | 2 +- api_docs/kbn_ace.mdx | 2 +- api_docs/kbn_aiops_components.mdx | 2 +- api_docs/kbn_aiops_utils.mdx | 2 +- .../kbn_alerting_api_integration_helpers.mdx | 2 +- api_docs/kbn_alerting_state_types.mdx | 2 +- api_docs/kbn_alerts_as_data_utils.mdx | 2 +- api_docs/kbn_alerts_ui_shared.mdx | 2 +- api_docs/kbn_analytics.mdx | 2 +- api_docs/kbn_analytics_client.mdx | 2 +- ..._analytics_shippers_elastic_v3_browser.mdx | 2 +- ...n_analytics_shippers_elastic_v3_common.mdx | 2 +- ...n_analytics_shippers_elastic_v3_server.mdx | 2 +- api_docs/kbn_analytics_shippers_fullstory.mdx | 2 +- api_docs/kbn_analytics_shippers_gainsight.mdx | 2 +- api_docs/kbn_apm_config_loader.mdx | 2 +- api_docs/kbn_apm_synthtrace.mdx | 2 +- api_docs/kbn_apm_synthtrace_client.mdx | 2 +- api_docs/kbn_apm_utils.mdx | 2 +- api_docs/kbn_axe_config.mdx | 2 +- api_docs/kbn_cases_components.mdx | 2 +- api_docs/kbn_cell_actions.mdx | 2 +- api_docs/kbn_chart_expressions_common.mdx | 2 +- api_docs/kbn_chart_icons.mdx | 2 +- api_docs/kbn_ci_stats_core.mdx | 2 +- api_docs/kbn_ci_stats_performance_metrics.mdx | 2 +- api_docs/kbn_ci_stats_reporter.mdx | 2 +- api_docs/kbn_cli_dev_mode.mdx | 2 +- api_docs/kbn_code_editor.mdx | 2 +- api_docs/kbn_code_editor_mocks.mdx | 2 +- api_docs/kbn_coloring.mdx | 2 +- api_docs/kbn_config.mdx | 2 +- api_docs/kbn_config_mocks.mdx | 2 +- api_docs/kbn_config_schema.mdx | 2 +- .../kbn_content_management_content_editor.mdx | 2 +- ...tent_management_tabbed_table_list_view.mdx | 2 +- ...kbn_content_management_table_list_view.mdx | 2 +- ...ntent_management_table_list_view_table.mdx | 2 +- api_docs/kbn_content_management_utils.mdx | 2 +- api_docs/kbn_core_analytics_browser.mdx | 2 +- .../kbn_core_analytics_browser_internal.mdx | 2 +- api_docs/kbn_core_analytics_browser_mocks.mdx | 2 +- api_docs/kbn_core_analytics_server.mdx | 2 +- .../kbn_core_analytics_server_internal.mdx | 2 +- api_docs/kbn_core_analytics_server_mocks.mdx | 2 +- api_docs/kbn_core_application_browser.mdx | 2 +- .../kbn_core_application_browser_internal.mdx | 2 +- .../kbn_core_application_browser_mocks.mdx | 2 +- api_docs/kbn_core_application_common.mdx | 2 +- api_docs/kbn_core_apps_browser_internal.mdx | 2 +- api_docs/kbn_core_apps_browser_mocks.mdx | 2 +- api_docs/kbn_core_apps_server_internal.mdx | 2 +- api_docs/kbn_core_base_browser_mocks.mdx | 2 +- api_docs/kbn_core_base_common.mdx | 2 +- api_docs/kbn_core_base_server_internal.mdx | 2 +- api_docs/kbn_core_base_server_mocks.mdx | 2 +- .../kbn_core_capabilities_browser_mocks.mdx | 2 +- api_docs/kbn_core_capabilities_common.mdx | 2 +- api_docs/kbn_core_capabilities_server.mdx | 2 +- .../kbn_core_capabilities_server_mocks.mdx | 2 +- api_docs/kbn_core_chrome_browser.devdocs.json | 15 +++ api_docs/kbn_core_chrome_browser.mdx | 4 +- api_docs/kbn_core_chrome_browser_mocks.mdx | 2 +- api_docs/kbn_core_config_server_internal.mdx | 2 +- api_docs/kbn_core_custom_branding_browser.mdx | 2 +- ..._core_custom_branding_browser_internal.mdx | 2 +- ...kbn_core_custom_branding_browser_mocks.mdx | 2 +- api_docs/kbn_core_custom_branding_common.mdx | 2 +- api_docs/kbn_core_custom_branding_server.mdx | 2 +- ...n_core_custom_branding_server_internal.mdx | 2 +- .../kbn_core_custom_branding_server_mocks.mdx | 2 +- api_docs/kbn_core_deprecations_browser.mdx | 2 +- ...kbn_core_deprecations_browser_internal.mdx | 2 +- .../kbn_core_deprecations_browser_mocks.mdx | 2 +- api_docs/kbn_core_deprecations_common.mdx | 2 +- api_docs/kbn_core_deprecations_server.mdx | 2 +- .../kbn_core_deprecations_server_internal.mdx | 2 +- .../kbn_core_deprecations_server_mocks.mdx | 2 +- api_docs/kbn_core_doc_links_browser.mdx | 2 +- api_docs/kbn_core_doc_links_browser_mocks.mdx | 2 +- api_docs/kbn_core_doc_links_server.mdx | 2 +- api_docs/kbn_core_doc_links_server_mocks.mdx | 2 +- ...e_elasticsearch_client_server_internal.mdx | 2 +- ...core_elasticsearch_client_server_mocks.mdx | 2 +- api_docs/kbn_core_elasticsearch_server.mdx | 2 +- ...kbn_core_elasticsearch_server_internal.mdx | 2 +- .../kbn_core_elasticsearch_server_mocks.mdx | 2 +- .../kbn_core_environment_server_internal.mdx | 2 +- .../kbn_core_environment_server_mocks.mdx | 2 +- .../kbn_core_execution_context_browser.mdx | 2 +- ...ore_execution_context_browser_internal.mdx | 2 +- ...n_core_execution_context_browser_mocks.mdx | 2 +- .../kbn_core_execution_context_common.mdx | 2 +- .../kbn_core_execution_context_server.mdx | 2 +- ...core_execution_context_server_internal.mdx | 2 +- ...bn_core_execution_context_server_mocks.mdx | 2 +- api_docs/kbn_core_fatal_errors_browser.mdx | 2 +- .../kbn_core_fatal_errors_browser_mocks.mdx | 2 +- api_docs/kbn_core_http_browser.mdx | 2 +- api_docs/kbn_core_http_browser_internal.mdx | 2 +- api_docs/kbn_core_http_browser_mocks.mdx | 2 +- api_docs/kbn_core_http_common.mdx | 2 +- .../kbn_core_http_context_server_mocks.mdx | 2 +- ...re_http_request_handler_context_server.mdx | 2 +- api_docs/kbn_core_http_resources_server.mdx | 2 +- ...bn_core_http_resources_server_internal.mdx | 2 +- .../kbn_core_http_resources_server_mocks.mdx | 2 +- .../kbn_core_http_router_server_internal.mdx | 2 +- .../kbn_core_http_router_server_mocks.mdx | 2 +- api_docs/kbn_core_http_server.devdocs.json | 8 ++ api_docs/kbn_core_http_server.mdx | 2 +- api_docs/kbn_core_http_server_internal.mdx | 2 +- api_docs/kbn_core_http_server_mocks.mdx | 2 +- api_docs/kbn_core_i18n_browser.mdx | 2 +- api_docs/kbn_core_i18n_browser_mocks.mdx | 2 +- api_docs/kbn_core_i18n_server.mdx | 2 +- api_docs/kbn_core_i18n_server_internal.mdx | 2 +- api_docs/kbn_core_i18n_server_mocks.mdx | 2 +- ...n_core_injected_metadata_browser_mocks.mdx | 2 +- ...kbn_core_integrations_browser_internal.mdx | 2 +- .../kbn_core_integrations_browser_mocks.mdx | 2 +- api_docs/kbn_core_lifecycle_browser.mdx | 2 +- api_docs/kbn_core_lifecycle_browser_mocks.mdx | 2 +- api_docs/kbn_core_lifecycle_server.mdx | 2 +- api_docs/kbn_core_lifecycle_server_mocks.mdx | 2 +- api_docs/kbn_core_logging_browser_mocks.mdx | 2 +- api_docs/kbn_core_logging_common_internal.mdx | 2 +- api_docs/kbn_core_logging_server.mdx | 2 +- api_docs/kbn_core_logging_server_internal.mdx | 2 +- api_docs/kbn_core_logging_server_mocks.mdx | 2 +- ...ore_metrics_collectors_server_internal.mdx | 2 +- ...n_core_metrics_collectors_server_mocks.mdx | 2 +- api_docs/kbn_core_metrics_server.mdx | 2 +- api_docs/kbn_core_metrics_server_internal.mdx | 2 +- api_docs/kbn_core_metrics_server_mocks.mdx | 2 +- api_docs/kbn_core_mount_utils_browser.mdx | 2 +- api_docs/kbn_core_node_server.mdx | 2 +- api_docs/kbn_core_node_server_internal.mdx | 2 +- api_docs/kbn_core_node_server_mocks.mdx | 2 +- api_docs/kbn_core_notifications_browser.mdx | 2 +- ...bn_core_notifications_browser_internal.mdx | 2 +- .../kbn_core_notifications_browser_mocks.mdx | 2 +- api_docs/kbn_core_overlays_browser.mdx | 2 +- .../kbn_core_overlays_browser_internal.mdx | 2 +- api_docs/kbn_core_overlays_browser_mocks.mdx | 2 +- api_docs/kbn_core_plugins_browser.mdx | 2 +- api_docs/kbn_core_plugins_browser_mocks.mdx | 2 +- api_docs/kbn_core_plugins_server.mdx | 2 +- api_docs/kbn_core_plugins_server_mocks.mdx | 2 +- api_docs/kbn_core_preboot_server.mdx | 2 +- api_docs/kbn_core_preboot_server_mocks.mdx | 2 +- api_docs/kbn_core_rendering_browser_mocks.mdx | 2 +- .../kbn_core_rendering_server_internal.mdx | 2 +- api_docs/kbn_core_rendering_server_mocks.mdx | 2 +- api_docs/kbn_core_root_server_internal.mdx | 2 +- .../kbn_core_saved_objects_api_browser.mdx | 2 +- .../kbn_core_saved_objects_api_server.mdx | 2 +- ...bn_core_saved_objects_api_server_mocks.mdx | 2 +- ...ore_saved_objects_base_server_internal.mdx | 2 +- ...n_core_saved_objects_base_server_mocks.mdx | 2 +- api_docs/kbn_core_saved_objects_browser.mdx | 2 +- ...bn_core_saved_objects_browser_internal.mdx | 2 +- .../kbn_core_saved_objects_browser_mocks.mdx | 2 +- api_docs/kbn_core_saved_objects_common.mdx | 2 +- ..._objects_import_export_server_internal.mdx | 2 +- ...ved_objects_import_export_server_mocks.mdx | 2 +- ...aved_objects_migration_server_internal.mdx | 2 +- ...e_saved_objects_migration_server_mocks.mdx | 2 +- api_docs/kbn_core_saved_objects_server.mdx | 2 +- ...kbn_core_saved_objects_server_internal.mdx | 2 +- .../kbn_core_saved_objects_server_mocks.mdx | 2 +- .../kbn_core_saved_objects_utils_server.mdx | 2 +- api_docs/kbn_core_status_common.mdx | 2 +- api_docs/kbn_core_status_common_internal.mdx | 2 +- api_docs/kbn_core_status_server.mdx | 2 +- api_docs/kbn_core_status_server_internal.mdx | 2 +- api_docs/kbn_core_status_server_mocks.mdx | 2 +- ...core_test_helpers_deprecations_getters.mdx | 2 +- ...n_core_test_helpers_http_setup_browser.mdx | 2 +- api_docs/kbn_core_test_helpers_kbn_server.mdx | 2 +- .../kbn_core_test_helpers_model_versions.mdx | 2 +- ...n_core_test_helpers_so_type_serializer.mdx | 2 +- api_docs/kbn_core_test_helpers_test_utils.mdx | 2 +- api_docs/kbn_core_theme_browser.mdx | 2 +- api_docs/kbn_core_theme_browser_mocks.mdx | 2 +- api_docs/kbn_core_ui_settings_browser.mdx | 2 +- .../kbn_core_ui_settings_browser_internal.mdx | 2 +- .../kbn_core_ui_settings_browser_mocks.mdx | 2 +- api_docs/kbn_core_ui_settings_common.mdx | 2 +- api_docs/kbn_core_ui_settings_server.mdx | 2 +- .../kbn_core_ui_settings_server_internal.mdx | 2 +- .../kbn_core_ui_settings_server_mocks.mdx | 2 +- api_docs/kbn_core_usage_data_server.mdx | 2 +- .../kbn_core_usage_data_server_internal.mdx | 2 +- api_docs/kbn_core_usage_data_server_mocks.mdx | 2 +- api_docs/kbn_core_user_settings_server.mdx | 2 +- ...kbn_core_user_settings_server_internal.mdx | 2 +- .../kbn_core_user_settings_server_mocks.mdx | 2 +- api_docs/kbn_crypto.mdx | 2 +- api_docs/kbn_crypto_browser.mdx | 2 +- api_docs/kbn_custom_integrations.mdx | 2 +- api_docs/kbn_cypress_config.mdx | 2 +- api_docs/kbn_data_service.mdx | 2 +- api_docs/kbn_datemath.mdx | 2 +- api_docs/kbn_deeplinks_analytics.mdx | 2 +- api_docs/kbn_deeplinks_devtools.mdx | 2 +- api_docs/kbn_deeplinks_management.mdx | 2 +- api_docs/kbn_deeplinks_ml.mdx | 2 +- api_docs/kbn_deeplinks_observability.mdx | 2 +- api_docs/kbn_deeplinks_search.mdx | 2 +- .../kbn_default_nav_analytics.devdocs.json | 14 +++ api_docs/kbn_default_nav_analytics.mdx | 4 +- .../kbn_default_nav_devtools.devdocs.json | 14 +++ api_docs/kbn_default_nav_devtools.mdx | 4 +- .../kbn_default_nav_management.devdocs.json | 16 ++- api_docs/kbn_default_nav_management.mdx | 4 +- api_docs/kbn_default_nav_ml.devdocs.json | 2 +- api_docs/kbn_default_nav_ml.mdx | 2 +- api_docs/kbn_dev_cli_errors.mdx | 2 +- api_docs/kbn_dev_cli_runner.mdx | 2 +- api_docs/kbn_dev_proc_runner.mdx | 2 +- api_docs/kbn_dev_utils.mdx | 2 +- api_docs/kbn_discover_utils.mdx | 2 +- api_docs/kbn_doc_links.mdx | 2 +- api_docs/kbn_docs_utils.mdx | 2 +- api_docs/kbn_dom_drag_drop.mdx | 2 +- api_docs/kbn_ebt_tools.mdx | 2 +- api_docs/kbn_ecs.mdx | 2 +- api_docs/kbn_ecs_data_quality_dashboard.mdx | 2 +- api_docs/kbn_elastic_assistant.devdocs.json | 4 +- api_docs/kbn_elastic_assistant.mdx | 2 +- api_docs/kbn_es.mdx | 2 +- api_docs/kbn_es_archiver.mdx | 2 +- api_docs/kbn_es_errors.mdx | 2 +- api_docs/kbn_es_query.mdx | 2 +- api_docs/kbn_es_types.mdx | 2 +- api_docs/kbn_eslint_plugin_imports.mdx | 2 +- api_docs/kbn_event_annotation_common.mdx | 2 +- api_docs/kbn_event_annotation_components.mdx | 2 +- api_docs/kbn_expandable_flyout.mdx | 2 +- api_docs/kbn_field_types.mdx | 2 +- api_docs/kbn_field_utils.mdx | 2 +- api_docs/kbn_find_used_node_modules.mdx | 2 +- .../kbn_ftr_common_functional_services.mdx | 2 +- api_docs/kbn_generate.mdx | 2 +- api_docs/kbn_generate_console_definitions.mdx | 2 +- api_docs/kbn_generate_csv.mdx | 2 +- api_docs/kbn_generate_csv_types.mdx | 2 +- api_docs/kbn_guided_onboarding.mdx | 2 +- api_docs/kbn_handlebars.mdx | 2 +- api_docs/kbn_hapi_mocks.mdx | 2 +- api_docs/kbn_health_gateway_server.mdx | 2 +- api_docs/kbn_home_sample_data_card.mdx | 2 +- api_docs/kbn_home_sample_data_tab.mdx | 2 +- api_docs/kbn_i18n.mdx | 2 +- api_docs/kbn_i18n_react.mdx | 2 +- api_docs/kbn_import_resolver.mdx | 2 +- api_docs/kbn_infra_forge.mdx | 2 +- api_docs/kbn_interpreter.mdx | 2 +- api_docs/kbn_io_ts_utils.mdx | 2 +- api_docs/kbn_jest_serializers.mdx | 2 +- api_docs/kbn_journeys.mdx | 2 +- api_docs/kbn_json_ast.mdx | 2 +- api_docs/kbn_kibana_manifest_schema.mdx | 2 +- .../kbn_language_documentation_popover.mdx | 2 +- api_docs/kbn_lens_embeddable_utils.mdx | 2 +- api_docs/kbn_logging.mdx | 2 +- api_docs/kbn_logging_mocks.mdx | 2 +- api_docs/kbn_managed_vscode_config.mdx | 2 +- api_docs/kbn_management_cards_navigation.mdx | 2 +- .../kbn_management_settings_application.mdx | 2 +- ...ent_settings_components_field_category.mdx | 2 +- ...gement_settings_components_field_input.mdx | 2 +- ...nagement_settings_components_field_row.mdx | 2 +- ...bn_management_settings_components_form.mdx | 2 +- ...n_management_settings_field_definition.mdx | 2 +- api_docs/kbn_management_settings_ids.mdx | 2 +- ...n_management_settings_section_registry.mdx | 2 +- api_docs/kbn_management_settings_types.mdx | 2 +- .../kbn_management_settings_utilities.mdx | 2 +- api_docs/kbn_management_storybook_config.mdx | 2 +- api_docs/kbn_mapbox_gl.mdx | 2 +- api_docs/kbn_maps_vector_tile_utils.mdx | 2 +- api_docs/kbn_ml_agg_utils.mdx | 2 +- api_docs/kbn_ml_anomaly_utils.mdx | 2 +- api_docs/kbn_ml_category_validator.mdx | 2 +- api_docs/kbn_ml_chi2test.mdx | 2 +- .../kbn_ml_data_frame_analytics_utils.mdx | 2 +- api_docs/kbn_ml_data_grid.mdx | 2 +- api_docs/kbn_ml_date_picker.mdx | 2 +- api_docs/kbn_ml_date_utils.mdx | 2 +- api_docs/kbn_ml_error_utils.mdx | 2 +- api_docs/kbn_ml_in_memory_table.mdx | 2 +- api_docs/kbn_ml_is_defined.mdx | 2 +- api_docs/kbn_ml_is_populated_object.mdx | 2 +- api_docs/kbn_ml_kibana_theme.mdx | 2 +- api_docs/kbn_ml_local_storage.mdx | 2 +- api_docs/kbn_ml_nested_property.mdx | 2 +- api_docs/kbn_ml_number_utils.mdx | 2 +- api_docs/kbn_ml_query_utils.mdx | 2 +- api_docs/kbn_ml_random_sampler_utils.mdx | 2 +- api_docs/kbn_ml_route_utils.mdx | 2 +- api_docs/kbn_ml_runtime_field_utils.mdx | 2 +- api_docs/kbn_ml_string_hash.mdx | 2 +- api_docs/kbn_ml_trained_models_utils.mdx | 2 +- api_docs/kbn_ml_url_state.mdx | 2 +- api_docs/kbn_monaco.mdx | 2 +- api_docs/kbn_object_versioning.mdx | 2 +- api_docs/kbn_observability_alert_details.mdx | 2 +- .../kbn_observability_alerting_test_data.mdx | 2 +- api_docs/kbn_openapi_generator.mdx | 2 +- api_docs/kbn_optimizer.mdx | 2 +- api_docs/kbn_optimizer_webpack_helpers.mdx | 2 +- api_docs/kbn_osquery_io_ts_types.mdx | 2 +- ..._performance_testing_dataset_extractor.mdx | 2 +- api_docs/kbn_plugin_generator.mdx | 2 +- api_docs/kbn_plugin_helpers.mdx | 2 +- api_docs/kbn_profiling_utils.mdx | 2 +- api_docs/kbn_random_sampling.mdx | 2 +- api_docs/kbn_react_field.mdx | 2 +- api_docs/kbn_react_kibana_context_common.mdx | 2 +- api_docs/kbn_react_kibana_context_render.mdx | 2 +- api_docs/kbn_react_kibana_context_root.mdx | 2 +- api_docs/kbn_react_kibana_context_styled.mdx | 2 +- api_docs/kbn_react_kibana_context_theme.mdx | 2 +- api_docs/kbn_react_kibana_mount.mdx | 2 +- api_docs/kbn_repo_file_maps.mdx | 2 +- api_docs/kbn_repo_linter.mdx | 2 +- api_docs/kbn_repo_path.mdx | 2 +- api_docs/kbn_repo_source_classifier.mdx | 2 +- api_docs/kbn_reporting_common.mdx | 2 +- api_docs/kbn_resizable_layout.mdx | 2 +- api_docs/kbn_rison.mdx | 2 +- api_docs/kbn_rrule.mdx | 2 +- api_docs/kbn_rule_data_utils.mdx | 2 +- api_docs/kbn_saved_objects_settings.mdx | 2 +- api_docs/kbn_search_api_panels.mdx | 2 +- api_docs/kbn_search_connectors.mdx | 2 +- api_docs/kbn_search_response_warnings.mdx | 2 +- api_docs/kbn_security_solution_features.mdx | 2 +- api_docs/kbn_security_solution_navigation.mdx | 2 +- api_docs/kbn_security_solution_side_nav.mdx | 2 +- ...kbn_security_solution_storybook_config.mdx | 2 +- .../kbn_securitysolution_autocomplete.mdx | 2 +- api_docs/kbn_securitysolution_data_table.mdx | 2 +- api_docs/kbn_securitysolution_ecs.mdx | 2 +- api_docs/kbn_securitysolution_es_utils.mdx | 2 +- ...ritysolution_exception_list_components.mdx | 2 +- api_docs/kbn_securitysolution_grouping.mdx | 2 +- api_docs/kbn_securitysolution_hook_utils.mdx | 2 +- ..._securitysolution_io_ts_alerting_types.mdx | 2 +- .../kbn_securitysolution_io_ts_list_types.mdx | 2 +- api_docs/kbn_securitysolution_io_ts_types.mdx | 2 +- api_docs/kbn_securitysolution_io_ts_utils.mdx | 2 +- api_docs/kbn_securitysolution_list_api.mdx | 2 +- .../kbn_securitysolution_list_constants.mdx | 2 +- api_docs/kbn_securitysolution_list_hooks.mdx | 2 +- api_docs/kbn_securitysolution_list_utils.mdx | 2 +- api_docs/kbn_securitysolution_rules.mdx | 2 +- api_docs/kbn_securitysolution_t_grid.mdx | 2 +- api_docs/kbn_securitysolution_utils.mdx | 2 +- api_docs/kbn_server_http_tools.mdx | 2 +- api_docs/kbn_server_route_repository.mdx | 2 +- api_docs/kbn_serverless_common_settings.mdx | 2 +- .../kbn_serverless_observability_settings.mdx | 2 +- api_docs/kbn_serverless_project_switcher.mdx | 2 +- api_docs/kbn_serverless_search_settings.mdx | 2 +- api_docs/kbn_serverless_security_settings.mdx | 2 +- api_docs/kbn_serverless_storybook_config.mdx | 2 +- api_docs/kbn_shared_svg.mdx | 2 +- api_docs/kbn_shared_ux_avatar_solution.mdx | 2 +- ...ared_ux_avatar_user_profile_components.mdx | 2 +- .../kbn_shared_ux_button_exit_full_screen.mdx | 2 +- ...hared_ux_button_exit_full_screen_mocks.mdx | 2 +- api_docs/kbn_shared_ux_button_toolbar.mdx | 2 +- api_docs/kbn_shared_ux_card_no_data.mdx | 2 +- api_docs/kbn_shared_ux_card_no_data_mocks.mdx | 2 +- api_docs/kbn_shared_ux_chrome_navigation.mdx | 2 +- .../kbn_shared_ux_error_boundary.devdocs.json | 100 ++++++++++++++++ api_docs/kbn_shared_ux_error_boundary.mdx | 30 +++++ api_docs/kbn_shared_ux_file_context.mdx | 2 +- api_docs/kbn_shared_ux_file_image.mdx | 2 +- api_docs/kbn_shared_ux_file_image_mocks.mdx | 2 +- api_docs/kbn_shared_ux_file_mocks.mdx | 2 +- api_docs/kbn_shared_ux_file_picker.mdx | 2 +- api_docs/kbn_shared_ux_file_types.mdx | 2 +- api_docs/kbn_shared_ux_file_upload.mdx | 2 +- api_docs/kbn_shared_ux_file_util.mdx | 2 +- api_docs/kbn_shared_ux_link_redirect_app.mdx | 2 +- .../kbn_shared_ux_link_redirect_app_mocks.mdx | 2 +- api_docs/kbn_shared_ux_markdown.mdx | 2 +- api_docs/kbn_shared_ux_markdown_mocks.mdx | 2 +- .../kbn_shared_ux_page_analytics_no_data.mdx | 2 +- ...shared_ux_page_analytics_no_data_mocks.mdx | 2 +- .../kbn_shared_ux_page_kibana_no_data.mdx | 2 +- ...bn_shared_ux_page_kibana_no_data_mocks.mdx | 2 +- .../kbn_shared_ux_page_kibana_template.mdx | 2 +- ...n_shared_ux_page_kibana_template_mocks.mdx | 2 +- api_docs/kbn_shared_ux_page_no_data.mdx | 2 +- .../kbn_shared_ux_page_no_data_config.mdx | 2 +- ...bn_shared_ux_page_no_data_config_mocks.mdx | 2 +- api_docs/kbn_shared_ux_page_no_data_mocks.mdx | 2 +- api_docs/kbn_shared_ux_page_solution_nav.mdx | 2 +- .../kbn_shared_ux_prompt_no_data_views.mdx | 2 +- ...n_shared_ux_prompt_no_data_views_mocks.mdx | 2 +- api_docs/kbn_shared_ux_prompt_not_found.mdx | 2 +- api_docs/kbn_shared_ux_router.mdx | 2 +- api_docs/kbn_shared_ux_router_mocks.mdx | 2 +- api_docs/kbn_shared_ux_storybook_config.mdx | 2 +- api_docs/kbn_shared_ux_storybook_mock.mdx | 2 +- api_docs/kbn_shared_ux_utility.mdx | 2 +- api_docs/kbn_slo_schema.mdx | 2 +- api_docs/kbn_some_dev_log.mdx | 2 +- api_docs/kbn_std.mdx | 2 +- api_docs/kbn_stdio_dev_helpers.mdx | 2 +- api_docs/kbn_storybook.mdx | 2 +- api_docs/kbn_subscription_tracking.mdx | 2 +- api_docs/kbn_telemetry_tools.mdx | 2 +- api_docs/kbn_test.mdx | 2 +- api_docs/kbn_test_jest_helpers.mdx | 2 +- api_docs/kbn_test_subj_selector.mdx | 2 +- api_docs/kbn_text_based_editor.mdx | 2 +- api_docs/kbn_tooling_log.mdx | 2 +- api_docs/kbn_ts_projects.mdx | 2 +- api_docs/kbn_typed_react_router_config.mdx | 2 +- api_docs/kbn_ui_actions_browser.mdx | 2 +- api_docs/kbn_ui_shared_deps_src.devdocs.json | 11 ++ api_docs/kbn_ui_shared_deps_src.mdx | 4 +- api_docs/kbn_ui_theme.mdx | 2 +- api_docs/kbn_unified_data_table.mdx | 2 +- api_docs/kbn_unified_doc_viewer.mdx | 2 +- api_docs/kbn_unified_field_list.mdx | 2 +- api_docs/kbn_url_state.mdx | 2 +- api_docs/kbn_use_tracked_promise.mdx | 2 +- api_docs/kbn_user_profile_components.mdx | 2 +- api_docs/kbn_utility_types.mdx | 2 +- api_docs/kbn_utility_types_jest.mdx | 2 +- api_docs/kbn_utils.mdx | 2 +- api_docs/kbn_visualization_ui_components.mdx | 2 +- api_docs/kbn_xstate_utils.mdx | 2 +- api_docs/kbn_yarn_lock_validator.mdx | 2 +- api_docs/kibana_overview.mdx | 2 +- api_docs/kibana_react.mdx | 2 +- api_docs/kibana_utils.mdx | 2 +- api_docs/kubernetes_security.mdx | 2 +- api_docs/lens.mdx | 2 +- api_docs/license_api_guard.mdx | 2 +- api_docs/license_management.mdx | 2 +- api_docs/licensing.mdx | 2 +- api_docs/links.devdocs.json | 52 ++++++++- api_docs/links.mdx | 4 +- api_docs/lists.mdx | 2 +- api_docs/log_explorer.mdx | 2 +- api_docs/logs_shared.mdx | 2 +- api_docs/management.mdx | 2 +- api_docs/maps.mdx | 2 +- api_docs/maps_ems.mdx | 2 +- api_docs/metrics_data_access.mdx | 2 +- api_docs/ml.mdx | 2 +- api_docs/monitoring.mdx | 2 +- api_docs/monitoring_collection.mdx | 2 +- api_docs/navigation.mdx | 2 +- api_docs/newsfeed.mdx | 2 +- api_docs/no_data_page.mdx | 2 +- api_docs/notifications.mdx | 2 +- api_docs/observability.mdx | 2 +- api_docs/observability_a_i_assistant.mdx | 2 +- api_docs/observability_log_explorer.mdx | 2 +- api_docs/observability_onboarding.mdx | 2 +- api_docs/observability_shared.mdx | 2 +- api_docs/osquery.mdx | 2 +- api_docs/painless_lab.mdx | 2 +- api_docs/plugin_directory.mdx | 23 ++-- api_docs/presentation_util.mdx | 2 +- api_docs/profiling.mdx | 2 +- api_docs/profiling_data_access.mdx | 2 +- api_docs/remote_clusters.mdx | 2 +- api_docs/reporting.mdx | 2 +- api_docs/rollup.mdx | 2 +- api_docs/rule_registry.mdx | 2 +- api_docs/runtime_fields.mdx | 2 +- api_docs/saved_objects.mdx | 2 +- api_docs/saved_objects_finder.mdx | 2 +- api_docs/saved_objects_management.mdx | 2 +- api_docs/saved_objects_tagging.mdx | 2 +- api_docs/saved_objects_tagging_oss.mdx | 2 +- api_docs/saved_search.mdx | 2 +- api_docs/screenshot_mode.mdx | 2 +- api_docs/screenshotting.mdx | 2 +- api_docs/security.mdx | 2 +- api_docs/security_solution.mdx | 2 +- api_docs/security_solution_ess.mdx | 2 +- api_docs/security_solution_serverless.mdx | 2 +- api_docs/serverless.mdx | 2 +- api_docs/serverless_observability.mdx | 2 +- api_docs/serverless_search.mdx | 2 +- api_docs/session_view.mdx | 2 +- api_docs/share.mdx | 2 +- api_docs/snapshot_restore.mdx | 2 +- api_docs/spaces.mdx | 2 +- api_docs/stack_alerts.mdx | 2 +- api_docs/stack_connectors.mdx | 2 +- api_docs/task_manager.mdx | 2 +- api_docs/telemetry.mdx | 2 +- api_docs/telemetry_collection_manager.mdx | 2 +- api_docs/telemetry_collection_xpack.mdx | 2 +- api_docs/telemetry_management_section.mdx | 2 +- api_docs/text_based_languages.mdx | 2 +- api_docs/threat_intelligence.mdx | 2 +- api_docs/timelines.mdx | 2 +- api_docs/transform.mdx | 2 +- api_docs/triggers_actions_ui.mdx | 2 +- api_docs/ui_actions.mdx | 2 +- api_docs/ui_actions_enhanced.mdx | 2 +- api_docs/unified_doc_viewer.mdx | 2 +- api_docs/unified_histogram.mdx | 2 +- api_docs/unified_search.mdx | 2 +- api_docs/unified_search_autocomplete.mdx | 2 +- api_docs/uptime.mdx | 2 +- api_docs/url_forwarding.mdx | 2 +- api_docs/usage_collection.mdx | 2 +- api_docs/ux.mdx | 2 +- api_docs/vis_default_editor.mdx | 2 +- api_docs/vis_type_gauge.mdx | 2 +- api_docs/vis_type_heatmap.mdx | 2 +- api_docs/vis_type_pie.mdx | 2 +- api_docs/vis_type_table.mdx | 2 +- api_docs/vis_type_timelion.mdx | 2 +- api_docs/vis_type_timeseries.mdx | 2 +- api_docs/vis_type_vega.mdx | 2 +- api_docs/vis_type_vislib.mdx | 2 +- api_docs/vis_type_xy.mdx | 2 +- api_docs/visualizations.mdx | 2 +- 612 files changed, 920 insertions(+), 734 deletions(-) create mode 100644 api_docs/kbn_shared_ux_error_boundary.devdocs.json create mode 100644 api_docs/kbn_shared_ux_error_boundary.mdx diff --git a/api_docs/actions.mdx b/api_docs/actions.mdx index c5564acaa33e65..6a513f79909260 100644 --- a/api_docs/actions.mdx +++ b/api_docs/actions.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/actions title: "actions" image: https://source.unsplash.com/400x175/?github description: API docs for the actions plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'actions'] --- import actionsObj from './actions.devdocs.json'; diff --git a/api_docs/advanced_settings.mdx b/api_docs/advanced_settings.mdx index 4dadc034407d38..a2c11d4ee702eb 100644 --- a/api_docs/advanced_settings.mdx +++ b/api_docs/advanced_settings.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/advancedSettings title: "advancedSettings" image: https://source.unsplash.com/400x175/?github description: API docs for the advancedSettings plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'advancedSettings'] --- import advancedSettingsObj from './advanced_settings.devdocs.json'; diff --git a/api_docs/aiops.mdx b/api_docs/aiops.mdx index ab601eea2533eb..bdcf6526d0bc13 100644 --- a/api_docs/aiops.mdx +++ b/api_docs/aiops.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/aiops title: "aiops" image: https://source.unsplash.com/400x175/?github description: API docs for the aiops plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'aiops'] --- import aiopsObj from './aiops.devdocs.json'; diff --git a/api_docs/alerting.devdocs.json b/api_docs/alerting.devdocs.json index 6ed62de4150a09..a8c688261c4f70 100644 --- a/api_docs/alerting.devdocs.json +++ b/api_docs/alerting.devdocs.json @@ -929,6 +929,46 @@ } ], "initialIsOpen": false + }, + { + "parentPluginId": "alerting", + "id": "def-server.InstallShutdownError", + "type": "Class", + "tags": [], + "label": "InstallShutdownError", + "description": [], + "signature": [ + { + "pluginId": "alerting", + "scope": "server", + "docId": "kibAlertingPluginApi", + "section": "def-server.InstallShutdownError", + "text": "InstallShutdownError" + }, + " extends Error" + ], + "path": "x-pack/plugins/alerting/server/alerts_service/lib/install_with_timeout.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "alerting", + "id": "def-server.InstallShutdownError.Unnamed", + "type": "Function", + "tags": [], + "label": "Constructor", + "description": [], + "signature": [ + "any" + ], + "path": "x-pack/plugins/alerting/server/alerts_service/lib/install_with_timeout.ts", + "deprecated": false, + "trackAdoption": false, + "children": [], + "returnComment": [] + } + ], + "initialIsOpen": false } ], "functions": [ diff --git a/api_docs/alerting.mdx b/api_docs/alerting.mdx index 7fcddb514707d7..22a46c6a8b989f 100644 --- a/api_docs/alerting.mdx +++ b/api_docs/alerting.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/alerting title: "alerting" image: https://source.unsplash.com/400x175/?github description: API docs for the alerting plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'alerting'] --- import alertingObj from './alerting.devdocs.json'; @@ -21,7 +21,7 @@ Contact [@elastic/response-ops](https://github.com/orgs/elastic/teams/response-o | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 807 | 1 | 776 | 50 | +| 809 | 1 | 778 | 50 | ## Client diff --git a/api_docs/apm.mdx b/api_docs/apm.mdx index 3598ad81903b50..a31f3743326daf 100644 --- a/api_docs/apm.mdx +++ b/api_docs/apm.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/apm title: "apm" image: https://source.unsplash.com/400x175/?github description: API docs for the apm plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'apm'] --- import apmObj from './apm.devdocs.json'; diff --git a/api_docs/apm_data_access.mdx b/api_docs/apm_data_access.mdx index 9f941ace35104c..ce0b75a1719ec4 100644 --- a/api_docs/apm_data_access.mdx +++ b/api_docs/apm_data_access.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/apmDataAccess title: "apmDataAccess" image: https://source.unsplash.com/400x175/?github description: API docs for the apmDataAccess plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'apmDataAccess'] --- import apmDataAccessObj from './apm_data_access.devdocs.json'; diff --git a/api_docs/asset_manager.mdx b/api_docs/asset_manager.mdx index 7654cf72be6bf7..d44b376de9c87b 100644 --- a/api_docs/asset_manager.mdx +++ b/api_docs/asset_manager.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/assetManager title: "assetManager" image: https://source.unsplash.com/400x175/?github description: API docs for the assetManager plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'assetManager'] --- import assetManagerObj from './asset_manager.devdocs.json'; diff --git a/api_docs/banners.mdx b/api_docs/banners.mdx index 20703386001e68..a000a004cc0c55 100644 --- a/api_docs/banners.mdx +++ b/api_docs/banners.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/banners title: "banners" image: https://source.unsplash.com/400x175/?github description: API docs for the banners plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'banners'] --- import bannersObj from './banners.devdocs.json'; diff --git a/api_docs/bfetch.mdx b/api_docs/bfetch.mdx index 90ba95bd9b2797..632ddf1edbdd32 100644 --- a/api_docs/bfetch.mdx +++ b/api_docs/bfetch.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/bfetch title: "bfetch" image: https://source.unsplash.com/400x175/?github description: API docs for the bfetch plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'bfetch'] --- import bfetchObj from './bfetch.devdocs.json'; diff --git a/api_docs/canvas.mdx b/api_docs/canvas.mdx index 95ac1279dc786a..41d373dabc67ed 100644 --- a/api_docs/canvas.mdx +++ b/api_docs/canvas.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/canvas title: "canvas" image: https://source.unsplash.com/400x175/?github description: API docs for the canvas plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'canvas'] --- import canvasObj from './canvas.devdocs.json'; diff --git a/api_docs/cases.mdx b/api_docs/cases.mdx index bf825db3c11ff0..618e156c01a431 100644 --- a/api_docs/cases.mdx +++ b/api_docs/cases.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/cases title: "cases" image: https://source.unsplash.com/400x175/?github description: API docs for the cases plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'cases'] --- import casesObj from './cases.devdocs.json'; diff --git a/api_docs/charts.mdx b/api_docs/charts.mdx index 901041712f35eb..bffb6e560ee234 100644 --- a/api_docs/charts.mdx +++ b/api_docs/charts.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/charts title: "charts" image: https://source.unsplash.com/400x175/?github description: API docs for the charts plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'charts'] --- import chartsObj from './charts.devdocs.json'; diff --git a/api_docs/cloud.mdx b/api_docs/cloud.mdx index e6daed9b16871c..1f0ba162a4ae89 100644 --- a/api_docs/cloud.mdx +++ b/api_docs/cloud.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/cloud title: "cloud" image: https://source.unsplash.com/400x175/?github description: API docs for the cloud plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'cloud'] --- import cloudObj from './cloud.devdocs.json'; diff --git a/api_docs/cloud_data_migration.mdx b/api_docs/cloud_data_migration.mdx index ddd55e6300704c..0b72f1e4a8f97d 100644 --- a/api_docs/cloud_data_migration.mdx +++ b/api_docs/cloud_data_migration.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/cloudDataMigration title: "cloudDataMigration" image: https://source.unsplash.com/400x175/?github description: API docs for the cloudDataMigration plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'cloudDataMigration'] --- import cloudDataMigrationObj from './cloud_data_migration.devdocs.json'; diff --git a/api_docs/cloud_defend.mdx b/api_docs/cloud_defend.mdx index 7127856c6b4baa..0c9d8f2a5d2491 100644 --- a/api_docs/cloud_defend.mdx +++ b/api_docs/cloud_defend.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/cloudDefend title: "cloudDefend" image: https://source.unsplash.com/400x175/?github description: API docs for the cloudDefend plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'cloudDefend'] --- import cloudDefendObj from './cloud_defend.devdocs.json'; diff --git a/api_docs/cloud_experiments.mdx b/api_docs/cloud_experiments.mdx index cd1ff97300b8fe..e56a4c5c783812 100644 --- a/api_docs/cloud_experiments.mdx +++ b/api_docs/cloud_experiments.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/cloudExperiments title: "cloudExperiments" image: https://source.unsplash.com/400x175/?github description: API docs for the cloudExperiments plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'cloudExperiments'] --- import cloudExperimentsObj from './cloud_experiments.devdocs.json'; diff --git a/api_docs/cloud_security_posture.mdx b/api_docs/cloud_security_posture.mdx index 9c8b444195447d..452c935a267551 100644 --- a/api_docs/cloud_security_posture.mdx +++ b/api_docs/cloud_security_posture.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/cloudSecurityPosture title: "cloudSecurityPosture" image: https://source.unsplash.com/400x175/?github description: API docs for the cloudSecurityPosture plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'cloudSecurityPosture'] --- import cloudSecurityPostureObj from './cloud_security_posture.devdocs.json'; diff --git a/api_docs/console.mdx b/api_docs/console.mdx index 196f5f6e1b817b..2d388abc7cd87b 100644 --- a/api_docs/console.mdx +++ b/api_docs/console.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/console title: "console" image: https://source.unsplash.com/400x175/?github description: API docs for the console plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'console'] --- import consoleObj from './console.devdocs.json'; diff --git a/api_docs/content_management.mdx b/api_docs/content_management.mdx index 237279581ca15e..156fdc1957c09c 100644 --- a/api_docs/content_management.mdx +++ b/api_docs/content_management.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/contentManagement title: "contentManagement" image: https://source.unsplash.com/400x175/?github description: API docs for the contentManagement plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'contentManagement'] --- import contentManagementObj from './content_management.devdocs.json'; diff --git a/api_docs/controls.mdx b/api_docs/controls.mdx index 575d0bd73a4eef..447d4e1df55278 100644 --- a/api_docs/controls.mdx +++ b/api_docs/controls.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/controls title: "controls" image: https://source.unsplash.com/400x175/?github description: API docs for the controls plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'controls'] --- import controlsObj from './controls.devdocs.json'; diff --git a/api_docs/custom_integrations.mdx b/api_docs/custom_integrations.mdx index 8033012d015444..6301c945dfa8e8 100644 --- a/api_docs/custom_integrations.mdx +++ b/api_docs/custom_integrations.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/customIntegrations title: "customIntegrations" image: https://source.unsplash.com/400x175/?github description: API docs for the customIntegrations plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'customIntegrations'] --- import customIntegrationsObj from './custom_integrations.devdocs.json'; diff --git a/api_docs/dashboard.mdx b/api_docs/dashboard.mdx index 40a7a5f08dfd0a..6ec6d09ae88795 100644 --- a/api_docs/dashboard.mdx +++ b/api_docs/dashboard.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/dashboard title: "dashboard" image: https://source.unsplash.com/400x175/?github description: API docs for the dashboard plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'dashboard'] --- import dashboardObj from './dashboard.devdocs.json'; diff --git a/api_docs/dashboard_enhanced.mdx b/api_docs/dashboard_enhanced.mdx index 8553a7b902c12b..b13d247820d2b3 100644 --- a/api_docs/dashboard_enhanced.mdx +++ b/api_docs/dashboard_enhanced.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/dashboardEnhanced title: "dashboardEnhanced" image: https://source.unsplash.com/400x175/?github description: API docs for the dashboardEnhanced plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'dashboardEnhanced'] --- import dashboardEnhancedObj from './dashboard_enhanced.devdocs.json'; diff --git a/api_docs/data.mdx b/api_docs/data.mdx index 11128f4142271b..8f6f358a4b9a65 100644 --- a/api_docs/data.mdx +++ b/api_docs/data.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/data title: "data" image: https://source.unsplash.com/400x175/?github description: API docs for the data plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'data'] --- import dataObj from './data.devdocs.json'; @@ -21,7 +21,7 @@ Contact [@elastic/kibana-visualizations](https://github.com/orgs/elastic/teams/k | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 3194 | 33 | 2545 | 22 | +| 3186 | 33 | 2537 | 22 | ## Client diff --git a/api_docs/data_query.mdx b/api_docs/data_query.mdx index de3e52591d2c3f..e2772a76679fd7 100644 --- a/api_docs/data_query.mdx +++ b/api_docs/data_query.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/data-query title: "data.query" image: https://source.unsplash.com/400x175/?github description: API docs for the data.query plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'data.query'] --- import dataQueryObj from './data_query.devdocs.json'; @@ -21,7 +21,7 @@ Contact [@elastic/kibana-visualizations](https://github.com/orgs/elastic/teams/k | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 3194 | 33 | 2545 | 22 | +| 3186 | 33 | 2537 | 22 | ## Client diff --git a/api_docs/data_search.devdocs.json b/api_docs/data_search.devdocs.json index 607db8301c9929..991b3420e09181 100644 --- a/api_docs/data_search.devdocs.json +++ b/api_docs/data_search.devdocs.json @@ -818,115 +818,6 @@ ], "initialIsOpen": false }, - { - "parentPluginId": "data", - "id": "def-public.Reason", - "type": "Interface", - "tags": [], - "label": "Reason", - "description": [], - "path": "src/plugins/data/public/search/errors/types.ts", - "deprecated": false, - "trackAdoption": false, - "children": [ - { - "parentPluginId": "data", - "id": "def-public.Reason.type", - "type": "string", - "tags": [], - "label": "type", - "description": [], - "path": "src/plugins/data/public/search/errors/types.ts", - "deprecated": false, - "trackAdoption": false - }, - { - "parentPluginId": "data", - "id": "def-public.Reason.reason", - "type": "string", - "tags": [], - "label": "reason", - "description": [], - "signature": [ - "string | undefined" - ], - "path": "src/plugins/data/public/search/errors/types.ts", - "deprecated": false, - "trackAdoption": false - }, - { - "parentPluginId": "data", - "id": "def-public.Reason.script_stack", - "type": "Array", - "tags": [], - "label": "script_stack", - "description": [], - "signature": [ - "string[] | undefined" - ], - "path": "src/plugins/data/public/search/errors/types.ts", - "deprecated": false, - "trackAdoption": false - }, - { - "parentPluginId": "data", - "id": "def-public.Reason.position", - "type": "Object", - "tags": [], - "label": "position", - "description": [], - "signature": [ - "{ offset: number; start: number; end: number; } | undefined" - ], - "path": "src/plugins/data/public/search/errors/types.ts", - "deprecated": false, - "trackAdoption": false - }, - { - "parentPluginId": "data", - "id": "def-public.Reason.lang", - "type": "string", - "tags": [], - "label": "lang", - "description": [], - "signature": [ - "string | undefined" - ], - "path": "src/plugins/data/public/search/errors/types.ts", - "deprecated": false, - "trackAdoption": false - }, - { - "parentPluginId": "data", - "id": "def-public.Reason.script", - "type": "string", - "tags": [], - "label": "script", - "description": [], - "signature": [ - "string | undefined" - ], - "path": "src/plugins/data/public/search/errors/types.ts", - "deprecated": false, - "trackAdoption": false - }, - { - "parentPluginId": "data", - "id": "def-public.Reason.caused_by", - "type": "Object", - "tags": [], - "label": "caused_by", - "description": [], - "signature": [ - "{ type: string; reason: string; } | undefined" - ], - "path": "src/plugins/data/public/search/errors/types.ts", - "deprecated": false, - "trackAdoption": false - } - ], - "initialIsOpen": false - }, { "parentPluginId": "data", "id": "def-public.SearchSessionInfoProvider", diff --git a/api_docs/data_search.mdx b/api_docs/data_search.mdx index cade2a91133e52..74e675813e7147 100644 --- a/api_docs/data_search.mdx +++ b/api_docs/data_search.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/data-search title: "data.search" image: https://source.unsplash.com/400x175/?github description: API docs for the data.search plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'data.search'] --- import dataSearchObj from './data_search.devdocs.json'; @@ -21,7 +21,7 @@ Contact [@elastic/kibana-visualizations](https://github.com/orgs/elastic/teams/k | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 3194 | 33 | 2545 | 22 | +| 3186 | 33 | 2537 | 22 | ## Client diff --git a/api_docs/data_view_editor.mdx b/api_docs/data_view_editor.mdx index 49da9c13f561b7..f4b1ea740acab4 100644 --- a/api_docs/data_view_editor.mdx +++ b/api_docs/data_view_editor.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/dataViewEditor title: "dataViewEditor" image: https://source.unsplash.com/400x175/?github description: API docs for the dataViewEditor plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'dataViewEditor'] --- import dataViewEditorObj from './data_view_editor.devdocs.json'; diff --git a/api_docs/data_view_field_editor.mdx b/api_docs/data_view_field_editor.mdx index bf66d22d43b019..ee104047373c87 100644 --- a/api_docs/data_view_field_editor.mdx +++ b/api_docs/data_view_field_editor.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/dataViewFieldEditor title: "dataViewFieldEditor" image: https://source.unsplash.com/400x175/?github description: API docs for the dataViewFieldEditor plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'dataViewFieldEditor'] --- import dataViewFieldEditorObj from './data_view_field_editor.devdocs.json'; diff --git a/api_docs/data_view_management.mdx b/api_docs/data_view_management.mdx index 4e20c5493e7b96..531216b2be130c 100644 --- a/api_docs/data_view_management.mdx +++ b/api_docs/data_view_management.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/dataViewManagement title: "dataViewManagement" image: https://source.unsplash.com/400x175/?github description: API docs for the dataViewManagement plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'dataViewManagement'] --- import dataViewManagementObj from './data_view_management.devdocs.json'; diff --git a/api_docs/data_views.mdx b/api_docs/data_views.mdx index feb7574954cd23..416619af4d7c4e 100644 --- a/api_docs/data_views.mdx +++ b/api_docs/data_views.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/dataViews title: "dataViews" image: https://source.unsplash.com/400x175/?github description: API docs for the dataViews plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'dataViews'] --- import dataViewsObj from './data_views.devdocs.json'; diff --git a/api_docs/data_visualizer.mdx b/api_docs/data_visualizer.mdx index 2a81f61701658c..de0bef40df7625 100644 --- a/api_docs/data_visualizer.mdx +++ b/api_docs/data_visualizer.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/dataVisualizer title: "dataVisualizer" image: https://source.unsplash.com/400x175/?github description: API docs for the dataVisualizer plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'dataVisualizer'] --- import dataVisualizerObj from './data_visualizer.devdocs.json'; diff --git a/api_docs/deprecations_by_api.mdx b/api_docs/deprecations_by_api.mdx index 87ae72d3cd125a..23a561fec3dad4 100644 --- a/api_docs/deprecations_by_api.mdx +++ b/api_docs/deprecations_by_api.mdx @@ -7,7 +7,7 @@ id: kibDevDocsDeprecationsByApi slug: /kibana-dev-docs/api-meta/deprecated-api-list-by-api title: Deprecated API usage by API description: A list of deprecated APIs, which plugins are still referencing them, and when they need to be removed by. -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana'] --- diff --git a/api_docs/deprecations_by_plugin.mdx b/api_docs/deprecations_by_plugin.mdx index bcc17df54fa601..c69f6ade7befbf 100644 --- a/api_docs/deprecations_by_plugin.mdx +++ b/api_docs/deprecations_by_plugin.mdx @@ -7,7 +7,7 @@ id: kibDevDocsDeprecationsByPlugin slug: /kibana-dev-docs/api-meta/deprecated-api-list-by-plugin title: Deprecated API usage by plugin description: A list of deprecated APIs, which plugins are still referencing them, and when they need to be removed by. -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana'] --- diff --git a/api_docs/deprecations_by_team.mdx b/api_docs/deprecations_by_team.mdx index 14d5278fd975eb..fe074cbcb8fdb8 100644 --- a/api_docs/deprecations_by_team.mdx +++ b/api_docs/deprecations_by_team.mdx @@ -7,7 +7,7 @@ id: kibDevDocsDeprecationsDueByTeam slug: /kibana-dev-docs/api-meta/deprecations-due-by-team title: Deprecated APIs due to be removed, by team description: Lists the teams that are referencing deprecated APIs with a remove by date. -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana'] --- diff --git a/api_docs/dev_tools.mdx b/api_docs/dev_tools.mdx index a42baf0ce2b8ec..1a327af2759b1c 100644 --- a/api_docs/dev_tools.mdx +++ b/api_docs/dev_tools.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/devTools title: "devTools" image: https://source.unsplash.com/400x175/?github description: API docs for the devTools plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'devTools'] --- import devToolsObj from './dev_tools.devdocs.json'; diff --git a/api_docs/discover.mdx b/api_docs/discover.mdx index 49b97dcd6cf1c2..fd1e28b0a09a3b 100644 --- a/api_docs/discover.mdx +++ b/api_docs/discover.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/discover title: "discover" image: https://source.unsplash.com/400x175/?github description: API docs for the discover plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'discover'] --- import discoverObj from './discover.devdocs.json'; diff --git a/api_docs/discover_enhanced.mdx b/api_docs/discover_enhanced.mdx index 0c80a2b454e607..d5edee260171f1 100644 --- a/api_docs/discover_enhanced.mdx +++ b/api_docs/discover_enhanced.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/discoverEnhanced title: "discoverEnhanced" image: https://source.unsplash.com/400x175/?github description: API docs for the discoverEnhanced plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'discoverEnhanced'] --- import discoverEnhancedObj from './discover_enhanced.devdocs.json'; diff --git a/api_docs/ecs_data_quality_dashboard.mdx b/api_docs/ecs_data_quality_dashboard.mdx index 2e26d3d6b1f70d..8d2fd6221b72fb 100644 --- a/api_docs/ecs_data_quality_dashboard.mdx +++ b/api_docs/ecs_data_quality_dashboard.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/ecsDataQualityDashboard title: "ecsDataQualityDashboard" image: https://source.unsplash.com/400x175/?github description: API docs for the ecsDataQualityDashboard plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'ecsDataQualityDashboard'] --- import ecsDataQualityDashboardObj from './ecs_data_quality_dashboard.devdocs.json'; diff --git a/api_docs/elastic_assistant.mdx b/api_docs/elastic_assistant.mdx index 0d12bb07408d16..4169d6d15d8c69 100644 --- a/api_docs/elastic_assistant.mdx +++ b/api_docs/elastic_assistant.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/elasticAssistant title: "elasticAssistant" image: https://source.unsplash.com/400x175/?github description: API docs for the elasticAssistant plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'elasticAssistant'] --- import elasticAssistantObj from './elastic_assistant.devdocs.json'; diff --git a/api_docs/embeddable.mdx b/api_docs/embeddable.mdx index ceb8705e7623b7..e516425cbd582e 100644 --- a/api_docs/embeddable.mdx +++ b/api_docs/embeddable.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/embeddable title: "embeddable" image: https://source.unsplash.com/400x175/?github description: API docs for the embeddable plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'embeddable'] --- import embeddableObj from './embeddable.devdocs.json'; diff --git a/api_docs/embeddable_enhanced.mdx b/api_docs/embeddable_enhanced.mdx index 73a4ed4b4490eb..817010f0eac3d1 100644 --- a/api_docs/embeddable_enhanced.mdx +++ b/api_docs/embeddable_enhanced.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/embeddableEnhanced title: "embeddableEnhanced" image: https://source.unsplash.com/400x175/?github description: API docs for the embeddableEnhanced plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'embeddableEnhanced'] --- import embeddableEnhancedObj from './embeddable_enhanced.devdocs.json'; diff --git a/api_docs/encrypted_saved_objects.mdx b/api_docs/encrypted_saved_objects.mdx index 549a6143fe90ce..7d90d3ec16c3b5 100644 --- a/api_docs/encrypted_saved_objects.mdx +++ b/api_docs/encrypted_saved_objects.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/encryptedSavedObjects title: "encryptedSavedObjects" image: https://source.unsplash.com/400x175/?github description: API docs for the encryptedSavedObjects plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'encryptedSavedObjects'] --- import encryptedSavedObjectsObj from './encrypted_saved_objects.devdocs.json'; diff --git a/api_docs/enterprise_search.mdx b/api_docs/enterprise_search.mdx index b7fb0b5d1ae945..a166192c0c92fd 100644 --- a/api_docs/enterprise_search.mdx +++ b/api_docs/enterprise_search.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/enterpriseSearch title: "enterpriseSearch" image: https://source.unsplash.com/400x175/?github description: API docs for the enterpriseSearch plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'enterpriseSearch'] --- import enterpriseSearchObj from './enterprise_search.devdocs.json'; diff --git a/api_docs/es_ui_shared.mdx b/api_docs/es_ui_shared.mdx index 583b34020119c7..c7d559a6dd3d6b 100644 --- a/api_docs/es_ui_shared.mdx +++ b/api_docs/es_ui_shared.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/esUiShared title: "esUiShared" image: https://source.unsplash.com/400x175/?github description: API docs for the esUiShared plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'esUiShared'] --- import esUiSharedObj from './es_ui_shared.devdocs.json'; diff --git a/api_docs/event_annotation.mdx b/api_docs/event_annotation.mdx index 7ee9fa318e8b89..e9f4024dc30664 100644 --- a/api_docs/event_annotation.mdx +++ b/api_docs/event_annotation.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/eventAnnotation title: "eventAnnotation" image: https://source.unsplash.com/400x175/?github description: API docs for the eventAnnotation plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'eventAnnotation'] --- import eventAnnotationObj from './event_annotation.devdocs.json'; diff --git a/api_docs/event_annotation_listing.mdx b/api_docs/event_annotation_listing.mdx index 31a75e6e3c62d8..c62698d74f1f6f 100644 --- a/api_docs/event_annotation_listing.mdx +++ b/api_docs/event_annotation_listing.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/eventAnnotationListing title: "eventAnnotationListing" image: https://source.unsplash.com/400x175/?github description: API docs for the eventAnnotationListing plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'eventAnnotationListing'] --- import eventAnnotationListingObj from './event_annotation_listing.devdocs.json'; diff --git a/api_docs/event_log.mdx b/api_docs/event_log.mdx index 6dcc4093ebd50c..a430171ad87e84 100644 --- a/api_docs/event_log.mdx +++ b/api_docs/event_log.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/eventLog title: "eventLog" image: https://source.unsplash.com/400x175/?github description: API docs for the eventLog plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'eventLog'] --- import eventLogObj from './event_log.devdocs.json'; diff --git a/api_docs/exploratory_view.mdx b/api_docs/exploratory_view.mdx index d6fffbeedcba57..3cefc10f3655ff 100644 --- a/api_docs/exploratory_view.mdx +++ b/api_docs/exploratory_view.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/exploratoryView title: "exploratoryView" image: https://source.unsplash.com/400x175/?github description: API docs for the exploratoryView plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'exploratoryView'] --- import exploratoryViewObj from './exploratory_view.devdocs.json'; diff --git a/api_docs/expression_error.mdx b/api_docs/expression_error.mdx index eeef90b20ba87a..89d5546f3e89b5 100644 --- a/api_docs/expression_error.mdx +++ b/api_docs/expression_error.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressionError title: "expressionError" image: https://source.unsplash.com/400x175/?github description: API docs for the expressionError plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionError'] --- import expressionErrorObj from './expression_error.devdocs.json'; diff --git a/api_docs/expression_gauge.mdx b/api_docs/expression_gauge.mdx index 721db64c129776..de630765cb02b2 100644 --- a/api_docs/expression_gauge.mdx +++ b/api_docs/expression_gauge.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressionGauge title: "expressionGauge" image: https://source.unsplash.com/400x175/?github description: API docs for the expressionGauge plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionGauge'] --- import expressionGaugeObj from './expression_gauge.devdocs.json'; diff --git a/api_docs/expression_heatmap.mdx b/api_docs/expression_heatmap.mdx index ff1ae64d49636b..636edb47791804 100644 --- a/api_docs/expression_heatmap.mdx +++ b/api_docs/expression_heatmap.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressionHeatmap title: "expressionHeatmap" image: https://source.unsplash.com/400x175/?github description: API docs for the expressionHeatmap plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionHeatmap'] --- import expressionHeatmapObj from './expression_heatmap.devdocs.json'; diff --git a/api_docs/expression_image.mdx b/api_docs/expression_image.mdx index 2487a3b08ed7fd..35c31bdcd5bc64 100644 --- a/api_docs/expression_image.mdx +++ b/api_docs/expression_image.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressionImage title: "expressionImage" image: https://source.unsplash.com/400x175/?github description: API docs for the expressionImage plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionImage'] --- import expressionImageObj from './expression_image.devdocs.json'; diff --git a/api_docs/expression_legacy_metric_vis.mdx b/api_docs/expression_legacy_metric_vis.mdx index e302807f0d0baf..f59cc881a5ca6c 100644 --- a/api_docs/expression_legacy_metric_vis.mdx +++ b/api_docs/expression_legacy_metric_vis.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressionLegacyMetricVis title: "expressionLegacyMetricVis" image: https://source.unsplash.com/400x175/?github description: API docs for the expressionLegacyMetricVis plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionLegacyMetricVis'] --- import expressionLegacyMetricVisObj from './expression_legacy_metric_vis.devdocs.json'; diff --git a/api_docs/expression_metric.mdx b/api_docs/expression_metric.mdx index 435846db14c6cb..c5bd20363c9257 100644 --- a/api_docs/expression_metric.mdx +++ b/api_docs/expression_metric.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressionMetric title: "expressionMetric" image: https://source.unsplash.com/400x175/?github description: API docs for the expressionMetric plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionMetric'] --- import expressionMetricObj from './expression_metric.devdocs.json'; diff --git a/api_docs/expression_metric_vis.mdx b/api_docs/expression_metric_vis.mdx index 61a39627595c98..ef290a0663421b 100644 --- a/api_docs/expression_metric_vis.mdx +++ b/api_docs/expression_metric_vis.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressionMetricVis title: "expressionMetricVis" image: https://source.unsplash.com/400x175/?github description: API docs for the expressionMetricVis plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionMetricVis'] --- import expressionMetricVisObj from './expression_metric_vis.devdocs.json'; diff --git a/api_docs/expression_partition_vis.mdx b/api_docs/expression_partition_vis.mdx index e50c83ec013959..a2e2cd9204a11f 100644 --- a/api_docs/expression_partition_vis.mdx +++ b/api_docs/expression_partition_vis.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressionPartitionVis title: "expressionPartitionVis" image: https://source.unsplash.com/400x175/?github description: API docs for the expressionPartitionVis plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionPartitionVis'] --- import expressionPartitionVisObj from './expression_partition_vis.devdocs.json'; diff --git a/api_docs/expression_repeat_image.mdx b/api_docs/expression_repeat_image.mdx index bd17f68bc81688..fd541c66f05885 100644 --- a/api_docs/expression_repeat_image.mdx +++ b/api_docs/expression_repeat_image.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressionRepeatImage title: "expressionRepeatImage" image: https://source.unsplash.com/400x175/?github description: API docs for the expressionRepeatImage plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionRepeatImage'] --- import expressionRepeatImageObj from './expression_repeat_image.devdocs.json'; diff --git a/api_docs/expression_reveal_image.mdx b/api_docs/expression_reveal_image.mdx index 5a7af1ef1bd3b0..21b8143dc19312 100644 --- a/api_docs/expression_reveal_image.mdx +++ b/api_docs/expression_reveal_image.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressionRevealImage title: "expressionRevealImage" image: https://source.unsplash.com/400x175/?github description: API docs for the expressionRevealImage plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionRevealImage'] --- import expressionRevealImageObj from './expression_reveal_image.devdocs.json'; diff --git a/api_docs/expression_shape.mdx b/api_docs/expression_shape.mdx index 28349391a42ca6..1e5b920cc20d82 100644 --- a/api_docs/expression_shape.mdx +++ b/api_docs/expression_shape.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressionShape title: "expressionShape" image: https://source.unsplash.com/400x175/?github description: API docs for the expressionShape plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionShape'] --- import expressionShapeObj from './expression_shape.devdocs.json'; diff --git a/api_docs/expression_tagcloud.mdx b/api_docs/expression_tagcloud.mdx index 53b67359e43f09..aa626099d67e62 100644 --- a/api_docs/expression_tagcloud.mdx +++ b/api_docs/expression_tagcloud.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressionTagcloud title: "expressionTagcloud" image: https://source.unsplash.com/400x175/?github description: API docs for the expressionTagcloud plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionTagcloud'] --- import expressionTagcloudObj from './expression_tagcloud.devdocs.json'; diff --git a/api_docs/expression_x_y.mdx b/api_docs/expression_x_y.mdx index 52e662237e9d0f..bc127362fae189 100644 --- a/api_docs/expression_x_y.mdx +++ b/api_docs/expression_x_y.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressionXY title: "expressionXY" image: https://source.unsplash.com/400x175/?github description: API docs for the expressionXY plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionXY'] --- import expressionXYObj from './expression_x_y.devdocs.json'; diff --git a/api_docs/expressions.mdx b/api_docs/expressions.mdx index cf3cdc69aa4e73..69ebfdbccd1465 100644 --- a/api_docs/expressions.mdx +++ b/api_docs/expressions.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressions title: "expressions" image: https://source.unsplash.com/400x175/?github description: API docs for the expressions plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressions'] --- import expressionsObj from './expressions.devdocs.json'; diff --git a/api_docs/features.mdx b/api_docs/features.mdx index ba10e9878baf96..154d3f98cabd92 100644 --- a/api_docs/features.mdx +++ b/api_docs/features.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/features title: "features" image: https://source.unsplash.com/400x175/?github description: API docs for the features plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'features'] --- import featuresObj from './features.devdocs.json'; diff --git a/api_docs/field_formats.mdx b/api_docs/field_formats.mdx index fc4bda56caef69..5af2d365323767 100644 --- a/api_docs/field_formats.mdx +++ b/api_docs/field_formats.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/fieldFormats title: "fieldFormats" image: https://source.unsplash.com/400x175/?github description: API docs for the fieldFormats plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'fieldFormats'] --- import fieldFormatsObj from './field_formats.devdocs.json'; diff --git a/api_docs/file_upload.mdx b/api_docs/file_upload.mdx index a49b0b5cf63551..c08a1f7676fd1e 100644 --- a/api_docs/file_upload.mdx +++ b/api_docs/file_upload.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/fileUpload title: "fileUpload" image: https://source.unsplash.com/400x175/?github description: API docs for the fileUpload plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'fileUpload'] --- import fileUploadObj from './file_upload.devdocs.json'; diff --git a/api_docs/files.mdx b/api_docs/files.mdx index f74a928b282ea9..a3a79d9e09c400 100644 --- a/api_docs/files.mdx +++ b/api_docs/files.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/files title: "files" image: https://source.unsplash.com/400x175/?github description: API docs for the files plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'files'] --- import filesObj from './files.devdocs.json'; diff --git a/api_docs/files_management.mdx b/api_docs/files_management.mdx index 1dd499c63166e6..b1f9c7fd3492e4 100644 --- a/api_docs/files_management.mdx +++ b/api_docs/files_management.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/filesManagement title: "filesManagement" image: https://source.unsplash.com/400x175/?github description: API docs for the filesManagement plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'filesManagement'] --- import filesManagementObj from './files_management.devdocs.json'; diff --git a/api_docs/fleet.mdx b/api_docs/fleet.mdx index 6e1a97e88ddd65..0289e3e98b67dd 100644 --- a/api_docs/fleet.mdx +++ b/api_docs/fleet.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/fleet title: "fleet" image: https://source.unsplash.com/400x175/?github description: API docs for the fleet plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'fleet'] --- import fleetObj from './fleet.devdocs.json'; diff --git a/api_docs/global_search.mdx b/api_docs/global_search.mdx index d638adaa8f542a..64217a72937355 100644 --- a/api_docs/global_search.mdx +++ b/api_docs/global_search.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/globalSearch title: "globalSearch" image: https://source.unsplash.com/400x175/?github description: API docs for the globalSearch plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'globalSearch'] --- import globalSearchObj from './global_search.devdocs.json'; diff --git a/api_docs/guided_onboarding.mdx b/api_docs/guided_onboarding.mdx index d75354b1ec44e8..447dc6330163d6 100644 --- a/api_docs/guided_onboarding.mdx +++ b/api_docs/guided_onboarding.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/guidedOnboarding title: "guidedOnboarding" image: https://source.unsplash.com/400x175/?github description: API docs for the guidedOnboarding plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'guidedOnboarding'] --- import guidedOnboardingObj from './guided_onboarding.devdocs.json'; diff --git a/api_docs/home.mdx b/api_docs/home.mdx index 399140cca3546b..a607c4545be0c1 100644 --- a/api_docs/home.mdx +++ b/api_docs/home.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/home title: "home" image: https://source.unsplash.com/400x175/?github description: API docs for the home plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'home'] --- import homeObj from './home.devdocs.json'; diff --git a/api_docs/image_embeddable.mdx b/api_docs/image_embeddable.mdx index 376d7dc5f7e749..254007f15e1c9d 100644 --- a/api_docs/image_embeddable.mdx +++ b/api_docs/image_embeddable.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/imageEmbeddable title: "imageEmbeddable" image: https://source.unsplash.com/400x175/?github description: API docs for the imageEmbeddable plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'imageEmbeddable'] --- import imageEmbeddableObj from './image_embeddable.devdocs.json'; diff --git a/api_docs/index_lifecycle_management.mdx b/api_docs/index_lifecycle_management.mdx index de06340ffc7d92..e769def4231c25 100644 --- a/api_docs/index_lifecycle_management.mdx +++ b/api_docs/index_lifecycle_management.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/indexLifecycleManagement title: "indexLifecycleManagement" image: https://source.unsplash.com/400x175/?github description: API docs for the indexLifecycleManagement plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'indexLifecycleManagement'] --- import indexLifecycleManagementObj from './index_lifecycle_management.devdocs.json'; diff --git a/api_docs/index_management.devdocs.json b/api_docs/index_management.devdocs.json index 975b83f855f1bd..4eca4cc05eb090 100644 --- a/api_docs/index_management.devdocs.json +++ b/api_docs/index_management.devdocs.json @@ -848,7 +848,7 @@ "label": "IndexManagementConfig", "description": [], "signature": [ - "{ readonly ui: Readonly<{} & { enabled: boolean; }>; readonly enableIndexActions: boolean; readonly enableLegacyTemplates: boolean; readonly dev: Readonly<{} & { enableIndexDetailsPage: boolean; }>; readonly enableIndexStats: boolean; readonly editableIndexSettings: \"all\" | \"limited\"; }" + "{ readonly ui: Readonly<{} & { enabled: boolean; }>; readonly enableIndexActions: boolean; readonly enableLegacyTemplates: boolean; readonly dev: Readonly<{} & { enableIndexDetailsPage: boolean; }>; readonly enableIndexStats: boolean; readonly editableIndexSettings: \"all\" | \"limited\"; readonly enableDataStreamsStorageColumn: boolean; }" ], "path": "x-pack/plugins/index_management/server/config.ts", "deprecated": false, diff --git a/api_docs/index_management.mdx b/api_docs/index_management.mdx index 60bcf57401a940..bf387a3963b989 100644 --- a/api_docs/index_management.mdx +++ b/api_docs/index_management.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/indexManagement title: "indexManagement" image: https://source.unsplash.com/400x175/?github description: API docs for the indexManagement plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'indexManagement'] --- import indexManagementObj from './index_management.devdocs.json'; diff --git a/api_docs/infra.mdx b/api_docs/infra.mdx index bc4e3197babb3f..37ce94c2773275 100644 --- a/api_docs/infra.mdx +++ b/api_docs/infra.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/infra title: "infra" image: https://source.unsplash.com/400x175/?github description: API docs for the infra plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'infra'] --- import infraObj from './infra.devdocs.json'; diff --git a/api_docs/inspector.mdx b/api_docs/inspector.mdx index 24b1ba3d064ff3..983dae801949a4 100644 --- a/api_docs/inspector.mdx +++ b/api_docs/inspector.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/inspector title: "inspector" image: https://source.unsplash.com/400x175/?github description: API docs for the inspector plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'inspector'] --- import inspectorObj from './inspector.devdocs.json'; diff --git a/api_docs/interactive_setup.mdx b/api_docs/interactive_setup.mdx index 243efc576817b4..de366637c7d2c9 100644 --- a/api_docs/interactive_setup.mdx +++ b/api_docs/interactive_setup.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/interactiveSetup title: "interactiveSetup" image: https://source.unsplash.com/400x175/?github description: API docs for the interactiveSetup plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'interactiveSetup'] --- import interactiveSetupObj from './interactive_setup.devdocs.json'; diff --git a/api_docs/kbn_ace.mdx b/api_docs/kbn_ace.mdx index 5078c9fd5404d8..7810cd2547294c 100644 --- a/api_docs/kbn_ace.mdx +++ b/api_docs/kbn_ace.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ace title: "@kbn/ace" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ace plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ace'] --- import kbnAceObj from './kbn_ace.devdocs.json'; diff --git a/api_docs/kbn_aiops_components.mdx b/api_docs/kbn_aiops_components.mdx index 9a0a726f7e102a..ca35f1db12ac44 100644 --- a/api_docs/kbn_aiops_components.mdx +++ b/api_docs/kbn_aiops_components.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-aiops-components title: "@kbn/aiops-components" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/aiops-components plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/aiops-components'] --- import kbnAiopsComponentsObj from './kbn_aiops_components.devdocs.json'; diff --git a/api_docs/kbn_aiops_utils.mdx b/api_docs/kbn_aiops_utils.mdx index 2c39c615a258a1..59cc394c94dbaf 100644 --- a/api_docs/kbn_aiops_utils.mdx +++ b/api_docs/kbn_aiops_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-aiops-utils title: "@kbn/aiops-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/aiops-utils plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/aiops-utils'] --- import kbnAiopsUtilsObj from './kbn_aiops_utils.devdocs.json'; diff --git a/api_docs/kbn_alerting_api_integration_helpers.mdx b/api_docs/kbn_alerting_api_integration_helpers.mdx index 5f21159854971b..eff55922aca505 100644 --- a/api_docs/kbn_alerting_api_integration_helpers.mdx +++ b/api_docs/kbn_alerting_api_integration_helpers.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-alerting-api-integration-helpers title: "@kbn/alerting-api-integration-helpers" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/alerting-api-integration-helpers plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/alerting-api-integration-helpers'] --- import kbnAlertingApiIntegrationHelpersObj from './kbn_alerting_api_integration_helpers.devdocs.json'; diff --git a/api_docs/kbn_alerting_state_types.mdx b/api_docs/kbn_alerting_state_types.mdx index 795e16d28fdfe6..a0fb40f5464fac 100644 --- a/api_docs/kbn_alerting_state_types.mdx +++ b/api_docs/kbn_alerting_state_types.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-alerting-state-types title: "@kbn/alerting-state-types" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/alerting-state-types plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/alerting-state-types'] --- import kbnAlertingStateTypesObj from './kbn_alerting_state_types.devdocs.json'; diff --git a/api_docs/kbn_alerts_as_data_utils.mdx b/api_docs/kbn_alerts_as_data_utils.mdx index 56ed0507380b3f..0ac096ba4c09db 100644 --- a/api_docs/kbn_alerts_as_data_utils.mdx +++ b/api_docs/kbn_alerts_as_data_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-alerts-as-data-utils title: "@kbn/alerts-as-data-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/alerts-as-data-utils plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/alerts-as-data-utils'] --- import kbnAlertsAsDataUtilsObj from './kbn_alerts_as_data_utils.devdocs.json'; diff --git a/api_docs/kbn_alerts_ui_shared.mdx b/api_docs/kbn_alerts_ui_shared.mdx index 37fd7b9e5433f0..62d8968c73c9e5 100644 --- a/api_docs/kbn_alerts_ui_shared.mdx +++ b/api_docs/kbn_alerts_ui_shared.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-alerts-ui-shared title: "@kbn/alerts-ui-shared" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/alerts-ui-shared plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/alerts-ui-shared'] --- import kbnAlertsUiSharedObj from './kbn_alerts_ui_shared.devdocs.json'; diff --git a/api_docs/kbn_analytics.mdx b/api_docs/kbn_analytics.mdx index d520081887a0c9..8a54ecd18f11e3 100644 --- a/api_docs/kbn_analytics.mdx +++ b/api_docs/kbn_analytics.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-analytics title: "@kbn/analytics" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/analytics plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/analytics'] --- import kbnAnalyticsObj from './kbn_analytics.devdocs.json'; diff --git a/api_docs/kbn_analytics_client.mdx b/api_docs/kbn_analytics_client.mdx index 08ad4a35daa9a1..8cee0cccaf5742 100644 --- a/api_docs/kbn_analytics_client.mdx +++ b/api_docs/kbn_analytics_client.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-analytics-client title: "@kbn/analytics-client" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/analytics-client plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/analytics-client'] --- import kbnAnalyticsClientObj from './kbn_analytics_client.devdocs.json'; diff --git a/api_docs/kbn_analytics_shippers_elastic_v3_browser.mdx b/api_docs/kbn_analytics_shippers_elastic_v3_browser.mdx index 7deea7f5c5730d..858db97311deef 100644 --- a/api_docs/kbn_analytics_shippers_elastic_v3_browser.mdx +++ b/api_docs/kbn_analytics_shippers_elastic_v3_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-analytics-shippers-elastic-v3-browser title: "@kbn/analytics-shippers-elastic-v3-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/analytics-shippers-elastic-v3-browser plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/analytics-shippers-elastic-v3-browser'] --- import kbnAnalyticsShippersElasticV3BrowserObj from './kbn_analytics_shippers_elastic_v3_browser.devdocs.json'; diff --git a/api_docs/kbn_analytics_shippers_elastic_v3_common.mdx b/api_docs/kbn_analytics_shippers_elastic_v3_common.mdx index 7a74f553a908fa..d1acf6cd03ad47 100644 --- a/api_docs/kbn_analytics_shippers_elastic_v3_common.mdx +++ b/api_docs/kbn_analytics_shippers_elastic_v3_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-analytics-shippers-elastic-v3-common title: "@kbn/analytics-shippers-elastic-v3-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/analytics-shippers-elastic-v3-common plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/analytics-shippers-elastic-v3-common'] --- import kbnAnalyticsShippersElasticV3CommonObj from './kbn_analytics_shippers_elastic_v3_common.devdocs.json'; diff --git a/api_docs/kbn_analytics_shippers_elastic_v3_server.mdx b/api_docs/kbn_analytics_shippers_elastic_v3_server.mdx index e034b7d8a62f5d..9dabe2302c3c88 100644 --- a/api_docs/kbn_analytics_shippers_elastic_v3_server.mdx +++ b/api_docs/kbn_analytics_shippers_elastic_v3_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-analytics-shippers-elastic-v3-server title: "@kbn/analytics-shippers-elastic-v3-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/analytics-shippers-elastic-v3-server plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/analytics-shippers-elastic-v3-server'] --- import kbnAnalyticsShippersElasticV3ServerObj from './kbn_analytics_shippers_elastic_v3_server.devdocs.json'; diff --git a/api_docs/kbn_analytics_shippers_fullstory.mdx b/api_docs/kbn_analytics_shippers_fullstory.mdx index 20765e884b78e7..b8e03d3fd1f9f6 100644 --- a/api_docs/kbn_analytics_shippers_fullstory.mdx +++ b/api_docs/kbn_analytics_shippers_fullstory.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-analytics-shippers-fullstory title: "@kbn/analytics-shippers-fullstory" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/analytics-shippers-fullstory plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/analytics-shippers-fullstory'] --- import kbnAnalyticsShippersFullstoryObj from './kbn_analytics_shippers_fullstory.devdocs.json'; diff --git a/api_docs/kbn_analytics_shippers_gainsight.mdx b/api_docs/kbn_analytics_shippers_gainsight.mdx index d26cf387d8a030..61db312c8ea4ec 100644 --- a/api_docs/kbn_analytics_shippers_gainsight.mdx +++ b/api_docs/kbn_analytics_shippers_gainsight.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-analytics-shippers-gainsight title: "@kbn/analytics-shippers-gainsight" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/analytics-shippers-gainsight plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/analytics-shippers-gainsight'] --- import kbnAnalyticsShippersGainsightObj from './kbn_analytics_shippers_gainsight.devdocs.json'; diff --git a/api_docs/kbn_apm_config_loader.mdx b/api_docs/kbn_apm_config_loader.mdx index 1e3c7dd032b508..406745e4a19fa1 100644 --- a/api_docs/kbn_apm_config_loader.mdx +++ b/api_docs/kbn_apm_config_loader.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-apm-config-loader title: "@kbn/apm-config-loader" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/apm-config-loader plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/apm-config-loader'] --- import kbnApmConfigLoaderObj from './kbn_apm_config_loader.devdocs.json'; diff --git a/api_docs/kbn_apm_synthtrace.mdx b/api_docs/kbn_apm_synthtrace.mdx index cbfdc975a206be..8e9a3b742e190c 100644 --- a/api_docs/kbn_apm_synthtrace.mdx +++ b/api_docs/kbn_apm_synthtrace.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-apm-synthtrace title: "@kbn/apm-synthtrace" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/apm-synthtrace plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/apm-synthtrace'] --- import kbnApmSynthtraceObj from './kbn_apm_synthtrace.devdocs.json'; diff --git a/api_docs/kbn_apm_synthtrace_client.mdx b/api_docs/kbn_apm_synthtrace_client.mdx index 70ea452ecaf1c7..62a30dca50ed72 100644 --- a/api_docs/kbn_apm_synthtrace_client.mdx +++ b/api_docs/kbn_apm_synthtrace_client.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-apm-synthtrace-client title: "@kbn/apm-synthtrace-client" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/apm-synthtrace-client plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/apm-synthtrace-client'] --- import kbnApmSynthtraceClientObj from './kbn_apm_synthtrace_client.devdocs.json'; diff --git a/api_docs/kbn_apm_utils.mdx b/api_docs/kbn_apm_utils.mdx index 8b0d25904e1160..aaf355fb6391a5 100644 --- a/api_docs/kbn_apm_utils.mdx +++ b/api_docs/kbn_apm_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-apm-utils title: "@kbn/apm-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/apm-utils plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/apm-utils'] --- import kbnApmUtilsObj from './kbn_apm_utils.devdocs.json'; diff --git a/api_docs/kbn_axe_config.mdx b/api_docs/kbn_axe_config.mdx index 666059e8f335d4..34aac1ff169789 100644 --- a/api_docs/kbn_axe_config.mdx +++ b/api_docs/kbn_axe_config.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-axe-config title: "@kbn/axe-config" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/axe-config plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/axe-config'] --- import kbnAxeConfigObj from './kbn_axe_config.devdocs.json'; diff --git a/api_docs/kbn_cases_components.mdx b/api_docs/kbn_cases_components.mdx index 3a13300083db6d..1c38bffffefcbf 100644 --- a/api_docs/kbn_cases_components.mdx +++ b/api_docs/kbn_cases_components.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-cases-components title: "@kbn/cases-components" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/cases-components plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/cases-components'] --- import kbnCasesComponentsObj from './kbn_cases_components.devdocs.json'; diff --git a/api_docs/kbn_cell_actions.mdx b/api_docs/kbn_cell_actions.mdx index 10b5d947e75413..ad0608154b09ed 100644 --- a/api_docs/kbn_cell_actions.mdx +++ b/api_docs/kbn_cell_actions.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-cell-actions title: "@kbn/cell-actions" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/cell-actions plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/cell-actions'] --- import kbnCellActionsObj from './kbn_cell_actions.devdocs.json'; diff --git a/api_docs/kbn_chart_expressions_common.mdx b/api_docs/kbn_chart_expressions_common.mdx index 74a04194f62e77..c658715bbda022 100644 --- a/api_docs/kbn_chart_expressions_common.mdx +++ b/api_docs/kbn_chart_expressions_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-chart-expressions-common title: "@kbn/chart-expressions-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/chart-expressions-common plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/chart-expressions-common'] --- import kbnChartExpressionsCommonObj from './kbn_chart_expressions_common.devdocs.json'; diff --git a/api_docs/kbn_chart_icons.mdx b/api_docs/kbn_chart_icons.mdx index 3b8bfaa7cc60fe..6806a26b95e05d 100644 --- a/api_docs/kbn_chart_icons.mdx +++ b/api_docs/kbn_chart_icons.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-chart-icons title: "@kbn/chart-icons" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/chart-icons plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/chart-icons'] --- import kbnChartIconsObj from './kbn_chart_icons.devdocs.json'; diff --git a/api_docs/kbn_ci_stats_core.mdx b/api_docs/kbn_ci_stats_core.mdx index 4c657d0d88817c..b2633323fcebb8 100644 --- a/api_docs/kbn_ci_stats_core.mdx +++ b/api_docs/kbn_ci_stats_core.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ci-stats-core title: "@kbn/ci-stats-core" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ci-stats-core plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ci-stats-core'] --- import kbnCiStatsCoreObj from './kbn_ci_stats_core.devdocs.json'; diff --git a/api_docs/kbn_ci_stats_performance_metrics.mdx b/api_docs/kbn_ci_stats_performance_metrics.mdx index b906d47ceb1894..931e0cc195ab8f 100644 --- a/api_docs/kbn_ci_stats_performance_metrics.mdx +++ b/api_docs/kbn_ci_stats_performance_metrics.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ci-stats-performance-metrics title: "@kbn/ci-stats-performance-metrics" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ci-stats-performance-metrics plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ci-stats-performance-metrics'] --- import kbnCiStatsPerformanceMetricsObj from './kbn_ci_stats_performance_metrics.devdocs.json'; diff --git a/api_docs/kbn_ci_stats_reporter.mdx b/api_docs/kbn_ci_stats_reporter.mdx index 84273b70f11b78..834a0c9f107a38 100644 --- a/api_docs/kbn_ci_stats_reporter.mdx +++ b/api_docs/kbn_ci_stats_reporter.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ci-stats-reporter title: "@kbn/ci-stats-reporter" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ci-stats-reporter plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ci-stats-reporter'] --- import kbnCiStatsReporterObj from './kbn_ci_stats_reporter.devdocs.json'; diff --git a/api_docs/kbn_cli_dev_mode.mdx b/api_docs/kbn_cli_dev_mode.mdx index 5e995be3f754e4..a12f7daec2a8d4 100644 --- a/api_docs/kbn_cli_dev_mode.mdx +++ b/api_docs/kbn_cli_dev_mode.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-cli-dev-mode title: "@kbn/cli-dev-mode" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/cli-dev-mode plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/cli-dev-mode'] --- import kbnCliDevModeObj from './kbn_cli_dev_mode.devdocs.json'; diff --git a/api_docs/kbn_code_editor.mdx b/api_docs/kbn_code_editor.mdx index ff93bd3a10710f..5ba972503150a1 100644 --- a/api_docs/kbn_code_editor.mdx +++ b/api_docs/kbn_code_editor.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-code-editor title: "@kbn/code-editor" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/code-editor plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/code-editor'] --- import kbnCodeEditorObj from './kbn_code_editor.devdocs.json'; diff --git a/api_docs/kbn_code_editor_mocks.mdx b/api_docs/kbn_code_editor_mocks.mdx index 4cc69c3c9adffd..10eea5f87555e3 100644 --- a/api_docs/kbn_code_editor_mocks.mdx +++ b/api_docs/kbn_code_editor_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-code-editor-mocks title: "@kbn/code-editor-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/code-editor-mocks plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/code-editor-mocks'] --- import kbnCodeEditorMocksObj from './kbn_code_editor_mocks.devdocs.json'; diff --git a/api_docs/kbn_coloring.mdx b/api_docs/kbn_coloring.mdx index 03b51696fa0dc9..741b57828ff441 100644 --- a/api_docs/kbn_coloring.mdx +++ b/api_docs/kbn_coloring.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-coloring title: "@kbn/coloring" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/coloring plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/coloring'] --- import kbnColoringObj from './kbn_coloring.devdocs.json'; diff --git a/api_docs/kbn_config.mdx b/api_docs/kbn_config.mdx index fa1a4bd4483aff..6aab0e7ec09eb9 100644 --- a/api_docs/kbn_config.mdx +++ b/api_docs/kbn_config.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-config title: "@kbn/config" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/config plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/config'] --- import kbnConfigObj from './kbn_config.devdocs.json'; diff --git a/api_docs/kbn_config_mocks.mdx b/api_docs/kbn_config_mocks.mdx index d22278fc451e7e..e245a70c92e463 100644 --- a/api_docs/kbn_config_mocks.mdx +++ b/api_docs/kbn_config_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-config-mocks title: "@kbn/config-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/config-mocks plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/config-mocks'] --- import kbnConfigMocksObj from './kbn_config_mocks.devdocs.json'; diff --git a/api_docs/kbn_config_schema.mdx b/api_docs/kbn_config_schema.mdx index d5ce6018d67a8c..0da625e9b3cac0 100644 --- a/api_docs/kbn_config_schema.mdx +++ b/api_docs/kbn_config_schema.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-config-schema title: "@kbn/config-schema" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/config-schema plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/config-schema'] --- import kbnConfigSchemaObj from './kbn_config_schema.devdocs.json'; diff --git a/api_docs/kbn_content_management_content_editor.mdx b/api_docs/kbn_content_management_content_editor.mdx index 6568853c0b3f19..73032e0667507f 100644 --- a/api_docs/kbn_content_management_content_editor.mdx +++ b/api_docs/kbn_content_management_content_editor.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-content-management-content-editor title: "@kbn/content-management-content-editor" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/content-management-content-editor plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/content-management-content-editor'] --- import kbnContentManagementContentEditorObj from './kbn_content_management_content_editor.devdocs.json'; diff --git a/api_docs/kbn_content_management_tabbed_table_list_view.mdx b/api_docs/kbn_content_management_tabbed_table_list_view.mdx index 379316afe5f004..0e4dc5d131dc8c 100644 --- a/api_docs/kbn_content_management_tabbed_table_list_view.mdx +++ b/api_docs/kbn_content_management_tabbed_table_list_view.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-content-management-tabbed-table-list-view title: "@kbn/content-management-tabbed-table-list-view" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/content-management-tabbed-table-list-view plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/content-management-tabbed-table-list-view'] --- import kbnContentManagementTabbedTableListViewObj from './kbn_content_management_tabbed_table_list_view.devdocs.json'; diff --git a/api_docs/kbn_content_management_table_list_view.mdx b/api_docs/kbn_content_management_table_list_view.mdx index f049c4c98ece5b..e58ad1b9f0bde4 100644 --- a/api_docs/kbn_content_management_table_list_view.mdx +++ b/api_docs/kbn_content_management_table_list_view.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-content-management-table-list-view title: "@kbn/content-management-table-list-view" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/content-management-table-list-view plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/content-management-table-list-view'] --- import kbnContentManagementTableListViewObj from './kbn_content_management_table_list_view.devdocs.json'; diff --git a/api_docs/kbn_content_management_table_list_view_table.mdx b/api_docs/kbn_content_management_table_list_view_table.mdx index 4608cd2933976c..870d29136c20bb 100644 --- a/api_docs/kbn_content_management_table_list_view_table.mdx +++ b/api_docs/kbn_content_management_table_list_view_table.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-content-management-table-list-view-table title: "@kbn/content-management-table-list-view-table" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/content-management-table-list-view-table plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/content-management-table-list-view-table'] --- import kbnContentManagementTableListViewTableObj from './kbn_content_management_table_list_view_table.devdocs.json'; diff --git a/api_docs/kbn_content_management_utils.mdx b/api_docs/kbn_content_management_utils.mdx index 8e1c094b03ad45..7d6ec0db3eddbd 100644 --- a/api_docs/kbn_content_management_utils.mdx +++ b/api_docs/kbn_content_management_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-content-management-utils title: "@kbn/content-management-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/content-management-utils plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/content-management-utils'] --- import kbnContentManagementUtilsObj from './kbn_content_management_utils.devdocs.json'; diff --git a/api_docs/kbn_core_analytics_browser.mdx b/api_docs/kbn_core_analytics_browser.mdx index c3693b1a67cdac..b45f2bafe0673c 100644 --- a/api_docs/kbn_core_analytics_browser.mdx +++ b/api_docs/kbn_core_analytics_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-analytics-browser title: "@kbn/core-analytics-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-analytics-browser plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-analytics-browser'] --- import kbnCoreAnalyticsBrowserObj from './kbn_core_analytics_browser.devdocs.json'; diff --git a/api_docs/kbn_core_analytics_browser_internal.mdx b/api_docs/kbn_core_analytics_browser_internal.mdx index 8e33e5ce6071f4..d5a028ec68f48b 100644 --- a/api_docs/kbn_core_analytics_browser_internal.mdx +++ b/api_docs/kbn_core_analytics_browser_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-analytics-browser-internal title: "@kbn/core-analytics-browser-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-analytics-browser-internal plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-analytics-browser-internal'] --- import kbnCoreAnalyticsBrowserInternalObj from './kbn_core_analytics_browser_internal.devdocs.json'; diff --git a/api_docs/kbn_core_analytics_browser_mocks.mdx b/api_docs/kbn_core_analytics_browser_mocks.mdx index 74943d531b6fe1..fadd9a3adacdaf 100644 --- a/api_docs/kbn_core_analytics_browser_mocks.mdx +++ b/api_docs/kbn_core_analytics_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-analytics-browser-mocks title: "@kbn/core-analytics-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-analytics-browser-mocks plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-analytics-browser-mocks'] --- import kbnCoreAnalyticsBrowserMocksObj from './kbn_core_analytics_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_analytics_server.mdx b/api_docs/kbn_core_analytics_server.mdx index a16eed6c519082..f698b5b106296b 100644 --- a/api_docs/kbn_core_analytics_server.mdx +++ b/api_docs/kbn_core_analytics_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-analytics-server title: "@kbn/core-analytics-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-analytics-server plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-analytics-server'] --- import kbnCoreAnalyticsServerObj from './kbn_core_analytics_server.devdocs.json'; diff --git a/api_docs/kbn_core_analytics_server_internal.mdx b/api_docs/kbn_core_analytics_server_internal.mdx index 06963fc0090d06..a2e400548ffc40 100644 --- a/api_docs/kbn_core_analytics_server_internal.mdx +++ b/api_docs/kbn_core_analytics_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-analytics-server-internal title: "@kbn/core-analytics-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-analytics-server-internal plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-analytics-server-internal'] --- import kbnCoreAnalyticsServerInternalObj from './kbn_core_analytics_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_analytics_server_mocks.mdx b/api_docs/kbn_core_analytics_server_mocks.mdx index e9503e2e934d86..73648f484295db 100644 --- a/api_docs/kbn_core_analytics_server_mocks.mdx +++ b/api_docs/kbn_core_analytics_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-analytics-server-mocks title: "@kbn/core-analytics-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-analytics-server-mocks plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-analytics-server-mocks'] --- import kbnCoreAnalyticsServerMocksObj from './kbn_core_analytics_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_application_browser.mdx b/api_docs/kbn_core_application_browser.mdx index dbcce105c4b508..63601d5c638571 100644 --- a/api_docs/kbn_core_application_browser.mdx +++ b/api_docs/kbn_core_application_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-application-browser title: "@kbn/core-application-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-application-browser plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-application-browser'] --- import kbnCoreApplicationBrowserObj from './kbn_core_application_browser.devdocs.json'; diff --git a/api_docs/kbn_core_application_browser_internal.mdx b/api_docs/kbn_core_application_browser_internal.mdx index 44ce284fcafff4..36d76402ff1e3b 100644 --- a/api_docs/kbn_core_application_browser_internal.mdx +++ b/api_docs/kbn_core_application_browser_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-application-browser-internal title: "@kbn/core-application-browser-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-application-browser-internal plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-application-browser-internal'] --- import kbnCoreApplicationBrowserInternalObj from './kbn_core_application_browser_internal.devdocs.json'; diff --git a/api_docs/kbn_core_application_browser_mocks.mdx b/api_docs/kbn_core_application_browser_mocks.mdx index d792e0f5207f84..22309e07cfa41a 100644 --- a/api_docs/kbn_core_application_browser_mocks.mdx +++ b/api_docs/kbn_core_application_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-application-browser-mocks title: "@kbn/core-application-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-application-browser-mocks plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-application-browser-mocks'] --- import kbnCoreApplicationBrowserMocksObj from './kbn_core_application_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_application_common.mdx b/api_docs/kbn_core_application_common.mdx index 7b8f901ed38500..38e189cee23745 100644 --- a/api_docs/kbn_core_application_common.mdx +++ b/api_docs/kbn_core_application_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-application-common title: "@kbn/core-application-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-application-common plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-application-common'] --- import kbnCoreApplicationCommonObj from './kbn_core_application_common.devdocs.json'; diff --git a/api_docs/kbn_core_apps_browser_internal.mdx b/api_docs/kbn_core_apps_browser_internal.mdx index 74a072d78c7937..0d4ce1daf14d0e 100644 --- a/api_docs/kbn_core_apps_browser_internal.mdx +++ b/api_docs/kbn_core_apps_browser_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-apps-browser-internal title: "@kbn/core-apps-browser-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-apps-browser-internal plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-apps-browser-internal'] --- import kbnCoreAppsBrowserInternalObj from './kbn_core_apps_browser_internal.devdocs.json'; diff --git a/api_docs/kbn_core_apps_browser_mocks.mdx b/api_docs/kbn_core_apps_browser_mocks.mdx index ea4a4d4d96a0ef..cae1c55f3fc2ff 100644 --- a/api_docs/kbn_core_apps_browser_mocks.mdx +++ b/api_docs/kbn_core_apps_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-apps-browser-mocks title: "@kbn/core-apps-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-apps-browser-mocks plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-apps-browser-mocks'] --- import kbnCoreAppsBrowserMocksObj from './kbn_core_apps_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_apps_server_internal.mdx b/api_docs/kbn_core_apps_server_internal.mdx index 3317fb436cf2fe..be17ec5f53f4a7 100644 --- a/api_docs/kbn_core_apps_server_internal.mdx +++ b/api_docs/kbn_core_apps_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-apps-server-internal title: "@kbn/core-apps-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-apps-server-internal plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-apps-server-internal'] --- import kbnCoreAppsServerInternalObj from './kbn_core_apps_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_base_browser_mocks.mdx b/api_docs/kbn_core_base_browser_mocks.mdx index 15e5ca8532168d..bfbbf525f14d48 100644 --- a/api_docs/kbn_core_base_browser_mocks.mdx +++ b/api_docs/kbn_core_base_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-base-browser-mocks title: "@kbn/core-base-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-base-browser-mocks plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-base-browser-mocks'] --- import kbnCoreBaseBrowserMocksObj from './kbn_core_base_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_base_common.mdx b/api_docs/kbn_core_base_common.mdx index 3a4a5770ab27fa..b4ebe53dc4c371 100644 --- a/api_docs/kbn_core_base_common.mdx +++ b/api_docs/kbn_core_base_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-base-common title: "@kbn/core-base-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-base-common plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-base-common'] --- import kbnCoreBaseCommonObj from './kbn_core_base_common.devdocs.json'; diff --git a/api_docs/kbn_core_base_server_internal.mdx b/api_docs/kbn_core_base_server_internal.mdx index 9551962e6bd862..e19ec35537e5cc 100644 --- a/api_docs/kbn_core_base_server_internal.mdx +++ b/api_docs/kbn_core_base_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-base-server-internal title: "@kbn/core-base-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-base-server-internal plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-base-server-internal'] --- import kbnCoreBaseServerInternalObj from './kbn_core_base_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_base_server_mocks.mdx b/api_docs/kbn_core_base_server_mocks.mdx index 467e1b7d700808..cb3ab335d08969 100644 --- a/api_docs/kbn_core_base_server_mocks.mdx +++ b/api_docs/kbn_core_base_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-base-server-mocks title: "@kbn/core-base-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-base-server-mocks plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-base-server-mocks'] --- import kbnCoreBaseServerMocksObj from './kbn_core_base_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_capabilities_browser_mocks.mdx b/api_docs/kbn_core_capabilities_browser_mocks.mdx index a530af24678d78..865a0a68138662 100644 --- a/api_docs/kbn_core_capabilities_browser_mocks.mdx +++ b/api_docs/kbn_core_capabilities_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-capabilities-browser-mocks title: "@kbn/core-capabilities-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-capabilities-browser-mocks plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-capabilities-browser-mocks'] --- import kbnCoreCapabilitiesBrowserMocksObj from './kbn_core_capabilities_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_capabilities_common.mdx b/api_docs/kbn_core_capabilities_common.mdx index aaea6628f30f4e..3857ddf5b7f7f4 100644 --- a/api_docs/kbn_core_capabilities_common.mdx +++ b/api_docs/kbn_core_capabilities_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-capabilities-common title: "@kbn/core-capabilities-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-capabilities-common plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-capabilities-common'] --- import kbnCoreCapabilitiesCommonObj from './kbn_core_capabilities_common.devdocs.json'; diff --git a/api_docs/kbn_core_capabilities_server.mdx b/api_docs/kbn_core_capabilities_server.mdx index bfd05bc99127cd..6a1a8a561182fe 100644 --- a/api_docs/kbn_core_capabilities_server.mdx +++ b/api_docs/kbn_core_capabilities_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-capabilities-server title: "@kbn/core-capabilities-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-capabilities-server plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-capabilities-server'] --- import kbnCoreCapabilitiesServerObj from './kbn_core_capabilities_server.devdocs.json'; diff --git a/api_docs/kbn_core_capabilities_server_mocks.mdx b/api_docs/kbn_core_capabilities_server_mocks.mdx index 6c9f93b9e8fc71..324d0de12bd4b1 100644 --- a/api_docs/kbn_core_capabilities_server_mocks.mdx +++ b/api_docs/kbn_core_capabilities_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-capabilities-server-mocks title: "@kbn/core-capabilities-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-capabilities-server-mocks plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-capabilities-server-mocks'] --- import kbnCoreCapabilitiesServerMocksObj from './kbn_core_capabilities_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_chrome_browser.devdocs.json b/api_docs/kbn_core_chrome_browser.devdocs.json index cd79a207bdb78e..4760161eae94b3 100644 --- a/api_docs/kbn_core_chrome_browser.devdocs.json +++ b/api_docs/kbn_core_chrome_browser.devdocs.json @@ -3169,6 +3169,21 @@ "trackAdoption": false, "initialIsOpen": false }, + { + "parentPluginId": "@kbn/core-chrome-browser", + "id": "def-common.EuiThemeSize", + "type": "Type", + "tags": [], + "label": "EuiThemeSize", + "description": [], + "signature": [ + "\"m\" | \"s\" | \"xs\" | \"l\" | \"xl\" | \"xxl\"" + ], + "path": "packages/core/chrome/core-chrome-browser/src/project_navigation.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, { "parentPluginId": "@kbn/core-chrome-browser", "id": "def-common.NodeDefinitionWithChildren", diff --git a/api_docs/kbn_core_chrome_browser.mdx b/api_docs/kbn_core_chrome_browser.mdx index d1db9fe8590cd4..ce2a3601c6e7f3 100644 --- a/api_docs/kbn_core_chrome_browser.mdx +++ b/api_docs/kbn_core_chrome_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-chrome-browser title: "@kbn/core-chrome-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-chrome-browser plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-chrome-browser'] --- import kbnCoreChromeBrowserObj from './kbn_core_chrome_browser.devdocs.json'; @@ -21,7 +21,7 @@ Contact [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sh | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 163 | 0 | 69 | 0 | +| 164 | 0 | 70 | 0 | ## Common diff --git a/api_docs/kbn_core_chrome_browser_mocks.mdx b/api_docs/kbn_core_chrome_browser_mocks.mdx index 12b00c8223be05..fc2d71fe64d435 100644 --- a/api_docs/kbn_core_chrome_browser_mocks.mdx +++ b/api_docs/kbn_core_chrome_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-chrome-browser-mocks title: "@kbn/core-chrome-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-chrome-browser-mocks plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-chrome-browser-mocks'] --- import kbnCoreChromeBrowserMocksObj from './kbn_core_chrome_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_config_server_internal.mdx b/api_docs/kbn_core_config_server_internal.mdx index 3daa16643f3270..5cdc93119a6a46 100644 --- a/api_docs/kbn_core_config_server_internal.mdx +++ b/api_docs/kbn_core_config_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-config-server-internal title: "@kbn/core-config-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-config-server-internal plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-config-server-internal'] --- import kbnCoreConfigServerInternalObj from './kbn_core_config_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_custom_branding_browser.mdx b/api_docs/kbn_core_custom_branding_browser.mdx index 76d50b738c7f5b..4ffc89454e16d9 100644 --- a/api_docs/kbn_core_custom_branding_browser.mdx +++ b/api_docs/kbn_core_custom_branding_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-custom-branding-browser title: "@kbn/core-custom-branding-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-custom-branding-browser plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-custom-branding-browser'] --- import kbnCoreCustomBrandingBrowserObj from './kbn_core_custom_branding_browser.devdocs.json'; diff --git a/api_docs/kbn_core_custom_branding_browser_internal.mdx b/api_docs/kbn_core_custom_branding_browser_internal.mdx index 844d9f4f01a4bc..8878b861c49ca2 100644 --- a/api_docs/kbn_core_custom_branding_browser_internal.mdx +++ b/api_docs/kbn_core_custom_branding_browser_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-custom-branding-browser-internal title: "@kbn/core-custom-branding-browser-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-custom-branding-browser-internal plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-custom-branding-browser-internal'] --- import kbnCoreCustomBrandingBrowserInternalObj from './kbn_core_custom_branding_browser_internal.devdocs.json'; diff --git a/api_docs/kbn_core_custom_branding_browser_mocks.mdx b/api_docs/kbn_core_custom_branding_browser_mocks.mdx index caf4f599f16985..116c03a29b18f8 100644 --- a/api_docs/kbn_core_custom_branding_browser_mocks.mdx +++ b/api_docs/kbn_core_custom_branding_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-custom-branding-browser-mocks title: "@kbn/core-custom-branding-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-custom-branding-browser-mocks plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-custom-branding-browser-mocks'] --- import kbnCoreCustomBrandingBrowserMocksObj from './kbn_core_custom_branding_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_custom_branding_common.mdx b/api_docs/kbn_core_custom_branding_common.mdx index 55281bb0b3d7dd..fbe72175436fb7 100644 --- a/api_docs/kbn_core_custom_branding_common.mdx +++ b/api_docs/kbn_core_custom_branding_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-custom-branding-common title: "@kbn/core-custom-branding-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-custom-branding-common plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-custom-branding-common'] --- import kbnCoreCustomBrandingCommonObj from './kbn_core_custom_branding_common.devdocs.json'; diff --git a/api_docs/kbn_core_custom_branding_server.mdx b/api_docs/kbn_core_custom_branding_server.mdx index 4f38f8f9a8e2bd..8908547d747bbc 100644 --- a/api_docs/kbn_core_custom_branding_server.mdx +++ b/api_docs/kbn_core_custom_branding_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-custom-branding-server title: "@kbn/core-custom-branding-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-custom-branding-server plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-custom-branding-server'] --- import kbnCoreCustomBrandingServerObj from './kbn_core_custom_branding_server.devdocs.json'; diff --git a/api_docs/kbn_core_custom_branding_server_internal.mdx b/api_docs/kbn_core_custom_branding_server_internal.mdx index afd4dfc6fb16cf..1cb805f1b5fbc2 100644 --- a/api_docs/kbn_core_custom_branding_server_internal.mdx +++ b/api_docs/kbn_core_custom_branding_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-custom-branding-server-internal title: "@kbn/core-custom-branding-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-custom-branding-server-internal plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-custom-branding-server-internal'] --- import kbnCoreCustomBrandingServerInternalObj from './kbn_core_custom_branding_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_custom_branding_server_mocks.mdx b/api_docs/kbn_core_custom_branding_server_mocks.mdx index 7608e5d6db59da..e6e6a20f61f18d 100644 --- a/api_docs/kbn_core_custom_branding_server_mocks.mdx +++ b/api_docs/kbn_core_custom_branding_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-custom-branding-server-mocks title: "@kbn/core-custom-branding-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-custom-branding-server-mocks plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-custom-branding-server-mocks'] --- import kbnCoreCustomBrandingServerMocksObj from './kbn_core_custom_branding_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_deprecations_browser.mdx b/api_docs/kbn_core_deprecations_browser.mdx index b454afa39f0759..a6c3dec18543f6 100644 --- a/api_docs/kbn_core_deprecations_browser.mdx +++ b/api_docs/kbn_core_deprecations_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-deprecations-browser title: "@kbn/core-deprecations-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-deprecations-browser plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-deprecations-browser'] --- import kbnCoreDeprecationsBrowserObj from './kbn_core_deprecations_browser.devdocs.json'; diff --git a/api_docs/kbn_core_deprecations_browser_internal.mdx b/api_docs/kbn_core_deprecations_browser_internal.mdx index 8b891225f185a3..cf47e56c8abd9e 100644 --- a/api_docs/kbn_core_deprecations_browser_internal.mdx +++ b/api_docs/kbn_core_deprecations_browser_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-deprecations-browser-internal title: "@kbn/core-deprecations-browser-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-deprecations-browser-internal plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-deprecations-browser-internal'] --- import kbnCoreDeprecationsBrowserInternalObj from './kbn_core_deprecations_browser_internal.devdocs.json'; diff --git a/api_docs/kbn_core_deprecations_browser_mocks.mdx b/api_docs/kbn_core_deprecations_browser_mocks.mdx index 8d977d40bb3941..ac2ce722b15e97 100644 --- a/api_docs/kbn_core_deprecations_browser_mocks.mdx +++ b/api_docs/kbn_core_deprecations_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-deprecations-browser-mocks title: "@kbn/core-deprecations-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-deprecations-browser-mocks plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-deprecations-browser-mocks'] --- import kbnCoreDeprecationsBrowserMocksObj from './kbn_core_deprecations_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_deprecations_common.mdx b/api_docs/kbn_core_deprecations_common.mdx index c2902c31bb2946..0e4d24b64fcd4c 100644 --- a/api_docs/kbn_core_deprecations_common.mdx +++ b/api_docs/kbn_core_deprecations_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-deprecations-common title: "@kbn/core-deprecations-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-deprecations-common plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-deprecations-common'] --- import kbnCoreDeprecationsCommonObj from './kbn_core_deprecations_common.devdocs.json'; diff --git a/api_docs/kbn_core_deprecations_server.mdx b/api_docs/kbn_core_deprecations_server.mdx index 0026bb3c0492a8..58cbbf0d6c6e22 100644 --- a/api_docs/kbn_core_deprecations_server.mdx +++ b/api_docs/kbn_core_deprecations_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-deprecations-server title: "@kbn/core-deprecations-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-deprecations-server plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-deprecations-server'] --- import kbnCoreDeprecationsServerObj from './kbn_core_deprecations_server.devdocs.json'; diff --git a/api_docs/kbn_core_deprecations_server_internal.mdx b/api_docs/kbn_core_deprecations_server_internal.mdx index e1c0fd7220a3da..f92a9d78cddd82 100644 --- a/api_docs/kbn_core_deprecations_server_internal.mdx +++ b/api_docs/kbn_core_deprecations_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-deprecations-server-internal title: "@kbn/core-deprecations-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-deprecations-server-internal plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-deprecations-server-internal'] --- import kbnCoreDeprecationsServerInternalObj from './kbn_core_deprecations_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_deprecations_server_mocks.mdx b/api_docs/kbn_core_deprecations_server_mocks.mdx index 8a2a5c8e17db6f..08483e2b8cb215 100644 --- a/api_docs/kbn_core_deprecations_server_mocks.mdx +++ b/api_docs/kbn_core_deprecations_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-deprecations-server-mocks title: "@kbn/core-deprecations-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-deprecations-server-mocks plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-deprecations-server-mocks'] --- import kbnCoreDeprecationsServerMocksObj from './kbn_core_deprecations_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_doc_links_browser.mdx b/api_docs/kbn_core_doc_links_browser.mdx index 90a9407a30c80d..b72db648d6b2e2 100644 --- a/api_docs/kbn_core_doc_links_browser.mdx +++ b/api_docs/kbn_core_doc_links_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-doc-links-browser title: "@kbn/core-doc-links-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-doc-links-browser plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-doc-links-browser'] --- import kbnCoreDocLinksBrowserObj from './kbn_core_doc_links_browser.devdocs.json'; diff --git a/api_docs/kbn_core_doc_links_browser_mocks.mdx b/api_docs/kbn_core_doc_links_browser_mocks.mdx index 66e302b6268cd0..88923747f9be57 100644 --- a/api_docs/kbn_core_doc_links_browser_mocks.mdx +++ b/api_docs/kbn_core_doc_links_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-doc-links-browser-mocks title: "@kbn/core-doc-links-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-doc-links-browser-mocks plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-doc-links-browser-mocks'] --- import kbnCoreDocLinksBrowserMocksObj from './kbn_core_doc_links_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_doc_links_server.mdx b/api_docs/kbn_core_doc_links_server.mdx index d3386fa3a8d142..18af50040fc118 100644 --- a/api_docs/kbn_core_doc_links_server.mdx +++ b/api_docs/kbn_core_doc_links_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-doc-links-server title: "@kbn/core-doc-links-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-doc-links-server plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-doc-links-server'] --- import kbnCoreDocLinksServerObj from './kbn_core_doc_links_server.devdocs.json'; diff --git a/api_docs/kbn_core_doc_links_server_mocks.mdx b/api_docs/kbn_core_doc_links_server_mocks.mdx index 0acd53be5faaf1..c98e5cbdf31e00 100644 --- a/api_docs/kbn_core_doc_links_server_mocks.mdx +++ b/api_docs/kbn_core_doc_links_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-doc-links-server-mocks title: "@kbn/core-doc-links-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-doc-links-server-mocks plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-doc-links-server-mocks'] --- import kbnCoreDocLinksServerMocksObj from './kbn_core_doc_links_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_elasticsearch_client_server_internal.mdx b/api_docs/kbn_core_elasticsearch_client_server_internal.mdx index 8cbb1049f13ee0..791e0f86de5739 100644 --- a/api_docs/kbn_core_elasticsearch_client_server_internal.mdx +++ b/api_docs/kbn_core_elasticsearch_client_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-elasticsearch-client-server-internal title: "@kbn/core-elasticsearch-client-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-elasticsearch-client-server-internal plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-elasticsearch-client-server-internal'] --- import kbnCoreElasticsearchClientServerInternalObj from './kbn_core_elasticsearch_client_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_elasticsearch_client_server_mocks.mdx b/api_docs/kbn_core_elasticsearch_client_server_mocks.mdx index 2db6262d8575a2..56f8cd6f60c116 100644 --- a/api_docs/kbn_core_elasticsearch_client_server_mocks.mdx +++ b/api_docs/kbn_core_elasticsearch_client_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-elasticsearch-client-server-mocks title: "@kbn/core-elasticsearch-client-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-elasticsearch-client-server-mocks plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-elasticsearch-client-server-mocks'] --- import kbnCoreElasticsearchClientServerMocksObj from './kbn_core_elasticsearch_client_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_elasticsearch_server.mdx b/api_docs/kbn_core_elasticsearch_server.mdx index 683792a6719e23..14a603c71fbcc7 100644 --- a/api_docs/kbn_core_elasticsearch_server.mdx +++ b/api_docs/kbn_core_elasticsearch_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-elasticsearch-server title: "@kbn/core-elasticsearch-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-elasticsearch-server plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-elasticsearch-server'] --- import kbnCoreElasticsearchServerObj from './kbn_core_elasticsearch_server.devdocs.json'; diff --git a/api_docs/kbn_core_elasticsearch_server_internal.mdx b/api_docs/kbn_core_elasticsearch_server_internal.mdx index 8067d532a6f03e..5a70ed3c60c70e 100644 --- a/api_docs/kbn_core_elasticsearch_server_internal.mdx +++ b/api_docs/kbn_core_elasticsearch_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-elasticsearch-server-internal title: "@kbn/core-elasticsearch-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-elasticsearch-server-internal plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-elasticsearch-server-internal'] --- import kbnCoreElasticsearchServerInternalObj from './kbn_core_elasticsearch_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_elasticsearch_server_mocks.mdx b/api_docs/kbn_core_elasticsearch_server_mocks.mdx index 22fbe85a387b9a..34d81988a0674d 100644 --- a/api_docs/kbn_core_elasticsearch_server_mocks.mdx +++ b/api_docs/kbn_core_elasticsearch_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-elasticsearch-server-mocks title: "@kbn/core-elasticsearch-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-elasticsearch-server-mocks plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-elasticsearch-server-mocks'] --- import kbnCoreElasticsearchServerMocksObj from './kbn_core_elasticsearch_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_environment_server_internal.mdx b/api_docs/kbn_core_environment_server_internal.mdx index 07555f9627e017..d2a6d77dbbd8f8 100644 --- a/api_docs/kbn_core_environment_server_internal.mdx +++ b/api_docs/kbn_core_environment_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-environment-server-internal title: "@kbn/core-environment-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-environment-server-internal plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-environment-server-internal'] --- import kbnCoreEnvironmentServerInternalObj from './kbn_core_environment_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_environment_server_mocks.mdx b/api_docs/kbn_core_environment_server_mocks.mdx index d1c8456a264d51..4a77e482c9e831 100644 --- a/api_docs/kbn_core_environment_server_mocks.mdx +++ b/api_docs/kbn_core_environment_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-environment-server-mocks title: "@kbn/core-environment-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-environment-server-mocks plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-environment-server-mocks'] --- import kbnCoreEnvironmentServerMocksObj from './kbn_core_environment_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_execution_context_browser.mdx b/api_docs/kbn_core_execution_context_browser.mdx index 7e5baef7a1d52d..fa26afe8590ec6 100644 --- a/api_docs/kbn_core_execution_context_browser.mdx +++ b/api_docs/kbn_core_execution_context_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-execution-context-browser title: "@kbn/core-execution-context-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-execution-context-browser plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-execution-context-browser'] --- import kbnCoreExecutionContextBrowserObj from './kbn_core_execution_context_browser.devdocs.json'; diff --git a/api_docs/kbn_core_execution_context_browser_internal.mdx b/api_docs/kbn_core_execution_context_browser_internal.mdx index a6047409d5ac35..8bbcb27aff442a 100644 --- a/api_docs/kbn_core_execution_context_browser_internal.mdx +++ b/api_docs/kbn_core_execution_context_browser_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-execution-context-browser-internal title: "@kbn/core-execution-context-browser-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-execution-context-browser-internal plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-execution-context-browser-internal'] --- import kbnCoreExecutionContextBrowserInternalObj from './kbn_core_execution_context_browser_internal.devdocs.json'; diff --git a/api_docs/kbn_core_execution_context_browser_mocks.mdx b/api_docs/kbn_core_execution_context_browser_mocks.mdx index 0a4872682af4e4..6b05303d773e73 100644 --- a/api_docs/kbn_core_execution_context_browser_mocks.mdx +++ b/api_docs/kbn_core_execution_context_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-execution-context-browser-mocks title: "@kbn/core-execution-context-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-execution-context-browser-mocks plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-execution-context-browser-mocks'] --- import kbnCoreExecutionContextBrowserMocksObj from './kbn_core_execution_context_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_execution_context_common.mdx b/api_docs/kbn_core_execution_context_common.mdx index c70bc2f2c4a56d..d7a1d7eae2850a 100644 --- a/api_docs/kbn_core_execution_context_common.mdx +++ b/api_docs/kbn_core_execution_context_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-execution-context-common title: "@kbn/core-execution-context-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-execution-context-common plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-execution-context-common'] --- import kbnCoreExecutionContextCommonObj from './kbn_core_execution_context_common.devdocs.json'; diff --git a/api_docs/kbn_core_execution_context_server.mdx b/api_docs/kbn_core_execution_context_server.mdx index f1085cfc74eaee..2f184a5c24271a 100644 --- a/api_docs/kbn_core_execution_context_server.mdx +++ b/api_docs/kbn_core_execution_context_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-execution-context-server title: "@kbn/core-execution-context-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-execution-context-server plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-execution-context-server'] --- import kbnCoreExecutionContextServerObj from './kbn_core_execution_context_server.devdocs.json'; diff --git a/api_docs/kbn_core_execution_context_server_internal.mdx b/api_docs/kbn_core_execution_context_server_internal.mdx index 0711ac6c01d44a..ded0a36122d6b3 100644 --- a/api_docs/kbn_core_execution_context_server_internal.mdx +++ b/api_docs/kbn_core_execution_context_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-execution-context-server-internal title: "@kbn/core-execution-context-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-execution-context-server-internal plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-execution-context-server-internal'] --- import kbnCoreExecutionContextServerInternalObj from './kbn_core_execution_context_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_execution_context_server_mocks.mdx b/api_docs/kbn_core_execution_context_server_mocks.mdx index ebed3209d6eb2f..4d2c06c6bd45f4 100644 --- a/api_docs/kbn_core_execution_context_server_mocks.mdx +++ b/api_docs/kbn_core_execution_context_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-execution-context-server-mocks title: "@kbn/core-execution-context-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-execution-context-server-mocks plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-execution-context-server-mocks'] --- import kbnCoreExecutionContextServerMocksObj from './kbn_core_execution_context_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_fatal_errors_browser.mdx b/api_docs/kbn_core_fatal_errors_browser.mdx index eec263d2e7b239..135e9560333c71 100644 --- a/api_docs/kbn_core_fatal_errors_browser.mdx +++ b/api_docs/kbn_core_fatal_errors_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-fatal-errors-browser title: "@kbn/core-fatal-errors-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-fatal-errors-browser plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-fatal-errors-browser'] --- import kbnCoreFatalErrorsBrowserObj from './kbn_core_fatal_errors_browser.devdocs.json'; diff --git a/api_docs/kbn_core_fatal_errors_browser_mocks.mdx b/api_docs/kbn_core_fatal_errors_browser_mocks.mdx index de99f0241d7fb9..1cd0b5412790a4 100644 --- a/api_docs/kbn_core_fatal_errors_browser_mocks.mdx +++ b/api_docs/kbn_core_fatal_errors_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-fatal-errors-browser-mocks title: "@kbn/core-fatal-errors-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-fatal-errors-browser-mocks plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-fatal-errors-browser-mocks'] --- import kbnCoreFatalErrorsBrowserMocksObj from './kbn_core_fatal_errors_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_http_browser.mdx b/api_docs/kbn_core_http_browser.mdx index 4fa50fbf94be9e..598cf1ca2877e7 100644 --- a/api_docs/kbn_core_http_browser.mdx +++ b/api_docs/kbn_core_http_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-browser title: "@kbn/core-http-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-http-browser plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-http-browser'] --- import kbnCoreHttpBrowserObj from './kbn_core_http_browser.devdocs.json'; diff --git a/api_docs/kbn_core_http_browser_internal.mdx b/api_docs/kbn_core_http_browser_internal.mdx index 0e12c6f2396c40..aa62804f3d553c 100644 --- a/api_docs/kbn_core_http_browser_internal.mdx +++ b/api_docs/kbn_core_http_browser_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-browser-internal title: "@kbn/core-http-browser-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-http-browser-internal plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-http-browser-internal'] --- import kbnCoreHttpBrowserInternalObj from './kbn_core_http_browser_internal.devdocs.json'; diff --git a/api_docs/kbn_core_http_browser_mocks.mdx b/api_docs/kbn_core_http_browser_mocks.mdx index d8d73d65d2612e..3761a4e770bf1a 100644 --- a/api_docs/kbn_core_http_browser_mocks.mdx +++ b/api_docs/kbn_core_http_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-browser-mocks title: "@kbn/core-http-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-http-browser-mocks plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-http-browser-mocks'] --- import kbnCoreHttpBrowserMocksObj from './kbn_core_http_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_http_common.mdx b/api_docs/kbn_core_http_common.mdx index 81775672ad16f4..0e2770ff075f0f 100644 --- a/api_docs/kbn_core_http_common.mdx +++ b/api_docs/kbn_core_http_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-common title: "@kbn/core-http-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-http-common plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-http-common'] --- import kbnCoreHttpCommonObj from './kbn_core_http_common.devdocs.json'; diff --git a/api_docs/kbn_core_http_context_server_mocks.mdx b/api_docs/kbn_core_http_context_server_mocks.mdx index 89c3e529e8c8ed..a327ba216bbd06 100644 --- a/api_docs/kbn_core_http_context_server_mocks.mdx +++ b/api_docs/kbn_core_http_context_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-context-server-mocks title: "@kbn/core-http-context-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-http-context-server-mocks plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-http-context-server-mocks'] --- import kbnCoreHttpContextServerMocksObj from './kbn_core_http_context_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_http_request_handler_context_server.mdx b/api_docs/kbn_core_http_request_handler_context_server.mdx index 87416920d80846..5825fa2115ea3b 100644 --- a/api_docs/kbn_core_http_request_handler_context_server.mdx +++ b/api_docs/kbn_core_http_request_handler_context_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-request-handler-context-server title: "@kbn/core-http-request-handler-context-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-http-request-handler-context-server plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-http-request-handler-context-server'] --- import kbnCoreHttpRequestHandlerContextServerObj from './kbn_core_http_request_handler_context_server.devdocs.json'; diff --git a/api_docs/kbn_core_http_resources_server.mdx b/api_docs/kbn_core_http_resources_server.mdx index 118b40f73c0c45..a1e8a57e5cd035 100644 --- a/api_docs/kbn_core_http_resources_server.mdx +++ b/api_docs/kbn_core_http_resources_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-resources-server title: "@kbn/core-http-resources-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-http-resources-server plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-http-resources-server'] --- import kbnCoreHttpResourcesServerObj from './kbn_core_http_resources_server.devdocs.json'; diff --git a/api_docs/kbn_core_http_resources_server_internal.mdx b/api_docs/kbn_core_http_resources_server_internal.mdx index f3f1689c22707f..71a2e73764b2e5 100644 --- a/api_docs/kbn_core_http_resources_server_internal.mdx +++ b/api_docs/kbn_core_http_resources_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-resources-server-internal title: "@kbn/core-http-resources-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-http-resources-server-internal plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-http-resources-server-internal'] --- import kbnCoreHttpResourcesServerInternalObj from './kbn_core_http_resources_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_http_resources_server_mocks.mdx b/api_docs/kbn_core_http_resources_server_mocks.mdx index ea30574fa15d05..613ba1d5a794cf 100644 --- a/api_docs/kbn_core_http_resources_server_mocks.mdx +++ b/api_docs/kbn_core_http_resources_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-resources-server-mocks title: "@kbn/core-http-resources-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-http-resources-server-mocks plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-http-resources-server-mocks'] --- import kbnCoreHttpResourcesServerMocksObj from './kbn_core_http_resources_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_http_router_server_internal.mdx b/api_docs/kbn_core_http_router_server_internal.mdx index 419489a4a76635..0c60a72ad8ead5 100644 --- a/api_docs/kbn_core_http_router_server_internal.mdx +++ b/api_docs/kbn_core_http_router_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-router-server-internal title: "@kbn/core-http-router-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-http-router-server-internal plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-http-router-server-internal'] --- import kbnCoreHttpRouterServerInternalObj from './kbn_core_http_router_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_http_router_server_mocks.mdx b/api_docs/kbn_core_http_router_server_mocks.mdx index 4978ff7166033d..9f1ee8a6a58b88 100644 --- a/api_docs/kbn_core_http_router_server_mocks.mdx +++ b/api_docs/kbn_core_http_router_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-router-server-mocks title: "@kbn/core-http-router-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-http-router-server-mocks plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-http-router-server-mocks'] --- import kbnCoreHttpRouterServerMocksObj from './kbn_core_http_router_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_http_server.devdocs.json b/api_docs/kbn_core_http_server.devdocs.json index 7586baf610490a..e61632b6a8cfe4 100644 --- a/api_docs/kbn_core_http_server.devdocs.json +++ b/api_docs/kbn_core_http_server.devdocs.json @@ -13609,6 +13609,10 @@ "plugin": "transform", "path": "x-pack/plugins/transform/server/routes/api/transforms.ts" }, + { + "plugin": "uptime", + "path": "x-pack/plugins/uptime/server/legacy_uptime/uptime_server.ts" + }, { "plugin": "controls", "path": "src/plugins/controls/server/options_list/options_list_cluster_settings_route.ts" @@ -13973,6 +13977,10 @@ "plugin": "transform", "path": "x-pack/plugins/transform/server/routes/api/transforms.ts" }, + { + "plugin": "uptime", + "path": "x-pack/plugins/uptime/server/legacy_uptime/uptime_server.ts" + }, { "plugin": "@kbn/core-http-router-server-internal", "path": "packages/core/http/core-http-router-server-internal/src/versioned_router/core_versioned_router.ts" diff --git a/api_docs/kbn_core_http_server.mdx b/api_docs/kbn_core_http_server.mdx index 23a8988f45dff9..d5aff16c37f9db 100644 --- a/api_docs/kbn_core_http_server.mdx +++ b/api_docs/kbn_core_http_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-server title: "@kbn/core-http-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-http-server plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-http-server'] --- import kbnCoreHttpServerObj from './kbn_core_http_server.devdocs.json'; diff --git a/api_docs/kbn_core_http_server_internal.mdx b/api_docs/kbn_core_http_server_internal.mdx index c60b4f12794fa0..39ccf5610adee1 100644 --- a/api_docs/kbn_core_http_server_internal.mdx +++ b/api_docs/kbn_core_http_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-server-internal title: "@kbn/core-http-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-http-server-internal plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-http-server-internal'] --- import kbnCoreHttpServerInternalObj from './kbn_core_http_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_http_server_mocks.mdx b/api_docs/kbn_core_http_server_mocks.mdx index 8280c57c7bf0a1..4065a61b447311 100644 --- a/api_docs/kbn_core_http_server_mocks.mdx +++ b/api_docs/kbn_core_http_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-server-mocks title: "@kbn/core-http-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-http-server-mocks plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-http-server-mocks'] --- import kbnCoreHttpServerMocksObj from './kbn_core_http_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_i18n_browser.mdx b/api_docs/kbn_core_i18n_browser.mdx index 5c8c5c1a5115a7..b04a68dc8a7dbb 100644 --- a/api_docs/kbn_core_i18n_browser.mdx +++ b/api_docs/kbn_core_i18n_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-i18n-browser title: "@kbn/core-i18n-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-i18n-browser plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-i18n-browser'] --- import kbnCoreI18nBrowserObj from './kbn_core_i18n_browser.devdocs.json'; diff --git a/api_docs/kbn_core_i18n_browser_mocks.mdx b/api_docs/kbn_core_i18n_browser_mocks.mdx index 5f2578a53bb326..4cc085a4e0a070 100644 --- a/api_docs/kbn_core_i18n_browser_mocks.mdx +++ b/api_docs/kbn_core_i18n_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-i18n-browser-mocks title: "@kbn/core-i18n-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-i18n-browser-mocks plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-i18n-browser-mocks'] --- import kbnCoreI18nBrowserMocksObj from './kbn_core_i18n_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_i18n_server.mdx b/api_docs/kbn_core_i18n_server.mdx index b96f4522ea8281..0b70cdb0854bb7 100644 --- a/api_docs/kbn_core_i18n_server.mdx +++ b/api_docs/kbn_core_i18n_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-i18n-server title: "@kbn/core-i18n-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-i18n-server plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-i18n-server'] --- import kbnCoreI18nServerObj from './kbn_core_i18n_server.devdocs.json'; diff --git a/api_docs/kbn_core_i18n_server_internal.mdx b/api_docs/kbn_core_i18n_server_internal.mdx index 64e63b04f25dff..7300cf2aca5210 100644 --- a/api_docs/kbn_core_i18n_server_internal.mdx +++ b/api_docs/kbn_core_i18n_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-i18n-server-internal title: "@kbn/core-i18n-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-i18n-server-internal plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-i18n-server-internal'] --- import kbnCoreI18nServerInternalObj from './kbn_core_i18n_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_i18n_server_mocks.mdx b/api_docs/kbn_core_i18n_server_mocks.mdx index f6b4683d47e3ef..75adf3dd2b7dae 100644 --- a/api_docs/kbn_core_i18n_server_mocks.mdx +++ b/api_docs/kbn_core_i18n_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-i18n-server-mocks title: "@kbn/core-i18n-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-i18n-server-mocks plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-i18n-server-mocks'] --- import kbnCoreI18nServerMocksObj from './kbn_core_i18n_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_injected_metadata_browser_mocks.mdx b/api_docs/kbn_core_injected_metadata_browser_mocks.mdx index 1f29c043edaa1e..cda2c8daa7d277 100644 --- a/api_docs/kbn_core_injected_metadata_browser_mocks.mdx +++ b/api_docs/kbn_core_injected_metadata_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-injected-metadata-browser-mocks title: "@kbn/core-injected-metadata-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-injected-metadata-browser-mocks plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-injected-metadata-browser-mocks'] --- import kbnCoreInjectedMetadataBrowserMocksObj from './kbn_core_injected_metadata_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_integrations_browser_internal.mdx b/api_docs/kbn_core_integrations_browser_internal.mdx index 2d6974bbb40571..d8d7084174b71e 100644 --- a/api_docs/kbn_core_integrations_browser_internal.mdx +++ b/api_docs/kbn_core_integrations_browser_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-integrations-browser-internal title: "@kbn/core-integrations-browser-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-integrations-browser-internal plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-integrations-browser-internal'] --- import kbnCoreIntegrationsBrowserInternalObj from './kbn_core_integrations_browser_internal.devdocs.json'; diff --git a/api_docs/kbn_core_integrations_browser_mocks.mdx b/api_docs/kbn_core_integrations_browser_mocks.mdx index f1fa823598e53e..33e87dd17afff0 100644 --- a/api_docs/kbn_core_integrations_browser_mocks.mdx +++ b/api_docs/kbn_core_integrations_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-integrations-browser-mocks title: "@kbn/core-integrations-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-integrations-browser-mocks plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-integrations-browser-mocks'] --- import kbnCoreIntegrationsBrowserMocksObj from './kbn_core_integrations_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_lifecycle_browser.mdx b/api_docs/kbn_core_lifecycle_browser.mdx index a6e450c847c125..5aaaf29d048fdc 100644 --- a/api_docs/kbn_core_lifecycle_browser.mdx +++ b/api_docs/kbn_core_lifecycle_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-lifecycle-browser title: "@kbn/core-lifecycle-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-lifecycle-browser plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-lifecycle-browser'] --- import kbnCoreLifecycleBrowserObj from './kbn_core_lifecycle_browser.devdocs.json'; diff --git a/api_docs/kbn_core_lifecycle_browser_mocks.mdx b/api_docs/kbn_core_lifecycle_browser_mocks.mdx index b852b3b9b7215b..0a9d09354fe628 100644 --- a/api_docs/kbn_core_lifecycle_browser_mocks.mdx +++ b/api_docs/kbn_core_lifecycle_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-lifecycle-browser-mocks title: "@kbn/core-lifecycle-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-lifecycle-browser-mocks plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-lifecycle-browser-mocks'] --- import kbnCoreLifecycleBrowserMocksObj from './kbn_core_lifecycle_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_lifecycle_server.mdx b/api_docs/kbn_core_lifecycle_server.mdx index e43eadbca928fd..ae5352940ff754 100644 --- a/api_docs/kbn_core_lifecycle_server.mdx +++ b/api_docs/kbn_core_lifecycle_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-lifecycle-server title: "@kbn/core-lifecycle-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-lifecycle-server plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-lifecycle-server'] --- import kbnCoreLifecycleServerObj from './kbn_core_lifecycle_server.devdocs.json'; diff --git a/api_docs/kbn_core_lifecycle_server_mocks.mdx b/api_docs/kbn_core_lifecycle_server_mocks.mdx index d9b8faa232ff65..40aa4a9a2c1752 100644 --- a/api_docs/kbn_core_lifecycle_server_mocks.mdx +++ b/api_docs/kbn_core_lifecycle_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-lifecycle-server-mocks title: "@kbn/core-lifecycle-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-lifecycle-server-mocks plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-lifecycle-server-mocks'] --- import kbnCoreLifecycleServerMocksObj from './kbn_core_lifecycle_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_logging_browser_mocks.mdx b/api_docs/kbn_core_logging_browser_mocks.mdx index c57f1958055f4e..61aa9449e0f56a 100644 --- a/api_docs/kbn_core_logging_browser_mocks.mdx +++ b/api_docs/kbn_core_logging_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-logging-browser-mocks title: "@kbn/core-logging-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-logging-browser-mocks plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-logging-browser-mocks'] --- import kbnCoreLoggingBrowserMocksObj from './kbn_core_logging_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_logging_common_internal.mdx b/api_docs/kbn_core_logging_common_internal.mdx index bde0e760d00d00..a1f3c1aa5cd5f2 100644 --- a/api_docs/kbn_core_logging_common_internal.mdx +++ b/api_docs/kbn_core_logging_common_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-logging-common-internal title: "@kbn/core-logging-common-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-logging-common-internal plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-logging-common-internal'] --- import kbnCoreLoggingCommonInternalObj from './kbn_core_logging_common_internal.devdocs.json'; diff --git a/api_docs/kbn_core_logging_server.mdx b/api_docs/kbn_core_logging_server.mdx index 2ae74317524a88..ffdcf7bc5ec797 100644 --- a/api_docs/kbn_core_logging_server.mdx +++ b/api_docs/kbn_core_logging_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-logging-server title: "@kbn/core-logging-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-logging-server plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-logging-server'] --- import kbnCoreLoggingServerObj from './kbn_core_logging_server.devdocs.json'; diff --git a/api_docs/kbn_core_logging_server_internal.mdx b/api_docs/kbn_core_logging_server_internal.mdx index 23073fbcdb3c6f..1e3e890e7bec90 100644 --- a/api_docs/kbn_core_logging_server_internal.mdx +++ b/api_docs/kbn_core_logging_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-logging-server-internal title: "@kbn/core-logging-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-logging-server-internal plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-logging-server-internal'] --- import kbnCoreLoggingServerInternalObj from './kbn_core_logging_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_logging_server_mocks.mdx b/api_docs/kbn_core_logging_server_mocks.mdx index a48572582cedfb..65369e84decce2 100644 --- a/api_docs/kbn_core_logging_server_mocks.mdx +++ b/api_docs/kbn_core_logging_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-logging-server-mocks title: "@kbn/core-logging-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-logging-server-mocks plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-logging-server-mocks'] --- import kbnCoreLoggingServerMocksObj from './kbn_core_logging_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_metrics_collectors_server_internal.mdx b/api_docs/kbn_core_metrics_collectors_server_internal.mdx index 80812c082297f5..b138ab0ace89a8 100644 --- a/api_docs/kbn_core_metrics_collectors_server_internal.mdx +++ b/api_docs/kbn_core_metrics_collectors_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-metrics-collectors-server-internal title: "@kbn/core-metrics-collectors-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-metrics-collectors-server-internal plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-metrics-collectors-server-internal'] --- import kbnCoreMetricsCollectorsServerInternalObj from './kbn_core_metrics_collectors_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_metrics_collectors_server_mocks.mdx b/api_docs/kbn_core_metrics_collectors_server_mocks.mdx index 50c1b41a283b6c..69d5e5bb052aca 100644 --- a/api_docs/kbn_core_metrics_collectors_server_mocks.mdx +++ b/api_docs/kbn_core_metrics_collectors_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-metrics-collectors-server-mocks title: "@kbn/core-metrics-collectors-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-metrics-collectors-server-mocks plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-metrics-collectors-server-mocks'] --- import kbnCoreMetricsCollectorsServerMocksObj from './kbn_core_metrics_collectors_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_metrics_server.mdx b/api_docs/kbn_core_metrics_server.mdx index 726e1134b893b2..527cdc4f8b76ee 100644 --- a/api_docs/kbn_core_metrics_server.mdx +++ b/api_docs/kbn_core_metrics_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-metrics-server title: "@kbn/core-metrics-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-metrics-server plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-metrics-server'] --- import kbnCoreMetricsServerObj from './kbn_core_metrics_server.devdocs.json'; diff --git a/api_docs/kbn_core_metrics_server_internal.mdx b/api_docs/kbn_core_metrics_server_internal.mdx index 7e6b1ed7e6fc66..30cba754444e32 100644 --- a/api_docs/kbn_core_metrics_server_internal.mdx +++ b/api_docs/kbn_core_metrics_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-metrics-server-internal title: "@kbn/core-metrics-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-metrics-server-internal plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-metrics-server-internal'] --- import kbnCoreMetricsServerInternalObj from './kbn_core_metrics_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_metrics_server_mocks.mdx b/api_docs/kbn_core_metrics_server_mocks.mdx index 723a7ebb41b959..a537113ad5efa0 100644 --- a/api_docs/kbn_core_metrics_server_mocks.mdx +++ b/api_docs/kbn_core_metrics_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-metrics-server-mocks title: "@kbn/core-metrics-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-metrics-server-mocks plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-metrics-server-mocks'] --- import kbnCoreMetricsServerMocksObj from './kbn_core_metrics_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_mount_utils_browser.mdx b/api_docs/kbn_core_mount_utils_browser.mdx index c2846e0098de2f..28c4fdff12f6e2 100644 --- a/api_docs/kbn_core_mount_utils_browser.mdx +++ b/api_docs/kbn_core_mount_utils_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-mount-utils-browser title: "@kbn/core-mount-utils-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-mount-utils-browser plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-mount-utils-browser'] --- import kbnCoreMountUtilsBrowserObj from './kbn_core_mount_utils_browser.devdocs.json'; diff --git a/api_docs/kbn_core_node_server.mdx b/api_docs/kbn_core_node_server.mdx index 15c3770188e888..62918cce210114 100644 --- a/api_docs/kbn_core_node_server.mdx +++ b/api_docs/kbn_core_node_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-node-server title: "@kbn/core-node-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-node-server plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-node-server'] --- import kbnCoreNodeServerObj from './kbn_core_node_server.devdocs.json'; diff --git a/api_docs/kbn_core_node_server_internal.mdx b/api_docs/kbn_core_node_server_internal.mdx index 086505f078e8b7..05fa1173a983c9 100644 --- a/api_docs/kbn_core_node_server_internal.mdx +++ b/api_docs/kbn_core_node_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-node-server-internal title: "@kbn/core-node-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-node-server-internal plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-node-server-internal'] --- import kbnCoreNodeServerInternalObj from './kbn_core_node_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_node_server_mocks.mdx b/api_docs/kbn_core_node_server_mocks.mdx index ff0b40114ecf01..94eb45eab68873 100644 --- a/api_docs/kbn_core_node_server_mocks.mdx +++ b/api_docs/kbn_core_node_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-node-server-mocks title: "@kbn/core-node-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-node-server-mocks plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-node-server-mocks'] --- import kbnCoreNodeServerMocksObj from './kbn_core_node_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_notifications_browser.mdx b/api_docs/kbn_core_notifications_browser.mdx index 8ce898c973c3c8..8e99b96d686693 100644 --- a/api_docs/kbn_core_notifications_browser.mdx +++ b/api_docs/kbn_core_notifications_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-notifications-browser title: "@kbn/core-notifications-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-notifications-browser plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-notifications-browser'] --- import kbnCoreNotificationsBrowserObj from './kbn_core_notifications_browser.devdocs.json'; diff --git a/api_docs/kbn_core_notifications_browser_internal.mdx b/api_docs/kbn_core_notifications_browser_internal.mdx index 1522981156e83c..ff476c5b60aa74 100644 --- a/api_docs/kbn_core_notifications_browser_internal.mdx +++ b/api_docs/kbn_core_notifications_browser_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-notifications-browser-internal title: "@kbn/core-notifications-browser-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-notifications-browser-internal plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-notifications-browser-internal'] --- import kbnCoreNotificationsBrowserInternalObj from './kbn_core_notifications_browser_internal.devdocs.json'; diff --git a/api_docs/kbn_core_notifications_browser_mocks.mdx b/api_docs/kbn_core_notifications_browser_mocks.mdx index 3870d622b22496..e31bdace84ef02 100644 --- a/api_docs/kbn_core_notifications_browser_mocks.mdx +++ b/api_docs/kbn_core_notifications_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-notifications-browser-mocks title: "@kbn/core-notifications-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-notifications-browser-mocks plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-notifications-browser-mocks'] --- import kbnCoreNotificationsBrowserMocksObj from './kbn_core_notifications_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_overlays_browser.mdx b/api_docs/kbn_core_overlays_browser.mdx index 8a52cdb4b79c5f..90950b5874bb58 100644 --- a/api_docs/kbn_core_overlays_browser.mdx +++ b/api_docs/kbn_core_overlays_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-overlays-browser title: "@kbn/core-overlays-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-overlays-browser plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-overlays-browser'] --- import kbnCoreOverlaysBrowserObj from './kbn_core_overlays_browser.devdocs.json'; diff --git a/api_docs/kbn_core_overlays_browser_internal.mdx b/api_docs/kbn_core_overlays_browser_internal.mdx index cee9e03efc6db7..3e13db6fe0bd06 100644 --- a/api_docs/kbn_core_overlays_browser_internal.mdx +++ b/api_docs/kbn_core_overlays_browser_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-overlays-browser-internal title: "@kbn/core-overlays-browser-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-overlays-browser-internal plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-overlays-browser-internal'] --- import kbnCoreOverlaysBrowserInternalObj from './kbn_core_overlays_browser_internal.devdocs.json'; diff --git a/api_docs/kbn_core_overlays_browser_mocks.mdx b/api_docs/kbn_core_overlays_browser_mocks.mdx index 1c8eed42f9a4df..04df2cfdec6e96 100644 --- a/api_docs/kbn_core_overlays_browser_mocks.mdx +++ b/api_docs/kbn_core_overlays_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-overlays-browser-mocks title: "@kbn/core-overlays-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-overlays-browser-mocks plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-overlays-browser-mocks'] --- import kbnCoreOverlaysBrowserMocksObj from './kbn_core_overlays_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_plugins_browser.mdx b/api_docs/kbn_core_plugins_browser.mdx index e5ee5613866bbd..1423a31ba537d3 100644 --- a/api_docs/kbn_core_plugins_browser.mdx +++ b/api_docs/kbn_core_plugins_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-plugins-browser title: "@kbn/core-plugins-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-plugins-browser plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-plugins-browser'] --- import kbnCorePluginsBrowserObj from './kbn_core_plugins_browser.devdocs.json'; diff --git a/api_docs/kbn_core_plugins_browser_mocks.mdx b/api_docs/kbn_core_plugins_browser_mocks.mdx index 2a25e331a30b65..0155fa4822b2c6 100644 --- a/api_docs/kbn_core_plugins_browser_mocks.mdx +++ b/api_docs/kbn_core_plugins_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-plugins-browser-mocks title: "@kbn/core-plugins-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-plugins-browser-mocks plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-plugins-browser-mocks'] --- import kbnCorePluginsBrowserMocksObj from './kbn_core_plugins_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_plugins_server.mdx b/api_docs/kbn_core_plugins_server.mdx index 2e26d185df4f55..e59529213227f1 100644 --- a/api_docs/kbn_core_plugins_server.mdx +++ b/api_docs/kbn_core_plugins_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-plugins-server title: "@kbn/core-plugins-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-plugins-server plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-plugins-server'] --- import kbnCorePluginsServerObj from './kbn_core_plugins_server.devdocs.json'; diff --git a/api_docs/kbn_core_plugins_server_mocks.mdx b/api_docs/kbn_core_plugins_server_mocks.mdx index 027fcf9644a892..771f09f018f2fc 100644 --- a/api_docs/kbn_core_plugins_server_mocks.mdx +++ b/api_docs/kbn_core_plugins_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-plugins-server-mocks title: "@kbn/core-plugins-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-plugins-server-mocks plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-plugins-server-mocks'] --- import kbnCorePluginsServerMocksObj from './kbn_core_plugins_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_preboot_server.mdx b/api_docs/kbn_core_preboot_server.mdx index e356ae427045fe..f85c826e45fbcd 100644 --- a/api_docs/kbn_core_preboot_server.mdx +++ b/api_docs/kbn_core_preboot_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-preboot-server title: "@kbn/core-preboot-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-preboot-server plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-preboot-server'] --- import kbnCorePrebootServerObj from './kbn_core_preboot_server.devdocs.json'; diff --git a/api_docs/kbn_core_preboot_server_mocks.mdx b/api_docs/kbn_core_preboot_server_mocks.mdx index 87d1116d2816ef..0a62ae03168bc9 100644 --- a/api_docs/kbn_core_preboot_server_mocks.mdx +++ b/api_docs/kbn_core_preboot_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-preboot-server-mocks title: "@kbn/core-preboot-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-preboot-server-mocks plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-preboot-server-mocks'] --- import kbnCorePrebootServerMocksObj from './kbn_core_preboot_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_rendering_browser_mocks.mdx b/api_docs/kbn_core_rendering_browser_mocks.mdx index d6b89691ea8de4..c64368fbda9c4c 100644 --- a/api_docs/kbn_core_rendering_browser_mocks.mdx +++ b/api_docs/kbn_core_rendering_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-rendering-browser-mocks title: "@kbn/core-rendering-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-rendering-browser-mocks plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-rendering-browser-mocks'] --- import kbnCoreRenderingBrowserMocksObj from './kbn_core_rendering_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_rendering_server_internal.mdx b/api_docs/kbn_core_rendering_server_internal.mdx index e3a278877ae83e..27a9448b012736 100644 --- a/api_docs/kbn_core_rendering_server_internal.mdx +++ b/api_docs/kbn_core_rendering_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-rendering-server-internal title: "@kbn/core-rendering-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-rendering-server-internal plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-rendering-server-internal'] --- import kbnCoreRenderingServerInternalObj from './kbn_core_rendering_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_rendering_server_mocks.mdx b/api_docs/kbn_core_rendering_server_mocks.mdx index 89f51ab32b50cf..51aaafb38872a3 100644 --- a/api_docs/kbn_core_rendering_server_mocks.mdx +++ b/api_docs/kbn_core_rendering_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-rendering-server-mocks title: "@kbn/core-rendering-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-rendering-server-mocks plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-rendering-server-mocks'] --- import kbnCoreRenderingServerMocksObj from './kbn_core_rendering_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_root_server_internal.mdx b/api_docs/kbn_core_root_server_internal.mdx index 8672c6aadcf0c6..74d8e5deef6ae3 100644 --- a/api_docs/kbn_core_root_server_internal.mdx +++ b/api_docs/kbn_core_root_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-root-server-internal title: "@kbn/core-root-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-root-server-internal plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-root-server-internal'] --- import kbnCoreRootServerInternalObj from './kbn_core_root_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_api_browser.mdx b/api_docs/kbn_core_saved_objects_api_browser.mdx index 0c1c4f12ba57b6..57cfbff0ac9797 100644 --- a/api_docs/kbn_core_saved_objects_api_browser.mdx +++ b/api_docs/kbn_core_saved_objects_api_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-api-browser title: "@kbn/core-saved-objects-api-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-api-browser plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-api-browser'] --- import kbnCoreSavedObjectsApiBrowserObj from './kbn_core_saved_objects_api_browser.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_api_server.mdx b/api_docs/kbn_core_saved_objects_api_server.mdx index d9a9b995b13403..c2174e8a4adf7a 100644 --- a/api_docs/kbn_core_saved_objects_api_server.mdx +++ b/api_docs/kbn_core_saved_objects_api_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-api-server title: "@kbn/core-saved-objects-api-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-api-server plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-api-server'] --- import kbnCoreSavedObjectsApiServerObj from './kbn_core_saved_objects_api_server.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_api_server_mocks.mdx b/api_docs/kbn_core_saved_objects_api_server_mocks.mdx index 0dbf36bf4d266f..761c3573961ff0 100644 --- a/api_docs/kbn_core_saved_objects_api_server_mocks.mdx +++ b/api_docs/kbn_core_saved_objects_api_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-api-server-mocks title: "@kbn/core-saved-objects-api-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-api-server-mocks plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-api-server-mocks'] --- import kbnCoreSavedObjectsApiServerMocksObj from './kbn_core_saved_objects_api_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_base_server_internal.mdx b/api_docs/kbn_core_saved_objects_base_server_internal.mdx index 563f0fa37a2b2b..8bad19695c4acd 100644 --- a/api_docs/kbn_core_saved_objects_base_server_internal.mdx +++ b/api_docs/kbn_core_saved_objects_base_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-base-server-internal title: "@kbn/core-saved-objects-base-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-base-server-internal plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-base-server-internal'] --- import kbnCoreSavedObjectsBaseServerInternalObj from './kbn_core_saved_objects_base_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_base_server_mocks.mdx b/api_docs/kbn_core_saved_objects_base_server_mocks.mdx index a0a936b0af20df..a6b97830e5d39f 100644 --- a/api_docs/kbn_core_saved_objects_base_server_mocks.mdx +++ b/api_docs/kbn_core_saved_objects_base_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-base-server-mocks title: "@kbn/core-saved-objects-base-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-base-server-mocks plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-base-server-mocks'] --- import kbnCoreSavedObjectsBaseServerMocksObj from './kbn_core_saved_objects_base_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_browser.mdx b/api_docs/kbn_core_saved_objects_browser.mdx index fe25f9da7a4fce..ff2b24b0a7b8a9 100644 --- a/api_docs/kbn_core_saved_objects_browser.mdx +++ b/api_docs/kbn_core_saved_objects_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-browser title: "@kbn/core-saved-objects-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-browser plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-browser'] --- import kbnCoreSavedObjectsBrowserObj from './kbn_core_saved_objects_browser.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_browser_internal.mdx b/api_docs/kbn_core_saved_objects_browser_internal.mdx index 9475d0b0703441..186de6833deac9 100644 --- a/api_docs/kbn_core_saved_objects_browser_internal.mdx +++ b/api_docs/kbn_core_saved_objects_browser_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-browser-internal title: "@kbn/core-saved-objects-browser-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-browser-internal plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-browser-internal'] --- import kbnCoreSavedObjectsBrowserInternalObj from './kbn_core_saved_objects_browser_internal.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_browser_mocks.mdx b/api_docs/kbn_core_saved_objects_browser_mocks.mdx index cb2080da04f33b..1e3f7bf5ea09ac 100644 --- a/api_docs/kbn_core_saved_objects_browser_mocks.mdx +++ b/api_docs/kbn_core_saved_objects_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-browser-mocks title: "@kbn/core-saved-objects-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-browser-mocks plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-browser-mocks'] --- import kbnCoreSavedObjectsBrowserMocksObj from './kbn_core_saved_objects_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_common.mdx b/api_docs/kbn_core_saved_objects_common.mdx index e1f33ab848a8cc..587fa4595c465b 100644 --- a/api_docs/kbn_core_saved_objects_common.mdx +++ b/api_docs/kbn_core_saved_objects_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-common title: "@kbn/core-saved-objects-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-common plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-common'] --- import kbnCoreSavedObjectsCommonObj from './kbn_core_saved_objects_common.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_import_export_server_internal.mdx b/api_docs/kbn_core_saved_objects_import_export_server_internal.mdx index 8afec3353f0c6a..caeed7e0d214ba 100644 --- a/api_docs/kbn_core_saved_objects_import_export_server_internal.mdx +++ b/api_docs/kbn_core_saved_objects_import_export_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-import-export-server-internal title: "@kbn/core-saved-objects-import-export-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-import-export-server-internal plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-import-export-server-internal'] --- import kbnCoreSavedObjectsImportExportServerInternalObj from './kbn_core_saved_objects_import_export_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_import_export_server_mocks.mdx b/api_docs/kbn_core_saved_objects_import_export_server_mocks.mdx index 0366422c79d4aa..4a5ca147e3e1ce 100644 --- a/api_docs/kbn_core_saved_objects_import_export_server_mocks.mdx +++ b/api_docs/kbn_core_saved_objects_import_export_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-import-export-server-mocks title: "@kbn/core-saved-objects-import-export-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-import-export-server-mocks plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-import-export-server-mocks'] --- import kbnCoreSavedObjectsImportExportServerMocksObj from './kbn_core_saved_objects_import_export_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_migration_server_internal.mdx b/api_docs/kbn_core_saved_objects_migration_server_internal.mdx index 4b5d2da444ccf4..2656b16fb1eacc 100644 --- a/api_docs/kbn_core_saved_objects_migration_server_internal.mdx +++ b/api_docs/kbn_core_saved_objects_migration_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-migration-server-internal title: "@kbn/core-saved-objects-migration-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-migration-server-internal plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-migration-server-internal'] --- import kbnCoreSavedObjectsMigrationServerInternalObj from './kbn_core_saved_objects_migration_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_migration_server_mocks.mdx b/api_docs/kbn_core_saved_objects_migration_server_mocks.mdx index ff1edfb6f7e63a..1dc436218dcfbe 100644 --- a/api_docs/kbn_core_saved_objects_migration_server_mocks.mdx +++ b/api_docs/kbn_core_saved_objects_migration_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-migration-server-mocks title: "@kbn/core-saved-objects-migration-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-migration-server-mocks plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-migration-server-mocks'] --- import kbnCoreSavedObjectsMigrationServerMocksObj from './kbn_core_saved_objects_migration_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_server.mdx b/api_docs/kbn_core_saved_objects_server.mdx index 7e7808f4ced482..2baf40ffc39e19 100644 --- a/api_docs/kbn_core_saved_objects_server.mdx +++ b/api_docs/kbn_core_saved_objects_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-server title: "@kbn/core-saved-objects-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-server plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-server'] --- import kbnCoreSavedObjectsServerObj from './kbn_core_saved_objects_server.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_server_internal.mdx b/api_docs/kbn_core_saved_objects_server_internal.mdx index 4982a764e38979..31134f6153b196 100644 --- a/api_docs/kbn_core_saved_objects_server_internal.mdx +++ b/api_docs/kbn_core_saved_objects_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-server-internal title: "@kbn/core-saved-objects-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-server-internal plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-server-internal'] --- import kbnCoreSavedObjectsServerInternalObj from './kbn_core_saved_objects_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_server_mocks.mdx b/api_docs/kbn_core_saved_objects_server_mocks.mdx index d6b584ac39918a..c0c603e8fb247c 100644 --- a/api_docs/kbn_core_saved_objects_server_mocks.mdx +++ b/api_docs/kbn_core_saved_objects_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-server-mocks title: "@kbn/core-saved-objects-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-server-mocks plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-server-mocks'] --- import kbnCoreSavedObjectsServerMocksObj from './kbn_core_saved_objects_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_utils_server.mdx b/api_docs/kbn_core_saved_objects_utils_server.mdx index 9b261b82a48879..0e0faf6804d6f4 100644 --- a/api_docs/kbn_core_saved_objects_utils_server.mdx +++ b/api_docs/kbn_core_saved_objects_utils_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-utils-server title: "@kbn/core-saved-objects-utils-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-utils-server plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-utils-server'] --- import kbnCoreSavedObjectsUtilsServerObj from './kbn_core_saved_objects_utils_server.devdocs.json'; diff --git a/api_docs/kbn_core_status_common.mdx b/api_docs/kbn_core_status_common.mdx index a2747e44fb2ef1..578a95de38aa71 100644 --- a/api_docs/kbn_core_status_common.mdx +++ b/api_docs/kbn_core_status_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-status-common title: "@kbn/core-status-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-status-common plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-status-common'] --- import kbnCoreStatusCommonObj from './kbn_core_status_common.devdocs.json'; diff --git a/api_docs/kbn_core_status_common_internal.mdx b/api_docs/kbn_core_status_common_internal.mdx index f9ea7234ba092f..2b20d7b64313fb 100644 --- a/api_docs/kbn_core_status_common_internal.mdx +++ b/api_docs/kbn_core_status_common_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-status-common-internal title: "@kbn/core-status-common-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-status-common-internal plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-status-common-internal'] --- import kbnCoreStatusCommonInternalObj from './kbn_core_status_common_internal.devdocs.json'; diff --git a/api_docs/kbn_core_status_server.mdx b/api_docs/kbn_core_status_server.mdx index e93cfca9971be2..db1a2bf79f8b52 100644 --- a/api_docs/kbn_core_status_server.mdx +++ b/api_docs/kbn_core_status_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-status-server title: "@kbn/core-status-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-status-server plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-status-server'] --- import kbnCoreStatusServerObj from './kbn_core_status_server.devdocs.json'; diff --git a/api_docs/kbn_core_status_server_internal.mdx b/api_docs/kbn_core_status_server_internal.mdx index 7eecd36c2da254..e8d6848002d454 100644 --- a/api_docs/kbn_core_status_server_internal.mdx +++ b/api_docs/kbn_core_status_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-status-server-internal title: "@kbn/core-status-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-status-server-internal plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-status-server-internal'] --- import kbnCoreStatusServerInternalObj from './kbn_core_status_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_status_server_mocks.mdx b/api_docs/kbn_core_status_server_mocks.mdx index a8b2552166fd90..1b03c3e4f1b464 100644 --- a/api_docs/kbn_core_status_server_mocks.mdx +++ b/api_docs/kbn_core_status_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-status-server-mocks title: "@kbn/core-status-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-status-server-mocks plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-status-server-mocks'] --- import kbnCoreStatusServerMocksObj from './kbn_core_status_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_test_helpers_deprecations_getters.mdx b/api_docs/kbn_core_test_helpers_deprecations_getters.mdx index 7e67f32ad0271c..f1321f05e906db 100644 --- a/api_docs/kbn_core_test_helpers_deprecations_getters.mdx +++ b/api_docs/kbn_core_test_helpers_deprecations_getters.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-test-helpers-deprecations-getters title: "@kbn/core-test-helpers-deprecations-getters" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-test-helpers-deprecations-getters plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-test-helpers-deprecations-getters'] --- import kbnCoreTestHelpersDeprecationsGettersObj from './kbn_core_test_helpers_deprecations_getters.devdocs.json'; diff --git a/api_docs/kbn_core_test_helpers_http_setup_browser.mdx b/api_docs/kbn_core_test_helpers_http_setup_browser.mdx index 57e396d2cb285a..2e3d5668a774c0 100644 --- a/api_docs/kbn_core_test_helpers_http_setup_browser.mdx +++ b/api_docs/kbn_core_test_helpers_http_setup_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-test-helpers-http-setup-browser title: "@kbn/core-test-helpers-http-setup-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-test-helpers-http-setup-browser plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-test-helpers-http-setup-browser'] --- import kbnCoreTestHelpersHttpSetupBrowserObj from './kbn_core_test_helpers_http_setup_browser.devdocs.json'; diff --git a/api_docs/kbn_core_test_helpers_kbn_server.mdx b/api_docs/kbn_core_test_helpers_kbn_server.mdx index d47ff867a239fd..2702972ccc8d87 100644 --- a/api_docs/kbn_core_test_helpers_kbn_server.mdx +++ b/api_docs/kbn_core_test_helpers_kbn_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-test-helpers-kbn-server title: "@kbn/core-test-helpers-kbn-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-test-helpers-kbn-server plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-test-helpers-kbn-server'] --- import kbnCoreTestHelpersKbnServerObj from './kbn_core_test_helpers_kbn_server.devdocs.json'; diff --git a/api_docs/kbn_core_test_helpers_model_versions.mdx b/api_docs/kbn_core_test_helpers_model_versions.mdx index 84a658d71ce303..68885e53fad0e0 100644 --- a/api_docs/kbn_core_test_helpers_model_versions.mdx +++ b/api_docs/kbn_core_test_helpers_model_versions.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-test-helpers-model-versions title: "@kbn/core-test-helpers-model-versions" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-test-helpers-model-versions plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-test-helpers-model-versions'] --- import kbnCoreTestHelpersModelVersionsObj from './kbn_core_test_helpers_model_versions.devdocs.json'; diff --git a/api_docs/kbn_core_test_helpers_so_type_serializer.mdx b/api_docs/kbn_core_test_helpers_so_type_serializer.mdx index b1775d43ad1ded..c93c8070d02d84 100644 --- a/api_docs/kbn_core_test_helpers_so_type_serializer.mdx +++ b/api_docs/kbn_core_test_helpers_so_type_serializer.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-test-helpers-so-type-serializer title: "@kbn/core-test-helpers-so-type-serializer" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-test-helpers-so-type-serializer plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-test-helpers-so-type-serializer'] --- import kbnCoreTestHelpersSoTypeSerializerObj from './kbn_core_test_helpers_so_type_serializer.devdocs.json'; diff --git a/api_docs/kbn_core_test_helpers_test_utils.mdx b/api_docs/kbn_core_test_helpers_test_utils.mdx index b03b02afd477f4..acb8d895dc9d91 100644 --- a/api_docs/kbn_core_test_helpers_test_utils.mdx +++ b/api_docs/kbn_core_test_helpers_test_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-test-helpers-test-utils title: "@kbn/core-test-helpers-test-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-test-helpers-test-utils plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-test-helpers-test-utils'] --- import kbnCoreTestHelpersTestUtilsObj from './kbn_core_test_helpers_test_utils.devdocs.json'; diff --git a/api_docs/kbn_core_theme_browser.mdx b/api_docs/kbn_core_theme_browser.mdx index 46f2383c370b42..1cb4fe90b89293 100644 --- a/api_docs/kbn_core_theme_browser.mdx +++ b/api_docs/kbn_core_theme_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-theme-browser title: "@kbn/core-theme-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-theme-browser plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-theme-browser'] --- import kbnCoreThemeBrowserObj from './kbn_core_theme_browser.devdocs.json'; diff --git a/api_docs/kbn_core_theme_browser_mocks.mdx b/api_docs/kbn_core_theme_browser_mocks.mdx index cc8ac096f4178d..298904c6bcdf84 100644 --- a/api_docs/kbn_core_theme_browser_mocks.mdx +++ b/api_docs/kbn_core_theme_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-theme-browser-mocks title: "@kbn/core-theme-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-theme-browser-mocks plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-theme-browser-mocks'] --- import kbnCoreThemeBrowserMocksObj from './kbn_core_theme_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_ui_settings_browser.mdx b/api_docs/kbn_core_ui_settings_browser.mdx index 0874bb0f16493b..557577238115a1 100644 --- a/api_docs/kbn_core_ui_settings_browser.mdx +++ b/api_docs/kbn_core_ui_settings_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-ui-settings-browser title: "@kbn/core-ui-settings-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-ui-settings-browser plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-ui-settings-browser'] --- import kbnCoreUiSettingsBrowserObj from './kbn_core_ui_settings_browser.devdocs.json'; diff --git a/api_docs/kbn_core_ui_settings_browser_internal.mdx b/api_docs/kbn_core_ui_settings_browser_internal.mdx index a8876ae05e016a..e1e074c5076f2a 100644 --- a/api_docs/kbn_core_ui_settings_browser_internal.mdx +++ b/api_docs/kbn_core_ui_settings_browser_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-ui-settings-browser-internal title: "@kbn/core-ui-settings-browser-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-ui-settings-browser-internal plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-ui-settings-browser-internal'] --- import kbnCoreUiSettingsBrowserInternalObj from './kbn_core_ui_settings_browser_internal.devdocs.json'; diff --git a/api_docs/kbn_core_ui_settings_browser_mocks.mdx b/api_docs/kbn_core_ui_settings_browser_mocks.mdx index d59f5a5ff67240..c0a9e34494a2d1 100644 --- a/api_docs/kbn_core_ui_settings_browser_mocks.mdx +++ b/api_docs/kbn_core_ui_settings_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-ui-settings-browser-mocks title: "@kbn/core-ui-settings-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-ui-settings-browser-mocks plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-ui-settings-browser-mocks'] --- import kbnCoreUiSettingsBrowserMocksObj from './kbn_core_ui_settings_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_ui_settings_common.mdx b/api_docs/kbn_core_ui_settings_common.mdx index b919110289a14a..06cb6570e09d21 100644 --- a/api_docs/kbn_core_ui_settings_common.mdx +++ b/api_docs/kbn_core_ui_settings_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-ui-settings-common title: "@kbn/core-ui-settings-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-ui-settings-common plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-ui-settings-common'] --- import kbnCoreUiSettingsCommonObj from './kbn_core_ui_settings_common.devdocs.json'; diff --git a/api_docs/kbn_core_ui_settings_server.mdx b/api_docs/kbn_core_ui_settings_server.mdx index 451387ce1315ae..ae7386fbb236f3 100644 --- a/api_docs/kbn_core_ui_settings_server.mdx +++ b/api_docs/kbn_core_ui_settings_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-ui-settings-server title: "@kbn/core-ui-settings-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-ui-settings-server plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-ui-settings-server'] --- import kbnCoreUiSettingsServerObj from './kbn_core_ui_settings_server.devdocs.json'; diff --git a/api_docs/kbn_core_ui_settings_server_internal.mdx b/api_docs/kbn_core_ui_settings_server_internal.mdx index 774d04188aa11c..b1e1426d27519d 100644 --- a/api_docs/kbn_core_ui_settings_server_internal.mdx +++ b/api_docs/kbn_core_ui_settings_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-ui-settings-server-internal title: "@kbn/core-ui-settings-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-ui-settings-server-internal plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-ui-settings-server-internal'] --- import kbnCoreUiSettingsServerInternalObj from './kbn_core_ui_settings_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_ui_settings_server_mocks.mdx b/api_docs/kbn_core_ui_settings_server_mocks.mdx index 007818914b2f6b..e0713926440aaa 100644 --- a/api_docs/kbn_core_ui_settings_server_mocks.mdx +++ b/api_docs/kbn_core_ui_settings_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-ui-settings-server-mocks title: "@kbn/core-ui-settings-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-ui-settings-server-mocks plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-ui-settings-server-mocks'] --- import kbnCoreUiSettingsServerMocksObj from './kbn_core_ui_settings_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_usage_data_server.mdx b/api_docs/kbn_core_usage_data_server.mdx index 9b7d38b1f41246..f57f97a7909af0 100644 --- a/api_docs/kbn_core_usage_data_server.mdx +++ b/api_docs/kbn_core_usage_data_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-usage-data-server title: "@kbn/core-usage-data-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-usage-data-server plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-usage-data-server'] --- import kbnCoreUsageDataServerObj from './kbn_core_usage_data_server.devdocs.json'; diff --git a/api_docs/kbn_core_usage_data_server_internal.mdx b/api_docs/kbn_core_usage_data_server_internal.mdx index 1b1830fca40aff..798e5c136a0f7a 100644 --- a/api_docs/kbn_core_usage_data_server_internal.mdx +++ b/api_docs/kbn_core_usage_data_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-usage-data-server-internal title: "@kbn/core-usage-data-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-usage-data-server-internal plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-usage-data-server-internal'] --- import kbnCoreUsageDataServerInternalObj from './kbn_core_usage_data_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_usage_data_server_mocks.mdx b/api_docs/kbn_core_usage_data_server_mocks.mdx index 35a84b8eb74ffb..36e696f1601666 100644 --- a/api_docs/kbn_core_usage_data_server_mocks.mdx +++ b/api_docs/kbn_core_usage_data_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-usage-data-server-mocks title: "@kbn/core-usage-data-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-usage-data-server-mocks plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-usage-data-server-mocks'] --- import kbnCoreUsageDataServerMocksObj from './kbn_core_usage_data_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_user_settings_server.mdx b/api_docs/kbn_core_user_settings_server.mdx index 627cedac912e43..9fb112ee797e5a 100644 --- a/api_docs/kbn_core_user_settings_server.mdx +++ b/api_docs/kbn_core_user_settings_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-user-settings-server title: "@kbn/core-user-settings-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-user-settings-server plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-user-settings-server'] --- import kbnCoreUserSettingsServerObj from './kbn_core_user_settings_server.devdocs.json'; diff --git a/api_docs/kbn_core_user_settings_server_internal.mdx b/api_docs/kbn_core_user_settings_server_internal.mdx index 51d541adbeb8c4..ad8bf13838193f 100644 --- a/api_docs/kbn_core_user_settings_server_internal.mdx +++ b/api_docs/kbn_core_user_settings_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-user-settings-server-internal title: "@kbn/core-user-settings-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-user-settings-server-internal plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-user-settings-server-internal'] --- import kbnCoreUserSettingsServerInternalObj from './kbn_core_user_settings_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_user_settings_server_mocks.mdx b/api_docs/kbn_core_user_settings_server_mocks.mdx index 9fefdd8eff3e7a..62b09a0c229236 100644 --- a/api_docs/kbn_core_user_settings_server_mocks.mdx +++ b/api_docs/kbn_core_user_settings_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-user-settings-server-mocks title: "@kbn/core-user-settings-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-user-settings-server-mocks plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-user-settings-server-mocks'] --- import kbnCoreUserSettingsServerMocksObj from './kbn_core_user_settings_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_crypto.mdx b/api_docs/kbn_crypto.mdx index 3171919000fba4..56138ef33222c0 100644 --- a/api_docs/kbn_crypto.mdx +++ b/api_docs/kbn_crypto.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-crypto title: "@kbn/crypto" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/crypto plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/crypto'] --- import kbnCryptoObj from './kbn_crypto.devdocs.json'; diff --git a/api_docs/kbn_crypto_browser.mdx b/api_docs/kbn_crypto_browser.mdx index a7593bcb58cc96..91453b0f2648c9 100644 --- a/api_docs/kbn_crypto_browser.mdx +++ b/api_docs/kbn_crypto_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-crypto-browser title: "@kbn/crypto-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/crypto-browser plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/crypto-browser'] --- import kbnCryptoBrowserObj from './kbn_crypto_browser.devdocs.json'; diff --git a/api_docs/kbn_custom_integrations.mdx b/api_docs/kbn_custom_integrations.mdx index 8c51f9ad1c4ac2..711391ba9aae6c 100644 --- a/api_docs/kbn_custom_integrations.mdx +++ b/api_docs/kbn_custom_integrations.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-custom-integrations title: "@kbn/custom-integrations" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/custom-integrations plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/custom-integrations'] --- import kbnCustomIntegrationsObj from './kbn_custom_integrations.devdocs.json'; diff --git a/api_docs/kbn_cypress_config.mdx b/api_docs/kbn_cypress_config.mdx index 129699713bb36d..8cfbfedbbab42e 100644 --- a/api_docs/kbn_cypress_config.mdx +++ b/api_docs/kbn_cypress_config.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-cypress-config title: "@kbn/cypress-config" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/cypress-config plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/cypress-config'] --- import kbnCypressConfigObj from './kbn_cypress_config.devdocs.json'; diff --git a/api_docs/kbn_data_service.mdx b/api_docs/kbn_data_service.mdx index 8ea7cc44d88621..45780c220e5fef 100644 --- a/api_docs/kbn_data_service.mdx +++ b/api_docs/kbn_data_service.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-data-service title: "@kbn/data-service" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/data-service plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/data-service'] --- import kbnDataServiceObj from './kbn_data_service.devdocs.json'; diff --git a/api_docs/kbn_datemath.mdx b/api_docs/kbn_datemath.mdx index dbae3ebc66575c..b0d7bb76632d50 100644 --- a/api_docs/kbn_datemath.mdx +++ b/api_docs/kbn_datemath.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-datemath title: "@kbn/datemath" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/datemath plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/datemath'] --- import kbnDatemathObj from './kbn_datemath.devdocs.json'; diff --git a/api_docs/kbn_deeplinks_analytics.mdx b/api_docs/kbn_deeplinks_analytics.mdx index 195b512a8da748..9149a6e286096e 100644 --- a/api_docs/kbn_deeplinks_analytics.mdx +++ b/api_docs/kbn_deeplinks_analytics.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-deeplinks-analytics title: "@kbn/deeplinks-analytics" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/deeplinks-analytics plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/deeplinks-analytics'] --- import kbnDeeplinksAnalyticsObj from './kbn_deeplinks_analytics.devdocs.json'; diff --git a/api_docs/kbn_deeplinks_devtools.mdx b/api_docs/kbn_deeplinks_devtools.mdx index b90fadc4dd4e8f..a5b40987c09188 100644 --- a/api_docs/kbn_deeplinks_devtools.mdx +++ b/api_docs/kbn_deeplinks_devtools.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-deeplinks-devtools title: "@kbn/deeplinks-devtools" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/deeplinks-devtools plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/deeplinks-devtools'] --- import kbnDeeplinksDevtoolsObj from './kbn_deeplinks_devtools.devdocs.json'; diff --git a/api_docs/kbn_deeplinks_management.mdx b/api_docs/kbn_deeplinks_management.mdx index 54cc7cb359c06a..dec4aff3e20b4a 100644 --- a/api_docs/kbn_deeplinks_management.mdx +++ b/api_docs/kbn_deeplinks_management.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-deeplinks-management title: "@kbn/deeplinks-management" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/deeplinks-management plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/deeplinks-management'] --- import kbnDeeplinksManagementObj from './kbn_deeplinks_management.devdocs.json'; diff --git a/api_docs/kbn_deeplinks_ml.mdx b/api_docs/kbn_deeplinks_ml.mdx index 932b7ed70a1828..c2011ae52d065f 100644 --- a/api_docs/kbn_deeplinks_ml.mdx +++ b/api_docs/kbn_deeplinks_ml.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-deeplinks-ml title: "@kbn/deeplinks-ml" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/deeplinks-ml plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/deeplinks-ml'] --- import kbnDeeplinksMlObj from './kbn_deeplinks_ml.devdocs.json'; diff --git a/api_docs/kbn_deeplinks_observability.mdx b/api_docs/kbn_deeplinks_observability.mdx index 4f1a92b14ff6e8..702b1a631c8d27 100644 --- a/api_docs/kbn_deeplinks_observability.mdx +++ b/api_docs/kbn_deeplinks_observability.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-deeplinks-observability title: "@kbn/deeplinks-observability" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/deeplinks-observability plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/deeplinks-observability'] --- import kbnDeeplinksObservabilityObj from './kbn_deeplinks_observability.devdocs.json'; diff --git a/api_docs/kbn_deeplinks_search.mdx b/api_docs/kbn_deeplinks_search.mdx index 80e1f34cd537e3..b05a6da67d5619 100644 --- a/api_docs/kbn_deeplinks_search.mdx +++ b/api_docs/kbn_deeplinks_search.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-deeplinks-search title: "@kbn/deeplinks-search" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/deeplinks-search plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/deeplinks-search'] --- import kbnDeeplinksSearchObj from './kbn_deeplinks_search.devdocs.json'; diff --git a/api_docs/kbn_default_nav_analytics.devdocs.json b/api_docs/kbn_default_nav_analytics.devdocs.json index ed0fc87f7eb632..828b2559cb140a 100644 --- a/api_docs/kbn_default_nav_analytics.devdocs.json +++ b/api_docs/kbn_default_nav_analytics.devdocs.json @@ -164,6 +164,20 @@ "deprecated": false, "trackAdoption": false }, + { + "parentPluginId": "@kbn/default-nav-analytics", + "id": "def-common.defaultNavigation.renderAs", + "type": "string", + "tags": [], + "label": "renderAs", + "description": [], + "signature": [ + "\"accordion\"" + ], + "path": "packages/default-nav/analytics/default_navigation.ts", + "deprecated": false, + "trackAdoption": false + }, { "parentPluginId": "@kbn/default-nav-analytics", "id": "def-common.defaultNavigation.children", diff --git a/api_docs/kbn_default_nav_analytics.mdx b/api_docs/kbn_default_nav_analytics.mdx index eef02084d9f990..aa0e9b263317c4 100644 --- a/api_docs/kbn_default_nav_analytics.mdx +++ b/api_docs/kbn_default_nav_analytics.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-default-nav-analytics title: "@kbn/default-nav-analytics" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/default-nav-analytics plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/default-nav-analytics'] --- import kbnDefaultNavAnalyticsObj from './kbn_default_nav_analytics.devdocs.json'; @@ -21,7 +21,7 @@ Contact [@elastic/kibana-data-discovery](https://github.com/orgs/elastic/teams/k | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 7 | 0 | 7 | 0 | +| 8 | 0 | 8 | 0 | ## Common diff --git a/api_docs/kbn_default_nav_devtools.devdocs.json b/api_docs/kbn_default_nav_devtools.devdocs.json index 450d8ef0ed0095..a07788d9d9287c 100644 --- a/api_docs/kbn_default_nav_devtools.devdocs.json +++ b/api_docs/kbn_default_nav_devtools.devdocs.json @@ -164,6 +164,20 @@ "deprecated": false, "trackAdoption": false }, + { + "parentPluginId": "@kbn/default-nav-devtools", + "id": "def-common.defaultNavigation.renderAs", + "type": "string", + "tags": [], + "label": "renderAs", + "description": [], + "signature": [ + "\"accordion\"" + ], + "path": "packages/default-nav/devtools/default_navigation.ts", + "deprecated": false, + "trackAdoption": false + }, { "parentPluginId": "@kbn/default-nav-devtools", "id": "def-common.defaultNavigation.children", diff --git a/api_docs/kbn_default_nav_devtools.mdx b/api_docs/kbn_default_nav_devtools.mdx index ce25919301b996..1a1c4bbf3f6230 100644 --- a/api_docs/kbn_default_nav_devtools.mdx +++ b/api_docs/kbn_default_nav_devtools.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-default-nav-devtools title: "@kbn/default-nav-devtools" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/default-nav-devtools plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/default-nav-devtools'] --- import kbnDefaultNavDevtoolsObj from './kbn_default_nav_devtools.devdocs.json'; @@ -21,7 +21,7 @@ Contact [@elastic/platform-deployment-management](https://github.com/orgs/elasti | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 7 | 0 | 7 | 0 | +| 8 | 0 | 8 | 0 | ## Common diff --git a/api_docs/kbn_default_nav_management.devdocs.json b/api_docs/kbn_default_nav_management.devdocs.json index 7f0c46ca01e9a6..b75b192e283689 100644 --- a/api_docs/kbn_default_nav_management.devdocs.json +++ b/api_docs/kbn_default_nav_management.devdocs.json @@ -164,6 +164,20 @@ "deprecated": false, "trackAdoption": false }, + { + "parentPluginId": "@kbn/default-nav-management", + "id": "def-common.defaultNavigation.renderAs", + "type": "string", + "tags": [], + "label": "renderAs", + "description": [], + "signature": [ + "\"accordion\"" + ], + "path": "packages/default-nav/management/default_navigation.ts", + "deprecated": false, + "trackAdoption": false + }, { "parentPluginId": "@kbn/default-nav-management", "id": "def-common.defaultNavigation.children", @@ -172,7 +186,7 @@ "label": "children", "description": [], "signature": [ - "({ link: \"monitoring\"; } | { id: \"integration_management\"; title: string; children: ({ link: \"integrations\"; } | { link: \"fleet\"; } | { link: \"osquery\"; })[]; } | { id: \"stack_management\"; title: string; children: ({ id: \"ingest\"; title: string; children: ({ link: \"management:ingest_pipelines\"; } | { link: \"management:pipelines\"; })[]; } | { id: \"data\"; title: string; children: ({ link: \"management:index_management\"; } | { link: \"management:transform\"; })[]; } | { id: \"alerts_and_insights\"; title: string; children: ({ link: \"management:triggersActions\"; } | { link: \"management:cases\"; } | { link: \"management:triggersActionsConnectors\"; } | { link: \"management:jobsListLink\"; })[]; } | { id: \"kibana\"; title: string; children: ({ link: \"management:dataViews\"; } | { link: \"management:objects\"; } | { link: \"management:tags\"; } | { link: \"management:spaces\"; } | { link: \"management:settings\"; })[]; })[]; })[]" + "({ link: \"monitoring\"; } | { id: \"integration_management\"; title: string; renderAs: \"accordion\"; children: ({ link: \"integrations\"; } | { link: \"fleet\"; } | { link: \"osquery\"; })[]; } | { id: \"stack_management\"; title: string; renderAs: \"accordion\"; children: ({ id: \"ingest\"; title: string; renderAs: \"accordion\"; children: ({ link: \"management:ingest_pipelines\"; } | { link: \"management:pipelines\"; })[]; } | { id: \"data\"; title: string; renderAs: \"accordion\"; children: ({ link: \"management:index_management\"; } | { link: \"management:transform\"; })[]; } | { id: \"alerts_and_insights\"; title: string; renderAs: \"accordion\"; children: ({ link: \"management:triggersActions\"; } | { link: \"management:cases\"; } | { link: \"management:triggersActionsConnectors\"; } | { link: \"management:jobsListLink\"; })[]; } | { id: \"kibana\"; title: string; renderAs: \"accordion\"; children: ({ link: \"management:dataViews\"; } | { link: \"management:objects\"; } | { link: \"management:tags\"; } | { link: \"management:spaces\"; } | { link: \"management:settings\"; })[]; })[]; })[]" ], "path": "packages/default-nav/management/default_navigation.ts", "deprecated": false, diff --git a/api_docs/kbn_default_nav_management.mdx b/api_docs/kbn_default_nav_management.mdx index 6e4d0aaebd253b..fb40b5f0a267e8 100644 --- a/api_docs/kbn_default_nav_management.mdx +++ b/api_docs/kbn_default_nav_management.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-default-nav-management title: "@kbn/default-nav-management" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/default-nav-management plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/default-nav-management'] --- import kbnDefaultNavManagementObj from './kbn_default_nav_management.devdocs.json'; @@ -21,7 +21,7 @@ Contact [@elastic/platform-deployment-management](https://github.com/orgs/elasti | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 7 | 0 | 7 | 0 | +| 8 | 0 | 8 | 0 | ## Common diff --git a/api_docs/kbn_default_nav_ml.devdocs.json b/api_docs/kbn_default_nav_ml.devdocs.json index 1f8c6a7e60e647..23e2c4b0bf6b99 100644 --- a/api_docs/kbn_default_nav_ml.devdocs.json +++ b/api_docs/kbn_default_nav_ml.devdocs.json @@ -172,7 +172,7 @@ "label": "children", "description": [], "signature": [ - "({ link: \"ml:overview\"; } | { link: \"ml:notifications\"; } | { title: string; id: \"anomaly_detection\"; children: ({ title: string; link: \"ml:anomalyDetection\"; } | { link: \"ml:anomalyExplorer\"; } | { link: \"ml:singleMetricViewer\"; } | { link: \"ml:settings\"; })[]; } | { id: \"data_frame_analytics\"; title: string; children: ({ title: string; link: \"ml:dataFrameAnalytics\"; } | { link: \"ml:resultExplorer\"; } | { link: \"ml:analyticsMap\"; })[]; } | { id: \"model_management\"; title: string; children: ({ link: \"ml:nodesOverview\"; } | { link: \"ml:nodes\"; })[]; } | { id: \"data_visualizer\"; title: string; children: ({ title: string; link: \"ml:fileUpload\"; } | { title: string; link: \"ml:indexDataVisualizer\"; } | { title: string; link: \"ml:dataDrift\"; })[]; } | { id: \"aiops_labs\"; title: string; children: ({ link: \"ml:logRateAnalysis\"; } | { link: \"ml:logPatternAnalysis\"; } | { link: \"ml:changePointDetections\"; })[]; })[]" + "({ link: \"ml:overview\"; } | { link: \"ml:notifications\"; } | { title: string; id: \"anomaly_detection\"; renderAs: \"accordion\"; children: ({ title: string; link: \"ml:anomalyDetection\"; } | { link: \"ml:anomalyExplorer\"; } | { link: \"ml:singleMetricViewer\"; } | { link: \"ml:settings\"; })[]; } | { id: \"data_frame_analytics\"; title: string; renderAs: \"accordion\"; children: ({ title: string; link: \"ml:dataFrameAnalytics\"; } | { link: \"ml:resultExplorer\"; } | { link: \"ml:analyticsMap\"; })[]; } | { id: \"model_management\"; title: string; renderAs: \"accordion\"; children: ({ link: \"ml:nodesOverview\"; } | { link: \"ml:nodes\"; })[]; } | { id: \"data_visualizer\"; title: string; renderAs: \"accordion\"; children: ({ title: string; link: \"ml:fileUpload\"; } | { title: string; link: \"ml:indexDataVisualizer\"; } | { title: string; link: \"ml:dataDrift\"; })[]; } | { id: \"aiops_labs\"; title: string; renderAs: \"accordion\"; children: ({ link: \"ml:logRateAnalysis\"; } | { link: \"ml:logPatternAnalysis\"; } | { link: \"ml:changePointDetections\"; })[]; })[]" ], "path": "packages/default-nav/ml/default_navigation.ts", "deprecated": false, diff --git a/api_docs/kbn_default_nav_ml.mdx b/api_docs/kbn_default_nav_ml.mdx index 2622a57c696f1d..01aecbfbbb837f 100644 --- a/api_docs/kbn_default_nav_ml.mdx +++ b/api_docs/kbn_default_nav_ml.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-default-nav-ml title: "@kbn/default-nav-ml" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/default-nav-ml plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/default-nav-ml'] --- import kbnDefaultNavMlObj from './kbn_default_nav_ml.devdocs.json'; diff --git a/api_docs/kbn_dev_cli_errors.mdx b/api_docs/kbn_dev_cli_errors.mdx index c3bd5597bf04b6..14518d0704017e 100644 --- a/api_docs/kbn_dev_cli_errors.mdx +++ b/api_docs/kbn_dev_cli_errors.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-dev-cli-errors title: "@kbn/dev-cli-errors" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/dev-cli-errors plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/dev-cli-errors'] --- import kbnDevCliErrorsObj from './kbn_dev_cli_errors.devdocs.json'; diff --git a/api_docs/kbn_dev_cli_runner.mdx b/api_docs/kbn_dev_cli_runner.mdx index add49a6af71261..157ce1b510a6bb 100644 --- a/api_docs/kbn_dev_cli_runner.mdx +++ b/api_docs/kbn_dev_cli_runner.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-dev-cli-runner title: "@kbn/dev-cli-runner" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/dev-cli-runner plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/dev-cli-runner'] --- import kbnDevCliRunnerObj from './kbn_dev_cli_runner.devdocs.json'; diff --git a/api_docs/kbn_dev_proc_runner.mdx b/api_docs/kbn_dev_proc_runner.mdx index 005c0819fcaf29..4c7e353686fc46 100644 --- a/api_docs/kbn_dev_proc_runner.mdx +++ b/api_docs/kbn_dev_proc_runner.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-dev-proc-runner title: "@kbn/dev-proc-runner" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/dev-proc-runner plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/dev-proc-runner'] --- import kbnDevProcRunnerObj from './kbn_dev_proc_runner.devdocs.json'; diff --git a/api_docs/kbn_dev_utils.mdx b/api_docs/kbn_dev_utils.mdx index e36ee007b42038..7c52cd8f29783d 100644 --- a/api_docs/kbn_dev_utils.mdx +++ b/api_docs/kbn_dev_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-dev-utils title: "@kbn/dev-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/dev-utils plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/dev-utils'] --- import kbnDevUtilsObj from './kbn_dev_utils.devdocs.json'; diff --git a/api_docs/kbn_discover_utils.mdx b/api_docs/kbn_discover_utils.mdx index 3e796f22e2d071..c638f03f296ffb 100644 --- a/api_docs/kbn_discover_utils.mdx +++ b/api_docs/kbn_discover_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-discover-utils title: "@kbn/discover-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/discover-utils plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/discover-utils'] --- import kbnDiscoverUtilsObj from './kbn_discover_utils.devdocs.json'; diff --git a/api_docs/kbn_doc_links.mdx b/api_docs/kbn_doc_links.mdx index 94f567899359e0..408b206d22d08b 100644 --- a/api_docs/kbn_doc_links.mdx +++ b/api_docs/kbn_doc_links.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-doc-links title: "@kbn/doc-links" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/doc-links plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/doc-links'] --- import kbnDocLinksObj from './kbn_doc_links.devdocs.json'; diff --git a/api_docs/kbn_docs_utils.mdx b/api_docs/kbn_docs_utils.mdx index d4d84b3e32a5ea..d1f6559e70cea7 100644 --- a/api_docs/kbn_docs_utils.mdx +++ b/api_docs/kbn_docs_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-docs-utils title: "@kbn/docs-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/docs-utils plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/docs-utils'] --- import kbnDocsUtilsObj from './kbn_docs_utils.devdocs.json'; diff --git a/api_docs/kbn_dom_drag_drop.mdx b/api_docs/kbn_dom_drag_drop.mdx index 6f2eafd8d51cdf..fb8e30d4786ac5 100644 --- a/api_docs/kbn_dom_drag_drop.mdx +++ b/api_docs/kbn_dom_drag_drop.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-dom-drag-drop title: "@kbn/dom-drag-drop" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/dom-drag-drop plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/dom-drag-drop'] --- import kbnDomDragDropObj from './kbn_dom_drag_drop.devdocs.json'; diff --git a/api_docs/kbn_ebt_tools.mdx b/api_docs/kbn_ebt_tools.mdx index 8bd69b19f5c94e..a132d36a4c3905 100644 --- a/api_docs/kbn_ebt_tools.mdx +++ b/api_docs/kbn_ebt_tools.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ebt-tools title: "@kbn/ebt-tools" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ebt-tools plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ebt-tools'] --- import kbnEbtToolsObj from './kbn_ebt_tools.devdocs.json'; diff --git a/api_docs/kbn_ecs.mdx b/api_docs/kbn_ecs.mdx index c1f4403e933d7d..76fda866e30bfe 100644 --- a/api_docs/kbn_ecs.mdx +++ b/api_docs/kbn_ecs.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ecs title: "@kbn/ecs" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ecs plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ecs'] --- import kbnEcsObj from './kbn_ecs.devdocs.json'; diff --git a/api_docs/kbn_ecs_data_quality_dashboard.mdx b/api_docs/kbn_ecs_data_quality_dashboard.mdx index 66e960b6840b12..4849372892e9e0 100644 --- a/api_docs/kbn_ecs_data_quality_dashboard.mdx +++ b/api_docs/kbn_ecs_data_quality_dashboard.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ecs-data-quality-dashboard title: "@kbn/ecs-data-quality-dashboard" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ecs-data-quality-dashboard plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ecs-data-quality-dashboard'] --- import kbnEcsDataQualityDashboardObj from './kbn_ecs_data_quality_dashboard.devdocs.json'; diff --git a/api_docs/kbn_elastic_assistant.devdocs.json b/api_docs/kbn_elastic_assistant.devdocs.json index ba744cf57e0c13..f97b2b7e4528e6 100644 --- a/api_docs/kbn_elastic_assistant.devdocs.json +++ b/api_docs/kbn_elastic_assistant.devdocs.json @@ -652,7 +652,7 @@ "label": "type", "description": [], "signature": [ - "\"eql\" | \"kql\" | \"dsl\" | \"json\" | \"no-type\"" + "\"eql\" | \"sql\" | \"kql\" | \"dsl\" | \"json\" | \"esql\" | \"no-type\"" ], "path": "x-pack/packages/kbn-elastic-assistant/impl/assistant/use_conversation/helpers.ts", "deprecated": false, @@ -1346,7 +1346,7 @@ "label": "QueryType", "description": [], "signature": [ - "\"eql\" | \"kql\" | \"dsl\" | \"json\" | \"no-type\"" + "\"eql\" | \"sql\" | \"kql\" | \"dsl\" | \"json\" | \"esql\" | \"no-type\"" ], "path": "x-pack/packages/kbn-elastic-assistant/impl/assistant/use_conversation/helpers.ts", "deprecated": false, diff --git a/api_docs/kbn_elastic_assistant.mdx b/api_docs/kbn_elastic_assistant.mdx index 8872332e0b8406..e9a02514eb466f 100644 --- a/api_docs/kbn_elastic_assistant.mdx +++ b/api_docs/kbn_elastic_assistant.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-elastic-assistant title: "@kbn/elastic-assistant" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/elastic-assistant plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/elastic-assistant'] --- import kbnElasticAssistantObj from './kbn_elastic_assistant.devdocs.json'; diff --git a/api_docs/kbn_es.mdx b/api_docs/kbn_es.mdx index 362d9d16b558bc..376d10bda0bc7b 100644 --- a/api_docs/kbn_es.mdx +++ b/api_docs/kbn_es.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-es title: "@kbn/es" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/es plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/es'] --- import kbnEsObj from './kbn_es.devdocs.json'; diff --git a/api_docs/kbn_es_archiver.mdx b/api_docs/kbn_es_archiver.mdx index de0eb7bd89a3f1..c2fba0d5411549 100644 --- a/api_docs/kbn_es_archiver.mdx +++ b/api_docs/kbn_es_archiver.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-es-archiver title: "@kbn/es-archiver" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/es-archiver plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/es-archiver'] --- import kbnEsArchiverObj from './kbn_es_archiver.devdocs.json'; diff --git a/api_docs/kbn_es_errors.mdx b/api_docs/kbn_es_errors.mdx index 67b30276e181c3..e39256e06375c6 100644 --- a/api_docs/kbn_es_errors.mdx +++ b/api_docs/kbn_es_errors.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-es-errors title: "@kbn/es-errors" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/es-errors plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/es-errors'] --- import kbnEsErrorsObj from './kbn_es_errors.devdocs.json'; diff --git a/api_docs/kbn_es_query.mdx b/api_docs/kbn_es_query.mdx index 8754257f9a211d..34e49fa7b65d42 100644 --- a/api_docs/kbn_es_query.mdx +++ b/api_docs/kbn_es_query.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-es-query title: "@kbn/es-query" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/es-query plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/es-query'] --- import kbnEsQueryObj from './kbn_es_query.devdocs.json'; diff --git a/api_docs/kbn_es_types.mdx b/api_docs/kbn_es_types.mdx index 7d4f982e237e58..931d256d0d9a3b 100644 --- a/api_docs/kbn_es_types.mdx +++ b/api_docs/kbn_es_types.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-es-types title: "@kbn/es-types" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/es-types plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/es-types'] --- import kbnEsTypesObj from './kbn_es_types.devdocs.json'; diff --git a/api_docs/kbn_eslint_plugin_imports.mdx b/api_docs/kbn_eslint_plugin_imports.mdx index 6c50e8fafe5833..635bf95e929a23 100644 --- a/api_docs/kbn_eslint_plugin_imports.mdx +++ b/api_docs/kbn_eslint_plugin_imports.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-eslint-plugin-imports title: "@kbn/eslint-plugin-imports" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/eslint-plugin-imports plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/eslint-plugin-imports'] --- import kbnEslintPluginImportsObj from './kbn_eslint_plugin_imports.devdocs.json'; diff --git a/api_docs/kbn_event_annotation_common.mdx b/api_docs/kbn_event_annotation_common.mdx index 271aea75514263..1963cad183fcc7 100644 --- a/api_docs/kbn_event_annotation_common.mdx +++ b/api_docs/kbn_event_annotation_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-event-annotation-common title: "@kbn/event-annotation-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/event-annotation-common plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/event-annotation-common'] --- import kbnEventAnnotationCommonObj from './kbn_event_annotation_common.devdocs.json'; diff --git a/api_docs/kbn_event_annotation_components.mdx b/api_docs/kbn_event_annotation_components.mdx index e4cef39e70d269..98b0f1ef6b6e09 100644 --- a/api_docs/kbn_event_annotation_components.mdx +++ b/api_docs/kbn_event_annotation_components.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-event-annotation-components title: "@kbn/event-annotation-components" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/event-annotation-components plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/event-annotation-components'] --- import kbnEventAnnotationComponentsObj from './kbn_event_annotation_components.devdocs.json'; diff --git a/api_docs/kbn_expandable_flyout.mdx b/api_docs/kbn_expandable_flyout.mdx index ef6a674a7dd139..7f2b26038e706a 100644 --- a/api_docs/kbn_expandable_flyout.mdx +++ b/api_docs/kbn_expandable_flyout.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-expandable-flyout title: "@kbn/expandable-flyout" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/expandable-flyout plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/expandable-flyout'] --- import kbnExpandableFlyoutObj from './kbn_expandable_flyout.devdocs.json'; diff --git a/api_docs/kbn_field_types.mdx b/api_docs/kbn_field_types.mdx index fd7b66e802895b..c0a63ab9f633b8 100644 --- a/api_docs/kbn_field_types.mdx +++ b/api_docs/kbn_field_types.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-field-types title: "@kbn/field-types" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/field-types plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/field-types'] --- import kbnFieldTypesObj from './kbn_field_types.devdocs.json'; diff --git a/api_docs/kbn_field_utils.mdx b/api_docs/kbn_field_utils.mdx index db6f941d697c02..4b14537b5a1a2d 100644 --- a/api_docs/kbn_field_utils.mdx +++ b/api_docs/kbn_field_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-field-utils title: "@kbn/field-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/field-utils plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/field-utils'] --- import kbnFieldUtilsObj from './kbn_field_utils.devdocs.json'; diff --git a/api_docs/kbn_find_used_node_modules.mdx b/api_docs/kbn_find_used_node_modules.mdx index 867ab4255e07fb..19588a59cfbb2d 100644 --- a/api_docs/kbn_find_used_node_modules.mdx +++ b/api_docs/kbn_find_used_node_modules.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-find-used-node-modules title: "@kbn/find-used-node-modules" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/find-used-node-modules plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/find-used-node-modules'] --- import kbnFindUsedNodeModulesObj from './kbn_find_used_node_modules.devdocs.json'; diff --git a/api_docs/kbn_ftr_common_functional_services.mdx b/api_docs/kbn_ftr_common_functional_services.mdx index 5816a7c511da3f..1a50bfa395e985 100644 --- a/api_docs/kbn_ftr_common_functional_services.mdx +++ b/api_docs/kbn_ftr_common_functional_services.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ftr-common-functional-services title: "@kbn/ftr-common-functional-services" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ftr-common-functional-services plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ftr-common-functional-services'] --- import kbnFtrCommonFunctionalServicesObj from './kbn_ftr_common_functional_services.devdocs.json'; diff --git a/api_docs/kbn_generate.mdx b/api_docs/kbn_generate.mdx index a7cda597e996ba..c9bd69a1515652 100644 --- a/api_docs/kbn_generate.mdx +++ b/api_docs/kbn_generate.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-generate title: "@kbn/generate" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/generate plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/generate'] --- import kbnGenerateObj from './kbn_generate.devdocs.json'; diff --git a/api_docs/kbn_generate_console_definitions.mdx b/api_docs/kbn_generate_console_definitions.mdx index d1ae1cc6cc4065..ab0dca8d73c691 100644 --- a/api_docs/kbn_generate_console_definitions.mdx +++ b/api_docs/kbn_generate_console_definitions.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-generate-console-definitions title: "@kbn/generate-console-definitions" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/generate-console-definitions plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/generate-console-definitions'] --- import kbnGenerateConsoleDefinitionsObj from './kbn_generate_console_definitions.devdocs.json'; diff --git a/api_docs/kbn_generate_csv.mdx b/api_docs/kbn_generate_csv.mdx index f139dafb7d8017..b16b92601a6d29 100644 --- a/api_docs/kbn_generate_csv.mdx +++ b/api_docs/kbn_generate_csv.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-generate-csv title: "@kbn/generate-csv" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/generate-csv plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/generate-csv'] --- import kbnGenerateCsvObj from './kbn_generate_csv.devdocs.json'; diff --git a/api_docs/kbn_generate_csv_types.mdx b/api_docs/kbn_generate_csv_types.mdx index 9f3f0ad85662e0..d33378e3f9909d 100644 --- a/api_docs/kbn_generate_csv_types.mdx +++ b/api_docs/kbn_generate_csv_types.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-generate-csv-types title: "@kbn/generate-csv-types" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/generate-csv-types plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/generate-csv-types'] --- import kbnGenerateCsvTypesObj from './kbn_generate_csv_types.devdocs.json'; diff --git a/api_docs/kbn_guided_onboarding.mdx b/api_docs/kbn_guided_onboarding.mdx index c02cbde1fa4921..946a17a939335d 100644 --- a/api_docs/kbn_guided_onboarding.mdx +++ b/api_docs/kbn_guided_onboarding.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-guided-onboarding title: "@kbn/guided-onboarding" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/guided-onboarding plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/guided-onboarding'] --- import kbnGuidedOnboardingObj from './kbn_guided_onboarding.devdocs.json'; diff --git a/api_docs/kbn_handlebars.mdx b/api_docs/kbn_handlebars.mdx index bababb84525d02..6aaaa3b7200671 100644 --- a/api_docs/kbn_handlebars.mdx +++ b/api_docs/kbn_handlebars.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-handlebars title: "@kbn/handlebars" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/handlebars plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/handlebars'] --- import kbnHandlebarsObj from './kbn_handlebars.devdocs.json'; diff --git a/api_docs/kbn_hapi_mocks.mdx b/api_docs/kbn_hapi_mocks.mdx index 4edf26f22ec744..fb3a438e512110 100644 --- a/api_docs/kbn_hapi_mocks.mdx +++ b/api_docs/kbn_hapi_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-hapi-mocks title: "@kbn/hapi-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/hapi-mocks plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/hapi-mocks'] --- import kbnHapiMocksObj from './kbn_hapi_mocks.devdocs.json'; diff --git a/api_docs/kbn_health_gateway_server.mdx b/api_docs/kbn_health_gateway_server.mdx index 3d260295bdf729..b537daa9c6480b 100644 --- a/api_docs/kbn_health_gateway_server.mdx +++ b/api_docs/kbn_health_gateway_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-health-gateway-server title: "@kbn/health-gateway-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/health-gateway-server plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/health-gateway-server'] --- import kbnHealthGatewayServerObj from './kbn_health_gateway_server.devdocs.json'; diff --git a/api_docs/kbn_home_sample_data_card.mdx b/api_docs/kbn_home_sample_data_card.mdx index ec978e21934439..a226c5ad8613a7 100644 --- a/api_docs/kbn_home_sample_data_card.mdx +++ b/api_docs/kbn_home_sample_data_card.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-home-sample-data-card title: "@kbn/home-sample-data-card" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/home-sample-data-card plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/home-sample-data-card'] --- import kbnHomeSampleDataCardObj from './kbn_home_sample_data_card.devdocs.json'; diff --git a/api_docs/kbn_home_sample_data_tab.mdx b/api_docs/kbn_home_sample_data_tab.mdx index 9c96dde90bd44c..8034e4bce0ff30 100644 --- a/api_docs/kbn_home_sample_data_tab.mdx +++ b/api_docs/kbn_home_sample_data_tab.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-home-sample-data-tab title: "@kbn/home-sample-data-tab" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/home-sample-data-tab plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/home-sample-data-tab'] --- import kbnHomeSampleDataTabObj from './kbn_home_sample_data_tab.devdocs.json'; diff --git a/api_docs/kbn_i18n.mdx b/api_docs/kbn_i18n.mdx index 276f33377ca2f4..762c5ba73e0c54 100644 --- a/api_docs/kbn_i18n.mdx +++ b/api_docs/kbn_i18n.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-i18n title: "@kbn/i18n" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/i18n plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/i18n'] --- import kbnI18nObj from './kbn_i18n.devdocs.json'; diff --git a/api_docs/kbn_i18n_react.mdx b/api_docs/kbn_i18n_react.mdx index 6f05a957b4b5c2..7fd9fa9e2c5c63 100644 --- a/api_docs/kbn_i18n_react.mdx +++ b/api_docs/kbn_i18n_react.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-i18n-react title: "@kbn/i18n-react" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/i18n-react plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/i18n-react'] --- import kbnI18nReactObj from './kbn_i18n_react.devdocs.json'; diff --git a/api_docs/kbn_import_resolver.mdx b/api_docs/kbn_import_resolver.mdx index d5f56e577ea839..f6f1d37f84b686 100644 --- a/api_docs/kbn_import_resolver.mdx +++ b/api_docs/kbn_import_resolver.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-import-resolver title: "@kbn/import-resolver" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/import-resolver plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/import-resolver'] --- import kbnImportResolverObj from './kbn_import_resolver.devdocs.json'; diff --git a/api_docs/kbn_infra_forge.mdx b/api_docs/kbn_infra_forge.mdx index 72fb6163ddf2d9..0c63690c5eacdf 100644 --- a/api_docs/kbn_infra_forge.mdx +++ b/api_docs/kbn_infra_forge.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-infra-forge title: "@kbn/infra-forge" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/infra-forge plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/infra-forge'] --- import kbnInfraForgeObj from './kbn_infra_forge.devdocs.json'; diff --git a/api_docs/kbn_interpreter.mdx b/api_docs/kbn_interpreter.mdx index addbedc1bb5ce1..d976076ccb91f3 100644 --- a/api_docs/kbn_interpreter.mdx +++ b/api_docs/kbn_interpreter.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-interpreter title: "@kbn/interpreter" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/interpreter plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/interpreter'] --- import kbnInterpreterObj from './kbn_interpreter.devdocs.json'; diff --git a/api_docs/kbn_io_ts_utils.mdx b/api_docs/kbn_io_ts_utils.mdx index 859e9284e67613..42cedefdb8c721 100644 --- a/api_docs/kbn_io_ts_utils.mdx +++ b/api_docs/kbn_io_ts_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-io-ts-utils title: "@kbn/io-ts-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/io-ts-utils plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/io-ts-utils'] --- import kbnIoTsUtilsObj from './kbn_io_ts_utils.devdocs.json'; diff --git a/api_docs/kbn_jest_serializers.mdx b/api_docs/kbn_jest_serializers.mdx index 3d01d9191f365a..ad2a6ed93a7a9f 100644 --- a/api_docs/kbn_jest_serializers.mdx +++ b/api_docs/kbn_jest_serializers.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-jest-serializers title: "@kbn/jest-serializers" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/jest-serializers plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/jest-serializers'] --- import kbnJestSerializersObj from './kbn_jest_serializers.devdocs.json'; diff --git a/api_docs/kbn_journeys.mdx b/api_docs/kbn_journeys.mdx index f08d1ddd8e5a43..358669285284c7 100644 --- a/api_docs/kbn_journeys.mdx +++ b/api_docs/kbn_journeys.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-journeys title: "@kbn/journeys" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/journeys plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/journeys'] --- import kbnJourneysObj from './kbn_journeys.devdocs.json'; diff --git a/api_docs/kbn_json_ast.mdx b/api_docs/kbn_json_ast.mdx index 4ed00064bf7c1d..b6e947e1f7824c 100644 --- a/api_docs/kbn_json_ast.mdx +++ b/api_docs/kbn_json_ast.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-json-ast title: "@kbn/json-ast" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/json-ast plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/json-ast'] --- import kbnJsonAstObj from './kbn_json_ast.devdocs.json'; diff --git a/api_docs/kbn_kibana_manifest_schema.mdx b/api_docs/kbn_kibana_manifest_schema.mdx index fb0c40d7c6c014..025ed26cfa00d9 100644 --- a/api_docs/kbn_kibana_manifest_schema.mdx +++ b/api_docs/kbn_kibana_manifest_schema.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-kibana-manifest-schema title: "@kbn/kibana-manifest-schema" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/kibana-manifest-schema plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/kibana-manifest-schema'] --- import kbnKibanaManifestSchemaObj from './kbn_kibana_manifest_schema.devdocs.json'; diff --git a/api_docs/kbn_language_documentation_popover.mdx b/api_docs/kbn_language_documentation_popover.mdx index 2c34d5f3a7df99..87013a79d3b1e1 100644 --- a/api_docs/kbn_language_documentation_popover.mdx +++ b/api_docs/kbn_language_documentation_popover.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-language-documentation-popover title: "@kbn/language-documentation-popover" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/language-documentation-popover plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/language-documentation-popover'] --- import kbnLanguageDocumentationPopoverObj from './kbn_language_documentation_popover.devdocs.json'; diff --git a/api_docs/kbn_lens_embeddable_utils.mdx b/api_docs/kbn_lens_embeddable_utils.mdx index 91b8f6b8a92cf3..18c1bb9f88de9f 100644 --- a/api_docs/kbn_lens_embeddable_utils.mdx +++ b/api_docs/kbn_lens_embeddable_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-lens-embeddable-utils title: "@kbn/lens-embeddable-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/lens-embeddable-utils plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/lens-embeddable-utils'] --- import kbnLensEmbeddableUtilsObj from './kbn_lens_embeddable_utils.devdocs.json'; diff --git a/api_docs/kbn_logging.mdx b/api_docs/kbn_logging.mdx index e824894c4d159f..087a7dee261013 100644 --- a/api_docs/kbn_logging.mdx +++ b/api_docs/kbn_logging.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-logging title: "@kbn/logging" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/logging plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/logging'] --- import kbnLoggingObj from './kbn_logging.devdocs.json'; diff --git a/api_docs/kbn_logging_mocks.mdx b/api_docs/kbn_logging_mocks.mdx index c2432f14f2c058..9f2078c90e13ec 100644 --- a/api_docs/kbn_logging_mocks.mdx +++ b/api_docs/kbn_logging_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-logging-mocks title: "@kbn/logging-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/logging-mocks plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/logging-mocks'] --- import kbnLoggingMocksObj from './kbn_logging_mocks.devdocs.json'; diff --git a/api_docs/kbn_managed_vscode_config.mdx b/api_docs/kbn_managed_vscode_config.mdx index 4d79a34a7aca00..9cb27040e261b7 100644 --- a/api_docs/kbn_managed_vscode_config.mdx +++ b/api_docs/kbn_managed_vscode_config.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-managed-vscode-config title: "@kbn/managed-vscode-config" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/managed-vscode-config plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/managed-vscode-config'] --- import kbnManagedVscodeConfigObj from './kbn_managed_vscode_config.devdocs.json'; diff --git a/api_docs/kbn_management_cards_navigation.mdx b/api_docs/kbn_management_cards_navigation.mdx index 0455e1c6553ddf..d3c54671c8fa59 100644 --- a/api_docs/kbn_management_cards_navigation.mdx +++ b/api_docs/kbn_management_cards_navigation.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-management-cards-navigation title: "@kbn/management-cards-navigation" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/management-cards-navigation plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/management-cards-navigation'] --- import kbnManagementCardsNavigationObj from './kbn_management_cards_navigation.devdocs.json'; diff --git a/api_docs/kbn_management_settings_application.mdx b/api_docs/kbn_management_settings_application.mdx index 860ab4fbbb613f..5f62929cf9c1d7 100644 --- a/api_docs/kbn_management_settings_application.mdx +++ b/api_docs/kbn_management_settings_application.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-management-settings-application title: "@kbn/management-settings-application" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/management-settings-application plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/management-settings-application'] --- import kbnManagementSettingsApplicationObj from './kbn_management_settings_application.devdocs.json'; diff --git a/api_docs/kbn_management_settings_components_field_category.mdx b/api_docs/kbn_management_settings_components_field_category.mdx index 213477b0a254e7..2013f3bb2549c3 100644 --- a/api_docs/kbn_management_settings_components_field_category.mdx +++ b/api_docs/kbn_management_settings_components_field_category.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-management-settings-components-field-category title: "@kbn/management-settings-components-field-category" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/management-settings-components-field-category plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/management-settings-components-field-category'] --- import kbnManagementSettingsComponentsFieldCategoryObj from './kbn_management_settings_components_field_category.devdocs.json'; diff --git a/api_docs/kbn_management_settings_components_field_input.mdx b/api_docs/kbn_management_settings_components_field_input.mdx index 88f7021528a3ba..ba7542624004f6 100644 --- a/api_docs/kbn_management_settings_components_field_input.mdx +++ b/api_docs/kbn_management_settings_components_field_input.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-management-settings-components-field-input title: "@kbn/management-settings-components-field-input" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/management-settings-components-field-input plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/management-settings-components-field-input'] --- import kbnManagementSettingsComponentsFieldInputObj from './kbn_management_settings_components_field_input.devdocs.json'; diff --git a/api_docs/kbn_management_settings_components_field_row.mdx b/api_docs/kbn_management_settings_components_field_row.mdx index 058b90ffe3231a..cd3fa69f20d54d 100644 --- a/api_docs/kbn_management_settings_components_field_row.mdx +++ b/api_docs/kbn_management_settings_components_field_row.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-management-settings-components-field-row title: "@kbn/management-settings-components-field-row" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/management-settings-components-field-row plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/management-settings-components-field-row'] --- import kbnManagementSettingsComponentsFieldRowObj from './kbn_management_settings_components_field_row.devdocs.json'; diff --git a/api_docs/kbn_management_settings_components_form.mdx b/api_docs/kbn_management_settings_components_form.mdx index cd869184473084..cf9998cbbca9d5 100644 --- a/api_docs/kbn_management_settings_components_form.mdx +++ b/api_docs/kbn_management_settings_components_form.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-management-settings-components-form title: "@kbn/management-settings-components-form" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/management-settings-components-form plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/management-settings-components-form'] --- import kbnManagementSettingsComponentsFormObj from './kbn_management_settings_components_form.devdocs.json'; diff --git a/api_docs/kbn_management_settings_field_definition.mdx b/api_docs/kbn_management_settings_field_definition.mdx index 1a2208bd292009..3097ecb5db16cf 100644 --- a/api_docs/kbn_management_settings_field_definition.mdx +++ b/api_docs/kbn_management_settings_field_definition.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-management-settings-field-definition title: "@kbn/management-settings-field-definition" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/management-settings-field-definition plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/management-settings-field-definition'] --- import kbnManagementSettingsFieldDefinitionObj from './kbn_management_settings_field_definition.devdocs.json'; diff --git a/api_docs/kbn_management_settings_ids.mdx b/api_docs/kbn_management_settings_ids.mdx index e29b3745ebf062..0ef02a52e4ce11 100644 --- a/api_docs/kbn_management_settings_ids.mdx +++ b/api_docs/kbn_management_settings_ids.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-management-settings-ids title: "@kbn/management-settings-ids" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/management-settings-ids plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/management-settings-ids'] --- import kbnManagementSettingsIdsObj from './kbn_management_settings_ids.devdocs.json'; diff --git a/api_docs/kbn_management_settings_section_registry.mdx b/api_docs/kbn_management_settings_section_registry.mdx index 064fc9b94f8acd..70e843578e80f8 100644 --- a/api_docs/kbn_management_settings_section_registry.mdx +++ b/api_docs/kbn_management_settings_section_registry.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-management-settings-section-registry title: "@kbn/management-settings-section-registry" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/management-settings-section-registry plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/management-settings-section-registry'] --- import kbnManagementSettingsSectionRegistryObj from './kbn_management_settings_section_registry.devdocs.json'; diff --git a/api_docs/kbn_management_settings_types.mdx b/api_docs/kbn_management_settings_types.mdx index 60a01f507200ad..5d8c195a19feaa 100644 --- a/api_docs/kbn_management_settings_types.mdx +++ b/api_docs/kbn_management_settings_types.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-management-settings-types title: "@kbn/management-settings-types" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/management-settings-types plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/management-settings-types'] --- import kbnManagementSettingsTypesObj from './kbn_management_settings_types.devdocs.json'; diff --git a/api_docs/kbn_management_settings_utilities.mdx b/api_docs/kbn_management_settings_utilities.mdx index be5721a9c47db0..ddb18b9bd627a4 100644 --- a/api_docs/kbn_management_settings_utilities.mdx +++ b/api_docs/kbn_management_settings_utilities.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-management-settings-utilities title: "@kbn/management-settings-utilities" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/management-settings-utilities plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/management-settings-utilities'] --- import kbnManagementSettingsUtilitiesObj from './kbn_management_settings_utilities.devdocs.json'; diff --git a/api_docs/kbn_management_storybook_config.mdx b/api_docs/kbn_management_storybook_config.mdx index 9fddd6fd4da2fb..c2cdc9511b81de 100644 --- a/api_docs/kbn_management_storybook_config.mdx +++ b/api_docs/kbn_management_storybook_config.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-management-storybook-config title: "@kbn/management-storybook-config" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/management-storybook-config plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/management-storybook-config'] --- import kbnManagementStorybookConfigObj from './kbn_management_storybook_config.devdocs.json'; diff --git a/api_docs/kbn_mapbox_gl.mdx b/api_docs/kbn_mapbox_gl.mdx index 661e71ffd3b58f..bd44bc1382ccf2 100644 --- a/api_docs/kbn_mapbox_gl.mdx +++ b/api_docs/kbn_mapbox_gl.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-mapbox-gl title: "@kbn/mapbox-gl" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/mapbox-gl plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/mapbox-gl'] --- import kbnMapboxGlObj from './kbn_mapbox_gl.devdocs.json'; diff --git a/api_docs/kbn_maps_vector_tile_utils.mdx b/api_docs/kbn_maps_vector_tile_utils.mdx index 5744afd8c5bea0..58c0d02d7623ec 100644 --- a/api_docs/kbn_maps_vector_tile_utils.mdx +++ b/api_docs/kbn_maps_vector_tile_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-maps-vector-tile-utils title: "@kbn/maps-vector-tile-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/maps-vector-tile-utils plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/maps-vector-tile-utils'] --- import kbnMapsVectorTileUtilsObj from './kbn_maps_vector_tile_utils.devdocs.json'; diff --git a/api_docs/kbn_ml_agg_utils.mdx b/api_docs/kbn_ml_agg_utils.mdx index fea05ec4555150..14ac458b660a17 100644 --- a/api_docs/kbn_ml_agg_utils.mdx +++ b/api_docs/kbn_ml_agg_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-agg-utils title: "@kbn/ml-agg-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-agg-utils plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-agg-utils'] --- import kbnMlAggUtilsObj from './kbn_ml_agg_utils.devdocs.json'; diff --git a/api_docs/kbn_ml_anomaly_utils.mdx b/api_docs/kbn_ml_anomaly_utils.mdx index 93b220b8db6527..bd03aa75148cfd 100644 --- a/api_docs/kbn_ml_anomaly_utils.mdx +++ b/api_docs/kbn_ml_anomaly_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-anomaly-utils title: "@kbn/ml-anomaly-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-anomaly-utils plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-anomaly-utils'] --- import kbnMlAnomalyUtilsObj from './kbn_ml_anomaly_utils.devdocs.json'; diff --git a/api_docs/kbn_ml_category_validator.mdx b/api_docs/kbn_ml_category_validator.mdx index 45cd5f4962a290..d78dd07877529d 100644 --- a/api_docs/kbn_ml_category_validator.mdx +++ b/api_docs/kbn_ml_category_validator.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-category-validator title: "@kbn/ml-category-validator" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-category-validator plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-category-validator'] --- import kbnMlCategoryValidatorObj from './kbn_ml_category_validator.devdocs.json'; diff --git a/api_docs/kbn_ml_chi2test.mdx b/api_docs/kbn_ml_chi2test.mdx index 9d6afd6a695bd4..2f39e4f34790e8 100644 --- a/api_docs/kbn_ml_chi2test.mdx +++ b/api_docs/kbn_ml_chi2test.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-chi2test title: "@kbn/ml-chi2test" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-chi2test plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-chi2test'] --- import kbnMlChi2testObj from './kbn_ml_chi2test.devdocs.json'; diff --git a/api_docs/kbn_ml_data_frame_analytics_utils.mdx b/api_docs/kbn_ml_data_frame_analytics_utils.mdx index 615015890cb19e..adc2e8b946a98d 100644 --- a/api_docs/kbn_ml_data_frame_analytics_utils.mdx +++ b/api_docs/kbn_ml_data_frame_analytics_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-data-frame-analytics-utils title: "@kbn/ml-data-frame-analytics-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-data-frame-analytics-utils plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-data-frame-analytics-utils'] --- import kbnMlDataFrameAnalyticsUtilsObj from './kbn_ml_data_frame_analytics_utils.devdocs.json'; diff --git a/api_docs/kbn_ml_data_grid.mdx b/api_docs/kbn_ml_data_grid.mdx index c36280efbc0795..9b4736144040d5 100644 --- a/api_docs/kbn_ml_data_grid.mdx +++ b/api_docs/kbn_ml_data_grid.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-data-grid title: "@kbn/ml-data-grid" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-data-grid plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-data-grid'] --- import kbnMlDataGridObj from './kbn_ml_data_grid.devdocs.json'; diff --git a/api_docs/kbn_ml_date_picker.mdx b/api_docs/kbn_ml_date_picker.mdx index 4b020e0ef2e863..4965525a36897b 100644 --- a/api_docs/kbn_ml_date_picker.mdx +++ b/api_docs/kbn_ml_date_picker.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-date-picker title: "@kbn/ml-date-picker" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-date-picker plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-date-picker'] --- import kbnMlDatePickerObj from './kbn_ml_date_picker.devdocs.json'; diff --git a/api_docs/kbn_ml_date_utils.mdx b/api_docs/kbn_ml_date_utils.mdx index 4d71e044b1b49b..e648bf35ccdf3a 100644 --- a/api_docs/kbn_ml_date_utils.mdx +++ b/api_docs/kbn_ml_date_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-date-utils title: "@kbn/ml-date-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-date-utils plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-date-utils'] --- import kbnMlDateUtilsObj from './kbn_ml_date_utils.devdocs.json'; diff --git a/api_docs/kbn_ml_error_utils.mdx b/api_docs/kbn_ml_error_utils.mdx index 9909a6226f17b5..f2642f44c6006f 100644 --- a/api_docs/kbn_ml_error_utils.mdx +++ b/api_docs/kbn_ml_error_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-error-utils title: "@kbn/ml-error-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-error-utils plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-error-utils'] --- import kbnMlErrorUtilsObj from './kbn_ml_error_utils.devdocs.json'; diff --git a/api_docs/kbn_ml_in_memory_table.mdx b/api_docs/kbn_ml_in_memory_table.mdx index 51bf1b188cda40..39439db07f0a6c 100644 --- a/api_docs/kbn_ml_in_memory_table.mdx +++ b/api_docs/kbn_ml_in_memory_table.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-in-memory-table title: "@kbn/ml-in-memory-table" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-in-memory-table plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-in-memory-table'] --- import kbnMlInMemoryTableObj from './kbn_ml_in_memory_table.devdocs.json'; diff --git a/api_docs/kbn_ml_is_defined.mdx b/api_docs/kbn_ml_is_defined.mdx index 510cf0847ddd14..15b1c10e79bc27 100644 --- a/api_docs/kbn_ml_is_defined.mdx +++ b/api_docs/kbn_ml_is_defined.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-is-defined title: "@kbn/ml-is-defined" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-is-defined plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-is-defined'] --- import kbnMlIsDefinedObj from './kbn_ml_is_defined.devdocs.json'; diff --git a/api_docs/kbn_ml_is_populated_object.mdx b/api_docs/kbn_ml_is_populated_object.mdx index 2fe85c71429fe7..66285166332733 100644 --- a/api_docs/kbn_ml_is_populated_object.mdx +++ b/api_docs/kbn_ml_is_populated_object.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-is-populated-object title: "@kbn/ml-is-populated-object" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-is-populated-object plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-is-populated-object'] --- import kbnMlIsPopulatedObjectObj from './kbn_ml_is_populated_object.devdocs.json'; diff --git a/api_docs/kbn_ml_kibana_theme.mdx b/api_docs/kbn_ml_kibana_theme.mdx index 2f9cebd096a520..7749e0d88ae5c7 100644 --- a/api_docs/kbn_ml_kibana_theme.mdx +++ b/api_docs/kbn_ml_kibana_theme.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-kibana-theme title: "@kbn/ml-kibana-theme" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-kibana-theme plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-kibana-theme'] --- import kbnMlKibanaThemeObj from './kbn_ml_kibana_theme.devdocs.json'; diff --git a/api_docs/kbn_ml_local_storage.mdx b/api_docs/kbn_ml_local_storage.mdx index 2409276b50872a..fa314d8eba0f28 100644 --- a/api_docs/kbn_ml_local_storage.mdx +++ b/api_docs/kbn_ml_local_storage.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-local-storage title: "@kbn/ml-local-storage" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-local-storage plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-local-storage'] --- import kbnMlLocalStorageObj from './kbn_ml_local_storage.devdocs.json'; diff --git a/api_docs/kbn_ml_nested_property.mdx b/api_docs/kbn_ml_nested_property.mdx index d6a88d02cff1dc..9175a4ab125bb8 100644 --- a/api_docs/kbn_ml_nested_property.mdx +++ b/api_docs/kbn_ml_nested_property.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-nested-property title: "@kbn/ml-nested-property" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-nested-property plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-nested-property'] --- import kbnMlNestedPropertyObj from './kbn_ml_nested_property.devdocs.json'; diff --git a/api_docs/kbn_ml_number_utils.mdx b/api_docs/kbn_ml_number_utils.mdx index 24f97ad2e5fd72..71ad25281dab75 100644 --- a/api_docs/kbn_ml_number_utils.mdx +++ b/api_docs/kbn_ml_number_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-number-utils title: "@kbn/ml-number-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-number-utils plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-number-utils'] --- import kbnMlNumberUtilsObj from './kbn_ml_number_utils.devdocs.json'; diff --git a/api_docs/kbn_ml_query_utils.mdx b/api_docs/kbn_ml_query_utils.mdx index 6d04a602208ac4..ad2fdb3f5421d0 100644 --- a/api_docs/kbn_ml_query_utils.mdx +++ b/api_docs/kbn_ml_query_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-query-utils title: "@kbn/ml-query-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-query-utils plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-query-utils'] --- import kbnMlQueryUtilsObj from './kbn_ml_query_utils.devdocs.json'; diff --git a/api_docs/kbn_ml_random_sampler_utils.mdx b/api_docs/kbn_ml_random_sampler_utils.mdx index 7dcee8fb197d3a..e4453f50c86212 100644 --- a/api_docs/kbn_ml_random_sampler_utils.mdx +++ b/api_docs/kbn_ml_random_sampler_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-random-sampler-utils title: "@kbn/ml-random-sampler-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-random-sampler-utils plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-random-sampler-utils'] --- import kbnMlRandomSamplerUtilsObj from './kbn_ml_random_sampler_utils.devdocs.json'; diff --git a/api_docs/kbn_ml_route_utils.mdx b/api_docs/kbn_ml_route_utils.mdx index ccfb2a63a1f62c..b7be5be20fedea 100644 --- a/api_docs/kbn_ml_route_utils.mdx +++ b/api_docs/kbn_ml_route_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-route-utils title: "@kbn/ml-route-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-route-utils plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-route-utils'] --- import kbnMlRouteUtilsObj from './kbn_ml_route_utils.devdocs.json'; diff --git a/api_docs/kbn_ml_runtime_field_utils.mdx b/api_docs/kbn_ml_runtime_field_utils.mdx index e56becb1450d08..04bfe46fa05e7b 100644 --- a/api_docs/kbn_ml_runtime_field_utils.mdx +++ b/api_docs/kbn_ml_runtime_field_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-runtime-field-utils title: "@kbn/ml-runtime-field-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-runtime-field-utils plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-runtime-field-utils'] --- import kbnMlRuntimeFieldUtilsObj from './kbn_ml_runtime_field_utils.devdocs.json'; diff --git a/api_docs/kbn_ml_string_hash.mdx b/api_docs/kbn_ml_string_hash.mdx index 84d3efc3c1a58d..5d9b799b44003e 100644 --- a/api_docs/kbn_ml_string_hash.mdx +++ b/api_docs/kbn_ml_string_hash.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-string-hash title: "@kbn/ml-string-hash" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-string-hash plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-string-hash'] --- import kbnMlStringHashObj from './kbn_ml_string_hash.devdocs.json'; diff --git a/api_docs/kbn_ml_trained_models_utils.mdx b/api_docs/kbn_ml_trained_models_utils.mdx index 994e8e53eec968..ff62b9960c5f3c 100644 --- a/api_docs/kbn_ml_trained_models_utils.mdx +++ b/api_docs/kbn_ml_trained_models_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-trained-models-utils title: "@kbn/ml-trained-models-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-trained-models-utils plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-trained-models-utils'] --- import kbnMlTrainedModelsUtilsObj from './kbn_ml_trained_models_utils.devdocs.json'; diff --git a/api_docs/kbn_ml_url_state.mdx b/api_docs/kbn_ml_url_state.mdx index b87d91b887d46e..7038cdc583cfad 100644 --- a/api_docs/kbn_ml_url_state.mdx +++ b/api_docs/kbn_ml_url_state.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-url-state title: "@kbn/ml-url-state" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-url-state plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-url-state'] --- import kbnMlUrlStateObj from './kbn_ml_url_state.devdocs.json'; diff --git a/api_docs/kbn_monaco.mdx b/api_docs/kbn_monaco.mdx index ec22cf1035fb8e..5c246deda30920 100644 --- a/api_docs/kbn_monaco.mdx +++ b/api_docs/kbn_monaco.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-monaco title: "@kbn/monaco" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/monaco plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/monaco'] --- import kbnMonacoObj from './kbn_monaco.devdocs.json'; diff --git a/api_docs/kbn_object_versioning.mdx b/api_docs/kbn_object_versioning.mdx index f2155fd991e29e..8bee3d557a7a08 100644 --- a/api_docs/kbn_object_versioning.mdx +++ b/api_docs/kbn_object_versioning.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-object-versioning title: "@kbn/object-versioning" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/object-versioning plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/object-versioning'] --- import kbnObjectVersioningObj from './kbn_object_versioning.devdocs.json'; diff --git a/api_docs/kbn_observability_alert_details.mdx b/api_docs/kbn_observability_alert_details.mdx index 757cf15cbb4be0..e1a2abad549a40 100644 --- a/api_docs/kbn_observability_alert_details.mdx +++ b/api_docs/kbn_observability_alert_details.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-observability-alert-details title: "@kbn/observability-alert-details" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/observability-alert-details plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/observability-alert-details'] --- import kbnObservabilityAlertDetailsObj from './kbn_observability_alert_details.devdocs.json'; diff --git a/api_docs/kbn_observability_alerting_test_data.mdx b/api_docs/kbn_observability_alerting_test_data.mdx index 7daab099447a8f..adb290b72a0d0f 100644 --- a/api_docs/kbn_observability_alerting_test_data.mdx +++ b/api_docs/kbn_observability_alerting_test_data.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-observability-alerting-test-data title: "@kbn/observability-alerting-test-data" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/observability-alerting-test-data plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/observability-alerting-test-data'] --- import kbnObservabilityAlertingTestDataObj from './kbn_observability_alerting_test_data.devdocs.json'; diff --git a/api_docs/kbn_openapi_generator.mdx b/api_docs/kbn_openapi_generator.mdx index edc9aafd433a60..ae2c2bb0020746 100644 --- a/api_docs/kbn_openapi_generator.mdx +++ b/api_docs/kbn_openapi_generator.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-openapi-generator title: "@kbn/openapi-generator" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/openapi-generator plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/openapi-generator'] --- import kbnOpenapiGeneratorObj from './kbn_openapi_generator.devdocs.json'; diff --git a/api_docs/kbn_optimizer.mdx b/api_docs/kbn_optimizer.mdx index 84408e883c3d49..3cf5b55b61fcd2 100644 --- a/api_docs/kbn_optimizer.mdx +++ b/api_docs/kbn_optimizer.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-optimizer title: "@kbn/optimizer" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/optimizer plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/optimizer'] --- import kbnOptimizerObj from './kbn_optimizer.devdocs.json'; diff --git a/api_docs/kbn_optimizer_webpack_helpers.mdx b/api_docs/kbn_optimizer_webpack_helpers.mdx index c63b236004914e..93bd90f1e863f7 100644 --- a/api_docs/kbn_optimizer_webpack_helpers.mdx +++ b/api_docs/kbn_optimizer_webpack_helpers.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-optimizer-webpack-helpers title: "@kbn/optimizer-webpack-helpers" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/optimizer-webpack-helpers plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/optimizer-webpack-helpers'] --- import kbnOptimizerWebpackHelpersObj from './kbn_optimizer_webpack_helpers.devdocs.json'; diff --git a/api_docs/kbn_osquery_io_ts_types.mdx b/api_docs/kbn_osquery_io_ts_types.mdx index 00e309d1af2f48..3d46fcdc6cc9c2 100644 --- a/api_docs/kbn_osquery_io_ts_types.mdx +++ b/api_docs/kbn_osquery_io_ts_types.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-osquery-io-ts-types title: "@kbn/osquery-io-ts-types" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/osquery-io-ts-types plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/osquery-io-ts-types'] --- import kbnOsqueryIoTsTypesObj from './kbn_osquery_io_ts_types.devdocs.json'; diff --git a/api_docs/kbn_performance_testing_dataset_extractor.mdx b/api_docs/kbn_performance_testing_dataset_extractor.mdx index 11b3bc082e460e..5a7b2c1a849112 100644 --- a/api_docs/kbn_performance_testing_dataset_extractor.mdx +++ b/api_docs/kbn_performance_testing_dataset_extractor.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-performance-testing-dataset-extractor title: "@kbn/performance-testing-dataset-extractor" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/performance-testing-dataset-extractor plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/performance-testing-dataset-extractor'] --- import kbnPerformanceTestingDatasetExtractorObj from './kbn_performance_testing_dataset_extractor.devdocs.json'; diff --git a/api_docs/kbn_plugin_generator.mdx b/api_docs/kbn_plugin_generator.mdx index add67fd3986bcc..25c3f62c23c9aa 100644 --- a/api_docs/kbn_plugin_generator.mdx +++ b/api_docs/kbn_plugin_generator.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-plugin-generator title: "@kbn/plugin-generator" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/plugin-generator plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/plugin-generator'] --- import kbnPluginGeneratorObj from './kbn_plugin_generator.devdocs.json'; diff --git a/api_docs/kbn_plugin_helpers.mdx b/api_docs/kbn_plugin_helpers.mdx index 8bd4d3ddc91005..9eb3a4c6f354fd 100644 --- a/api_docs/kbn_plugin_helpers.mdx +++ b/api_docs/kbn_plugin_helpers.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-plugin-helpers title: "@kbn/plugin-helpers" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/plugin-helpers plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/plugin-helpers'] --- import kbnPluginHelpersObj from './kbn_plugin_helpers.devdocs.json'; diff --git a/api_docs/kbn_profiling_utils.mdx b/api_docs/kbn_profiling_utils.mdx index d7eccebea64672..b46308fabdeafd 100644 --- a/api_docs/kbn_profiling_utils.mdx +++ b/api_docs/kbn_profiling_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-profiling-utils title: "@kbn/profiling-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/profiling-utils plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/profiling-utils'] --- import kbnProfilingUtilsObj from './kbn_profiling_utils.devdocs.json'; diff --git a/api_docs/kbn_random_sampling.mdx b/api_docs/kbn_random_sampling.mdx index de716d19d49211..5359be57f2bae3 100644 --- a/api_docs/kbn_random_sampling.mdx +++ b/api_docs/kbn_random_sampling.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-random-sampling title: "@kbn/random-sampling" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/random-sampling plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/random-sampling'] --- import kbnRandomSamplingObj from './kbn_random_sampling.devdocs.json'; diff --git a/api_docs/kbn_react_field.mdx b/api_docs/kbn_react_field.mdx index e1b3a5c060e84d..8ea3952a11f2e2 100644 --- a/api_docs/kbn_react_field.mdx +++ b/api_docs/kbn_react_field.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-react-field title: "@kbn/react-field" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/react-field plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/react-field'] --- import kbnReactFieldObj from './kbn_react_field.devdocs.json'; diff --git a/api_docs/kbn_react_kibana_context_common.mdx b/api_docs/kbn_react_kibana_context_common.mdx index c284ce037eb6c0..bca50548e28080 100644 --- a/api_docs/kbn_react_kibana_context_common.mdx +++ b/api_docs/kbn_react_kibana_context_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-react-kibana-context-common title: "@kbn/react-kibana-context-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/react-kibana-context-common plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/react-kibana-context-common'] --- import kbnReactKibanaContextCommonObj from './kbn_react_kibana_context_common.devdocs.json'; diff --git a/api_docs/kbn_react_kibana_context_render.mdx b/api_docs/kbn_react_kibana_context_render.mdx index 857fdc387d6f59..8fbe607539c42d 100644 --- a/api_docs/kbn_react_kibana_context_render.mdx +++ b/api_docs/kbn_react_kibana_context_render.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-react-kibana-context-render title: "@kbn/react-kibana-context-render" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/react-kibana-context-render plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/react-kibana-context-render'] --- import kbnReactKibanaContextRenderObj from './kbn_react_kibana_context_render.devdocs.json'; diff --git a/api_docs/kbn_react_kibana_context_root.mdx b/api_docs/kbn_react_kibana_context_root.mdx index 55b7583faad811..f205ca99b52bea 100644 --- a/api_docs/kbn_react_kibana_context_root.mdx +++ b/api_docs/kbn_react_kibana_context_root.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-react-kibana-context-root title: "@kbn/react-kibana-context-root" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/react-kibana-context-root plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/react-kibana-context-root'] --- import kbnReactKibanaContextRootObj from './kbn_react_kibana_context_root.devdocs.json'; diff --git a/api_docs/kbn_react_kibana_context_styled.mdx b/api_docs/kbn_react_kibana_context_styled.mdx index 10075911ac5fc9..03051de7286db5 100644 --- a/api_docs/kbn_react_kibana_context_styled.mdx +++ b/api_docs/kbn_react_kibana_context_styled.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-react-kibana-context-styled title: "@kbn/react-kibana-context-styled" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/react-kibana-context-styled plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/react-kibana-context-styled'] --- import kbnReactKibanaContextStyledObj from './kbn_react_kibana_context_styled.devdocs.json'; diff --git a/api_docs/kbn_react_kibana_context_theme.mdx b/api_docs/kbn_react_kibana_context_theme.mdx index 23738f04b9d871..0962ffc48bee63 100644 --- a/api_docs/kbn_react_kibana_context_theme.mdx +++ b/api_docs/kbn_react_kibana_context_theme.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-react-kibana-context-theme title: "@kbn/react-kibana-context-theme" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/react-kibana-context-theme plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/react-kibana-context-theme'] --- import kbnReactKibanaContextThemeObj from './kbn_react_kibana_context_theme.devdocs.json'; diff --git a/api_docs/kbn_react_kibana_mount.mdx b/api_docs/kbn_react_kibana_mount.mdx index 49b69a24c8d7ae..8a2cff0f6c5a72 100644 --- a/api_docs/kbn_react_kibana_mount.mdx +++ b/api_docs/kbn_react_kibana_mount.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-react-kibana-mount title: "@kbn/react-kibana-mount" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/react-kibana-mount plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/react-kibana-mount'] --- import kbnReactKibanaMountObj from './kbn_react_kibana_mount.devdocs.json'; diff --git a/api_docs/kbn_repo_file_maps.mdx b/api_docs/kbn_repo_file_maps.mdx index 47bc7e945bd1f0..cbeb9155600dfd 100644 --- a/api_docs/kbn_repo_file_maps.mdx +++ b/api_docs/kbn_repo_file_maps.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-repo-file-maps title: "@kbn/repo-file-maps" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/repo-file-maps plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/repo-file-maps'] --- import kbnRepoFileMapsObj from './kbn_repo_file_maps.devdocs.json'; diff --git a/api_docs/kbn_repo_linter.mdx b/api_docs/kbn_repo_linter.mdx index 46e24fa531ff01..25db38f193401a 100644 --- a/api_docs/kbn_repo_linter.mdx +++ b/api_docs/kbn_repo_linter.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-repo-linter title: "@kbn/repo-linter" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/repo-linter plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/repo-linter'] --- import kbnRepoLinterObj from './kbn_repo_linter.devdocs.json'; diff --git a/api_docs/kbn_repo_path.mdx b/api_docs/kbn_repo_path.mdx index 22f2f5c91d1045..2e71bff8ef77e4 100644 --- a/api_docs/kbn_repo_path.mdx +++ b/api_docs/kbn_repo_path.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-repo-path title: "@kbn/repo-path" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/repo-path plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/repo-path'] --- import kbnRepoPathObj from './kbn_repo_path.devdocs.json'; diff --git a/api_docs/kbn_repo_source_classifier.mdx b/api_docs/kbn_repo_source_classifier.mdx index 7258b7ee38f67b..8cc8864799173c 100644 --- a/api_docs/kbn_repo_source_classifier.mdx +++ b/api_docs/kbn_repo_source_classifier.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-repo-source-classifier title: "@kbn/repo-source-classifier" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/repo-source-classifier plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/repo-source-classifier'] --- import kbnRepoSourceClassifierObj from './kbn_repo_source_classifier.devdocs.json'; diff --git a/api_docs/kbn_reporting_common.mdx b/api_docs/kbn_reporting_common.mdx index cbb949131e8df5..4b0cbb4ee99b53 100644 --- a/api_docs/kbn_reporting_common.mdx +++ b/api_docs/kbn_reporting_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-reporting-common title: "@kbn/reporting-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/reporting-common plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/reporting-common'] --- import kbnReportingCommonObj from './kbn_reporting_common.devdocs.json'; diff --git a/api_docs/kbn_resizable_layout.mdx b/api_docs/kbn_resizable_layout.mdx index 576378baca2a5b..7356b65333192d 100644 --- a/api_docs/kbn_resizable_layout.mdx +++ b/api_docs/kbn_resizable_layout.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-resizable-layout title: "@kbn/resizable-layout" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/resizable-layout plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/resizable-layout'] --- import kbnResizableLayoutObj from './kbn_resizable_layout.devdocs.json'; diff --git a/api_docs/kbn_rison.mdx b/api_docs/kbn_rison.mdx index e8216ba6e8b899..38c5d0b423403a 100644 --- a/api_docs/kbn_rison.mdx +++ b/api_docs/kbn_rison.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-rison title: "@kbn/rison" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/rison plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/rison'] --- import kbnRisonObj from './kbn_rison.devdocs.json'; diff --git a/api_docs/kbn_rrule.mdx b/api_docs/kbn_rrule.mdx index 8c298af9aafea5..f10266c7120c49 100644 --- a/api_docs/kbn_rrule.mdx +++ b/api_docs/kbn_rrule.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-rrule title: "@kbn/rrule" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/rrule plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/rrule'] --- import kbnRruleObj from './kbn_rrule.devdocs.json'; diff --git a/api_docs/kbn_rule_data_utils.mdx b/api_docs/kbn_rule_data_utils.mdx index 241c32f3b4c6db..f28ea474d8ec78 100644 --- a/api_docs/kbn_rule_data_utils.mdx +++ b/api_docs/kbn_rule_data_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-rule-data-utils title: "@kbn/rule-data-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/rule-data-utils plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/rule-data-utils'] --- import kbnRuleDataUtilsObj from './kbn_rule_data_utils.devdocs.json'; diff --git a/api_docs/kbn_saved_objects_settings.mdx b/api_docs/kbn_saved_objects_settings.mdx index 7f0ea27c4e4bd1..a3342d147e69c9 100644 --- a/api_docs/kbn_saved_objects_settings.mdx +++ b/api_docs/kbn_saved_objects_settings.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-saved-objects-settings title: "@kbn/saved-objects-settings" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/saved-objects-settings plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/saved-objects-settings'] --- import kbnSavedObjectsSettingsObj from './kbn_saved_objects_settings.devdocs.json'; diff --git a/api_docs/kbn_search_api_panels.mdx b/api_docs/kbn_search_api_panels.mdx index b212daafa81002..b81d505be8eae5 100644 --- a/api_docs/kbn_search_api_panels.mdx +++ b/api_docs/kbn_search_api_panels.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-search-api-panels title: "@kbn/search-api-panels" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/search-api-panels plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/search-api-panels'] --- import kbnSearchApiPanelsObj from './kbn_search_api_panels.devdocs.json'; diff --git a/api_docs/kbn_search_connectors.mdx b/api_docs/kbn_search_connectors.mdx index be5d12d9fcfb6e..a5f39eae767d00 100644 --- a/api_docs/kbn_search_connectors.mdx +++ b/api_docs/kbn_search_connectors.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-search-connectors title: "@kbn/search-connectors" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/search-connectors plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/search-connectors'] --- import kbnSearchConnectorsObj from './kbn_search_connectors.devdocs.json'; diff --git a/api_docs/kbn_search_response_warnings.mdx b/api_docs/kbn_search_response_warnings.mdx index 22a1235b6ff0b3..8e620a3df80823 100644 --- a/api_docs/kbn_search_response_warnings.mdx +++ b/api_docs/kbn_search_response_warnings.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-search-response-warnings title: "@kbn/search-response-warnings" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/search-response-warnings plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/search-response-warnings'] --- import kbnSearchResponseWarningsObj from './kbn_search_response_warnings.devdocs.json'; diff --git a/api_docs/kbn_security_solution_features.mdx b/api_docs/kbn_security_solution_features.mdx index 752155afc91bef..74f33b54a0d1c7 100644 --- a/api_docs/kbn_security_solution_features.mdx +++ b/api_docs/kbn_security_solution_features.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-security-solution-features title: "@kbn/security-solution-features" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/security-solution-features plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/security-solution-features'] --- import kbnSecuritySolutionFeaturesObj from './kbn_security_solution_features.devdocs.json'; diff --git a/api_docs/kbn_security_solution_navigation.mdx b/api_docs/kbn_security_solution_navigation.mdx index 236ffa4305ac5e..50de35cdcc3810 100644 --- a/api_docs/kbn_security_solution_navigation.mdx +++ b/api_docs/kbn_security_solution_navigation.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-security-solution-navigation title: "@kbn/security-solution-navigation" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/security-solution-navigation plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/security-solution-navigation'] --- import kbnSecuritySolutionNavigationObj from './kbn_security_solution_navigation.devdocs.json'; diff --git a/api_docs/kbn_security_solution_side_nav.mdx b/api_docs/kbn_security_solution_side_nav.mdx index f5e21dbd80b44b..2f9a3c3d93388c 100644 --- a/api_docs/kbn_security_solution_side_nav.mdx +++ b/api_docs/kbn_security_solution_side_nav.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-security-solution-side-nav title: "@kbn/security-solution-side-nav" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/security-solution-side-nav plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/security-solution-side-nav'] --- import kbnSecuritySolutionSideNavObj from './kbn_security_solution_side_nav.devdocs.json'; diff --git a/api_docs/kbn_security_solution_storybook_config.mdx b/api_docs/kbn_security_solution_storybook_config.mdx index 43ec6af839b9d2..580720a04d6d1d 100644 --- a/api_docs/kbn_security_solution_storybook_config.mdx +++ b/api_docs/kbn_security_solution_storybook_config.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-security-solution-storybook-config title: "@kbn/security-solution-storybook-config" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/security-solution-storybook-config plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/security-solution-storybook-config'] --- import kbnSecuritySolutionStorybookConfigObj from './kbn_security_solution_storybook_config.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_autocomplete.mdx b/api_docs/kbn_securitysolution_autocomplete.mdx index e23bcc94abbced..9c1ad35a7863a0 100644 --- a/api_docs/kbn_securitysolution_autocomplete.mdx +++ b/api_docs/kbn_securitysolution_autocomplete.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-autocomplete title: "@kbn/securitysolution-autocomplete" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-autocomplete plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-autocomplete'] --- import kbnSecuritysolutionAutocompleteObj from './kbn_securitysolution_autocomplete.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_data_table.mdx b/api_docs/kbn_securitysolution_data_table.mdx index 7045bf1c5af383..95fd022e012511 100644 --- a/api_docs/kbn_securitysolution_data_table.mdx +++ b/api_docs/kbn_securitysolution_data_table.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-data-table title: "@kbn/securitysolution-data-table" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-data-table plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-data-table'] --- import kbnSecuritysolutionDataTableObj from './kbn_securitysolution_data_table.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_ecs.mdx b/api_docs/kbn_securitysolution_ecs.mdx index cbed47991178c9..ebef39a1a44762 100644 --- a/api_docs/kbn_securitysolution_ecs.mdx +++ b/api_docs/kbn_securitysolution_ecs.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-ecs title: "@kbn/securitysolution-ecs" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-ecs plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-ecs'] --- import kbnSecuritysolutionEcsObj from './kbn_securitysolution_ecs.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_es_utils.mdx b/api_docs/kbn_securitysolution_es_utils.mdx index ce258b579fcad0..1f3f90e9cf58f6 100644 --- a/api_docs/kbn_securitysolution_es_utils.mdx +++ b/api_docs/kbn_securitysolution_es_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-es-utils title: "@kbn/securitysolution-es-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-es-utils plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-es-utils'] --- import kbnSecuritysolutionEsUtilsObj from './kbn_securitysolution_es_utils.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_exception_list_components.mdx b/api_docs/kbn_securitysolution_exception_list_components.mdx index 96f2596a3b138a..de997bbc65a499 100644 --- a/api_docs/kbn_securitysolution_exception_list_components.mdx +++ b/api_docs/kbn_securitysolution_exception_list_components.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-exception-list-components title: "@kbn/securitysolution-exception-list-components" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-exception-list-components plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-exception-list-components'] --- import kbnSecuritysolutionExceptionListComponentsObj from './kbn_securitysolution_exception_list_components.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_grouping.mdx b/api_docs/kbn_securitysolution_grouping.mdx index 4ff80f9d118ebd..64d82bde7b3e48 100644 --- a/api_docs/kbn_securitysolution_grouping.mdx +++ b/api_docs/kbn_securitysolution_grouping.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-grouping title: "@kbn/securitysolution-grouping" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-grouping plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-grouping'] --- import kbnSecuritysolutionGroupingObj from './kbn_securitysolution_grouping.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_hook_utils.mdx b/api_docs/kbn_securitysolution_hook_utils.mdx index 72605d4ec2398e..bf930572c868bf 100644 --- a/api_docs/kbn_securitysolution_hook_utils.mdx +++ b/api_docs/kbn_securitysolution_hook_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-hook-utils title: "@kbn/securitysolution-hook-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-hook-utils plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-hook-utils'] --- import kbnSecuritysolutionHookUtilsObj from './kbn_securitysolution_hook_utils.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_io_ts_alerting_types.mdx b/api_docs/kbn_securitysolution_io_ts_alerting_types.mdx index d2f58460255758..591a1113cdee76 100644 --- a/api_docs/kbn_securitysolution_io_ts_alerting_types.mdx +++ b/api_docs/kbn_securitysolution_io_ts_alerting_types.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-io-ts-alerting-types title: "@kbn/securitysolution-io-ts-alerting-types" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-io-ts-alerting-types plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-io-ts-alerting-types'] --- import kbnSecuritysolutionIoTsAlertingTypesObj from './kbn_securitysolution_io_ts_alerting_types.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_io_ts_list_types.mdx b/api_docs/kbn_securitysolution_io_ts_list_types.mdx index dc12ae8f5f39c3..79ac6da7bcddbf 100644 --- a/api_docs/kbn_securitysolution_io_ts_list_types.mdx +++ b/api_docs/kbn_securitysolution_io_ts_list_types.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-io-ts-list-types title: "@kbn/securitysolution-io-ts-list-types" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-io-ts-list-types plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-io-ts-list-types'] --- import kbnSecuritysolutionIoTsListTypesObj from './kbn_securitysolution_io_ts_list_types.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_io_ts_types.mdx b/api_docs/kbn_securitysolution_io_ts_types.mdx index ac77204390e651..563ae7a13e0151 100644 --- a/api_docs/kbn_securitysolution_io_ts_types.mdx +++ b/api_docs/kbn_securitysolution_io_ts_types.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-io-ts-types title: "@kbn/securitysolution-io-ts-types" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-io-ts-types plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-io-ts-types'] --- import kbnSecuritysolutionIoTsTypesObj from './kbn_securitysolution_io_ts_types.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_io_ts_utils.mdx b/api_docs/kbn_securitysolution_io_ts_utils.mdx index 19729ac4667eb9..d9787f8584debd 100644 --- a/api_docs/kbn_securitysolution_io_ts_utils.mdx +++ b/api_docs/kbn_securitysolution_io_ts_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-io-ts-utils title: "@kbn/securitysolution-io-ts-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-io-ts-utils plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-io-ts-utils'] --- import kbnSecuritysolutionIoTsUtilsObj from './kbn_securitysolution_io_ts_utils.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_list_api.mdx b/api_docs/kbn_securitysolution_list_api.mdx index 40572f3c8fb3d4..ab0fe80cade67e 100644 --- a/api_docs/kbn_securitysolution_list_api.mdx +++ b/api_docs/kbn_securitysolution_list_api.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-list-api title: "@kbn/securitysolution-list-api" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-list-api plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-list-api'] --- import kbnSecuritysolutionListApiObj from './kbn_securitysolution_list_api.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_list_constants.mdx b/api_docs/kbn_securitysolution_list_constants.mdx index 30ea7798110638..d1061879d3b070 100644 --- a/api_docs/kbn_securitysolution_list_constants.mdx +++ b/api_docs/kbn_securitysolution_list_constants.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-list-constants title: "@kbn/securitysolution-list-constants" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-list-constants plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-list-constants'] --- import kbnSecuritysolutionListConstantsObj from './kbn_securitysolution_list_constants.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_list_hooks.mdx b/api_docs/kbn_securitysolution_list_hooks.mdx index 17130cc30857b1..99d90c33a21e24 100644 --- a/api_docs/kbn_securitysolution_list_hooks.mdx +++ b/api_docs/kbn_securitysolution_list_hooks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-list-hooks title: "@kbn/securitysolution-list-hooks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-list-hooks plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-list-hooks'] --- import kbnSecuritysolutionListHooksObj from './kbn_securitysolution_list_hooks.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_list_utils.mdx b/api_docs/kbn_securitysolution_list_utils.mdx index ae91786c91a674..5aa7bc10c59f0a 100644 --- a/api_docs/kbn_securitysolution_list_utils.mdx +++ b/api_docs/kbn_securitysolution_list_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-list-utils title: "@kbn/securitysolution-list-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-list-utils plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-list-utils'] --- import kbnSecuritysolutionListUtilsObj from './kbn_securitysolution_list_utils.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_rules.mdx b/api_docs/kbn_securitysolution_rules.mdx index 9732f39d2c1180..25a1028ef5a4a8 100644 --- a/api_docs/kbn_securitysolution_rules.mdx +++ b/api_docs/kbn_securitysolution_rules.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-rules title: "@kbn/securitysolution-rules" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-rules plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-rules'] --- import kbnSecuritysolutionRulesObj from './kbn_securitysolution_rules.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_t_grid.mdx b/api_docs/kbn_securitysolution_t_grid.mdx index d6573b246ba3b5..2f9c4f43079932 100644 --- a/api_docs/kbn_securitysolution_t_grid.mdx +++ b/api_docs/kbn_securitysolution_t_grid.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-t-grid title: "@kbn/securitysolution-t-grid" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-t-grid plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-t-grid'] --- import kbnSecuritysolutionTGridObj from './kbn_securitysolution_t_grid.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_utils.mdx b/api_docs/kbn_securitysolution_utils.mdx index ff47daa9a3fb27..0a32b6d90e5a59 100644 --- a/api_docs/kbn_securitysolution_utils.mdx +++ b/api_docs/kbn_securitysolution_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-utils title: "@kbn/securitysolution-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-utils plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-utils'] --- import kbnSecuritysolutionUtilsObj from './kbn_securitysolution_utils.devdocs.json'; diff --git a/api_docs/kbn_server_http_tools.mdx b/api_docs/kbn_server_http_tools.mdx index f06aa6683710fb..faf6104b08388e 100644 --- a/api_docs/kbn_server_http_tools.mdx +++ b/api_docs/kbn_server_http_tools.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-server-http-tools title: "@kbn/server-http-tools" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/server-http-tools plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/server-http-tools'] --- import kbnServerHttpToolsObj from './kbn_server_http_tools.devdocs.json'; diff --git a/api_docs/kbn_server_route_repository.mdx b/api_docs/kbn_server_route_repository.mdx index 632d751ac16572..cc9ad15d21fa58 100644 --- a/api_docs/kbn_server_route_repository.mdx +++ b/api_docs/kbn_server_route_repository.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-server-route-repository title: "@kbn/server-route-repository" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/server-route-repository plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/server-route-repository'] --- import kbnServerRouteRepositoryObj from './kbn_server_route_repository.devdocs.json'; diff --git a/api_docs/kbn_serverless_common_settings.mdx b/api_docs/kbn_serverless_common_settings.mdx index bdf3d4cd6b5b75..7bb2a9739a57c6 100644 --- a/api_docs/kbn_serverless_common_settings.mdx +++ b/api_docs/kbn_serverless_common_settings.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-serverless-common-settings title: "@kbn/serverless-common-settings" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/serverless-common-settings plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/serverless-common-settings'] --- import kbnServerlessCommonSettingsObj from './kbn_serverless_common_settings.devdocs.json'; diff --git a/api_docs/kbn_serverless_observability_settings.mdx b/api_docs/kbn_serverless_observability_settings.mdx index 3b3aff8298d3a7..e8a48594b68ed5 100644 --- a/api_docs/kbn_serverless_observability_settings.mdx +++ b/api_docs/kbn_serverless_observability_settings.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-serverless-observability-settings title: "@kbn/serverless-observability-settings" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/serverless-observability-settings plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/serverless-observability-settings'] --- import kbnServerlessObservabilitySettingsObj from './kbn_serverless_observability_settings.devdocs.json'; diff --git a/api_docs/kbn_serverless_project_switcher.mdx b/api_docs/kbn_serverless_project_switcher.mdx index 77a0b47425d938..3f73abb382a3a2 100644 --- a/api_docs/kbn_serverless_project_switcher.mdx +++ b/api_docs/kbn_serverless_project_switcher.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-serverless-project-switcher title: "@kbn/serverless-project-switcher" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/serverless-project-switcher plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/serverless-project-switcher'] --- import kbnServerlessProjectSwitcherObj from './kbn_serverless_project_switcher.devdocs.json'; diff --git a/api_docs/kbn_serverless_search_settings.mdx b/api_docs/kbn_serverless_search_settings.mdx index db6729d7c9354b..e9deb58906624a 100644 --- a/api_docs/kbn_serverless_search_settings.mdx +++ b/api_docs/kbn_serverless_search_settings.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-serverless-search-settings title: "@kbn/serverless-search-settings" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/serverless-search-settings plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/serverless-search-settings'] --- import kbnServerlessSearchSettingsObj from './kbn_serverless_search_settings.devdocs.json'; diff --git a/api_docs/kbn_serverless_security_settings.mdx b/api_docs/kbn_serverless_security_settings.mdx index ce5af7282fccd5..e9b14618cef4f2 100644 --- a/api_docs/kbn_serverless_security_settings.mdx +++ b/api_docs/kbn_serverless_security_settings.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-serverless-security-settings title: "@kbn/serverless-security-settings" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/serverless-security-settings plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/serverless-security-settings'] --- import kbnServerlessSecuritySettingsObj from './kbn_serverless_security_settings.devdocs.json'; diff --git a/api_docs/kbn_serverless_storybook_config.mdx b/api_docs/kbn_serverless_storybook_config.mdx index 0043d0e3c62f4e..5fa195b2459564 100644 --- a/api_docs/kbn_serverless_storybook_config.mdx +++ b/api_docs/kbn_serverless_storybook_config.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-serverless-storybook-config title: "@kbn/serverless-storybook-config" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/serverless-storybook-config plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/serverless-storybook-config'] --- import kbnServerlessStorybookConfigObj from './kbn_serverless_storybook_config.devdocs.json'; diff --git a/api_docs/kbn_shared_svg.mdx b/api_docs/kbn_shared_svg.mdx index b568dece7fc847..41fca35f9f260c 100644 --- a/api_docs/kbn_shared_svg.mdx +++ b/api_docs/kbn_shared_svg.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-svg title: "@kbn/shared-svg" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-svg plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-svg'] --- import kbnSharedSvgObj from './kbn_shared_svg.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_avatar_solution.mdx b/api_docs/kbn_shared_ux_avatar_solution.mdx index ae7df27d54a315..dcc03c512f8f62 100644 --- a/api_docs/kbn_shared_ux_avatar_solution.mdx +++ b/api_docs/kbn_shared_ux_avatar_solution.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-avatar-solution title: "@kbn/shared-ux-avatar-solution" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-avatar-solution plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-avatar-solution'] --- import kbnSharedUxAvatarSolutionObj from './kbn_shared_ux_avatar_solution.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_avatar_user_profile_components.mdx b/api_docs/kbn_shared_ux_avatar_user_profile_components.mdx index f072c98f41a94d..4af9e3e0538fb6 100644 --- a/api_docs/kbn_shared_ux_avatar_user_profile_components.mdx +++ b/api_docs/kbn_shared_ux_avatar_user_profile_components.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-avatar-user-profile-components title: "@kbn/shared-ux-avatar-user-profile-components" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-avatar-user-profile-components plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-avatar-user-profile-components'] --- import kbnSharedUxAvatarUserProfileComponentsObj from './kbn_shared_ux_avatar_user_profile_components.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_button_exit_full_screen.mdx b/api_docs/kbn_shared_ux_button_exit_full_screen.mdx index ff46fd60d11631..33874394dc5bfc 100644 --- a/api_docs/kbn_shared_ux_button_exit_full_screen.mdx +++ b/api_docs/kbn_shared_ux_button_exit_full_screen.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-button-exit-full-screen title: "@kbn/shared-ux-button-exit-full-screen" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-button-exit-full-screen plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-button-exit-full-screen'] --- import kbnSharedUxButtonExitFullScreenObj from './kbn_shared_ux_button_exit_full_screen.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_button_exit_full_screen_mocks.mdx b/api_docs/kbn_shared_ux_button_exit_full_screen_mocks.mdx index 02f35c6d9f4e45..3cebbfe81690a4 100644 --- a/api_docs/kbn_shared_ux_button_exit_full_screen_mocks.mdx +++ b/api_docs/kbn_shared_ux_button_exit_full_screen_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-button-exit-full-screen-mocks title: "@kbn/shared-ux-button-exit-full-screen-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-button-exit-full-screen-mocks plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-button-exit-full-screen-mocks'] --- import kbnSharedUxButtonExitFullScreenMocksObj from './kbn_shared_ux_button_exit_full_screen_mocks.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_button_toolbar.mdx b/api_docs/kbn_shared_ux_button_toolbar.mdx index 220548b07ef589..4170c7c54d11f0 100644 --- a/api_docs/kbn_shared_ux_button_toolbar.mdx +++ b/api_docs/kbn_shared_ux_button_toolbar.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-button-toolbar title: "@kbn/shared-ux-button-toolbar" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-button-toolbar plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-button-toolbar'] --- import kbnSharedUxButtonToolbarObj from './kbn_shared_ux_button_toolbar.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_card_no_data.mdx b/api_docs/kbn_shared_ux_card_no_data.mdx index da6ea7d165e0fe..2289a5ab591c57 100644 --- a/api_docs/kbn_shared_ux_card_no_data.mdx +++ b/api_docs/kbn_shared_ux_card_no_data.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-card-no-data title: "@kbn/shared-ux-card-no-data" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-card-no-data plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-card-no-data'] --- import kbnSharedUxCardNoDataObj from './kbn_shared_ux_card_no_data.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_card_no_data_mocks.mdx b/api_docs/kbn_shared_ux_card_no_data_mocks.mdx index 46f0d5c5fabc55..af1ace4582c621 100644 --- a/api_docs/kbn_shared_ux_card_no_data_mocks.mdx +++ b/api_docs/kbn_shared_ux_card_no_data_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-card-no-data-mocks title: "@kbn/shared-ux-card-no-data-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-card-no-data-mocks plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-card-no-data-mocks'] --- import kbnSharedUxCardNoDataMocksObj from './kbn_shared_ux_card_no_data_mocks.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_chrome_navigation.mdx b/api_docs/kbn_shared_ux_chrome_navigation.mdx index 704e3083b89e60..162ac564556642 100644 --- a/api_docs/kbn_shared_ux_chrome_navigation.mdx +++ b/api_docs/kbn_shared_ux_chrome_navigation.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-chrome-navigation title: "@kbn/shared-ux-chrome-navigation" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-chrome-navigation plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-chrome-navigation'] --- import kbnSharedUxChromeNavigationObj from './kbn_shared_ux_chrome_navigation.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_error_boundary.devdocs.json b/api_docs/kbn_shared_ux_error_boundary.devdocs.json new file mode 100644 index 00000000000000..9a660591878cc1 --- /dev/null +++ b/api_docs/kbn_shared_ux_error_boundary.devdocs.json @@ -0,0 +1,100 @@ +{ + "id": "@kbn/shared-ux-error-boundary", + "client": { + "classes": [], + "functions": [], + "interfaces": [], + "enums": [], + "misc": [], + "objects": [] + }, + "server": { + "classes": [], + "functions": [], + "interfaces": [], + "enums": [], + "misc": [], + "objects": [] + }, + "common": { + "classes": [], + "functions": [ + { + "parentPluginId": "@kbn/shared-ux-error-boundary", + "id": "def-common.KibanaErrorBoundary", + "type": "Function", + "tags": [], + "label": "KibanaErrorBoundary", + "description": [ + "\nImplementation of Kibana Error Boundary" + ], + "signature": [ + "(props: ErrorBoundaryProps) => JSX.Element" + ], + "path": "packages/shared-ux/error_boundary/src/ui/error_boundary.tsx", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/shared-ux-error-boundary", + "id": "def-common.KibanaErrorBoundary.$1", + "type": "Object", + "tags": [], + "label": "props", + "description": [ + "- ErrorBoundaryProps" + ], + "signature": [ + "ErrorBoundaryProps" + ], + "path": "packages/shared-ux/error_boundary/src/ui/error_boundary.tsx", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + } + ], + "returnComment": [], + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/shared-ux-error-boundary", + "id": "def-common.KibanaErrorBoundaryProvider", + "type": "Function", + "tags": [], + "label": "KibanaErrorBoundaryProvider", + "description": [ + "\nKibana-specific Provider that maps dependencies to services." + ], + "signature": [ + "({ children }: { children?: React.ReactNode; }) => JSX.Element" + ], + "path": "packages/shared-ux/error_boundary/src/services/error_boundary_services.tsx", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/shared-ux-error-boundary", + "id": "def-common.KibanaErrorBoundaryProvider.$1", + "type": "Object", + "tags": [], + "label": "{ children }", + "description": [], + "signature": [ + "{ children?: React.ReactNode; }" + ], + "path": "packages/shared-ux/error_boundary/src/services/error_boundary_services.tsx", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + } + ], + "returnComment": [], + "initialIsOpen": false + } + ], + "interfaces": [], + "enums": [], + "misc": [], + "objects": [] + } +} \ No newline at end of file diff --git a/api_docs/kbn_shared_ux_error_boundary.mdx b/api_docs/kbn_shared_ux_error_boundary.mdx new file mode 100644 index 00000000000000..d9608e5a19f234 --- /dev/null +++ b/api_docs/kbn_shared_ux_error_boundary.mdx @@ -0,0 +1,30 @@ +--- +#### +#### This document is auto-generated and is meant to be viewed inside our experimental, new docs system. +#### Reach out in #docs-engineering for more info. +#### +id: kibKbnSharedUxErrorBoundaryPluginApi +slug: /kibana-dev-docs/api/kbn-shared-ux-error-boundary +title: "@kbn/shared-ux-error-boundary" +image: https://source.unsplash.com/400x175/?github +description: API docs for the @kbn/shared-ux-error-boundary plugin +date: 2023-10-24 +tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-error-boundary'] +--- +import kbnSharedUxErrorBoundaryObj from './kbn_shared_ux_error_boundary.devdocs.json'; + + + +Contact [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) for questions regarding this plugin. + +**Code health stats** + +| Public API count | Any count | Items lacking comments | Missing exports | +|-------------------|-----------|------------------------|-----------------| +| 4 | 0 | 1 | 0 | + +## Common + +### Functions + + diff --git a/api_docs/kbn_shared_ux_file_context.mdx b/api_docs/kbn_shared_ux_file_context.mdx index 71ddef12a1dd30..a1e787c2a4276d 100644 --- a/api_docs/kbn_shared_ux_file_context.mdx +++ b/api_docs/kbn_shared_ux_file_context.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-file-context title: "@kbn/shared-ux-file-context" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-file-context plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-file-context'] --- import kbnSharedUxFileContextObj from './kbn_shared_ux_file_context.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_file_image.mdx b/api_docs/kbn_shared_ux_file_image.mdx index 2dc227f6c9da1d..c9bb20b0f4b5a4 100644 --- a/api_docs/kbn_shared_ux_file_image.mdx +++ b/api_docs/kbn_shared_ux_file_image.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-file-image title: "@kbn/shared-ux-file-image" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-file-image plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-file-image'] --- import kbnSharedUxFileImageObj from './kbn_shared_ux_file_image.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_file_image_mocks.mdx b/api_docs/kbn_shared_ux_file_image_mocks.mdx index 025ed3dfa30429..12ee371368b028 100644 --- a/api_docs/kbn_shared_ux_file_image_mocks.mdx +++ b/api_docs/kbn_shared_ux_file_image_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-file-image-mocks title: "@kbn/shared-ux-file-image-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-file-image-mocks plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-file-image-mocks'] --- import kbnSharedUxFileImageMocksObj from './kbn_shared_ux_file_image_mocks.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_file_mocks.mdx b/api_docs/kbn_shared_ux_file_mocks.mdx index d2794deae339b0..74b773927f7a0e 100644 --- a/api_docs/kbn_shared_ux_file_mocks.mdx +++ b/api_docs/kbn_shared_ux_file_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-file-mocks title: "@kbn/shared-ux-file-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-file-mocks plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-file-mocks'] --- import kbnSharedUxFileMocksObj from './kbn_shared_ux_file_mocks.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_file_picker.mdx b/api_docs/kbn_shared_ux_file_picker.mdx index 9b538ca3f4c39f..66a6f602e046ec 100644 --- a/api_docs/kbn_shared_ux_file_picker.mdx +++ b/api_docs/kbn_shared_ux_file_picker.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-file-picker title: "@kbn/shared-ux-file-picker" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-file-picker plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-file-picker'] --- import kbnSharedUxFilePickerObj from './kbn_shared_ux_file_picker.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_file_types.mdx b/api_docs/kbn_shared_ux_file_types.mdx index c214dc46d3ef7d..530b1339185e3e 100644 --- a/api_docs/kbn_shared_ux_file_types.mdx +++ b/api_docs/kbn_shared_ux_file_types.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-file-types title: "@kbn/shared-ux-file-types" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-file-types plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-file-types'] --- import kbnSharedUxFileTypesObj from './kbn_shared_ux_file_types.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_file_upload.mdx b/api_docs/kbn_shared_ux_file_upload.mdx index 14211304dfced4..d17e77c9013647 100644 --- a/api_docs/kbn_shared_ux_file_upload.mdx +++ b/api_docs/kbn_shared_ux_file_upload.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-file-upload title: "@kbn/shared-ux-file-upload" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-file-upload plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-file-upload'] --- import kbnSharedUxFileUploadObj from './kbn_shared_ux_file_upload.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_file_util.mdx b/api_docs/kbn_shared_ux_file_util.mdx index 8d2b283dbafc64..fdaf1d63bbb6df 100644 --- a/api_docs/kbn_shared_ux_file_util.mdx +++ b/api_docs/kbn_shared_ux_file_util.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-file-util title: "@kbn/shared-ux-file-util" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-file-util plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-file-util'] --- import kbnSharedUxFileUtilObj from './kbn_shared_ux_file_util.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_link_redirect_app.mdx b/api_docs/kbn_shared_ux_link_redirect_app.mdx index 6af7ce5ac76cac..85aba54f0253ef 100644 --- a/api_docs/kbn_shared_ux_link_redirect_app.mdx +++ b/api_docs/kbn_shared_ux_link_redirect_app.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-link-redirect-app title: "@kbn/shared-ux-link-redirect-app" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-link-redirect-app plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-link-redirect-app'] --- import kbnSharedUxLinkRedirectAppObj from './kbn_shared_ux_link_redirect_app.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_link_redirect_app_mocks.mdx b/api_docs/kbn_shared_ux_link_redirect_app_mocks.mdx index 5e05879954077e..6b9c6304c62fd2 100644 --- a/api_docs/kbn_shared_ux_link_redirect_app_mocks.mdx +++ b/api_docs/kbn_shared_ux_link_redirect_app_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-link-redirect-app-mocks title: "@kbn/shared-ux-link-redirect-app-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-link-redirect-app-mocks plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-link-redirect-app-mocks'] --- import kbnSharedUxLinkRedirectAppMocksObj from './kbn_shared_ux_link_redirect_app_mocks.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_markdown.mdx b/api_docs/kbn_shared_ux_markdown.mdx index a8da2094119bfd..0a12704ee2f063 100644 --- a/api_docs/kbn_shared_ux_markdown.mdx +++ b/api_docs/kbn_shared_ux_markdown.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-markdown title: "@kbn/shared-ux-markdown" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-markdown plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-markdown'] --- import kbnSharedUxMarkdownObj from './kbn_shared_ux_markdown.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_markdown_mocks.mdx b/api_docs/kbn_shared_ux_markdown_mocks.mdx index bd8cf75dfa60d0..ec11b194c22361 100644 --- a/api_docs/kbn_shared_ux_markdown_mocks.mdx +++ b/api_docs/kbn_shared_ux_markdown_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-markdown-mocks title: "@kbn/shared-ux-markdown-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-markdown-mocks plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-markdown-mocks'] --- import kbnSharedUxMarkdownMocksObj from './kbn_shared_ux_markdown_mocks.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_page_analytics_no_data.mdx b/api_docs/kbn_shared_ux_page_analytics_no_data.mdx index 717aecc842a63a..01f32857c139de 100644 --- a/api_docs/kbn_shared_ux_page_analytics_no_data.mdx +++ b/api_docs/kbn_shared_ux_page_analytics_no_data.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-page-analytics-no-data title: "@kbn/shared-ux-page-analytics-no-data" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-page-analytics-no-data plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-page-analytics-no-data'] --- import kbnSharedUxPageAnalyticsNoDataObj from './kbn_shared_ux_page_analytics_no_data.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_page_analytics_no_data_mocks.mdx b/api_docs/kbn_shared_ux_page_analytics_no_data_mocks.mdx index 7de7b3c8a4bbdd..3a466dafbe6bf7 100644 --- a/api_docs/kbn_shared_ux_page_analytics_no_data_mocks.mdx +++ b/api_docs/kbn_shared_ux_page_analytics_no_data_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-page-analytics-no-data-mocks title: "@kbn/shared-ux-page-analytics-no-data-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-page-analytics-no-data-mocks plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-page-analytics-no-data-mocks'] --- import kbnSharedUxPageAnalyticsNoDataMocksObj from './kbn_shared_ux_page_analytics_no_data_mocks.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_page_kibana_no_data.mdx b/api_docs/kbn_shared_ux_page_kibana_no_data.mdx index 00540d36cb4e0d..c51a0e9c35cbf5 100644 --- a/api_docs/kbn_shared_ux_page_kibana_no_data.mdx +++ b/api_docs/kbn_shared_ux_page_kibana_no_data.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-page-kibana-no-data title: "@kbn/shared-ux-page-kibana-no-data" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-page-kibana-no-data plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-page-kibana-no-data'] --- import kbnSharedUxPageKibanaNoDataObj from './kbn_shared_ux_page_kibana_no_data.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_page_kibana_no_data_mocks.mdx b/api_docs/kbn_shared_ux_page_kibana_no_data_mocks.mdx index b0dcc978ec6199..9c4dc8695f9216 100644 --- a/api_docs/kbn_shared_ux_page_kibana_no_data_mocks.mdx +++ b/api_docs/kbn_shared_ux_page_kibana_no_data_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-page-kibana-no-data-mocks title: "@kbn/shared-ux-page-kibana-no-data-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-page-kibana-no-data-mocks plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-page-kibana-no-data-mocks'] --- import kbnSharedUxPageKibanaNoDataMocksObj from './kbn_shared_ux_page_kibana_no_data_mocks.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_page_kibana_template.mdx b/api_docs/kbn_shared_ux_page_kibana_template.mdx index 20909472226edc..bc2431d529a05d 100644 --- a/api_docs/kbn_shared_ux_page_kibana_template.mdx +++ b/api_docs/kbn_shared_ux_page_kibana_template.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-page-kibana-template title: "@kbn/shared-ux-page-kibana-template" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-page-kibana-template plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-page-kibana-template'] --- import kbnSharedUxPageKibanaTemplateObj from './kbn_shared_ux_page_kibana_template.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_page_kibana_template_mocks.mdx b/api_docs/kbn_shared_ux_page_kibana_template_mocks.mdx index ab220e43a18a86..402542bca11fe9 100644 --- a/api_docs/kbn_shared_ux_page_kibana_template_mocks.mdx +++ b/api_docs/kbn_shared_ux_page_kibana_template_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-page-kibana-template-mocks title: "@kbn/shared-ux-page-kibana-template-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-page-kibana-template-mocks plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-page-kibana-template-mocks'] --- import kbnSharedUxPageKibanaTemplateMocksObj from './kbn_shared_ux_page_kibana_template_mocks.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_page_no_data.mdx b/api_docs/kbn_shared_ux_page_no_data.mdx index d9555d2a244a24..fbad70fa1e5a65 100644 --- a/api_docs/kbn_shared_ux_page_no_data.mdx +++ b/api_docs/kbn_shared_ux_page_no_data.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-page-no-data title: "@kbn/shared-ux-page-no-data" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-page-no-data plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-page-no-data'] --- import kbnSharedUxPageNoDataObj from './kbn_shared_ux_page_no_data.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_page_no_data_config.mdx b/api_docs/kbn_shared_ux_page_no_data_config.mdx index 50adcdf60be74b..f4c78020cb5d7e 100644 --- a/api_docs/kbn_shared_ux_page_no_data_config.mdx +++ b/api_docs/kbn_shared_ux_page_no_data_config.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-page-no-data-config title: "@kbn/shared-ux-page-no-data-config" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-page-no-data-config plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-page-no-data-config'] --- import kbnSharedUxPageNoDataConfigObj from './kbn_shared_ux_page_no_data_config.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_page_no_data_config_mocks.mdx b/api_docs/kbn_shared_ux_page_no_data_config_mocks.mdx index f93c41d0cd6770..e16b2f619692f2 100644 --- a/api_docs/kbn_shared_ux_page_no_data_config_mocks.mdx +++ b/api_docs/kbn_shared_ux_page_no_data_config_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-page-no-data-config-mocks title: "@kbn/shared-ux-page-no-data-config-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-page-no-data-config-mocks plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-page-no-data-config-mocks'] --- import kbnSharedUxPageNoDataConfigMocksObj from './kbn_shared_ux_page_no_data_config_mocks.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_page_no_data_mocks.mdx b/api_docs/kbn_shared_ux_page_no_data_mocks.mdx index 0d807ccc367905..37a27267e26563 100644 --- a/api_docs/kbn_shared_ux_page_no_data_mocks.mdx +++ b/api_docs/kbn_shared_ux_page_no_data_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-page-no-data-mocks title: "@kbn/shared-ux-page-no-data-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-page-no-data-mocks plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-page-no-data-mocks'] --- import kbnSharedUxPageNoDataMocksObj from './kbn_shared_ux_page_no_data_mocks.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_page_solution_nav.mdx b/api_docs/kbn_shared_ux_page_solution_nav.mdx index e9b1c1915ae841..8177959c5bce93 100644 --- a/api_docs/kbn_shared_ux_page_solution_nav.mdx +++ b/api_docs/kbn_shared_ux_page_solution_nav.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-page-solution-nav title: "@kbn/shared-ux-page-solution-nav" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-page-solution-nav plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-page-solution-nav'] --- import kbnSharedUxPageSolutionNavObj from './kbn_shared_ux_page_solution_nav.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_prompt_no_data_views.mdx b/api_docs/kbn_shared_ux_prompt_no_data_views.mdx index c80c1bab4e9a22..36656065356511 100644 --- a/api_docs/kbn_shared_ux_prompt_no_data_views.mdx +++ b/api_docs/kbn_shared_ux_prompt_no_data_views.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-prompt-no-data-views title: "@kbn/shared-ux-prompt-no-data-views" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-prompt-no-data-views plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-prompt-no-data-views'] --- import kbnSharedUxPromptNoDataViewsObj from './kbn_shared_ux_prompt_no_data_views.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_prompt_no_data_views_mocks.mdx b/api_docs/kbn_shared_ux_prompt_no_data_views_mocks.mdx index 0ae1ea15d17665..c3f63d4bde1625 100644 --- a/api_docs/kbn_shared_ux_prompt_no_data_views_mocks.mdx +++ b/api_docs/kbn_shared_ux_prompt_no_data_views_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-prompt-no-data-views-mocks title: "@kbn/shared-ux-prompt-no-data-views-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-prompt-no-data-views-mocks plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-prompt-no-data-views-mocks'] --- import kbnSharedUxPromptNoDataViewsMocksObj from './kbn_shared_ux_prompt_no_data_views_mocks.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_prompt_not_found.mdx b/api_docs/kbn_shared_ux_prompt_not_found.mdx index 445e4f9e1a3079..4fa899f5e5b959 100644 --- a/api_docs/kbn_shared_ux_prompt_not_found.mdx +++ b/api_docs/kbn_shared_ux_prompt_not_found.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-prompt-not-found title: "@kbn/shared-ux-prompt-not-found" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-prompt-not-found plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-prompt-not-found'] --- import kbnSharedUxPromptNotFoundObj from './kbn_shared_ux_prompt_not_found.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_router.mdx b/api_docs/kbn_shared_ux_router.mdx index 1cacdb0f5c9b65..5d94d494594206 100644 --- a/api_docs/kbn_shared_ux_router.mdx +++ b/api_docs/kbn_shared_ux_router.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-router title: "@kbn/shared-ux-router" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-router plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-router'] --- import kbnSharedUxRouterObj from './kbn_shared_ux_router.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_router_mocks.mdx b/api_docs/kbn_shared_ux_router_mocks.mdx index 447660f14bebde..8d45b6c18b9ae8 100644 --- a/api_docs/kbn_shared_ux_router_mocks.mdx +++ b/api_docs/kbn_shared_ux_router_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-router-mocks title: "@kbn/shared-ux-router-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-router-mocks plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-router-mocks'] --- import kbnSharedUxRouterMocksObj from './kbn_shared_ux_router_mocks.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_storybook_config.mdx b/api_docs/kbn_shared_ux_storybook_config.mdx index 3d50c44b68d227..3ce2aadb0f9d38 100644 --- a/api_docs/kbn_shared_ux_storybook_config.mdx +++ b/api_docs/kbn_shared_ux_storybook_config.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-storybook-config title: "@kbn/shared-ux-storybook-config" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-storybook-config plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-storybook-config'] --- import kbnSharedUxStorybookConfigObj from './kbn_shared_ux_storybook_config.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_storybook_mock.mdx b/api_docs/kbn_shared_ux_storybook_mock.mdx index fd07d677e7dfc7..8346dcb0fdc107 100644 --- a/api_docs/kbn_shared_ux_storybook_mock.mdx +++ b/api_docs/kbn_shared_ux_storybook_mock.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-storybook-mock title: "@kbn/shared-ux-storybook-mock" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-storybook-mock plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-storybook-mock'] --- import kbnSharedUxStorybookMockObj from './kbn_shared_ux_storybook_mock.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_utility.mdx b/api_docs/kbn_shared_ux_utility.mdx index 26be0558b4d25c..03ac7a75c355d9 100644 --- a/api_docs/kbn_shared_ux_utility.mdx +++ b/api_docs/kbn_shared_ux_utility.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-utility title: "@kbn/shared-ux-utility" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-utility plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-utility'] --- import kbnSharedUxUtilityObj from './kbn_shared_ux_utility.devdocs.json'; diff --git a/api_docs/kbn_slo_schema.mdx b/api_docs/kbn_slo_schema.mdx index fecf089b484224..57430112addae3 100644 --- a/api_docs/kbn_slo_schema.mdx +++ b/api_docs/kbn_slo_schema.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-slo-schema title: "@kbn/slo-schema" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/slo-schema plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/slo-schema'] --- import kbnSloSchemaObj from './kbn_slo_schema.devdocs.json'; diff --git a/api_docs/kbn_some_dev_log.mdx b/api_docs/kbn_some_dev_log.mdx index b7b3c7bfd74665..86cf90fc3f26b8 100644 --- a/api_docs/kbn_some_dev_log.mdx +++ b/api_docs/kbn_some_dev_log.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-some-dev-log title: "@kbn/some-dev-log" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/some-dev-log plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/some-dev-log'] --- import kbnSomeDevLogObj from './kbn_some_dev_log.devdocs.json'; diff --git a/api_docs/kbn_std.mdx b/api_docs/kbn_std.mdx index a2415bd68e4a53..c338517e814ddb 100644 --- a/api_docs/kbn_std.mdx +++ b/api_docs/kbn_std.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-std title: "@kbn/std" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/std plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/std'] --- import kbnStdObj from './kbn_std.devdocs.json'; diff --git a/api_docs/kbn_stdio_dev_helpers.mdx b/api_docs/kbn_stdio_dev_helpers.mdx index 0197db655a982f..96e6d54bd445f1 100644 --- a/api_docs/kbn_stdio_dev_helpers.mdx +++ b/api_docs/kbn_stdio_dev_helpers.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-stdio-dev-helpers title: "@kbn/stdio-dev-helpers" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/stdio-dev-helpers plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/stdio-dev-helpers'] --- import kbnStdioDevHelpersObj from './kbn_stdio_dev_helpers.devdocs.json'; diff --git a/api_docs/kbn_storybook.mdx b/api_docs/kbn_storybook.mdx index d0a6f7b01731a7..c07d89a056b170 100644 --- a/api_docs/kbn_storybook.mdx +++ b/api_docs/kbn_storybook.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-storybook title: "@kbn/storybook" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/storybook plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/storybook'] --- import kbnStorybookObj from './kbn_storybook.devdocs.json'; diff --git a/api_docs/kbn_subscription_tracking.mdx b/api_docs/kbn_subscription_tracking.mdx index dca730034973b9..80aa75ce6f1e37 100644 --- a/api_docs/kbn_subscription_tracking.mdx +++ b/api_docs/kbn_subscription_tracking.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-subscription-tracking title: "@kbn/subscription-tracking" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/subscription-tracking plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/subscription-tracking'] --- import kbnSubscriptionTrackingObj from './kbn_subscription_tracking.devdocs.json'; diff --git a/api_docs/kbn_telemetry_tools.mdx b/api_docs/kbn_telemetry_tools.mdx index cb5b8a66efbfa3..f374f99127d05e 100644 --- a/api_docs/kbn_telemetry_tools.mdx +++ b/api_docs/kbn_telemetry_tools.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-telemetry-tools title: "@kbn/telemetry-tools" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/telemetry-tools plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/telemetry-tools'] --- import kbnTelemetryToolsObj from './kbn_telemetry_tools.devdocs.json'; diff --git a/api_docs/kbn_test.mdx b/api_docs/kbn_test.mdx index b3a092c725e5a1..edb772ade5f152 100644 --- a/api_docs/kbn_test.mdx +++ b/api_docs/kbn_test.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-test title: "@kbn/test" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/test plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/test'] --- import kbnTestObj from './kbn_test.devdocs.json'; diff --git a/api_docs/kbn_test_jest_helpers.mdx b/api_docs/kbn_test_jest_helpers.mdx index d5e9ef79376a08..7e1107392d1aca 100644 --- a/api_docs/kbn_test_jest_helpers.mdx +++ b/api_docs/kbn_test_jest_helpers.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-test-jest-helpers title: "@kbn/test-jest-helpers" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/test-jest-helpers plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/test-jest-helpers'] --- import kbnTestJestHelpersObj from './kbn_test_jest_helpers.devdocs.json'; diff --git a/api_docs/kbn_test_subj_selector.mdx b/api_docs/kbn_test_subj_selector.mdx index 7a05596e994fc5..468dbf683734ab 100644 --- a/api_docs/kbn_test_subj_selector.mdx +++ b/api_docs/kbn_test_subj_selector.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-test-subj-selector title: "@kbn/test-subj-selector" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/test-subj-selector plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/test-subj-selector'] --- import kbnTestSubjSelectorObj from './kbn_test_subj_selector.devdocs.json'; diff --git a/api_docs/kbn_text_based_editor.mdx b/api_docs/kbn_text_based_editor.mdx index 04caf48ec52742..c2adec858ffd15 100644 --- a/api_docs/kbn_text_based_editor.mdx +++ b/api_docs/kbn_text_based_editor.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-text-based-editor title: "@kbn/text-based-editor" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/text-based-editor plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/text-based-editor'] --- import kbnTextBasedEditorObj from './kbn_text_based_editor.devdocs.json'; diff --git a/api_docs/kbn_tooling_log.mdx b/api_docs/kbn_tooling_log.mdx index dae47229d56abc..da0161eb663607 100644 --- a/api_docs/kbn_tooling_log.mdx +++ b/api_docs/kbn_tooling_log.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-tooling-log title: "@kbn/tooling-log" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/tooling-log plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/tooling-log'] --- import kbnToolingLogObj from './kbn_tooling_log.devdocs.json'; diff --git a/api_docs/kbn_ts_projects.mdx b/api_docs/kbn_ts_projects.mdx index 9087efb6b28df8..3f6fb39793bebc 100644 --- a/api_docs/kbn_ts_projects.mdx +++ b/api_docs/kbn_ts_projects.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ts-projects title: "@kbn/ts-projects" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ts-projects plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ts-projects'] --- import kbnTsProjectsObj from './kbn_ts_projects.devdocs.json'; diff --git a/api_docs/kbn_typed_react_router_config.mdx b/api_docs/kbn_typed_react_router_config.mdx index f804e62a19d707..17f74b6afefa2c 100644 --- a/api_docs/kbn_typed_react_router_config.mdx +++ b/api_docs/kbn_typed_react_router_config.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-typed-react-router-config title: "@kbn/typed-react-router-config" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/typed-react-router-config plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/typed-react-router-config'] --- import kbnTypedReactRouterConfigObj from './kbn_typed_react_router_config.devdocs.json'; diff --git a/api_docs/kbn_ui_actions_browser.mdx b/api_docs/kbn_ui_actions_browser.mdx index b763d9bad9eae0..9595562a5e7310 100644 --- a/api_docs/kbn_ui_actions_browser.mdx +++ b/api_docs/kbn_ui_actions_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ui-actions-browser title: "@kbn/ui-actions-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ui-actions-browser plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ui-actions-browser'] --- import kbnUiActionsBrowserObj from './kbn_ui_actions_browser.devdocs.json'; diff --git a/api_docs/kbn_ui_shared_deps_src.devdocs.json b/api_docs/kbn_ui_shared_deps_src.devdocs.json index 6dc5639e2e27ab..3a9e249b17a586 100644 --- a/api_docs/kbn_ui_shared_deps_src.devdocs.json +++ b/api_docs/kbn_ui_shared_deps_src.devdocs.json @@ -568,6 +568,17 @@ "deprecated": false, "trackAdoption": false }, + { + "parentPluginId": "@kbn/ui-shared-deps-src", + "id": "def-common.externals.kbnshareduxerrorboundary", + "type": "string", + "tags": [], + "label": "'@kbn/shared-ux-error-boundary'", + "description": [], + "path": "packages/kbn-ui-shared-deps-src/src/definitions.js", + "deprecated": false, + "trackAdoption": false + }, { "parentPluginId": "@kbn/ui-shared-deps-src", "id": "def-common.externals.kbnrison", diff --git a/api_docs/kbn_ui_shared_deps_src.mdx b/api_docs/kbn_ui_shared_deps_src.mdx index a29b41c67890c7..fdf142a21ec7cc 100644 --- a/api_docs/kbn_ui_shared_deps_src.mdx +++ b/api_docs/kbn_ui_shared_deps_src.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ui-shared-deps-src title: "@kbn/ui-shared-deps-src" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ui-shared-deps-src plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ui-shared-deps-src'] --- import kbnUiSharedDepsSrcObj from './kbn_ui_shared_deps_src.devdocs.json'; @@ -21,7 +21,7 @@ Contact [@elastic/kibana-operations](https://github.com/orgs/elastic/teams/kiban | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 52 | 0 | 43 | 0 | +| 53 | 0 | 44 | 0 | ## Common diff --git a/api_docs/kbn_ui_theme.mdx b/api_docs/kbn_ui_theme.mdx index d38e5e0e78f4b2..1e4143ecb6e9f1 100644 --- a/api_docs/kbn_ui_theme.mdx +++ b/api_docs/kbn_ui_theme.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ui-theme title: "@kbn/ui-theme" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ui-theme plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ui-theme'] --- import kbnUiThemeObj from './kbn_ui_theme.devdocs.json'; diff --git a/api_docs/kbn_unified_data_table.mdx b/api_docs/kbn_unified_data_table.mdx index 847b90503f83eb..df0208ff3b80a1 100644 --- a/api_docs/kbn_unified_data_table.mdx +++ b/api_docs/kbn_unified_data_table.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-unified-data-table title: "@kbn/unified-data-table" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/unified-data-table plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/unified-data-table'] --- import kbnUnifiedDataTableObj from './kbn_unified_data_table.devdocs.json'; diff --git a/api_docs/kbn_unified_doc_viewer.mdx b/api_docs/kbn_unified_doc_viewer.mdx index c70e2d02ce0173..9b62de8d62cb73 100644 --- a/api_docs/kbn_unified_doc_viewer.mdx +++ b/api_docs/kbn_unified_doc_viewer.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-unified-doc-viewer title: "@kbn/unified-doc-viewer" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/unified-doc-viewer plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/unified-doc-viewer'] --- import kbnUnifiedDocViewerObj from './kbn_unified_doc_viewer.devdocs.json'; diff --git a/api_docs/kbn_unified_field_list.mdx b/api_docs/kbn_unified_field_list.mdx index 24a8ae6ece950f..5e0921e95186de 100644 --- a/api_docs/kbn_unified_field_list.mdx +++ b/api_docs/kbn_unified_field_list.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-unified-field-list title: "@kbn/unified-field-list" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/unified-field-list plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/unified-field-list'] --- import kbnUnifiedFieldListObj from './kbn_unified_field_list.devdocs.json'; diff --git a/api_docs/kbn_url_state.mdx b/api_docs/kbn_url_state.mdx index 3cf7778236b09a..7865daa0824f8f 100644 --- a/api_docs/kbn_url_state.mdx +++ b/api_docs/kbn_url_state.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-url-state title: "@kbn/url-state" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/url-state plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/url-state'] --- import kbnUrlStateObj from './kbn_url_state.devdocs.json'; diff --git a/api_docs/kbn_use_tracked_promise.mdx b/api_docs/kbn_use_tracked_promise.mdx index 5df6b1eb50ac5c..1b4708295fc9f9 100644 --- a/api_docs/kbn_use_tracked_promise.mdx +++ b/api_docs/kbn_use_tracked_promise.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-use-tracked-promise title: "@kbn/use-tracked-promise" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/use-tracked-promise plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/use-tracked-promise'] --- import kbnUseTrackedPromiseObj from './kbn_use_tracked_promise.devdocs.json'; diff --git a/api_docs/kbn_user_profile_components.mdx b/api_docs/kbn_user_profile_components.mdx index 10e64135fe7884..1022e8e47b725a 100644 --- a/api_docs/kbn_user_profile_components.mdx +++ b/api_docs/kbn_user_profile_components.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-user-profile-components title: "@kbn/user-profile-components" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/user-profile-components plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/user-profile-components'] --- import kbnUserProfileComponentsObj from './kbn_user_profile_components.devdocs.json'; diff --git a/api_docs/kbn_utility_types.mdx b/api_docs/kbn_utility_types.mdx index a6e10f03ff4fb4..5b4eedfe684dcd 100644 --- a/api_docs/kbn_utility_types.mdx +++ b/api_docs/kbn_utility_types.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-utility-types title: "@kbn/utility-types" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/utility-types plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/utility-types'] --- import kbnUtilityTypesObj from './kbn_utility_types.devdocs.json'; diff --git a/api_docs/kbn_utility_types_jest.mdx b/api_docs/kbn_utility_types_jest.mdx index bb3fb19e6df9cc..265896b0787faa 100644 --- a/api_docs/kbn_utility_types_jest.mdx +++ b/api_docs/kbn_utility_types_jest.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-utility-types-jest title: "@kbn/utility-types-jest" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/utility-types-jest plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/utility-types-jest'] --- import kbnUtilityTypesJestObj from './kbn_utility_types_jest.devdocs.json'; diff --git a/api_docs/kbn_utils.mdx b/api_docs/kbn_utils.mdx index e47f890610aad6..10f97a56452ffa 100644 --- a/api_docs/kbn_utils.mdx +++ b/api_docs/kbn_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-utils title: "@kbn/utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/utils plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/utils'] --- import kbnUtilsObj from './kbn_utils.devdocs.json'; diff --git a/api_docs/kbn_visualization_ui_components.mdx b/api_docs/kbn_visualization_ui_components.mdx index f6000c37fa86c2..046000c4c011d4 100644 --- a/api_docs/kbn_visualization_ui_components.mdx +++ b/api_docs/kbn_visualization_ui_components.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-visualization-ui-components title: "@kbn/visualization-ui-components" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/visualization-ui-components plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/visualization-ui-components'] --- import kbnVisualizationUiComponentsObj from './kbn_visualization_ui_components.devdocs.json'; diff --git a/api_docs/kbn_xstate_utils.mdx b/api_docs/kbn_xstate_utils.mdx index 98cf87b55d8854..1b66a0ccc2c015 100644 --- a/api_docs/kbn_xstate_utils.mdx +++ b/api_docs/kbn_xstate_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-xstate-utils title: "@kbn/xstate-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/xstate-utils plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/xstate-utils'] --- import kbnXstateUtilsObj from './kbn_xstate_utils.devdocs.json'; diff --git a/api_docs/kbn_yarn_lock_validator.mdx b/api_docs/kbn_yarn_lock_validator.mdx index 9cabc711c5cf96..012b7dd0b3165f 100644 --- a/api_docs/kbn_yarn_lock_validator.mdx +++ b/api_docs/kbn_yarn_lock_validator.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-yarn-lock-validator title: "@kbn/yarn-lock-validator" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/yarn-lock-validator plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/yarn-lock-validator'] --- import kbnYarnLockValidatorObj from './kbn_yarn_lock_validator.devdocs.json'; diff --git a/api_docs/kibana_overview.mdx b/api_docs/kibana_overview.mdx index 00c23ae75b474a..fed21366b52aa4 100644 --- a/api_docs/kibana_overview.mdx +++ b/api_docs/kibana_overview.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kibanaOverview title: "kibanaOverview" image: https://source.unsplash.com/400x175/?github description: API docs for the kibanaOverview plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'kibanaOverview'] --- import kibanaOverviewObj from './kibana_overview.devdocs.json'; diff --git a/api_docs/kibana_react.mdx b/api_docs/kibana_react.mdx index 38e5aa4c353204..54ffbf69d8b60a 100644 --- a/api_docs/kibana_react.mdx +++ b/api_docs/kibana_react.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kibanaReact title: "kibanaReact" image: https://source.unsplash.com/400x175/?github description: API docs for the kibanaReact plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'kibanaReact'] --- import kibanaReactObj from './kibana_react.devdocs.json'; diff --git a/api_docs/kibana_utils.mdx b/api_docs/kibana_utils.mdx index fdb4497695b8da..85de578bd3267f 100644 --- a/api_docs/kibana_utils.mdx +++ b/api_docs/kibana_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kibanaUtils title: "kibanaUtils" image: https://source.unsplash.com/400x175/?github description: API docs for the kibanaUtils plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'kibanaUtils'] --- import kibanaUtilsObj from './kibana_utils.devdocs.json'; diff --git a/api_docs/kubernetes_security.mdx b/api_docs/kubernetes_security.mdx index 64985c7cd7e036..6d59b7c3f534ee 100644 --- a/api_docs/kubernetes_security.mdx +++ b/api_docs/kubernetes_security.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kubernetesSecurity title: "kubernetesSecurity" image: https://source.unsplash.com/400x175/?github description: API docs for the kubernetesSecurity plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'kubernetesSecurity'] --- import kubernetesSecurityObj from './kubernetes_security.devdocs.json'; diff --git a/api_docs/lens.mdx b/api_docs/lens.mdx index c4e0ce007ae155..20e3e0bc91c2b5 100644 --- a/api_docs/lens.mdx +++ b/api_docs/lens.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/lens title: "lens" image: https://source.unsplash.com/400x175/?github description: API docs for the lens plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'lens'] --- import lensObj from './lens.devdocs.json'; diff --git a/api_docs/license_api_guard.mdx b/api_docs/license_api_guard.mdx index 3ec862ae736e72..62c86b8fbedcf0 100644 --- a/api_docs/license_api_guard.mdx +++ b/api_docs/license_api_guard.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/licenseApiGuard title: "licenseApiGuard" image: https://source.unsplash.com/400x175/?github description: API docs for the licenseApiGuard plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'licenseApiGuard'] --- import licenseApiGuardObj from './license_api_guard.devdocs.json'; diff --git a/api_docs/license_management.mdx b/api_docs/license_management.mdx index 3c3801e21a7807..f002efd18c17dd 100644 --- a/api_docs/license_management.mdx +++ b/api_docs/license_management.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/licenseManagement title: "licenseManagement" image: https://source.unsplash.com/400x175/?github description: API docs for the licenseManagement plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'licenseManagement'] --- import licenseManagementObj from './license_management.devdocs.json'; diff --git a/api_docs/licensing.mdx b/api_docs/licensing.mdx index 75474d5572f036..b933d9fb1defe3 100644 --- a/api_docs/licensing.mdx +++ b/api_docs/licensing.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/licensing title: "licensing" image: https://source.unsplash.com/400x175/?github description: API docs for the licensing plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'licensing'] --- import licensingObj from './licensing.devdocs.json'; diff --git a/api_docs/links.devdocs.json b/api_docs/links.devdocs.json index cc1231167caeda..d688e23b9f1594 100644 --- a/api_docs/links.devdocs.json +++ b/api_docs/links.devdocs.json @@ -337,6 +337,38 @@ ], "returnComment": [] }, + { + "parentPluginId": "links", + "id": "def-public.LinksEmbeddable.onRender", + "type": "Function", + "tags": [], + "label": "onRender", + "description": [], + "signature": [ + "() => void" + ], + "path": "src/plugins/links/public/embeddable/links_embeddable.tsx", + "deprecated": false, + "trackAdoption": false, + "children": [], + "returnComment": [] + }, + { + "parentPluginId": "links", + "id": "def-public.LinksEmbeddable.onLoading", + "type": "Function", + "tags": [], + "label": "onLoading", + "description": [], + "signature": [ + "() => void" + ], + "path": "src/plugins/links/public/embeddable/links_embeddable.tsx", + "deprecated": false, + "trackAdoption": false, + "children": [], + "returnComment": [] + }, { "parentPluginId": "links", "id": "def-public.LinksEmbeddable.inputIsRefType", @@ -476,12 +508,28 @@ "label": "render", "description": [], "signature": [ - "() => JSX.Element | undefined" + "(domNode: HTMLElement) => JSX.Element | undefined" ], "path": "src/plugins/links/public/embeddable/links_embeddable.tsx", "deprecated": false, "trackAdoption": false, - "children": [], + "children": [ + { + "parentPluginId": "links", + "id": "def-public.LinksEmbeddable.render.$1", + "type": "Object", + "tags": [], + "label": "domNode", + "description": [], + "signature": [ + "HTMLElement" + ], + "path": "src/plugins/links/public/embeddable/links_embeddable.tsx", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + } + ], "returnComment": [] } ], diff --git a/api_docs/links.mdx b/api_docs/links.mdx index 2d2e9e37f50ca1..18968bebb20ef7 100644 --- a/api_docs/links.mdx +++ b/api_docs/links.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/links title: "links" image: https://source.unsplash.com/400x175/?github description: API docs for the links plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'links'] --- import linksObj from './links.devdocs.json'; @@ -21,7 +21,7 @@ Contact [@elastic/kibana-presentation](https://github.com/orgs/elastic/teams/kib | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 61 | 0 | 59 | 7 | +| 64 | 0 | 62 | 7 | ## Client diff --git a/api_docs/lists.mdx b/api_docs/lists.mdx index ebff21b39ef40f..1ce542d651beee 100644 --- a/api_docs/lists.mdx +++ b/api_docs/lists.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/lists title: "lists" image: https://source.unsplash.com/400x175/?github description: API docs for the lists plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'lists'] --- import listsObj from './lists.devdocs.json'; diff --git a/api_docs/log_explorer.mdx b/api_docs/log_explorer.mdx index 2588ffac2659b6..36418972cfb9ee 100644 --- a/api_docs/log_explorer.mdx +++ b/api_docs/log_explorer.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/logExplorer title: "logExplorer" image: https://source.unsplash.com/400x175/?github description: API docs for the logExplorer plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'logExplorer'] --- import logExplorerObj from './log_explorer.devdocs.json'; diff --git a/api_docs/logs_shared.mdx b/api_docs/logs_shared.mdx index 7a5adbe3e0f606..54e533385b36aa 100644 --- a/api_docs/logs_shared.mdx +++ b/api_docs/logs_shared.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/logsShared title: "logsShared" image: https://source.unsplash.com/400x175/?github description: API docs for the logsShared plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'logsShared'] --- import logsSharedObj from './logs_shared.devdocs.json'; diff --git a/api_docs/management.mdx b/api_docs/management.mdx index 98656bdcb601d3..6ff62c92f1304f 100644 --- a/api_docs/management.mdx +++ b/api_docs/management.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/management title: "management" image: https://source.unsplash.com/400x175/?github description: API docs for the management plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'management'] --- import managementObj from './management.devdocs.json'; diff --git a/api_docs/maps.mdx b/api_docs/maps.mdx index a85df89face1c4..a17a14f1890d8e 100644 --- a/api_docs/maps.mdx +++ b/api_docs/maps.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/maps title: "maps" image: https://source.unsplash.com/400x175/?github description: API docs for the maps plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'maps'] --- import mapsObj from './maps.devdocs.json'; diff --git a/api_docs/maps_ems.mdx b/api_docs/maps_ems.mdx index cf79d394876e42..1eeded5a31f4f1 100644 --- a/api_docs/maps_ems.mdx +++ b/api_docs/maps_ems.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/mapsEms title: "mapsEms" image: https://source.unsplash.com/400x175/?github description: API docs for the mapsEms plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'mapsEms'] --- import mapsEmsObj from './maps_ems.devdocs.json'; diff --git a/api_docs/metrics_data_access.mdx b/api_docs/metrics_data_access.mdx index 5ec8b18559f5e2..f1090fba0c61a0 100644 --- a/api_docs/metrics_data_access.mdx +++ b/api_docs/metrics_data_access.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/metricsDataAccess title: "metricsDataAccess" image: https://source.unsplash.com/400x175/?github description: API docs for the metricsDataAccess plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'metricsDataAccess'] --- import metricsDataAccessObj from './metrics_data_access.devdocs.json'; diff --git a/api_docs/ml.mdx b/api_docs/ml.mdx index 30a1455fecd615..6d2330a446d4d3 100644 --- a/api_docs/ml.mdx +++ b/api_docs/ml.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/ml title: "ml" image: https://source.unsplash.com/400x175/?github description: API docs for the ml plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'ml'] --- import mlObj from './ml.devdocs.json'; diff --git a/api_docs/monitoring.mdx b/api_docs/monitoring.mdx index 02277b6d14caf5..5b4d00ce3c7644 100644 --- a/api_docs/monitoring.mdx +++ b/api_docs/monitoring.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/monitoring title: "monitoring" image: https://source.unsplash.com/400x175/?github description: API docs for the monitoring plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'monitoring'] --- import monitoringObj from './monitoring.devdocs.json'; diff --git a/api_docs/monitoring_collection.mdx b/api_docs/monitoring_collection.mdx index 45e7dcae75e588..58c98e40852d26 100644 --- a/api_docs/monitoring_collection.mdx +++ b/api_docs/monitoring_collection.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/monitoringCollection title: "monitoringCollection" image: https://source.unsplash.com/400x175/?github description: API docs for the monitoringCollection plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'monitoringCollection'] --- import monitoringCollectionObj from './monitoring_collection.devdocs.json'; diff --git a/api_docs/navigation.mdx b/api_docs/navigation.mdx index 926f1686e1fdbf..b28c8aebe07bdc 100644 --- a/api_docs/navigation.mdx +++ b/api_docs/navigation.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/navigation title: "navigation" image: https://source.unsplash.com/400x175/?github description: API docs for the navigation plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'navigation'] --- import navigationObj from './navigation.devdocs.json'; diff --git a/api_docs/newsfeed.mdx b/api_docs/newsfeed.mdx index 982a174409652c..19f1bea8c9f41d 100644 --- a/api_docs/newsfeed.mdx +++ b/api_docs/newsfeed.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/newsfeed title: "newsfeed" image: https://source.unsplash.com/400x175/?github description: API docs for the newsfeed plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'newsfeed'] --- import newsfeedObj from './newsfeed.devdocs.json'; diff --git a/api_docs/no_data_page.mdx b/api_docs/no_data_page.mdx index 1ea541d60e4b20..14b096eabbe9ad 100644 --- a/api_docs/no_data_page.mdx +++ b/api_docs/no_data_page.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/noDataPage title: "noDataPage" image: https://source.unsplash.com/400x175/?github description: API docs for the noDataPage plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'noDataPage'] --- import noDataPageObj from './no_data_page.devdocs.json'; diff --git a/api_docs/notifications.mdx b/api_docs/notifications.mdx index 5ea860aa4975f7..f22b048abb4b05 100644 --- a/api_docs/notifications.mdx +++ b/api_docs/notifications.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/notifications title: "notifications" image: https://source.unsplash.com/400x175/?github description: API docs for the notifications plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'notifications'] --- import notificationsObj from './notifications.devdocs.json'; diff --git a/api_docs/observability.mdx b/api_docs/observability.mdx index 092c1aaef8724c..b148108759a834 100644 --- a/api_docs/observability.mdx +++ b/api_docs/observability.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/observability title: "observability" image: https://source.unsplash.com/400x175/?github description: API docs for the observability plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'observability'] --- import observabilityObj from './observability.devdocs.json'; diff --git a/api_docs/observability_a_i_assistant.mdx b/api_docs/observability_a_i_assistant.mdx index 491cad6e27b867..fe2000922460f4 100644 --- a/api_docs/observability_a_i_assistant.mdx +++ b/api_docs/observability_a_i_assistant.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/observabilityAIAssistant title: "observabilityAIAssistant" image: https://source.unsplash.com/400x175/?github description: API docs for the observabilityAIAssistant plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'observabilityAIAssistant'] --- import observabilityAIAssistantObj from './observability_a_i_assistant.devdocs.json'; diff --git a/api_docs/observability_log_explorer.mdx b/api_docs/observability_log_explorer.mdx index 9f1ac1046b1377..03d4a6345d4e2d 100644 --- a/api_docs/observability_log_explorer.mdx +++ b/api_docs/observability_log_explorer.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/observabilityLogExplorer title: "observabilityLogExplorer" image: https://source.unsplash.com/400x175/?github description: API docs for the observabilityLogExplorer plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'observabilityLogExplorer'] --- import observabilityLogExplorerObj from './observability_log_explorer.devdocs.json'; diff --git a/api_docs/observability_onboarding.mdx b/api_docs/observability_onboarding.mdx index 439a9f03ae715e..9b0d5811e409b1 100644 --- a/api_docs/observability_onboarding.mdx +++ b/api_docs/observability_onboarding.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/observabilityOnboarding title: "observabilityOnboarding" image: https://source.unsplash.com/400x175/?github description: API docs for the observabilityOnboarding plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'observabilityOnboarding'] --- import observabilityOnboardingObj from './observability_onboarding.devdocs.json'; diff --git a/api_docs/observability_shared.mdx b/api_docs/observability_shared.mdx index 589c9c38ed5cc1..289621545d18e8 100644 --- a/api_docs/observability_shared.mdx +++ b/api_docs/observability_shared.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/observabilityShared title: "observabilityShared" image: https://source.unsplash.com/400x175/?github description: API docs for the observabilityShared plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'observabilityShared'] --- import observabilitySharedObj from './observability_shared.devdocs.json'; diff --git a/api_docs/osquery.mdx b/api_docs/osquery.mdx index 215eebc0152ff6..9184648b20f9e9 100644 --- a/api_docs/osquery.mdx +++ b/api_docs/osquery.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/osquery title: "osquery" image: https://source.unsplash.com/400x175/?github description: API docs for the osquery plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'osquery'] --- import osqueryObj from './osquery.devdocs.json'; diff --git a/api_docs/painless_lab.mdx b/api_docs/painless_lab.mdx index f125748b1a3973..1a7b76653c4e8b 100644 --- a/api_docs/painless_lab.mdx +++ b/api_docs/painless_lab.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/painlessLab title: "painlessLab" image: https://source.unsplash.com/400x175/?github description: API docs for the painlessLab plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'painlessLab'] --- import painlessLabObj from './painless_lab.devdocs.json'; diff --git a/api_docs/plugin_directory.mdx b/api_docs/plugin_directory.mdx index 986affadc9d887..55bff1b35d512b 100644 --- a/api_docs/plugin_directory.mdx +++ b/api_docs/plugin_directory.mdx @@ -7,7 +7,7 @@ id: kibDevDocsPluginDirectory slug: /kibana-dev-docs/api-meta/plugin-api-directory title: Directory description: Directory of public APIs available through plugins or packages. -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana'] --- @@ -15,13 +15,13 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | Count | Plugins or Packages with a
public API | Number of teams | |--------------|----------|------------------------| -| 701 | 591 | 40 | +| 702 | 592 | 40 | ### Public API health stats | API Count | Any Count | Missing comments | Missing exports | |--------------|----------|-----------------|--------| -| 75864 | 224 | 64862 | 1587 | +| 75870 | 224 | 64865 | 1587 | ## Plugin Directory @@ -30,7 +30,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [@elastic/response-ops](https://github.com/orgs/elastic/teams/response-ops) | - | 269 | 0 | 263 | 31 | | | [@elastic/appex-sharedux @elastic/platform-deployment-management](https://github.com/orgs/elastic/teams/appex-sharedux ) | - | 17 | 1 | 15 | 2 | | | [@elastic/ml-ui](https://github.com/orgs/elastic/teams/ml-ui) | AIOps plugin maintained by ML team. | 67 | 1 | 4 | 1 | -| | [@elastic/response-ops](https://github.com/orgs/elastic/teams/response-ops) | - | 807 | 1 | 776 | 50 | +| | [@elastic/response-ops](https://github.com/orgs/elastic/teams/response-ops) | - | 809 | 1 | 778 | 50 | | | [@elastic/apm-ui](https://github.com/orgs/elastic/teams/apm-ui) | The user interface for Elastic APM | 29 | 0 | 29 | 120 | | | [@elastic/apm-ui](https://github.com/orgs/elastic/teams/apm-ui) | - | 9 | 0 | 9 | 0 | | | [@elastic/infra-monitoring-ui](https://github.com/orgs/elastic/teams/infra-monitoring-ui) | Asset manager plugin for entity assets (inventory, topology, etc) | 9 | 0 | 9 | 2 | @@ -56,7 +56,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [@elastic/fleet](https://github.com/orgs/elastic/teams/fleet) | Add custom data integrations so they can be displayed in the Fleet integrations app | 268 | 0 | 249 | 1 | | | [@elastic/kibana-presentation](https://github.com/orgs/elastic/teams/kibana-presentation) | Adds the Dashboard app to Kibana | 109 | 0 | 106 | 11 | | | [@elastic/kibana-presentation](https://github.com/orgs/elastic/teams/kibana-presentation) | - | 54 | 0 | 51 | 0 | -| | [@elastic/kibana-visualizations](https://github.com/orgs/elastic/teams/kibana-visualizations) | Data services are useful for searching and querying data from Elasticsearch. Helpful utilities include: a re-usable react query bar, KQL autocomplete, async search, Data Views (Index Patterns) and field formatters. | 3194 | 33 | 2545 | 22 | +| | [@elastic/kibana-visualizations](https://github.com/orgs/elastic/teams/kibana-visualizations) | Data services are useful for searching and querying data from Elasticsearch. Helpful utilities include: a re-usable react query bar, KQL autocomplete, async search, Data Views (Index Patterns) and field formatters. | 3186 | 33 | 2537 | 22 | | | [@elastic/kibana-data-discovery](https://github.com/orgs/elastic/teams/kibana-data-discovery) | This plugin provides the ability to create data views via a modal flyout inside Kibana apps | 35 | 0 | 25 | 5 | | | [@elastic/kibana-data-discovery](https://github.com/orgs/elastic/teams/kibana-data-discovery) | Reusable data view field editor across Kibana | 72 | 0 | 33 | 0 | | | [@elastic/kibana-data-discovery](https://github.com/orgs/elastic/teams/kibana-data-discovery) | Data view management app | 2 | 0 | 2 | 0 | @@ -121,7 +121,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [@elastic/platform-deployment-management](https://github.com/orgs/elastic/teams/platform-deployment-management) | - | 8 | 0 | 8 | 0 | | | [@elastic/platform-deployment-management](https://github.com/orgs/elastic/teams/platform-deployment-management) | - | 4 | 0 | 4 | 1 | | | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 117 | 0 | 42 | 10 | -| | [@elastic/kibana-presentation](https://github.com/orgs/elastic/teams/kibana-presentation) | A dashboard panel for creating links to dashboards or external links. | 61 | 0 | 59 | 7 | +| | [@elastic/kibana-presentation](https://github.com/orgs/elastic/teams/kibana-presentation) | A dashboard panel for creating links to dashboards or external links. | 64 | 0 | 62 | 7 | | | [@elastic/security-detection-engine](https://github.com/orgs/elastic/teams/security-detection-engine) | - | 224 | 0 | 96 | 51 | | | [@elastic/infra-monitoring-ui](https://github.com/orgs/elastic/teams/infra-monitoring-ui) | This plugin provides a LogExplorer component using the Discover customization framework, offering several affordances specifically designed for log consumption. | 22 | 0 | 22 | 7 | | | [@elastic/infra-monitoring-ui](https://github.com/orgs/elastic/teams/infra-monitoring-ui) | Exposes the shared components and APIs to access and visualize logs. | 269 | 10 | 256 | 27 | @@ -276,7 +276,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 5 | 0 | 0 | 0 | | | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 16 | 0 | 7 | 0 | | | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 6 | 0 | 6 | 0 | -| | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | - | 163 | 0 | 69 | 0 | +| | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | - | 164 | 0 | 70 | 0 | | | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | - | 3 | 0 | 3 | 0 | | | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 4 | 0 | 4 | 0 | | | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | - | 8 | 0 | 8 | 0 | @@ -424,9 +424,9 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [@elastic/ml-ui](https://github.com/orgs/elastic/teams/ml-ui) | - | 3 | 0 | 3 | 0 | | | [@elastic/apm-ui](https://github.com/orgs/elastic/teams/apm-ui) | - | 26 | 0 | 16 | 0 | | | [@elastic/enterprise-search-frontend](https://github.com/orgs/elastic/teams/enterprise-search-frontend) | - | 4 | 0 | 4 | 0 | -| | [@elastic/kibana-data-discovery](https://github.com/orgs/elastic/teams/kibana-data-discovery) | - | 7 | 0 | 7 | 0 | -| | [@elastic/platform-deployment-management](https://github.com/orgs/elastic/teams/platform-deployment-management) | - | 7 | 0 | 7 | 0 | -| | [@elastic/platform-deployment-management](https://github.com/orgs/elastic/teams/platform-deployment-management) | - | 7 | 0 | 7 | 0 | +| | [@elastic/kibana-data-discovery](https://github.com/orgs/elastic/teams/kibana-data-discovery) | - | 8 | 0 | 8 | 0 | +| | [@elastic/platform-deployment-management](https://github.com/orgs/elastic/teams/platform-deployment-management) | - | 8 | 0 | 8 | 0 | +| | [@elastic/platform-deployment-management](https://github.com/orgs/elastic/teams/platform-deployment-management) | - | 8 | 0 | 8 | 0 | | | [@elastic/ml-ui](https://github.com/orgs/elastic/teams/ml-ui) | - | 7 | 0 | 7 | 0 | | | [@elastic/kibana-operations](https://github.com/orgs/elastic/teams/kibana-operations) | - | 9 | 1 | 9 | 0 | | | [@elastic/kibana-operations](https://github.com/orgs/elastic/teams/kibana-operations) | - | 102 | 0 | 86 | 0 | @@ -587,6 +587,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | - | 10 | 0 | 4 | 0 | | | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | - | 32 | 0 | 28 | 0 | | | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | - | 60 | 0 | 48 | 4 | +| | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | - | 4 | 0 | 1 | 0 | | | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | - | 5 | 0 | 4 | 0 | | | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | - | 3 | 0 | 2 | 0 | | | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | - | 2 | 0 | 2 | 0 | @@ -633,7 +634,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [@elastic/kibana-operations](https://github.com/orgs/elastic/teams/kibana-operations) | - | 39 | 0 | 25 | 1 | | | [@elastic/apm-ui](https://github.com/orgs/elastic/teams/apm-ui) | - | 86 | 0 | 86 | 1 | | | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | - | 49 | 0 | 35 | 0 | -| | [@elastic/kibana-operations](https://github.com/orgs/elastic/teams/kibana-operations) | - | 52 | 0 | 43 | 0 | +| | [@elastic/kibana-operations](https://github.com/orgs/elastic/teams/kibana-operations) | - | 53 | 0 | 44 | 0 | | | [@elastic/kibana-operations](https://github.com/orgs/elastic/teams/kibana-operations) | - | 7 | 0 | 6 | 0 | | | [@elastic/kibana-data-discovery](https://github.com/orgs/elastic/teams/kibana-data-discovery) | Contains functionality for the unified data table which can be integrated into apps | 109 | 0 | 49 | 1 | | | [@elastic/kibana-data-discovery](https://github.com/orgs/elastic/teams/kibana-data-discovery) | - | 10 | 0 | 7 | 6 | diff --git a/api_docs/presentation_util.mdx b/api_docs/presentation_util.mdx index 73b314276f8656..8f4894036f8def 100644 --- a/api_docs/presentation_util.mdx +++ b/api_docs/presentation_util.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/presentationUtil title: "presentationUtil" image: https://source.unsplash.com/400x175/?github description: API docs for the presentationUtil plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'presentationUtil'] --- import presentationUtilObj from './presentation_util.devdocs.json'; diff --git a/api_docs/profiling.mdx b/api_docs/profiling.mdx index ba2a6a32c593e9..43ae0933fbbd78 100644 --- a/api_docs/profiling.mdx +++ b/api_docs/profiling.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/profiling title: "profiling" image: https://source.unsplash.com/400x175/?github description: API docs for the profiling plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'profiling'] --- import profilingObj from './profiling.devdocs.json'; diff --git a/api_docs/profiling_data_access.mdx b/api_docs/profiling_data_access.mdx index f21b2d72174a0e..543110c59da024 100644 --- a/api_docs/profiling_data_access.mdx +++ b/api_docs/profiling_data_access.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/profilingDataAccess title: "profilingDataAccess" image: https://source.unsplash.com/400x175/?github description: API docs for the profilingDataAccess plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'profilingDataAccess'] --- import profilingDataAccessObj from './profiling_data_access.devdocs.json'; diff --git a/api_docs/remote_clusters.mdx b/api_docs/remote_clusters.mdx index 86cad9f59ab176..525624677f7c7e 100644 --- a/api_docs/remote_clusters.mdx +++ b/api_docs/remote_clusters.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/remoteClusters title: "remoteClusters" image: https://source.unsplash.com/400x175/?github description: API docs for the remoteClusters plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'remoteClusters'] --- import remoteClustersObj from './remote_clusters.devdocs.json'; diff --git a/api_docs/reporting.mdx b/api_docs/reporting.mdx index 3c62f101fa268f..efca602bdfccda 100644 --- a/api_docs/reporting.mdx +++ b/api_docs/reporting.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/reporting title: "reporting" image: https://source.unsplash.com/400x175/?github description: API docs for the reporting plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'reporting'] --- import reportingObj from './reporting.devdocs.json'; diff --git a/api_docs/rollup.mdx b/api_docs/rollup.mdx index 30f2a3f191bf45..60017a794a4e14 100644 --- a/api_docs/rollup.mdx +++ b/api_docs/rollup.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/rollup title: "rollup" image: https://source.unsplash.com/400x175/?github description: API docs for the rollup plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'rollup'] --- import rollupObj from './rollup.devdocs.json'; diff --git a/api_docs/rule_registry.mdx b/api_docs/rule_registry.mdx index e349de870d2b34..2f70a303e06a62 100644 --- a/api_docs/rule_registry.mdx +++ b/api_docs/rule_registry.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/ruleRegistry title: "ruleRegistry" image: https://source.unsplash.com/400x175/?github description: API docs for the ruleRegistry plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'ruleRegistry'] --- import ruleRegistryObj from './rule_registry.devdocs.json'; diff --git a/api_docs/runtime_fields.mdx b/api_docs/runtime_fields.mdx index e58304f970f867..d8b1fd0b6d9c5b 100644 --- a/api_docs/runtime_fields.mdx +++ b/api_docs/runtime_fields.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/runtimeFields title: "runtimeFields" image: https://source.unsplash.com/400x175/?github description: API docs for the runtimeFields plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'runtimeFields'] --- import runtimeFieldsObj from './runtime_fields.devdocs.json'; diff --git a/api_docs/saved_objects.mdx b/api_docs/saved_objects.mdx index 7df7faa53b3ebf..92071785aea01a 100644 --- a/api_docs/saved_objects.mdx +++ b/api_docs/saved_objects.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/savedObjects title: "savedObjects" image: https://source.unsplash.com/400x175/?github description: API docs for the savedObjects plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'savedObjects'] --- import savedObjectsObj from './saved_objects.devdocs.json'; diff --git a/api_docs/saved_objects_finder.mdx b/api_docs/saved_objects_finder.mdx index 504f2d1c29670c..71f77719101f08 100644 --- a/api_docs/saved_objects_finder.mdx +++ b/api_docs/saved_objects_finder.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/savedObjectsFinder title: "savedObjectsFinder" image: https://source.unsplash.com/400x175/?github description: API docs for the savedObjectsFinder plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'savedObjectsFinder'] --- import savedObjectsFinderObj from './saved_objects_finder.devdocs.json'; diff --git a/api_docs/saved_objects_management.mdx b/api_docs/saved_objects_management.mdx index e19d1d46143481..1299ca15e354c5 100644 --- a/api_docs/saved_objects_management.mdx +++ b/api_docs/saved_objects_management.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/savedObjectsManagement title: "savedObjectsManagement" image: https://source.unsplash.com/400x175/?github description: API docs for the savedObjectsManagement plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'savedObjectsManagement'] --- import savedObjectsManagementObj from './saved_objects_management.devdocs.json'; diff --git a/api_docs/saved_objects_tagging.mdx b/api_docs/saved_objects_tagging.mdx index abde6dbb38f907..a9cfb2eca2315c 100644 --- a/api_docs/saved_objects_tagging.mdx +++ b/api_docs/saved_objects_tagging.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/savedObjectsTagging title: "savedObjectsTagging" image: https://source.unsplash.com/400x175/?github description: API docs for the savedObjectsTagging plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'savedObjectsTagging'] --- import savedObjectsTaggingObj from './saved_objects_tagging.devdocs.json'; diff --git a/api_docs/saved_objects_tagging_oss.mdx b/api_docs/saved_objects_tagging_oss.mdx index 18fab2e425ae6a..c8790433a32a3c 100644 --- a/api_docs/saved_objects_tagging_oss.mdx +++ b/api_docs/saved_objects_tagging_oss.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/savedObjectsTaggingOss title: "savedObjectsTaggingOss" image: https://source.unsplash.com/400x175/?github description: API docs for the savedObjectsTaggingOss plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'savedObjectsTaggingOss'] --- import savedObjectsTaggingOssObj from './saved_objects_tagging_oss.devdocs.json'; diff --git a/api_docs/saved_search.mdx b/api_docs/saved_search.mdx index c0fad3c10ea35e..4fe33f0b59baaa 100644 --- a/api_docs/saved_search.mdx +++ b/api_docs/saved_search.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/savedSearch title: "savedSearch" image: https://source.unsplash.com/400x175/?github description: API docs for the savedSearch plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'savedSearch'] --- import savedSearchObj from './saved_search.devdocs.json'; diff --git a/api_docs/screenshot_mode.mdx b/api_docs/screenshot_mode.mdx index 844be8f99760e4..ea42aef9d4f9a4 100644 --- a/api_docs/screenshot_mode.mdx +++ b/api_docs/screenshot_mode.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/screenshotMode title: "screenshotMode" image: https://source.unsplash.com/400x175/?github description: API docs for the screenshotMode plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'screenshotMode'] --- import screenshotModeObj from './screenshot_mode.devdocs.json'; diff --git a/api_docs/screenshotting.mdx b/api_docs/screenshotting.mdx index 56f6ed4c6f30cd..c8e2a7fda86cb6 100644 --- a/api_docs/screenshotting.mdx +++ b/api_docs/screenshotting.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/screenshotting title: "screenshotting" image: https://source.unsplash.com/400x175/?github description: API docs for the screenshotting plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'screenshotting'] --- import screenshottingObj from './screenshotting.devdocs.json'; diff --git a/api_docs/security.mdx b/api_docs/security.mdx index 1fba9c782d27a3..8a8cda6bea8d1f 100644 --- a/api_docs/security.mdx +++ b/api_docs/security.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/security title: "security" image: https://source.unsplash.com/400x175/?github description: API docs for the security plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'security'] --- import securityObj from './security.devdocs.json'; diff --git a/api_docs/security_solution.mdx b/api_docs/security_solution.mdx index c4a802849e03d1..a75c14b79645d0 100644 --- a/api_docs/security_solution.mdx +++ b/api_docs/security_solution.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/securitySolution title: "securitySolution" image: https://source.unsplash.com/400x175/?github description: API docs for the securitySolution plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'securitySolution'] --- import securitySolutionObj from './security_solution.devdocs.json'; diff --git a/api_docs/security_solution_ess.mdx b/api_docs/security_solution_ess.mdx index 62565809935eaa..1ebf70bdeb0ea7 100644 --- a/api_docs/security_solution_ess.mdx +++ b/api_docs/security_solution_ess.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/securitySolutionEss title: "securitySolutionEss" image: https://source.unsplash.com/400x175/?github description: API docs for the securitySolutionEss plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'securitySolutionEss'] --- import securitySolutionEssObj from './security_solution_ess.devdocs.json'; diff --git a/api_docs/security_solution_serverless.mdx b/api_docs/security_solution_serverless.mdx index a90512e3ddf271..b1955be0a753f1 100644 --- a/api_docs/security_solution_serverless.mdx +++ b/api_docs/security_solution_serverless.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/securitySolutionServerless title: "securitySolutionServerless" image: https://source.unsplash.com/400x175/?github description: API docs for the securitySolutionServerless plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'securitySolutionServerless'] --- import securitySolutionServerlessObj from './security_solution_serverless.devdocs.json'; diff --git a/api_docs/serverless.mdx b/api_docs/serverless.mdx index 68fb85ce6b10c1..08129fc34a5888 100644 --- a/api_docs/serverless.mdx +++ b/api_docs/serverless.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/serverless title: "serverless" image: https://source.unsplash.com/400x175/?github description: API docs for the serverless plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'serverless'] --- import serverlessObj from './serverless.devdocs.json'; diff --git a/api_docs/serverless_observability.mdx b/api_docs/serverless_observability.mdx index 334cd98b3667db..68c0781e210b0d 100644 --- a/api_docs/serverless_observability.mdx +++ b/api_docs/serverless_observability.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/serverlessObservability title: "serverlessObservability" image: https://source.unsplash.com/400x175/?github description: API docs for the serverlessObservability plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'serverlessObservability'] --- import serverlessObservabilityObj from './serverless_observability.devdocs.json'; diff --git a/api_docs/serverless_search.mdx b/api_docs/serverless_search.mdx index 2932fa518a11c4..6fb6c98db52838 100644 --- a/api_docs/serverless_search.mdx +++ b/api_docs/serverless_search.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/serverlessSearch title: "serverlessSearch" image: https://source.unsplash.com/400x175/?github description: API docs for the serverlessSearch plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'serverlessSearch'] --- import serverlessSearchObj from './serverless_search.devdocs.json'; diff --git a/api_docs/session_view.mdx b/api_docs/session_view.mdx index 3fdcd7b7245b88..c5f5fc3f1d549e 100644 --- a/api_docs/session_view.mdx +++ b/api_docs/session_view.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/sessionView title: "sessionView" image: https://source.unsplash.com/400x175/?github description: API docs for the sessionView plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'sessionView'] --- import sessionViewObj from './session_view.devdocs.json'; diff --git a/api_docs/share.mdx b/api_docs/share.mdx index 9ca6aa1c719ea0..791996337c0bfd 100644 --- a/api_docs/share.mdx +++ b/api_docs/share.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/share title: "share" image: https://source.unsplash.com/400x175/?github description: API docs for the share plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'share'] --- import shareObj from './share.devdocs.json'; diff --git a/api_docs/snapshot_restore.mdx b/api_docs/snapshot_restore.mdx index 3252ffe4e12bfd..71b78453baadea 100644 --- a/api_docs/snapshot_restore.mdx +++ b/api_docs/snapshot_restore.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/snapshotRestore title: "snapshotRestore" image: https://source.unsplash.com/400x175/?github description: API docs for the snapshotRestore plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'snapshotRestore'] --- import snapshotRestoreObj from './snapshot_restore.devdocs.json'; diff --git a/api_docs/spaces.mdx b/api_docs/spaces.mdx index 352846e84bc534..1ace133eda8eb9 100644 --- a/api_docs/spaces.mdx +++ b/api_docs/spaces.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/spaces title: "spaces" image: https://source.unsplash.com/400x175/?github description: API docs for the spaces plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'spaces'] --- import spacesObj from './spaces.devdocs.json'; diff --git a/api_docs/stack_alerts.mdx b/api_docs/stack_alerts.mdx index c7b3a9f2caad19..7ab6a6b23d34a7 100644 --- a/api_docs/stack_alerts.mdx +++ b/api_docs/stack_alerts.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/stackAlerts title: "stackAlerts" image: https://source.unsplash.com/400x175/?github description: API docs for the stackAlerts plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'stackAlerts'] --- import stackAlertsObj from './stack_alerts.devdocs.json'; diff --git a/api_docs/stack_connectors.mdx b/api_docs/stack_connectors.mdx index bfb48a53805504..a81e92df4263e6 100644 --- a/api_docs/stack_connectors.mdx +++ b/api_docs/stack_connectors.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/stackConnectors title: "stackConnectors" image: https://source.unsplash.com/400x175/?github description: API docs for the stackConnectors plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'stackConnectors'] --- import stackConnectorsObj from './stack_connectors.devdocs.json'; diff --git a/api_docs/task_manager.mdx b/api_docs/task_manager.mdx index c89d00df70dbab..d141e70b864ddb 100644 --- a/api_docs/task_manager.mdx +++ b/api_docs/task_manager.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/taskManager title: "taskManager" image: https://source.unsplash.com/400x175/?github description: API docs for the taskManager plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'taskManager'] --- import taskManagerObj from './task_manager.devdocs.json'; diff --git a/api_docs/telemetry.mdx b/api_docs/telemetry.mdx index 8848113be8a2c8..68b89942ca1682 100644 --- a/api_docs/telemetry.mdx +++ b/api_docs/telemetry.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/telemetry title: "telemetry" image: https://source.unsplash.com/400x175/?github description: API docs for the telemetry plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'telemetry'] --- import telemetryObj from './telemetry.devdocs.json'; diff --git a/api_docs/telemetry_collection_manager.mdx b/api_docs/telemetry_collection_manager.mdx index be1c1bc6390760..b0dfbe2aeb53a9 100644 --- a/api_docs/telemetry_collection_manager.mdx +++ b/api_docs/telemetry_collection_manager.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/telemetryCollectionManager title: "telemetryCollectionManager" image: https://source.unsplash.com/400x175/?github description: API docs for the telemetryCollectionManager plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'telemetryCollectionManager'] --- import telemetryCollectionManagerObj from './telemetry_collection_manager.devdocs.json'; diff --git a/api_docs/telemetry_collection_xpack.mdx b/api_docs/telemetry_collection_xpack.mdx index 665763433a4439..400692786e5511 100644 --- a/api_docs/telemetry_collection_xpack.mdx +++ b/api_docs/telemetry_collection_xpack.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/telemetryCollectionXpack title: "telemetryCollectionXpack" image: https://source.unsplash.com/400x175/?github description: API docs for the telemetryCollectionXpack plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'telemetryCollectionXpack'] --- import telemetryCollectionXpackObj from './telemetry_collection_xpack.devdocs.json'; diff --git a/api_docs/telemetry_management_section.mdx b/api_docs/telemetry_management_section.mdx index 677fd55d5aefe5..41cfd8200cde15 100644 --- a/api_docs/telemetry_management_section.mdx +++ b/api_docs/telemetry_management_section.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/telemetryManagementSection title: "telemetryManagementSection" image: https://source.unsplash.com/400x175/?github description: API docs for the telemetryManagementSection plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'telemetryManagementSection'] --- import telemetryManagementSectionObj from './telemetry_management_section.devdocs.json'; diff --git a/api_docs/text_based_languages.mdx b/api_docs/text_based_languages.mdx index e284fe6a763fc7..47f9c401000e8f 100644 --- a/api_docs/text_based_languages.mdx +++ b/api_docs/text_based_languages.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/textBasedLanguages title: "textBasedLanguages" image: https://source.unsplash.com/400x175/?github description: API docs for the textBasedLanguages plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'textBasedLanguages'] --- import textBasedLanguagesObj from './text_based_languages.devdocs.json'; diff --git a/api_docs/threat_intelligence.mdx b/api_docs/threat_intelligence.mdx index 83b147b3ad2860..54b799e8908688 100644 --- a/api_docs/threat_intelligence.mdx +++ b/api_docs/threat_intelligence.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/threatIntelligence title: "threatIntelligence" image: https://source.unsplash.com/400x175/?github description: API docs for the threatIntelligence plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'threatIntelligence'] --- import threatIntelligenceObj from './threat_intelligence.devdocs.json'; diff --git a/api_docs/timelines.mdx b/api_docs/timelines.mdx index abeb100f683a8b..6ffbeb44a5f6f8 100644 --- a/api_docs/timelines.mdx +++ b/api_docs/timelines.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/timelines title: "timelines" image: https://source.unsplash.com/400x175/?github description: API docs for the timelines plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'timelines'] --- import timelinesObj from './timelines.devdocs.json'; diff --git a/api_docs/transform.mdx b/api_docs/transform.mdx index 14b151c8dfe942..8f702f726ce37e 100644 --- a/api_docs/transform.mdx +++ b/api_docs/transform.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/transform title: "transform" image: https://source.unsplash.com/400x175/?github description: API docs for the transform plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'transform'] --- import transformObj from './transform.devdocs.json'; diff --git a/api_docs/triggers_actions_ui.mdx b/api_docs/triggers_actions_ui.mdx index 3b2422586ddb7c..a46d197368371b 100644 --- a/api_docs/triggers_actions_ui.mdx +++ b/api_docs/triggers_actions_ui.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/triggersActionsUi title: "triggersActionsUi" image: https://source.unsplash.com/400x175/?github description: API docs for the triggersActionsUi plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'triggersActionsUi'] --- import triggersActionsUiObj from './triggers_actions_ui.devdocs.json'; diff --git a/api_docs/ui_actions.mdx b/api_docs/ui_actions.mdx index 0fad8e2970aee1..8c7311ad53b4fe 100644 --- a/api_docs/ui_actions.mdx +++ b/api_docs/ui_actions.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/uiActions title: "uiActions" image: https://source.unsplash.com/400x175/?github description: API docs for the uiActions plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'uiActions'] --- import uiActionsObj from './ui_actions.devdocs.json'; diff --git a/api_docs/ui_actions_enhanced.mdx b/api_docs/ui_actions_enhanced.mdx index 477105f687897f..fc09207b16726e 100644 --- a/api_docs/ui_actions_enhanced.mdx +++ b/api_docs/ui_actions_enhanced.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/uiActionsEnhanced title: "uiActionsEnhanced" image: https://source.unsplash.com/400x175/?github description: API docs for the uiActionsEnhanced plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'uiActionsEnhanced'] --- import uiActionsEnhancedObj from './ui_actions_enhanced.devdocs.json'; diff --git a/api_docs/unified_doc_viewer.mdx b/api_docs/unified_doc_viewer.mdx index 2bac92d8dc9681..375d040202dd3c 100644 --- a/api_docs/unified_doc_viewer.mdx +++ b/api_docs/unified_doc_viewer.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/unifiedDocViewer title: "unifiedDocViewer" image: https://source.unsplash.com/400x175/?github description: API docs for the unifiedDocViewer plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'unifiedDocViewer'] --- import unifiedDocViewerObj from './unified_doc_viewer.devdocs.json'; diff --git a/api_docs/unified_histogram.mdx b/api_docs/unified_histogram.mdx index 7ac3f212bd7e63..fb2587bcd352a6 100644 --- a/api_docs/unified_histogram.mdx +++ b/api_docs/unified_histogram.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/unifiedHistogram title: "unifiedHistogram" image: https://source.unsplash.com/400x175/?github description: API docs for the unifiedHistogram plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'unifiedHistogram'] --- import unifiedHistogramObj from './unified_histogram.devdocs.json'; diff --git a/api_docs/unified_search.mdx b/api_docs/unified_search.mdx index 5063607cfaec30..76e585b18e27f4 100644 --- a/api_docs/unified_search.mdx +++ b/api_docs/unified_search.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/unifiedSearch title: "unifiedSearch" image: https://source.unsplash.com/400x175/?github description: API docs for the unifiedSearch plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'unifiedSearch'] --- import unifiedSearchObj from './unified_search.devdocs.json'; diff --git a/api_docs/unified_search_autocomplete.mdx b/api_docs/unified_search_autocomplete.mdx index 45657c6e1619c6..89fc4d10a127d2 100644 --- a/api_docs/unified_search_autocomplete.mdx +++ b/api_docs/unified_search_autocomplete.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/unifiedSearch-autocomplete title: "unifiedSearch.autocomplete" image: https://source.unsplash.com/400x175/?github description: API docs for the unifiedSearch.autocomplete plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'unifiedSearch.autocomplete'] --- import unifiedSearchAutocompleteObj from './unified_search_autocomplete.devdocs.json'; diff --git a/api_docs/uptime.mdx b/api_docs/uptime.mdx index f3c8ca6eaf457b..bbca7e6a9a625c 100644 --- a/api_docs/uptime.mdx +++ b/api_docs/uptime.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/uptime title: "uptime" image: https://source.unsplash.com/400x175/?github description: API docs for the uptime plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'uptime'] --- import uptimeObj from './uptime.devdocs.json'; diff --git a/api_docs/url_forwarding.mdx b/api_docs/url_forwarding.mdx index 32f117b1d6b7bc..fd866f32a4ade2 100644 --- a/api_docs/url_forwarding.mdx +++ b/api_docs/url_forwarding.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/urlForwarding title: "urlForwarding" image: https://source.unsplash.com/400x175/?github description: API docs for the urlForwarding plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'urlForwarding'] --- import urlForwardingObj from './url_forwarding.devdocs.json'; diff --git a/api_docs/usage_collection.mdx b/api_docs/usage_collection.mdx index a5b63ae583a5bd..5fd13618285228 100644 --- a/api_docs/usage_collection.mdx +++ b/api_docs/usage_collection.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/usageCollection title: "usageCollection" image: https://source.unsplash.com/400x175/?github description: API docs for the usageCollection plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'usageCollection'] --- import usageCollectionObj from './usage_collection.devdocs.json'; diff --git a/api_docs/ux.mdx b/api_docs/ux.mdx index f5aedf68f4c525..1a14e6fb762fd9 100644 --- a/api_docs/ux.mdx +++ b/api_docs/ux.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/ux title: "ux" image: https://source.unsplash.com/400x175/?github description: API docs for the ux plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'ux'] --- import uxObj from './ux.devdocs.json'; diff --git a/api_docs/vis_default_editor.mdx b/api_docs/vis_default_editor.mdx index d26c2e117abe2e..f30f88057366c9 100644 --- a/api_docs/vis_default_editor.mdx +++ b/api_docs/vis_default_editor.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/visDefaultEditor title: "visDefaultEditor" image: https://source.unsplash.com/400x175/?github description: API docs for the visDefaultEditor plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'visDefaultEditor'] --- import visDefaultEditorObj from './vis_default_editor.devdocs.json'; diff --git a/api_docs/vis_type_gauge.mdx b/api_docs/vis_type_gauge.mdx index bc8fdea191b4f2..b9932db82903ef 100644 --- a/api_docs/vis_type_gauge.mdx +++ b/api_docs/vis_type_gauge.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/visTypeGauge title: "visTypeGauge" image: https://source.unsplash.com/400x175/?github description: API docs for the visTypeGauge plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'visTypeGauge'] --- import visTypeGaugeObj from './vis_type_gauge.devdocs.json'; diff --git a/api_docs/vis_type_heatmap.mdx b/api_docs/vis_type_heatmap.mdx index 4bc4f3eba9399e..bd6c594ca95082 100644 --- a/api_docs/vis_type_heatmap.mdx +++ b/api_docs/vis_type_heatmap.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/visTypeHeatmap title: "visTypeHeatmap" image: https://source.unsplash.com/400x175/?github description: API docs for the visTypeHeatmap plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'visTypeHeatmap'] --- import visTypeHeatmapObj from './vis_type_heatmap.devdocs.json'; diff --git a/api_docs/vis_type_pie.mdx b/api_docs/vis_type_pie.mdx index 3442c27cb1967a..9a794ed8d33814 100644 --- a/api_docs/vis_type_pie.mdx +++ b/api_docs/vis_type_pie.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/visTypePie title: "visTypePie" image: https://source.unsplash.com/400x175/?github description: API docs for the visTypePie plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'visTypePie'] --- import visTypePieObj from './vis_type_pie.devdocs.json'; diff --git a/api_docs/vis_type_table.mdx b/api_docs/vis_type_table.mdx index 86bbc9ac63d3e2..ce199ae93cda5e 100644 --- a/api_docs/vis_type_table.mdx +++ b/api_docs/vis_type_table.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/visTypeTable title: "visTypeTable" image: https://source.unsplash.com/400x175/?github description: API docs for the visTypeTable plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'visTypeTable'] --- import visTypeTableObj from './vis_type_table.devdocs.json'; diff --git a/api_docs/vis_type_timelion.mdx b/api_docs/vis_type_timelion.mdx index 60e5d7fb0b9428..58195911efa892 100644 --- a/api_docs/vis_type_timelion.mdx +++ b/api_docs/vis_type_timelion.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/visTypeTimelion title: "visTypeTimelion" image: https://source.unsplash.com/400x175/?github description: API docs for the visTypeTimelion plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'visTypeTimelion'] --- import visTypeTimelionObj from './vis_type_timelion.devdocs.json'; diff --git a/api_docs/vis_type_timeseries.mdx b/api_docs/vis_type_timeseries.mdx index 79929bb19dce48..9ff23838ac1b04 100644 --- a/api_docs/vis_type_timeseries.mdx +++ b/api_docs/vis_type_timeseries.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/visTypeTimeseries title: "visTypeTimeseries" image: https://source.unsplash.com/400x175/?github description: API docs for the visTypeTimeseries plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'visTypeTimeseries'] --- import visTypeTimeseriesObj from './vis_type_timeseries.devdocs.json'; diff --git a/api_docs/vis_type_vega.mdx b/api_docs/vis_type_vega.mdx index 101f83dc163642..cd17179215c028 100644 --- a/api_docs/vis_type_vega.mdx +++ b/api_docs/vis_type_vega.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/visTypeVega title: "visTypeVega" image: https://source.unsplash.com/400x175/?github description: API docs for the visTypeVega plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'visTypeVega'] --- import visTypeVegaObj from './vis_type_vega.devdocs.json'; diff --git a/api_docs/vis_type_vislib.mdx b/api_docs/vis_type_vislib.mdx index 6f1a5ec11136e0..e0a979917982d7 100644 --- a/api_docs/vis_type_vislib.mdx +++ b/api_docs/vis_type_vislib.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/visTypeVislib title: "visTypeVislib" image: https://source.unsplash.com/400x175/?github description: API docs for the visTypeVislib plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'visTypeVislib'] --- import visTypeVislibObj from './vis_type_vislib.devdocs.json'; diff --git a/api_docs/vis_type_xy.mdx b/api_docs/vis_type_xy.mdx index b61820d950dd79..df05d7af70ff30 100644 --- a/api_docs/vis_type_xy.mdx +++ b/api_docs/vis_type_xy.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/visTypeXy title: "visTypeXy" image: https://source.unsplash.com/400x175/?github description: API docs for the visTypeXy plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'visTypeXy'] --- import visTypeXyObj from './vis_type_xy.devdocs.json'; diff --git a/api_docs/visualizations.mdx b/api_docs/visualizations.mdx index eca7aceb3494c0..08d100be9d41a0 100644 --- a/api_docs/visualizations.mdx +++ b/api_docs/visualizations.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/visualizations title: "visualizations" image: https://source.unsplash.com/400x175/?github description: API docs for the visualizations plugin -date: 2023-10-23 +date: 2023-10-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'visualizations'] --- import visualizationsObj from './visualizations.devdocs.json'; From 52b944509598f908c29a521635507369f982b185 Mon Sep 17 00:00:00 2001 From: Gloria Hornero Date: Tue, 24 Oct 2023 08:21:24 +0200 Subject: [PATCH 52/68] [Security Solution] Unskipping `x-pack/test/security_solution_cypress/cypress/e2e/explore/host_details/` working tests on serverless (#169473) --- .../cypress/e2e/explore/host_details/risk_tab.cy.ts | 4 ++-- .../es_archives/query_alert/mappings.json | 4 ---- 2 files changed, 2 insertions(+), 6 deletions(-) diff --git a/x-pack/test/security_solution_cypress/cypress/e2e/explore/host_details/risk_tab.cy.ts b/x-pack/test/security_solution_cypress/cypress/e2e/explore/host_details/risk_tab.cy.ts index ea8362ee17541a..a6a9bc405c9e37 100644 --- a/x-pack/test/security_solution_cypress/cypress/e2e/explore/host_details/risk_tab.cy.ts +++ b/x-pack/test/security_solution_cypress/cypress/e2e/explore/host_details/risk_tab.cy.ts @@ -16,7 +16,7 @@ import { ALERTS_COUNT, ALERT_GRID_CELL } from '../../../screens/alerts'; import { RISK_INFORMATION_FLYOUT_HEADER } from '../../../screens/entity_analytics'; import { navigateToHostRiskDetailTab } from '../../../tasks/host_risk'; -describe('risk tab', { tags: ['@ess', '@serverless', '@brokenInServerless'] }, () => { +describe('risk tab', { tags: ['@ess', '@serverless'] }, () => { // FLAKY: https://github.com/elastic/kibana/issues/169033 // FLAKY: https://github.com/elastic/kibana/issues/169034 describe.skip('with legacy risk score', () => { @@ -62,7 +62,7 @@ describe('risk tab', { tags: ['@ess', '@serverless', '@brokenInServerless'] }, ( before(() => { cleanKibana(); cy.task('esArchiverLoad', { archiveName: 'risk_scores_new' }); - cy.task('esArchiverLoad', { archiveName: 'query_alert' }); + cy.task('esArchiverLoad', { archiveName: 'query_alert', useCreate: true, docsOnly: true }); login(); enableRiskEngine(); }); diff --git a/x-pack/test/security_solution_cypress/es_archives/query_alert/mappings.json b/x-pack/test/security_solution_cypress/es_archives/query_alert/mappings.json index f346eee132104c..db86f3afb7c2ba 100644 --- a/x-pack/test/security_solution_cypress/es_archives/query_alert/mappings.json +++ b/x-pack/test/security_solution_cypress/es_archives/query_alert/mappings.json @@ -7887,10 +7887,6 @@ "index": { "auto_expand_replicas": "0-1", "hidden": "true", - "lifecycle": { - "name": ".alerts-ilm-policy", - "rollover_alias": ".alerts-security.alerts-default" - }, "mapping": { "total_fields": { "limit": "2500" From 939c87d95342c61f03c853cb3b34c9f412c303b0 Mon Sep 17 00:00:00 2001 From: Juan Pablo Djeredjian Date: Tue, 24 Oct 2023 09:18:42 +0200 Subject: [PATCH 53/68] [Security Solution] Unskip tests for `detection_response` Cypress tests and enable Serverless run (#169218) ## Summary Flaky test runner for Cypress tests in: - `x-pack/test/security_solution_cypress/cypress/e2e/detection_response/detection_alerts` - `x-pack/test/security_solution_cypress/cypress/e2e/detection_response/value_lists` - `x-pack/test/security_solution_cypress/cypress/e2e/detection_response/rule_creation` ## Changes - `x-pack/test/security_solution_cypress/cypress/e2e/detection_response/rule_creation/custom_query_rule_data_view.cy.ts` **tagged to run on Serverless** - `x-pack/test/security_solution_cypress/cypress/e2e/detection_response/rule_creation/event_correlation_rule.cy.ts` **tagged to run on Serverless** - `x-pack/test/security_solution_cypress/cypress/e2e/detection_response/rule_creation/machine_learning_rule.cy.ts` **tagged to run on Serverless** - `x-pack/test/security_solution_cypress/cypress/e2e/detection_response/rule_creation/new_terms_rule.cy.ts` **tagged to run on Serverless** - `x-pack/test/security_solution_cypress/cypress/e2e/detection_response/rule_creation/override.cy.ts` **tagged to run on Serverless** - `x-pack/test/security_solution_cypress/cypress/e2e/detection_response/rule_management/rule_actions/deletion/rule_delete.cy.ts` **added disableAutorefresh() to avoid flakiness** ## Related failing-test issues ### `detection_response/detection_alerts` 1. https://github.com/elastic/kibana/issues/169091 **Marked as `legit-flake` and assigned to @elastic/security-detection-engine** 3. https://github.com/elastic/kibana/issues/163885 ### `detection_response/value_lists` 4. https://github.com/elastic/kibana/issues/165699 ### `detection_response/rule_creation` 5. https://github.com/elastic/kibana/issues/163691 ## Flaky test runner - https://buildkite.com/elastic/kibana-flaky-test-suite-runner/builds/3583 - https://buildkite.com/elastic/kibana-flaky-test-suite-runner/builds/3615 [SERVERLESS ONLY] - https://buildkite.com/elastic/kibana-flaky-test-suite-runner/builds/3656 [Serverless without indicator match and saved queries] --- .../rule_creation/custom_query_rule_data_view.cy.ts | 3 +-- .../rule_creation/event_correlation_rule.cy.ts | 3 +-- .../rule_creation/machine_learning_rule.cy.ts | 8 ++------ .../detection_response/rule_creation/new_terms_rule.cy.ts | 3 +-- .../e2e/detection_response/rule_creation/override.cy.ts | 3 +-- .../rule_actions/deletion/rule_delete.cy.ts | 2 ++ 6 files changed, 8 insertions(+), 14 deletions(-) diff --git a/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/rule_creation/custom_query_rule_data_view.cy.ts b/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/rule_creation/custom_query_rule_data_view.cy.ts index 32eb50ef25d532..3b1a799de512b3 100644 --- a/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/rule_creation/custom_query_rule_data_view.cy.ts +++ b/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/rule_creation/custom_query_rule_data_view.cy.ts @@ -69,8 +69,7 @@ import { getDetails, waitForTheRuleToBeExecuted } from '../../../tasks/rule_deta import { CREATE_RULE_URL } from '../../../urls/navigation'; -// TODO: https://github.com/elastic/kibana/issues/161539 -describe('Custom query rules', { tags: ['@ess', '@serverless', '@brokenInServerless'] }, () => { +describe('Custom query rules', { tags: ['@ess', '@serverless'] }, () => { describe('Custom detection rules creation with data views', () => { const rule = getDataViewRule(); const expectedUrls = rule.references?.join(''); diff --git a/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/rule_creation/event_correlation_rule.cy.ts b/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/rule_creation/event_correlation_rule.cy.ts index d169d44f197611..36fa6cd484154d 100644 --- a/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/rule_creation/event_correlation_rule.cy.ts +++ b/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/rule_creation/event_correlation_rule.cy.ts @@ -57,8 +57,7 @@ import { visit } from '../../../tasks/navigation'; import { openRuleManagementPageViaBreadcrumbs } from '../../../tasks/rules_management'; import { CREATE_RULE_URL } from '../../../urls/navigation'; -// TODO: https://github.com/elastic/kibana/issues/161539 -describe('EQL rules', { tags: ['@ess', '@serverless', '@brokenInServerless'] }, () => { +describe('EQL rules', { tags: ['@ess', '@serverless'] }, () => { before(() => { cleanKibana(); }); diff --git a/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/rule_creation/machine_learning_rule.cy.ts b/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/rule_creation/machine_learning_rule.cy.ts index 7e73310433df1f..684a44d37d214a 100644 --- a/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/rule_creation/machine_learning_rule.cy.ts +++ b/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/rule_creation/machine_learning_rule.cy.ts @@ -54,19 +54,15 @@ import { visit } from '../../../tasks/navigation'; import { openRuleManagementPageViaBreadcrumbs } from '../../../tasks/rules_management'; import { CREATE_RULE_URL } from '../../../urls/navigation'; -// TODO: https://github.com/elastic/kibana/issues/161539 -describe('Machine Learning rules', { tags: ['@ess', '@serverless', '@brokenInServerless'] }, () => { +describe('Machine Learning rules', { tags: ['@ess', '@serverless'] }, () => { const expectedUrls = (getMachineLearningRule().references ?? []).join(''); const expectedFalsePositives = (getMachineLearningRule().false_positives ?? []).join(''); const expectedTags = (getMachineLearningRule().tags ?? []).join(''); const expectedMitre = formatMitreAttackDescription(getMachineLearningRule().threat ?? []); const expectedNumberOfRules = 1; - before(() => { - cleanKibana(); - }); - beforeEach(() => { + cleanKibana(); login(); visit(CREATE_RULE_URL); }); diff --git a/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/rule_creation/new_terms_rule.cy.ts b/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/rule_creation/new_terms_rule.cy.ts index 53334bdc80541c..f45be3af38a2ad 100644 --- a/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/rule_creation/new_terms_rule.cy.ts +++ b/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/rule_creation/new_terms_rule.cy.ts @@ -59,8 +59,7 @@ import { visit } from '../../../tasks/navigation'; import { CREATE_RULE_URL } from '../../../urls/navigation'; import { openRuleManagementPageViaBreadcrumbs } from '../../../tasks/rules_management'; -// TODO: https://github.com/elastic/kibana/issues/161539 -describe('New Terms rules', { tags: ['@ess', '@serverless', '@brokenInServerless'] }, () => { +describe('New Terms rules', { tags: ['@ess', '@serverless'] }, () => { before(() => { cleanKibana(); login(); diff --git a/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/rule_creation/override.cy.ts b/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/rule_creation/override.cy.ts index 6290583e82d827..7b8e5b0744c72e 100644 --- a/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/rule_creation/override.cy.ts +++ b/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/rule_creation/override.cy.ts @@ -62,8 +62,7 @@ import { getDetails, waitForTheRuleToBeExecuted } from '../../../tasks/rule_deta import { CREATE_RULE_URL } from '../../../urls/navigation'; import { openRuleManagementPageViaBreadcrumbs } from '../../../tasks/rules_management'; -// TODO: https://github.com/elastic/kibana/issues/161539 -describe('Rules override', { tags: ['@ess', '@serverless', '@brokenInServerless'] }, () => { +describe('Rules override', { tags: ['@ess', '@serverless'] }, () => { const rule = getNewOverrideRule(); const expectedUrls = rule.references?.join(''); const expectedFalsePositives = rule.false_positives?.join(''); diff --git a/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/rule_management/rule_actions/deletion/rule_delete.cy.ts b/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/rule_management/rule_actions/deletion/rule_delete.cy.ts index 563c8b85c1b733..0896438e275e36 100644 --- a/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/rule_management/rule_actions/deletion/rule_delete.cy.ts +++ b/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/rule_management/rule_actions/deletion/rule_delete.cy.ts @@ -12,6 +12,7 @@ import { RULE_SWITCH } from '../../../../../screens/alerts_detection_rules'; import { deleteFirstRule, + disableAutoRefresh, getRulesManagementTableRows, selectRulesByName, } from '../../../../../tasks/alerts_detection_rules'; @@ -33,6 +34,7 @@ describe('Rule deletion', { tags: ['@ess', '@serverless'] }, () => { createRule(testRules[2]); login(); visitRulesManagementTable(); + disableAutoRefresh(); }); it('User can delete an individual rule', () => { From 12975a5a0c6846d5cdbecc73beceba0346cd866b Mon Sep 17 00:00:00 2001 From: Juan Pablo Djeredjian Date: Tue, 24 Oct 2023 10:26:15 +0200 Subject: [PATCH 54/68] [Security Solution] Enable Serverless for `entity_analytics` Cypress tests (#169209) ## Summary Running flaky test runner for `x-pack/test/security_solution_cypress/cypress/e2e/entity_analytics` ## Changes - `x-pack/test/security_solution_cypress/cypress/e2e/entity_analytics/enrichments.cy.ts` **unskipped whole test suite in favour of failing test -> `Custom Query rule - from legacy risk scores`** (see below) **also enabled on Serverless** - `x-pack/test/security_solution_cypress/cypress/e2e/entity_analytics/entity_analytics_management_page.cy.ts` **enabled on Serverless** ## Related failing-test issues 1. https://github.com/elastic/kibana/issues/169154 **Marked as legit-flake and assigned to @elastic/security-detection-engine** ### Flaky test runner link - https://buildkite.com/elastic/kibana-flaky-test-suite-runner/builds/3575 --- .../cypress/e2e/entity_analytics/enrichments.cy.ts | 7 +++---- .../entity_analytics_management_page.cy.ts | 2 +- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/x-pack/test/security_solution_cypress/cypress/e2e/entity_analytics/enrichments.cy.ts b/x-pack/test/security_solution_cypress/cypress/e2e/entity_analytics/enrichments.cy.ts index b20db6868f9a0f..f5716f33ff288f 100644 --- a/x-pack/test/security_solution_cypress/cypress/e2e/entity_analytics/enrichments.cy.ts +++ b/x-pack/test/security_solution_cypress/cypress/e2e/entity_analytics/enrichments.cy.ts @@ -36,9 +36,7 @@ import { enableRiskEngine } from '../../tasks/entity_analytics'; const CURRENT_HOST_RISK_LEVEL = 'Current host risk level'; const ORIGINAL_HOST_RISK_LEVEL = 'Original host risk level'; -// TODO: https://github.com/elastic/kibana/issues/161539 -// FLAKY: https://github.com/elastic/kibana/issues/169154 -describe.skip('Enrichment', { tags: ['@ess', '@serverless', '@brokenInServerless'] }, () => { +describe('Enrichment', { tags: ['@ess', '@serverless'] }, () => { before(() => { cleanKibana(); cy.task('esArchiverUnload', 'risk_scores_new'); @@ -51,7 +49,8 @@ describe.skip('Enrichment', { tags: ['@ess', '@serverless', '@brokenInServerless }); describe('Custom query rule', () => { - describe('from legacy risk scores', () => { + // FLAKY: https://github.com/elastic/kibana/issues/169154 + describe.skip('from legacy risk scores', () => { beforeEach(() => { disableExpandableFlyout(); cy.task('esArchiverLoad', { archiveName: 'risk_hosts' }); diff --git a/x-pack/test/security_solution_cypress/cypress/e2e/entity_analytics/entity_analytics_management_page.cy.ts b/x-pack/test/security_solution_cypress/cypress/e2e/entity_analytics/entity_analytics_management_page.cy.ts index 4f4cb0a5057126..1e93f1fb214215 100644 --- a/x-pack/test/security_solution_cypress/cypress/e2e/entity_analytics/entity_analytics_management_page.cy.ts +++ b/x-pack/test/security_solution_cypress/cypress/e2e/entity_analytics/entity_analytics_management_page.cy.ts @@ -43,7 +43,7 @@ import { describe( 'Entity analytics management page', { - tags: ['@ess', '@serverless', '@brokenInServerless'], + tags: ['@ess', '@serverless'], }, () => { before(() => { From 6beee472486c547adf5a7a0033f7c01c197c6d02 Mon Sep 17 00:00:00 2001 From: Juan Pablo Djeredjian Date: Tue, 24 Oct 2023 10:26:56 +0200 Subject: [PATCH 55/68] [Security Solution] Unskip `Security Solution Accessibility` tests (#169223) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## Summary Flaky test runner for Cypress tests: - `x-pack/test/accessibility/apps/security_solution.ts` ## Changes -`x-pack/test/accessibility/apps/security_solution.ts` **unskip tests** ## Related failing-test issues 1. https://github.com/elastic/kibana/issues/166102 2. https://github.com/elastic/kibana/issues/166105 ## Flaky test runner link https://buildkite.com/elastic/kibana-flaky-test-suite-runner/builds/3586 🟢 ## Changes - Unskipping skipped Accessibility integration tests. --------- Co-authored-by: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> --- x-pack/test/accessibility/apps/security_solution.ts | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/x-pack/test/accessibility/apps/security_solution.ts b/x-pack/test/accessibility/apps/security_solution.ts index cda47540f5d0f1..ba7d22fd2d39db 100644 --- a/x-pack/test/accessibility/apps/security_solution.ts +++ b/x-pack/test/accessibility/apps/security_solution.ts @@ -14,9 +14,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { const toasts = getService('toasts'); const testSubjects = getService('testSubjects'); - // Failing: See https://github.com/elastic/kibana/issues/166102 - // Failing: See https://github.com/elastic/kibana/issues/166105 - describe.skip('Security Solution Accessibility', () => { + describe('Security Solution Accessibility', () => { before(async () => { await security.testUser.setRoles(['superuser'], { skipBrowserRefresh: true }); await common.navigateToApp('security'); From 97bd6bdb008b77b7ae78a4579bae5658fa1ad918 Mon Sep 17 00:00:00 2001 From: Jatin Kathuria Date: Tue, 24 Oct 2023 10:34:21 +0200 Subject: [PATCH 56/68] [Security Solution] [Timelines] Adds timeline SO model version for serverless (#169607) ## Summary In a [recent PR](https://github.com/elastic/kibana/pull/165596/files#diff-a2fb9c3ba1b24bab5df29ddc440dc4a8623b1e8850c9ca7da3b20f9b9631d7daR319), a new property called `savedSearchId` was added to the timeline Saved object. Although, it works correctly in ESS and new projects created in serverless, it does not work as intended in previously created serverless projects. To make sure, the newly added field is migrated to the old projects, we must follow [these guidelines](https://github.com/elastic/kibana/blob/9b59e84d3e3601a12fa5ff33814393b8f7644010/packages/core/saved-objects/core-saved-objects-server/docs/model_versions.md#changes) to create appropriate model versions so that migration can happen incrementally as an when changes are done to the saved object. This PR creates a model version for a newly created field `savedSearchId`. --- .../group2/check_registered_types.test.ts | 2 +- .../timeline/saved_object_mappings/timelines.ts | 17 +++++++++++++++++ 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/src/core/server/integration_tests/saved_objects/migrations/group2/check_registered_types.test.ts b/src/core/server/integration_tests/saved_objects/migrations/group2/check_registered_types.test.ts index 73fef09887c691..c3c631591e7eec 100644 --- a/src/core/server/integration_tests/saved_objects/migrations/group2/check_registered_types.test.ts +++ b/src/core/server/integration_tests/saved_objects/migrations/group2/check_registered_types.test.ts @@ -139,7 +139,7 @@ describe('checking migration metadata changes on all registered SO types', () => "security-rule": "07abb4d7e707d91675ec0495c73816394c7b521f", "security-solution-signals-migration": "9d99715fe5246f19de2273ba77debd2446c36bb1", "siem-detection-engine-rule-actions": "54f08e23887b20da7c805fab7c60bc67c428aff9", - "siem-ui-timeline": "2d9925f7286a9e947a008eff8e61118dadd8229b", + "siem-ui-timeline": "d3de8ff3617be8f2a799d66b1471b9be6124bf40", "siem-ui-timeline-note": "0a32fb776907f596bedca292b8c646496ae9c57b", "siem-ui-timeline-pinned-event": "082daa3ce647b33873f6abccf340bdfa32057c8d", "slo": "2048ab6791df2e1ae0936f29c20765cb8d2fcfaa", diff --git a/x-pack/plugins/security_solution/server/lib/timeline/saved_object_mappings/timelines.ts b/x-pack/plugins/security_solution/server/lib/timeline/saved_object_mappings/timelines.ts index bc4fdfb1f79bfd..f33debeabe2920 100644 --- a/x-pack/plugins/security_solution/server/lib/timeline/saved_object_mappings/timelines.ts +++ b/x-pack/plugins/security_solution/server/lib/timeline/saved_object_mappings/timelines.ts @@ -5,6 +5,7 @@ * 2.0. */ +import type { SavedObjectsModelVersion } from '@kbn/core-saved-objects-server'; import { SECURITY_SOLUTION_SAVED_OBJECT_INDEX } from '@kbn/core-saved-objects-server'; import type { SavedObjectsType } from '@kbn/core/server'; import { timelinesMigrations } from './migrations/timelines'; @@ -322,6 +323,19 @@ export const timelineSavedObjectMappings: SavedObjectsType['mappings'] = { }, }; +const timelineSOVersion1: SavedObjectsModelVersion = { + changes: [ + { + type: 'mappings_addition', + addedMappings: { + savedSearchId: { + type: 'text', + }, + }, + }, + ], +}; + export const timelineType: SavedObjectsType = { name: timelineSavedObjectType, indexPattern: SECURITY_SOLUTION_SAVED_OBJECT_INDEX, @@ -330,4 +344,7 @@ export const timelineType: SavedObjectsType = { convertToMultiNamespaceTypeVersion: '8.0.0', mappings: timelineSavedObjectMappings, migrations: timelinesMigrations, + modelVersions: { + 1: timelineSOVersion1, + }, }; From a1955d7fbe4932c957aa2c6efc8289b492cbf202 Mon Sep 17 00:00:00 2001 From: Carlos Delgado <6339205+carlosdelest@users.noreply.github.com> Date: Tue, 24 Oct 2023 11:05:57 +0200 Subject: [PATCH 57/68] Add new sparse vector and dense vector icons (#169493) --- .../src/field_icon/__snapshots__/field_icon.test.tsx.snap | 4 ++-- packages/kbn-react-field/src/field_icon/field_icon.tsx | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/kbn-react-field/src/field_icon/__snapshots__/field_icon.test.tsx.snap b/packages/kbn-react-field/src/field_icon/__snapshots__/field_icon.test.tsx.snap index d33152540f7ea8..66377dc0af529a 100644 --- a/packages/kbn-react-field/src/field_icon/__snapshots__/field_icon.test.tsx.snap +++ b/packages/kbn-react-field/src/field_icon/__snapshots__/field_icon.test.tsx.snap @@ -99,7 +99,7 @@ exports[`FieldIcon renders known field types dense_vector is rendered 1`] = ` @@ -279,7 +279,7 @@ exports[`FieldIcon renders known field types sparse_vector is rendered 1`] = ` diff --git a/packages/kbn-react-field/src/field_icon/field_icon.tsx b/packages/kbn-react-field/src/field_icon/field_icon.tsx index 4db1c3a61663d8..784f8913b56936 100644 --- a/packages/kbn-react-field/src/field_icon/field_icon.tsx +++ b/packages/kbn-react-field/src/field_icon/field_icon.tsx @@ -53,7 +53,7 @@ export const typeToEuiIconMap: Partial> = { conflict: { iconType: 'warning', color: 'euiColorVis9', shape: 'square' }, date: { iconType: 'tokenDate' }, date_range: { iconType: 'tokenDate' }, - dense_vector: { iconType: 'tokenDenseVector' }, + dense_vector: { iconType: 'tokenVectorDense' }, geo_point: { iconType: 'tokenGeo' }, geo_shape: { iconType: 'tokenGeo' }, ip: { iconType: 'tokenIP' }, @@ -70,7 +70,7 @@ export const typeToEuiIconMap: Partial> = { _source: { iconType: 'editorCodeBlock', color: 'gray' }, point: { iconType: 'tokenShape' }, // there is no separate icon for `point` yet shape: { iconType: 'tokenShape' }, - sparse_vector: { iconType: 'tokenDenseVector' }, + sparse_vector: { iconType: 'tokenVectorSparse' }, string: { iconType: 'tokenString' }, text: { iconType: 'tokenString' }, keyword: { iconType: 'tokenKeyword' }, From 1bc5949fb510813d29aa98a252b18d996a1de59b Mon Sep 17 00:00:00 2001 From: Ignacio Rivas Date: Tue, 24 Oct 2023 11:22:57 +0200 Subject: [PATCH 58/68] [Index Management] Disallow special characters when creating new enrich policy (#169494) --- .../enrich_policy_create/steps/configuration.tsx | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/x-pack/plugins/index_management/public/application/sections/enrich_policy_create/steps/configuration.tsx b/x-pack/plugins/index_management/public/application/sections/enrich_policy_create/steps/configuration.tsx index b7e0f0fcd2129b..6e743c6bd07813 100644 --- a/x-pack/plugins/index_management/public/application/sections/enrich_policy_create/steps/configuration.tsx +++ b/x-pack/plugins/index_management/public/application/sections/enrich_policy_create/steps/configuration.tsx @@ -41,6 +41,8 @@ interface Props { onNext: () => void; } +const DISALLOWED_CHARS = ['"', ' ', '\\', '/', ',', '|', '>', '?', '*', '<']; + export const configurationFormSchema: FormSchema = { name: { type: FIELD_TYPES.TEXT, @@ -58,6 +60,20 @@ export const configurationFormSchema: FormSchema = { ) ), }, + { + validator: fieldValidators.containsCharsField({ + message: i18n.translate( + 'xpack.idxMgmt.enrichPolicyCreate.configurationStep.invalidCharactersInNameError', + { + defaultMessage: `Should not contain any of the following characters: {notAllowedChars}`, + values: { + notAllowedChars: DISALLOWED_CHARS.join(', '), + }, + } + ), + chars: DISALLOWED_CHARS, + }), + }, ], }, From b3c5646195589936bf5812df3d377a27e014aed9 Mon Sep 17 00:00:00 2001 From: "Eyo O. Eyo" <7893459+eokoneyo@users.noreply.github.com> Date: Tue, 24 Oct 2023 11:29:55 +0200 Subject: [PATCH 59/68] Add support to provide extension definitions for cards navs rendered in management settings (#169500) ## Summary This PR modifies the implementation for displaying management settings as card navs, to provide support to any consumer of the `kbn-manangement` package in including custom card navs that remain localized to the experience of said consumer. Doing this resolves the issue with diverging needs of items to display in management settings across serverless solutions, with this implementation there's no need to add all possible nav card definitions and then further hide them in other solutions. This solution also preserves the business logic that requires that the definition being included is enabled for the particular solutions, with a caveat that allows the card nav to also support customization that doesn't link to a management app whenever a definition including the property `skipValidation` is specified, a use case for this is https://github.com/elastic/kibana/issues/167453. That being said the proposed API for extending the card navs displayed in management settings, are along the following lines; ```js management.setupCardsNavigation({ enabled: true, extendCardNavDefinitons: { // This definition will be included to the management nav cards to be rendered under it's specified category because it specifies // the property 'noVerify' as true, it's href will be used as is visualize: { category: 'content', description: i18n.translate( 'xpack.serverlessSearch.app.management.extendAppDefinitions.visualise.title', { defaultMessage: 'Configure and maintain your Elasticsearch indices for data storage and retrieval.', } ), skipValidation: true, href: '/visualize', title: 'Visualize', icon: 'visualizeApp', }, }, }); ``` The config referenced above would yield the following changes in the UI; ### Visuals ![Image 18 10 23 at 16 51](https://github.com/elastic/kibana/assets/7893459/5ab1c881-c2e5-4977-b7ed-b2b1f1da35f5) In summary; - for the defined card nav extensions to show up the extension property key has to map to the link of an app that is registered as a management section and is enabled if the `skipValidation` property is omitted. - This implementation also makes modifications to how icons for the card nav are declared, simply passing in a valid EUI icon type string value would suffice for most cases as EuiIcon component also [accepts custom SVGs](https://eui.elastic.co/#/display/icons#custom-svgs) - Valid categories are only the ones defined within the management package, type support is also provided for enhanced DX - When a definition that specifies `skipValidation` has either the value `false` or `undefined`, in that case the property `title` and `href` are not expected to be passed and will fail typescript type checks if they are passed. ### Checklist Delete any items that are not applicable to this PR. ~- [ ] Any text added follows [EUI's writing guidelines](https://elastic.github.io/eui/#/guidelines/writing), uses sentence case text and includes [i18n support](https://github.com/elastic/kibana/blob/main/packages/kbn-i18n/README.md)~ - [x] [Documentation](https://www.elastic.co/guide/en/kibana/master/development-documentation.html) was added for features that require explanation or tutorials - [x] [Unit or functional tests](https://www.elastic.co/guide/en/kibana/master/development-tests.html) were updated or added to match the most common scenarios - [x] Any UI touched in this PR is usable by keyboard only (learn more about [keyboard accessibility](https://webaim.org/techniques/keyboard/)) - [x] Any UI touched in this PR does not create any new axe failures (run axe in browser: [FF](https://addons.mozilla.org/en-US/firefox/addon/axe-devtools/), [Chrome](https://chrome.google.com/webstore/detail/axe-web-accessibility-tes/lhdoppojpmngadmnindnejefpokejbdd?hl=en-US)) ~- [ ] If a plugin configuration key changed, check if it needs to be allowlisted in the cloud and added to the [docker list](https://github.com/elastic/kibana/blob/main/src/dev/build/tasks/os_packages/docker_generator/resources/base/bin/kibana-docker)~ - [x] This renders correctly on smaller devices using a responsive layout. (You can test this [in your browser](https://www.browserstack.com/guide/responsive-testing-on-local-server)) ~- [ ] This was checked for [cross-browser compatibility](https://www.elastic.co/support/matrix#matrix_browsers)~ --- .../cards_navigation/README.mdx | 31 +++++- .../src/cards_navigation.test.tsx | 45 ++++++++ .../cards_navigation/src/cards_navigation.tsx | 93 ++++++++++++---- .../cards_navigation/src/consts.tsx | 101 ++++++------------ .../cards_navigation/src/index.ts | 5 +- .../cards_navigation/src/types.ts | 65 ++++++++++- .../public/components/landing/landing.tsx | 1 + src/plugins/management/public/plugin.tsx | 5 +- src/plugins/management/public/types.ts | 12 ++- 9 files changed, 250 insertions(+), 108 deletions(-) diff --git a/packages/kbn-management/cards_navigation/README.mdx b/packages/kbn-management/cards_navigation/README.mdx index a8d64031646a2c..3471c58d04af22 100644 --- a/packages/kbn-management/cards_navigation/README.mdx +++ b/packages/kbn-management/cards_navigation/README.mdx @@ -13,15 +13,36 @@ categories. ### Adding new items to the navigation -For adding a new item to the navigation all you have to do is edit the `cards_navigation/src/consts.tsx` -file and add two things: +There are two distinctive ways of adding items to the navigation; -* Add the app id into the `appIds` enum (make sure that the app_id value matches the one from the plugin) -* Add a new entry to the `appDefinitions` object. In here you can specify the category where you want it to be, icon and description. +- to add navigation items that would be visible across all consumers of this package all you have to do is; + + * edit the `cards_navigation/src/types.tsx` file and add the app id into the `appIds` enum (make sure that the app_id value matches the one from the plugin) + * edit the `cards_navigation/src/const.tsx`, add a new entry to the `appDefinitions` object. In here you can specify the category where you want it to be, icon and description. + +- To add a localized navigation item that would only exist within the context of usage for this component, an "extend card navigation" definition can be passed in like so; + + ```typescript + + ``` + + In the example above assuming the key `visualize` is a valid registered management app ID, this definition would show up as a navigation card under the predefined category `content`. It's also worth pointing out that there's also + an opt out functionality that allows one to provide definitions that don't map to management app, and requires that the property `skipValidation` be passed and set to true, in this case the responsibility is on the + user passing the defintion to also provide the `href` that the card will link to, and it's `title`. ### Removing an item from the navigation -If an item needs to be hidden from the navigation you can specify that by using the `hideLinksTo` prop: +If an item needs to be hidden from the navigation you can specify that by using the `hideLinksTo` prop like so: ```typescript { expect(dataPipelinesApp).toBeNull(); }); }); + + describe('extending card navigation definition', () => { + test('does not render a card for a definition that specifies an invalid app id', () => { + const invalidAppId = 'some-invalid-app-id'; + + renderCardsNavigationComponent({ + sections: sectionsMock, + appBasePath: APP_BASE_PATH, + extendedCardNavigationDefinitions: { + [invalidAppId]: { + icon: 'launch', + description: 'Invalid app not part of any registered management section', + category: 'other', + }, + }, + }); + + const invalidAppCard = screen.queryByTestId(`app-card-${invalidAppId}`); + + expect(invalidAppCard).toBeNull(); + }); + + test("renders a card for a definition that specifies any key, given the skipValidation property has a value of 'true'", () => { + const notManagementAppId = 'some-external-app'; + + renderCardsNavigationComponent({ + sections: sectionsMock, + appBasePath: APP_BASE_PATH, + extendedCardNavigationDefinitions: { + [notManagementAppId]: { + icon: 'launch', + description: 'Invalid app not part of any registered management section', + category: 'other', + skipValidation: true, + title: 'Some external app', + href: '/path-to-said-external-app', + }, + }, + }); + + const externalAppCard = screen.queryByTestId(`app-card-${notManagementAppId}`); + + expect(externalAppCard).not.toBeNull(); + }); + }); }); diff --git a/packages/kbn-management/cards_navigation/src/cards_navigation.tsx b/packages/kbn-management/cards_navigation/src/cards_navigation.tsx index b88fae02aeeaa6..f9d5624a05447c 100644 --- a/packages/kbn-management/cards_navigation/src/cards_navigation.tsx +++ b/packages/kbn-management/cards_navigation/src/cards_navigation.tsx @@ -6,7 +6,7 @@ * Side Public License, v 1. */ -import React from 'react'; +import React, { useMemo } from 'react'; import { i18n } from '@kbn/i18n'; import { flatMap } from 'lodash'; import { @@ -18,10 +18,22 @@ import { EuiCard, EuiText, EuiHorizontalRule, + EuiIcon, } from '@elastic/eui'; -import { CardsNavigationComponentProps, AppRegistrySections, Application, AppProps } from './types'; -import { appCategories, appDefinitions, getAppIdsByCategory } from './consts'; -import type { AppId } from './consts'; +import { + CardsNavigationComponentProps, + AppRegistrySections, + Application, + AppProps, + AppId, + AppDefinition, + CardNavExtensionDefinition, +} from './types'; +import { appCategories, appDefinitions as defaultCardNavigationDefinitions } from './consts'; + +type AggregatedCardNavDefinitions = + | NonNullable + | Record; // Retrieve the data we need from a given app from the management app registry const getDataFromManagementApp = (app: Application) => { @@ -32,23 +44,47 @@ const getDataFromManagementApp = (app: Application) => { }; }; +// Compose a list of app ids that belong to a given category +export const getAppIdsByCategory = ( + category: string, + appDefinitions: AggregatedCardNavDefinitions +) => { + const appKeys = Object.keys(appDefinitions) as AppId[]; + return appKeys.filter((appId: AppId) => { + return appDefinitions[appId].category === category; + }); +}; + // Given a category and a list of apps, build an array of apps that belong to that category -const getAppsForCategory = (category: string, filteredApps: { [key: string]: Application }) => { - return getAppIdsByCategory(category) - .map((appId: AppId) => { - if (!filteredApps[appId]) { - return null; - } +const getAppsForCategoryFactory = + (appDefinitions: AggregatedCardNavDefinitions) => + (category: string, filteredApps: { [key: string]: Application }) => { + return getAppIdsByCategory(category, appDefinitions) + .map((appId: AppId) => { + if ((appDefinitions[appId] as CardNavExtensionDefinition).skipValidation) { + return { + id: appId, + ...appDefinitions[appId], + }; + } - return { - ...getDataFromManagementApp(filteredApps[appId]), - ...appDefinitions[appId], - }; - }) - .filter(Boolean) as AppProps[]; -}; + if (!filteredApps[appId]) { + return null; + } -const getEnabledAppsByCategory = (sections: AppRegistrySections[], hideLinksTo: string[]) => { + return { + ...getDataFromManagementApp(filteredApps[appId]), + ...appDefinitions[appId], + }; + }) + .filter(Boolean) as AppProps[]; + }; + +const getEnabledAppsByCategory = ( + sections: AppRegistrySections[], + cardNavigationDefintions: AggregatedCardNavDefinitions, + hideLinksTo: string[] +) => { // Flatten all apps into a single array const flattenApps = flatMap(sections, (section) => section.apps) // Remove all apps that the consumer wants to disable. @@ -62,6 +98,8 @@ const getEnabledAppsByCategory = (sections: AppRegistrySections[], hideLinksTo: {} ); + const getAppsForCategory = getAppsForCategoryFactory(cardNavigationDefintions); + // Build list of categories with apps that are enabled return [ { @@ -101,8 +139,17 @@ export const CardsNavigation = ({ appBasePath, onCardClick, hideLinksTo = [], + extendedCardNavigationDefinitions = {}, }: CardsNavigationComponentProps) => { - const appsByCategory = getEnabledAppsByCategory(sections, hideLinksTo); + const cardNavigationDefintions = useMemo( + () => ({ + ...defaultCardNavigationDefinitions, + ...extendedCardNavigationDefinitions, + }), + [extendedCardNavigationDefinitions] + ); + + const appsByCategory = getEnabledAppsByCategory(sections, cardNavigationDefintions, hideLinksTo); return ( @@ -137,11 +184,15 @@ export const CardsNavigation = ({ } titleSize="xs" title={app.title} description={app.description} - href={appBasePath + app.href} + href={ + (app as CardNavExtensionDefinition).skipValidation + ? app.href + : appBasePath + app.href + } onClick={onCardClick} /> diff --git a/packages/kbn-management/cards_navigation/src/consts.tsx b/packages/kbn-management/cards_navigation/src/consts.tsx index 94001f1c1acd47..502e4dc3c03ad6 100644 --- a/packages/kbn-management/cards_navigation/src/consts.tsx +++ b/packages/kbn-management/cards_navigation/src/consts.tsx @@ -6,42 +6,13 @@ * Side Public License, v 1. */ -import React from 'react'; import { i18n } from '@kbn/i18n'; -import { EuiIcon } from '@elastic/eui'; +import { AppIds, AppId, AppDefinition, appCategories } from './types'; -import { AppDefinition } from './types'; - -export enum appIds { - INGEST_PIPELINES = 'ingest_pipelines', - PIPELINES = 'pipelines', - INDEX_MANAGEMENT = 'index_management', - TRANSFORM = 'transform', - ML = 'jobsListLink', - SAVED_OBJECTS = 'objects', - TAGS = 'tags', - FILES_MANAGEMENT = 'filesManagement', - API_KEYS = 'api_keys', - DATA_VIEWS = 'dataViews', - REPORTING = 'reporting', - CONNECTORS = 'triggersActionsConnectors', - RULES = 'triggersActions', - MAINTENANCE_WINDOWS = 'maintenanceWindows', - SERVERLESS_SETTINGS = 'settings', -} - -// Create new type that is a union of all the appId values -export type AppId = `${appIds}`; - -export const appCategories = { - DATA: 'data', - ALERTS: 'alerts', - CONTENT: 'content', - OTHER: 'other', -}; +export { AppIds, appCategories } from './types'; export const appDefinitions: Record = { - [appIds.INDEX_MANAGEMENT]: { + [AppIds.INDEX_MANAGEMENT]: { category: appCategories.DATA, description: i18n.translate( 'management.landing.withCardNavigation.indexmanagementDescription', @@ -50,16 +21,16 @@ export const appDefinitions: Record = { 'Configure and maintain your Elasticsearch indices for data storage and retrieval.', } ), - icon: , + icon: 'indexSettings', }, - [appIds.TRANSFORM]: { + [AppIds.TRANSFORM]: { category: appCategories.DATA, description: i18n.translate('management.landing.withCardNavigation.transformDescription', { defaultMessage: 'Pivot your data or copy the latest documents into an entity-centric index.', }), - icon: , + icon: 'indexFlush', }, - [appIds.INGEST_PIPELINES]: { + [AppIds.INGEST_PIPELINES]: { category: appCategories.DATA, description: i18n.translate( 'management.landing.withCardNavigation.ingestPipelinesDescription', @@ -67,47 +38,47 @@ export const appDefinitions: Record = { defaultMessage: 'Remove fields, extract values, and perform transformations on your data.', } ), - icon: , + icon: 'logstashInput', }, - [appIds.DATA_VIEWS]: { + [AppIds.DATA_VIEWS]: { category: appCategories.DATA, description: i18n.translate('management.landing.withCardNavigation.dataViewsDescription', { defaultMessage: 'Create and manage the Elasticsearch data you selected for exploration.', }), - icon: , + icon: 'indexEdit', }, - [appIds.ML]: { + [AppIds.ML]: { category: appCategories.DATA, description: i18n.translate('management.landing.withCardNavigation.mlDescription', { defaultMessage: 'Identify, analyze, and process your data using advanced analysis techniques.', }), - icon: , + icon: 'indexMapping', }, - [appIds.PIPELINES]: { + [AppIds.PIPELINES]: { category: appCategories.DATA, description: i18n.translate('management.landing.withCardNavigation.ingestDescription', { defaultMessage: 'Manage and view the Logstash event processing pipeline from inputs to outputs.', }), - icon: , + icon: 'logstashQueue', }, - [appIds.RULES]: { + [AppIds.RULES]: { category: appCategories.ALERTS, description: i18n.translate('management.landing.withCardNavigation.rulesDescription', { defaultMessage: 'Define when to generate alerts and notifications.', }), - icon: , + icon: 'editorChecklist', }, - [appIds.CONNECTORS]: { + [AppIds.CONNECTORS]: { category: appCategories.ALERTS, description: i18n.translate('management.landing.withCardNavigation.connectorsDescription', { defaultMessage: 'Configure connections to third party systems for use in cases and rules.', }), - icon: , + icon: 'desktop', }, - [appIds.MAINTENANCE_WINDOWS]: { + [AppIds.MAINTENANCE_WINDOWS]: { category: appCategories.ALERTS, description: i18n.translate( 'management.landing.withCardNavigation.maintenanceWindowsDescription', @@ -116,59 +87,51 @@ export const appDefinitions: Record = { 'Suppress rule notifications during scheduled times for maintenance, updates, and other system tasks.', } ), - icon: , + icon: 'wrench', }, - [appIds.SAVED_OBJECTS]: { + [AppIds.SAVED_OBJECTS]: { category: appCategories.CONTENT, description: i18n.translate('management.landing.withCardNavigation.objectsDescription', { defaultMessage: 'Manage your saved dashboards, maps, data views, and Canvas workpads.', }), - icon: , + icon: 'save', }, - [appIds.FILES_MANAGEMENT]: { + [AppIds.FILES_MANAGEMENT]: { category: appCategories.CONTENT, description: i18n.translate('management.landing.withCardNavigation.fileManagementDescription', { defaultMessage: 'Access all files that you uploaded.', }), - icon: , + icon: 'documents', }, - [appIds.REPORTING]: { + [AppIds.REPORTING]: { category: appCategories.CONTENT, description: i18n.translate('management.landing.withCardNavigation.reportingDescription', { defaultMessage: 'Manage generated PDF, PNG and CSV reports.', }), - icon: , + icon: 'visPie', }, - [appIds.TAGS]: { + [AppIds.TAGS]: { category: appCategories.CONTENT, description: i18n.translate('management.landing.withCardNavigation.tagsDescription', { defaultMessage: 'Organize, search, and filter your saved objects by specific criteria.', }), - icon: , + icon: 'tag', }, - [appIds.API_KEYS]: { + [AppIds.API_KEYS]: { category: appCategories.OTHER, description: i18n.translate('management.landing.withCardNavigation.apiKeysDescription', { defaultMessage: 'Allow programmatic access to your project data and capabilities.', }), - icon: , + icon: 'lockOpen', }, - [appIds.SERVERLESS_SETTINGS]: { + [AppIds.SERVERLESS_SETTINGS]: { category: appCategories.OTHER, description: i18n.translate('management.landing.withCardNavigation.settingsDescription', { defaultMessage: 'Control project behavior, such as date display and default sorting.', }), - icon: , + icon: 'gear', }, }; - -// Compose a list of app ids that belong to a given category -export const getAppIdsByCategory = (category: string) => { - const appKeys = Object.keys(appDefinitions) as AppId[]; - return appKeys.filter((appId: AppId) => { - return appDefinitions[appId].category === category; - }); -}; diff --git a/packages/kbn-management/cards_navigation/src/index.ts b/packages/kbn-management/cards_navigation/src/index.ts index 6644159aee9e81..b57e28ae6ddfdd 100644 --- a/packages/kbn-management/cards_navigation/src/index.ts +++ b/packages/kbn-management/cards_navigation/src/index.ts @@ -6,8 +6,7 @@ * Side Public License, v 1. */ -export type { CardsNavigationComponentProps } from './types'; -export type { AppId } from './consts'; +export type { CardsNavigationComponentProps, AppId } from './types'; -export { appIds } from './consts'; +export { AppIds as appIds } from './consts'; export { CardsNavigation } from './cards_navigation'; diff --git a/packages/kbn-management/cards_navigation/src/types.ts b/packages/kbn-management/cards_navigation/src/types.ts index 7b31dc25ef5ba1..d63c4063b0a6d2 100644 --- a/packages/kbn-management/cards_navigation/src/types.ts +++ b/packages/kbn-management/cards_navigation/src/types.ts @@ -5,7 +5,39 @@ * in compliance with, at your election, the Elastic License 2.0 or the Server * Side Public License, v 1. */ -import type { AppId } from './consts'; + +import type { EuiIconProps } from '@elastic/eui'; + +/** + * app ids shared by all solutions + */ +export enum AppIds { + INGEST_PIPELINES = 'ingest_pipelines', + PIPELINES = 'pipelines', + INDEX_MANAGEMENT = 'index_management', + TRANSFORM = 'transform', + ML = 'jobsListLink', + SAVED_OBJECTS = 'objects', + TAGS = 'tags', + FILES_MANAGEMENT = 'filesManagement', + API_KEYS = 'api_keys', + DATA_VIEWS = 'dataViews', + REPORTING = 'reporting', + CONNECTORS = 'triggersActionsConnectors', + RULES = 'triggersActions', + MAINTENANCE_WINDOWS = 'maintenanceWindows', + SERVERLESS_SETTINGS = 'settings', +} + +// Create new type that is a union of all the appId values +export type AppId = `${AppIds}`; + +export const appCategories = { + DATA: 'data', + ALERTS: 'alerts', + CONTENT: 'content', + OTHER: 'other', +} as const; export interface Application { id: string; @@ -25,6 +57,7 @@ export interface CardsNavigationComponentProps { appBasePath: string; onCardClick?: (e: React.MouseEvent) => void; hideLinksTo?: AppId[]; + extendedCardNavigationDefinitions?: Record; } export interface ManagementAppProps { @@ -34,9 +67,33 @@ export interface ManagementAppProps { } export interface AppDefinition { - category: string; + category: typeof appCategories[keyof typeof appCategories]; description: string; - icon: React.ReactElement; + icon: EuiIconProps['type']; } -export type AppProps = ManagementAppProps & AppDefinition; +export type CardNavExtensionDefinition = AppDefinition & + ( + | { + /** + * Optional prop that indicates if the card nav definition being declared, + * skips validation to ascertain it's key is a valid id for a management app. + */ + skipValidation?: false; + } + | { + skipValidation: true; + /** + * Specify the url that the card nav being defined should route to, + * and is only expected when the value of {@link skipValidation} prop is passed true. + */ + href: string; + /** + * Defines the title of the card nav being defined, + * and is only expected when the {@link skipValidation} prop value is true. + */ + title: string; + } + ); + +export type AppProps = ManagementAppProps & (AppDefinition | CardNavExtensionDefinition); diff --git a/src/plugins/management/public/components/landing/landing.tsx b/src/plugins/management/public/components/landing/landing.tsx index 90323ad838eb9d..ecb9683e236139 100644 --- a/src/plugins/management/public/components/landing/landing.tsx +++ b/src/plugins/management/public/components/landing/landing.tsx @@ -38,6 +38,7 @@ export const ManagementLandingPage = ({ sections={sections} appBasePath={appBasePath} hideLinksTo={cardsNavigationConfig?.hideLinksTo} + extendedCardNavigationDefinitions={cardsNavigationConfig?.extendCardNavDefinitions} /> ); diff --git a/src/plugins/management/public/plugin.tsx b/src/plugins/management/public/plugin.tsx index 7b6b0c06ec7313..ee0668d0b9c7ab 100644 --- a/src/plugins/management/public/plugin.tsx +++ b/src/plugins/management/public/plugin.tsx @@ -93,6 +93,7 @@ export class ManagementPlugin private cardsNavigationConfig$ = new BehaviorSubject({ enabled: false, hideLinksTo: [], + extendCardNavDefinitions: {}, }); constructor(private initializerContext: PluginInitializerContext) {} @@ -205,8 +206,8 @@ export class ManagementPlugin return { setIsSidebarEnabled: (isSidebarEnabled: boolean) => this.isSidebarEnabled$.next(isSidebarEnabled), - setupCardsNavigation: ({ enabled, hideLinksTo }) => - this.cardsNavigationConfig$.next({ enabled, hideLinksTo }), + setupCardsNavigation: ({ enabled, hideLinksTo, extendCardNavDefinitions }) => + this.cardsNavigationConfig$.next({ enabled, hideLinksTo, extendCardNavDefinitions }), }; } } diff --git a/src/plugins/management/public/types.ts b/src/plugins/management/public/types.ts index 439f827797f6b6..7a5f1775f9a658 100644 --- a/src/plugins/management/public/types.ts +++ b/src/plugins/management/public/types.ts @@ -10,7 +10,7 @@ import { Observable } from 'rxjs'; import { ScopedHistory, Capabilities } from '@kbn/core/public'; import type { LocatorPublic } from '@kbn/share-plugin/common'; import { ChromeBreadcrumb, CoreTheme } from '@kbn/core/public'; -import type { AppId } from '@kbn/management-cards-navigation'; +import type { CardsNavigationComponentProps } from '@kbn/management-cards-navigation'; import { AppNavLinkStatus } from '@kbn/core/public'; import { ManagementSection, RegisterManagementSectionArgs } from './utils'; import type { ManagementAppLocatorParams } from '../common/locator'; @@ -31,7 +31,11 @@ export interface DefinedSections { export interface ManagementStart { setIsSidebarEnabled: (enabled: boolean) => void; - setupCardsNavigation: ({ enabled, hideLinksTo }: NavigationCardsSubject) => void; + setupCardsNavigation: ({ + enabled, + hideLinksTo, + extendCardNavDefinitions, + }: NavigationCardsSubject) => void; } export interface ManagementSectionsStartPrivate { @@ -82,9 +86,9 @@ export interface CreateManagementItemArgs { redirectFrom?: string; // redirects from an old app id to the current app id } -export interface NavigationCardsSubject { +export interface NavigationCardsSubject extends Pick { enabled: boolean; - hideLinksTo?: AppId[]; + extendCardNavDefinitions?: CardsNavigationComponentProps['extendedCardNavigationDefinitions']; } export interface AppDependencies { From e398e7bc514239a387c0605d176a511185f34d38 Mon Sep 17 00:00:00 2001 From: Pierre Gayvallet Date: Tue, 24 Oct 2023 11:32:09 +0200 Subject: [PATCH 60/68] [Core plugin system] Add dynamic contract resolving (#167113) ### Summary Fix https://github.com/elastic/kibana/issues/166688 Implements dynamic contract resolving for plugins, allowing to retrieve contracts after their respective lifecycle is completed, and therefore working around cyclic dependencies. In term of workflow execution, we're basically going from Screenshot 2023-09-27 at 08 09 27 to: Screenshot 2023-09-27 at 08 09 32 ### API This functionality is exposed by the now publicly exposed `plugins` service contracts: ```ts setup(core) { core.plugins.onSetup<{pluginA: SetupContractA, pluginB: SetupContractA}>('pluginA', 'pluginB') .then(({ pluginA, pluginB }) => { if(pluginA.found && pluginB.found) { // do something with pluginA.contract and pluginB.contract } }); } ``` ```ts start(core) { core.plugins.onStart<{pluginA: StartContractA, pluginB: StartContractA}>('pluginA', 'pluginB') .then(({ pluginA, pluginB }) => { if(pluginA.found && pluginB.found) { // do something with pluginA.contract and pluginB.contract } }); } ``` **remark:** the `setup` contract exposed both `onSetup` and `onStart`, while the `start` contract only exposed `onStart`. The intent is to avoid fully disrupting the concept of lifecycle stages. ### Guardrails To prevent developer from abusing this new API, or at least to add some visibility on its adoption, plugins can only perforn dynamic contract resolving against dependencies explicitly defined in their manifest: - any required dependencies (*existing concept*) - any optional dependencies (*existing concept*) - any runtime dependencies (**new concept**) Runtime dependencies must be specified using the new `runtimePluginDependencies` field of a plugin's manifest. ```json { "type": "plugin", "id": "@kbn/some-id", "owner": "@elastic/kibana-core", "plugin": { "id": "some-id", "...": "...", "runtimePluginDependencies" : ["someOtherPluginId"] } } ``` Using the contract resolving API will throw at call time when trying to resolve the contract for an undeclared dependency. E.g this would throw at invocation time (not returning a rejected promise - throw). ```ts setup(core) { core.plugins.onSetup<{undeclaredDependency: SomeContract}>('undeclaredDependency'); } ``` The reasoning behind throwing is that these errors should only occur during the development process, and an hard fail is way more visible than a promise rejection that should be more easily shallowed. ### Code reviews This PR defines @elastic/kibana-core as codeowner of all `kibana.jsonc` files in the `src/plugins` and `x-pack/plugins` directories, so that a code review will be triggered whenever anyone changes something in any manifest. The intent is to be able to monitor new usages of the feature, via the addition of entries in the `runtimePluginDependencies` option of the manifest. ### Remarks Exposing this API, and therefore making possible cyclic dependencies between plugins, opens the door to other questions. For instance, cross-plugin type imports are not technically possible at the moment, given that plugins are referencing each others via TS refs, and refs forbid cyclic dependencies. Which means that to leverage this to address cyclic dependency issues, the public types of **at least one of the two** plugins will have to be extracted to a shared place (likely a package). Resolving, or trying to improve the developer experience around this issue, is absolutely out of scope of the current PR (and the issue it addresses). --------- Co-authored-by: kibanamachine <42973632+kibanamachine@users.noreply.github.com> --- .github/CODEOWNERS | 8 + .../bfetch_explorer/public/hooks/use_deps.ts | 2 +- .../response_stream/public/hooks/use_deps.ts | 2 +- package.json | 4 + .../src/core_app.test.ts | 1 + .../core/base/core-base-common/src/plugins.ts | 6 + .../src/internal_core_setup.ts | 3 +- .../src/internal_core_start.ts | 2 +- .../src/core_setup.mock.ts | 4 + .../src/core_start.mock.ts | 3 + .../core-lifecycle-browser/src/core_setup.ts | 3 + .../core-lifecycle-browser/src/core_start.ts | 3 + .../core-lifecycle-browser/tsconfig.json | 3 +- .../src/core_setup.mock.ts | 4 + .../src/core_start.mock.ts | 3 + .../core-lifecycle-server/src/core_setup.ts | 3 + .../core-lifecycle-server/src/core_start.ts | 3 + .../core-lifecycle-server/tsconfig.json | 3 +- .../core-plugins-browser-internal/index.ts | 4 +- .../src/index.ts | 4 +- .../src/plugin.test.ts | 1 + .../src/plugin.ts | 2 + .../src/plugin_context.test.ts | 1 + .../src/plugin_context.ts | 40 +- .../src/plugin_contract_resolver.test.ts | 342 ++++++++++++++++++ .../src/plugin_contract_resolver.ts | 161 +++++++++ .../src/plugins_service.test.mocks.ts | 9 + .../src/plugins_service.test.ts | 59 ++- .../src/plugins_service.ts | 48 ++- .../src/test_helpers/index.ts | 1 + .../plugin_contract_resolver.mock.ts | 20 + .../tsconfig.json | 2 + .../src/plugins_service.mock.ts | 26 +- .../core-plugins-contracts-browser/README.md | 6 + .../core-plugins-contracts-browser/index.ts | 18 + .../jest.config.js | 13 + .../kibana.jsonc | 5 + .../package.json | 6 + .../src/contracts.ts | 184 ++++++++++ .../tsconfig.json | 19 + .../core-plugins-contracts-server/README.md | 5 + .../core-plugins-contracts-server/index.ts | 18 + .../jest.config.js | 13 + .../kibana.jsonc | 5 + .../package.json | 6 + .../src/contracts.ts | 184 ++++++++++ .../tsconfig.json | 19 + .../core-plugins-server-internal/index.ts | 4 +- ...lugin_manifest_from_plugin_package.test.ts | 4 + .../plugin_manifest_from_plugin_package.ts | 1 + .../discovery/plugin_manifest_parser.test.ts | 5 + .../src/discovery/plugin_manifest_parser.ts | 4 + .../core-plugins-server-internal/src/index.ts | 4 +- .../src/plugin.test.ts | 22 +- .../src/plugin.ts | 2 + .../src/plugin_context.test.ts | 3 +- .../src/plugin_context.ts | 50 ++- .../src/plugin_contract_resolver.test.ts | 342 ++++++++++++++++++ .../src/plugin_contract_resolver.ts | 161 +++++++++ .../src/plugins_service.test.ts | 4 + .../src/plugins_service.ts | 8 +- .../src/plugins_system.test.mocks.ts | 11 + .../src/plugins_system.test.ts | 114 ++++-- .../src/plugins_system.ts | 56 ++- .../src/test_helpers/index.ts | 1 + .../plugin_contract_resolver.mock.ts | 20 + .../tsconfig.json | 2 + .../src/plugins_service.mock.ts | 35 +- .../core-plugins-server-mocks/tsconfig.json | 3 +- .../plugins/core-plugins-server/src/types.ts | 6 + .../bootstrap/get_plugin_bundle_paths.test.ts | 1 + .../legacy/parse_kibana_platform_plugin.js | 4 + packages/kbn-repo-packages/legacy/types.ts | 1 + .../modern/parse_package_manifest.js | 10 + packages/kbn-repo-packages/modern/types.ts | 1 + src/core/public/index.ts | 10 + src/core/server/index.ts | 19 +- src/core/tsconfig.json | 2 + .../integration_tests/file_service.test.ts | 8 +- src/plugins/files/tsconfig.json | 1 + .../core_dynamic_resolving_a/kibana.jsonc | 14 + .../core_dynamic_resolving_a/package.json | 14 + .../core_dynamic_resolving_a/server/index.ts | 11 + .../core_dynamic_resolving_a/server/plugin.ts | 71 ++++ .../core_dynamic_resolving_a/tsconfig.json | 19 + .../core_dynamic_resolving_b/kibana.jsonc | 14 + .../core_dynamic_resolving_b/package.json | 14 + .../core_dynamic_resolving_b/server/index.ts | 11 + .../core_dynamic_resolving_b/server/plugin.ts | 71 ++++ .../core_dynamic_resolving_b/tsconfig.json | 19 + .../dynamic_contract_resolving.ts | 39 ++ .../test_suites/core_plugins/index.ts | 1 + tsconfig.base.json | 8 + .../fleet/.storybook/context/index.tsx | 2 + yarn.lock | 16 + 95 files changed, 2391 insertions(+), 133 deletions(-) create mode 100644 packages/core/plugins/core-plugins-browser-internal/src/plugin_contract_resolver.test.ts create mode 100644 packages/core/plugins/core-plugins-browser-internal/src/plugin_contract_resolver.ts create mode 100644 packages/core/plugins/core-plugins-browser-internal/src/test_helpers/plugin_contract_resolver.mock.ts create mode 100644 packages/core/plugins/core-plugins-contracts-browser/README.md create mode 100644 packages/core/plugins/core-plugins-contracts-browser/index.ts create mode 100644 packages/core/plugins/core-plugins-contracts-browser/jest.config.js create mode 100644 packages/core/plugins/core-plugins-contracts-browser/kibana.jsonc create mode 100644 packages/core/plugins/core-plugins-contracts-browser/package.json create mode 100644 packages/core/plugins/core-plugins-contracts-browser/src/contracts.ts create mode 100644 packages/core/plugins/core-plugins-contracts-browser/tsconfig.json create mode 100644 packages/core/plugins/core-plugins-contracts-server/README.md create mode 100644 packages/core/plugins/core-plugins-contracts-server/index.ts create mode 100644 packages/core/plugins/core-plugins-contracts-server/jest.config.js create mode 100644 packages/core/plugins/core-plugins-contracts-server/kibana.jsonc create mode 100644 packages/core/plugins/core-plugins-contracts-server/package.json create mode 100644 packages/core/plugins/core-plugins-contracts-server/src/contracts.ts create mode 100644 packages/core/plugins/core-plugins-contracts-server/tsconfig.json create mode 100644 packages/core/plugins/core-plugins-server-internal/src/plugin_contract_resolver.test.ts create mode 100644 packages/core/plugins/core-plugins-server-internal/src/plugin_contract_resolver.ts create mode 100644 packages/core/plugins/core-plugins-server-internal/src/test_helpers/plugin_contract_resolver.mock.ts create mode 100644 test/plugin_functional/plugins/core_dynamic_resolving_a/kibana.jsonc create mode 100644 test/plugin_functional/plugins/core_dynamic_resolving_a/package.json create mode 100644 test/plugin_functional/plugins/core_dynamic_resolving_a/server/index.ts create mode 100644 test/plugin_functional/plugins/core_dynamic_resolving_a/server/plugin.ts create mode 100644 test/plugin_functional/plugins/core_dynamic_resolving_a/tsconfig.json create mode 100644 test/plugin_functional/plugins/core_dynamic_resolving_b/kibana.jsonc create mode 100644 test/plugin_functional/plugins/core_dynamic_resolving_b/package.json create mode 100644 test/plugin_functional/plugins/core_dynamic_resolving_b/server/index.ts create mode 100644 test/plugin_functional/plugins/core_dynamic_resolving_b/server/plugin.ts create mode 100644 test/plugin_functional/plugins/core_dynamic_resolving_b/tsconfig.json create mode 100644 test/plugin_functional/test_suites/core_plugins/dynamic_contract_resolving.ts diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index ecfbc723c8f8b4..983754e6dd8db2 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -226,6 +226,8 @@ test/plugin_functional/plugins/core_plugin_b @elastic/kibana-core test/plugin_functional/plugins/core_plugin_chromeless @elastic/kibana-core test/plugin_functional/plugins/core_plugin_deep_links @elastic/kibana-core test/plugin_functional/plugins/core_plugin_deprecations @elastic/kibana-core +test/plugin_functional/plugins/core_dynamic_resolving_a @elastic/kibana-core +test/plugin_functional/plugins/core_dynamic_resolving_b @elastic/kibana-core test/plugin_functional/plugins/core_plugin_execution_context @elastic/kibana-core test/plugin_functional/plugins/core_plugin_helpmenu @elastic/kibana-core test/node_roles_functional/plugins/core_plugin_initializer_context @elastic/kibana-core @@ -235,6 +237,8 @@ packages/core/plugins/core-plugins-base-server-internal @elastic/kibana-core packages/core/plugins/core-plugins-browser @elastic/kibana-core packages/core/plugins/core-plugins-browser-internal @elastic/kibana-core packages/core/plugins/core-plugins-browser-mocks @elastic/kibana-core +packages/core/plugins/core-plugins-contracts-browser @elastic/kibana-core +packages/core/plugins/core-plugins-contracts-server @elastic/kibana-core packages/core/plugins/core-plugins-server @elastic/kibana-core packages/core/plugins/core-plugins-server-internal @elastic/kibana-core packages/core/plugins/core-plugins-server-mocks @elastic/kibana-core @@ -1454,6 +1458,10 @@ packages/react @elastic/appex-sharedux /packages/core/saved-objects/docs/openapi @elastic/platform-docs /plugins/data_views/docs/openapi @elastic/platform-docs +# Plugin manifests +/src/plugins/**/kibana.jsonc @elastic/kibana-core +/x-pack/plugins/**/kibana.jsonc @elastic/kibana-core + #### ## These rules are always last so they take ultimate priority over everything else #### diff --git a/examples/bfetch_explorer/public/hooks/use_deps.ts b/examples/bfetch_explorer/public/hooks/use_deps.ts index a8c4b2ae1ad8fb..27544806de23cb 100644 --- a/examples/bfetch_explorer/public/hooks/use_deps.ts +++ b/examples/bfetch_explorer/public/hooks/use_deps.ts @@ -9,4 +9,4 @@ import { useKibana } from '@kbn/kibana-react-plugin/public'; import { BfetchDeps } from '../mount'; -export const useDeps = () => useKibana().services as BfetchDeps; +export const useDeps = () => useKibana().services as unknown as BfetchDeps; diff --git a/examples/response_stream/public/hooks/use_deps.ts b/examples/response_stream/public/hooks/use_deps.ts index ae81669c4a71f6..27c205b8f2a855 100644 --- a/examples/response_stream/public/hooks/use_deps.ts +++ b/examples/response_stream/public/hooks/use_deps.ts @@ -10,4 +10,4 @@ import { useKibana } from '@kbn/kibana-react-plugin/public'; import type { ResponseStreamDeps } from '../mount'; -export const useDeps = () => useKibana().services as ResponseStreamDeps; +export const useDeps = () => useKibana().services as unknown as ResponseStreamDeps; diff --git a/package.json b/package.json index 75ae9e9fd0cdb7..9291646fac18a4 100644 --- a/package.json +++ b/package.json @@ -295,6 +295,8 @@ "@kbn/core-plugin-chromeless-plugin": "link:test/plugin_functional/plugins/core_plugin_chromeless", "@kbn/core-plugin-deep-links-plugin": "link:test/plugin_functional/plugins/core_plugin_deep_links", "@kbn/core-plugin-deprecations-plugin": "link:test/plugin_functional/plugins/core_plugin_deprecations", + "@kbn/core-plugin-dynamic-resolving-a": "link:test/plugin_functional/plugins/core_dynamic_resolving_a", + "@kbn/core-plugin-dynamic-resolving-b": "link:test/plugin_functional/plugins/core_dynamic_resolving_b", "@kbn/core-plugin-execution-context-plugin": "link:test/plugin_functional/plugins/core_plugin_execution_context", "@kbn/core-plugin-helpmenu-plugin": "link:test/plugin_functional/plugins/core_plugin_helpmenu", "@kbn/core-plugin-initializer-context-plugin": "link:test/node_roles_functional/plugins/core_plugin_initializer_context", @@ -303,6 +305,8 @@ "@kbn/core-plugins-base-server-internal": "link:packages/core/plugins/core-plugins-base-server-internal", "@kbn/core-plugins-browser": "link:packages/core/plugins/core-plugins-browser", "@kbn/core-plugins-browser-internal": "link:packages/core/plugins/core-plugins-browser-internal", + "@kbn/core-plugins-contracts-browser": "link:packages/core/plugins/core-plugins-contracts-browser", + "@kbn/core-plugins-contracts-server": "link:packages/core/plugins/core-plugins-contracts-server", "@kbn/core-plugins-server": "link:packages/core/plugins/core-plugins-server", "@kbn/core-plugins-server-internal": "link:packages/core/plugins/core-plugins-server-internal", "@kbn/core-preboot-server": "link:packages/core/preboot/core-preboot-server", diff --git a/packages/core/apps/core-apps-server-internal/src/core_app.test.ts b/packages/core/apps/core-apps-server-internal/src/core_app.test.ts index f16abb781bbfb3..851f443cd3e1ce 100644 --- a/packages/core/apps/core-apps-server-internal/src/core_app.test.ts +++ b/packages/core/apps/core-apps-server-internal/src/core_app.test.ts @@ -135,6 +135,7 @@ describe('CoreApp', () => { optionalPlugins: [], requiredBundles: [], requiredPlugins: [], + runtimePluginDependencies: [], }); }); it('calls `registerBundleRoutes` with the correct options', () => { diff --git a/packages/core/base/core-base-common/src/plugins.ts b/packages/core/base/core-base-common/src/plugins.ts index 61e44374d514dc..3fbd7bcefbffd0 100644 --- a/packages/core/base/core-base-common/src/plugins.ts +++ b/packages/core/base/core-base-common/src/plugins.ts @@ -77,6 +77,12 @@ export interface DiscoveredPlugin { */ readonly requiredBundles: readonly PluginName[]; + /** + * An optional list of plugin dependencies that can be resolved dynamically at runtime + * using the dynamic contract resolving capabilities from the plugin service. + */ + readonly runtimePluginDependencies: readonly PluginName[]; + /** * Specifies whether this plugin - and its required dependencies - will be enabled for anonymous pages (login page, status page when * configured, etc.) Default is false. diff --git a/packages/core/lifecycle/core-lifecycle-browser-internal/src/internal_core_setup.ts b/packages/core/lifecycle/core-lifecycle-browser-internal/src/internal_core_setup.ts index e844b3facf7648..9ef51b986458cb 100644 --- a/packages/core/lifecycle/core-lifecycle-browser-internal/src/internal_core_setup.ts +++ b/packages/core/lifecycle/core-lifecycle-browser-internal/src/internal_core_setup.ts @@ -11,7 +11,8 @@ import type { InternalApplicationSetup } from '@kbn/core-application-browser-int import type { InternalInjectedMetadataSetup } from '@kbn/core-injected-metadata-browser-internal'; /** @internal */ -export interface InternalCoreSetup extends Omit { +export interface InternalCoreSetup + extends Omit { application: InternalApplicationSetup; injectedMetadata: InternalInjectedMetadataSetup; } diff --git a/packages/core/lifecycle/core-lifecycle-browser-internal/src/internal_core_start.ts b/packages/core/lifecycle/core-lifecycle-browser-internal/src/internal_core_start.ts index 294c1b226b7331..f6b20626cd561e 100644 --- a/packages/core/lifecycle/core-lifecycle-browser-internal/src/internal_core_start.ts +++ b/packages/core/lifecycle/core-lifecycle-browser-internal/src/internal_core_start.ts @@ -11,7 +11,7 @@ import type { InternalApplicationStart } from '@kbn/core-application-browser-int import type { InternalInjectedMetadataStart } from '@kbn/core-injected-metadata-browser-internal'; /** @internal */ -export interface InternalCoreStart extends Omit { +export interface InternalCoreStart extends Omit { application: InternalApplicationStart; injectedMetadata: InternalInjectedMetadataStart; } diff --git a/packages/core/lifecycle/core-lifecycle-browser-mocks/src/core_setup.mock.ts b/packages/core/lifecycle/core-lifecycle-browser-mocks/src/core_setup.mock.ts index f9048a3c985286..400b20d0861a28 100644 --- a/packages/core/lifecycle/core-lifecycle-browser-mocks/src/core_setup.mock.ts +++ b/packages/core/lifecycle/core-lifecycle-browser-mocks/src/core_setup.mock.ts @@ -44,6 +44,10 @@ export function createCoreSetupMock({ settings: settingsServiceMock.createSetupContract(), deprecations: deprecationsServiceMock.createSetupContract(), theme: themeServiceMock.createSetupContract(), + plugins: { + onSetup: jest.fn(), + onStart: jest.fn(), + }, }; return mock; diff --git a/packages/core/lifecycle/core-lifecycle-browser-mocks/src/core_start.mock.ts b/packages/core/lifecycle/core-lifecycle-browser-mocks/src/core_start.mock.ts index 6293d1d6205250..920cf025d3f3d7 100644 --- a/packages/core/lifecycle/core-lifecycle-browser-mocks/src/core_start.mock.ts +++ b/packages/core/lifecycle/core-lifecycle-browser-mocks/src/core_start.mock.ts @@ -40,6 +40,9 @@ export function createCoreStartMock({ basePath = '' } = {}) { deprecations: deprecationsServiceMock.createStartContract(), theme: themeServiceMock.createStartContract(), fatalErrors: fatalErrorsServiceMock.createStartContract(), + plugins: { + onStart: jest.fn(), + }, }; return mock; diff --git a/packages/core/lifecycle/core-lifecycle-browser/src/core_setup.ts b/packages/core/lifecycle/core-lifecycle-browser/src/core_setup.ts index 2739864a1c82fa..0dab68e6699066 100644 --- a/packages/core/lifecycle/core-lifecycle-browser/src/core_setup.ts +++ b/packages/core/lifecycle/core-lifecycle-browser/src/core_setup.ts @@ -15,6 +15,7 @@ import type { IUiSettingsClient, SettingsStart } from '@kbn/core-ui-settings-bro import type { NotificationsSetup } from '@kbn/core-notifications-browser'; import type { ApplicationSetup } from '@kbn/core-application-browser'; import type { CustomBrandingSetup } from '@kbn/core-custom-branding-browser'; +import type { PluginsServiceSetup } from '@kbn/core-plugins-contracts-browser'; import type { CoreStart } from './core_start'; /** @@ -53,6 +54,8 @@ export interface CoreSetup; } diff --git a/packages/core/lifecycle/core-lifecycle-browser/src/core_start.ts b/packages/core/lifecycle/core-lifecycle-browser/src/core_start.ts index 26a6e4a3c7464d..7ab760e1141147 100644 --- a/packages/core/lifecycle/core-lifecycle-browser/src/core_start.ts +++ b/packages/core/lifecycle/core-lifecycle-browser/src/core_start.ts @@ -21,6 +21,7 @@ import type { NotificationsStart } from '@kbn/core-notifications-browser'; import type { ApplicationStart } from '@kbn/core-application-browser'; import type { ChromeStart } from '@kbn/core-chrome-browser'; import type { CustomBrandingStart } from '@kbn/core-custom-branding-browser'; +import type { PluginsServiceStart } from '@kbn/core-plugins-contracts-browser'; /** * Core services exposed to the `Plugin` start lifecycle @@ -68,4 +69,6 @@ export interface CoreStart { deprecations: DeprecationsServiceStart; /** {@link ThemeServiceStart} */ theme: ThemeServiceStart; + /** {@link PluginsServiceStart} */ + plugins: PluginsServiceStart; } diff --git a/packages/core/lifecycle/core-lifecycle-browser/tsconfig.json b/packages/core/lifecycle/core-lifecycle-browser/tsconfig.json index b61b279d4d3fb4..fab6ad33f3c016 100644 --- a/packages/core/lifecycle/core-lifecycle-browser/tsconfig.json +++ b/packages/core/lifecycle/core-lifecycle-browser/tsconfig.json @@ -26,7 +26,8 @@ "@kbn/core-overlays-browser", "@kbn/core-saved-objects-browser", "@kbn/core-chrome-browser", - "@kbn/core-custom-branding-browser" + "@kbn/core-custom-branding-browser", + "@kbn/core-plugins-contracts-browser" ], "exclude": [ "target/**/*", diff --git a/packages/core/lifecycle/core-lifecycle-server-mocks/src/core_setup.mock.ts b/packages/core/lifecycle/core-lifecycle-server-mocks/src/core_setup.mock.ts index 0436e677a7e64b..c7fbf68319471a 100644 --- a/packages/core/lifecycle/core-lifecycle-server-mocks/src/core_setup.mock.ts +++ b/packages/core/lifecycle/core-lifecycle-server-mocks/src/core_setup.mock.ts @@ -70,6 +70,10 @@ export function createCoreSetupMock({ coreUsageData: { registerUsageCounter: coreUsageDataServiceMock.createSetupContract().registerUsageCounter, }, + plugins: { + onSetup: jest.fn(), + onStart: jest.fn(), + }, getStartServices: jest .fn, object, any]>, []>() .mockResolvedValue([createCoreStartMock(), pluginStartDeps, pluginStartContract]), diff --git a/packages/core/lifecycle/core-lifecycle-server-mocks/src/core_start.mock.ts b/packages/core/lifecycle/core-lifecycle-server-mocks/src/core_start.mock.ts index 646fdef3b596b4..850d534f046d61 100644 --- a/packages/core/lifecycle/core-lifecycle-server-mocks/src/core_start.mock.ts +++ b/packages/core/lifecycle/core-lifecycle-server-mocks/src/core_start.mock.ts @@ -33,6 +33,9 @@ export function createCoreStartMock() { coreUsageData: coreUsageDataServiceMock.createStartContract(), executionContext: executionContextServiceMock.createInternalStartContract(), customBranding: customBrandingServiceMock.createStartContract(), + plugins: { + onStart: jest.fn(), + }, }; return mock; diff --git a/packages/core/lifecycle/core-lifecycle-server/src/core_setup.ts b/packages/core/lifecycle/core-lifecycle-server/src/core_setup.ts index aa4fd54fa2f999..788b875a0de21a 100644 --- a/packages/core/lifecycle/core-lifecycle-server/src/core_setup.ts +++ b/packages/core/lifecycle/core-lifecycle-server/src/core_setup.ts @@ -24,6 +24,7 @@ import { UiSettingsServiceSetup } from '@kbn/core-ui-settings-server'; import { CoreUsageDataSetup } from '@kbn/core-usage-data-server'; import { CustomBrandingSetup } from '@kbn/core-custom-branding-server'; import { UserSettingsServiceSetup } from '@kbn/core-user-settings-server'; +import { PluginsServiceSetup } from '@kbn/core-plugins-contracts-server'; import { CoreStart } from './core_start'; /** @@ -73,6 +74,8 @@ export interface CoreSetup; /** @internal {@link CoreUsageDataSetup} */ coreUsageData: CoreUsageDataSetup; + /** {@link PluginsServiceSetup} */ + plugins: PluginsServiceSetup; } /** diff --git a/packages/core/lifecycle/core-lifecycle-server/src/core_start.ts b/packages/core/lifecycle/core-lifecycle-server/src/core_start.ts index 602e5e060fb623..0a50158132f5ff 100644 --- a/packages/core/lifecycle/core-lifecycle-server/src/core_start.ts +++ b/packages/core/lifecycle/core-lifecycle-server/src/core_start.ts @@ -17,6 +17,7 @@ import { SavedObjectsServiceStart } from '@kbn/core-saved-objects-server'; import { UiSettingsServiceStart } from '@kbn/core-ui-settings-server'; import { CoreUsageDataStart } from '@kbn/core-usage-data-server'; import { CustomBrandingStart } from '@kbn/core-custom-branding-server'; +import { PluginsServiceStart } from '@kbn/core-plugins-contracts-server'; /** * Context passed to the plugins `start` method. @@ -46,4 +47,6 @@ export interface CoreStart { uiSettings: UiSettingsServiceStart; /** @internal {@link CoreUsageDataStart} */ coreUsageData: CoreUsageDataStart; + /** {@link PluginsServiceStart} */ + plugins: PluginsServiceStart; } diff --git a/packages/core/lifecycle/core-lifecycle-server/tsconfig.json b/packages/core/lifecycle/core-lifecycle-server/tsconfig.json index 52ca45a533995d..0815ad467c6a35 100644 --- a/packages/core/lifecycle/core-lifecycle-server/tsconfig.json +++ b/packages/core/lifecycle/core-lifecycle-server/tsconfig.json @@ -29,7 +29,8 @@ "@kbn/core-ui-settings-server", "@kbn/core-usage-data-server", "@kbn/core-custom-branding-server", - "@kbn/core-user-settings-server" + "@kbn/core-user-settings-server", + "@kbn/core-plugins-contracts-server" ], "exclude": [ "target/**/*", diff --git a/packages/core/plugins/core-plugins-browser-internal/index.ts b/packages/core/plugins/core-plugins-browser-internal/index.ts index 6f251aace7e08f..0b59849ee75364 100644 --- a/packages/core/plugins/core-plugins-browser-internal/index.ts +++ b/packages/core/plugins/core-plugins-browser-internal/index.ts @@ -8,8 +8,8 @@ export { PluginsService } from './src'; export type { - PluginsServiceSetup, - PluginsServiceStart, + InternalPluginsServiceSetup, + InternalPluginsServiceStart, PluginsServiceSetupDeps, PluginsServiceStartDeps, } from './src'; diff --git a/packages/core/plugins/core-plugins-browser-internal/src/index.ts b/packages/core/plugins/core-plugins-browser-internal/src/index.ts index f3f78eb4708bb1..e442fe84120a29 100644 --- a/packages/core/plugins/core-plugins-browser-internal/src/index.ts +++ b/packages/core/plugins/core-plugins-browser-internal/src/index.ts @@ -8,8 +8,8 @@ export { PluginsService } from './plugins_service'; export type { - PluginsServiceSetup, - PluginsServiceStart, + InternalPluginsServiceSetup, + InternalPluginsServiceStart, PluginsServiceSetupDeps, PluginsServiceStartDeps, } from './plugins_service'; diff --git a/packages/core/plugins/core-plugins-browser-internal/src/plugin.test.ts b/packages/core/plugins/core-plugins-browser-internal/src/plugin.test.ts index f4df372b30a039..883b1dfa911f36 100644 --- a/packages/core/plugins/core-plugins-browser-internal/src/plugin.test.ts +++ b/packages/core/plugins/core-plugins-browser-internal/src/plugin.test.ts @@ -24,6 +24,7 @@ function createManifest( requiredPlugins: required, optionalPlugins: optional, requiredBundles: [], + runtimePluginDependencies: [], owner: { name: 'foo', }, diff --git a/packages/core/plugins/core-plugins-browser-internal/src/plugin.ts b/packages/core/plugins/core-plugins-browser-internal/src/plugin.ts index c61d9afb175c14..0b35538d6dfe63 100644 --- a/packages/core/plugins/core-plugins-browser-internal/src/plugin.ts +++ b/packages/core/plugins/core-plugins-browser-internal/src/plugin.ts @@ -32,6 +32,7 @@ export class PluginWrapper< public readonly configPath: DiscoveredPlugin['configPath']; public readonly requiredPlugins: DiscoveredPlugin['requiredPlugins']; public readonly optionalPlugins: DiscoveredPlugin['optionalPlugins']; + public readonly runtimePluginDependencies: DiscoveredPlugin['runtimePluginDependencies']; private instance?: Plugin; private readonly startDependencies$ = new Subject<[CoreStart, TPluginsStart, TStart]>(); @@ -46,6 +47,7 @@ export class PluginWrapper< this.configPath = discoveredPlugin.configPath; this.requiredPlugins = discoveredPlugin.requiredPlugins; this.optionalPlugins = discoveredPlugin.optionalPlugins; + this.runtimePluginDependencies = discoveredPlugin.runtimePluginDependencies; } /** diff --git a/packages/core/plugins/core-plugins-browser-internal/src/plugin_context.test.ts b/packages/core/plugins/core-plugins-browser-internal/src/plugin_context.test.ts index 1b1bea2279b60f..4e803b5b403da1 100644 --- a/packages/core/plugins/core-plugins-browser-internal/src/plugin_context.test.ts +++ b/packages/core/plugins/core-plugins-browser-internal/src/plugin_context.test.ts @@ -20,6 +20,7 @@ const createPluginManifest = (pluginName: string): DiscoveredPlugin => { requiredPlugins: [], optionalPlugins: [], requiredBundles: [], + runtimePluginDependencies: [], }; }; diff --git a/packages/core/plugins/core-plugins-browser-internal/src/plugin_context.ts b/packages/core/plugins/core-plugins-browser-internal/src/plugin_context.ts index 9ff182cda25233..604eb86093758c 100644 --- a/packages/core/plugins/core-plugins-browser-internal/src/plugin_context.ts +++ b/packages/core/plugins/core-plugins-browser-internal/src/plugin_context.ts @@ -11,8 +11,9 @@ import type { CoreContext } from '@kbn/core-base-browser-internal'; import type { DiscoveredPlugin, PluginOpaqueId } from '@kbn/core-base-common'; import type { CoreSetup, CoreStart } from '@kbn/core-lifecycle-browser'; import type { PluginInitializerContext } from '@kbn/core-plugins-browser'; -import { PluginWrapper } from './plugin'; -import { PluginsServiceSetupDeps, PluginsServiceStartDeps } from './plugins_service'; +import type { PluginWrapper } from './plugin'; +import type { PluginsServiceSetupDeps, PluginsServiceStartDeps } from './plugins_service'; +import type { IRuntimePluginContractResolver } from './plugin_contract_resolver'; /** * Provides a plugin-specific context passed to the plugin's constructor. This is currently @@ -63,11 +64,15 @@ export function createPluginSetupContext< TStart, TPluginsSetup extends object, TPluginsStart extends object ->( - coreContext: CoreContext, - deps: PluginsServiceSetupDeps, - plugin: PluginWrapper -): CoreSetup { +>({ + deps, + plugin, + runtimeResolver, +}: { + deps: PluginsServiceSetupDeps; + plugin: PluginWrapper; + runtimeResolver: IRuntimePluginContractResolver; +}): CoreSetup { return { analytics: deps.analytics, application: { @@ -82,6 +87,10 @@ export function createPluginSetupContext< uiSettings: deps.uiSettings, settings: deps.settings, theme: deps.theme, + plugins: { + onSetup: (...dependencyNames) => runtimeResolver.onSetup(plugin.name, dependencyNames), + onStart: (...dependencyNames) => runtimeResolver.onStart(plugin.name, dependencyNames), + }, getStartServices: () => plugin.startDependencies, }; } @@ -101,11 +110,15 @@ export function createPluginStartContext< TStart, TPluginsSetup extends object, TPluginsStart extends object ->( - coreContext: CoreContext, - deps: PluginsServiceStartDeps, - plugin: PluginWrapper -): CoreStart { +>({ + deps, + plugin, + runtimeResolver, +}: { + deps: PluginsServiceStartDeps; + plugin: PluginWrapper; + runtimeResolver: IRuntimePluginContractResolver; +}): CoreStart { return { analytics: deps.analytics, application: { @@ -131,5 +144,8 @@ export function createPluginStartContext< fatalErrors: deps.fatalErrors, deprecations: deps.deprecations, theme: deps.theme, + plugins: { + onStart: (...dependencyNames) => runtimeResolver.onStart(plugin.name, dependencyNames), + }, }; } diff --git a/packages/core/plugins/core-plugins-browser-internal/src/plugin_contract_resolver.test.ts b/packages/core/plugins/core-plugins-browser-internal/src/plugin_contract_resolver.test.ts new file mode 100644 index 00000000000000..935ca4789b23b8 --- /dev/null +++ b/packages/core/plugins/core-plugins-browser-internal/src/plugin_contract_resolver.test.ts @@ -0,0 +1,342 @@ +/* + * 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 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 or the Server + * Side Public License, v 1. + */ + +import { RuntimePluginContractResolver } from './plugin_contract_resolver'; + +const nextTick = () => new Promise((resolve) => setTimeout(resolve, 1)); +const fewTicks = () => + nextTick() + .then(() => nextTick()) + .then(() => nextTick()); + +const toMap = (record: Record): Map => { + return new Map(Object.entries(record)); +}; + +const pluginAContract = Symbol(); + +describe('RuntimePluginContractResolver', () => { + const SOURCE_PLUGIN = 'sourcePlugin'; + let resolver: RuntimePluginContractResolver; + + beforeEach(() => { + resolver = new RuntimePluginContractResolver(); + + const dependencyMap = new Map>(); + dependencyMap.set(SOURCE_PLUGIN, new Set(['pluginA', 'pluginB', 'pluginC'])); + resolver.setDependencyMap(dependencyMap); + }); + + describe('setup contracts', () => { + it('throws if onSetup is called before setDependencyMap', () => { + resolver = new RuntimePluginContractResolver(); + + expect(() => resolver.onSetup(SOURCE_PLUGIN, ['pluginA'])).toThrowErrorMatchingInlineSnapshot( + `"onSetup cannot be called before setDependencyMap"` + ); + }); + + it('throws if resolveSetupRequests is called multiple times', async () => { + resolver.resolveSetupRequests( + toMap({ + pluginA: pluginAContract, + }) + ); + + expect(() => + resolver.resolveSetupRequests( + toMap({ + pluginA: pluginAContract, + }) + ) + ).toThrowErrorMatchingInlineSnapshot(`"resolveSetupRequests can only be called once"`); + }); + + it('resolves a single request', async () => { + const handler = jest.fn(); + resolver.onSetup(SOURCE_PLUGIN, ['pluginA']).then((contracts) => handler(contracts)); + + await fewTicks(); + + expect(handler).not.toHaveBeenCalled(); + + resolver.resolveSetupRequests( + toMap({ + pluginA: pluginAContract, + }) + ); + + await fewTicks(); + + expect(handler).toHaveBeenCalledTimes(1); + expect(handler).toHaveBeenCalledWith({ + pluginA: { + found: true, + contract: pluginAContract, + }, + }); + }); + + it('resolves multiple requests', async () => { + const handler1 = jest.fn(); + const handler2 = jest.fn(); + const handler3 = jest.fn(); + + resolver.onSetup(SOURCE_PLUGIN, ['pluginA']).then((contracts) => handler1(contracts)); + resolver.onSetup(SOURCE_PLUGIN, ['pluginB']).then((contracts) => handler2(contracts)); + resolver + .onSetup(SOURCE_PLUGIN, ['pluginA', 'pluginB']) + .then((contracts) => handler3(contracts)); + + await fewTicks(); + + expect(handler1).not.toHaveBeenCalled(); + expect(handler2).not.toHaveBeenCalled(); + expect(handler3).not.toHaveBeenCalled(); + + resolver.resolveSetupRequests( + toMap({ + pluginA: pluginAContract, + }) + ); + + await fewTicks(); + + expect(handler1).toHaveBeenCalledTimes(1); + expect(handler1).toHaveBeenCalledWith({ + pluginA: { + found: true, + contract: pluginAContract, + }, + }); + + expect(handler2).toHaveBeenCalledTimes(1); + expect(handler2).toHaveBeenCalledWith({ + pluginB: { + found: false, + }, + }); + + expect(handler3).toHaveBeenCalledTimes(1); + expect(handler3).toHaveBeenCalledWith({ + pluginA: { + found: true, + contract: pluginAContract, + }, + pluginB: { + found: false, + }, + }); + }); + + it('resolves requests instantly when called after resolveSetupRequests', async () => { + resolver.resolveSetupRequests( + toMap({ + pluginA: pluginAContract, + }) + ); + + const handler1 = jest.fn(); + const handler2 = jest.fn(); + resolver.onSetup(SOURCE_PLUGIN, ['pluginA']).then((contracts) => handler1(contracts)); + resolver.onSetup(SOURCE_PLUGIN, ['pluginB']).then((contracts) => handler2(contracts)); + + await fewTicks(); + + expect(handler1).toHaveBeenCalledTimes(1); + expect(handler1).toHaveBeenCalledWith({ + pluginA: { + found: true, + contract: pluginAContract, + }, + }); + + expect(handler2).toHaveBeenCalledTimes(1); + expect(handler2).toHaveBeenCalledWith({ + pluginB: { + found: false, + }, + }); + }); + + it('throws when requesting a contract not defined in the dependency map', async () => { + expect(() => + resolver.onSetup(SOURCE_PLUGIN, ['undeclaredPlugin']) + ).toThrowErrorMatchingInlineSnapshot( + `"Dynamic contract resolving requires the dependencies to be declared in the plugin manifest.Undeclared dependencies: undeclaredPlugin"` + ); + }); + + it('throws when requesting a mixed defined/undefined dependencies', async () => { + expect(() => + resolver.onSetup(SOURCE_PLUGIN, [ + 'pluginA', + 'undeclaredPlugin1', + 'pluginB', + 'undeclaredPlugin2', + ]) + ).toThrowErrorMatchingInlineSnapshot( + `"Dynamic contract resolving requires the dependencies to be declared in the plugin manifest.Undeclared dependencies: undeclaredPlugin1, undeclaredPlugin2"` + ); + }); + }); + + describe('start contracts', () => { + it('throws if onStart is called before setDependencyMap', () => { + resolver = new RuntimePluginContractResolver(); + + expect(() => resolver.onStart(SOURCE_PLUGIN, ['pluginA'])).toThrowErrorMatchingInlineSnapshot( + `"onStart cannot be called before setDependencyMap"` + ); + }); + + it('throws if resolveStartRequests is called multiple times', async () => { + resolver.resolveStartRequests( + toMap({ + pluginA: pluginAContract, + }) + ); + + expect(() => + resolver.resolveStartRequests( + toMap({ + pluginA: pluginAContract, + }) + ) + ).toThrowErrorMatchingInlineSnapshot(`"resolveStartRequests can only be called once"`); + }); + + it('resolves a single request', async () => { + const handler = jest.fn(); + resolver.onStart(SOURCE_PLUGIN, ['pluginA']).then((contracts) => handler(contracts)); + + await fewTicks(); + + expect(handler).not.toHaveBeenCalled(); + + resolver.resolveStartRequests( + toMap({ + pluginA: pluginAContract, + }) + ); + + await fewTicks(); + + expect(handler).toHaveBeenCalledTimes(1); + expect(handler).toHaveBeenCalledWith({ + pluginA: { + found: true, + contract: pluginAContract, + }, + }); + }); + + it('resolves multiple requests', async () => { + const handler1 = jest.fn(); + const handler2 = jest.fn(); + const handler3 = jest.fn(); + + resolver.onStart(SOURCE_PLUGIN, ['pluginA']).then((contracts) => handler1(contracts)); + resolver.onStart(SOURCE_PLUGIN, ['pluginB']).then((contracts) => handler2(contracts)); + resolver + .onStart(SOURCE_PLUGIN, ['pluginA', 'pluginB']) + .then((contracts) => handler3(contracts)); + + await fewTicks(); + + expect(handler1).not.toHaveBeenCalled(); + expect(handler2).not.toHaveBeenCalled(); + expect(handler3).not.toHaveBeenCalled(); + + resolver.resolveStartRequests( + toMap({ + pluginA: pluginAContract, + }) + ); + + await fewTicks(); + + expect(handler1).toHaveBeenCalledTimes(1); + expect(handler1).toHaveBeenCalledWith({ + pluginA: { + found: true, + contract: pluginAContract, + }, + }); + + expect(handler2).toHaveBeenCalledTimes(1); + expect(handler2).toHaveBeenCalledWith({ + pluginB: { + found: false, + }, + }); + + expect(handler3).toHaveBeenCalledTimes(1); + expect(handler3).toHaveBeenCalledWith({ + pluginA: { + found: true, + contract: pluginAContract, + }, + pluginB: { + found: false, + }, + }); + }); + + it('resolves requests instantly when called after resolveSetupRequests', async () => { + resolver.resolveStartRequests( + toMap({ + pluginA: pluginAContract, + }) + ); + + const handler1 = jest.fn(); + const handler2 = jest.fn(); + resolver.onStart(SOURCE_PLUGIN, ['pluginA']).then((contracts) => handler1(contracts)); + resolver.onStart(SOURCE_PLUGIN, ['pluginB']).then((contracts) => handler2(contracts)); + + await fewTicks(); + + expect(handler1).toHaveBeenCalledTimes(1); + expect(handler1).toHaveBeenCalledWith({ + pluginA: { + found: true, + contract: pluginAContract, + }, + }); + + expect(handler2).toHaveBeenCalledTimes(1); + expect(handler2).toHaveBeenCalledWith({ + pluginB: { + found: false, + }, + }); + }); + + it('throws when requesting a contract not defined in the dependency map', async () => { + expect(() => + resolver.onStart(SOURCE_PLUGIN, ['undeclaredPlugin']) + ).toThrowErrorMatchingInlineSnapshot( + `"Dynamic contract resolving requires the dependencies to be declared in the plugin manifest.Undeclared dependencies: undeclaredPlugin"` + ); + }); + + it('throws when requesting a mixed defined/undefined dependencies', async () => { + expect(() => + resolver.onStart(SOURCE_PLUGIN, [ + 'pluginA', + 'undeclaredPlugin1', + 'pluginB', + 'undeclaredPlugin2', + ]) + ).toThrowErrorMatchingInlineSnapshot( + `"Dynamic contract resolving requires the dependencies to be declared in the plugin manifest.Undeclared dependencies: undeclaredPlugin1, undeclaredPlugin2"` + ); + }); + }); +}); diff --git a/packages/core/plugins/core-plugins-browser-internal/src/plugin_contract_resolver.ts b/packages/core/plugins/core-plugins-browser-internal/src/plugin_contract_resolver.ts new file mode 100644 index 00000000000000..dc7ebd536bbac1 --- /dev/null +++ b/packages/core/plugins/core-plugins-browser-internal/src/plugin_contract_resolver.ts @@ -0,0 +1,161 @@ +/* + * 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 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 or the Server + * Side Public License, v 1. + */ + +import type { PublicMethodsOf } from '@kbn/utility-types'; +import type { PluginName } from '@kbn/core-base-common'; +import type { + PluginContractResolverResponse, + PluginContractMap, + PluginContractResolverResponseItem, +} from '@kbn/core-plugins-contracts-browser'; + +export type IRuntimePluginContractResolver = PublicMethodsOf; + +export class RuntimePluginContractResolver { + private dependencyMap?: Map>; + private setupContracts?: Map; + private startContracts?: Map; + + private readonly setupRequestQueue: PluginContractRequest[] = []; + private readonly startRequestQueue: PluginContractRequest[] = []; + + setDependencyMap(depMap: Map>) { + this.dependencyMap = new Map(depMap.entries()); + } + + onSetup = ( + pluginName: PluginName, + dependencyNames: Array + ): Promise> => { + if (!this.dependencyMap) { + throw new Error('onSetup cannot be called before setDependencyMap'); + } + + const dependencyList = this.dependencyMap.get(pluginName) ?? new Set(); + const notDependencyPlugins = dependencyNames.filter( + (name) => !dependencyList.has(name as PluginName) + ); + if (notDependencyPlugins.length) { + throw new Error( + 'Dynamic contract resolving requires the dependencies to be declared in the plugin manifest.' + + `Undeclared dependencies: ${notDependencyPlugins.join(', ')}` + ); + } + + if (this.setupContracts) { + const response = createContractRequestResponse( + dependencyNames as PluginName[], + this.setupContracts + ); + return Promise.resolve(response as PluginContractResolverResponse); + } else { + const setupContractRequest = createPluginContractRequest>( + dependencyNames as PluginName[] + ); + this.setupRequestQueue.push(setupContractRequest as PluginContractRequest); + return setupContractRequest.contractPromise; + } + }; + + onStart = ( + pluginName: PluginName, + dependencyNames: Array + ): Promise> => { + if (!this.dependencyMap) { + throw new Error('onStart cannot be called before setDependencyMap'); + } + + const dependencyList = this.dependencyMap.get(pluginName) ?? new Set(); + const notDependencyPlugins = dependencyNames.filter( + (name) => !dependencyList.has(name as PluginName) + ); + if (notDependencyPlugins.length) { + throw new Error( + 'Dynamic contract resolving requires the dependencies to be declared in the plugin manifest.' + + `Undeclared dependencies: ${notDependencyPlugins.join(', ')}` + ); + } + + if (this.startContracts) { + const response = createContractRequestResponse( + dependencyNames as PluginName[], + this.startContracts + ); + return Promise.resolve(response as PluginContractResolverResponse); + } else { + const startContractRequest = createPluginContractRequest>( + dependencyNames as PluginName[] + ); + this.startRequestQueue.push(startContractRequest as PluginContractRequest); + return startContractRequest.contractPromise; + } + }; + + resolveSetupRequests(setupContracts: Map) { + if (this.setupContracts) { + throw new Error('resolveSetupRequests can only be called once'); + } + this.setupContracts = setupContracts; + + for (const setupRequest of this.setupRequestQueue) { + const response = createContractRequestResponse(setupRequest.pluginNames, setupContracts); + setupRequest.resolve(response); + } + } + + resolveStartRequests(startContracts: Map) { + if (this.startContracts) { + throw new Error('resolveStartRequests can only be called once'); + } + this.startContracts = startContracts; + + for (const startRequest of this.startRequestQueue) { + const response = createContractRequestResponse(startRequest.pluginNames, startContracts); + startRequest.resolve(response); + } + } +} + +interface PluginContractRequest { + pluginNames: PluginName[]; + contractPromise: Promise; + resolve: (data?: T) => void; +} + +const createPluginContractRequest = ( + pluginNames: PluginName[] +): PluginContractRequest => { + let resolve!: (data?: T) => void; + const contractPromise = new Promise((_resolve) => { + resolve = _resolve; + }); + + return { + pluginNames, + contractPromise, + resolve, + }; +}; + +const createContractRequestResponse = ( + pluginNames: PluginName[], + contracts: Map +): PluginContractResolverResponse => { + const response = {} as Record; + for (const pluginName of pluginNames) { + const pluginResponse: PluginContractResolverResponseItem = contracts.has(pluginName) + ? { + found: true, + contract: contracts.get(pluginName)!, + } + : { found: false }; + response[pluginName] = pluginResponse; + } + + return response as PluginContractResolverResponse; +}; diff --git a/packages/core/plugins/core-plugins-browser-internal/src/plugins_service.test.mocks.ts b/packages/core/plugins/core-plugins-browser-internal/src/plugins_service.test.mocks.ts index 34198c0b35e148..5243a23cd58aba 100644 --- a/packages/core/plugins/core-plugins-browser-internal/src/plugins_service.test.mocks.ts +++ b/packages/core/plugins/core-plugins-browser-internal/src/plugins_service.test.mocks.ts @@ -8,6 +8,7 @@ import type { PluginName } from '@kbn/core-base-common'; import type { Plugin } from '@kbn/core-plugins-browser'; +import { createRuntimePluginContractResolverMock } from './test_helpers'; export type MockedPluginInitializer = jest.Mock>; @@ -20,3 +21,11 @@ export const mockPluginInitializerProvider: jest.Mock ({ read: mockPluginInitializerProvider, })); + +export const runtimeResolverMock = createRuntimePluginContractResolverMock(); + +jest.doMock('./plugin_contract_resolver', () => { + return { + RuntimePluginContractResolver: jest.fn().mockImplementation(() => runtimeResolverMock), + }; +}); diff --git a/packages/core/plugins/core-plugins-browser-internal/src/plugins_service.test.ts b/packages/core/plugins/core-plugins-browser-internal/src/plugins_service.test.ts index 7127f633f0ca88..00c056a20d87d8 100644 --- a/packages/core/plugins/core-plugins-browser-internal/src/plugins_service.test.ts +++ b/packages/core/plugins/core-plugins-browser-internal/src/plugins_service.test.ts @@ -11,9 +11,10 @@ import { omit } from 'lodash'; import { type MockedPluginInitializer, mockPluginInitializerProvider, + runtimeResolverMock, } from './plugins_service.test.mocks'; -import { type PluginName, PluginType } from '@kbn/core-base-common'; +import { type PluginName, type DiscoveredPlugin, PluginType } from '@kbn/core-base-common'; import { analyticsServiceMock } from '@kbn/core-analytics-browser-mocks'; import { docLinksServiceMock } from '@kbn/core-doc-links-browser-mocks'; import { executionContextServiceMock } from '@kbn/core-execution-context-browser-mocks'; @@ -60,24 +61,24 @@ let mockStartContext: DeeplyMocked; function createManifest( id: string, { required = [], optional = [] }: { required?: string[]; optional?: string[]; ui?: boolean } = {} -) { +): DiscoveredPlugin { return { id, - version: 'some-version', type: PluginType.standard, configPath: ['path'], requiredPlugins: required, optionalPlugins: optional, requiredBundles: [], - owner: { - name: 'Core', - githubTeam: 'kibana-core', - }, + runtimePluginDependencies: [], }; } describe('PluginsService', () => { beforeEach(() => { + runtimeResolverMock.setDependencyMap.mockReset(); + runtimeResolverMock.resolveSetupRequests.mockReset(); + runtimeResolverMock.resolveStartRequests.mockReset(); + plugins = [ { id: 'pluginA', plugin: createManifest('pluginA') }, { id: 'pluginB', plugin: createManifest('pluginB', { required: ['pluginA'] }) }, @@ -101,6 +102,7 @@ describe('PluginsService', () => { mockSetupContext = { ...omit(mockSetupDeps, 'injectedMetadata'), application: expect.any(Object), + plugins: expect.any(Object), getStartServices: expect.any(Function), }; // @ts-expect-error this file was not being type checked properly in the past, error is legit @@ -124,6 +126,7 @@ describe('PluginsService', () => { mockStartContext = { ...omit(mockStartDeps, 'injectedMetadata'), application: expect.any(Object), + plugins: expect.any(Object), chrome: omit(mockStartDeps.chrome, 'getComponent'), }; @@ -248,6 +251,28 @@ describe('PluginsService', () => { expect(pluginDDeps).not.toHaveProperty('missing'); }); + it('setups the runtimeResolver', async () => { + const pluginsService = new PluginsService(mockCoreContext, plugins); + await pluginsService.setup(mockSetupDeps); + + expect(runtimeResolverMock.setDependencyMap).toHaveBeenCalledTimes(1); + expect(runtimeResolverMock.setDependencyMap).toHaveBeenCalledWith(expect.any(Map)); + + expect(runtimeResolverMock.resolveSetupRequests).toHaveBeenCalledTimes(1); + expect(runtimeResolverMock.resolveSetupRequests).toHaveBeenCalledWith(expect.any(Map)); + expect( + Object.fromEntries([...runtimeResolverMock.resolveSetupRequests.mock.calls[0][0].entries()]) + ).toEqual({ + pluginA: { + setupValue: 1, + }, + pluginB: { + pluginAPlusB: 2, + }, + pluginC: undefined, + }); + }); + it('returns plugin setup contracts', async () => { const pluginsService = new PluginsService(mockCoreContext, plugins); const { contracts } = await pluginsService.setup(mockSetupDeps); @@ -299,6 +324,26 @@ describe('PluginsService', () => { expect(pluginDDeps).not.toHaveProperty('missing'); }); + it('setups the runtimeResolver', async () => { + const pluginsService = new PluginsService(mockCoreContext, plugins); + await pluginsService.setup(mockSetupDeps); + await pluginsService.start(mockStartDeps); + + expect(runtimeResolverMock.resolveStartRequests).toHaveBeenCalledTimes(1); + expect(runtimeResolverMock.resolveStartRequests).toHaveBeenCalledWith(expect.any(Map)); + expect( + Object.fromEntries([...runtimeResolverMock.resolveStartRequests.mock.calls[0][0].entries()]) + ).toEqual({ + pluginA: { + startValue: 2, + }, + pluginB: { + pluginAPlusB: 3, + }, + pluginC: undefined, + }); + }); + it('returns plugin start contracts', async () => { const pluginsService = new PluginsService(mockCoreContext, plugins); await pluginsService.setup(mockSetupDeps); diff --git a/packages/core/plugins/core-plugins-browser-internal/src/plugins_service.ts b/packages/core/plugins/core-plugins-browser-internal/src/plugins_service.ts index 4e10796fd3a65a..8cf1c9beb1ac6c 100644 --- a/packages/core/plugins/core-plugins-browser-internal/src/plugins_service.ts +++ b/packages/core/plugins/core-plugins-browser-internal/src/plugins_service.ts @@ -16,6 +16,7 @@ import { createPluginSetupContext, createPluginStartContext, } from './plugin_context'; +import { RuntimePluginContractResolver } from './plugin_contract_resolver'; /** @internal */ export type PluginsServiceSetupDeps = InternalCoreSetup; @@ -23,12 +24,12 @@ export type PluginsServiceSetupDeps = InternalCoreSetup; export type PluginsServiceStartDeps = InternalCoreStart; /** @internal */ -export interface PluginsServiceSetup { +export interface InternalPluginsServiceSetup { contracts: ReadonlyMap; } /** @internal */ -export interface PluginsServiceStart { +export interface InternalPluginsServiceStart { contracts: ReadonlyMap; } @@ -38,7 +39,10 @@ export interface PluginsServiceStart { * * @internal */ -export class PluginsService implements CoreService { +export class PluginsService + implements CoreService +{ + private readonly runtimeResolver = new RuntimePluginContractResolver(); /** Plugin wrappers in topological order. */ private readonly plugins = new Map>(); private readonly pluginDependencies = new Map(); @@ -79,7 +83,10 @@ export class PluginsService implements CoreService { + public async setup(deps: PluginsServiceSetupDeps): Promise { + const runtimeDependencies = buildPluginRuntimeDependencyMap(this.plugins); + this.runtimeResolver.setDependencyMap(runtimeDependencies); + // Setup each plugin with required and optional plugin contracts const contracts = new Map(); for (const [pluginName, plugin] of this.plugins.entries()) { @@ -97,7 +104,11 @@ export class PluginsService implements CoreService { + public async start(deps: PluginsServiceStartDeps): Promise { // Setup each plugin with required and optional plugin contracts const contracts = new Map(); for (const [pluginName, plugin] of this.plugins.entries()) { @@ -127,13 +140,19 @@ export class PluginsService implements CoreService +): Map> => { + const runtimeDependencies = new Map>(); + for (const [pluginName, pluginWrapper] of pluginMap.entries()) { + const pluginRuntimeDeps = new Set([ + ...pluginWrapper.optionalPlugins, + ...pluginWrapper.requiredPlugins, + ...pluginWrapper.runtimePluginDependencies, + ]); + runtimeDependencies.set(pluginName, pluginRuntimeDeps); + } + return runtimeDependencies; +}; diff --git a/packages/core/plugins/core-plugins-browser-internal/src/test_helpers/index.ts b/packages/core/plugins/core-plugins-browser-internal/src/test_helpers/index.ts index ee660a8c1f8bfc..bc0bbeddbf40b1 100644 --- a/packages/core/plugins/core-plugins-browser-internal/src/test_helpers/index.ts +++ b/packages/core/plugins/core-plugins-browser-internal/src/test_helpers/index.ts @@ -7,3 +7,4 @@ */ export { createPluginInitializerContextMock } from './mocks'; +export { createRuntimePluginContractResolverMock } from './plugin_contract_resolver.mock'; diff --git a/packages/core/plugins/core-plugins-browser-internal/src/test_helpers/plugin_contract_resolver.mock.ts b/packages/core/plugins/core-plugins-browser-internal/src/test_helpers/plugin_contract_resolver.mock.ts new file mode 100644 index 00000000000000..a71c7e3ea857e5 --- /dev/null +++ b/packages/core/plugins/core-plugins-browser-internal/src/test_helpers/plugin_contract_resolver.mock.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 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 or the Server + * Side Public License, v 1. + */ + +import type { IRuntimePluginContractResolver } from '../plugin_contract_resolver'; + +export const createRuntimePluginContractResolverMock = + (): jest.Mocked => { + return { + setDependencyMap: jest.fn(), + onSetup: jest.fn(), + onStart: jest.fn(), + resolveSetupRequests: jest.fn(), + resolveStartRequests: jest.fn(), + }; + }; diff --git a/packages/core/plugins/core-plugins-browser-internal/tsconfig.json b/packages/core/plugins/core-plugins-browser-internal/tsconfig.json index 29a75896edda99..36b1959b2d3945 100644 --- a/packages/core/plugins/core-plugins-browser-internal/tsconfig.json +++ b/packages/core/plugins/core-plugins-browser-internal/tsconfig.json @@ -35,6 +35,8 @@ "@kbn/core-http-browser-mocks", "@kbn/core-saved-objects-browser-mocks", "@kbn/core-deprecations-browser-mocks", + "@kbn/utility-types", + "@kbn/core-plugins-contracts-browser", ], "exclude": [ "target/**/*", diff --git a/packages/core/plugins/core-plugins-browser-mocks/src/plugins_service.mock.ts b/packages/core/plugins/core-plugins-browser-mocks/src/plugins_service.mock.ts index 83424769612679..ff3d60c5c5706b 100644 --- a/packages/core/plugins/core-plugins-browser-mocks/src/plugins_service.mock.ts +++ b/packages/core/plugins/core-plugins-browser-mocks/src/plugins_service.mock.ts @@ -9,23 +9,27 @@ import type { PublicMethodsOf } from '@kbn/utility-types'; import { loggerMock } from '@kbn/logging-mocks'; import type { PluginInitializerContext } from '@kbn/core-plugins-browser'; -import type { PluginsService, PluginsServiceSetup } from '@kbn/core-plugins-browser-internal'; +import type { + PluginsService, + InternalPluginsServiceSetup, + InternalPluginsServiceStart, +} from '@kbn/core-plugins-browser-internal'; import type { BuildFlavor } from '@kbn/config/src/types'; -const createSetupContractMock = () => { - const setupContract: jest.Mocked = { +const createInternalSetupContractMock = () => { + const setupContract: jest.Mocked = { contracts: new Map(), }; // we have to suppress type errors until decide how to mock es6 class - return setupContract as PluginsServiceSetup; + return setupContract as InternalPluginsServiceSetup; }; -const createStartContractMock = () => { - const startContract: jest.Mocked = { +const createInternalStartContractMock = () => { + const startContract: jest.Mocked = { contracts: new Map(), }; // we have to suppress type errors until decide how to mock es6 class - return startContract as PluginsServiceSetup; + return startContract as InternalPluginsServiceSetup; }; const createPluginInitializerContextMock = ( @@ -68,14 +72,14 @@ const createMock = () => { stop: jest.fn(), }; - mocked.setup.mockResolvedValue(createSetupContractMock()); - mocked.start.mockResolvedValue(createStartContractMock()); + mocked.setup.mockResolvedValue(createInternalSetupContractMock()); + mocked.start.mockResolvedValue(createInternalStartContractMock()); return mocked; }; export const pluginsServiceMock = { create: createMock, - createSetupContract: createSetupContractMock, - createStartContract: createStartContractMock, + createInternalSetupContract: createInternalSetupContractMock, + createInternalStartContract: createInternalStartContractMock, createPluginInitializerContext: createPluginInitializerContextMock, }; diff --git a/packages/core/plugins/core-plugins-contracts-browser/README.md b/packages/core/plugins/core-plugins-contracts-browser/README.md new file mode 100644 index 00000000000000..b34aea4108555c --- /dev/null +++ b/packages/core/plugins/core-plugins-contracts-browser/README.md @@ -0,0 +1,6 @@ +# @kbn/core-plugins-contracts-browser + +This package contains the public types for core's browser-side plugins service's contracts. + +The dedicated package was required to avoid a cyclic dependencies between the `plugins` and `lifecycle` domains. + diff --git a/packages/core/plugins/core-plugins-contracts-browser/index.ts b/packages/core/plugins/core-plugins-contracts-browser/index.ts new file mode 100644 index 00000000000000..be4fa307be1066 --- /dev/null +++ b/packages/core/plugins/core-plugins-contracts-browser/index.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 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 or the Server + * Side Public License, v 1. + */ + +export type { + PluginsServiceSetup, + PluginsServiceStart, + PluginContractMap, + PluginContractResolver, + PluginContractResolverResponse, + PluginContractResolverResponseItem, + FoundPluginContractResolverResponseItem, + NotFoundPluginContractResolverResponseItem, +} from './src/contracts'; diff --git a/packages/core/plugins/core-plugins-contracts-browser/jest.config.js b/packages/core/plugins/core-plugins-contracts-browser/jest.config.js new file mode 100644 index 00000000000000..f57737513fa83b --- /dev/null +++ b/packages/core/plugins/core-plugins-contracts-browser/jest.config.js @@ -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 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 or the Server + * Side Public License, v 1. + */ + +module.exports = { + preset: '@kbn/test/jest_node', + rootDir: '../../../..', + roots: ['/packages/core/plugins/core-plugins-contracts-browser'], +}; diff --git a/packages/core/plugins/core-plugins-contracts-browser/kibana.jsonc b/packages/core/plugins/core-plugins-contracts-browser/kibana.jsonc new file mode 100644 index 00000000000000..d4c93363d0deff --- /dev/null +++ b/packages/core/plugins/core-plugins-contracts-browser/kibana.jsonc @@ -0,0 +1,5 @@ +{ + "type": "shared-common", + "id": "@kbn/core-plugins-contracts-browser", + "owner": "@elastic/kibana-core" +} diff --git a/packages/core/plugins/core-plugins-contracts-browser/package.json b/packages/core/plugins/core-plugins-contracts-browser/package.json new file mode 100644 index 00000000000000..cdf9e25ea42b08 --- /dev/null +++ b/packages/core/plugins/core-plugins-contracts-browser/package.json @@ -0,0 +1,6 @@ +{ + "name": "@kbn/core-plugins-contracts-browser", + "private": true, + "version": "1.0.0", + "license": "SSPL-1.0 OR Elastic License 2.0" +} \ No newline at end of file diff --git a/packages/core/plugins/core-plugins-contracts-browser/src/contracts.ts b/packages/core/plugins/core-plugins-contracts-browser/src/contracts.ts new file mode 100644 index 00000000000000..c0d96accd43437 --- /dev/null +++ b/packages/core/plugins/core-plugins-contracts-browser/src/contracts.ts @@ -0,0 +1,184 @@ +/* + * 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 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 or the Server + * Side Public License, v 1. + */ + +import type { PluginName } from '@kbn/core-base-common'; + +/** + * Setup contract of Core's `plugins` service. + * + * @public + */ +export interface PluginsServiceSetup { + /** + * Returns a promise that will resolve with the requested plugin setup contracts once all plugins have been set up. + * + * If called when plugins are already setup, the returned promise will resolve instantly. + * + * The API can only be used to resolve required dependencies, optional dependencies, or dependencies explicitly + * defined as `runtimePluginDependencies` in the calling plugin's manifest, otherwise the API will throw at call time. + * + * **Important:** This API should only be used when trying to address cyclic dependency issues that can't easily + * be solved otherwise. This is meant to be a temporary workaround only supposed to be used until a better solution + * is made available. + * Therefore, by using this API, you implicitly agree to: + * - consider it as technical debt and open an issue to track the tech debt resolution + * - accept that this is only a temporary solution, and will comply to switching to the long term solution when asked by the Core team + * + * @remark The execution order is not guaranteed to be consistent. Only guarantee is that the returned promise will be + * resolved once all plugins are setup, and before Core's `start` is initiated. + * + * @example + * ```ts + * setup(core) { + * core.plugins.onSetup<{pluginA: SetupContractA, pluginB: SetupContractA}>('pluginA', 'pluginB') + * .then(({ pluginA, pluginB }) => { + * if(pluginA.found && pluginB.found) { + * // do something with pluginA.contract and pluginB.contract + * } + * }); + * } + * + * @experimental + * ``` + */ + onSetup: PluginContractResolver; + /** + * Returns a promise that will resolve with the requested plugin start contracts once all plugins have been started. + * + * If called when plugins are already started, the returned promise will resolve instantly. + * + * The API can only be used to resolve required dependencies, optional dependencies, or dependencies explicitly + * defined as `runtimePluginDependencies` in the calling plugin's manifest, otherwise the API will throw at call time. + * + * **Important:** This API should only be used when trying to address cyclic dependency issues that can't easily + * be solved otherwise. This is meant to be a temporary workaround only supposed to be used until a better solution + * is made available. + * Therefore, by using this API, you implicitly agree to: + * - consider it as technical debt and open an issue to track the tech debt resolution + * - accept that this is only a temporary solution, and will comply to switching to the long term solution when asked by the Core team + * + * @remark The execution order is not guaranteed to be consistent. Only guarantee is that the returned promise will be + * resolved once all plugins are started, and before Core's `start` lifecycle is resumed. + * + * @example + * ```ts + * setup(core) { + * core.plugins.onStart<{pluginA: StartContractA, pluginB: StartContractA}>('pluginA', 'pluginB') + * .then(({ pluginA, pluginB }) => { + * if(pluginA.found && pluginB.found) { + * // do something with pluginA.contract and pluginB.contract + * } + * }); + * } + * ``` + * + * @experimental + */ + onStart: PluginContractResolver; +} + +/** + * Start contract of Core's `plugins` service. + * + * @public + */ +export interface PluginsServiceStart { + /** + * Returns a promise that will resolve with the requested plugin start contracts once all plugins have been started. + * + * If called when plugins are already started, the returned promise will resolve instantly. + * + * The API can only be used to resolve required dependencies, optional dependencies, or dependencies explicitly + * defined as `runtimePluginDependencies` in the calling plugin's manifest, otherwise the API will throw at call time. + * + * **Important:** This API should only be used when trying to address cyclic dependency issues that can't easily + * be solved otherwise. This is meant to be a temporary workaround only supposed to be used until a better solution + * is made available. + * Therefore, by using this API, you implicitly agree to: + * - consider it as technical debt and open an issue to track the tech debt resolution + * - accept that this is only a temporary solution, and will comply to switching to the long term solution when asked by the Core team + * + * @remark The execution order is not guaranteed to be consistent. Only guarantee is that the returned promise will be + * resolved once all plugins are started, and before Core's `start` lifecycle is resumed. + * + * @example + * ```ts + * start(core) { + * core.plugins.onStart<{pluginA: StartContractA, pluginB: StartContractA}>('pluginA', 'pluginB') + * .then(({ pluginA, pluginB }) => { + * if(pluginA.found && pluginB.found) { + * // do something with pluginA.contract and pluginB.contract + * } + * }); + * } + * ``` + * + * @experimental + */ + onStart: PluginContractResolver; +} + +/** + * Contract resolver response for found plugins. + * + * @see {@link PluginContractResolverResponseItem} + * @public + */ +export interface FoundPluginContractResolverResponseItem { + found: true; + contract: ContractType; +} + +/** + * Contract resolver response for not found plugins. + * + * @see {@link PluginContractResolverResponseItem} + * @public + */ +export interface NotFoundPluginContractResolverResponseItem { + found: false; +} + +/** + * Contract resolver response. + * + * @see {@link PluginContractResolver} + * @public + */ +export type PluginContractResolverResponseItem = + | NotFoundPluginContractResolverResponseItem + | FoundPluginContractResolverResponseItem; + +/** + * A record of plugin contracts. + * + * @see {@link PluginContractResolver} + * @public + */ +export type PluginContractMap = Record; + +/** + * Response from a plugin contract resolver request. + * + * @see {@link PluginContractResolver} + * @public + */ +export type PluginContractResolverResponse = { + [Key in keyof ContractMap]: PluginContractResolverResponseItem; +}; + +/** + * A plugin contract resolver, allowing to retrieve plugin contracts at runtime. + * + * Please refer to {@link PluginsServiceSetup} and {@link PluginsServiceStart} for more documentation and examples. + * + * @public + */ +export type PluginContractResolver = ( + ...pluginNames: Array +) => Promise>; diff --git a/packages/core/plugins/core-plugins-contracts-browser/tsconfig.json b/packages/core/plugins/core-plugins-contracts-browser/tsconfig.json new file mode 100644 index 00000000000000..2d841f928c1bad --- /dev/null +++ b/packages/core/plugins/core-plugins-contracts-browser/tsconfig.json @@ -0,0 +1,19 @@ +{ + "extends": "../../../../tsconfig.base.json", + "compilerOptions": { + "outDir": "target/types", + "types": [ + "jest", + "node" + ] + }, + "include": [ + "**/*.ts", + ], + "exclude": [ + "target/**/*" + ], + "kbn_references": [ + "@kbn/core-base-common", + ] +} diff --git a/packages/core/plugins/core-plugins-contracts-server/README.md b/packages/core/plugins/core-plugins-contracts-server/README.md new file mode 100644 index 00000000000000..5744f60e0114da --- /dev/null +++ b/packages/core/plugins/core-plugins-contracts-server/README.md @@ -0,0 +1,5 @@ +# @kbn/core-plugins-contracts-server + +This package contains the public types for core's server-side plugins service's contracts. + +The dedicated package was required to avoid a cyclic dependencies between the `plugins` and `lifecycle` domains. diff --git a/packages/core/plugins/core-plugins-contracts-server/index.ts b/packages/core/plugins/core-plugins-contracts-server/index.ts new file mode 100644 index 00000000000000..be4fa307be1066 --- /dev/null +++ b/packages/core/plugins/core-plugins-contracts-server/index.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 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 or the Server + * Side Public License, v 1. + */ + +export type { + PluginsServiceSetup, + PluginsServiceStart, + PluginContractMap, + PluginContractResolver, + PluginContractResolverResponse, + PluginContractResolverResponseItem, + FoundPluginContractResolverResponseItem, + NotFoundPluginContractResolverResponseItem, +} from './src/contracts'; diff --git a/packages/core/plugins/core-plugins-contracts-server/jest.config.js b/packages/core/plugins/core-plugins-contracts-server/jest.config.js new file mode 100644 index 00000000000000..a67981020b273c --- /dev/null +++ b/packages/core/plugins/core-plugins-contracts-server/jest.config.js @@ -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 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 or the Server + * Side Public License, v 1. + */ + +module.exports = { + preset: '@kbn/test/jest_node', + rootDir: '../../../..', + roots: ['/packages/core/plugins/core-plugins-contracts-server'], +}; diff --git a/packages/core/plugins/core-plugins-contracts-server/kibana.jsonc b/packages/core/plugins/core-plugins-contracts-server/kibana.jsonc new file mode 100644 index 00000000000000..8ce77051c273da --- /dev/null +++ b/packages/core/plugins/core-plugins-contracts-server/kibana.jsonc @@ -0,0 +1,5 @@ +{ + "type": "shared-common", + "id": "@kbn/core-plugins-contracts-server", + "owner": "@elastic/kibana-core" +} diff --git a/packages/core/plugins/core-plugins-contracts-server/package.json b/packages/core/plugins/core-plugins-contracts-server/package.json new file mode 100644 index 00000000000000..ed120fbbdc30be --- /dev/null +++ b/packages/core/plugins/core-plugins-contracts-server/package.json @@ -0,0 +1,6 @@ +{ + "name": "@kbn/core-plugins-contracts-server", + "private": true, + "version": "1.0.0", + "license": "SSPL-1.0 OR Elastic License 2.0" +} \ No newline at end of file diff --git a/packages/core/plugins/core-plugins-contracts-server/src/contracts.ts b/packages/core/plugins/core-plugins-contracts-server/src/contracts.ts new file mode 100644 index 00000000000000..edec0204177af2 --- /dev/null +++ b/packages/core/plugins/core-plugins-contracts-server/src/contracts.ts @@ -0,0 +1,184 @@ +/* + * 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 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 or the Server + * Side Public License, v 1. + */ + +import type { PluginName } from '@kbn/core-base-common'; + +/** + * Setup contract of Core's `plugins` service. + * + * @public + */ +export interface PluginsServiceSetup { + /** + * Returns a promise that will resolve with the requested plugin setup contracts once all plugins have been set up. + * + * If called when plugins are already setup, the returned promise will resolve instantly. + * + * The API can only be used to resolve required dependencies, optional dependencies, or dependencies explicitly + * defined as `runtimePluginDependencies` in the calling plugin's manifest, otherwise the API will throw at call time. + * + * **Important:** This API should only be used when trying to address cyclic dependency issues that can't easily + * be solved otherwise. This is meant to be a temporary workaround only supposed to be used until a better solution + * is made available. + * Therefore, by using this API, you implicitly agree to: + * - consider it as technical debt and open an issue to track the tech debt resolution + * - accept that this is only a temporary solution, and will comply to switching to the long term solution when asked by the Core team + * + * @remark The execution order is not guaranteed to be consistent. Only guarantee is that the returned promise will be + * resolved once all plugins are started, and before Core's `start` lifecycle is resumed. + * + * @example + * ```ts + * setup(core) { + * core.plugins.onSetup<{pluginA: SetupContractA, pluginB: SetupContractA}>('pluginA', 'pluginB') + * .then(({ pluginA, pluginB }) => { + * if(pluginA.found && pluginB.found) { + * // do something with pluginA.contract and pluginB.contract + * } + * }); + * } + * + * @experimental + * ``` + */ + onSetup: PluginContractResolver; + /** + * Returns a promise that will resolve with the requested plugin start contracts once all plugins have been started. + * + * If called when plugins are already started, the returned promise will resolve instantly. + * + * The API can only be used to resolve required dependencies, optional dependencies, or dependencies explicitly + * defined as `runtimePluginDependencies` in the calling plugin's manifest, otherwise the API will throw at call time. + * + * **Important:** This API should only be used when trying to address cyclic dependency issues that can't easily + * be solved otherwise. This is meant to be a temporary workaround only supposed to be used until a better solution + * is made available. + * Therefore, by using this API, you implicitly agree to: + * - consider it as technical debt and open an issue to track the tech debt resolution + * - accept that this is only a temporary solution, and will comply to switching to the long term solution when asked by the Core team + * + * @remark The execution order is not guaranteed to be consistent. Only guarantee is that the returned promise will be + * resolved once all plugins are started, and before Core's `start` lifecycle is resumed. + * + * @example + * ```ts + * setup(core) { + * core.plugins.onStart<{pluginA: StartContractA, pluginB: StartContractA}>('pluginA', 'pluginB') + * .then(({ pluginA, pluginB }) => { + * if(pluginA.found && pluginB.found) { + * // do something with pluginA.contract and pluginB.contract + * } + * }); + * } + * + * @experimental + * ``` + */ + onStart: PluginContractResolver; +} + +/** + * Start contract of Core's `plugins` service. + * + * @public + */ +export interface PluginsServiceStart { + /** + * Returns a promise that will resolve with the requested plugin start contracts once all plugins have been started. + * + * If called when plugins are already started, the returned promise will resolve instantly. + * + * The API can only be used to resolve required dependencies, optional dependencies, or dependencies explicitly + * defined as `runtimePluginDependencies` in the calling plugin's manifest, otherwise the API will throw at call time. + * + * **Important:** This API should only be used when trying to address cyclic dependency issues that can't easily + * be solved otherwise. This is meant to be a temporary workaround only supposed to be used until a better solution + * is made available. + * Therefore, by using this API, you implicitly agree to: + * - consider it as technical debt and open an issue to track the tech debt resolution + * - accept that this is only a temporary solution, and will comply to switching to the long term solution when asked by the Core team + * + * @remark The execution order is not guaranteed to be consistent. Only guarantee is that the returned promise will be + * resolved once all plugins are started, and before Core's `start` lifecycle is resumed. + * + * @example + * ```ts + * start(core) { + * core.plugins.onStart<{pluginA: StartContractA, pluginB: StartContractA}>('pluginA', 'pluginB') + * .then(({ pluginA, pluginB }) => { + * if(pluginA.found && pluginB.found) { + * // do something with pluginA.contract and pluginB.contract + * } + * }); + * } + * ``` + * + * @experimental + */ + onStart: PluginContractResolver; +} + +/** + * Contract resolver response for found plugins. + * + * @see {@link PluginContractResolverResponseItem} + * @public + */ +export interface FoundPluginContractResolverResponseItem { + found: true; + contract: ContractType; +} + +/** + * Contract resolver response for not found plugins. + * + * @see {@link PluginContractResolverResponseItem} + * @public + */ +export interface NotFoundPluginContractResolverResponseItem { + found: false; +} + +/** + * Contract resolver response. + * + * @see {@link PluginContractResolver} + * @public + */ +export type PluginContractResolverResponseItem = + | NotFoundPluginContractResolverResponseItem + | FoundPluginContractResolverResponseItem; + +/** + * A record of plugin contracts. + * + * @see {@link PluginContractResolver} + * @public + */ +export type PluginContractMap = Record; + +/** + * Response from a plugin contract resolver request. + * + * @see {@link PluginContractResolver} + * @public + */ +export type PluginContractResolverResponse = { + [Key in keyof ContractMap]: PluginContractResolverResponseItem; +}; + +/** + * A plugin contract resolver, allowing to retrieve plugin contracts at runtime. + * + * Please refer to {@link PluginsServiceSetup} and {@link PluginsServiceStart} for more documentation and examples. + * + * @public + */ +export type PluginContractResolver = ( + ...pluginNames: Array +) => Promise>; diff --git a/packages/core/plugins/core-plugins-contracts-server/tsconfig.json b/packages/core/plugins/core-plugins-contracts-server/tsconfig.json new file mode 100644 index 00000000000000..2d841f928c1bad --- /dev/null +++ b/packages/core/plugins/core-plugins-contracts-server/tsconfig.json @@ -0,0 +1,19 @@ +{ + "extends": "../../../../tsconfig.base.json", + "compilerOptions": { + "outDir": "target/types", + "types": [ + "jest", + "node" + ] + }, + "include": [ + "**/*.ts", + ], + "exclude": [ + "target/**/*" + ], + "kbn_references": [ + "@kbn/core-base-common", + ] +} diff --git a/packages/core/plugins/core-plugins-server-internal/index.ts b/packages/core/plugins/core-plugins-server-internal/index.ts index 072ffda4b44211..f8971b0b2b0fc9 100644 --- a/packages/core/plugins/core-plugins-server-internal/index.ts +++ b/packages/core/plugins/core-plugins-server-internal/index.ts @@ -8,8 +8,8 @@ export { PluginsService, PluginWrapper, config, isNewPlatformPlugin } from './src'; export type { - PluginsServiceSetup, - PluginsServiceStart, + InternalPluginsServiceSetup, + InternalPluginsServiceStart, DiscoveredPlugins, PluginDependencies, } from './src'; diff --git a/packages/core/plugins/core-plugins-server-internal/src/discovery/plugin_manifest_from_plugin_package.test.ts b/packages/core/plugins/core-plugins-server-internal/src/discovery/plugin_manifest_from_plugin_package.test.ts index 3d6a0f12210538..14369bd86255e6 100644 --- a/packages/core/plugins/core-plugins-server-internal/src/discovery/plugin_manifest_from_plugin_package.test.ts +++ b/packages/core/plugins/core-plugins-server-internal/src/discovery/plugin_manifest_from_plugin_package.test.ts @@ -32,6 +32,7 @@ const basic: PluginPackageManifest = { optionalPlugins: ['someOtherPlugin'], requiredBundles: ['someRequiresBundlePlugin'], requiredPlugins: ['someRequiredPlugin'], + runtimePluginDependencies: ['someRuntimeDependencyPlugin'], }, serviceFolders: ['foo', 'bar'], }; @@ -59,6 +60,9 @@ describe('pluginManifestFromPluginPackage()', () => { "requiredPlugins": Array [ "someRequiredPlugin", ], + "runtimePluginDependencies": Array [ + "someRuntimeDependencyPlugin", + ], "server": true, "serviceFolders": Array [ "foo", diff --git a/packages/core/plugins/core-plugins-server-internal/src/discovery/plugin_manifest_from_plugin_package.ts b/packages/core/plugins/core-plugins-server-internal/src/discovery/plugin_manifest_from_plugin_package.ts index 13a860dc9b1267..9fa8d4e54af220 100644 --- a/packages/core/plugins/core-plugins-server-internal/src/discovery/plugin_manifest_from_plugin_package.ts +++ b/packages/core/plugins/core-plugins-server-internal/src/discovery/plugin_manifest_from_plugin_package.ts @@ -25,6 +25,7 @@ export function pluginManifestFromPluginPackage( optionalPlugins: manifest.plugin.optionalPlugins ?? [], requiredBundles: manifest.plugin.requiredBundles ?? [], requiredPlugins: manifest.plugin.requiredPlugins ?? [], + runtimePluginDependencies: manifest.plugin.runtimePluginDependencies ?? [], owner: { name: manifest.owner.join(' & '), }, diff --git a/packages/core/plugins/core-plugins-server-internal/src/discovery/plugin_manifest_parser.test.ts b/packages/core/plugins/core-plugins-server-internal/src/discovery/plugin_manifest_parser.test.ts index 35cff51f820f9f..f940e49805cd5a 100644 --- a/packages/core/plugins/core-plugins-server-internal/src/discovery/plugin_manifest_parser.test.ts +++ b/packages/core/plugins/core-plugins-server-internal/src/discovery/plugin_manifest_parser.test.ts @@ -388,6 +388,7 @@ test('set defaults for all missing optional fields', async () => { optionalPlugins: [], requiredPlugins: [], requiredBundles: [], + runtimePluginDependencies: [], server: true, ui: false, owner: { name: 'foo' }, @@ -407,6 +408,7 @@ test('return all set optional fields as they are in manifest', async () => { type: 'preboot', requiredPlugins: ['some-required-plugin', 'some-required-plugin-2'], optionalPlugins: ['some-optional-plugin'], + runtimePluginDependencies: ['runtime-plugin-dependency'], ui: true, owner: { name: 'foo' }, enabledOnAnonymousPages: true, @@ -424,6 +426,7 @@ test('return all set optional fields as they are in manifest', async () => { optionalPlugins: ['some-optional-plugin'], requiredBundles: [], requiredPlugins: ['some-required-plugin', 'some-required-plugin-2'], + runtimePluginDependencies: ['runtime-plugin-dependency'], server: false, ui: true, owner: { name: 'foo' }, @@ -458,6 +461,7 @@ test('return manifest when plugin expected Kibana version matches actual version optionalPlugins: [], requiredPlugins: ['some-required-plugin'], requiredBundles: [], + runtimePluginDependencies: [], server: true, ui: false, owner: { name: 'foo' }, @@ -491,6 +495,7 @@ test('return manifest when plugin expected Kibana version is `kibana`', async () optionalPlugins: [], requiredPlugins: ['some-required-plugin'], requiredBundles: [], + runtimePluginDependencies: [], server: true, ui: true, owner: { name: 'foo' }, diff --git a/packages/core/plugins/core-plugins-server-internal/src/discovery/plugin_manifest_parser.ts b/packages/core/plugins/core-plugins-server-internal/src/discovery/plugin_manifest_parser.ts index 5402b9218620d4..6aef278cb00d12 100644 --- a/packages/core/plugins/core-plugins-server-internal/src/discovery/plugin_manifest_parser.ts +++ b/packages/core/plugins/core-plugins-server-internal/src/discovery/plugin_manifest_parser.ts @@ -45,6 +45,7 @@ const KNOWN_MANIFEST_FIELDS = (() => { configPath: true, requiredPlugins: true, optionalPlugins: true, + runtimePluginDependencies: true, ui: true, server: true, extraPublicDirs: true, @@ -209,6 +210,9 @@ export async function parseManifest( requiredPlugins: Array.isArray(manifest.requiredPlugins) ? manifest.requiredPlugins : [], optionalPlugins: Array.isArray(manifest.optionalPlugins) ? manifest.optionalPlugins : [], requiredBundles: Array.isArray(manifest.requiredBundles) ? manifest.requiredBundles : [], + runtimePluginDependencies: Array.isArray(manifest.runtimePluginDependencies) + ? manifest.runtimePluginDependencies + : [], ui: includesUiPlugin, server: includesServerPlugin, extraPublicDirs: manifest.extraPublicDirs, diff --git a/packages/core/plugins/core-plugins-server-internal/src/index.ts b/packages/core/plugins/core-plugins-server-internal/src/index.ts index 3eb852b641fcde..b0b1e58fba107d 100644 --- a/packages/core/plugins/core-plugins-server-internal/src/index.ts +++ b/packages/core/plugins/core-plugins-server-internal/src/index.ts @@ -8,8 +8,8 @@ export { PluginsService } from './plugins_service'; export type { - PluginsServiceSetup, - PluginsServiceStart, + InternalPluginsServiceSetup, + InternalPluginsServiceStart, DiscoveredPlugins, } from './plugins_service'; export { config } from './plugins_config'; diff --git a/packages/core/plugins/core-plugins-server-internal/src/plugin.test.ts b/packages/core/plugins/core-plugins-server-internal/src/plugin.test.ts index da1060ae4feb11..5b11139397a124 100644 --- a/packages/core/plugins/core-plugins-server-internal/src/plugin.test.ts +++ b/packages/core/plugins/core-plugins-server-internal/src/plugin.test.ts @@ -18,9 +18,10 @@ import { loggingSystemMock } from '@kbn/core-logging-server-mocks'; import type { NodeInfo } from '@kbn/core-node-server'; import { nodeServiceMock } from '@kbn/core-node-server-mocks'; import type { PluginManifest } from '@kbn/core-plugins-server'; -import { PluginWrapper } from './plugin'; import { PluginType } from '@kbn/core-base-common'; import { coreInternalLifecycleMock } from '@kbn/core-lifecycle-server-mocks'; +import { createRuntimePluginContractResolverMock } from './test_helpers'; +import { PluginWrapper } from './plugin'; import { createPluginInitializerContext, @@ -57,6 +58,7 @@ function createPluginManifest(manifestProps: Partial = {}): Plug requiredPlugins: ['some-required-dep'], optionalPlugins: ['some-optional-dep'], requiredBundles: [], + runtimePluginDependencies: ['some-runtime-dep'], server: true, ui: true, owner: { name: 'Core' }, @@ -72,6 +74,7 @@ let env: Env; let coreContext: CoreContext; let instanceInfo: InstanceInfo; let nodeInfo: NodeInfo; +let runtimeResolver: ReturnType; const setupDeps = coreInternalLifecycleMock.createInternalSetup(); @@ -82,7 +85,7 @@ beforeEach(() => { uuid: 'instance-uuid', }; nodeInfo = nodeServiceMock.createInternalPrebootContract(); - + runtimeResolver = createRuntimePluginContractResolverMock(); coreContext = { coreId, env, logger, configService: configService as any }; }); @@ -112,6 +115,7 @@ test('`constructor` correctly initializes plugin instance', () => { expect(plugin.source).toBe('external'); // see below for test cases for non-external sources (OSS and X-Pack) expect(plugin.requiredPlugins).toEqual(['some-required-dep']); expect(plugin.optionalPlugins).toEqual(['some-optional-dep']); + expect(plugin.runtimePluginDependencies).toEqual(['some-runtime-dep']); }); describe('`constructor` correctly sets non-external source', () => { @@ -170,7 +174,7 @@ test('`setup` fails if `plugin` initializer is not exported', () => { }); expect(() => - plugin.setup(createPluginSetupContext(coreContext, setupDeps, plugin), {}) + plugin.setup(createPluginSetupContext({ deps: setupDeps, plugin, runtimeResolver }), {}) ).toThrowErrorMatchingInlineSnapshot( `"Plugin \\"some-plugin-id\\" does not export \\"plugin\\" definition (plugin-without-initializer-path)."` ); @@ -193,7 +197,7 @@ test('`setup` fails if plugin initializer is not a function', () => { }); expect(() => - plugin.setup(createPluginSetupContext(coreContext, setupDeps, plugin), {}) + plugin.setup(createPluginSetupContext({ deps: setupDeps, plugin, runtimeResolver }), {}) ).toThrowErrorMatchingInlineSnapshot( `"Definition of plugin \\"some-plugin-id\\" should be a function (plugin-with-wrong-initializer-path)."` ); @@ -218,7 +222,7 @@ test('`setup` fails if initializer does not return object', () => { mockPluginInitializer.mockReturnValue(null); expect(() => - plugin.setup(createPluginSetupContext(coreContext, setupDeps, plugin), {}) + plugin.setup(createPluginSetupContext({ deps: setupDeps, plugin, runtimeResolver }), {}) ).toThrowErrorMatchingInlineSnapshot( `"Initializer for plugin \\"some-plugin-id\\" is expected to return plugin instance, but returned \\"null\\"."` ); @@ -244,7 +248,7 @@ test('`setup` fails if object returned from initializer does not define `setup` mockPluginInitializer.mockReturnValue(mockPluginInstance); expect(() => - plugin.setup(createPluginSetupContext(coreContext, setupDeps, plugin), {}) + plugin.setup(createPluginSetupContext({ deps: setupDeps, plugin, runtimeResolver }), {}) ).toThrowErrorMatchingInlineSnapshot( `"Instance of plugin \\"some-plugin-id\\" does not define \\"setup\\" function."` ); @@ -270,7 +274,7 @@ test('`setup` initializes plugin and calls appropriate lifecycle hook', async () const mockPluginInstance = { setup: jest.fn().mockResolvedValue({ contract: 'yes' }) }; mockPluginInitializer.mockReturnValue(mockPluginInstance); - const setupContext = createPluginSetupContext(coreContext, setupDeps, plugin); + const setupContext = createPluginSetupContext({ deps: setupDeps, plugin, runtimeResolver }); const setupDependencies = { 'some-required-dep': { contract: 'no' } }; await expect(plugin.setup(setupContext, setupDependencies)).resolves.toEqual({ contract: 'yes' }); @@ -450,7 +454,7 @@ test('`stop` does nothing if plugin does not define `stop` function', async () = }); mockPluginInitializer.mockReturnValue({ setup: jest.fn() }); - await plugin.setup(createPluginSetupContext(coreContext, setupDeps, plugin), {}); + await plugin.setup(createPluginSetupContext({ deps: setupDeps, plugin, runtimeResolver }), {}); await expect(plugin.stop()).resolves.toBeUndefined(); }); @@ -473,7 +477,7 @@ test('`stop` calls `stop` defined by the plugin instance', async () => { const mockPluginInstance = { setup: jest.fn(), stop: jest.fn() }; mockPluginInitializer.mockReturnValue(mockPluginInstance); - await plugin.setup(createPluginSetupContext(coreContext, setupDeps, plugin), {}); + await plugin.setup(createPluginSetupContext({ deps: setupDeps, plugin, runtimeResolver }), {}); await expect(plugin.stop()).resolves.toBeUndefined(); expect(mockPluginInstance.stop).toHaveBeenCalledTimes(1); diff --git a/packages/core/plugins/core-plugins-server-internal/src/plugin.ts b/packages/core/plugins/core-plugins-server-internal/src/plugin.ts index 5446e983676c09..3a8015aad4d59a 100644 --- a/packages/core/plugins/core-plugins-server-internal/src/plugin.ts +++ b/packages/core/plugins/core-plugins-server-internal/src/plugin.ts @@ -47,6 +47,7 @@ export class PluginWrapper< public readonly configPath: PluginManifest['configPath']; public readonly requiredPlugins: PluginManifest['requiredPlugins']; public readonly optionalPlugins: PluginManifest['optionalPlugins']; + public readonly runtimePluginDependencies: PluginManifest['runtimePluginDependencies']; public readonly requiredBundles: PluginManifest['requiredBundles']; public readonly includesServerPlugin: PluginManifest['server']; public readonly includesUiPlugin: PluginManifest['ui']; @@ -81,6 +82,7 @@ export class PluginWrapper< this.requiredPlugins = params.manifest.requiredPlugins; this.optionalPlugins = params.manifest.optionalPlugins; this.requiredBundles = params.manifest.requiredBundles; + this.runtimePluginDependencies = params.manifest.runtimePluginDependencies; this.includesServerPlugin = params.manifest.server; this.includesUiPlugin = params.manifest.ui; } diff --git a/packages/core/plugins/core-plugins-server-internal/src/plugin_context.test.ts b/packages/core/plugins/core-plugins-server-internal/src/plugin_context.test.ts index 8d2c723aa5cb88..22878c820e254c 100644 --- a/packages/core/plugins/core-plugins-server-internal/src/plugin_context.test.ts +++ b/packages/core/plugins/core-plugins-server-internal/src/plugin_context.test.ts @@ -40,6 +40,7 @@ function createPluginManifest(manifestProps: Partial = {}): Plug requiredPlugins: ['some-required-dep'], requiredBundles: [], optionalPlugins: ['some-optional-dep'], + runtimePluginDependencies: [], server: true, ui: true, owner: { @@ -237,7 +238,7 @@ describe('createPluginPrebootSetupContext', () => { }); const corePreboot = coreInternalLifecycleMock.createInternalPreboot(); - const prebootSetupContext = createPluginPrebootSetupContext(coreContext, corePreboot, plugin); + const prebootSetupContext = createPluginPrebootSetupContext({ deps: corePreboot, plugin }); const holdSetupPromise = Promise.resolve(undefined); prebootSetupContext.preboot.holdSetupUntilResolved('some-reason', holdSetupPromise); diff --git a/packages/core/plugins/core-plugins-server-internal/src/plugin_context.ts b/packages/core/plugins/core-plugins-server-internal/src/plugin_context.ts index b97eea8f827edd..8d493e78aae8be 100644 --- a/packages/core/plugins/core-plugins-server-internal/src/plugin_context.ts +++ b/packages/core/plugins/core-plugins-server-internal/src/plugin_context.ts @@ -21,6 +21,7 @@ import { PluginsServiceStartDeps, } from './plugins_service'; import { getGlobalConfig, getGlobalConfig$ } from './legacy_config'; +import type { IRuntimePluginContractResolver } from './plugin_contract_resolver'; /** @internal */ export interface InstanceInfo { @@ -128,11 +129,13 @@ export function createPluginInitializerContext({ * @param plugin The plugin we're building these values for. * @internal */ -export function createPluginPrebootSetupContext( - coreContext: CoreContext, - deps: PluginsServicePrebootSetupDeps, - plugin: PluginWrapper -): CorePreboot { +export function createPluginPrebootSetupContext({ + deps, + plugin, +}: { + deps: PluginsServicePrebootSetupDeps; + plugin: PluginWrapper; +}): CorePreboot { return { analytics: { optIn: deps.analytics.optIn, @@ -174,11 +177,15 @@ export function createPluginPrebootSetupContext( * @param deps Dependencies that Plugins services gets during setup. * @internal */ -export function createPluginSetupContext( - coreContext: CoreContext, - deps: PluginsServiceSetupDeps, - plugin: PluginWrapper -): CoreSetup { +export function createPluginSetupContext({ + deps, + plugin, + runtimeResolver, +}: { + deps: PluginsServiceSetupDeps; + plugin: PluginWrapper; + runtimeResolver: IRuntimePluginContractResolver; +}): CoreSetup { const router = deps.http.createRouter('', plugin.opaqueId); return { @@ -268,6 +275,10 @@ export function createPluginSetupContext( coreUsageData: { registerUsageCounter: deps.coreUsageData.registerUsageCounter, }, + plugins: { + onSetup: (...dependencyNames) => runtimeResolver.onSetup(plugin.name, dependencyNames), + onStart: (...dependencyNames) => runtimeResolver.onStart(plugin.name, dependencyNames), + }, }; } @@ -282,12 +293,16 @@ export function createPluginSetupContext( * @param plugin The plugin we're building these values for. * @param deps Dependencies that Plugins services gets during start. * @internal - */ -export function createPluginStartContext( - coreContext: CoreContext, - deps: PluginsServiceStartDeps, - plugin: PluginWrapper -): CoreStart { + */ // +export function createPluginStartContext({ + plugin, + deps, + runtimeResolver, +}: { + deps: PluginsServiceStartDeps; + plugin: PluginWrapper; + runtimeResolver: IRuntimePluginContractResolver; +}): CoreStart { return { analytics: { optIn: deps.analytics.optIn, @@ -332,5 +347,8 @@ export function createPluginStartContext( globalAsScopedToClient: deps.uiSettings.globalAsScopedToClient, }, coreUsageData: deps.coreUsageData, + plugins: { + onStart: (...dependencyNames) => runtimeResolver.onStart(plugin.name, dependencyNames), + }, }; } diff --git a/packages/core/plugins/core-plugins-server-internal/src/plugin_contract_resolver.test.ts b/packages/core/plugins/core-plugins-server-internal/src/plugin_contract_resolver.test.ts new file mode 100644 index 00000000000000..935ca4789b23b8 --- /dev/null +++ b/packages/core/plugins/core-plugins-server-internal/src/plugin_contract_resolver.test.ts @@ -0,0 +1,342 @@ +/* + * 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 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 or the Server + * Side Public License, v 1. + */ + +import { RuntimePluginContractResolver } from './plugin_contract_resolver'; + +const nextTick = () => new Promise((resolve) => setTimeout(resolve, 1)); +const fewTicks = () => + nextTick() + .then(() => nextTick()) + .then(() => nextTick()); + +const toMap = (record: Record): Map => { + return new Map(Object.entries(record)); +}; + +const pluginAContract = Symbol(); + +describe('RuntimePluginContractResolver', () => { + const SOURCE_PLUGIN = 'sourcePlugin'; + let resolver: RuntimePluginContractResolver; + + beforeEach(() => { + resolver = new RuntimePluginContractResolver(); + + const dependencyMap = new Map>(); + dependencyMap.set(SOURCE_PLUGIN, new Set(['pluginA', 'pluginB', 'pluginC'])); + resolver.setDependencyMap(dependencyMap); + }); + + describe('setup contracts', () => { + it('throws if onSetup is called before setDependencyMap', () => { + resolver = new RuntimePluginContractResolver(); + + expect(() => resolver.onSetup(SOURCE_PLUGIN, ['pluginA'])).toThrowErrorMatchingInlineSnapshot( + `"onSetup cannot be called before setDependencyMap"` + ); + }); + + it('throws if resolveSetupRequests is called multiple times', async () => { + resolver.resolveSetupRequests( + toMap({ + pluginA: pluginAContract, + }) + ); + + expect(() => + resolver.resolveSetupRequests( + toMap({ + pluginA: pluginAContract, + }) + ) + ).toThrowErrorMatchingInlineSnapshot(`"resolveSetupRequests can only be called once"`); + }); + + it('resolves a single request', async () => { + const handler = jest.fn(); + resolver.onSetup(SOURCE_PLUGIN, ['pluginA']).then((contracts) => handler(contracts)); + + await fewTicks(); + + expect(handler).not.toHaveBeenCalled(); + + resolver.resolveSetupRequests( + toMap({ + pluginA: pluginAContract, + }) + ); + + await fewTicks(); + + expect(handler).toHaveBeenCalledTimes(1); + expect(handler).toHaveBeenCalledWith({ + pluginA: { + found: true, + contract: pluginAContract, + }, + }); + }); + + it('resolves multiple requests', async () => { + const handler1 = jest.fn(); + const handler2 = jest.fn(); + const handler3 = jest.fn(); + + resolver.onSetup(SOURCE_PLUGIN, ['pluginA']).then((contracts) => handler1(contracts)); + resolver.onSetup(SOURCE_PLUGIN, ['pluginB']).then((contracts) => handler2(contracts)); + resolver + .onSetup(SOURCE_PLUGIN, ['pluginA', 'pluginB']) + .then((contracts) => handler3(contracts)); + + await fewTicks(); + + expect(handler1).not.toHaveBeenCalled(); + expect(handler2).not.toHaveBeenCalled(); + expect(handler3).not.toHaveBeenCalled(); + + resolver.resolveSetupRequests( + toMap({ + pluginA: pluginAContract, + }) + ); + + await fewTicks(); + + expect(handler1).toHaveBeenCalledTimes(1); + expect(handler1).toHaveBeenCalledWith({ + pluginA: { + found: true, + contract: pluginAContract, + }, + }); + + expect(handler2).toHaveBeenCalledTimes(1); + expect(handler2).toHaveBeenCalledWith({ + pluginB: { + found: false, + }, + }); + + expect(handler3).toHaveBeenCalledTimes(1); + expect(handler3).toHaveBeenCalledWith({ + pluginA: { + found: true, + contract: pluginAContract, + }, + pluginB: { + found: false, + }, + }); + }); + + it('resolves requests instantly when called after resolveSetupRequests', async () => { + resolver.resolveSetupRequests( + toMap({ + pluginA: pluginAContract, + }) + ); + + const handler1 = jest.fn(); + const handler2 = jest.fn(); + resolver.onSetup(SOURCE_PLUGIN, ['pluginA']).then((contracts) => handler1(contracts)); + resolver.onSetup(SOURCE_PLUGIN, ['pluginB']).then((contracts) => handler2(contracts)); + + await fewTicks(); + + expect(handler1).toHaveBeenCalledTimes(1); + expect(handler1).toHaveBeenCalledWith({ + pluginA: { + found: true, + contract: pluginAContract, + }, + }); + + expect(handler2).toHaveBeenCalledTimes(1); + expect(handler2).toHaveBeenCalledWith({ + pluginB: { + found: false, + }, + }); + }); + + it('throws when requesting a contract not defined in the dependency map', async () => { + expect(() => + resolver.onSetup(SOURCE_PLUGIN, ['undeclaredPlugin']) + ).toThrowErrorMatchingInlineSnapshot( + `"Dynamic contract resolving requires the dependencies to be declared in the plugin manifest.Undeclared dependencies: undeclaredPlugin"` + ); + }); + + it('throws when requesting a mixed defined/undefined dependencies', async () => { + expect(() => + resolver.onSetup(SOURCE_PLUGIN, [ + 'pluginA', + 'undeclaredPlugin1', + 'pluginB', + 'undeclaredPlugin2', + ]) + ).toThrowErrorMatchingInlineSnapshot( + `"Dynamic contract resolving requires the dependencies to be declared in the plugin manifest.Undeclared dependencies: undeclaredPlugin1, undeclaredPlugin2"` + ); + }); + }); + + describe('start contracts', () => { + it('throws if onStart is called before setDependencyMap', () => { + resolver = new RuntimePluginContractResolver(); + + expect(() => resolver.onStart(SOURCE_PLUGIN, ['pluginA'])).toThrowErrorMatchingInlineSnapshot( + `"onStart cannot be called before setDependencyMap"` + ); + }); + + it('throws if resolveStartRequests is called multiple times', async () => { + resolver.resolveStartRequests( + toMap({ + pluginA: pluginAContract, + }) + ); + + expect(() => + resolver.resolveStartRequests( + toMap({ + pluginA: pluginAContract, + }) + ) + ).toThrowErrorMatchingInlineSnapshot(`"resolveStartRequests can only be called once"`); + }); + + it('resolves a single request', async () => { + const handler = jest.fn(); + resolver.onStart(SOURCE_PLUGIN, ['pluginA']).then((contracts) => handler(contracts)); + + await fewTicks(); + + expect(handler).not.toHaveBeenCalled(); + + resolver.resolveStartRequests( + toMap({ + pluginA: pluginAContract, + }) + ); + + await fewTicks(); + + expect(handler).toHaveBeenCalledTimes(1); + expect(handler).toHaveBeenCalledWith({ + pluginA: { + found: true, + contract: pluginAContract, + }, + }); + }); + + it('resolves multiple requests', async () => { + const handler1 = jest.fn(); + const handler2 = jest.fn(); + const handler3 = jest.fn(); + + resolver.onStart(SOURCE_PLUGIN, ['pluginA']).then((contracts) => handler1(contracts)); + resolver.onStart(SOURCE_PLUGIN, ['pluginB']).then((contracts) => handler2(contracts)); + resolver + .onStart(SOURCE_PLUGIN, ['pluginA', 'pluginB']) + .then((contracts) => handler3(contracts)); + + await fewTicks(); + + expect(handler1).not.toHaveBeenCalled(); + expect(handler2).not.toHaveBeenCalled(); + expect(handler3).not.toHaveBeenCalled(); + + resolver.resolveStartRequests( + toMap({ + pluginA: pluginAContract, + }) + ); + + await fewTicks(); + + expect(handler1).toHaveBeenCalledTimes(1); + expect(handler1).toHaveBeenCalledWith({ + pluginA: { + found: true, + contract: pluginAContract, + }, + }); + + expect(handler2).toHaveBeenCalledTimes(1); + expect(handler2).toHaveBeenCalledWith({ + pluginB: { + found: false, + }, + }); + + expect(handler3).toHaveBeenCalledTimes(1); + expect(handler3).toHaveBeenCalledWith({ + pluginA: { + found: true, + contract: pluginAContract, + }, + pluginB: { + found: false, + }, + }); + }); + + it('resolves requests instantly when called after resolveSetupRequests', async () => { + resolver.resolveStartRequests( + toMap({ + pluginA: pluginAContract, + }) + ); + + const handler1 = jest.fn(); + const handler2 = jest.fn(); + resolver.onStart(SOURCE_PLUGIN, ['pluginA']).then((contracts) => handler1(contracts)); + resolver.onStart(SOURCE_PLUGIN, ['pluginB']).then((contracts) => handler2(contracts)); + + await fewTicks(); + + expect(handler1).toHaveBeenCalledTimes(1); + expect(handler1).toHaveBeenCalledWith({ + pluginA: { + found: true, + contract: pluginAContract, + }, + }); + + expect(handler2).toHaveBeenCalledTimes(1); + expect(handler2).toHaveBeenCalledWith({ + pluginB: { + found: false, + }, + }); + }); + + it('throws when requesting a contract not defined in the dependency map', async () => { + expect(() => + resolver.onStart(SOURCE_PLUGIN, ['undeclaredPlugin']) + ).toThrowErrorMatchingInlineSnapshot( + `"Dynamic contract resolving requires the dependencies to be declared in the plugin manifest.Undeclared dependencies: undeclaredPlugin"` + ); + }); + + it('throws when requesting a mixed defined/undefined dependencies', async () => { + expect(() => + resolver.onStart(SOURCE_PLUGIN, [ + 'pluginA', + 'undeclaredPlugin1', + 'pluginB', + 'undeclaredPlugin2', + ]) + ).toThrowErrorMatchingInlineSnapshot( + `"Dynamic contract resolving requires the dependencies to be declared in the plugin manifest.Undeclared dependencies: undeclaredPlugin1, undeclaredPlugin2"` + ); + }); + }); +}); diff --git a/packages/core/plugins/core-plugins-server-internal/src/plugin_contract_resolver.ts b/packages/core/plugins/core-plugins-server-internal/src/plugin_contract_resolver.ts new file mode 100644 index 00000000000000..79d8c1d842c401 --- /dev/null +++ b/packages/core/plugins/core-plugins-server-internal/src/plugin_contract_resolver.ts @@ -0,0 +1,161 @@ +/* + * 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 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 or the Server + * Side Public License, v 1. + */ + +import type { PublicMethodsOf } from '@kbn/utility-types'; +import type { PluginName } from '@kbn/core-base-common'; +import type { + PluginContractResolverResponse, + PluginContractMap, + PluginContractResolverResponseItem, +} from '@kbn/core-plugins-contracts-server'; + +export type IRuntimePluginContractResolver = PublicMethodsOf; + +export class RuntimePluginContractResolver { + private dependencyMap?: Map>; + private setupContracts?: Map; + private startContracts?: Map; + + private readonly setupRequestQueue: PluginContractRequest[] = []; + private readonly startRequestQueue: PluginContractRequest[] = []; + + setDependencyMap(depMap: Map>) { + this.dependencyMap = new Map(depMap.entries()); + } + + onSetup = ( + pluginName: PluginName, + dependencyNames: Array + ): Promise> => { + if (!this.dependencyMap) { + throw new Error('onSetup cannot be called before setDependencyMap'); + } + + const dependencyList = this.dependencyMap.get(pluginName) ?? new Set(); + const notDependencyPlugins = dependencyNames.filter( + (name) => !dependencyList.has(name as PluginName) + ); + if (notDependencyPlugins.length) { + throw new Error( + 'Dynamic contract resolving requires the dependencies to be declared in the plugin manifest.' + + `Undeclared dependencies: ${notDependencyPlugins.join(', ')}` + ); + } + + if (this.setupContracts) { + const response = createContractRequestResponse( + dependencyNames as PluginName[], + this.setupContracts + ); + return Promise.resolve(response as PluginContractResolverResponse); + } else { + const setupContractRequest = createPluginContractRequest>( + dependencyNames as PluginName[] + ); + this.setupRequestQueue.push(setupContractRequest as PluginContractRequest); + return setupContractRequest.contractPromise; + } + }; + + onStart = ( + pluginName: PluginName, + dependencyNames: Array + ): Promise> => { + if (!this.dependencyMap) { + throw new Error('onStart cannot be called before setDependencyMap'); + } + + const dependencyList = this.dependencyMap.get(pluginName) ?? new Set(); + const notDependencyPlugins = dependencyNames.filter( + (name) => !dependencyList.has(name as PluginName) + ); + if (notDependencyPlugins.length) { + throw new Error( + 'Dynamic contract resolving requires the dependencies to be declared in the plugin manifest.' + + `Undeclared dependencies: ${notDependencyPlugins.join(', ')}` + ); + } + + if (this.startContracts) { + const response = createContractRequestResponse( + dependencyNames as PluginName[], + this.startContracts + ); + return Promise.resolve(response as PluginContractResolverResponse); + } else { + const startContractRequest = createPluginContractRequest>( + dependencyNames as PluginName[] + ); + this.startRequestQueue.push(startContractRequest as PluginContractRequest); + return startContractRequest.contractPromise; + } + }; + + resolveSetupRequests(setupContracts: Map) { + if (this.setupContracts) { + throw new Error('resolveSetupRequests can only be called once'); + } + this.setupContracts = setupContracts; + + for (const setupRequest of this.setupRequestQueue) { + const response = createContractRequestResponse(setupRequest.pluginNames, setupContracts); + setupRequest.resolve(response); + } + } + + resolveStartRequests(startContracts: Map) { + if (this.startContracts) { + throw new Error('resolveStartRequests can only be called once'); + } + this.startContracts = startContracts; + + for (const startRequest of this.startRequestQueue) { + const response = createContractRequestResponse(startRequest.pluginNames, startContracts); + startRequest.resolve(response); + } + } +} + +interface PluginContractRequest { + pluginNames: PluginName[]; + contractPromise: Promise; + resolve: (data?: T) => void; +} + +const createPluginContractRequest = ( + pluginNames: PluginName[] +): PluginContractRequest => { + let resolve!: (data?: T) => void; + const contractPromise = new Promise((_resolve) => { + resolve = _resolve; + }); + + return { + pluginNames, + contractPromise, + resolve, + }; +}; + +const createContractRequestResponse = ( + pluginNames: PluginName[], + contracts: Map +): PluginContractResolverResponse => { + const response = {} as Record; + for (const pluginName of pluginNames) { + const pluginResponse: PluginContractResolverResponseItem = contracts.has(pluginName) + ? { + found: true, + contract: contracts.get(pluginName)!, + } + : { found: false }; + response[pluginName] = pluginResponse; + } + + return response as PluginContractResolverResponse; +}; diff --git a/packages/core/plugins/core-plugins-server-internal/src/plugins_service.test.ts b/packages/core/plugins/core-plugins-server-internal/src/plugins_service.test.ts index 288a9a8e330381..42f560588197d5 100644 --- a/packages/core/plugins/core-plugins-server-internal/src/plugins_service.test.ts +++ b/packages/core/plugins/core-plugins-server-internal/src/plugins_service.test.ts @@ -76,6 +76,7 @@ const createPlugin = ( requiredPlugins = [], requiredBundles = [], optionalPlugins = [], + runtimePluginDependencies = [], kibanaVersion = '7.0.0', configPath = [path], server = true, @@ -88,6 +89,7 @@ const createPlugin = ( requiredPlugins?: string[]; requiredBundles?: string[]; optionalPlugins?: string[]; + runtimePluginDependencies?: string[]; kibanaVersion?: string; configPath?: ConfigPath; server?: boolean; @@ -105,6 +107,7 @@ const createPlugin = ( requiredPlugins, requiredBundles, optionalPlugins, + runtimePluginDependencies, server, owner: { name: 'Core', @@ -1018,6 +1021,7 @@ describe('PluginsService', () => { requiredPlugins: [], requiredBundles: [], optionalPlugins: [], + runtimePluginDependencies: [], }, ]; diff --git a/packages/core/plugins/core-plugins-server-internal/src/plugins_service.ts b/packages/core/plugins/core-plugins-server-internal/src/plugins_service.ts index d6738b4f42394e..bfa6b6ab5a222d 100644 --- a/packages/core/plugins/core-plugins-server-internal/src/plugins_service.ts +++ b/packages/core/plugins/core-plugins-server-internal/src/plugins_service.ts @@ -43,7 +43,7 @@ export type DiscoveredPlugins = { }; /** @internal */ -export interface PluginsServiceSetup { +export interface InternalPluginsServiceSetup { /** Indicates whether or not plugins were initialized. */ initialized: boolean; /** Setup contracts returned by plugins. */ @@ -51,7 +51,7 @@ export interface PluginsServiceSetup { } /** @internal */ -export interface PluginsServiceStart { +export interface InternalPluginsServiceStart { /** Start contracts returned by plugins. */ contracts: Map; } @@ -72,7 +72,9 @@ export interface PluginsServiceDiscoverDeps { } /** @internal */ -export class PluginsService implements CoreService { +export class PluginsService + implements CoreService +{ private readonly log: Logger; private readonly prebootPluginsSystem: PluginsSystem; private arePrebootPluginsStopped = false; diff --git a/packages/core/plugins/core-plugins-server-internal/src/plugins_system.test.mocks.ts b/packages/core/plugins/core-plugins-server-internal/src/plugins_system.test.mocks.ts index 1e1264ba76a809..42a26b6792f0a7 100644 --- a/packages/core/plugins/core-plugins-server-internal/src/plugins_system.test.mocks.ts +++ b/packages/core/plugins/core-plugins-server-internal/src/plugins_system.test.mocks.ts @@ -6,11 +6,22 @@ * Side Public License, v 1. */ +import { createRuntimePluginContractResolverMock } from './test_helpers'; + export const mockCreatePluginPrebootSetupContext = jest.fn(); export const mockCreatePluginSetupContext = jest.fn(); export const mockCreatePluginStartContext = jest.fn(); + jest.mock('./plugin_context', () => ({ createPluginPrebootSetupContext: mockCreatePluginPrebootSetupContext, createPluginSetupContext: mockCreatePluginSetupContext, createPluginStartContext: mockCreatePluginStartContext, })); + +export const runtimeResolverMock = createRuntimePluginContractResolverMock(); + +jest.doMock('./plugin_contract_resolver', () => { + return { + RuntimePluginContractResolver: jest.fn().mockImplementation(() => runtimeResolverMock), + }; +}); diff --git a/packages/core/plugins/core-plugins-server-internal/src/plugins_system.test.ts b/packages/core/plugins/core-plugins-server-internal/src/plugins_system.test.ts index 701792f24bc35c..42ea7012745f28 100644 --- a/packages/core/plugins/core-plugins-server-internal/src/plugins_system.test.ts +++ b/packages/core/plugins/core-plugins-server-internal/src/plugins_system.test.ts @@ -10,6 +10,7 @@ import { mockCreatePluginPrebootSetupContext, mockCreatePluginSetupContext, mockCreatePluginStartContext, + runtimeResolverMock, } from './plugins_system.test.mocks'; import { BehaviorSubject } from 'rxjs'; @@ -52,6 +53,7 @@ function createPlugin( type, requiredPlugins: required, optionalPlugins: optional, + runtimePluginDependencies: [], requiredBundles: [], server, ui, @@ -73,6 +75,10 @@ let env: Env; let coreContext: CoreContext; beforeEach(() => { + runtimeResolverMock.setDependencyMap.mockReset(); + runtimeResolverMock.resolveSetupRequests.mockReset(); + runtimeResolverMock.resolveStartRequests.mockReset(); + logger = loggingSystemMock.create(); env = Env.createDefault(REPO_ROOT, getEnvOptions()); @@ -197,6 +203,31 @@ test('`setupPlugins` ignores missing optional dependency', async () => { `); }); +test('`setupPlugins` setups the runtimeResolver', async () => { + const pluginA = createPlugin('pluginA', { required: [] }); + const pluginB = createPlugin('pluginB', { required: ['pluginA'] }); + + jest.spyOn(pluginA, 'setup').mockReturnValue('contractA'); + jest.spyOn(pluginB, 'setup').mockReturnValue('contractB'); + + pluginsSystem.addPlugin(pluginA); + pluginsSystem.addPlugin(pluginB); + + await pluginsSystem.setupPlugins(setupDeps); + + expect(runtimeResolverMock.setDependencyMap).toHaveBeenCalledTimes(1); + expect(runtimeResolverMock.setDependencyMap).toHaveBeenCalledWith(expect.any(Map)); + + expect(runtimeResolverMock.resolveSetupRequests).toHaveBeenCalledTimes(1); + expect(runtimeResolverMock.resolveSetupRequests).toHaveBeenCalledWith(expect.any(Map)); + expect( + Object.fromEntries([...runtimeResolverMock.resolveSetupRequests.mock.calls[0][0].entries()]) + ).toEqual({ + pluginA: 'contractA', + pluginB: 'contractB', + }); +}); + test('correctly orders plugins and returns exposed values for "setup" and "start"', async () => { interface Contracts { setup: Record; @@ -254,13 +285,9 @@ test('correctly orders plugins and returns exposed values for "setup" and "start pluginsSystem.addPlugin(plugin); }); - mockCreatePluginSetupContext.mockImplementation((context, deps, plugin) => - setupContextMap.get(plugin.name) - ); + mockCreatePluginSetupContext.mockImplementation(({ plugin }) => setupContextMap.get(plugin.name)); - mockCreatePluginStartContext.mockImplementation((context, deps, plugin) => - startContextMap.get(plugin.name) - ); + mockCreatePluginStartContext.mockImplementation(({ plugin }) => startContextMap.get(plugin.name)); expect([...(await pluginsSystem.setupPlugins(setupDeps))]).toMatchInlineSnapshot(` Array [ @@ -288,7 +315,11 @@ test('correctly orders plugins and returns exposed values for "setup" and "start `); for (const [plugin, deps] of plugins) { - expect(mockCreatePluginSetupContext).toHaveBeenCalledWith(coreContext, setupDeps, plugin); + expect(mockCreatePluginSetupContext).toHaveBeenCalledWith({ + deps: setupDeps, + plugin, + runtimeResolver: expect.any(Object), + }); expect(plugin.setup).toHaveBeenCalledTimes(1); expect(plugin.setup).toHaveBeenCalledWith(setupContextMap.get(plugin.name), deps.setup); } @@ -319,7 +350,11 @@ test('correctly orders plugins and returns exposed values for "setup" and "start `); for (const [plugin, deps] of plugins) { - expect(mockCreatePluginStartContext).toHaveBeenCalledWith(coreContext, startDeps, plugin); + expect(mockCreatePluginStartContext).toHaveBeenCalledWith({ + deps: startDeps, + plugin, + runtimeResolver: expect.any(Object), + }); expect(plugin.start).toHaveBeenCalledTimes(1); expect(plugin.start).toHaveBeenCalledWith(startContextMap.get(plugin.name), deps.start); } @@ -362,7 +397,7 @@ test('correctly orders preboot plugins and returns exposed values for "setup"', prebootPluginSystem.addPlugin(plugin); }); - mockCreatePluginPrebootSetupContext.mockImplementation((context, deps, plugin) => + mockCreatePluginPrebootSetupContext.mockImplementation(({ plugin }) => setupContextMap.get(plugin.name) ); @@ -392,11 +427,10 @@ test('correctly orders preboot plugins and returns exposed values for "setup"', `); for (const [plugin, deps] of plugins) { - expect(mockCreatePluginPrebootSetupContext).toHaveBeenCalledWith( - coreContext, - prebootDeps, - plugin - ); + expect(mockCreatePluginPrebootSetupContext).toHaveBeenCalledWith({ + deps: prebootDeps, + plugin, + }); expect(plugin.setup).toHaveBeenCalledTimes(1); expect(plugin.setup).toHaveBeenCalledWith(setupContextMap.get(plugin.name), deps); } @@ -426,17 +460,21 @@ test('`setupPlugins` only setups plugins that have server side', async () => { ] `); - expect(mockCreatePluginSetupContext).toHaveBeenCalledWith( - coreContext, - setupDeps, - firstPluginToRun - ); - expect(mockCreatePluginSetupContext).not.toHaveBeenCalledWith(coreContext, secondPluginNotToRun); - expect(mockCreatePluginSetupContext).toHaveBeenCalledWith( - coreContext, - setupDeps, - thirdPluginToRun - ); + expect(mockCreatePluginSetupContext).toHaveBeenCalledWith({ + deps: setupDeps, + plugin: firstPluginToRun, + runtimeResolver: expect.any(Object), + }); + expect(mockCreatePluginSetupContext).not.toHaveBeenCalledWith({ + deps: setupDeps, + plugin: secondPluginNotToRun, + runtimeResolver: expect.any(Object), + }); + expect(mockCreatePluginSetupContext).toHaveBeenCalledWith({ + deps: setupDeps, + plugin: thirdPluginToRun, + runtimeResolver: expect.any(Object), + }); expect(firstPluginToRun.setup).toHaveBeenCalledTimes(1); expect(secondPluginNotToRun.setup).not.toHaveBeenCalled(); @@ -627,6 +665,32 @@ describe('start', () => { const log = logger.get.mock.results[0].value as jest.Mocked; expect(log.info).toHaveBeenCalledWith(`Starting [2] plugins: [order-1,order-0]`); }); + + it('setups the runtimeResolver', async () => { + const pluginA = createPlugin('pluginA', { required: [] }); + const pluginB = createPlugin('pluginB', { required: ['pluginA'] }); + + jest.spyOn(pluginA, 'setup').mockReturnValue({}); + jest.spyOn(pluginB, 'setup').mockReturnValue({}); + + jest.spyOn(pluginA, 'start').mockReturnValue('contractA'); + jest.spyOn(pluginB, 'start').mockReturnValue('contractB'); + + pluginsSystem.addPlugin(pluginA); + pluginsSystem.addPlugin(pluginB); + + await pluginsSystem.setupPlugins(setupDeps); + await pluginsSystem.startPlugins(startDeps); + + expect(runtimeResolverMock.resolveStartRequests).toHaveBeenCalledTimes(1); + expect(runtimeResolverMock.resolveStartRequests).toHaveBeenCalledWith(expect.any(Map)); + expect( + Object.fromEntries([...runtimeResolverMock.resolveStartRequests.mock.calls[0][0].entries()]) + ).toEqual({ + pluginA: 'contractA', + pluginB: 'contractB', + }); + }); }); describe('asynchronous plugins', () => { diff --git a/packages/core/plugins/core-plugins-server-internal/src/plugins_system.ts b/packages/core/plugins/core-plugins-server-internal/src/plugins_system.ts index 35e77e84381fd5..a7ca6d64da5455 100644 --- a/packages/core/plugins/core-plugins-server-internal/src/plugins_system.ts +++ b/packages/core/plugins/core-plugins-server-internal/src/plugins_system.ts @@ -23,11 +23,13 @@ import type { PluginsServiceSetupDeps, PluginsServiceStartDeps, } from './plugins_service'; +import { RuntimePluginContractResolver } from './plugin_contract_resolver'; const Sec = 1000; /** @internal */ export class PluginsSystem { + private readonly runtimeResolver = new RuntimePluginContractResolver(); private readonly plugins = new Map(); private readonly log: Logger; // `satup`, the past-tense version of the noun `setup`. @@ -90,6 +92,9 @@ export class PluginsSystem { return contracts; } + const runtimeDependencies = buildPluginRuntimeDependencyMap(this.plugins); + this.runtimeResolver.setDependencyMap(runtimeDependencies); + const sortedPlugins = new Map( [...this.getTopologicallySortedPluginNames()] .map((pluginName) => [pluginName, this.plugins.get(pluginName)!] as [string, PluginWrapper]) @@ -114,17 +119,16 @@ export class PluginsSystem { let pluginSetupContext; if (this.type === PluginType.preboot) { - pluginSetupContext = createPluginPrebootSetupContext( - this.coreContext, - deps as PluginsServicePrebootSetupDeps, - plugin - ); + pluginSetupContext = createPluginPrebootSetupContext({ + deps: deps as PluginsServicePrebootSetupDeps, + plugin, + }); } else { - pluginSetupContext = createPluginSetupContext( - this.coreContext, - deps as PluginsServiceSetupDeps, - plugin - ); + pluginSetupContext = createPluginSetupContext({ + deps: deps as PluginsServiceSetupDeps, + plugin, + runtimeResolver: this.runtimeResolver, + }); } let contract: unknown; @@ -155,6 +159,8 @@ export class PluginsSystem { this.satupPlugins.push(pluginName); } + this.runtimeResolver.resolveSetupRequests(contracts); + return contracts; } @@ -186,7 +192,7 @@ export class PluginsSystem { let contract: unknown; const contractOrPromise = plugin.start( - createPluginStartContext(this.coreContext, deps, plugin), + createPluginStartContext({ deps, plugin, runtimeResolver: this.runtimeResolver }), pluginDepContracts ); if (isPromise(contractOrPromise)) { @@ -214,6 +220,8 @@ export class PluginsSystem { contracts.set(pluginName, contract); } + this.runtimeResolver.resolveStartRequests(contracts); + return contracts; } @@ -265,6 +273,7 @@ export class PluginsSystem { const uiPluginNames = [...this.getTopologicallySortedPluginNames().keys()].filter( (pluginName) => this.plugins.get(pluginName)!.includesUiPlugin ); + const filterUiPlugins = (pluginName: string) => uiPluginNames.includes(pluginName); const publicPlugins = new Map( uiPluginNames.map((pluginName) => { const plugin = this.plugins.get(pluginName)!; @@ -274,12 +283,10 @@ export class PluginsSystem { id: pluginName, type: plugin.manifest.type, configPath: plugin.manifest.configPath, - requiredPlugins: plugin.manifest.requiredPlugins.filter((p) => - uiPluginNames.includes(p) - ), - optionalPlugins: plugin.manifest.optionalPlugins.filter((p) => - uiPluginNames.includes(p) - ), + requiredPlugins: plugin.manifest.requiredPlugins.filter(filterUiPlugins), + optionalPlugins: plugin.manifest.optionalPlugins.filter(filterUiPlugins), + runtimePluginDependencies: + plugin.manifest.runtimePluginDependencies.filter(filterUiPlugins), requiredBundles: plugin.manifest.requiredBundles, enabledOnAnonymousPages: plugin.manifest.enabledOnAnonymousPages, }, @@ -371,3 +378,18 @@ const buildReverseDependencyMap = ( } return reverseMap; }; + +const buildPluginRuntimeDependencyMap = ( + pluginMap: Map +): Map> => { + const runtimeDependencies = new Map>(); + for (const [pluginName, pluginWrapper] of pluginMap.entries()) { + const pluginRuntimeDeps = new Set([ + ...pluginWrapper.optionalPlugins, + ...pluginWrapper.requiredPlugins, + ...pluginWrapper.runtimePluginDependencies, + ]); + runtimeDependencies.set(pluginName, pluginRuntimeDeps); + } + return runtimeDependencies; +}; diff --git a/packages/core/plugins/core-plugins-server-internal/src/test_helpers/index.ts b/packages/core/plugins/core-plugins-server-internal/src/test_helpers/index.ts index 86ffb0ec8f4077..2781a4672ebaae 100644 --- a/packages/core/plugins/core-plugins-server-internal/src/test_helpers/index.ts +++ b/packages/core/plugins/core-plugins-server-internal/src/test_helpers/index.ts @@ -7,3 +7,4 @@ */ export { createCoreContextConfigServiceMock } from './create_core_context_config_service.mock'; +export { createRuntimePluginContractResolverMock } from './plugin_contract_resolver.mock'; diff --git a/packages/core/plugins/core-plugins-server-internal/src/test_helpers/plugin_contract_resolver.mock.ts b/packages/core/plugins/core-plugins-server-internal/src/test_helpers/plugin_contract_resolver.mock.ts new file mode 100644 index 00000000000000..a71c7e3ea857e5 --- /dev/null +++ b/packages/core/plugins/core-plugins-server-internal/src/test_helpers/plugin_contract_resolver.mock.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 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 or the Server + * Side Public License, v 1. + */ + +import type { IRuntimePluginContractResolver } from '../plugin_contract_resolver'; + +export const createRuntimePluginContractResolverMock = + (): jest.Mocked => { + return { + setDependencyMap: jest.fn(), + onSetup: jest.fn(), + onStart: jest.fn(), + resolveSetupRequests: jest.fn(), + resolveStartRequests: jest.fn(), + }; + }; diff --git a/packages/core/plugins/core-plugins-server-internal/tsconfig.json b/packages/core/plugins/core-plugins-server-internal/tsconfig.json index 01a508f92ddc87..14beddf2c7fb76 100644 --- a/packages/core/plugins/core-plugins-server-internal/tsconfig.json +++ b/packages/core/plugins/core-plugins-server-internal/tsconfig.json @@ -38,6 +38,8 @@ "@kbn/core-node-server-internal", "@kbn/core-plugins-base-server-internal", "@kbn/repo-packages", + "@kbn/utility-types", + "@kbn/core-plugins-contracts-server", ], "exclude": [ "target/**/*", diff --git a/packages/core/plugins/core-plugins-server-mocks/src/plugins_service.mock.ts b/packages/core/plugins/core-plugins-server-mocks/src/plugins_service.mock.ts index 58c43a4c30edab..d139d8b49ab79a 100644 --- a/packages/core/plugins/core-plugins-server-mocks/src/plugins_service.mock.ts +++ b/packages/core/plugins/core-plugins-server-mocks/src/plugins_service.mock.ts @@ -7,25 +7,48 @@ */ import type { PublicMethodsOf } from '@kbn/utility-types'; -import { PluginsService, type PluginsServiceSetup } from '@kbn/core-plugins-server-internal'; +import type { PluginsServiceSetup, PluginsServiceStart } from '@kbn/core-plugins-contracts-server'; +import { + PluginsService, + type InternalPluginsServiceSetup, + type InternalPluginsServiceStart, +} from '@kbn/core-plugins-server-internal'; type PluginsServiceMock = jest.Mocked>; -const createSetupContractMock = (): PluginsServiceSetup => ({ +const createInternalSetupContractMock = (): InternalPluginsServiceSetup => ({ contracts: new Map(), initialized: true, }); -const createStartContractMock = () => ({ contracts: new Map() }); +const createInternalStartContractMock = (): InternalPluginsServiceStart => ({ + contracts: new Map(), +}); const createServiceMock = (): PluginsServiceMock => ({ discover: jest.fn(), getExposedPluginConfigsToUsage: jest.fn(), preboot: jest.fn(), - setup: jest.fn().mockResolvedValue(createSetupContractMock()), - start: jest.fn().mockResolvedValue(createStartContractMock()), + setup: jest.fn().mockResolvedValue(createInternalSetupContractMock()), + start: jest.fn().mockResolvedValue(createInternalStartContractMock()), stop: jest.fn(), }); +const createSetupContractMock = () => { + const contract: jest.Mocked = { + onSetup: jest.fn(), + onStart: jest.fn(), + }; + + return contract; +}; + +const createStartContractMock = () => { + const contract: jest.Mocked = { + onStart: jest.fn(), + }; + return contract; +}; + function createUiPlugins() { return { browserConfigs: new Map(), @@ -38,5 +61,7 @@ export const pluginServiceMock = { create: createServiceMock, createSetupContract: createSetupContractMock, createStartContract: createStartContractMock, + createInternalSetupContract: createInternalSetupContractMock, + createInternalStartContract: createInternalStartContractMock, createUiPlugins, }; diff --git a/packages/core/plugins/core-plugins-server-mocks/tsconfig.json b/packages/core/plugins/core-plugins-server-mocks/tsconfig.json index b1ed9a23b486ce..12e0e114a9de41 100644 --- a/packages/core/plugins/core-plugins-server-mocks/tsconfig.json +++ b/packages/core/plugins/core-plugins-server-mocks/tsconfig.json @@ -12,7 +12,8 @@ ], "kbn_references": [ "@kbn/utility-types", - "@kbn/core-plugins-server-internal" + "@kbn/core-plugins-server-internal", + "@kbn/core-plugins-contracts-server" ], "exclude": [ "target/**/*", diff --git a/packages/core/plugins/core-plugins-server/src/types.ts b/packages/core/plugins/core-plugins-server/src/types.ts index 207df71df32790..202148f1a1d9cf 100644 --- a/packages/core/plugins/core-plugins-server/src/types.ts +++ b/packages/core/plugins/core-plugins-server/src/types.ts @@ -215,6 +215,12 @@ export interface PluginManifest { */ readonly optionalPlugins: readonly PluginName[]; + /** + * An optional list of plugin dependencies that can be resolved dynamically at runtime + * using the dynamic contract resolving capabilities from the plugin service. + */ + readonly runtimePluginDependencies: readonly string[]; + /** * Specifies whether plugin includes some client/browser specific functionality * that should be included into client bundle via `public/ui_plugin.js` file. diff --git a/packages/core/rendering/core-rendering-server-internal/src/bootstrap/get_plugin_bundle_paths.test.ts b/packages/core/rendering/core-rendering-server-internal/src/bootstrap/get_plugin_bundle_paths.test.ts index e5443e98aefee1..f0ea056713b242 100644 --- a/packages/core/rendering/core-rendering-server-internal/src/bootstrap/get_plugin_bundle_paths.test.ts +++ b/packages/core/rendering/core-rendering-server-internal/src/bootstrap/get_plugin_bundle_paths.test.ts @@ -30,6 +30,7 @@ const createUiPlugins = (pluginDeps: Record) => { type: PluginType.standard, optionalPlugins: [], requiredPlugins: [], + runtimePluginDependencies: [], requiredBundles: deps, }); diff --git a/packages/kbn-repo-packages/legacy/parse_kibana_platform_plugin.js b/packages/kbn-repo-packages/legacy/parse_kibana_platform_plugin.js index dad5590648ec3a..5aa648ac6aa7ac 100644 --- a/packages/kbn-repo-packages/legacy/parse_kibana_platform_plugin.js +++ b/packages/kbn-repo-packages/legacy/parse_kibana_platform_plugin.js @@ -71,6 +71,10 @@ function parseLegacyKibanaPlatformPlugin(manifestPath) { optionalPlugins: isValidDepsDeclaration(manifest.optionalPlugins, 'optionalPlugins'), requiredBundles: isValidDepsDeclaration(manifest.requiredBundles, 'requiredBundles'), extraPublicDirs: isValidDepsDeclaration(manifest.extraPublicDirs, 'extraPublicDirs'), + runtimePluginDependencies: isValidDepsDeclaration( + manifest.runtimePluginDependencies, + 'runtimePluginDependencies' + ), }, }; } diff --git a/packages/kbn-repo-packages/legacy/types.ts b/packages/kbn-repo-packages/legacy/types.ts index 6a389dd7067fec..740d39483e8bf9 100644 --- a/packages/kbn-repo-packages/legacy/types.ts +++ b/packages/kbn-repo-packages/legacy/types.ts @@ -31,6 +31,7 @@ export interface LegacyKibanaPlatformPluginManifest { serviceFolders: readonly string[]; requiredPlugins: readonly string[]; optionalPlugins: readonly string[]; + runtimePluginDependencies?: readonly string[]; requiredBundles: readonly string[]; extraPublicDirs: readonly string[]; } diff --git a/packages/kbn-repo-packages/modern/parse_package_manifest.js b/packages/kbn-repo-packages/modern/parse_package_manifest.js index f043fc055de729..d82ca10bf2b1cc 100644 --- a/packages/kbn-repo-packages/modern/parse_package_manifest.js +++ b/packages/kbn-repo-packages/modern/parse_package_manifest.js @@ -62,6 +62,7 @@ function validatePackageManifestPlugin(plugin, repoRoot, path) { requiredPlugins, optionalPlugins, requiredBundles, + runtimePluginDependencies, enabledOnAnonymousPages, type, __category__, @@ -103,6 +104,14 @@ function validatePackageManifestPlugin(plugin, repoRoot, path) { ); } + if (runtimePluginDependencies !== undefined && !isArrOfIds(runtimePluginDependencies)) { + throw err( + `plugin.runtimePluginDependencies`, + runtimePluginDependencies, + `must be an array of strings in camel or snake case` + ); + } + if (requiredBundles !== undefined && !isArrOfIds(requiredBundles)) { throw err( `plugin.requiredBundles`, @@ -154,6 +163,7 @@ function validatePackageManifestPlugin(plugin, repoRoot, path) { requiredPlugins, optionalPlugins, requiredBundles, + runtimePluginDependencies, enabledOnAnonymousPages, extraPublicDirs, [PLUGIN_CATEGORY]: __category__, diff --git a/packages/kbn-repo-packages/modern/types.ts b/packages/kbn-repo-packages/modern/types.ts index 45babe6da5ac2d..c0aff593dcd6ad 100644 --- a/packages/kbn-repo-packages/modern/types.ts +++ b/packages/kbn-repo-packages/modern/types.ts @@ -104,6 +104,7 @@ export interface PluginPackageManifest extends PackageManifestBaseFields { requiredPlugins?: string[]; optionalPlugins?: string[]; requiredBundles?: string[]; + runtimePluginDependencies?: string[]; enabledOnAnonymousPages?: boolean; type?: 'preboot'; extraPublicDirs?: string[]; diff --git a/src/core/public/index.ts b/src/core/public/index.ts index 991b0c4bc1b1a7..b874a937257b21 100644 --- a/src/core/public/index.ts +++ b/src/core/public/index.ts @@ -68,6 +68,16 @@ export type { PluginInitializer, PluginInitializerContext, } from '@kbn/core-plugins-browser'; +export type { + PluginsServiceSetup, + PluginsServiceStart, + PluginContractResolver, + PluginContractMap, + PluginContractResolverResponse, + PluginContractResolverResponseItem, + FoundPluginContractResolverResponseItem, + NotFoundPluginContractResolverResponseItem, +} from '@kbn/core-plugins-contracts-browser'; export type { PluginOpaqueId } from '@kbn/core-base-common'; export type { PackageInfo, EnvironmentMode } from '@kbn/config'; diff --git a/src/core/server/index.ts b/src/core/server/index.ts index b8fa9e29156383..30562d389ac416 100644 --- a/src/core/server/index.ts +++ b/src/core/server/index.ts @@ -46,7 +46,10 @@ import { configSchema as elasticsearchConfigSchema } from '@kbn/core-elasticsear import type { CapabilitiesSetup, CapabilitiesStart } from '@kbn/core-capabilities-server'; import type { RequestHandlerContext } from '@kbn/core-http-request-handler-context-server'; import type { HttpResources } from '@kbn/core-http-resources-server'; -import type { PluginsServiceSetup, PluginsServiceStart } from '@kbn/core-plugins-server-internal'; +import type { + InternalPluginsServiceSetup, + InternalPluginsServiceStart, +} from '@kbn/core-plugins-server-internal'; export { bootstrap } from '@kbn/core-root-server-internal'; @@ -234,6 +237,16 @@ export type { MakeUsageFromSchema, ExposedToBrowserDescriptor, } from '@kbn/core-plugins-server'; +export type { + PluginsServiceSetup, + PluginsServiceStart, + NotFoundPluginContractResolverResponseItem, + FoundPluginContractResolverResponseItem, + PluginContractResolverResponseItem, + PluginContractMap, + PluginContractResolverResponse, + PluginContractResolver, +} from '@kbn/core-plugins-contracts-server'; export type { PluginName, DiscoveredPlugin } from '@kbn/core-base-common'; @@ -472,8 +485,8 @@ export type { ExecutionContextSetup, ExecutionContextStart, HttpResources, - PluginsServiceSetup, - PluginsServiceStart, + InternalPluginsServiceSetup, + InternalPluginsServiceStart, }; /** diff --git a/src/core/tsconfig.json b/src/core/tsconfig.json index 2e63a6c8456819..88cac513213222 100644 --- a/src/core/tsconfig.json +++ b/src/core/tsconfig.json @@ -153,6 +153,8 @@ "@kbn/stdio-dev-helpers", "@kbn/safer-lodash-set", "@kbn/core-test-helpers-model-versions", + "@kbn/core-plugins-contracts-browser", + "@kbn/core-plugins-contracts-server", ], "exclude": [ "target/**/*", diff --git a/src/plugins/files/server/integration_tests/file_service.test.ts b/src/plugins/files/server/integration_tests/file_service.test.ts index 990716835417de..05308ff7a78eff 100644 --- a/src/plugins/files/server/integration_tests/file_service.test.ts +++ b/src/plugins/files/server/integration_tests/file_service.test.ts @@ -6,7 +6,8 @@ * Side Public License, v 1. */ -import { CoreStart, ElasticsearchClient } from '@kbn/core/server'; +import { ElasticsearchClient } from '@kbn/core/server'; +import type { InternalCoreStart } from '@kbn/core-lifecycle-server-internal'; import { createTestServers, createRootWithCorePlugins, @@ -38,7 +39,7 @@ describe('FileService', () => { let fileService: FileServiceStart; let blobStorageService: BlobStorageService; let esClient: ElasticsearchClient; - let coreStart: CoreStart; + let coreStart: InternalCoreStart; let fileServiceFactory: FileServiceFactory; let security: ReturnType; let auditLogger: AuditLogger; @@ -93,11 +94,13 @@ describe('FileService', () => { }); let disposables: File[] = []; + async function createDisposableFile(args: CreateFileArgs) { const file = await fileService.create(args); disposables.push(file); return file; } + afterEach(async () => { await fileService.bulkDelete({ ids: disposables.map((d) => d.id) }); const { files } = await fileService.find({ kind: [fileKind] }); @@ -326,6 +329,7 @@ describe('FileService', () => { interface CustomMeta { some: string; } + it('updates files', async () => { const file = await createDisposableFile({ fileKind, name: 'test' }); const updatableFields = { diff --git a/src/plugins/files/tsconfig.json b/src/plugins/files/tsconfig.json index a45132f21d5921..0a68f4755f494b 100644 --- a/src/plugins/files/tsconfig.json +++ b/src/plugins/files/tsconfig.json @@ -33,6 +33,7 @@ "@kbn/core-saved-objects-server-mocks", "@kbn/logging", "@kbn/core-http-common", + "@kbn/core-lifecycle-server-internal", ], "exclude": [ "target/**/*", diff --git a/test/plugin_functional/plugins/core_dynamic_resolving_a/kibana.jsonc b/test/plugin_functional/plugins/core_dynamic_resolving_a/kibana.jsonc new file mode 100644 index 00000000000000..a992885a1849eb --- /dev/null +++ b/test/plugin_functional/plugins/core_dynamic_resolving_a/kibana.jsonc @@ -0,0 +1,14 @@ +{ + "type": "plugin", + "id": "@kbn/core-plugin-dynamic-resolving-a", + "owner": "@elastic/kibana-core", + "plugin": { + "id": "coreDynamicResolvingA", + "server": true, + "browser": false, + "configPath": [ + "core_plugin_a" + ], + "runtimePluginDependencies" : ["coreDynamicResolvingB"] + } +} diff --git a/test/plugin_functional/plugins/core_dynamic_resolving_a/package.json b/test/plugin_functional/plugins/core_dynamic_resolving_a/package.json new file mode 100644 index 00000000000000..7d785782a265d5 --- /dev/null +++ b/test/plugin_functional/plugins/core_dynamic_resolving_a/package.json @@ -0,0 +1,14 @@ +{ + "name": "@kbn/core-plugin-dynamic-resolving-a", + "version": "1.0.0", + "main": "target/test/plugin_functional/plugins/core_dynamic_resolving_a", + "kibana": { + "version": "kibana", + "templateVersion": "1.0.0" + }, + "license": "SSPL-1.0 OR Elastic License 2.0", + "scripts": { + "kbn": "node ../../../../scripts/kbn.js", + "build": "rm -rf './target' && ../../../../node_modules/.bin/tsc" + } +} \ No newline at end of file diff --git a/test/plugin_functional/plugins/core_dynamic_resolving_a/server/index.ts b/test/plugin_functional/plugins/core_dynamic_resolving_a/server/index.ts new file mode 100644 index 00000000000000..dc204bdfdea9eb --- /dev/null +++ b/test/plugin_functional/plugins/core_dynamic_resolving_a/server/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 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 or the Server + * Side Public License, v 1. + */ + +import { CoreDynamicResolvingAPlugin } from './plugin'; + +export const plugin = () => new CoreDynamicResolvingAPlugin(); diff --git a/test/plugin_functional/plugins/core_dynamic_resolving_a/server/plugin.ts b/test/plugin_functional/plugins/core_dynamic_resolving_a/server/plugin.ts new file mode 100644 index 00000000000000..a3ef470322c670 --- /dev/null +++ b/test/plugin_functional/plugins/core_dynamic_resolving_a/server/plugin.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 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 or the Server + * Side Public License, v 1. + */ + +import type { Plugin, CoreSetup } from '@kbn/core/server'; + +interface GenericSetupContract { + someSetupAPI: () => string; +} + +interface GenericStartContract { + someStartAPI: () => string; +} + +export class CoreDynamicResolvingAPlugin implements Plugin { + public setup(core: CoreSetup, deps: {}) { + const router = core.http.createRouter(); + router.get( + { + path: '/api/core_dynamic_resolving_a/test', + validate: false, + }, + async (ctx, req, res) => { + return Promise.all([ + core.plugins.onSetup<{ + coreDynamicResolvingB: GenericSetupContract; + }>('coreDynamicResolvingB'), + core.plugins.onStart<{ + coreDynamicResolvingB: GenericStartContract; + }>('coreDynamicResolvingB'), + ]).then( + ([ + { coreDynamicResolvingB: coreDynamicResolvingBSetup }, + { coreDynamicResolvingB: coreDynamicResolvingBStart }, + ]) => { + if (coreDynamicResolvingBSetup.found && coreDynamicResolvingBStart.found) { + return res.ok({ + body: { + setup: coreDynamicResolvingBSetup.contract.someSetupAPI(), + start: coreDynamicResolvingBStart.contract.someStartAPI(), + }, + }); + } else { + return res.badRequest({ + body: { + message: 'not found', + }, + }); + } + } + ); + } + ); + + return { + someSetupAPI: () => 'pluginASetup', + }; + } + + public start() { + return { + someStartAPI: () => 'pluginAStart', + }; + } + + public stop() {} +} diff --git a/test/plugin_functional/plugins/core_dynamic_resolving_a/tsconfig.json b/test/plugin_functional/plugins/core_dynamic_resolving_a/tsconfig.json new file mode 100644 index 00000000000000..1031bd9b38024a --- /dev/null +++ b/test/plugin_functional/plugins/core_dynamic_resolving_a/tsconfig.json @@ -0,0 +1,19 @@ +{ + "extends": "../../../../tsconfig.base.json", + "compilerOptions": { + "outDir": "target/types" + }, + "include": [ + "index.ts", + "public/**/*.ts", + "public/**/*.tsx", + "server/**/*.ts", + "../../../../typings/**/*", + ], + "exclude": [ + "target/**/*", + ], + "kbn_references": [ + "@kbn/core" + ] +} diff --git a/test/plugin_functional/plugins/core_dynamic_resolving_b/kibana.jsonc b/test/plugin_functional/plugins/core_dynamic_resolving_b/kibana.jsonc new file mode 100644 index 00000000000000..a6941fe1e40229 --- /dev/null +++ b/test/plugin_functional/plugins/core_dynamic_resolving_b/kibana.jsonc @@ -0,0 +1,14 @@ +{ + "type": "plugin", + "id": "@kbn/core-plugin-dynamic-resolving-b", + "owner": "@elastic/kibana-core", + "plugin": { + "id": "coreDynamicResolvingB", + "server": true, + "browser": false, + "configPath": [ + "core_plugin_b" + ], + "runtimePluginDependencies" : ["coreDynamicResolvingA"] + } +} diff --git a/test/plugin_functional/plugins/core_dynamic_resolving_b/package.json b/test/plugin_functional/plugins/core_dynamic_resolving_b/package.json new file mode 100644 index 00000000000000..63059917267e23 --- /dev/null +++ b/test/plugin_functional/plugins/core_dynamic_resolving_b/package.json @@ -0,0 +1,14 @@ +{ + "name": "@kbn/core-plugin-dynamic-resolving-b", + "version": "1.0.0", + "main": "target/test/plugin_functional/plugins/core_dynamic_resolving_b", + "kibana": { + "version": "kibana", + "templateVersion": "1.0.0" + }, + "license": "SSPL-1.0 OR Elastic License 2.0", + "scripts": { + "kbn": "node ../../../../scripts/kbn.js", + "build": "rm -rf './target' && ../../../../node_modules/.bin/tsc" + } +} \ No newline at end of file diff --git a/test/plugin_functional/plugins/core_dynamic_resolving_b/server/index.ts b/test/plugin_functional/plugins/core_dynamic_resolving_b/server/index.ts new file mode 100644 index 00000000000000..ed305f96d7bc97 --- /dev/null +++ b/test/plugin_functional/plugins/core_dynamic_resolving_b/server/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 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 or the Server + * Side Public License, v 1. + */ + +import { CoreDynamicResolvingBPlugin } from './plugin'; + +export const plugin = () => new CoreDynamicResolvingBPlugin(); diff --git a/test/plugin_functional/plugins/core_dynamic_resolving_b/server/plugin.ts b/test/plugin_functional/plugins/core_dynamic_resolving_b/server/plugin.ts new file mode 100644 index 00000000000000..284ef6e4939813 --- /dev/null +++ b/test/plugin_functional/plugins/core_dynamic_resolving_b/server/plugin.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 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 or the Server + * Side Public License, v 1. + */ + +import type { Plugin, CoreSetup } from '@kbn/core/server'; + +interface GenericSetupContract { + someSetupAPI: () => string; +} + +interface GenericStartContract { + someStartAPI: () => string; +} + +export class CoreDynamicResolvingBPlugin implements Plugin { + public setup(core: CoreSetup, deps: {}) { + const router = core.http.createRouter(); + router.get( + { + path: '/api/core_dynamic_resolving_b/test', + validate: false, + }, + async (ctx, req, res) => { + return Promise.all([ + core.plugins.onSetup<{ + coreDynamicResolvingA: GenericSetupContract; + }>('coreDynamicResolvingA'), + core.plugins.onStart<{ + coreDynamicResolvingA: GenericStartContract; + }>('coreDynamicResolvingA'), + ]).then( + ([ + { coreDynamicResolvingA: coreDynamicResolvingASetup }, + { coreDynamicResolvingA: coreDynamicResolvingAStart }, + ]) => { + if (coreDynamicResolvingASetup.found && coreDynamicResolvingAStart.found) { + return res.ok({ + body: { + setup: coreDynamicResolvingASetup.contract.someSetupAPI(), + start: coreDynamicResolvingAStart.contract.someStartAPI(), + }, + }); + } else { + return res.badRequest({ + body: { + message: 'not found', + }, + }); + } + } + ); + } + ); + + return { + someSetupAPI: () => 'pluginBSetup', + }; + } + + public start() { + return { + someStartAPI: () => 'pluginBStart', + }; + } + + public stop() {} +} diff --git a/test/plugin_functional/plugins/core_dynamic_resolving_b/tsconfig.json b/test/plugin_functional/plugins/core_dynamic_resolving_b/tsconfig.json new file mode 100644 index 00000000000000..1031bd9b38024a --- /dev/null +++ b/test/plugin_functional/plugins/core_dynamic_resolving_b/tsconfig.json @@ -0,0 +1,19 @@ +{ + "extends": "../../../../tsconfig.base.json", + "compilerOptions": { + "outDir": "target/types" + }, + "include": [ + "index.ts", + "public/**/*.ts", + "public/**/*.tsx", + "server/**/*.ts", + "../../../../typings/**/*", + ], + "exclude": [ + "target/**/*", + ], + "kbn_references": [ + "@kbn/core" + ] +} diff --git a/test/plugin_functional/test_suites/core_plugins/dynamic_contract_resolving.ts b/test/plugin_functional/test_suites/core_plugins/dynamic_contract_resolving.ts new file mode 100644 index 00000000000000..05ef43b88aaac2 --- /dev/null +++ b/test/plugin_functional/test_suites/core_plugins/dynamic_contract_resolving.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 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 or the Server + * Side Public License, v 1. + */ + +import { PluginFunctionalProviderContext } from '../../services'; + +export default function ({ getService }: PluginFunctionalProviderContext) { + const supertest = getService('supertest'); + + describe('Dynamic plugin resolving', function describeIndexTests() { + it('Plugin A can dynamically resolve plugin B contracts', async () => { + await supertest + .get('/api/core_dynamic_resolving_a/test') + .set('kbn-xsrf', 'anything') + .send() + .expect(200) + .expect({ + setup: 'pluginBSetup', + start: 'pluginBStart', + }); + }); + + it('Plugin B can dynamically resolve plugin A contracts', async () => { + await supertest + .get('/api/core_dynamic_resolving_b/test') + .set('kbn-xsrf', 'anything') + .send() + .expect(200) + .expect({ + setup: 'pluginASetup', + start: 'pluginAStart', + }); + }); + }); +} diff --git a/test/plugin_functional/test_suites/core_plugins/index.ts b/test/plugin_functional/test_suites/core_plugins/index.ts index 79850dd6333756..1423a882fc5a24 100644 --- a/test/plugin_functional/test_suites/core_plugins/index.ts +++ b/test/plugin_functional/test_suites/core_plugins/index.ts @@ -24,5 +24,6 @@ export default function ({ loadTestFile }: PluginFunctionalProviderContext) { loadTestFile(require.resolve('./chrome_help_menu_links')); loadTestFile(require.resolve('./history_block')); loadTestFile(require.resolve('./http')); + loadTestFile(require.resolve('./dynamic_contract_resolving')); }); } diff --git a/tsconfig.base.json b/tsconfig.base.json index 56ba0de5dafb60..b0fd477a6aff3a 100644 --- a/tsconfig.base.json +++ b/tsconfig.base.json @@ -446,6 +446,10 @@ "@kbn/core-plugin-deep-links-plugin/*": ["test/plugin_functional/plugins/core_plugin_deep_links/*"], "@kbn/core-plugin-deprecations-plugin": ["test/plugin_functional/plugins/core_plugin_deprecations"], "@kbn/core-plugin-deprecations-plugin/*": ["test/plugin_functional/plugins/core_plugin_deprecations/*"], + "@kbn/core-plugin-dynamic-resolving-a": ["test/plugin_functional/plugins/core_dynamic_resolving_a"], + "@kbn/core-plugin-dynamic-resolving-a/*": ["test/plugin_functional/plugins/core_dynamic_resolving_a/*"], + "@kbn/core-plugin-dynamic-resolving-b": ["test/plugin_functional/plugins/core_dynamic_resolving_b"], + "@kbn/core-plugin-dynamic-resolving-b/*": ["test/plugin_functional/plugins/core_dynamic_resolving_b/*"], "@kbn/core-plugin-execution-context-plugin": ["test/plugin_functional/plugins/core_plugin_execution_context"], "@kbn/core-plugin-execution-context-plugin/*": ["test/plugin_functional/plugins/core_plugin_execution_context/*"], "@kbn/core-plugin-helpmenu-plugin": ["test/plugin_functional/plugins/core_plugin_helpmenu"], @@ -464,6 +468,10 @@ "@kbn/core-plugins-browser-internal/*": ["packages/core/plugins/core-plugins-browser-internal/*"], "@kbn/core-plugins-browser-mocks": ["packages/core/plugins/core-plugins-browser-mocks"], "@kbn/core-plugins-browser-mocks/*": ["packages/core/plugins/core-plugins-browser-mocks/*"], + "@kbn/core-plugins-contracts-browser": ["packages/core/plugins/core-plugins-contracts-browser"], + "@kbn/core-plugins-contracts-browser/*": ["packages/core/plugins/core-plugins-contracts-browser/*"], + "@kbn/core-plugins-contracts-server": ["packages/core/plugins/core-plugins-contracts-server"], + "@kbn/core-plugins-contracts-server/*": ["packages/core/plugins/core-plugins-contracts-server/*"], "@kbn/core-plugins-server": ["packages/core/plugins/core-plugins-server"], "@kbn/core-plugins-server/*": ["packages/core/plugins/core-plugins-server/*"], "@kbn/core-plugins-server-internal": ["packages/core/plugins/core-plugins-server-internal"], diff --git a/x-pack/plugins/fleet/.storybook/context/index.tsx b/x-pack/plugins/fleet/.storybook/context/index.tsx index 43d3eea74df33e..538a62ce325873 100644 --- a/x-pack/plugins/fleet/.storybook/context/index.tsx +++ b/x-pack/plugins/fleet/.storybook/context/index.tsx @@ -13,6 +13,7 @@ import { createBrowserHistory } from 'history'; import { I18nProvider } from '@kbn/i18n-react'; +import type { PluginsServiceStart } from '@kbn/core/public'; import { CoreScopedHistory } from '@kbn/core/public'; import { getStorybookContextProvider } from '@kbn/custom-integrations-plugin/storybook'; @@ -93,6 +94,7 @@ export const StorybookContext: React.FC<{ storyContext?: Parameters theme: { theme$: EMPTY, }, + plugins: {} as unknown as PluginsServiceStart, authz: { fleet: { all: true, diff --git a/yarn.lock b/yarn.lock index 4030af3bd91dc2..c2b7799faa3f7d 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3792,6 +3792,14 @@ version "0.0.0" uid "" +"@kbn/core-plugin-dynamic-resolving-a@link:test/plugin_functional/plugins/core_dynamic_resolving_a": + version "0.0.0" + uid "" + +"@kbn/core-plugin-dynamic-resolving-b@link:test/plugin_functional/plugins/core_dynamic_resolving_b": + version "0.0.0" + uid "" + "@kbn/core-plugin-execution-context-plugin@link:test/plugin_functional/plugins/core_plugin_execution_context": version "0.0.0" uid "" @@ -3828,6 +3836,14 @@ version "0.0.0" uid "" +"@kbn/core-plugins-contracts-browser@link:packages/core/plugins/core-plugins-contracts-browser": + version "0.0.0" + uid "" + +"@kbn/core-plugins-contracts-server@link:packages/core/plugins/core-plugins-contracts-server": + version "0.0.0" + uid "" + "@kbn/core-plugins-server-internal@link:packages/core/plugins/core-plugins-server-internal": version "0.0.0" uid "" From 90da0214604dc8f497d997def664dab5b26543f2 Mon Sep 17 00:00:00 2001 From: Francesco Gualazzi Date: Tue, 24 Oct 2023 11:47:49 +0200 Subject: [PATCH 61/68] profiling: fix binary instructions (#169215) ## Summary Fix a bug in the Universal Profiling instructions "Binary" tab, due to how packages are created. Signed-off-by: inge4pres --- .../e2e/profiling_views/functions.cy.ts | 2 +- .../public/views/add_data_view/index.tsx | 831 ++++++++++-------- .../translations/translations/fr-FR.json | 20 - .../translations/translations/ja-JP.json | 20 - .../translations/translations/zh-CN.json | 20 - 5 files changed, 458 insertions(+), 435 deletions(-) diff --git a/x-pack/plugins/profiling/e2e/cypress/e2e/profiling_views/functions.cy.ts b/x-pack/plugins/profiling/e2e/cypress/e2e/profiling_views/functions.cy.ts index 8b0a66180c7a4e..ca972d0605e22a 100644 --- a/x-pack/plugins/profiling/e2e/cypress/e2e/profiling_views/functions.cy.ts +++ b/x-pack/plugins/profiling/e2e/cypress/e2e/profiling_views/functions.cy.ts @@ -10,7 +10,7 @@ import { profilingPerCoreWatt, } from '@kbn/observability-plugin/common'; -describe('Functions page', () => { +describe.skip('Functions page', () => { const rangeFrom = '2023-04-18T00:00:00.000Z'; const rangeTo = '2023-04-18T00:00:30.000Z'; diff --git a/x-pack/plugins/profiling/public/views/add_data_view/index.tsx b/x-pack/plugins/profiling/public/views/add_data_view/index.tsx index b6fef9c71c6785..556e29c1ba2403 100644 --- a/x-pack/plugins/profiling/public/views/add_data_view/index.tsx +++ b/x-pack/plugins/profiling/public/views/add_data_view/index.tsx @@ -5,7 +5,7 @@ * 2.0. */ import { i18n } from '@kbn/i18n'; -import React from 'react'; +import React, { useEffect, useMemo, useState } from 'react'; import { EuiButton, EuiCallOut, @@ -43,11 +43,26 @@ export enum AddDataTabs { Symbols = 'symbols', } +interface Step { + title: string; + content: string | React.ReactNode; +} + +interface Tab { + key: string; + title: string; + steps?: Step[]; + subTabs?: Tab[]; +} + +const supportedCPUArchitectures = ['x86_64', 'arm64']; + export function AddDataView() { const { query } = useProfilingParams('/add-data-instructions'); const { selectedTab } = query; const profilingRouter = useProfilingRouter(); const routePath = useProfilingRoutePath(); + const [selectedSubTabKey, setSelectedSubTabKey] = useState(); const { services: { setupDataCollectionInstructions }, @@ -67,393 +82,429 @@ export function AddDataView() { const stackVersion = data?.stackVersion!; const majorVersion = stackVersion ? major(stackVersion).toString() : undefined; - const tabs = [ - { - key: AddDataTabs.Kubernetes, - title: i18n.translate('xpack.profiling.tabs.kubernetesTitle', { - defaultMessage: 'Kubernetes', - }), - steps: [ - { - title: i18n.translate('xpack.profiling.tabs.kubernetesRepositoryStep', { - defaultMessage: 'Configure the Universal Profiling Agent Helm repository:', - }), - content: ( - - helm repo add elastic https://helm.elastic.co - - ), - }, - { - title: i18n.translate('xpack.profiling.tabs.kubernetesInstallStep', { - defaultMessage: 'Install host-agent via Helm:', - }), - content: ( - - {`helm install --create-namespace -n=universal-profiling universal-profiling-agent \\ + const tabs: Tab[] = useMemo( + () => [ + { + key: AddDataTabs.Kubernetes, + title: i18n.translate('xpack.profiling.tabs.kubernetesTitle', { + defaultMessage: 'Kubernetes', + }), + steps: [ + { + title: i18n.translate('xpack.profiling.tabs.kubernetesRepositoryStep', { + defaultMessage: 'Configure the Universal Profiling Agent Helm repository:', + }), + content: ( + + {i18n.translate('xpack.profiling.tabs.helmRepoAddElasticCodeBlockLabel', { + defaultMessage: 'helm repo add elastic https://helm.elastic.co', + })} + + ), + }, + { + title: i18n.translate('xpack.profiling.tabs.kubernetesInstallStep', { + defaultMessage: 'Install host-agent via Helm:', + }), + content: ( + + {`helm install --create-namespace -n=universal-profiling universal-profiling-agent \\ --set "projectID=1,secretToken=${secretToken}" \\ --set "collectionAgentHostPort=${collectionAgentHost}" \\ --set "version=${stackVersion}" \\ --version=${stackVersion} \\ elastic/pf-host-agent`} - - ), - }, - { - title: i18n.translate('xpack.profiling.tabs.kubernetesValidationStep', { - defaultMessage: 'Validate the host-agent pods are running:', - }), - content: ( - - kubectl -n universal-profiling get pods - - ), - }, - { - title: i18n.translate('xpack.profiling.tabs.postValidationStep', { - defaultMessage: - 'Use the Helm install output to get host-agent logs and spot potential errors', - }), - content: <>, - }, - ], - }, - { - key: AddDataTabs.Docker, - title: i18n.translate('xpack.profiling.tabs.dockerTitle', { - defaultMessage: 'Docker', - }), - steps: [ - { - title: i18n.translate('xpack.profiling.tabs.dockerRunContainerStep', { - defaultMessage: 'Run the Universal Profiling container:', - }), - content: ( - - {`docker run --name pf-host-agent --privileged --pid=host -v /etc/machine-id:/etc/machine-id:ro \\ + + ), + }, + { + title: i18n.translate('xpack.profiling.tabs.kubernetesValidationStep', { + defaultMessage: 'Validate the host-agent pods are running:', + }), + content: ( + + {i18n.translate('xpack.profiling.tabs.kubectlGetPods', { + defaultMessage: 'kubectl -n universal-profiling get pods', + })} + + ), + }, + { + title: i18n.translate('xpack.profiling.tabs.postValidationStep', { + defaultMessage: + 'Use the Helm install output to get host-agent logs and spot potential errors', + }), + content: <>, + }, + ], + }, + { + key: AddDataTabs.Docker, + title: i18n.translate('xpack.profiling.tabs.dockerTitle', { + defaultMessage: 'Docker', + }), + steps: [ + { + title: i18n.translate('xpack.profiling.tabs.dockerRunContainerStep', { + defaultMessage: 'Run the Universal Profiling container:', + }), + content: ( + + {`docker run --name pf-host-agent --privileged --pid=host -v /etc/machine-id:/etc/machine-id:ro \\ -v /var/run/docker.sock:/var/run/docker.sock -v /sys/kernel/debug:/sys/kernel/debug:ro \\ docker.elastic.co/observability/profiling-agent:${stackVersion} /root/pf-host-agent \\ -project-id=1 -secret-token=${secretToken} \\ -collection-agent=${collectionAgentHost}`} - - ), - }, - ], - }, - { - key: AddDataTabs.Binary, - title: i18n.translate('xpack.profiling.tabs.binaryTitle', { - defaultMessage: 'Binary', - }), - steps: [ - { - title: i18n.translate('xpack.profiling.tabs.binaryDownloadStep', { - defaultMessage: 'Download the binary for the right architecture:', - }), - content: ( - - For x86_64: - + + ), + }, + ], + }, + { + key: AddDataTabs.Binary, + title: i18n.translate('xpack.profiling.tabs.binaryTitle', { + defaultMessage: 'Binary', + }), + // Create a dedicated sub tab for each architecture that we support + subTabs: supportedCPUArchitectures.map((arch) => { + return { + key: arch, + title: `Linux ${arch}`, + steps: [ + { + title: i18n.translate('xpack.profiling.tabs.binaryDownloadStep', { + defaultMessage: 'Download the binary:', + }), + content: ( + + {`wget -O pf-host-agent.tgz "https://artifacts.elastic.co/downloads/prodfiler/pf-host-agent-${stackVersion}-linux-${arch}.tar.gz" && tar xzf pf-host-agent.tgz`} + + ), + }, + { + title: i18n.translate('xpack.profiling.tabs.binaryGrantPermissionStep', { + defaultMessage: 'Grant executable permissions:', + }), + content: ( + + {`chmod +x pf-host-agent-${stackVersion}-linux-${arch}/pf-host-agent`} + + ), + }, + { + title: i18n.translate('xpack.profiling.tabs.binaryRunHostAgentStep', { + defaultMessage: + 'Run the Universal Profiling host-agent (requires root privileges):', + }), + content: ( + + {`sudo pf-host-agent-${stackVersion}-linux-${arch}/pf-host-agent -project-id=1 -secret-token=${secretToken} -collection-agent=${collectionAgentHost}`} + + ), + }, + ], + }; + }), + }, + { + key: AddDataTabs.Deb, + title: i18n.translate('xpack.profiling.tabs.debTitle', { + defaultMessage: 'DEB Package', + }), + steps: [ + { + title: i18n.translate('xpack.profiling.tabs.debConfigureRepoStep', { + defaultMessage: 'Configure the apt repository (requires root privileges):', + }), + content: ( - {`wget -O pf-host-agent.tgz "https://artifacts.elastic.co/downloads/prodfiler/pf-host-agent-${stackVersion}-linux-x86_64.tar.gz" && tar xzf pf-host-agent.tgz`} + {`wget -qO - https://artifacts.elastic.co/GPG-KEY-elasticsearch | sudo apt-key add - + sudo apt-get install apt-transport-https + echo "deb https://artifacts.elastic.co/packages/${majorVersion}.x/apt stable main" | sudo tee -a /etc/apt/sources.list.d/elastic-${majorVersion}.x.list + `} - - For ARM64: - + ), + }, + { + title: i18n.translate('xpack.profiling.tabs.debInstallPackageStep', { + defaultMessage: 'Install the DEB package (requires root privileges):', + }), + content: ( - {`wget -O pf-host-agent.tgz "https://artifacts.elastic.co/downloads/prodfiler/pf-host-agent-${stackVersion}-linux-arm64.tar.gz" && tar xzf pf-host-agent.tgz`} + {`sudo apt-get update && sudo apt-get install pf-host-agent`} - - ), - }, - { - title: i18n.translate('xpack.profiling.tabs.binaryGrantPermissionStep', { - defaultMessage: 'Grant executable permissions:', - }), - content: ( - - chmod +x pf-host-agent/pf-host-agent - - ), - }, - { - title: i18n.translate('xpack.profiling.tabs.binaryRunHostAgentStep', { - defaultMessage: 'Run the Universal Profiling host-agent (requires root privileges):', - }), - content: ( - - {`sudo pf-host-agent/pf-host-agent -project-id=1 -secret-token=${secretToken} -collection-agent=${collectionAgentHost}`} - - ), - }, - ], - }, - { - key: AddDataTabs.Deb, - title: i18n.translate('xpack.profiling.tabs.debTitle', { - defaultMessage: 'DEB Package', - }), - steps: [ - { - title: i18n.translate('xpack.profiling.tabs.debConfigureRepoStep', { - defaultMessage: 'Configure the apt repository (requires root privileges):', - }), - content: ( - - {`wget -qO - https://artifacts.elastic.co/GPG-KEY-elasticsearch | sudo apt-key add - -sudo apt-get install apt-transport-https -echo "deb https://artifacts.elastic.co/packages/${majorVersion}.x/apt stable main" | sudo tee -a /etc/apt/sources.list.d/elastic-${majorVersion}.x.list -`} - - ), - }, - { - title: i18n.translate('xpack.profiling.tabs.debInstallPackageStep', { - defaultMessage: 'Install the DEB package (requires root privileges):', - }), - content: ( - - {`sudo apt-get update && sudo apt-get install pf-host-agent`} - - ), - }, - { - title: i18n.translate('xpack.profiling.tabs.debEditConfigStep', { - defaultMessage: 'Edit the configuration (requires root privileges):', - }), - content: ( - - {`echo -e "project-id 1\nsecret-token ${secretToken}\ncollection-agent ${collectionAgentHost}" | sudo tee -a /etc/Elastic/universal-profiling/pf-host-agent.conf`} - - ), - }, - { - title: i18n.translate('xpack.profiling.tabs.debStartSystemdServiceStep', { - defaultMessage: - 'Start the Universal Profiling systemd service (requires root privileges):', - }), - content: ( - - {`sudo systemctl enable pf-host-agent && sudo systemctl restart pf-host-agent`} - - ), - }, - ], - }, - { - key: AddDataTabs.RPM, - title: i18n.translate('xpack.profiling.tabs.rpmTitle', { - defaultMessage: 'RPM Package', - }), - steps: [ - { - title: i18n.translate('xpack.profiling.tabs.rpmConfigureRepoStep', { - defaultMessage: 'Configure the yum repository (requires root privileges):', - }), - content: ( - - {`sudo rpm --import https://packages.elastic.co/GPG-KEY-elasticsearch -cat < /etc/yum.repos.d/elastic.repo -[elastic-${majorVersion}.x] -name=Elastic repository for ${majorVersion}.x packages -baseurl=https://artifacts.elastic.co/packages/${majorVersion}.x/yum -gpgcheck=1 -gpgkey=https://artifacts.elastic.co/GPG-KEY-elasticsearch -enabled=1 -autorefresh=1 -type=rpm-md -EOF`} - - ), - }, - { - title: i18n.translate('xpack.profiling.tabs.rpmInstallPackageStep', { - defaultMessage: 'Install the RPM package (requires root privileges):', - }), - content: ( - - {`sudo yum install pf-host-agent`} - - ), - }, - { - title: i18n.translate('xpack.profiling.tabs.rpmEditConfigStep', { - defaultMessage: 'Edit the configuration (requires root privileges):', - }), - content: ( - - {`echo -e "project-id 1\nsecret-token ${secretToken}\ncollection-agent ${collectionAgentHost}" | sudo tee -a /etc/Elastic/universal-profiling/pf-host-agent.conf`} - - ), - }, - { - title: i18n.translate('xpack.profiling.tabs.rpmStartSystemdServiceStep', { - defaultMessage: - 'Start the Universal Profiling systemd service (requires root privileges):', - }), - content: ( - - {`sudo systemctl enable pf-host-agent && sudo systemctl restart pf-host-agent`} - - ), - }, - ], - }, - { - key: AddDataTabs.ElasticAgentIntegration, - title: i18n.translate('xpack.profiling.tabs.elasticAgentIntegration.title', { - defaultMessage: 'Elastic Agent Integration', - }), - steps: [ - { - title: i18n.translate('xpack.profiling.tabs.elasticAgentIntegration.step1', { - defaultMessage: 'Copy credentials', - }), - content: ( - <> - - {i18n.translate('xpack.profiling.tabs.elasticAgentIntegration.step1.hint', { - defaultMessage: - "You'll need these credentials to set up Universal Profiling. Please save them in a secure location, as they will be required in the subsequent step.", - })} - - - - {i18n.translate('xpack.profiling.tabs.elasticAgentIntegration.step1.secretToken', { - defaultMessage: 'Secret token:', - })} - + ), + }, + { + title: i18n.translate('xpack.profiling.tabs.debEditConfigStep', { + defaultMessage: 'Edit the configuration (requires root privileges):', + }), + content: ( - {secretToken} + {`echo -e "project-id 1\nsecret-token ${secretToken}\ncollection-agent ${collectionAgentHost}" | sudo tee -a /etc/Elastic/universal-profiling/pf-host-agent.conf`} - - - {i18n.translate( - 'xpack.profiling.tabs.elasticAgentIntegration.step1.collectionAgentUrl', - { defaultMessage: 'Universal Profiling Collector URL:' } - )} - + ), + }, + { + title: i18n.translate('xpack.profiling.tabs.debStartSystemdServiceStep', { + defaultMessage: + 'Start the Universal Profiling systemd service (requires root privileges):', + }), + content: ( - {collectionAgentHost} + {`sudo systemctl enable pf-host-agent && sudo systemctl restart pf-host-agent`} - - ), - }, - { - title: i18n.translate('xpack.profiling.tabs.elasticAgentIntegration.step2', { - defaultMessage: 'Fleet', - }), - content: ( - - {i18n.translate('xpack.profiling.tabs.elasticAgentIntegration.step2.button', { - defaultMessage: 'Manage Universal Profiling agent in Fleet', - })} - - ), - }, - ], - }, - { - key: AddDataTabs.Symbols, - title: i18n.translate('xpack.profiling.tabs.symbols.title', { - defaultMessage: 'Upload Symbols', - }), - steps: [ - { - title: i18n.translate('xpack.profiling.tabs.symbols.step1', { - defaultMessage: 'Download and extract symbtool', - }), - content: ( - - For x86_64: - + ), + }, + ], + }, + { + key: AddDataTabs.RPM, + title: i18n.translate('xpack.profiling.tabs.rpmTitle', { + defaultMessage: 'RPM Package', + }), + steps: [ + { + title: i18n.translate('xpack.profiling.tabs.rpmConfigureRepoStep', { + defaultMessage: 'Configure the yum repository (requires root privileges):', + }), + content: ( - {`wget -O symbtool-amd64.tgz "https://artifacts.elastic.co/downloads/prodfiler/symbtool-${stackVersion}-linux-x86_64.tar.gz" && tar xzf symbtool-amd64.tgz && cd symbtool-*-linux-x86_64`} + {`sudo rpm --import https://packages.elastic.co/GPG-KEY-elasticsearch + cat < /etc/yum.repos.d/elastic.repo + [elastic-${majorVersion}.x] + name=Elastic repository for ${majorVersion}.x packages + baseurl=https://artifacts.elastic.co/packages/${majorVersion}.x/yum + gpgcheck=1 + gpgkey=https://artifacts.elastic.co/GPG-KEY-elasticsearch + enabled=1 + autorefresh=1 + type=rpm-md + EOF`} - - For ARM64: - + ), + }, + { + title: i18n.translate('xpack.profiling.tabs.rpmInstallPackageStep', { + defaultMessage: 'Install the RPM package (requires root privileges):', + }), + content: ( - {`wget -O symbtool-arm64.tgz "https://artifacts.elastic.co/downloads/prodfiler/pf-host-agent-${stackVersion}-linux-arm64.tar.gz" && tar xzf symbtool-arm64.tgz && cd symbtool-*-linux-arm64`} + {`sudo yum install pf-host-agent`} - - ), - }, - { - title: i18n.translate('xpack.profiling.tabs.symbols.step2', { - defaultMessage: 'Generate an Elasticsearch token', - }), - content: ( - - - {i18n.translate('xpack.profiling.tabs.symbols.step2.instructions', { - defaultMessage: 'Instructions here', - })} - - - ), - }, - { - title: i18n.translate('xpack.profiling.tabs.symbols.step3', { - defaultMessage: 'Upload symbols', - }), - content: ( -
+ ), + }, + { + title: i18n.translate('xpack.profiling.tabs.rpmEditConfigStep', { + defaultMessage: 'Edit the configuration (requires root privileges):', + }), + content: ( - {`./symbtool push-symbols executable -u "${symbolUrl}" -t -e `} + {`echo -e "project-id 1\nsecret-token ${secretToken}\ncollection-agent ${collectionAgentHost}" | sudo tee -a /etc/Elastic/universal-profiling/pf-host-agent.conf`} - - - {``}, - help: --help, - }} - /> - - - - - {i18n.translate('xpack.profiling.tabs.symbols.step3.doc-ref.link', { - defaultMessage: 'the corresponding documentation page', - })} - - ), - }} - /> - -
- ), - }, - ], - }, - ]; + ), + }, + { + title: i18n.translate('xpack.profiling.tabs.rpmStartSystemdServiceStep', { + defaultMessage: + 'Start the Universal Profiling systemd service (requires root privileges):', + }), + content: ( + + {`sudo systemctl enable pf-host-agent && sudo systemctl restart pf-host-agent`} + + ), + }, + ], + }, + { + key: AddDataTabs.ElasticAgentIntegration, + title: i18n.translate('xpack.profiling.tabs.elasticAgentIntegration.title', { + defaultMessage: 'Elastic Agent Integration', + }), + steps: [ + { + title: i18n.translate('xpack.profiling.tabs.elasticAgentIntegration.step1', { + defaultMessage: 'Copy credentials', + }), + content: ( + <> + + {i18n.translate('xpack.profiling.tabs.elasticAgentIntegration.step1.hint', { + defaultMessage: + "You'll need these credentials to set up Universal Profiling. Please save them in a secure location, as they will be required in the subsequent step.", + })} + + + + {i18n.translate( + 'xpack.profiling.tabs.elasticAgentIntegration.step1.secretToken', + { + defaultMessage: 'Secret token:', + } + )} + + + {secretToken} + + + + {i18n.translate( + 'xpack.profiling.tabs.elasticAgentIntegration.step1.collectionAgentUrl', + { defaultMessage: 'Universal Profiling Collector URL:' } + )} + + + {collectionAgentHost} + + + ), + }, + { + title: i18n.translate('xpack.profiling.tabs.elasticAgentIntegration.step2', { + defaultMessage: 'Fleet', + }), + content: ( + + {i18n.translate('xpack.profiling.tabs.elasticAgentIntegration.step2.button', { + defaultMessage: 'Manage Universal Profiling agent in Fleet', + })} + + ), + }, + ], + }, + { + key: AddDataTabs.Symbols, + title: i18n.translate('xpack.profiling.tabs.symbols.title', { + defaultMessage: 'Upload Symbols', + }), + subTabs: supportedCPUArchitectures.map((arch) => { + return { + key: arch, + title: `Linux ${arch}`, + // inside each sub tab you define the steps as usual + steps: [ + { + title: i18n.translate('xpack.profiling.tabs.symbols.step1', { + defaultMessage: 'Download and extract symbtool', + }), + content: ( + + {`wget -O symbtool-${arch}.tgz "https://artifacts.elastic.co/downloads/prodfiler/symbtool-${stackVersion}-linux-${arch}.tar.gz" && tar xzf symbtool-${arch}.tgz && cd symbtool-${stackVersion}-linux-${arch}`} + + ), + }, + { + title: i18n.translate('xpack.profiling.tabs.symbols.step2', { + defaultMessage: 'Generate an Elasticsearch token', + }), + content: ( + + + {i18n.translate('xpack.profiling.tabs.symbols.step2.instructions', { + defaultMessage: 'Instructions here', + })} + + + ), + }, + { + title: i18n.translate('xpack.profiling.tabs.symbols.step3', { + defaultMessage: 'Upload symbols', + }), + content: ( +
+ + {`./symbtool push-symbols executable -u "${symbolUrl}" -t -e `} + + + + {``}, + help: ( + + {i18n.translate('xpack.profiling.tabs.symbols.helpFlag', { + defaultMessage: '--help', + })} + + ), + }} + /> + + + + + {i18n.translate('xpack.profiling.tabs.symbols.step3.doc-ref.link', { + defaultMessage: 'the corresponding documentation page', + })} + + ), + }} + /> + +
+ ), + }, + ], + }; + }), + }, + ], + [ + collectionAgentHost, + core.docLinks.DOC_LINK_VERSION, + core.docLinks.ELASTIC_WEBSITE_URL, + core.http.basePath, + data?.profilerAgent.version, + majorVersion, + secretToken, + stackVersion, + symbolUrl, + ] + ); - const displayedTab = tabs.find((tab) => tab.key === selectedTab)!; + const displayedTab = useMemo( + () => tabs.find((tab) => tab.key === selectedTab)!, + [selectedTab, tabs] + ); - const displayedSteps = displayedTab.steps ?? []; + useEffect(() => { + if (displayedTab.subTabs) { + const firstTabKey = displayedTab.subTabs[0].key; + setSelectedSubTabKey(firstTabKey); + } + }, [displayedTab]); + + const selectedSubTab = selectedSubTabKey + ? displayedTab.subTabs?.find((tab) => tab.key === selectedSubTabKey) + : undefined; + + const displayedSteps = displayedTab.steps || selectedSubTab?.steps || []; + const subTabs = displayedTab.subTabs ?? []; const isLoading = status === AsyncStatus.Loading; @@ -492,8 +543,20 @@ EOF`} id="xpack.profiling.tabs.debWarning" defaultMessage="Due to a {linuxLink} which impacts stability, the profiling agent will refuse to run on kernel versions {versionFrom} to {versionTo}. Refer to {debianLink} and {fedoraLink} to learn more. If you are running such a kernel with a backported fix, please refer to {advancedLink} for instructions to override the precautionary measure." values={{ - versionFrom: 5.19, - versionTo: 6.4, + versionFrom: ( + + {i18n.translate('xpack.profiling.tabs.strong.5.19Label', { + defaultMessage: '5.19', + })} + + ), + versionTo: ( + + {i18n.translate('xpack.profiling.tabs.strong.6.4Label', { + defaultMessage: '6.4', + })} + + ), linuxLink: ( + + {subTabs.length > 0 && ( + + {subTabs.map((tab) => { + return ( + { + setSelectedSubTabKey(tab.key); + }} + isSelected={tab.key === selectedSubTabKey} + > + {tab.title} + + ); + })} + + )} - { - return { - title: step.title, - children: step.content, - status: 'incomplete', - }; - })} - /> + {displayedSteps.length > 0 && ( + { + return { + title: step.title, + children: step.content, + status: 'incomplete', + }; + })} + /> + )} diff --git a/x-pack/plugins/translations/translations/fr-FR.json b/x-pack/plugins/translations/translations/fr-FR.json index 2437e516212c74..78a8c14efe63b8 100644 --- a/x-pack/plugins/translations/translations/fr-FR.json +++ b/x-pack/plugins/translations/translations/fr-FR.json @@ -27737,8 +27737,6 @@ "xpack.profiling.maxValue": "Max : {max}", "xpack.profiling.noDataConfig.action.dataRetention": "Les coûts normaux de stockage des données s'appliquent aux données de profilage stockées dans Elasticsearch. En savoir plus sur {dataRetentionLink}.", "xpack.profiling.stackFrames.subChart.avg": "{percentage} moy.", - "xpack.profiling.tabs.symbols.step3.doc-ref": "Une documentation pour des cas d’utilisation plus avancés est disponible dans {link}.", - "xpack.profiling.tabs.symbols.step3.replace": "Remplacez {es_token} etc. avec les valeurs réelles. Vous pouvez transmettre {help} pour obtenir une liste d’autres arguments.", "xpack.profiling.appPageTemplate.pageTitle": "Universal Profiling", "xpack.profiling.asyncComponent.errorLoadingData": "Impossible de charger les données", "xpack.profiling.breadcrumb.differentialFlamegraph": "Flame-graph différentiel", @@ -27851,14 +27849,6 @@ "xpack.profiling.stackTracesView.stackTracesCountButton": "Traces de la pile", "xpack.profiling.stackTracesView.threadsTabLabel": "Threads", "xpack.profiling.stackTracesView.tracesTabLabel": "Traces", - "xpack.profiling.tabs.binaryDownloadStep": "Télécharger le dernier binaire :", - "xpack.profiling.tabs.binaryGrantPermissionStep": "Accorder des autorisations d'exécution :", - "xpack.profiling.tabs.binaryRunHostAgentStep": "Exécuter l'agent hôte Universal Profiling (requiert des privilèges racine) :", - "xpack.profiling.tabs.binaryTitle": "Binaire", - "xpack.profiling.tabs.debEditConfigStep": "Modifier la configuration (requiert des privilèges racine) :", - "xpack.profiling.tabs.debInstallPackageStep": "Installer le pack DEB (requiert des privilèges racine) :", - "xpack.profiling.tabs.debStartSystemdServiceStep": "Démarrer le service systemd Universal Profiling (requiert des privilèges racine) :", - "xpack.profiling.tabs.debTitle": "Pack DEB", "xpack.profiling.tabs.dockerRunContainerStep": "Exécuter le conteneur Universal Profiling :", "xpack.profiling.tabs.dockerTitle": "Docker", "xpack.profiling.tabs.kubernetesInstallStep": "Installer l'agent hôte via Helm :", @@ -27866,16 +27856,6 @@ "xpack.profiling.tabs.kubernetesTitle": "Kubernetes", "xpack.profiling.tabs.kubernetesValidationStep": "Confirmer que les pods de l'agent hôte sont en cours d'exécution :", "xpack.profiling.tabs.postValidationStep": "Utiliser la sortie d'installation Helm pour obtenir les logs de l'agent hôte et repérer les erreurs potentielles", - "xpack.profiling.tabs.rpmEditConfigStep": "Modifier la configuration (requiert des privilèges racine) :", - "xpack.profiling.tabs.rpmInstallPackageStep": "Installer le pack RPM (requiert des privilèges racine) :", - "xpack.profiling.tabs.rpmStartSystemdServiceStep": "Démarrer le service systemd Universal Profiling (requiert des privilèges racine) :", - "xpack.profiling.tabs.rpmTitle": "Pack RPM", - "xpack.profiling.tabs.symbols.step1": "Télécharger et extraire un symbtool", - "xpack.profiling.tabs.symbols.step2": "Générer un token Elasticsearch", - "xpack.profiling.tabs.symbols.step2.instructions": "Instructions disponibles ici", - "xpack.profiling.tabs.symbols.step3": "Charger les symboles", - "xpack.profiling.tabs.symbols.step3.doc-ref.link": "la page de documentation correspondante", - "xpack.profiling.tabs.symbols.title": "Charger les symboles", "xpack.profiling.topn.otherBucketLabel": "Autre", "xpack.profiling.universalProfiling": "Universal Profiling", "xpack.profiling.zeroSeconds": "0 seconde", diff --git a/x-pack/plugins/translations/translations/ja-JP.json b/x-pack/plugins/translations/translations/ja-JP.json index cbbb8cacf8835b..a3c0a81eb44234 100644 --- a/x-pack/plugins/translations/translations/ja-JP.json +++ b/x-pack/plugins/translations/translations/ja-JP.json @@ -27737,8 +27737,6 @@ "xpack.profiling.maxValue": "最大:{max}", "xpack.profiling.noDataConfig.action.dataRetention": "Elasticsearchに格納されたプロファイリングデータには、標準データ保存コストが適用されます。{dataRetentionLink}の詳細をご覧ください。", "xpack.profiling.stackFrames.subChart.avg": "平均:{percentage}", - "xpack.profiling.tabs.symbols.step3.doc-ref": "高度なユースケースのドキュメントは{link}で提供されています。", - "xpack.profiling.tabs.symbols.step3.replace": "{es_token}などを実際の値で置換します。{help}を渡すと、他の引数のリストを取得できます。", "xpack.profiling.appPageTemplate.pageTitle": "ユニバーサルプロファイリング", "xpack.profiling.asyncComponent.errorLoadingData": "データを読み込めませんでした", "xpack.profiling.breadcrumb.differentialFlamegraph": "差分flamegraph", @@ -27851,14 +27849,6 @@ "xpack.profiling.stackTracesView.stackTracesCountButton": "スタックトレース", "xpack.profiling.stackTracesView.threadsTabLabel": "スレッド", "xpack.profiling.stackTracesView.tracesTabLabel": "トレース", - "xpack.profiling.tabs.binaryDownloadStep": "最新のバイナリをダウンロード:", - "xpack.profiling.tabs.binaryGrantPermissionStep": "実行可能権限を付与:", - "xpack.profiling.tabs.binaryRunHostAgentStep": "ユニバーサルプロファイリングホストエージェントを実行(ルート権限が必要):", - "xpack.profiling.tabs.binaryTitle": "バイナリー", - "xpack.profiling.tabs.debEditConfigStep": "構成を編集(ルート権限が必要):", - "xpack.profiling.tabs.debInstallPackageStep": "DEBパッケージをインストール(ルート権限が必要):", - "xpack.profiling.tabs.debStartSystemdServiceStep": "ユニバーサルプロファイリングシステムサービスを開始(ルート権限が必要):", - "xpack.profiling.tabs.debTitle": "DEBパッケージ", "xpack.profiling.tabs.dockerRunContainerStep": "ユニバーサルプロファイリングコンテナーを実行:", "xpack.profiling.tabs.dockerTitle": "Docker", "xpack.profiling.tabs.kubernetesInstallStep": "Helm経由でホストエージェントをインストール:", @@ -27866,16 +27856,6 @@ "xpack.profiling.tabs.kubernetesTitle": "Kubernetes", "xpack.profiling.tabs.kubernetesValidationStep": "ホストエージェントポッドが実行中であることを検証:", "xpack.profiling.tabs.postValidationStep": "Helmインストール出力を使用して、ホストエージェントログを取得し、潜在的なエラーを特定", - "xpack.profiling.tabs.rpmEditConfigStep": "構成を編集(ルート権限が必要):", - "xpack.profiling.tabs.rpmInstallPackageStep": "RPMパッケージをインストール(ルート権限が必要):", - "xpack.profiling.tabs.rpmStartSystemdServiceStep": "ユニバーサルプロファイリングシステムサービスを開始(ルート権限が必要):", - "xpack.profiling.tabs.rpmTitle": "RPMパッケージ", - "xpack.profiling.tabs.symbols.step1": "symbtoolをダウンロードして展開", - "xpack.profiling.tabs.symbols.step2": "Elasticsearchトークンを生成", - "xpack.profiling.tabs.symbols.step2.instructions": "手順", - "xpack.profiling.tabs.symbols.step3": "シンボルをアップロード", - "xpack.profiling.tabs.symbols.step3.doc-ref.link": "対応するドキュメントページ", - "xpack.profiling.tabs.symbols.title": "シンボルをアップロード", "xpack.profiling.topn.otherBucketLabel": "その他", "xpack.profiling.universalProfiling": "ユニバーサルプロファイリング", "xpack.profiling.zeroSeconds": "0秒", diff --git a/x-pack/plugins/translations/translations/zh-CN.json b/x-pack/plugins/translations/translations/zh-CN.json index b47064e16298a2..d97d840984534f 100644 --- a/x-pack/plugins/translations/translations/zh-CN.json +++ b/x-pack/plugins/translations/translations/zh-CN.json @@ -27735,8 +27735,6 @@ "xpack.profiling.maxValue": "最大值:{max}", "xpack.profiling.noDataConfig.action.dataRetention": "分析 Elasticsearch 中存储的数据时,正常数据存储成本适用。详细了解 {dataRetentionLink}。", "xpack.profiling.stackFrames.subChart.avg": "平均 {percentage}", - "xpack.profiling.tabs.symbols.step3.doc-ref": "{link} 中提供了更高级用例的文档。", - "xpack.profiling.tabs.symbols.step3.replace": "用实际值替代 {es_token} 等。您可以传递 {help} 以获取其他参数列表。", "xpack.profiling.appPageTemplate.pageTitle": "Universal Profiling", "xpack.profiling.asyncComponent.errorLoadingData": "无法加载数据", "xpack.profiling.breadcrumb.differentialFlamegraph": "差异火焰图", @@ -27849,14 +27847,6 @@ "xpack.profiling.stackTracesView.stackTracesCountButton": "堆栈跟踪", "xpack.profiling.stackTracesView.threadsTabLabel": "线程", "xpack.profiling.stackTracesView.tracesTabLabel": "追溯", - "xpack.profiling.tabs.binaryDownloadStep": "下载最新二进制文件:", - "xpack.profiling.tabs.binaryGrantPermissionStep": "授予可执行权限:", - "xpack.profiling.tabs.binaryRunHostAgentStep": "运行 Universal Profiling 主机代理(需要根权限):", - "xpack.profiling.tabs.binaryTitle": "二进制", - "xpack.profiling.tabs.debEditConfigStep": "编辑配置(需要根权限):", - "xpack.profiling.tabs.debInstallPackageStep": "安装 DEB 软件包(需要根权限):", - "xpack.profiling.tabs.debStartSystemdServiceStep": "启动 Universal Profiling systemd 服务(需要根权限):", - "xpack.profiling.tabs.debTitle": "DEB 软件包", "xpack.profiling.tabs.dockerRunContainerStep": "运行 Universal Profiling 容器:", "xpack.profiling.tabs.dockerTitle": "Docker", "xpack.profiling.tabs.kubernetesInstallStep": "通过 Helm 安装主机代理:", @@ -27864,16 +27854,6 @@ "xpack.profiling.tabs.kubernetesTitle": "Kubernetes", "xpack.profiling.tabs.kubernetesValidationStep": "验证主机代理 Pod 是否正在运行:", "xpack.profiling.tabs.postValidationStep": "使用 Helm 安装输出以获取主机代理日志并发现潜在错误", - "xpack.profiling.tabs.rpmEditConfigStep": "编辑配置(需要根权限):", - "xpack.profiling.tabs.rpmInstallPackageStep": "安装 RPM 软件包(需要根权限):", - "xpack.profiling.tabs.rpmStartSystemdServiceStep": "启动 Universal Profiling systemd 服务(需要根权限):", - "xpack.profiling.tabs.rpmTitle": "RPM 软件包", - "xpack.profiling.tabs.symbols.step1": "下载并提取 symbtool", - "xpack.profiling.tabs.symbols.step2": "生成 Elasticsearch 令牌", - "xpack.profiling.tabs.symbols.step2.instructions": "此处提供了说明", - "xpack.profiling.tabs.symbols.step3": "上传符号", - "xpack.profiling.tabs.symbols.step3.doc-ref.link": "对应的文档页面", - "xpack.profiling.tabs.symbols.title": "上传符号", "xpack.profiling.topn.otherBucketLabel": "其他", "xpack.profiling.universalProfiling": "Universal Profiling", "xpack.profiling.zeroSeconds": "0 秒", From 153bec955909c4f8463517b75d64a26f50c27ed0 Mon Sep 17 00:00:00 2001 From: Angela Chuang <6295984+angorayc@users.noreply.github.com> Date: Tue, 24 Oct 2023 11:05:15 +0100 Subject: [PATCH 62/68] [SecuritySolution][DataQualityDashboard] Stats api returns 404 (#169592) ## Summary https://github.com/elastic/kibana/issues/166271 https://github.com/elastic/kibana/pull/169037 This PR is to fix stats api always return 404 on serverless: Screenshot 2023-10-23 at 21 23 01 --------- Co-authored-by: kibanamachine <42973632+kibanamachine@users.noreply.github.com> --- .../server/routes/get_ilm_explain.ts | 9 ++++----- .../server/routes/get_index_mappings.ts | 9 ++++----- .../server/routes/get_index_stats.ts | 9 ++++----- .../server/routes/get_unallowed_field_values.ts | 9 ++++----- .../server/translations.ts | 15 +++++++++++++++ .../ecs_data_quality_dashboard/tsconfig.json | 1 - 6 files changed, 31 insertions(+), 21 deletions(-) create mode 100644 x-pack/plugins/ecs_data_quality_dashboard/server/translations.ts diff --git a/x-pack/plugins/ecs_data_quality_dashboard/server/routes/get_ilm_explain.ts b/x-pack/plugins/ecs_data_quality_dashboard/server/routes/get_ilm_explain.ts index c30271c62e3133..86db6f6c79004e 100644 --- a/x-pack/plugins/ecs_data_quality_dashboard/server/routes/get_ilm_explain.ts +++ b/x-pack/plugins/ecs_data_quality_dashboard/server/routes/get_ilm_explain.ts @@ -6,13 +6,13 @@ */ import { IRouter, Logger } from '@kbn/core/server'; -import { transformError } from '@kbn/securitysolution-es-utils'; import { GET_ILM_EXPLAIN, INTERNAL_API_VERSION } from '../../common/constants'; import { fetchILMExplain } from '../lib'; import { buildResponse } from '../lib/build_response'; import { buildRouteValidation } from '../schemas/common'; import { GetILMExplainParams } from '../schemas/get_ilm_explain'; +import { API_DEFAULT_ERROR_MESSAGE } from '../translations'; export const getILMExplainRoute = (router: IRouter, logger: Logger) => { router.versioned @@ -42,12 +42,11 @@ export const getILMExplainRoute = (router: IRouter, logger: Logger) => { body: ilmExplain.indices, }); } catch (err) { - const error = transformError(err); + logger.error(JSON.stringify(err)); - logger.error(error.message); return resp.error({ - body: error.message, - statusCode: error.statusCode, + body: err.message ?? API_DEFAULT_ERROR_MESSAGE, + statusCode: err.statusCode ?? 500, }); } } diff --git a/x-pack/plugins/ecs_data_quality_dashboard/server/routes/get_index_mappings.ts b/x-pack/plugins/ecs_data_quality_dashboard/server/routes/get_index_mappings.ts index c7ab5e1d4a790c..6f1dfbf4ee8333 100755 --- a/x-pack/plugins/ecs_data_quality_dashboard/server/routes/get_index_mappings.ts +++ b/x-pack/plugins/ecs_data_quality_dashboard/server/routes/get_index_mappings.ts @@ -6,13 +6,13 @@ */ import { IRouter, Logger } from '@kbn/core/server'; -import { transformError } from '@kbn/securitysolution-es-utils'; import { fetchMappings } from '../lib'; import { buildResponse } from '../lib/build_response'; import { GET_INDEX_MAPPINGS, INTERNAL_API_VERSION } from '../../common/constants'; import { GetIndexMappingsParams } from '../schemas/get_index_mappings'; import { buildRouteValidation } from '../schemas/common'; +import { API_DEFAULT_ERROR_MESSAGE } from '../translations'; export const getIndexMappingsRoute = (router: IRouter, logger: Logger) => { router.versioned @@ -38,12 +38,11 @@ export const getIndexMappingsRoute = (router: IRouter, logger: Logger) => { body: mappings, }); } catch (err) { - const error = transformError(err); - logger.error(error.message); + logger.error(JSON.stringify(err)); return resp.error({ - body: error.message, - statusCode: error.statusCode, + body: err.message ?? API_DEFAULT_ERROR_MESSAGE, + statusCode: err.statusCode ?? 500, }); } } diff --git a/x-pack/plugins/ecs_data_quality_dashboard/server/routes/get_index_stats.ts b/x-pack/plugins/ecs_data_quality_dashboard/server/routes/get_index_stats.ts index f98fa03c275230..220c3e68141f07 100644 --- a/x-pack/plugins/ecs_data_quality_dashboard/server/routes/get_index_stats.ts +++ b/x-pack/plugins/ecs_data_quality_dashboard/server/routes/get_index_stats.ts @@ -6,7 +6,6 @@ */ import { i18n } from '@kbn/i18n'; import { IRouter, Logger } from '@kbn/core/server'; -import { transformError } from '@kbn/securitysolution-es-utils'; import { IndicesStatsIndicesStats } from '@elastic/elasticsearch/lib/api/types'; import { fetchStats, fetchAvailableIndices } from '../lib'; @@ -14,6 +13,7 @@ import { buildResponse } from '../lib/build_response'; import { GET_INDEX_STATS, INTERNAL_API_VERSION } from '../../common/constants'; import { buildRouteValidation } from '../schemas/common'; import { GetIndexStatsParams, GetIndexStatsQuery } from '../schemas/get_index_stats'; +import { API_DEFAULT_ERROR_MESSAGE } from '../translations'; export const getIndexStatsRoute = (router: IRouter, logger: Logger) => { router.versioned @@ -87,12 +87,11 @@ export const getIndexStatsRoute = (router: IRouter, logger: Logger) => { }); } } catch (err) { - const error = transformError(err); - logger.error(error.message); + logger.error(JSON.stringify(err)); return resp.error({ - body: error.message, - statusCode: error.statusCode, + body: err.message ?? API_DEFAULT_ERROR_MESSAGE, + statusCode: err.statusCode ?? 500, }); } } diff --git a/x-pack/plugins/ecs_data_quality_dashboard/server/routes/get_unallowed_field_values.ts b/x-pack/plugins/ecs_data_quality_dashboard/server/routes/get_unallowed_field_values.ts index db8887c2dfa66f..8108396e8f39d3 100644 --- a/x-pack/plugins/ecs_data_quality_dashboard/server/routes/get_unallowed_field_values.ts +++ b/x-pack/plugins/ecs_data_quality_dashboard/server/routes/get_unallowed_field_values.ts @@ -6,13 +6,13 @@ */ import { IRouter, Logger } from '@kbn/core/server'; -import { transformError } from '@kbn/securitysolution-es-utils'; import { getUnallowedFieldValues } from '../lib'; import { buildResponse } from '../lib/build_response'; import { GET_UNALLOWED_FIELD_VALUES, INTERNAL_API_VERSION } from '../../common/constants'; import { buildRouteValidation } from '../schemas/common'; import { GetUnallowedFieldValuesBody } from '../schemas/get_unallowed_field_values'; +import { API_DEFAULT_ERROR_MESSAGE } from '../translations'; export const getUnallowedFieldValuesRoute = (router: IRouter, logger: Logger) => { router.versioned @@ -37,12 +37,11 @@ export const getUnallowedFieldValuesRoute = (router: IRouter, logger: Logger) => body: responses, }); } catch (err) { - const error = transformError(err); - logger.error(error.message); + logger.error(JSON.stringify(err)); return resp.error({ - body: error.message, - statusCode: error.statusCode, + body: err.message ?? API_DEFAULT_ERROR_MESSAGE, + statusCode: err.statusCode ?? 500, }); } } diff --git a/x-pack/plugins/ecs_data_quality_dashboard/server/translations.ts b/x-pack/plugins/ecs_data_quality_dashboard/server/translations.ts new file mode 100644 index 00000000000000..4f393d4a87eea7 --- /dev/null +++ b/x-pack/plugins/ecs_data_quality_dashboard/server/translations.ts @@ -0,0 +1,15 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { i18n } from '@kbn/i18n'; + +export const API_DEFAULT_ERROR_MESSAGE = i18n.translate( + 'xpack.ecsDataQualityDashboard.api.defaultErrorMessage', + { + defaultMessage: 'Internal Server Error', + } +); diff --git a/x-pack/plugins/ecs_data_quality_dashboard/tsconfig.json b/x-pack/plugins/ecs_data_quality_dashboard/tsconfig.json index c0603ef91df6b4..f742dc544a79bf 100644 --- a/x-pack/plugins/ecs_data_quality_dashboard/tsconfig.json +++ b/x-pack/plugins/ecs_data_quality_dashboard/tsconfig.json @@ -16,7 +16,6 @@ "@kbn/core-http-server", "@kbn/licensing-plugin", "@kbn/core-http-request-handler-context-server", - "@kbn/securitysolution-es-utils", "@kbn/securitysolution-io-ts-utils", "@kbn/securitysolution-io-ts-types", "@kbn/i18n", From 2b91c31fd0907fae2498c85b908633cf1bf32195 Mon Sep 17 00:00:00 2001 From: Fernando Briano Date: Tue, 24 Oct 2023 11:11:06 +0100 Subject: [PATCH 63/68] Updates the getting started page for Ruby in serverless search (#169497) Updates the "Install a client" code snippet for Ruby Elasticsearch Serverless Client. Since the library is now public and published to RubyGems, we don't need to build from source and can use `gem install` or add it to a project's Gemfile. --- .../public/application/components/languages/ruby.ts | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/x-pack/plugins/serverless_search/public/application/components/languages/ruby.ts b/x-pack/plugins/serverless_search/public/application/components/languages/ruby.ts index c9562f76a31480..f0553b5d7ec765 100644 --- a/x-pack/plugins/serverless_search/public/application/components/languages/ruby.ts +++ b/x-pack/plugins/serverless_search/public/application/components/languages/ruby.ts @@ -51,8 +51,14 @@ client.bulk(body: documents) `, installClient: `# Requires Ruby version 3.0 or higher -# From the project's root directory:$ gem build elasticsearch-serverless.gemspec -$ gem install elasticsearch-serverless-x.x.x.gem`, +# Install from RubyGems: +gem install elasticsearch-serverless --pre + +# Or include the gem in your Gemfile +gem 'elasticsearch-serverless' + +# And require it in your code +require 'elasticsearch-serverless'`, name: i18n.translate('xpack.serverlessSearch.languages.ruby', { defaultMessage: 'Ruby', }), From 7112690e8e88307b75a5420b41d489847d36fce9 Mon Sep 17 00:00:00 2001 From: Vitalii Dmyterko <92328789+vitaliidm@users.noreply.github.com> Date: Tue, 24 Oct 2023 11:13:48 +0100 Subject: [PATCH 64/68] [ES|QL] fixes getIndexPatternFromESQLQuery for comma separated indices (#169562) ## Summary Comma separated source indices work as expected with ES|QL query, but `getIndexPatternFromESQLQuery` does not parses it correctly. This small PR is an attempt to fix this behavior ### Before ```ts const idxPattern7 = getIndexPatternFromESQLQuery('from foo-1, foo-2 | limit 2'); expect(idxPattern7).toBe('foo-1,'); ``` ### After ```ts const idxPattern7 = getIndexPatternFromESQLQuery('from foo-1, foo-2 | limit 2'); expect(idxPattern7).toBe('foo-1, foo-2'); ``` ### Checklist Delete any items that are not applicable to this PR. - [x] [Unit or functional tests](https://www.elastic.co/guide/en/kibana/master/development-tests.html) were updated or added to match the most common scenarios Co-authored-by: Stratoula Kalafateli --- .../src/es_query/es_aggregate_query.test.ts | 12 ++++++++++++ .../kbn-es-query/src/es_query/es_aggregate_query.ts | 4 ++-- 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/packages/kbn-es-query/src/es_query/es_aggregate_query.test.ts b/packages/kbn-es-query/src/es_query/es_aggregate_query.test.ts index 34fc90805ca7de..ca98864aab446f 100644 --- a/packages/kbn-es-query/src/es_query/es_aggregate_query.test.ts +++ b/packages/kbn-es-query/src/es_query/es_aggregate_query.test.ts @@ -101,6 +101,18 @@ describe('sql query helpers', () => { const idxPattern5 = getIndexPatternFromESQLQuery('from foo | limit 2'); expect(idxPattern5).toBe('foo'); + + const idxPattern6 = getIndexPatternFromESQLQuery('from foo-1,foo-2 | limit 2'); + expect(idxPattern6).toBe('foo-1,foo-2'); + + const idxPattern7 = getIndexPatternFromESQLQuery('from foo-1, foo-2 | limit 2'); + expect(idxPattern7).toBe('foo-1, foo-2'); + + const idxPattern8 = getIndexPatternFromESQLQuery('FROM foo-1, foo-2'); + expect(idxPattern8).toBe('foo-1, foo-2'); + + const idxPattern9 = getIndexPatternFromESQLQuery('FROM foo-1, foo-2 [metadata _id]'); + expect(idxPattern9).toBe('foo-1, foo-2'); }); }); }); diff --git a/packages/kbn-es-query/src/es_query/es_aggregate_query.ts b/packages/kbn-es-query/src/es_query/es_aggregate_query.ts index e6f8af0de02c32..27a5e790569c84 100644 --- a/packages/kbn-es-query/src/es_query/es_aggregate_query.ts +++ b/packages/kbn-es-query/src/es_query/es_aggregate_query.ts @@ -59,10 +59,10 @@ export function getIndexPatternFromESQLQuery(esql?: string): string { } const parsedString = esql?.replaceAll('`', ''); // case insensitive match for the index pattern - const regex = new RegExp(/FROM\s+([\w*-.!@$^()~;]+)/, 'i'); + const regex = new RegExp(/FROM\s+([\w*-.!@$^()~;\s]+)/, 'i'); const matches = parsedString?.match(regex); if (matches) { - return matches[1]; + return matches[1]?.trim(); } return ''; } From 3e02648b6311def3996a54c02ebc13e8e096ceca Mon Sep 17 00:00:00 2001 From: Tomasz Ciecierski Date: Tue, 24 Oct 2023 12:30:51 +0200 Subject: [PATCH 65/68] [EDR Workflows] Fix flakiness of alerts_response_actions_form test (#169491) --- .../all/alerts_response_actions_form.cy.ts | 327 ++++++++---------- .../osquery/cypress/tasks/api_fixtures.ts | 8 +- 2 files changed, 154 insertions(+), 181 deletions(-) diff --git a/x-pack/plugins/osquery/cypress/e2e/all/alerts_response_actions_form.cy.ts b/x-pack/plugins/osquery/cypress/e2e/all/alerts_response_actions_form.cy.ts index 6b8f314ba8d589..78e7b8ff93aa51 100644 --- a/x-pack/plugins/osquery/cypress/e2e/all/alerts_response_actions_form.cy.ts +++ b/x-pack/plugins/osquery/cypress/e2e/all/alerts_response_actions_form.cy.ts @@ -19,198 +19,167 @@ import { RESPONSE_ACTIONS_ITEM_1, RESPONSE_ACTIONS_ITEM_2, } from '../../tasks/response_actions'; -import { - checkActionItemsInResults, - clickRuleName, - inputQuery, - typeInECSFieldInput, -} from '../../tasks/live_query'; +import { clickRuleName, inputQuery, typeInECSFieldInput } from '../../tasks/live_query'; import { closeDateTabIfVisible, closeToastIfVisible } from '../../tasks/integrations'; -interface ITestRuleBody { - response_actions: [ - { - params: { - queries: Array<{ - interval?: number; - query: string; - platform: string; - id: string; - }>; - }; - } - ]; -} -// flaky -describe.skip( - 'Alert Event Details - Response Actions Form', - { tags: ['@ess', '@serverless'] }, - () => { - let multiQueryPackId: string; - let multiQueryPackName: string; - let ruleId: string; - let ruleName: string; - let packId: string; - let packName: string; - const packData = packFixture(); - const multiQueryPackData = multiQueryPackFixture(); +describe('Alert Event Details - Response Actions Form', { tags: ['@ess', '@serverless'] }, () => { + let multiQueryPackId: string; + let multiQueryPackName: string; + let ruleId: string; + let ruleName: string; + let packId: string; + let packName: string; + const packData = packFixture(); + const multiQueryPackData = multiQueryPackFixture(); - beforeEach(() => { - loadPack(packData).then((data) => { - packId = data.saved_object_id; - packName = data.name; - }); - loadPack(multiQueryPackData).then((data) => { - multiQueryPackId = data.saved_object_id; - multiQueryPackName = data.name; - }); - loadRule().then((data) => { - ruleId = data.id; - ruleName = data.name; - }); - }); - afterEach(() => { - cleanupPack(packId); - cleanupPack(multiQueryPackId); - cleanupRule(ruleId); + beforeEach(() => { + loadPack(packData).then((data) => { + packId = data.saved_object_id; + packName = data.name; + }); + loadPack(multiQueryPackData).then((data) => { + multiQueryPackId = data.saved_object_id; + multiQueryPackName = data.name; + }); + loadRule().then((data) => { + ruleId = data.id; + ruleName = data.name; }); + }); + afterEach(() => { + cleanupPack(packId); + cleanupPack(multiQueryPackId); + cleanupRule(ruleId); + }); - it('adds response actions with osquery with proper validation and form values', () => { - cy.visit('/app/security/rules'); - clickRuleName(ruleName); - cy.getBySel('editRuleSettingsLink').click(); - cy.getBySel('globalLoadingIndicator').should('not.exist'); - closeDateTabIfVisible(); - cy.getBySel('edit-rule-actions-tab').click(); - cy.contains('Response actions are run on each rule execution.'); - cy.getBySel(OSQUERY_RESPONSE_ACTION_ADD_BUTTON).click(); - cy.getBySel(RESPONSE_ACTIONS_ITEM_0).within(() => { - cy.contains('Query is a required field'); - inputQuery('select * from uptime1'); - }); - cy.getBySel(OSQUERY_RESPONSE_ACTION_ADD_BUTTON).click(); - cy.getBySel(RESPONSE_ACTIONS_ITEM_1).within(() => { - cy.contains('Run a set of queries in a pack').click(); - }); - cy.getBySel('response-actions-error') - .within(() => { - cy.contains('Pack is a required field'); - }) - .should('exist'); - cy.getBySel(RESPONSE_ACTIONS_ITEM_1).within(() => { + it('adds response actions with osquery with proper validation and form values', () => { + cy.visit('/app/security/rules'); + clickRuleName(ruleName); + cy.getBySel('editRuleSettingsLink').click(); + cy.getBySel('globalLoadingIndicator').should('not.exist'); + closeDateTabIfVisible(); + cy.getBySel('edit-rule-actions-tab').click(); + cy.contains('Response actions are run on each rule execution.'); + cy.getBySel(OSQUERY_RESPONSE_ACTION_ADD_BUTTON).click(); + cy.getBySel(RESPONSE_ACTIONS_ITEM_0).within(() => { + cy.contains('Query is a required field'); + inputQuery('select * from uptime1'); + }); + cy.getBySel(OSQUERY_RESPONSE_ACTION_ADD_BUTTON).click(); + cy.getBySel(RESPONSE_ACTIONS_ITEM_1).within(() => { + cy.contains('Run a set of queries in a pack').click(); + }); + cy.getBySel('response-actions-error') + .within(() => { cy.contains('Pack is a required field'); - cy.getBySel('comboBoxInput').type(`${packName}{downArrow}{enter}`); - }); + }) + .should('exist'); + cy.getBySel(RESPONSE_ACTIONS_ITEM_1).within(() => { + cy.contains('Pack is a required field'); + cy.getBySel('comboBoxInput').type(`${packName}{downArrow}{enter}`); + }); - cy.getBySel(OSQUERY_RESPONSE_ACTION_ADD_BUTTON).click(); + cy.getBySel(OSQUERY_RESPONSE_ACTION_ADD_BUTTON).click(); - cy.getBySel(RESPONSE_ACTIONS_ITEM_2).within(() => { - cy.contains('Query is a required field'); - inputQuery('select * from uptime'); - cy.contains('Advanced').click(); - typeInECSFieldInput('message{downArrow}{enter}'); - cy.getBySel('osqueryColumnValueSelect').type('days{downArrow}{enter}'); - cy.wait(1000); // wait for the validation to trigger - cypress is way faster than users ;) - }); + cy.getBySel(RESPONSE_ACTIONS_ITEM_2).within(() => { + cy.contains('Query is a required field'); + inputQuery('select * from uptime'); + cy.contains('Query is a required field').should('not.exist'); + cy.contains('Advanced').click(); + typeInECSFieldInput('{downArrow}{enter}'); + cy.getBySel('osqueryColumnValueSelect').type('days{downArrow}{enter}'); + cy.wait(1000); // wait for the validation to trigger - cypress is way faster than users ;) + }); - cy.getBySel('ruleEditSubmitButton').click(); - cy.contains(`${ruleName} was saved`).should('exist'); - closeToastIfVisible(); + cy.getBySel('ruleEditSubmitButton').click(); + cy.contains(`${ruleName} was saved`).should('exist'); + closeToastIfVisible(); - cy.getBySel('editRuleSettingsLink').click(); - cy.getBySel('globalLoadingIndicator').should('not.exist'); - cy.getBySel('edit-rule-actions-tab').click(); - cy.getBySel(RESPONSE_ACTIONS_ITEM_0).within(() => { - cy.contains('select * from uptime1'); - }); - cy.getBySel(RESPONSE_ACTIONS_ITEM_2).within(() => { - cy.contains('select * from uptime'); - cy.contains('Log message optimized for viewing in a log viewer'); - cy.contains('Days of uptime'); - }); - cy.getBySel(RESPONSE_ACTIONS_ITEM_1).within(() => { - cy.contains(packName); - cy.getBySel('comboBoxInput').type('{backspace}{enter}'); - }); - cy.getBySel(RESPONSE_ACTIONS_ITEM_0).within(() => { - cy.contains('select * from uptime1'); - cy.getBySel('remove-response-action').click(); - }); - cy.getBySel(RESPONSE_ACTIONS_ITEM_0).within(() => { - cy.contains('Search for a pack to run'); - cy.contains('Pack is a required field'); - cy.getBySel('comboBoxInput').type(`${packName}{downArrow}{enter}`); - }); - cy.getBySel(RESPONSE_ACTIONS_ITEM_1).within(() => { - cy.contains('select * from uptime'); - cy.contains('Log message optimized for viewing in a log viewer'); - cy.contains('Days of uptime'); - }); - cy.intercept('PUT', '/api/detection_engine/rules').as('saveRuleChangesOne'); - cy.getBySel('ruleEditSubmitButton').click(); + cy.getBySel('editRuleSettingsLink').click(); + cy.getBySel('globalLoadingIndicator').should('not.exist'); + cy.getBySel('edit-rule-actions-tab').click(); + cy.getBySel(RESPONSE_ACTIONS_ITEM_0).within(() => { + cy.contains('select * from uptime1'); + }); + cy.getBySel(RESPONSE_ACTIONS_ITEM_2).within(() => { + cy.contains('select * from uptime'); + cy.contains('Custom key/value pairs. e.g. {"application":"foo-bar","env":"production"}'); + cy.contains('Days of uptime'); + }); + cy.getBySel(RESPONSE_ACTIONS_ITEM_1).within(() => { + cy.contains(packName); + cy.getBySel('comboBoxInput').type('{backspace}{enter}'); + }); + cy.getBySel(RESPONSE_ACTIONS_ITEM_0).within(() => { + cy.contains('select * from uptime1'); + cy.getBySel('remove-response-action').click(); + }); + cy.getBySel(RESPONSE_ACTIONS_ITEM_0).within(() => { + cy.contains('Search for a pack to run'); + cy.contains('Pack is a required field'); + cy.getBySel('comboBoxInput').type(`${packName}{downArrow}{enter}`); + }); + cy.getBySel(RESPONSE_ACTIONS_ITEM_1).within(() => { + cy.contains('select * from uptime'); + cy.contains('Custom key/value pairs. e.g. {"application":"foo-bar","env":"production"}'); + cy.contains('Days of uptime'); + }); - cy.wait('@saveRuleChangesOne'); - cy.get<{ request: { url: string; body: ITestRuleBody } }>('@saveRuleChangesOne').should( - ({ request }) => { - const oneQuery = [ - { - interval: 3600, - query: 'select * from uptime;', - id: Object.keys(packData.queries)[0], - }, - ]; - expect(request.body.response_actions[0].params.queries).to.deep.equal(oneQuery); - } - ); + cy.intercept('PUT', '/api/detection_engine/rules').as('saveRuleSingleQuery'); + cy.getBySel('ruleEditSubmitButton').click(); + cy.wait('@saveRuleSingleQuery').should(({ request }) => { + const oneQuery = [ + { + interval: 3600, + query: 'select * from uptime;', + id: Object.keys(packData.queries)[0], + }, + ]; + expect(request.body.response_actions[0].params.queries).to.deep.equal(oneQuery); + }); - cy.contains(`${ruleName} was saved`).should('exist'); - closeToastIfVisible(); + cy.contains(`${ruleName} was saved`).should('exist'); + closeToastIfVisible(); - cy.getBySel('editRuleSettingsLink').click(); - cy.getBySel('globalLoadingIndicator').should('not.exist'); - cy.getBySel('edit-rule-actions-tab').click(); - cy.getBySel(RESPONSE_ACTIONS_ITEM_0).within(() => { + cy.getBySel('editRuleSettingsLink').click(); + cy.getBySel('globalLoadingIndicator').should('not.exist'); + cy.getBySel('edit-rule-actions-tab').click(); + cy.getBySel(RESPONSE_ACTIONS_ITEM_0) + .within(() => { cy.contains(packName); cy.getBySel('comboBoxInput').type(`${multiQueryPackName}{downArrow}{enter}`); - checkActionItemsInResults({ - cases: false, - lens: false, - discover: false, - timeline: false, - }); - }); - cy.getBySel(RESPONSE_ACTIONS_ITEM_1).within(() => { - cy.contains('select * from uptime'); - cy.contains('Log message optimized for viewing in a log viewer'); - cy.contains('Days of uptime'); - }); - cy.intercept('PUT', '/api/detection_engine/rules').as('saveRuleChangesTwo'); + cy.contains('SELECT * FROM memory_info;'); + cy.contains('SELECT * FROM system_info;'); + }) + .clickOutside(); - cy.contains('Save changes').click(); - cy.wait('@saveRuleChangesTwo'); - cy.get<{ request: { url: string; body: ITestRuleBody } }>('@saveRuleChangesTwo').should( - ({ request }) => { - const threeQueries = [ - { - interval: 3600, - query: 'SELECT * FROM memory_info;', - platform: 'linux', - id: Object.keys(multiQueryPackData.queries)[0], - }, - { - interval: 3600, - query: 'SELECT * FROM system_info;', - id: Object.keys(multiQueryPackData.queries)[1], - }, - { - interval: 10, - query: 'select opera_extensions.* from users join opera_extensions using (uid);', - id: Object.keys(multiQueryPackData.queries)[2], - }, - ]; - expect(request.body.response_actions[0].params.queries).to.deep.equal(threeQueries); - } - ); - }); - } -); + cy.getBySel(RESPONSE_ACTIONS_ITEM_1).within(() => { + cy.contains('select * from uptime'); + cy.contains('Custom key/value pairs. e.g. {"application":"foo-bar","env":"production"}'); + cy.contains('Days of uptime'); + }); + cy.intercept('PUT', '/api/detection_engine/rules').as('saveRuleMultiQuery'); + cy.contains('Save changes').click(); + cy.wait('@saveRuleMultiQuery').should(({ request }) => { + const threeQueries = [ + { + interval: 3600, + query: 'SELECT * FROM memory_info;', + platform: 'linux', + id: Object.keys(multiQueryPackData.queries)[0], + }, + { + interval: 3600, + query: 'SELECT * FROM system_info;', + id: Object.keys(multiQueryPackData.queries)[1], + }, + { + interval: 10, + query: 'select opera_extensions.* from users join opera_extensions using (uid);', + id: Object.keys(multiQueryPackData.queries)[2], + }, + ]; + expect(request.body.response_actions[0].params.queries).to.deep.equal(threeQueries); + }); + }); +}); diff --git a/x-pack/plugins/osquery/cypress/tasks/api_fixtures.ts b/x-pack/plugins/osquery/cypress/tasks/api_fixtures.ts index d7b9f7d43ce434..fb4dc1f646e838 100644 --- a/x-pack/plugins/osquery/cypress/tasks/api_fixtures.ts +++ b/x-pack/plugins/osquery/cypress/tasks/api_fixtures.ts @@ -18,6 +18,7 @@ import type { PackSavedObject, PackItem } from '../../public/packs/types'; import type { SavedQuerySO } from '../../public/routes/saved_queries/list'; import { generateRandomStringName } from './integrations'; import { request } from './common'; +import { ServerlessRoleName } from '../support/roles'; export const savedQueryFixture = { id: generateRandomStringName(1)[0], @@ -136,8 +137,10 @@ export const loadLiveQuery = ( }, }).then((response) => response.body.data); -export const loadRule = (includeResponseActions = false) => - request({ +export const loadRule = (includeResponseActions = false) => { + cy.login(ServerlessRoleName.SOC_MANAGER); + + return request({ method: 'POST', body: { type: 'query', @@ -227,6 +230,7 @@ export const loadRule = (includeResponseActions = false) => 'Elastic-Api-Version': API_VERSIONS.public.v1, }, }).then((response) => response.body); +}; export const cleanupRule = (id: string) => { request({ From fac9a99d3d26c883a75d79d0fe2b3196368dc75f Mon Sep 17 00:00:00 2001 From: Ramon Butter Date: Tue, 24 Oct 2023 12:43:48 +0200 Subject: [PATCH 66/68] add timeout value for baking period (#169617) We run into a timeout problem where the agent was called in our current definition of the baking period. This adds the cap explicitly above the 24h --- .../quality-gates/pipeline.tests-production.yaml | 7 +++++-- .../pipelines/quality-gates/pipeline.tests-qa.yaml | 10 +++++----- .../quality-gates/pipeline.tests-staging.yaml | 4 ++-- 3 files changed, 12 insertions(+), 9 deletions(-) diff --git a/.buildkite/pipelines/quality-gates/pipeline.tests-production.yaml b/.buildkite/pipelines/quality-gates/pipeline.tests-production.yaml index fd2fbac8a7b30e..3e8a2358a9d3c7 100644 --- a/.buildkite/pipelines/quality-gates/pipeline.tests-production.yaml +++ b/.buildkite/pipelines/quality-gates/pipeline.tests-production.yaml @@ -3,7 +3,7 @@ # A failure in this pipeline build will prevent further progression to the subsequent stage. steps: - - label: ":pipeline::kibana::seedling: Trigger SLO check" + - label: ":kibana: SLO check" trigger: "serverless-quality-gates" # https://buildkite.com/elastic/serverless-quality-gates build: message: "${BUILDKITE_MESSAGE} (triggered by pipeline.tests-production.yaml)" @@ -13,7 +13,7 @@ steps: CHECK_SLO_TAG: kibana soft_fail: true - - label: ":pipeline::rocket::seedling: Trigger control-plane e2e tests" + - label: ":rocket: control-plane e2e tests" if: build.env("ENVIRONMENT") == "production-canary" trigger: "ess-k8s-production-e2e-tests" # https://buildkite.com/elastic/ess-k8s-production-e2e-tests build: @@ -25,3 +25,6 @@ steps: - label: ":cookie: 24h bake time before continuing promotion" if: build.env("ENVIRONMENT") == "production-canary" command: "sleep 86400" + agents: + # How long can this agent live for in minutes - 25 hours + instanceMaxAge: 1500 diff --git a/.buildkite/pipelines/quality-gates/pipeline.tests-qa.yaml b/.buildkite/pipelines/quality-gates/pipeline.tests-qa.yaml index 29c7ad4ee8491a..f0e7dd6e3b0e7b 100644 --- a/.buildkite/pipelines/quality-gates/pipeline.tests-qa.yaml +++ b/.buildkite/pipelines/quality-gates/pipeline.tests-qa.yaml @@ -3,7 +3,7 @@ # A failure in this pipeline build will prevent further progression to the subsequent stage. steps: - - label: ":pipeline::kibana::seedling: Trigger Kibana Serverless Tests for ${ENVIRONMENT}" + - label: ":kibana: Kibana Serverless Tests for ${ENVIRONMENT}" trigger: appex-qa-serverless-kibana-ftr-tests # https://buildkite.com/elastic/appex-qa-serverless-kibana-ftr-tests soft_fail: true # Remove this before release or when tests stabilize build: @@ -12,8 +12,8 @@ steps: EC_ENV: qa EC_REGION: aws-eu-west-1 message: "${BUILDKITE_MESSAGE} (triggered by pipeline.tests-qa.yaml)" - - # TODO: Uncomment this code when the integration is ready. + + # TODO: Uncomment this code when the integration is ready. # - label: ":pipeline::female-detective::seedling: Trigger Security Solution quality gate script" # trigger: security-serverless-quality-gate # https://buildkite.com/elastic/security-serverless-quality-gate # soft_fail: true # Remove this when tests are fixed @@ -22,7 +22,7 @@ steps: # ENVIRONMENT: ${ENVIRONMENT} # message: "${BUILDKITE_MESSAGE} (triggered by pipeline.tests-qa.yaml)" - - label: ":pipeline::ship::seedling: Trigger Fleet serverless smoke tests for ${ENVIRONMENT}" + - label: ":ship: Fleet serverless smoke tests for ${ENVIRONMENT}" trigger: fleet-smoke-tests # https://buildkite.com/elastic/fleet-smoke-tests soft_fail: true # Remove this before release build: @@ -30,7 +30,7 @@ steps: ENVIRONMENT: ${ENVIRONMENT} message: "${BUILDKITE_MESSAGE} (triggered by pipeline.tests-qa.yaml)" - - label: ":pipeline::rocket::seedling: Trigger control-plane e2e tests" + - label: ":rocket: control-plane e2e tests" trigger: "ess-k8s-qa-e2e-tests-daily" # https://buildkite.com/elastic/ess-k8s-qa-e2e-tests-daily build: env: diff --git a/.buildkite/pipelines/quality-gates/pipeline.tests-staging.yaml b/.buildkite/pipelines/quality-gates/pipeline.tests-staging.yaml index d5cce621002b39..907c0de29e63e9 100644 --- a/.buildkite/pipelines/quality-gates/pipeline.tests-staging.yaml +++ b/.buildkite/pipelines/quality-gates/pipeline.tests-staging.yaml @@ -3,7 +3,7 @@ # A failure in this pipeline build will prevent further progression to the subsequent stage. steps: - - label: ":pipeline::rocket::seedling: Trigger control-plane e2e tests" + - label: ":rocket: control-plane e2e tests" trigger: "ess-k8s-staging-e2e-tests" # https://buildkite.com/elastic/ess-k8s-staging-e2e-tests build: env: @@ -11,7 +11,7 @@ steps: NAME_PREFIX: ci_test_kibana-promotion_ message: "${BUILDKITE_MESSAGE} (triggered by pipeline.tests-staging.yaml)" - - label: ":pipeline::kibana::seedling: Trigger Kibana Serverless Tests for ${ENVIRONMENT}" + - label: ":kibana: Kibana Serverless Tests for ${ENVIRONMENT}" trigger: appex-qa-serverless-kibana-ftr-tests # https://buildkite.com/elastic/appex-qa-serverless-kibana-ftr-tests soft_fail: true # Remove this before release or when tests stabilize build: From 141616e2d8a6323fe4bff7e9f05e83730db01879 Mon Sep 17 00:00:00 2001 From: Abdon Pijpelink Date: Tue, 24 Oct 2023 12:47:42 +0200 Subject: [PATCH 67/68] ES|QL in-product help fixes (#169618) Changes the ES|QL in-product help: - opens links to the documentation in a new tab - swaps the arguments for the DATE_* functions Closes https://github.com/elastic/kibana/issues/169428 --- .../src/esql_documentation_sections.tsx | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/packages/kbn-text-based-editor/src/esql_documentation_sections.tsx b/packages/kbn-text-based-editor/src/esql_documentation_sections.tsx index 6dde72c1c22d51..6f244647922eff 100644 --- a/packages/kbn-text-based-editor/src/esql_documentation_sections.tsx +++ b/packages/kbn-text-based-editor/src/esql_documentation_sections.tsx @@ -53,6 +53,7 @@ export const sourceCommands = { ), description: ( Date: Tue, 24 Oct 2023 12:48:55 +0200 Subject: [PATCH 68/68] [Security Solution] Unskipping `x-pack/test/security_solution_cypress/cypress/e2e/explore/pagination/` working tests on serverless (#169474) --- .../pipelines/es_serverless/verify_es_serverless_image.yml | 2 +- .buildkite/pipelines/on_merge.yml | 2 +- .buildkite/pipelines/pull_request/base.yml | 2 +- .../cypress/e2e/explore/pagination/pagination.cy.ts | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/.buildkite/pipelines/es_serverless/verify_es_serverless_image.yml b/.buildkite/pipelines/es_serverless/verify_es_serverless_image.yml index c8899ed03731e5..fb4475a67c0326 100644 --- a/.buildkite/pipelines/es_serverless/verify_es_serverless_image.yml +++ b/.buildkite/pipelines/es_serverless/verify_es_serverless_image.yml @@ -76,7 +76,7 @@ steps: queue: n2-4-spot depends_on: build timeout_in_minutes: 60 - parallelism: 2 + parallelism: 4 retry: automatic: - exit_status: '*' diff --git a/.buildkite/pipelines/on_merge.yml b/.buildkite/pipelines/on_merge.yml index b03dc1cd9d913e..446fe96a806a43 100644 --- a/.buildkite/pipelines/on_merge.yml +++ b/.buildkite/pipelines/on_merge.yml @@ -97,7 +97,7 @@ steps: queue: n2-4-spot depends_on: build timeout_in_minutes: 60 - parallelism: 2 + parallelism: 4 retry: automatic: - exit_status: '*' diff --git a/.buildkite/pipelines/pull_request/base.yml b/.buildkite/pipelines/pull_request/base.yml index 21da1c794cd897..e7d4f75bca86fe 100644 --- a/.buildkite/pipelines/pull_request/base.yml +++ b/.buildkite/pipelines/pull_request/base.yml @@ -75,7 +75,7 @@ steps: queue: n2-4-spot depends_on: build timeout_in_minutes: 60 - parallelism: 2 + parallelism: 4 retry: automatic: - exit_status: '*' diff --git a/x-pack/test/security_solution_cypress/cypress/e2e/explore/pagination/pagination.cy.ts b/x-pack/test/security_solution_cypress/cypress/e2e/explore/pagination/pagination.cy.ts index a822412cca305b..addbf8389435c5 100644 --- a/x-pack/test/security_solution_cypress/cypress/e2e/explore/pagination/pagination.cy.ts +++ b/x-pack/test/security_solution_cypress/cypress/e2e/explore/pagination/pagination.cy.ts @@ -22,7 +22,7 @@ import { ALL_USERS_TABLE } from '../../../screens/users/all_users'; import { goToTablePage, sortFirstTableColumn } from '../../../tasks/table_pagination'; // FLAKY: https://github.com/elastic/kibana/issues/165968 -describe('Pagination', { tags: ['@ess', '@serverless', '@brokenInServerless'] }, () => { +describe('Pagination', { tags: ['@ess', '@serverless'] }, () => { describe('Host uncommon processes table)', () => { before(() => { cy.task('esArchiverLoad', { archiveName: 'host_uncommon_processes' });