From 1b0c095ad3d6bf814a928898346cfd6483777794 Mon Sep 17 00:00:00 2001 From: Stratoula Kalafateli Date: Wed, 6 Sep 2023 10:44:30 +0300 Subject: [PATCH 01/97] ES|QL wrap with pipes (#165598) ## Summary Atm the wrap button is not very useful on the extended mode of the ES|QL editor. We would like to give the user the ability to wrap/unwrap based on the pipes. ![esql](https://github.com/elastic/kibana/assets/17003240/6db92dea-69b1-4344-b67e-a44759e8b2e6) ### 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 --- .../kbn-text-based-editor/src/helpers.test.ts | 25 ++++++++++++++++- packages/kbn-text-based-editor/src/helpers.ts | 8 ++++++ .../src/text_based_languages_editor.tsx | 27 +++++++++++++++---- 3 files changed, 54 insertions(+), 6 deletions(-) diff --git a/packages/kbn-text-based-editor/src/helpers.test.ts b/packages/kbn-text-based-editor/src/helpers.test.ts index 74c2387fde2fa..5f1546ccc138e 100644 --- a/packages/kbn-text-based-editor/src/helpers.test.ts +++ b/packages/kbn-text-based-editor/src/helpers.test.ts @@ -6,7 +6,7 @@ * Side Public License, v 1. */ -import { parseErrors, parseWarning, getInlineEditorText } from './helpers'; +import { parseErrors, parseWarning, getInlineEditorText, getWrappedInPipesCode } from './helpers'; describe('helpers', function () { describe('parseErrors', function () { @@ -136,4 +136,27 @@ describe('helpers', function () { ); }); }); + + describe('getWrappedInPipesCode', function () { + it('should return the code wrapped', function () { + const code = getWrappedInPipesCode('FROM index1 | keep field1, field2 | order field1', false); + expect(code).toEqual('FROM index1\n| keep field1, field2\n| order field1'); + }); + + it('should return the code unwrapped', function () { + const code = getWrappedInPipesCode( + 'FROM index1 \n| keep field1, field2 \n| order field1', + true + ); + expect(code).toEqual('FROM index1 | keep field1, field2 | order field1'); + }); + + it('should return the code unwrapped and trimmed', function () { + const code = getWrappedInPipesCode( + 'FROM index1 \n| keep field1, field2 \n| order field1', + true + ); + expect(code).toEqual('FROM index1 | keep field1, field2 | order field1'); + }); + }); }); diff --git a/packages/kbn-text-based-editor/src/helpers.ts b/packages/kbn-text-based-editor/src/helpers.ts index ca5e3d2fca663..fd7c9c2f9406d 100644 --- a/packages/kbn-text-based-editor/src/helpers.ts +++ b/packages/kbn-text-based-editor/src/helpers.ts @@ -158,3 +158,11 @@ export const getDocumentationSections = async (language: string) => { export const getInlineEditorText = (queryString: string, isMultiLine: boolean) => { return isMultiLine ? queryString.replace(/\r?\n|\r/g, ' ').replace(/ +/g, ' ') : queryString; }; + +export const getWrappedInPipesCode = (code: string, isWrapped: boolean): string => { + const pipes = code?.split('|'); + const codeNoLines = pipes?.map((pipe) => { + return pipe.replaceAll('\n', '').trim(); + }); + return codeNoLines.join(isWrapped ? ' | ' : '\n| '); +}; diff --git a/packages/kbn-text-based-editor/src/text_based_languages_editor.tsx b/packages/kbn-text-based-editor/src/text_based_languages_editor.tsx index 3aada71f81ab0..d8b8530f7cd37 100644 --- a/packages/kbn-text-based-editor/src/text_based_languages_editor.tsx +++ b/packages/kbn-text-based-editor/src/text_based_languages_editor.tsx @@ -55,6 +55,7 @@ import { getInlineEditorText, getDocumentationSections, MonacoError, + getWrappedInPipesCode, } from './helpers'; import { EditorFooter } from './editor_footer'; import { ResizableButton } from './resizable_button'; @@ -138,7 +139,7 @@ export const TextBasedLanguagesEditor = memo(function TextBasedLanguagesEditor({ const [showLineNumbers, setShowLineNumbers] = useState(isCodeEditorExpanded); const [isCompactFocused, setIsCompactFocused] = useState(isCodeEditorExpanded); const [isCodeEditorExpandedFocused, setIsCodeEditorExpandedFocused] = useState(false); - const [isWordWrapped, setIsWordWrapped] = useState(true); + const [isWordWrapped, setIsWordWrapped] = useState(false); const [editorErrors, setEditorErrors] = useState([]); const [editorWarning, setEditorWarning] = useState([]); @@ -359,6 +360,16 @@ export const TextBasedLanguagesEditor = memo(function TextBasedLanguagesEditor({ } }, [calculateVisibleCode, code, isCompactFocused, queryString]); + useEffect(() => { + if (isCodeEditorExpanded && !isWordWrapped) { + const pipes = code?.split('|'); + const pipesWithNewLine = code?.split('\n|'); + if (pipes?.length === pipesWithNewLine?.length) { + setIsWordWrapped(true); + } + } + }, [code, isCodeEditorExpanded, isWordWrapped]); + const onResize = ({ width }: { width: number }) => { calculateVisibleCode(width); if (editor1.current) { @@ -369,6 +380,7 @@ export const TextBasedLanguagesEditor = memo(function TextBasedLanguagesEditor({ const onQueryUpdate = useCallback( (value: string) => { setCode(value); + setIsWordWrapped(false); onTextLangQueryChange({ [language]: value } as AggregateQuery); }, [language, onTextLangQueryChange] @@ -509,13 +521,13 @@ export const TextBasedLanguagesEditor = memo(function TextBasedLanguagesEditor({ ? i18n.translate( 'textBasedEditor.query.textBasedLanguagesEditor.disableWordWrapLabel', { - defaultMessage: 'Disable word wrap', + defaultMessage: 'Disable wrap with pipes', } ) : i18n.translate( 'textBasedEditor.query.textBasedLanguagesEditor.EnableWordWrapLabel', { - defaultMessage: 'Enable word wrap', + defaultMessage: 'Wrap with pipes', } ) } @@ -529,13 +541,13 @@ export const TextBasedLanguagesEditor = memo(function TextBasedLanguagesEditor({ ? i18n.translate( 'textBasedEditor.query.textBasedLanguagesEditor.disableWordWrapLabel', { - defaultMessage: 'Disable word wrap', + defaultMessage: 'Disable wrap with pipes', } ) : i18n.translate( 'textBasedEditor.query.textBasedLanguagesEditor.EnableWordWrapLabel', { - defaultMessage: 'Enable word wrap', + defaultMessage: 'Wrap with pipes', } ) } @@ -545,6 +557,11 @@ export const TextBasedLanguagesEditor = memo(function TextBasedLanguagesEditor({ wordWrap: isWordWrapped ? 'off' : 'on', }); setIsWordWrapped(!isWordWrapped); + const updatedCode = getWrappedInPipesCode(code, isWordWrapped); + if (code !== updatedCode) { + setCode(updatedCode); + onTextLangQueryChange({ [language]: updatedCode } as AggregateQuery); + } }} /> From 55936a83a1ea953c25e16595342461b41986cb71 Mon Sep 17 00:00:00 2001 From: Marco Antonio Ghiani Date: Wed, 6 Sep 2023 10:46:13 +0200 Subject: [PATCH 02/97] [Log Explorer] Fix broken data grid on columns update (#165679) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## 📓 Summary Closes #165558 The issue was caused by a particular condition caused by the overridden `data` service that the plugin injects in the Discover App. Reverse engineering from the blank screen when updating the columns: 1. The `DiscoverHistogramLayout` is rendered conditionally only [when a `searchSessionId` exists](https://github.com/elastic/kibana/blob/main/src/plugins/discover/public/application/main/components/layout/discover_histogram_layout.tsx#L47). 2. The `searchSessionId` is initialized with a default value and exists until [the `data.search.session.clear()` function is invoked](https://github.com/elastic/kibana/blob/main/src/plugins/discover/public/application/main/discover_main_app.tsx#L82). 3. Being this effect cleanup callback is invoked when `data.search.session` changes in its reference, the issue is caused by the [injected service](https://github.com/elastic/kibana/blob/main/x-pack/plugins/log_explorer/public/components/log_explorer/log_explorer.tsx#L52-L62). 4. The root cause is that each time a property is read from the proxied `data` service, new nested Proxies are created, triggering the useEffect cleanup function since the new Proxy has a new reference. The implemented solution adds an enhanced version of `createPropertyGetProxy` that keeps the created proxy as a singleton, storing the original value in a cache by a passed key. --------- Co-authored-by: Marco Antonio Ghiani --- .../components/log_explorer/log_explorer.tsx | 20 +++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/x-pack/plugins/log_explorer/public/components/log_explorer/log_explorer.tsx b/x-pack/plugins/log_explorer/public/components/log_explorer/log_explorer.tsx index 10bd9039751f1..fa76cadeb727b 100644 --- a/x-pack/plugins/log_explorer/public/components/log_explorer/log_explorer.tsx +++ b/x-pack/plugins/log_explorer/public/components/log_explorer/log_explorer.tsx @@ -6,7 +6,7 @@ */ import { ScopedHistory } from '@kbn/core-application-browser'; -import { DataPublicPluginStart, ISearchStart, ISessionService } from '@kbn/data-plugin/public'; +import { DataPublicPluginStart } from '@kbn/data-plugin/public'; import { DiscoverStart } from '@kbn/discover-plugin/public'; import React from 'react'; import { @@ -50,13 +50,17 @@ export const createLogExplorer = ({ * are no-ops. */ const createDataServiceProxy = (data: DataPublicPluginStart) => { + const noOpEnableStorage = () => {}; + + const sessionServiceProxy = createPropertyGetProxy(data.search.session, { + enableStorage: () => noOpEnableStorage, + }); + + const searchServiceProxy = createPropertyGetProxy(data.search, { + session: () => sessionServiceProxy, + }); + return createPropertyGetProxy(data, { - search: (searchService: ISearchStart) => - createPropertyGetProxy(searchService, { - session: (sessionService: ISessionService) => - createPropertyGetProxy(sessionService, { - enableStorage: () => () => {}, - }), - }), + search: () => searchServiceProxy, }); }; From 1c7ac5d5de0f7f14c0e23bc87bd89119b5a126df Mon Sep 17 00:00:00 2001 From: Marco Antonio Ghiani Date: Wed, 6 Sep 2023 12:30:29 +0200 Subject: [PATCH 03/97] [Log Explorer] Add Discover fallback link (#165464) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## 📓 Summary Closes #165220 This PR introduces a new fallback link from the Log Explorer application to Discover. To correctly retrieve the details required to correctly navigate to Discover with the used data view and filters, the LogExplorer component accepts now a new `state$` behaviour subject as a property that can be used to notify the consumers of any change from the internal state. https://github.com/elastic/kibana/assets/34506779/c8176ef2-7a3b-4c7e-860a-450ba677412a ## 🧪 Test suite ``` ↳ Observability Log Explorer ↳ Header menu ↳ should inject the app header menu on the top navbar ↳ Discover fallback link ↳ should render a button link ↳ should navigate to discover keeping the current columns/filters/query/time/data view ``` --------- Co-authored-by: Marco Antonio Ghiani Co-authored-by: kibanamachine <42973632+kibanamachine@users.noreply.github.com> --- src/plugins/discover/public/index.ts | 1 + .../plugins/log_explorer/common/constants.ts | 1 + .../common/datasets/models/dataset.ts | 2 + .../components/log_explorer/log_explorer.tsx | 21 +++- .../customizations/log_explorer_profile.tsx | 44 +++++++- x-pack/plugins/log_explorer/public/index.ts | 1 + .../common/constants.ts | 8 ++ .../common/translations.ts | 7 ++ .../observability_log_explorer/kibana.jsonc | 3 +- .../observability_log_explorer.tsx | 68 +++++++----- .../components/log_explorer_top_nav_menu.tsx | 105 ++++++++++++++++++ .../public/plugin.ts | 3 +- .../public/routes/main/main_route.tsx | 25 +++-- .../public/types.ts | 2 + .../public/utils/breadcrumbs.tsx | 10 +- .../observability_log_explorer/tsconfig.json | 2 + .../observability_log_explorer/header_menu.ts | 76 +++++++++++++ .../apps/observability_log_explorer/index.ts | 1 + .../observability_log_explorer.ts | 29 +++++ .../observability_log_explorer/header_menu.ts | 76 +++++++++++++ .../observability_log_explorer/index.ts | 1 + 21 files changed, 432 insertions(+), 54 deletions(-) create mode 100644 x-pack/plugins/observability_log_explorer/common/constants.ts create mode 100644 x-pack/plugins/observability_log_explorer/public/components/log_explorer_top_nav_menu.tsx create mode 100644 x-pack/test/functional/apps/observability_log_explorer/header_menu.ts create mode 100644 x-pack/test_serverless/functional/test_suites/observability/observability_log_explorer/header_menu.ts diff --git a/src/plugins/discover/public/index.ts b/src/plugins/discover/public/index.ts index 5af7c2bf1142a..ca3c58a4d2899 100644 --- a/src/plugins/discover/public/index.ts +++ b/src/plugins/discover/public/index.ts @@ -15,6 +15,7 @@ export function plugin(initializerContext: PluginInitializerContext) { } export type { ISearchEmbeddable, SearchInput } from './embeddable'; +export type { DiscoverAppState } from './application/main/services/discover_app_state_container'; export type { DiscoverStateContainer } from './application/main/services/discover_state'; export type { DiscoverContainerProps } from './components/discover_container'; export type { diff --git a/x-pack/plugins/log_explorer/common/constants.ts b/x-pack/plugins/log_explorer/common/constants.ts index 37f56942f332a..fc1c572ebae26 100644 --- a/x-pack/plugins/log_explorer/common/constants.ts +++ b/x-pack/plugins/log_explorer/common/constants.ts @@ -8,4 +8,5 @@ export const LOG_EXPLORER_PROFILE_ID = 'log-explorer'; // Fields constants +export const TIMESTAMP_FIELD = '@timestamp'; export const MESSAGE_FIELD = 'message'; diff --git a/x-pack/plugins/log_explorer/common/datasets/models/dataset.ts b/x-pack/plugins/log_explorer/common/datasets/models/dataset.ts index 68119fb6015b1..974a9fd4ca37f 100644 --- a/x-pack/plugins/log_explorer/common/datasets/models/dataset.ts +++ b/x-pack/plugins/log_explorer/common/datasets/models/dataset.ts @@ -8,6 +8,7 @@ import { IconType } from '@elastic/eui'; import { DataViewSpec } from '@kbn/data-views-plugin/common'; import { IndexPattern } from '@kbn/io-ts-utils'; +import { TIMESTAMP_FIELD } from '../../constants'; import { DatasetId, DatasetType, IntegrationType } from '../types'; type IntegrationBase = Pick; @@ -53,6 +54,7 @@ export class Dataset { return { id: this.id, name: this.getFullTitle(), + timeFieldName: TIMESTAMP_FIELD, title: this.name as string, }; } diff --git a/x-pack/plugins/log_explorer/public/components/log_explorer/log_explorer.tsx b/x-pack/plugins/log_explorer/public/components/log_explorer/log_explorer.tsx index fa76cadeb727b..6a945afa19ab2 100644 --- a/x-pack/plugins/log_explorer/public/components/log_explorer/log_explorer.tsx +++ b/x-pack/plugins/log_explorer/public/components/log_explorer/log_explorer.tsx @@ -5,22 +5,30 @@ * 2.0. */ +import React, { useMemo } from 'react'; import { ScopedHistory } from '@kbn/core-application-browser'; import { DataPublicPluginStart } from '@kbn/data-plugin/public'; -import { DiscoverStart } from '@kbn/discover-plugin/public'; -import React from 'react'; +import { DiscoverAppState, DiscoverStart } from '@kbn/discover-plugin/public'; +import type { BehaviorSubject } from 'rxjs'; import { createLogExplorerProfileCustomizations, CreateLogExplorerProfileCustomizationsDeps, } from '../../customizations/log_explorer_profile'; import { createPropertyGetProxy } from '../../utils/proxies'; +import { LogExplorerProfileContext } from '../../state_machines/log_explorer_profile'; export interface CreateLogExplorerArgs extends CreateLogExplorerProfileCustomizationsDeps { discover: DiscoverStart; } +export interface LogExplorerStateContainer { + appState?: DiscoverAppState; + logExplorerState?: Partial; +} + export interface LogExplorerProps { scopedHistory: ScopedHistory; + state$?: BehaviorSubject; } export const createLogExplorer = ({ @@ -28,13 +36,16 @@ export const createLogExplorer = ({ data, discover: { DiscoverContainer }, }: CreateLogExplorerArgs) => { - const logExplorerCustomizations = [createLogExplorerProfileCustomizations({ core, data })]; - const overrideServices = { data: createDataServiceProxy(data), }; - return ({ scopedHistory }: LogExplorerProps) => { + return ({ scopedHistory, state$ }: LogExplorerProps) => { + const logExplorerCustomizations = useMemo( + () => [createLogExplorerProfileCustomizations({ core, data, state$ })], + [state$] + ); + return ( import('./custom_dataset_selector')); const LazyCustomDatasetFilters = dynamic(() => import('./custom_dataset_filters')); @@ -17,10 +20,11 @@ const LazyCustomDatasetFilters = dynamic(() => import('./custom_dataset_filters' export interface CreateLogExplorerProfileCustomizationsDeps { core: CoreStart; data: DataPublicPluginStart; + state$?: BehaviorSubject; } export const createLogExplorerProfileCustomizations = - ({ core, data }: CreateLogExplorerProfileCustomizationsDeps): CustomizationCallback => + ({ core, data, state$ }: CreateLogExplorerProfileCustomizationsDeps): CustomizationCallback => async ({ customizations, stateContainer }) => { // Lazy load dependencies const datasetServiceModuleLoadable = import('../services/datasets'); @@ -38,13 +42,26 @@ export const createLogExplorerProfileCustomizations = toasts: core.notifications.toasts, }); - // /** * Wait for the machine to be fully initialized to set the restored selection * create the DataView and set it in the stateContainer from Discover */ await waitForState(logExplorerProfileStateService, 'initialized'); + /** + * Subscribe the state$ BehaviorSubject when the consumer app wants to react to state changes. + * It emits a combined state of: + * - log explorer state machine context + * - appState from the discover stateContainer + */ + let stateSubscription: Subscription; + if (state$) { + stateSubscription = createStateUpdater({ + logExplorerProfileStateService, + stateContainer, + }).subscribe(state$); + } + /** * Replace the DataViewPicker with a custom `DatasetSelector` to pick integrations streams * Prepend the search bar with custom filter control groups depending on the selected dataset @@ -76,4 +93,25 @@ export const createLogExplorerProfileCustomizations = saveItem: { disabled: true }, }, }); + + return () => { + if (stateSubscription) { + stateSubscription.unsubscribe(); + } + }; }; + +const createStateUpdater = ({ + logExplorerProfileStateService, + stateContainer, +}: { + logExplorerProfileStateService: LogExplorerProfileStateService; + stateContainer: DiscoverStateContainer; +}) => { + return combineLatest([from(logExplorerProfileStateService), stateContainer.appState.state$]).pipe( + map(([logExplorerState, appState]) => ({ + logExplorerState: logExplorerState.context, + appState, + })) + ); +}; diff --git a/x-pack/plugins/log_explorer/public/index.ts b/x-pack/plugins/log_explorer/public/index.ts index c145f6fd88864..00750926517e6 100644 --- a/x-pack/plugins/log_explorer/public/index.ts +++ b/x-pack/plugins/log_explorer/public/index.ts @@ -9,6 +9,7 @@ import type { PluginInitializerContext } from '@kbn/core/public'; import type { LogExplorerConfig } from '../common/plugin_config'; import { LogExplorerPlugin } from './plugin'; export type { LogExplorerPluginSetup, LogExplorerPluginStart } from './types'; +export type { LogExplorerStateContainer } from './components/log_explorer'; export function plugin(context: PluginInitializerContext) { return new LogExplorerPlugin(context); diff --git a/x-pack/plugins/observability_log_explorer/common/constants.ts b/x-pack/plugins/observability_log_explorer/common/constants.ts new file mode 100644 index 0000000000000..90cd311f05940 --- /dev/null +++ b/x-pack/plugins/observability_log_explorer/common/constants.ts @@ -0,0 +1,8 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +export const OBSERVABILITY_LOG_EXPLORER_APP_ID = 'observability-log-explorer'; diff --git a/x-pack/plugins/observability_log_explorer/common/translations.ts b/x-pack/plugins/observability_log_explorer/common/translations.ts index 5ec1940fa8dff..2abf660538260 100644 --- a/x-pack/plugins/observability_log_explorer/common/translations.ts +++ b/x-pack/plugins/observability_log_explorer/common/translations.ts @@ -21,3 +21,10 @@ export const betaBadgeDescription = i18n.translate( defaultMessage: 'This application is in beta and therefore subject to change.', } ); + +export const discoverLinkTitle = i18n.translate( + 'xpack.observabilityLogExplorer.discoverLinkTitle', + { + defaultMessage: 'Discover', + } +); diff --git a/x-pack/plugins/observability_log_explorer/kibana.jsonc b/x-pack/plugins/observability_log_explorer/kibana.jsonc index 35121b578c39c..529f879a56386 100644 --- a/x-pack/plugins/observability_log_explorer/kibana.jsonc +++ b/x-pack/plugins/observability_log_explorer/kibana.jsonc @@ -13,12 +13,13 @@ ], "requiredPlugins": [ "data", + "discover", "logExplorer", "observabilityShared" ], "optionalPlugins": [ "serverless" ], - "requiredBundles": [] + "requiredBundles": ["kibanaReact"] } } diff --git a/x-pack/plugins/observability_log_explorer/public/applications/observability_log_explorer.tsx b/x-pack/plugins/observability_log_explorer/public/applications/observability_log_explorer.tsx index 7d6863e4eb45a..999ebdd3095bf 100644 --- a/x-pack/plugins/observability_log_explorer/public/applications/observability_log_explorer.tsx +++ b/x-pack/plugins/observability_log_explorer/public/applications/observability_log_explorer.tsx @@ -5,28 +5,29 @@ * 2.0. */ -import { AppMountParameters, CoreStart, ScopedHistory } from '@kbn/core/public'; +import { AppMountParameters, CoreStart } from '@kbn/core/public'; import { KibanaRenderContextProvider } from '@kbn/react-kibana-context-render'; import { Route, Router, Routes } from '@kbn/shared-ux-router'; import React from 'react'; import ReactDOM from 'react-dom'; import { ObservablityLogExplorerMainRoute } from '../routes/main'; import { ObservabilityLogExplorerPluginStart, ObservabilityLogExplorerStartDeps } from '../types'; +import { useKibanaContextForPluginProvider } from '../utils/use_kibana'; export const renderObservabilityLogExplorer = ( core: CoreStart, pluginsStart: ObservabilityLogExplorerStartDeps, ownPluginStart: ObservabilityLogExplorerPluginStart, - { element, history }: AppMountParameters + appParams: AppMountParameters ) => { ReactDOM.render( , - element + appParams.element ); return () => { @@ -34,40 +35,51 @@ export const renderObservabilityLogExplorer = ( // observable in the search session service pluginsStart.data.search.session.clear(); - ReactDOM.unmountComponentAtNode(element); + ReactDOM.unmountComponentAtNode(appParams.element); }; }; export interface ObservabilityLogExplorerAppProps { + appParams: AppMountParameters; core: CoreStart; plugins: ObservabilityLogExplorerStartDeps; pluginStart: ObservabilityLogExplorerPluginStart; - history: ScopedHistory; } export const ObservabilityLogExplorerApp = ({ + appParams, core, - plugins: { logExplorer, observabilityShared, serverless }, + plugins, pluginStart, - history, -}: ObservabilityLogExplorerAppProps) => ( - - - - ( - { + const { logExplorer, observabilityShared, serverless } = plugins; + const KibanaContextProviderForPlugin = useKibanaContextForPluginProvider( + core, + plugins, + pluginStart + ); + + return ( + + + + + ( + + )} /> - )} - /> - - - -); + + + + + ); +}; diff --git a/x-pack/plugins/observability_log_explorer/public/components/log_explorer_top_nav_menu.tsx b/x-pack/plugins/observability_log_explorer/public/components/log_explorer_top_nav_menu.tsx new file mode 100644 index 0000000000000..0e8ec200da871 --- /dev/null +++ b/x-pack/plugins/observability_log_explorer/public/components/log_explorer_top_nav_menu.tsx @@ -0,0 +1,105 @@ +/* + * 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 React from 'react'; +import deepEqual from 'fast-deep-equal'; +import useObservable from 'react-use/lib/useObservable'; +import { type BehaviorSubject, distinctUntilChanged } from 'rxjs'; +import { HeaderMenuPortal } from '@kbn/observability-shared-plugin/public'; +import { AppMountParameters } from '@kbn/core-application-browser'; +import { + EuiBetaBadge, + EuiHeaderLink, + EuiHeaderLinks, + EuiHeaderSection, + EuiHeaderSectionItem, + useEuiTheme, +} from '@elastic/eui'; +import { css } from '@emotion/react'; +import { LogExplorerStateContainer } from '@kbn/log-explorer-plugin/public'; +import { useKibanaContextForPlugin } from '../utils/use_kibana'; +import { betaBadgeDescription, betaBadgeTitle, discoverLinkTitle } from '../../common/translations'; + +interface LogExplorerTopNavMenuProps { + setHeaderActionMenu: AppMountParameters['setHeaderActionMenu']; + state$: BehaviorSubject; + theme$: AppMountParameters['theme$']; +} + +export const LogExplorerTopNavMenu = ({ + setHeaderActionMenu, + state$, + theme$, +}: LogExplorerTopNavMenuProps) => { + const { euiTheme } = useEuiTheme(); + + return ( + + + + + + + + + + + ); +}; + +const DiscoverLink = React.memo( + ({ state$ }: { state$: BehaviorSubject }) => { + const { + services: { discover }, + } = useKibanaContextForPlugin(); + + const { appState, logExplorerState } = useObservable( + state$.pipe( + distinctUntilChanged((prev, curr) => { + if (!prev.appState || !curr.appState) return false; + return deepEqual( + [ + prev.appState.columns, + prev.appState.filters, + prev.appState.index, + prev.appState.query, + ], + [curr.appState.columns, curr.appState.filters, curr.appState.index, curr.appState.query] + ); + }) + ), + { appState: {}, logExplorerState: {} } + ); + + const discoverLinkParams = { + columns: appState?.columns, + filters: appState?.filters, + query: appState?.query, + dataViewSpec: logExplorerState?.datasetSelection?.selection.dataset.toDataviewSpec(), + }; + + return ( + discover.locator?.navigate(discoverLinkParams)} + color="primary" + iconType="discoverApp" + data-test-subj="logExplorerDiscoverFallbackLink" + > + {discoverLinkTitle} + + ); + } +); diff --git a/x-pack/plugins/observability_log_explorer/public/plugin.ts b/x-pack/plugins/observability_log_explorer/public/plugin.ts index 6afb62235ba15..8ca79e4ec7be4 100644 --- a/x-pack/plugins/observability_log_explorer/public/plugin.ts +++ b/x-pack/plugins/observability_log_explorer/public/plugin.ts @@ -14,6 +14,7 @@ import { PluginInitializerContext, } from '@kbn/core/public'; import { type ObservabilityLogExplorerConfig } from '../common/plugin_config'; +import { OBSERVABILITY_LOG_EXPLORER_APP_ID } from '../common/constants'; import { logExplorerAppTitle } from '../common/translations'; import { renderObservabilityLogExplorer } from './applications/observability_log_explorer'; import type { @@ -37,7 +38,7 @@ export class ObservabilityLogExplorerPlugin _pluginsSetup: ObservabilityLogExplorerSetupDeps ) { core.application.register({ - id: 'observability-log-explorer', + id: OBSERVABILITY_LOG_EXPLORER_APP_ID, title: logExplorerAppTitle, category: DEFAULT_APP_CATEGORIES.observability, euiIconType: 'logoLogging', diff --git a/x-pack/plugins/observability_log_explorer/public/routes/main/main_route.tsx b/x-pack/plugins/observability_log_explorer/public/routes/main/main_route.tsx index 5e9b22fb1ad5d..7b224da830433 100644 --- a/x-pack/plugins/observability_log_explorer/public/routes/main/main_route.tsx +++ b/x-pack/plugins/observability_log_explorer/public/routes/main/main_route.tsx @@ -5,34 +5,45 @@ * 2.0. */ -import { CoreStart, ScopedHistory } from '@kbn/core/public'; +import { AppMountParameters, CoreStart } from '@kbn/core/public'; import { LogExplorerPluginStart } from '@kbn/log-explorer-plugin/public'; import { ObservabilitySharedPluginStart } from '@kbn/observability-shared-plugin/public'; import { ServerlessPluginStart } from '@kbn/serverless/public'; -import React from 'react'; +import React, { useState } from 'react'; +import { BehaviorSubject } from 'rxjs'; +import { LogExplorerTopNavMenu } from '../../components/log_explorer_top_nav_menu'; import { ObservabilityLogExplorerPageTemplate } from '../../components/page_template'; import { noBreadcrumbs, useBreadcrumbs } from '../../utils/breadcrumbs'; export interface ObservablityLogExplorerMainRouteProps { + appParams: AppMountParameters; core: CoreStart; - history: ScopedHistory; logExplorer: LogExplorerPluginStart; observabilityShared: ObservabilitySharedPluginStart; serverless?: ServerlessPluginStart; } export const ObservablityLogExplorerMainRoute = ({ + appParams: { history, setHeaderActionMenu, theme$ }, core, - history, logExplorer, observabilityShared, serverless, }: ObservablityLogExplorerMainRouteProps) => { useBreadcrumbs(noBreadcrumbs, core.chrome, serverless); + const [state$] = useState(() => new BehaviorSubject({})); + return ( - - - + <> + + + + + ); }; diff --git a/x-pack/plugins/observability_log_explorer/public/types.ts b/x-pack/plugins/observability_log_explorer/public/types.ts index f5e6526c502d9..e52ece9ca1624 100644 --- a/x-pack/plugins/observability_log_explorer/public/types.ts +++ b/x-pack/plugins/observability_log_explorer/public/types.ts @@ -6,6 +6,7 @@ */ import { DataPublicPluginStart } from '@kbn/data-plugin/public'; +import { DiscoverStart } from '@kbn/discover-plugin/public'; import { LogExplorerPluginStart } from '@kbn/log-explorer-plugin/public'; import { ObservabilitySharedPluginStart } from '@kbn/observability-shared-plugin/public'; import { ServerlessPluginStart } from '@kbn/serverless/public'; @@ -22,6 +23,7 @@ export interface ObservabilityLogExplorerSetupDeps { export interface ObservabilityLogExplorerStartDeps { data: DataPublicPluginStart; + discover: DiscoverStart; logExplorer: LogExplorerPluginStart; observabilityShared: ObservabilitySharedPluginStart; serverless?: ServerlessPluginStart; diff --git a/x-pack/plugins/observability_log_explorer/public/utils/breadcrumbs.tsx b/x-pack/plugins/observability_log_explorer/public/utils/breadcrumbs.tsx index a8b575d5341dc..c1eaca45b7855 100644 --- a/x-pack/plugins/observability_log_explorer/public/utils/breadcrumbs.tsx +++ b/x-pack/plugins/observability_log_explorer/public/utils/breadcrumbs.tsx @@ -9,11 +9,7 @@ import { EuiBreadcrumb } from '@elastic/eui'; import type { ChromeStart } from '@kbn/core-chrome-browser'; import type { ServerlessPluginStart } from '@kbn/serverless/public'; import { useEffect } from 'react'; -import { - betaBadgeDescription, - betaBadgeTitle, - logExplorerAppTitle, -} from '../../common/translations'; +import { logExplorerAppTitle } from '../../common/translations'; export const useBreadcrumbs = ( breadcrumbs: EuiBreadcrumb[], @@ -40,10 +36,6 @@ export function setBreadcrumbs( ...breadcrumbs, ]); } - chromeService.setBadge({ - text: betaBadgeTitle, - tooltip: betaBadgeDescription, - }); } export const noBreadcrumbs: EuiBreadcrumb[] = []; diff --git a/x-pack/plugins/observability_log_explorer/tsconfig.json b/x-pack/plugins/observability_log_explorer/tsconfig.json index 5f94d15d30fea..ae9660b421359 100644 --- a/x-pack/plugins/observability_log_explorer/tsconfig.json +++ b/x-pack/plugins/observability_log_explorer/tsconfig.json @@ -22,6 +22,8 @@ "@kbn/serverless", "@kbn/core-chrome-browser", "@kbn/config-schema", + "@kbn/core-application-browser", + "@kbn/discover-plugin", ], "exclude": [ "target/**/*" diff --git a/x-pack/test/functional/apps/observability_log_explorer/header_menu.ts b/x-pack/test/functional/apps/observability_log_explorer/header_menu.ts new file mode 100644 index 0000000000000..0831bec27b7ed --- /dev/null +++ b/x-pack/test/functional/apps/observability_log_explorer/header_menu.ts @@ -0,0 +1,76 @@ +/* + * 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 default function ({ getService, getPageObjects }: FtrProviderContext) { + const esArchiver = getService('esArchiver'); + const kibanaServer = getService('kibanaServer'); + const retry = getService('retry'); + const PageObjects = getPageObjects(['discover', 'observabilityLogExplorer', 'timePicker']); + + describe('Header menu', () => { + before(async () => { + await kibanaServer.importExport.load('test/functional/fixtures/kbn_archiver/discover'); + await esArchiver.load( + 'x-pack/test/functional/es_archives/observability_log_explorer/data_streams' + ); + await PageObjects.observabilityLogExplorer.navigateTo(); + }); + + after(async () => { + await kibanaServer.importExport.unload('test/functional/fixtures/kbn_archiver/discover'); + await esArchiver.unload( + 'x-pack/test/functional/es_archives/observability_log_explorer/data_streams' + ); + }); + + it('should inject the app header menu on the top navbar', async () => { + const headerMenu = await PageObjects.observabilityLogExplorer.getHeaderMenu(); + expect(await headerMenu.isDisplayed()).to.be(true); + }); + + describe('Discover fallback link', () => { + it('should render a button link ', async () => { + const discoverLink = await PageObjects.observabilityLogExplorer.getDiscoverFallbackLink(); + expect(await discoverLink.isDisplayed()).to.be(true); + }); + + it('should navigate to discover keeping the current columns/filters/query/time/data view', async () => { + // Set timerange to specific values to match data and retrieve config + await PageObjects.discover.expandTimeRangeAsSuggestedInNoResultsMessage(); + const timeConfig = await PageObjects.timePicker.getTimeConfig(); + + // Set query bar value + await PageObjects.observabilityLogExplorer.submitQuery('*favicon*'); + + const discoverLink = await PageObjects.observabilityLogExplorer.getDiscoverFallbackLink(); + discoverLink.click(); + + await PageObjects.discover.waitForDocTableLoadingComplete(); + + await retry.try(async () => { + expect(await PageObjects.discover.getCurrentlySelectedDataView()).to.eql( + 'All log datasets' + ); + }); + + await retry.try(async () => { + expect(await PageObjects.discover.getColumnHeaders()).to.eql(['@timestamp', 'message']); + }); + + await retry.try(async () => { + expect(await PageObjects.timePicker.getTimeConfig()).to.eql(timeConfig); + }); + + await retry.try(async () => { + expect(await PageObjects.observabilityLogExplorer.getQueryBarValue()).to.eql('*favicon*'); + }); + }); + }); + }); +} diff --git a/x-pack/test/functional/apps/observability_log_explorer/index.ts b/x-pack/test/functional/apps/observability_log_explorer/index.ts index 90a52663e34ce..aec38a6bb8308 100644 --- a/x-pack/test/functional/apps/observability_log_explorer/index.ts +++ b/x-pack/test/functional/apps/observability_log_explorer/index.ts @@ -14,5 +14,6 @@ export default function ({ loadTestFile }: FtrProviderContext) { loadTestFile(require.resolve('./dataset_selection_state')); loadTestFile(require.resolve('./dataset_selector')); loadTestFile(require.resolve('./filter_controls')); + loadTestFile(require.resolve('./header_menu')); }); } diff --git a/x-pack/test/functional/page_objects/observability_log_explorer.ts b/x-pack/test/functional/page_objects/observability_log_explorer.ts index 33e85e06a16a9..7e4b83083ace0 100644 --- a/x-pack/test/functional/page_objects/observability_log_explorer.ts +++ b/x-pack/test/functional/page_objects/observability_log_explorer.ts @@ -314,5 +314,34 @@ export function ObservabilityLogExplorerPageObject({ expect(await promptTitle.getVisibleText()).to.be('No data streams found'); }, + + getHeaderMenu() { + return testSubjects.find('logExplorerHeaderMenu'); + }, + + getDiscoverFallbackLink() { + return testSubjects.find('logExplorerDiscoverFallbackLink'); + }, + + // Query Bar + getQueryBar() { + return testSubjects.find('queryInput'); + }, + + async getQueryBarValue() { + const queryBar = await testSubjects.find('queryInput'); + return queryBar.getAttribute('value'); + }, + + async typeInQueryBar(query: string) { + const queryBar = await this.getQueryBar(); + await queryBar.clearValueWithKeyboard(); + return queryBar.type(query); + }, + + async submitQuery(query: string) { + await this.typeInQueryBar(query); + await testSubjects.click('querySubmitButton'); + }, }; } diff --git a/x-pack/test_serverless/functional/test_suites/observability/observability_log_explorer/header_menu.ts b/x-pack/test_serverless/functional/test_suites/observability/observability_log_explorer/header_menu.ts new file mode 100644 index 0000000000000..038e28a442c24 --- /dev/null +++ b/x-pack/test_serverless/functional/test_suites/observability/observability_log_explorer/header_menu.ts @@ -0,0 +1,76 @@ +/* + * 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 default function ({ getService, getPageObjects }: FtrProviderContext) { + const esArchiver = getService('esArchiver'); + const kibanaServer = getService('kibanaServer'); + const retry = getService('retry'); + const PageObjects = getPageObjects(['discover', 'observabilityLogExplorer', 'timePicker']); + + describe('Header menu', () => { + before(async () => { + await kibanaServer.importExport.load('test/functional/fixtures/kbn_archiver/discover'); + await esArchiver.load( + 'x-pack/test/functional/es_archives/observability_log_explorer/data_streams' + ); + await PageObjects.observabilityLogExplorer.navigateTo(); + }); + + after(async () => { + await kibanaServer.importExport.unload('test/functional/fixtures/kbn_archiver/discover'); + await esArchiver.unload( + 'x-pack/test/functional/es_archives/observability_log_explorer/data_streams' + ); + }); + + it('should inject the app header menu on the top navbar', async () => { + const headerMenu = await PageObjects.observabilityLogExplorer.getHeaderMenu(); + expect(await headerMenu.isDisplayed()).to.be(true); + }); + + describe('Discover fallback link', () => { + it('should render a button link ', async () => { + const discoverLink = await PageObjects.observabilityLogExplorer.getDiscoverFallbackLink(); + expect(await discoverLink.isDisplayed()).to.be(true); + }); + + it('should navigate to discover keeping the current columns/filters/query/time/data view', async () => { + // Set timerange to specific values to match data and retrieve config + await PageObjects.discover.expandTimeRangeAsSuggestedInNoResultsMessage(); + const timeConfig = await PageObjects.timePicker.getTimeConfig(); + + // Set query bar value + await PageObjects.observabilityLogExplorer.submitQuery('*favicon*'); + + const discoverLink = await PageObjects.observabilityLogExplorer.getDiscoverFallbackLink(); + discoverLink.click(); + + await PageObjects.discover.waitForDocTableLoadingComplete(); + + await retry.try(async () => { + expect(await PageObjects.discover.getCurrentlySelectedDataView()).to.eql( + 'All log datasets' + ); + }); + + await retry.try(async () => { + expect(await PageObjects.discover.getColumnHeaders()).to.eql(['@timestamp', 'message']); + }); + + await retry.try(async () => { + expect(await PageObjects.timePicker.getTimeConfig()).to.eql(timeConfig); + }); + + await retry.try(async () => { + expect(await PageObjects.observabilityLogExplorer.getQueryBarValue()).to.eql('*favicon*'); + }); + }); + }); + }); +} diff --git a/x-pack/test_serverless/functional/test_suites/observability/observability_log_explorer/index.ts b/x-pack/test_serverless/functional/test_suites/observability/observability_log_explorer/index.ts index b0555b4447d27..77f89dad01f77 100644 --- a/x-pack/test_serverless/functional/test_suites/observability/observability_log_explorer/index.ts +++ b/x-pack/test_serverless/functional/test_suites/observability/observability_log_explorer/index.ts @@ -14,5 +14,6 @@ export default function ({ loadTestFile }: FtrProviderContext) { loadTestFile(require.resolve('./dataset_selection_state')); loadTestFile(require.resolve('./dataset_selector')); loadTestFile(require.resolve('./filter_controls')); + loadTestFile(require.resolve('./header_menu')); }); } From 9d5bb89b7cd3738482b9ea3247cd88077375ed3b Mon Sep 17 00:00:00 2001 From: Yngrid Coello Date: Wed, 6 Sep 2023 12:52:28 +0200 Subject: [PATCH 04/97] [Logs onboarding] Adding Elastic-Api-Version to cy command (#165814) --- .../observability_onboarding/e2e/cypress/support/commands.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/x-pack/plugins/observability_onboarding/e2e/cypress/support/commands.ts b/x-pack/plugins/observability_onboarding/e2e/cypress/support/commands.ts index ea321f48a0bae..ddceaf3325bfa 100644 --- a/x-pack/plugins/observability_onboarding/e2e/cypress/support/commands.ts +++ b/x-pack/plugins/observability_onboarding/e2e/cypress/support/commands.ts @@ -119,6 +119,7 @@ Cypress.Commands.add('deleteIntegration', (integrationName: string) => { }, headers: { 'kbn-xsrf': 'e2e_test', + 'Elastic-Api-Version': '1', }, auth: { user: 'editor', pass: 'changeme' }, }); From 015b910de2e9048c63eb2c7cbaa83dcdbcddd4c4 Mon Sep 17 00:00:00 2001 From: Alex Szabo Date: Wed, 6 Sep 2023 13:22:43 +0200 Subject: [PATCH 05/97] [Ops] Run kibana quality gate suites (#165346) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## Summary Sets up quality gate triggering in Kibana. The tests are mostly triggering external pipelines and relying on their results. Here's an example run: https://buildkite.com/elastic/kibana-tests/builds/28#job-018a69a6-c860-405e-ab2b-bce2aed07df3 According to [this doc](https://docs.google.com/document/d/15rx2Z-soL20An0nBUcXX0o_HHf1OU_IgrHXgz20NndI/edit) many of the quality gates are really required for the QA->Staging promotion step. Most of the tests are in the QA stage: - [fleet smoke tests](https://buildkite.com/elastic/fleet-smoke-tests) - ~~[QAF RAC load tests](https://buildkite.com/elastic/appex-qa-rac-alert-load)~~ Removed, see https://github.com/elastic/kibana/pull/165346#discussion_r1316822164 - [QAF serverless tests](https://buildkite.com/elastic/appex-qa-kibana-serverless-ftr-tests) - [control plane QA smoke tests](https://buildkite.com/elastic/ess-k8s-qa-e2e-tests-daily) - [security solution tests](.buildkite/scripts/pipelines/security_solution_quality_gate/pipeline.sh) + manual check for confirming manual tests - Manual confirmation 👍 Staging has: - [control plane staging smoke tests](https://buildkite.com/elastic/ess-k8s-staging-e2e-tests) - Manual confirmation 👍 Production has: - [control plane production smoke tests](https://buildkite.com/elastic/ess-k8s-production-e2e-tests) - Manual confirmation 👍 ### Quirks - ~~`SKIP_KIBANA_HOOKS=1` needs to be set from the triggering job~~ Split into https://github.com/elastic/kibana/pull/165597 - The pipeline can only be tested from the non-fork, `elastic/kibana` repo's branches (because buildkite doesn't see forks' branches) - Soft fails added, to not block the release pipeline in case we still need to adjust/work on some unstable tests Reference: https://docs.google.com/document/d/15rx2Z-soL20An0nBUcXX0o_HHf1OU_IgrHXgz20NndI/edit Depends on: #165009 Closes: https://github.com/elastic/kibana-operations/issues/10 --------- Co-authored-by: Tiago Costa Co-authored-by: Thomas Watson --- .../quality-gates/pipeline.kibana-tests.yaml | 2 +- .../pipeline.tests-production.yaml | 19 ++----- .../quality-gates/pipeline.tests-qa.yaml | 49 ++++++++++++------- .../quality-gates/pipeline.tests-staging.yaml | 17 ++----- 4 files changed, 40 insertions(+), 47 deletions(-) diff --git a/.buildkite/pipelines/quality-gates/pipeline.kibana-tests.yaml b/.buildkite/pipelines/quality-gates/pipeline.kibana-tests.yaml index 0acdb66f8d5f2..467df501bc9ca 100644 --- a/.buildkite/pipelines/quality-gates/pipeline.kibana-tests.yaml +++ b/.buildkite/pipelines/quality-gates/pipeline.kibana-tests.yaml @@ -18,7 +18,7 @@ steps: - label: ":pipeline::grey_question::seedling: Trigger Kibana Tests for ${ENVIRONMENT}" env: QG_PIPELINE_LOCATION: ".buildkite/pipelines/quality-gates" - command: "make -C /agent run-environment-tests" + command: "make -C /agent run-environment-tests" # will trigger https://buildkite.com/elastic/kibana-tests agents: image: "docker.elastic.co/ci-agent-images/quality-gate-seedling:0.0.2" diff --git a/.buildkite/pipelines/quality-gates/pipeline.tests-production.yaml b/.buildkite/pipelines/quality-gates/pipeline.tests-production.yaml index 1c30a7f734df4..32878e2fc09cd 100644 --- a/.buildkite/pipelines/quality-gates/pipeline.tests-production.yaml +++ b/.buildkite/pipelines/quality-gates/pipeline.tests-production.yaml @@ -3,27 +3,18 @@ # A failure in this pipeline build will prevent further progression to the subsequent stage. steps: - - label: ":pipeline::fleet::seedling: Trigger Observability Kibana Tests for ${ENVIRONMENT}" - command: echo "replace me with Observability specific Kibana tests" - agents: - image: "docker.elastic.co/ci-agent-images/basic-buildkite-agent:1688566364" - - - label: ":pipeline::lock::seedling: Trigger Security Kibana Tests for ${ENVIRONMENT}" - command: echo "replace me with Security specific Kibana tests" - agents: - image: "docker.elastic.co/ci-agent-images/basic-buildkite-agent:1688566364" - - - label: ":rocket: Run cp e2e tests" - trigger: "ess-k8s-production-e2e-tests" + - label: ":pipeline::rocket::seedling: Trigger control-plane e2e tests" + trigger: "ess-k8s-production-e2e-tests" # https://buildkite.com/elastic/ess-k8s-production-e2e-tests build: - message: "${BUILDKITE_MESSAGE}" env: REGION_ID: aws-us-east-1 - NAME_PREFIX: ci_test_${SERVICE}-promotion_ + NAME_PREFIX: ci_test_kibana-promotion_ + message: "${BUILDKITE_MESSAGE} (triggered by pipeline.tests-production.yaml)" - wait: ~ - label: ":judge::seedling: Trigger Manual Tests Phase" command: "make -C /agent trigger-manual-verification-phase" + if: build.branch == "main" agents: image: "docker.elastic.co/ci-agent-images/manual-verification-agent:0.0.2" diff --git a/.buildkite/pipelines/quality-gates/pipeline.tests-qa.yaml b/.buildkite/pipelines/quality-gates/pipeline.tests-qa.yaml index e03e986f65833..e7fbf640cf565 100644 --- a/.buildkite/pipelines/quality-gates/pipeline.tests-qa.yaml +++ b/.buildkite/pipelines/quality-gates/pipeline.tests-qa.yaml @@ -3,37 +3,48 @@ # this pipeline build will prevent further progression to the subsequent stage. steps: - - label: ":pipeline::kibana::seedling: Trigger Kibana Tests for ${ENVIRONMENT}" - command: echo "replace me with Kibana specific tests" - agents: - image: "docker.elastic.co/ci-agent-images/basic-buildkite-agent:1688566364" + - label: ":pipeline::kibana::seedling: Trigger Kibana Serverless Tests for ${ENVIRONMENT}" + trigger: appex-qa-kibana-serverless-ftr-tests # https://buildkite.com/elastic/appex-qa-kibana-serverless-ftr-tests + soft_fail: true # Remove this before release or when tests stabilize + build: + env: + ENVIRONMENT: ${ENVIRONMENT} + message: "${BUILDKITE_MESSAGE} (triggered by pipeline.tests-qa.yaml)" - - label: ":pipeline::fleet::seedling: Trigger Fleet Kibana Tests for ${ENVIRONMENT}" - command: echo "replace me with Fleet specific Kibana tests" - agents: - image: "docker.elastic.co/ci-agent-images/basic-buildkite-agent:1688566364" + - group: ":female-detective: Security Solution Tests" + key: "security" + steps: + - label: ":pipeline::female-detective::seedling: Trigger Security Solution quality gate script" + command: .buildkite/scripts/pipelines/security_solution_quality_gate/pipeline.sh - - label: ":pipeline::lock::seedling: Trigger Security Kibana Tests for ${ENVIRONMENT}" - command: echo "replace me with Security specific Kibana tests" - agents: - image: "docker.elastic.co/ci-agent-images/basic-buildkite-agent:1688566364" + - label: ":judge::seedling: Trigger Manual Tests Phase" + command: "make -C /agent trigger-manual-verification-phase" + if: build.branch == "main" + env: + TEAM_CHANNEL: "#kibana-mission-control" + agents: + image: "docker.elastic.co/ci-agent-images/manual-verification-agent:0.0.2" - - label: ":pipeline::lock::seedling: Trigger Control Plane Kibana Tests for ${ENVIRONMENT}" - command: echo "replace me with Control Plane specific Kibana tests" - agents: - image: "docker.elastic.co/ci-agent-images/basic-buildkite-agent:1688566364" + - label: ":pipeline::ship::seedling: Trigger 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: + env: + ENVIRONMENT: ${ENVIRONMENT} + message: "${BUILDKITE_MESSAGE} (triggered by pipeline.tests-qa.yaml)" - - label: ":rocket: Run cp e2e tests" - trigger: "ess-k8s-qa-e2e-tests-daily" + - label: ":pipeline::rocket::seedling: Trigger control-plane e2e tests" + trigger: "ess-k8s-qa-e2e-tests-daily" # https://buildkite.com/elastic/ess-k8s-qa-e2e-tests-daily build: - message: "${BUILDKITE_MESSAGE}" env: REGION_ID: aws-eu-west-1 NAME_PREFIX: ci_test_kibana-promotion_ + message: "${BUILDKITE_MESSAGE} (triggered by pipeline.tests-qa.yaml)" - wait: ~ - label: ":judge::seedling: Trigger Manual Tests Phase" command: "make -C /agent trigger-manual-verification-phase" + if: build.branch == "main" agents: image: "docker.elastic.co/ci-agent-images/manual-verification-agent:0.0.2" diff --git a/.buildkite/pipelines/quality-gates/pipeline.tests-staging.yaml b/.buildkite/pipelines/quality-gates/pipeline.tests-staging.yaml index 83bfd0d27e34c..a376ff2ff1884 100644 --- a/.buildkite/pipelines/quality-gates/pipeline.tests-staging.yaml +++ b/.buildkite/pipelines/quality-gates/pipeline.tests-staging.yaml @@ -3,27 +3,18 @@ # this pipeline build will prevent further progression to the subsequent stage. steps: - - label: ":pipeline::fleet::seedling: Trigger Observability Kibana Tests for ${ENVIRONMENT}" - command: echo "replace me with Observability specific Kibana tests" - agents: - image: "docker.elastic.co/ci-agent-images/basic-buildkite-agent:1688566364" - - - label: ":pipeline::lock::seedling: Trigger Security Kibana Tests for ${ENVIRONMENT}" - command: echo "replace me with Security specific Kibana tests" - agents: - image: "docker.elastic.co/ci-agent-images/basic-buildkite-agent:1688566364" - - - label: ":rocket: Run cp e2e tests" - trigger: "ess-k8s-staging-e2e-tests" + - label: ":pipeline::rocket::seedling: Trigger control-plane e2e tests" + trigger: "ess-k8s-staging-e2e-tests" # https://buildkite.com/elastic/ess-k8s-staging-e2e-tests build: - message: "${BUILDKITE_MESSAGE}" env: REGION_ID: aws-us-east-1 NAME_PREFIX: ci_test_kibana-promotion_ + message: "${BUILDKITE_MESSAGE} (triggered by pipeline.tests-staging.yaml)" - wait: ~ - label: ":judge::seedling: Trigger Manual Tests Phase" command: "make -C /agent trigger-manual-verification-phase" + if: build.branch == "main" agents: image: "docker.elastic.co/ci-agent-images/manual-verification-agent:0.0.2" From a00e5e378800d0eda047b59228a48b816541e132 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cau=C3=AA=20Marcondes?= <55978943+cauemarcondes@users.noreply.github.com> Date: Wed, 6 Sep 2023 12:29:42 +0100 Subject: [PATCH 06/97] [Profiling] fix bug when APM integration is no available (#165809) We've identified a buggy scenario when a user has a cluster prior 8.5 and wants to upgrade to >8.9. In this case, Profiling looks after the `elastic-cloud-apm` integration to see if Profiling had been enabled previously. But for the versions before 8.5 this integration did not exist under this name causing the set up to crash. I fixed the issue by catching the exception and returning that profiling is not enabled on the apm server, as it's not installed. Before: ``` Error: Saved object [ingest-package-policies/elastic-cloud-apm] not found at Function.createGenericNotFoundError (saved_objects_error_helpers.ts:258:28) at performGet (get.ts:80:36) at processTicksAndRejections (node:internal/process/task_queues:95:5) at SavedObjectsRepository.get (repository.ts:370:12) at SavedObjectsClient.get (saved_objects_client.ts:119:12) at PackagePolicyClientImpl.get (package_policy.ts:495:29) at validateProfilingInApmPackagePolicy (fleet_policies.ts:193:23) at async Promise.all (index 5) at setup.ts:99:31 at Router.handle (router.ts:212:30) at handler (router.ts:162:13) at exports.Manager.execute (/Users/caue.marcondes/elastic/other_kibana/node_modules/@hapi/hapi/lib ``` After: ``` { "has_setup": false, "has_data": false, "pre_8_9_1_data": false } ``` --------- Co-authored-by: Francesco Gualazzi --- .../server/lib/setup/fleet_policies.ts | 26 ++++++++++++------- 1 file changed, 16 insertions(+), 10 deletions(-) diff --git a/x-pack/plugins/profiling/server/lib/setup/fleet_policies.ts b/x-pack/plugins/profiling/server/lib/setup/fleet_policies.ts index 8ffe13695cddb..ccba170b5fed9 100644 --- a/x-pack/plugins/profiling/server/lib/setup/fleet_policies.ts +++ b/x-pack/plugins/profiling/server/lib/setup/fleet_policies.ts @@ -189,17 +189,23 @@ export async function validateProfilingInApmPackagePolicy({ soClient, packagePolicyClient, }: ProfilingSetupOptions): Promise { - const apmPolicy = await getApmPolicy({ packagePolicyClient, soClient }); - - return { - policies: { - apm: { - profilingEnabled: !!( - apmPolicy && apmPolicy?.inputs[0].config?.['apm-server'].value?.profiling - ), + try { + const apmPolicy = await getApmPolicy({ packagePolicyClient, soClient }); + return { + policies: { + apm: { + profilingEnabled: !!( + apmPolicy && apmPolicy?.inputs[0].config?.['apm-server'].value?.profiling + ), + }, }, - }, - }; + }; + } catch (e) { + // In case apm integration is not available ignore the error and return as profiling is not enabled on the integration + return { + policies: { apm: { profilingEnabled: false } }, + }; + } } export async function removeProfilingFromApmPackagePolicy({ From 14876726f4f6edd57672644a322e55cd3d2afd6a Mon Sep 17 00:00:00 2001 From: jennypavlova Date: Wed, 6 Sep 2023 13:30:51 +0200 Subject: [PATCH 07/97] [Infra UI] Normalise network and Disk rates for Hosts across time ranges (#165680) Closes #164152 ## Summary This PR normalizes the disk and network charts per second. The charts changed: Disk IOPS (read/write) diskiops Network (rx/tx) network Disk Throughput (read/write) diskth ## Testing 1. Go to hosts view and check network and disk charts (they should be normalized per second) 2. Open the host flyout and check network and disk charts (they should be normalized per second) https://github.com/elastic/kibana/assets/14139027/087cd044-b6cc-4612-8fca-391a96848365 --- .../common/visualizations/lens/formulas/host/disk_read_iops.ts | 1 + .../visualizations/lens/formulas/host/disk_read_throughput.ts | 1 + .../common/visualizations/lens/formulas/host/disk_write_iops.ts | 1 + .../visualizations/lens/formulas/host/disk_write_throughput.ts | 1 + .../infra/public/common/visualizations/lens/formulas/host/rx.ts | 1 + .../infra/public/common/visualizations/lens/formulas/host/tx.ts | 1 + 6 files changed, 6 insertions(+) diff --git a/x-pack/plugins/infra/public/common/visualizations/lens/formulas/host/disk_read_iops.ts b/x-pack/plugins/infra/public/common/visualizations/lens/formulas/host/disk_read_iops.ts index 9b3f22164aacc..7af4e67339565 100644 --- a/x-pack/plugins/infra/public/common/visualizations/lens/formulas/host/disk_read_iops.ts +++ b/x-pack/plugins/infra/public/common/visualizations/lens/formulas/host/disk_read_iops.ts @@ -16,4 +16,5 @@ export const diskIORead: FormulaValueConfig = { decimals: 0, }, }, + timeScale: 's', }; diff --git a/x-pack/plugins/infra/public/common/visualizations/lens/formulas/host/disk_read_throughput.ts b/x-pack/plugins/infra/public/common/visualizations/lens/formulas/host/disk_read_throughput.ts index 5043fb7f94fe1..f3f35cb54940f 100644 --- a/x-pack/plugins/infra/public/common/visualizations/lens/formulas/host/disk_read_throughput.ts +++ b/x-pack/plugins/infra/public/common/visualizations/lens/formulas/host/disk_read_throughput.ts @@ -16,4 +16,5 @@ export const diskReadThroughput: FormulaValueConfig = { decimals: 1, }, }, + timeScale: 's', }; diff --git a/x-pack/plugins/infra/public/common/visualizations/lens/formulas/host/disk_write_iops.ts b/x-pack/plugins/infra/public/common/visualizations/lens/formulas/host/disk_write_iops.ts index 2831957ccb230..b3a8e62200c15 100644 --- a/x-pack/plugins/infra/public/common/visualizations/lens/formulas/host/disk_write_iops.ts +++ b/x-pack/plugins/infra/public/common/visualizations/lens/formulas/host/disk_write_iops.ts @@ -16,4 +16,5 @@ export const diskIOWrite: FormulaValueConfig = { decimals: 0, }, }, + timeScale: 's', }; diff --git a/x-pack/plugins/infra/public/common/visualizations/lens/formulas/host/disk_write_throughput.ts b/x-pack/plugins/infra/public/common/visualizations/lens/formulas/host/disk_write_throughput.ts index 9f0f0937bff37..1ba401d011479 100644 --- a/x-pack/plugins/infra/public/common/visualizations/lens/formulas/host/disk_write_throughput.ts +++ b/x-pack/plugins/infra/public/common/visualizations/lens/formulas/host/disk_write_throughput.ts @@ -16,4 +16,5 @@ export const diskWriteThroughput: FormulaValueConfig = { decimals: 1, }, }, + timeScale: 's', }; diff --git a/x-pack/plugins/infra/public/common/visualizations/lens/formulas/host/rx.ts b/x-pack/plugins/infra/public/common/visualizations/lens/formulas/host/rx.ts index 92162fad6010f..25f03ff811e76 100644 --- a/x-pack/plugins/infra/public/common/visualizations/lens/formulas/host/rx.ts +++ b/x-pack/plugins/infra/public/common/visualizations/lens/formulas/host/rx.ts @@ -17,4 +17,5 @@ export const rx: FormulaValueConfig = { decimals: 1, }, }, + timeScale: 's', }; diff --git a/x-pack/plugins/infra/public/common/visualizations/lens/formulas/host/tx.ts b/x-pack/plugins/infra/public/common/visualizations/lens/formulas/host/tx.ts index 2b196103619a7..42608398e255e 100644 --- a/x-pack/plugins/infra/public/common/visualizations/lens/formulas/host/tx.ts +++ b/x-pack/plugins/infra/public/common/visualizations/lens/formulas/host/tx.ts @@ -17,4 +17,5 @@ export const tx: FormulaValueConfig = { decimals: 1, }, }, + timeScale: 's', }; From ba5a0496751c9008146dbec434212eea1a2d33f5 Mon Sep 17 00:00:00 2001 From: Ersin Erdal <92688503+ersin-erdal@users.noreply.github.com> Date: Wed, 6 Sep 2023 13:34:19 +0200 Subject: [PATCH 08/97] Fix flaky getSummarizedAlerts unit tests (#165801) Resolves: #165755, #163192, #165754, #165753, #165752, #165751, #165750, #165749, #165748, #163194, #163193, #163192 This PR fixes above flaky tests by fixing the `kibana.alert.start` filter in getExpectedQueryByTimeRange fixture --- .../alerting/server/alerts_client/alerts_client.test.ts | 4 ---- .../alerting/server/alerts_client/alerts_client_fixtures.ts | 6 +++--- 2 files changed, 3 insertions(+), 7 deletions(-) diff --git a/x-pack/plugins/alerting/server/alerts_client/alerts_client.test.ts b/x-pack/plugins/alerting/server/alerts_client/alerts_client.test.ts index 78b2e41431c22..2c0e6e0cbf03c 100644 --- a/x-pack/plugins/alerting/server/alerts_client/alerts_client.test.ts +++ b/x-pack/plugins/alerting/server/alerts_client/alerts_client.test.ts @@ -1363,10 +1363,6 @@ describe('Alerts Client', () => { }); }); - // FLAKY: https://github.com/elastic/kibana/issues/163192 - // FLAKY: https://github.com/elastic/kibana/issues/163193 - // FLAKY: https://github.com/elastic/kibana/issues/163194 - // FLAKY: https://github.com/elastic/kibana/issues/163195 describe('getSummarizedAlerts', () => { beforeEach(() => { clusterClient.search.mockReturnValue({ diff --git a/x-pack/plugins/alerting/server/alerts_client/alerts_client_fixtures.ts b/x-pack/plugins/alerting/server/alerts_client/alerts_client_fixtures.ts index aa513588b83f8..4395df7217419 100644 --- a/x-pack/plugins/alerting/server/alerts_client/alerts_client_fixtures.ts +++ b/x-pack/plugins/alerting/server/alerts_client/alerts_client_fixtures.ts @@ -72,8 +72,8 @@ export const getParamsByTimeQuery: GetSummarizedAlertsParams = { ruleId: 'ruleId', spaceId: 'default', excludedAlertInstanceIds: [], - end: new Date(), - start: new Date(), + end: new Date('2023-09-06T00:01:00.000'), + start: new Date('2023-09-06T00:00:00.000'), }; export const getExpectedQueryByExecutionUuid = ({ @@ -258,7 +258,7 @@ export const getExpectedQueryByTimeRange = ({ { range: { 'kibana.alert.start': { - lt: end, + lt: start, }, }, }, From 782ab866b5e7eb59e0dd13419a4f92c0aab4149e Mon Sep 17 00:00:00 2001 From: Kevin Logan <56395104+kevinlog@users.noreply.github.com> Date: Wed, 6 Sep 2023 07:38:44 -0400 Subject: [PATCH 09/97] [Security Solution] Unskip failing tests in Policy and Metadata (#165242) ## Summary Unskip tests that were skipped during a package release that was rolled back. ### 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 --- .../management/cypress/e2e/mocked_data/policy_response.cy.ts | 3 +-- .../test/security_solution_endpoint_api_int/apis/metadata.ts | 3 +-- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/x-pack/plugins/security_solution/public/management/cypress/e2e/mocked_data/policy_response.cy.ts b/x-pack/plugins/security_solution/public/management/cypress/e2e/mocked_data/policy_response.cy.ts index c8949b8c09077..cb846a62317fb 100644 --- a/x-pack/plugins/security_solution/public/management/cypress/e2e/mocked_data/policy_response.cy.ts +++ b/x-pack/plugins/security_solution/public/management/cypress/e2e/mocked_data/policy_response.cy.ts @@ -61,8 +61,7 @@ describe.skip('Endpoint Policy Response', () => { login(); }); - // TODO failing test skipped https://github.com/elastic/kibana/issues/162428 - describe.skip('from Fleet Agent Details page', () => { + describe('from Fleet Agent Details page', () => { it('should display policy response with errors', () => { navigateToFleetAgentDetails(endpointMetadata.agent.id); diff --git a/x-pack/test/security_solution_endpoint_api_int/apis/metadata.ts b/x-pack/test/security_solution_endpoint_api_int/apis/metadata.ts index 4eb92d2dee08b..b92a26e785127 100644 --- a/x-pack/test/security_solution_endpoint_api_int/apis/metadata.ts +++ b/x-pack/test/security_solution_endpoint_api_int/apis/metadata.ts @@ -44,8 +44,7 @@ export default function ({ getService }: FtrProviderContext) { const endpointTestResources = getService('endpointTestResources'); describe('test metadata apis', () => { - // FLAKY: https://github.com/elastic/kibana/issues/151854 - describe.skip('list endpoints GET route', () => { + describe('list endpoints GET route', () => { const numberOfHostsInFixture = 2; let agent1Timestamp: number; let agent2Timestamp: number; From b335c3abbcd776a5d9d6b4e042e2165478cc42ae Mon Sep 17 00:00:00 2001 From: Sander Philipse <94373878+sphilipse@users.noreply.github.com> Date: Wed, 6 Sep 2023 14:33:05 +0200 Subject: [PATCH 10/97] [Search] Extract connectors to package (#165590) ## Summary This moves connectors functions to a shared package so Serverless Search and Enterprise Search can both use it. --------- Co-authored-by: kibanamachine <42973632+kibanamachine@users.noreply.github.com> --- .github/CODEOWNERS | 1 + .i18nrc.json | 34 ++- config/serverless.es.yml | 7 +- package.json | 1 + packages/kbn-search-connectors/README.md | 3 + .../kbn-search-connectors}/connectors.ts | 53 ++-- packages/kbn-search-connectors/index.ts | 19 ++ packages/kbn-search-connectors/jest.config.js | 13 + packages/kbn-search-connectors/kibana.jsonc | 5 + .../lib/cancel_syncs.test.ts | 34 ++- .../kbn-search-connectors/lib/cancel_syncs.ts | 19 +- .../lib/create_connector.ts | 40 +++ .../lib}/create_connector_document.test.ts | 111 +------- .../lib}/create_connector_document.ts | 45 +--- .../lib}/delete_connector.test.ts | 24 +- .../lib/delete_connector.ts | 21 ++ .../lib/fetch_connector_index_names.ts | 29 ++ .../lib}/fetch_connectors.test.ts | 62 ++--- .../lib}/fetch_connectors.ts | 48 ++-- .../lib}/fetch_sync_jobs.test.ts | 26 +- .../lib}/fetch_sync_jobs.ts | 23 +- packages/kbn-search-connectors/lib/index.ts | 23 ++ .../lib/start_sync.test.ts | 242 +++++++++++++++++ .../kbn-search-connectors/lib/start_sync.ts | 91 +++++++ .../update_connector_configuration.test.ts | 26 +- .../lib}/update_connector_configuration.ts | 26 +- .../update_connector_name_and_description.ts | 21 +- .../lib}/update_connector_scheduling.test.ts | 36 ++- .../lib}/update_connector_scheduling.ts | 21 +- .../lib}/update_connector_service_type.ts | 21 +- .../lib/update_connector_status.ts | 41 +++ .../lib/update_filtering.ts | 18 +- .../lib/update_filtering_draft.ts | 18 +- .../lib/update_native.ts | 28 ++ packages/kbn-search-connectors/package.json | 6 + packages/kbn-search-connectors/tsconfig.json | 23 ++ .../types/connectors.ts | 5 +- packages/kbn-search-connectors/types/index.ts | 12 + .../types}/native_connectors.ts | 248 ++++++++---------- .../types/optimistic_concurrency.ts | 13 + .../kbn-search-connectors/types/pagination.ts | 22 ++ .../utils/fetch_with_pagination.test.ts | 125 +++++++++ .../utils/fetch_with_pagination.ts | 61 +++++ .../utils/identify_exceptions.test.ts | 82 ++++++ .../utils/identify_exceptions.ts | 50 ++++ packages/kbn-search-connectors/utils/index.ts | 9 + .../utils/is_category_entry.ts | 29 ++ .../utils/is_not_nullish.ts | 11 + tsconfig.base.json | 2 + .../common/connectors/is_category_entry.ts | 5 +- .../enterprise_search/common/constants.ts | 3 +- .../enterprise_search/common/types/crawler.ts | 2 +- .../enterprise_search/common/types/indices.ts | 3 +- .../__mocks__/pipeline.mock.ts | 2 +- .../__mocks__/search_indices.mock.ts | 7 +- .../__mocks__/sync_job.mock.ts | 8 +- .../__mocks__/view_index.mock.ts | 6 +- .../connector/fetch_sync_jobs_api_logic.ts | 3 +- .../get_default_pipeline_api_logic.ts | 2 +- ...pdate_connector_configuration_api_logic.ts | 3 +- .../update_connector_filtering_api_logic.ts | 3 +- ...ate_connector_filtering_draft_api_logic.ts | 3 +- ...onnector_name_and_description_api_logic.ts | 3 +- .../update_connector_scheduling_api_logic.ts | 3 +- .../update_default_pipeline_api_logic.ts | 2 +- .../connector/update_pipeline_api_logic.ts | 3 +- .../fetch_index_pipeline_parameters.ts | 3 +- .../components/curl_request/curl_request.tsx | 3 +- .../connector/connector_configuration.tsx | 3 +- .../connector_configuration_field.tsx | 3 +- .../connector_configuration_form_items.tsx | 2 +- .../connector_configuration_logic.test.ts | 2 +- .../connector_configuration_logic.ts | 5 +- .../connector_name_and_description_logic.ts | 3 +- .../connector/connector_scheduling.tsx | 2 +- .../connector_cron_editor.tsx | 3 +- .../connector_scheduling/full_content.tsx | 2 +- .../connector_scheduling_logic.test.ts | 2 +- .../connector/connector_scheduling_logic.ts | 3 +- .../search_index/connector/constants.ts | 2 +- .../native_connector_configuration_config.tsx | 2 +- .../sync_rules/connector_filtering_logic.tsx | 7 +- .../sync_rules/edit_sync_rules_flyout.tsx | 3 +- .../sync_rules/editable_basic_rules_table.tsx | 7 +- .../sync_rules/sync_rules_callouts.tsx | 2 +- .../search_index/connector/types.ts | 2 +- .../automatic_crawl_scheduler_logic.ts | 2 +- ...custom_settings_flyout_crawl_scheduler.tsx | 3 +- ...ustom_settings_flyout_multi_crawl_logic.ts | 3 +- .../crawler_configuration_logic.ts | 3 +- .../search_index/index_view_logic.test.ts | 2 +- .../search_index/index_view_logic.ts | 8 +- .../components/search_index/overview.logic.ts | 3 +- .../default_pipeline_item.tsx | 3 +- .../ingest_pipeline_flyout.tsx | 3 +- .../pipelines/pipeline_settings_form.tsx | 3 +- .../search_index/pipelines/pipelines_logic.ts | 3 +- .../sync_jobs/events_panel.test.tsx | 2 +- .../search_index/sync_jobs/events_panel.tsx | 3 +- .../sync_jobs/filtering_panel.test.tsx | 6 +- .../sync_jobs/filtering_panel.tsx | 2 +- .../search_index/sync_jobs/pipeline_panel.tsx | 2 +- .../sync_jobs/sync_callouts.test.tsx | 2 +- .../search_index/sync_jobs/sync_callouts.tsx | 3 +- .../sync_jobs/sync_jobs_history_table.tsx | 3 +- .../sync_jobs/sync_jobs_view_logic.test.ts | 7 +- .../sync_jobs/sync_jobs_view_logic.ts | 3 +- .../search_indices/indices_logic.test.ts | 3 +- .../search_indices/indices_table.tsx | 2 +- .../components/settings/settings_logic.ts | 3 +- .../filtering_rules_table.tsx | 6 +- .../utils/filtering_rule_helpers.ts | 2 +- .../utils/has_configured_configuration.ts | 3 +- .../utils/indices.test.ts | 3 +- .../utils/indices.ts | 3 +- .../utils/sync_status_to_text.test.ts | 2 +- .../utils/sync_status_to_text.ts | 2 +- .../enterprise_search_cron_editor.tsx | 2 +- .../server/api/connectors_service.ts | 54 ---- .../plugins/enterprise_search/server/index.ts | 6 +- .../lib/connectors/add_connector.test.ts | 234 ++++------------- .../server/lib/connectors/add_connector.ts | 87 +++--- .../server/lib/connectors/delete_connector.ts | 22 -- .../connectors/fetch_connector_index_names.ts | 28 -- .../lib/connectors/put_update_native.ts | 27 -- .../server/lib/connectors/start_sync.test.ts | 52 ++-- .../server/lib/connectors/start_sync.ts | 59 ++--- .../lib/connectors/update_connector_status.ts | 40 --- .../fetch_crawler_multiple_schedules.ts | 3 +- .../server/lib/crawler/fetch_crawlers.ts | 3 +- .../server/lib/crawler/post_connector.test.ts | 3 +- .../server/lib/crawler/post_connector.ts | 7 +- .../lib/crawler/put_html_extraction.test.ts | 3 +- .../server/lib/crawler/put_html_extraction.ts | 3 +- .../server/lib/indices/fetch_index.test.ts | 30 +-- .../server/lib/indices/fetch_index.ts | 13 +- .../lib/indices/generate_api_key.test.ts | 2 +- .../server/lib/indices/generate_api_key.ts | 4 +- .../lib/pipelines/get_default_pipeline.ts | 4 +- .../lib/pipelines/get_index_pipeline.ts | 12 +- .../lib/pipelines/revert_custom_pipeline.ts | 6 +- .../lib/pipelines/update_default_pipeline.ts | 3 +- .../server/lib/pipelines/update_pipeline.ts | 4 +- .../server/lib/stats/get_sync_jobs.ts | 9 +- .../enterprise_search/server/plugin.ts | 33 +-- .../routes/enterprise_search/connectors.ts | 67 +++-- .../enterprise_search/crawler/crawler.ts | 26 +- .../routes/enterprise_search/indices.ts | 20 +- .../server/utils/search_result_provider.ts | 6 +- .../plugins/enterprise_search/tsconfig.json | 3 +- x-pack/plugins/serverless_search/kibana.jsonc | 11 +- .../components/connectors_overview.tsx | 3 +- .../application/components/overview.tsx | 2 +- .../serverless_search/server/plugin.ts | 9 +- .../server/routes/connectors_routes.ts | 15 +- .../plugins/serverless_search/server/types.ts | 2 - .../plugins/serverless_search/tsconfig.json | 2 +- .../translations/translations/fr-FR.json | 205 +++++---------- .../translations/translations/ja-JP.json | 205 +++++---------- .../translations/translations/zh-CN.json | 205 +++++---------- yarn.lock | 4 + 161 files changed, 2016 insertions(+), 1670 deletions(-) create mode 100644 packages/kbn-search-connectors/README.md rename {x-pack/plugins/enterprise_search/common/connectors => packages/kbn-search-connectors}/connectors.ts (70%) create mode 100644 packages/kbn-search-connectors/index.ts create mode 100644 packages/kbn-search-connectors/jest.config.js create mode 100644 packages/kbn-search-connectors/kibana.jsonc rename x-pack/plugins/enterprise_search/server/lib/connectors/post_cancel_syncs.test.ts => packages/kbn-search-connectors/lib/cancel_syncs.test.ts (67%) rename x-pack/plugins/enterprise_search/server/lib/connectors/post_cancel_syncs.ts => packages/kbn-search-connectors/lib/cancel_syncs.ts (76%) create mode 100644 packages/kbn-search-connectors/lib/create_connector.ts rename {x-pack/plugins/enterprise_search/server/utils => packages/kbn-search-connectors/lib}/create_connector_document.test.ts (50%) rename {x-pack/plugins/enterprise_search/server/utils => packages/kbn-search-connectors/lib}/create_connector_document.ts (71%) rename {x-pack/plugins/enterprise_search/server/lib/connectors => packages/kbn-search-connectors/lib}/delete_connector.test.ts (54%) create mode 100644 packages/kbn-search-connectors/lib/delete_connector.ts create mode 100644 packages/kbn-search-connectors/lib/fetch_connector_index_names.ts rename {x-pack/plugins/enterprise_search/server/lib/connectors => packages/kbn-search-connectors/lib}/fetch_connectors.test.ts (70%) rename {x-pack/plugins/enterprise_search/server/lib/connectors => packages/kbn-search-connectors/lib}/fetch_connectors.ts (55%) rename {x-pack/plugins/enterprise_search/server/lib/connectors => packages/kbn-search-connectors/lib}/fetch_sync_jobs.test.ts (82%) rename {x-pack/plugins/enterprise_search/server/lib/connectors => packages/kbn-search-connectors/lib}/fetch_sync_jobs.ts (71%) create mode 100644 packages/kbn-search-connectors/lib/index.ts create mode 100644 packages/kbn-search-connectors/lib/start_sync.test.ts create mode 100644 packages/kbn-search-connectors/lib/start_sync.ts rename {x-pack/plugins/enterprise_search/server/lib/connectors => packages/kbn-search-connectors/lib}/update_connector_configuration.test.ts (69%) rename {x-pack/plugins/enterprise_search/server/lib/connectors => packages/kbn-search-connectors/lib}/update_connector_configuration.ts (71%) rename {x-pack/plugins/enterprise_search/server/lib/connectors => packages/kbn-search-connectors/lib}/update_connector_name_and_description.ts (52%) rename {x-pack/plugins/enterprise_search/server/lib/connectors => packages/kbn-search-connectors/lib}/update_connector_scheduling.test.ts (76%) rename {x-pack/plugins/enterprise_search/server/lib/connectors => packages/kbn-search-connectors/lib}/update_connector_scheduling.ts (50%) rename {x-pack/plugins/enterprise_search/server/lib/connectors => packages/kbn-search-connectors/lib}/update_connector_service_type.ts (51%) create mode 100644 packages/kbn-search-connectors/lib/update_connector_status.ts rename x-pack/plugins/enterprise_search/server/lib/connectors/put_update_filtering.ts => packages/kbn-search-connectors/lib/update_filtering.ts (80%) rename x-pack/plugins/enterprise_search/server/lib/connectors/put_update_filtering_draft.ts => packages/kbn-search-connectors/lib/update_filtering_draft.ts (80%) create mode 100644 packages/kbn-search-connectors/lib/update_native.ts create mode 100644 packages/kbn-search-connectors/package.json create mode 100644 packages/kbn-search-connectors/tsconfig.json rename {x-pack/plugins/enterprise_search/common => packages/kbn-search-connectors}/types/connectors.ts (97%) create mode 100644 packages/kbn-search-connectors/types/index.ts rename {x-pack/plugins/enterprise_search/common/connectors => packages/kbn-search-connectors/types}/native_connectors.ts (83%) create mode 100644 packages/kbn-search-connectors/types/optimistic_concurrency.ts create mode 100644 packages/kbn-search-connectors/types/pagination.ts create mode 100644 packages/kbn-search-connectors/utils/fetch_with_pagination.test.ts create mode 100644 packages/kbn-search-connectors/utils/fetch_with_pagination.ts create mode 100644 packages/kbn-search-connectors/utils/identify_exceptions.test.ts create mode 100644 packages/kbn-search-connectors/utils/identify_exceptions.ts create mode 100644 packages/kbn-search-connectors/utils/index.ts create mode 100644 packages/kbn-search-connectors/utils/is_category_entry.ts create mode 100644 packages/kbn-search-connectors/utils/is_not_nullish.ts delete mode 100644 x-pack/plugins/enterprise_search/server/api/connectors_service.ts delete mode 100644 x-pack/plugins/enterprise_search/server/lib/connectors/delete_connector.ts delete mode 100644 x-pack/plugins/enterprise_search/server/lib/connectors/fetch_connector_index_names.ts delete mode 100644 x-pack/plugins/enterprise_search/server/lib/connectors/put_update_native.ts delete mode 100644 x-pack/plugins/enterprise_search/server/lib/connectors/update_connector_status.ts diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index cd4fe15e8827c..b88935d43b3c1 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -596,6 +596,7 @@ src/plugins/screenshot_mode @elastic/appex-sharedux x-pack/examples/screenshotting_example @elastic/appex-sharedux x-pack/plugins/screenshotting @elastic/kibana-reporting-services packages/kbn-search-api-panels @elastic/enterprise-search-frontend +packages/kbn-search-connectors @elastic/enterprise-search-frontend examples/search_examples @elastic/kibana-data-discovery packages/kbn-search-response-warnings @elastic/kibana-data-discovery x-pack/plugins/searchprofiler @elastic/platform-deployment-management diff --git a/.i18nrc.json b/.i18nrc.json index eb098a7011a15..373f28219a8cb 100644 --- a/.i18nrc.json +++ b/.i18nrc.json @@ -6,12 +6,17 @@ "apmOss": "src/plugins/apm_oss", "autocomplete": "packages/kbn-securitysolution-autocomplete/src", "bfetch": "src/plugins/bfetch", - "cases": ["packages/kbn-cases-components"], + "cases": [ + "packages/kbn-cases-components" + ], "cellActions": "packages/kbn-cell-actions", "charts": "src/plugins/charts", "console": "src/plugins/console", "contentManagement": "packages/content-management", - "core": ["src/core", "packages/core"], + "core": [ + "src/core", + "packages/core" + ], "customIntegrations": "src/plugins/custom_integrations", "dashboard": "src/plugins/dashboard", "domDragDrop": "packages/kbn-dom-drag-drop", @@ -21,7 +26,10 @@ "dataViews": "src/plugins/data_views", "defaultNavigation": "packages/default-nav", "devTools": "src/plugins/dev_tools", - "discover": ["src/plugins/discover", "packages/kbn-discover-utils"], + "discover": [ + "src/plugins/discover", + "packages/kbn-discover-utils" + ], "savedSearch": "src/plugins/saved_search", "embeddableApi": "src/plugins/embeddable", "embeddableExamples": "examples/embeddable_examples", @@ -89,6 +97,7 @@ "savedObjects": "src/plugins/saved_objects", "savedObjectsFinder": "src/plugins/saved_objects_finder", "savedObjectsManagement": "src/plugins/saved_objects_management", + "searchConnectors": "packages/kbn-search-connectors", "server": "src/legacy/server", "share": "src/plugins/share", "sharedUXPackages": "packages/shared-ux", @@ -100,9 +109,17 @@ "languageDocumentationPopover": "packages/kbn-language-documentation-popover/src", "textBasedLanguages": "src/plugins/text_based_languages", "statusPage": "src/legacy/core_plugins/status_page", - "telemetry": ["src/plugins/telemetry", "src/plugins/telemetry_management_section"], - "timelion": ["src/plugins/vis_types/timelion"], - "uiActions": ["src/plugins/ui_actions", "packages/kbn-ui-actions-browser"], + "telemetry": [ + "src/plugins/telemetry", + "src/plugins/telemetry_management_section" + ], + "timelion": [ + "src/plugins/vis_types/timelion" + ], + "uiActions": [ + "src/plugins/ui_actions", + "packages/kbn-ui-actions-browser" + ], "uiActionsEnhanced": "src/plugins/ui_actions_enhanced", "uiActionsExamples": "examples/ui_action_examples", "usageCollection": "src/plugins/usage_collection", @@ -122,7 +139,10 @@ "visTypeXy": "src/plugins/vis_types/xy", "visualizations": "src/plugins/visualizations", "visualizationUiComponents": "packages/kbn-visualization-ui-components", - "unifiedDocViewer": ["src/plugins/unified_doc_viewer", "packages/kbn-unified-doc-viewer"], + "unifiedDocViewer": [ + "src/plugins/unified_doc_viewer", + "packages/kbn-unified-doc-viewer" + ], "unifiedSearch": "src/plugins/unified_search", "unifiedFieldList": "packages/kbn-unified-field-list", "unifiedHistogram": "src/plugins/unified_histogram", diff --git a/config/serverless.es.yml b/config/serverless.es.yml index 7a1da782855bd..fe5575c5fee1e 100644 --- a/config/serverless.es.yml +++ b/config/serverless.es.yml @@ -9,12 +9,7 @@ xpack.observability.enabled: false xpack.securitySolution.enabled: false xpack.serverless.observability.enabled: false xpack.uptime.enabled: false -enterpriseSearch.enabled: true -enterpriseSearch.canDeployEntSearch: false -enterpriseSearch.hasConnectors: true -enterpriseSearch.hasNativeConnectors: false -enterpriseSearch.hasWebCrawler: false -enterpriseSearch.ui.enabled: false +enterpriseSearch.enabled: false monitoring.ui.enabled: false xpack.fleet.enabled: false diff --git a/package.json b/package.json index 80d1b5b6faf59..20507f57e6134 100644 --- a/package.json +++ b/package.json @@ -602,6 +602,7 @@ "@kbn/screenshotting-example-plugin": "link:x-pack/examples/screenshotting_example", "@kbn/screenshotting-plugin": "link:x-pack/plugins/screenshotting", "@kbn/search-api-panels": "link:packages/kbn-search-api-panels", + "@kbn/search-connectors": "link:packages/kbn-search-connectors", "@kbn/search-examples-plugin": "link:examples/search_examples", "@kbn/search-response-warnings": "link:packages/kbn-search-response-warnings", "@kbn/searchprofiler-plugin": "link:x-pack/plugins/searchprofiler", diff --git a/packages/kbn-search-connectors/README.md b/packages/kbn-search-connectors/README.md new file mode 100644 index 0000000000000..5233a782a964f --- /dev/null +++ b/packages/kbn-search-connectors/README.md @@ -0,0 +1,3 @@ +# @kbn/search-connectors + +Empty package generated by @kbn/generate diff --git a/x-pack/plugins/enterprise_search/common/connectors/connectors.ts b/packages/kbn-search-connectors/connectors.ts similarity index 70% rename from x-pack/plugins/enterprise_search/common/connectors/connectors.ts rename to packages/kbn-search-connectors/connectors.ts index 1fc6c6e7f5c77..119de69a0c5c0 100644 --- a/x-pack/plugins/enterprise_search/common/connectors/connectors.ts +++ b/packages/kbn-search-connectors/connectors.ts @@ -1,8 +1,9 @@ /* * 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. + * 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'; @@ -17,13 +18,17 @@ export interface ConnectorServerSideDefinition { serviceType: string; } +/* The consumer should host these icons and transform the iconPath into something usable + * Enterprise Search and Serverless Search do this right now + */ + export const CONNECTOR_DEFINITIONS: ConnectorServerSideDefinition[] = [ { iconPath: 'azure_blob_storage.svg', isBeta: true, isNative: true, keywords: ['cloud', 'azure', 'blob', 's3', 'connector'], - name: i18n.translate('xpack.enterpriseSearch.content.nativeConnectors.azureBlob.name', { + name: i18n.translate('searchConnectors.content.nativeConnectors.azureBlob.name', { defaultMessage: 'Azure Blob Storage', }), serviceType: 'azure_blob_storage', @@ -33,7 +38,7 @@ export const CONNECTOR_DEFINITIONS: ConnectorServerSideDefinition[] = [ isBeta: false, isNative: true, keywords: ['confluence', 'cloud', 'connector'], - name: i18n.translate('xpack.enterpriseSearch.content.nativeConnectors.confluence.name', { + name: i18n.translate('searchConnectors.content.nativeConnectors.confluence.name', { defaultMessage: 'Confluence Cloud & Server', }), serviceType: 'confluence', @@ -44,7 +49,7 @@ export const CONNECTOR_DEFINITIONS: ConnectorServerSideDefinition[] = [ isNative: true, isTechPreview: false, keywords: ['dropbox', 'connector'], - name: i18n.translate('xpack.enterpriseSearch.content.nativeConnectors.dropbox.name', { + name: i18n.translate('searchConnectors.content.nativeConnectors.dropbox.name', { defaultMessage: 'Dropbox', }), serviceType: 'dropbox', @@ -54,7 +59,7 @@ export const CONNECTOR_DEFINITIONS: ConnectorServerSideDefinition[] = [ isBeta: false, isNative: true, keywords: ['jira', 'cloud', 'connector'], - name: i18n.translate('xpack.enterpriseSearch.content.nativeConnectors.jira.name', { + name: i18n.translate('searchConnectors.content.nativeConnectors.jira.name', { defaultMessage: 'Jira Cloud & Server', }), serviceType: 'jira', @@ -64,7 +69,7 @@ export const CONNECTOR_DEFINITIONS: ConnectorServerSideDefinition[] = [ isBeta: true, isNative: false, keywords: ['github', 'cloud', 'connector'], - name: i18n.translate('xpack.enterpriseSearch.content.nativeConnectors.github.name', { + name: i18n.translate('searchConnectors.content.nativeConnectors.github.name', { defaultMessage: 'GitHub & GitHub Enterprise Server', }), serviceType: 'github', @@ -74,7 +79,7 @@ export const CONNECTOR_DEFINITIONS: ConnectorServerSideDefinition[] = [ isBeta: true, isNative: false, keywords: ['google', 'cloud', 'blob', 's3', 'connector'], - name: i18n.translate('xpack.enterpriseSearch.content.nativeConnectors.googleCloud.name', { + name: i18n.translate('searchConnectors.content.nativeConnectors.googleCloud.name', { defaultMessage: 'Google Cloud Storage', }), serviceType: 'google_cloud_storage', @@ -84,7 +89,7 @@ export const CONNECTOR_DEFINITIONS: ConnectorServerSideDefinition[] = [ isBeta: true, isNative: false, keywords: ['google', 'drive', 'connector'], - name: i18n.translate('xpack.enterpriseSearch.content.nativeConnectors.googleDrive.name', { + name: i18n.translate('searchConnectors.content.nativeConnectors.googleDrive.name', { defaultMessage: 'Google Drive', }), serviceType: 'google_drive', @@ -94,7 +99,7 @@ export const CONNECTOR_DEFINITIONS: ConnectorServerSideDefinition[] = [ isBeta: false, isNative: true, keywords: ['mongo', 'mongodb', 'database', 'nosql', 'connector'], - name: i18n.translate('xpack.enterpriseSearch.content.nativeConnectors.mongodb.name', { + name: i18n.translate('searchConnectors.content.nativeConnectors.mongodb.name', { defaultMessage: 'MongoDB', }), serviceType: 'mongodb', @@ -104,7 +109,7 @@ export const CONNECTOR_DEFINITIONS: ConnectorServerSideDefinition[] = [ isBeta: false, isNative: true, keywords: ['mysql', 'sql', 'database', 'connector'], - name: i18n.translate('xpack.enterpriseSearch.content.nativeConnectors.mysql.name', { + name: i18n.translate('searchConnectors.content.nativeConnectors.mysql.name', { defaultMessage: 'MySQL', }), serviceType: 'mysql', @@ -114,7 +119,7 @@ export const CONNECTOR_DEFINITIONS: ConnectorServerSideDefinition[] = [ isBeta: true, isNative: true, keywords: ['mssql', 'microsoft', 'sql', 'database', 'connector'], - name: i18n.translate('xpack.enterpriseSearch.content.nativeConnectors.microsoftSQL.name', { + name: i18n.translate('searchConnectors.content.nativeConnectors.microsoftSQL.name', { defaultMessage: 'Microsoft SQL', }), serviceType: 'mssql', @@ -124,7 +129,7 @@ export const CONNECTOR_DEFINITIONS: ConnectorServerSideDefinition[] = [ isBeta: false, isNative: true, keywords: ['network', 'drive', 'file', 'directory', 'connector'], - name: i18n.translate('xpack.enterpriseSearch.content.nativeConnectors.networkDrive.name', { + name: i18n.translate('searchConnectors.content.nativeConnectors.networkDrive.name', { defaultMessage: 'Network drive', }), serviceType: 'network_drive', @@ -134,7 +139,7 @@ export const CONNECTOR_DEFINITIONS: ConnectorServerSideDefinition[] = [ isBeta: true, isNative: true, keywords: ['postgresql', 'sql', 'database', 'connector'], - name: i18n.translate('xpack.enterpriseSearch.content.nativeConnectors.postgresql.name', { + name: i18n.translate('searchConnectors.content.nativeConnectors.postgresql.name', { defaultMessage: 'PostgreSQL', }), serviceType: 'postgresql', @@ -145,7 +150,7 @@ export const CONNECTOR_DEFINITIONS: ConnectorServerSideDefinition[] = [ isNative: false, isTechPreview: false, keywords: ['salesforce', 'cloud', 'connector'], - name: i18n.translate('xpack.enterpriseSearch.content.nativeConnectors.salesforce.name', { + name: i18n.translate('searchConnectors.content.nativeConnectors.salesforce.name', { defaultMessage: 'Salesforce', }), serviceType: 'salesforce', @@ -156,7 +161,7 @@ export const CONNECTOR_DEFINITIONS: ConnectorServerSideDefinition[] = [ isNative: true, isTechPreview: false, keywords: ['servicenow', 'cloud', 'connector'], - name: i18n.translate('xpack.enterpriseSearch.content.nativeConnectors.serviceNow.name', { + name: i18n.translate('searchConnectors.content.nativeConnectors.serviceNow.name', { defaultMessage: 'ServiceNow', }), serviceType: 'servicenow', @@ -167,7 +172,7 @@ export const CONNECTOR_DEFINITIONS: ConnectorServerSideDefinition[] = [ isNative: true, isTechPreview: false, keywords: ['sharepoint', 'office365', 'cloud', 'connector'], - name: i18n.translate('xpack.enterpriseSearch.content.nativeConnectors.sharepoint_online.name', { + name: i18n.translate('searchConnectors.content.nativeConnectors.sharepoint_online.name', { defaultMessage: 'Sharepoint Online', }), serviceType: 'sharepoint_online', @@ -178,7 +183,7 @@ export const CONNECTOR_DEFINITIONS: ConnectorServerSideDefinition[] = [ isNative: false, isTechPreview: true, keywords: ['google', 'gmail', 'connector', 'mail'], - name: i18n.translate('xpack.enterpriseSearch.content.nativeConnectors.gmail.name', { + name: i18n.translate('searchConnectors.content.nativeConnectors.gmail.name', { defaultMessage: 'Gmail', }), serviceType: 'gmail', @@ -188,7 +193,7 @@ export const CONNECTOR_DEFINITIONS: ConnectorServerSideDefinition[] = [ isBeta: true, isNative: false, keywords: ['oracle', 'sql', 'database', 'connector'], - name: i18n.translate('xpack.enterpriseSearch.content.nativeConnectors.oracle.name', { + name: i18n.translate('searchConnectors.content.nativeConnectors.oracle.name', { defaultMessage: 'Oracle', }), serviceType: 'oracle', @@ -198,7 +203,7 @@ export const CONNECTOR_DEFINITIONS: ConnectorServerSideDefinition[] = [ isBeta: true, isNative: false, keywords: ['network', 'drive', 'file', 'connector'], - name: i18n.translate('xpack.enterpriseSearch.content.nativeConnectors.oneDrive.name', { + name: i18n.translate('searchConnectors.content.nativeConnectors.oneDrive.name', { defaultMessage: 'OneDrive', }), serviceType: 'onedrive', @@ -208,7 +213,7 @@ export const CONNECTOR_DEFINITIONS: ConnectorServerSideDefinition[] = [ isBeta: true, isNative: false, keywords: ['s3', 'cloud', 'amazon', 'connector'], - name: i18n.translate('xpack.enterpriseSearch.content.nativeConnectors.s3.name', { + name: i18n.translate('searchConnectors.content.nativeConnectors.s3.name', { defaultMessage: 'S3', }), serviceType: 's3', @@ -219,7 +224,7 @@ export const CONNECTOR_DEFINITIONS: ConnectorServerSideDefinition[] = [ isNative: false, isTechPreview: true, keywords: ['slack', 'connector'], - name: i18n.translate('xpack.enterpriseSearch.content.nativeConnectors.slack.name', { + name: i18n.translate('searchConnectors.content.nativeConnectors.slack.name', { defaultMessage: 'Slack', }), serviceType: 'slack', @@ -230,7 +235,7 @@ export const CONNECTOR_DEFINITIONS: ConnectorServerSideDefinition[] = [ isNative: false, isTechPreview: false, keywords: ['sharepoint', 'cloud', 'connector'], - name: i18n.translate('xpack.enterpriseSearch.content.nativeConnectors.sharepointServer.name', { + name: i18n.translate('searchConnectors.content.nativeConnectors.sharepointServer.name', { defaultMessage: 'Sharepoint Server', }), serviceType: 'sharepoint_server', @@ -240,7 +245,7 @@ export const CONNECTOR_DEFINITIONS: ConnectorServerSideDefinition[] = [ isBeta: true, isNative: false, keywords: ['custom', 'connector', 'code'], - name: i18n.translate('xpack.enterpriseSearch.content.nativeConnectors.customConnector.name', { + name: i18n.translate('searchConnectors.content.nativeConnectors.customConnector.name', { defaultMessage: 'Customized connector', }), serviceType: '', diff --git a/packages/kbn-search-connectors/index.ts b/packages/kbn-search-connectors/index.ts new file mode 100644 index 0000000000000..f232081031fb6 --- /dev/null +++ b/packages/kbn-search-connectors/index.ts @@ -0,0 +1,19 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 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 const CONNECTORS_INDEX = '.elastic-connectors'; +export const CURRENT_CONNECTORS_INDEX = '.elastic-connectors-v1'; +export const CONNECTORS_JOBS_INDEX = '.elastic-connectors-sync-jobs'; +export const CURRENT_CONNECTORS_JOB_INDEX = '.elastic-connectors-sync-jobs-v1'; +export const CONNECTORS_VERSION = 1; +export const CONNECTORS_ACCESS_CONTROL_INDEX_PREFIX = '.search-acl-filter-'; + +export * from './connectors'; +export * from './lib'; +export * from './types'; +export * from './utils'; diff --git a/packages/kbn-search-connectors/jest.config.js b/packages/kbn-search-connectors/jest.config.js new file mode 100644 index 0000000000000..99c132b768bfe --- /dev/null +++ b/packages/kbn-search-connectors/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/kbn-search-connectors'], +}; diff --git a/packages/kbn-search-connectors/kibana.jsonc b/packages/kbn-search-connectors/kibana.jsonc new file mode 100644 index 0000000000000..4c1162ed0300b --- /dev/null +++ b/packages/kbn-search-connectors/kibana.jsonc @@ -0,0 +1,5 @@ +{ + "type": "shared-common", + "id": "@kbn/search-connectors", + "owner": "@elastic/enterprise-search-frontend" +} diff --git a/x-pack/plugins/enterprise_search/server/lib/connectors/post_cancel_syncs.test.ts b/packages/kbn-search-connectors/lib/cancel_syncs.test.ts similarity index 67% rename from x-pack/plugins/enterprise_search/server/lib/connectors/post_cancel_syncs.test.ts rename to packages/kbn-search-connectors/lib/cancel_syncs.test.ts index 0c528b6b8290e..05c2f5fcd529d 100644 --- a/x-pack/plugins/enterprise_search/server/lib/connectors/post_cancel_syncs.test.ts +++ b/packages/kbn-search-connectors/lib/cancel_syncs.test.ts @@ -1,24 +1,22 @@ /* * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. + * 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 { IScopedClusterClient } from '@kbn/core/server'; +import { ElasticsearchClient } from '@kbn/core/server'; -import { CONNECTORS_INDEX, CONNECTORS_JOBS_INDEX } from '../..'; -import { SyncStatus } from '../../../common/types/connectors'; +import { CONNECTORS_INDEX, CONNECTORS_JOBS_INDEX } from '..'; +import { SyncStatus } from '../types/connectors'; -import { cancelSyncs } from './post_cancel_syncs'; +import { cancelSyncs } from './cancel_syncs'; -describe('addConnector lib function', () => { +describe('cancelSync lib function', () => { const mockClient = { - asCurrentUser: { - update: jest.fn(), - updateByQuery: jest.fn(), - }, - asInternalUser: {}, + update: jest.fn(), + updateByQuery: jest.fn(), }; beforeEach(() => { @@ -28,13 +26,13 @@ describe('addConnector lib function', () => { }); it('should call updateByQuery to cancel syncs', async () => { - mockClient.asCurrentUser.updateByQuery.mockImplementation(() => ({ _id: 'fakeId' })); + mockClient.updateByQuery.mockImplementation(() => ({ _id: 'fakeId' })); await expect( - cancelSyncs(mockClient as unknown as IScopedClusterClient, 'connectorId') + cancelSyncs(mockClient as unknown as ElasticsearchClient, 'connectorId') ).resolves.toEqual(undefined); - expect(mockClient.asCurrentUser.updateByQuery).toHaveBeenCalledTimes(2); - expect(mockClient.asCurrentUser.updateByQuery).toHaveBeenCalledWith({ + expect(mockClient.updateByQuery).toHaveBeenCalledTimes(2); + expect(mockClient.updateByQuery).toHaveBeenCalledWith({ index: CONNECTORS_JOBS_INDEX, query: { bool: { @@ -60,7 +58,7 @@ ctx._source['canceled_at'] = '${new Date(Date.now()).toISOString()}'; ctx._source['completed_at'] = '${new Date(Date.now()).toISOString()}';`, }, }); - expect(mockClient.asCurrentUser.updateByQuery).toHaveBeenCalledWith({ + expect(mockClient.updateByQuery).toHaveBeenCalledWith({ index: CONNECTORS_JOBS_INDEX, query: { bool: { @@ -84,7 +82,7 @@ ctx._source['completed_at'] = '${new Date(Date.now()).toISOString()}';`, ctx._source['cancelation_requested_at'] = '${new Date(Date.now()).toISOString()}';`, }, }); - await expect(mockClient.asCurrentUser.update).toHaveBeenCalledWith({ + await expect(mockClient.update).toHaveBeenCalledWith({ doc: { last_sync_status: SyncStatus.CANCELED, sync_now: false }, id: 'connectorId', index: CONNECTORS_INDEX, diff --git a/x-pack/plugins/enterprise_search/server/lib/connectors/post_cancel_syncs.ts b/packages/kbn-search-connectors/lib/cancel_syncs.ts similarity index 76% rename from x-pack/plugins/enterprise_search/server/lib/connectors/post_cancel_syncs.ts rename to packages/kbn-search-connectors/lib/cancel_syncs.ts index ef5327d4db374..2a331e19d4cb7 100644 --- a/x-pack/plugins/enterprise_search/server/lib/connectors/post_cancel_syncs.ts +++ b/packages/kbn-search-connectors/lib/cancel_syncs.ts @@ -1,20 +1,21 @@ /* * 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. + * 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 { IScopedClusterClient } from '@kbn/core-elasticsearch-server'; +import { ElasticsearchClient } from '@kbn/core-elasticsearch-server'; -import { CONNECTORS_INDEX, CONNECTORS_JOBS_INDEX } from '../..'; -import { SyncStatus } from '../../../common/types/connectors'; +import { CONNECTORS_INDEX, CONNECTORS_JOBS_INDEX } from '..'; +import { SyncStatus } from '../types/connectors'; export const cancelSyncs = async ( - client: IScopedClusterClient, + client: ElasticsearchClient, connectorId: string ): Promise => { - await client.asCurrentUser.updateByQuery({ + await client.updateByQuery({ index: CONNECTORS_JOBS_INDEX, query: { bool: { @@ -40,7 +41,7 @@ ctx._source['canceled_at'] = '${new Date(Date.now()).toISOString()}'; ctx._source['completed_at'] = '${new Date(Date.now()).toISOString()}';`, }, }); - await client.asCurrentUser.updateByQuery({ + await client.updateByQuery({ index: CONNECTORS_JOBS_INDEX, query: { bool: { @@ -64,7 +65,7 @@ ctx._source['completed_at'] = '${new Date(Date.now()).toISOString()}';`, ctx._source['cancelation_requested_at'] = '${new Date(Date.now()).toISOString()}';`, }, }); - await client.asCurrentUser.update({ + await client.update({ doc: { last_sync_status: SyncStatus.CANCELED, sync_now: false }, id: connectorId, index: CONNECTORS_INDEX, diff --git a/packages/kbn-search-connectors/lib/create_connector.ts b/packages/kbn-search-connectors/lib/create_connector.ts new file mode 100644 index 0000000000000..d4ff1230727c8 --- /dev/null +++ b/packages/kbn-search-connectors/lib/create_connector.ts @@ -0,0 +1,40 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 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 { ElasticsearchClient } from '@kbn/core/server'; +import { CURRENT_CONNECTORS_INDEX } from '..'; + +import { Connector, ConnectorConfiguration, IngestPipelineParams } from '../types/connectors'; +import { createConnectorDocument } from './create_connector_document'; + +export const createConnector = async ( + client: ElasticsearchClient, + input: { + configuration?: ConnectorConfiguration; + features?: Connector['features']; + indexName: string | null; + isNative: boolean; + language: string | null; + name?: string; + pipeline: IngestPipelineParams; + serviceType?: string | null; + } +): Promise => { + const document = createConnectorDocument({ + ...input, + serviceType: input.serviceType || null, + }); + + const result = await client.index({ + document, + index: CURRENT_CONNECTORS_INDEX, + refresh: 'wait_for', + }); + + return { ...document, id: result._id }; +}; diff --git a/x-pack/plugins/enterprise_search/server/utils/create_connector_document.test.ts b/packages/kbn-search-connectors/lib/create_connector_document.test.ts similarity index 50% rename from x-pack/plugins/enterprise_search/server/utils/create_connector_document.test.ts rename to packages/kbn-search-connectors/lib/create_connector_document.test.ts index 458d223ce24b4..aa1c54c3c90ea 100644 --- a/x-pack/plugins/enterprise_search/server/utils/create_connector_document.test.ts +++ b/packages/kbn-search-connectors/lib/create_connector_document.test.ts @@ -1,11 +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; you may not use this file except in compliance with the Elastic License - * 2.0. + * 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 { ConnectorStatus } from '../../common/types/connectors'; +import { ConnectorStatus } from '../types/connectors'; import { createConnectorDocument } from './create_connector_document'; @@ -16,6 +17,7 @@ describe('createConnectorDocument', () => { indexName: 'indexName', isNative: false, language: 'fr', + name: 'indexName-name', pipeline: { extract_binary_content: true, name: 'ent-search-generic-ingestion', @@ -94,108 +96,7 @@ describe('createConnectorDocument', () => { last_sync_scheduled_at: null, last_sync_status: null, last_synced: null, - name: 'indexName', - pipeline: { - extract_binary_content: true, - name: 'ent-search-generic-ingestion', - reduce_whitespace: true, - run_ml_inference: false, - }, - scheduling: { - access_control: { enabled: false, interval: '0 0 0 * * ?' }, - full: { enabled: false, interval: '0 0 0 * * ?' }, - incremental: { enabled: false, interval: '0 0 0 * * ?' }, - }, - service_type: null, - status: ConnectorStatus.CREATED, - sync_now: false, - }); - }); - it('should remove search- from name', () => { - expect( - createConnectorDocument({ - indexName: 'search-indexName', - isNative: false, - language: 'fr', - pipeline: { - extract_binary_content: true, - name: 'ent-search-generic-ingestion', - reduce_whitespace: true, - run_ml_inference: false, - }, - serviceType: null, - }) - ).toEqual({ - api_key_id: null, - configuration: {}, - custom_scheduling: {}, - description: null, - error: null, - features: null, - filtering: [ - { - active: { - advanced_snippet: { - created_at: expect.any(String), - updated_at: expect.any(String), - value: {}, - }, - rules: [ - { - created_at: expect.any(String), - field: '_', - id: 'DEFAULT', - order: 0, - policy: 'include', - rule: 'regex', - updated_at: expect.any(String), - value: '.*', - }, - ], - validation: { - errors: [], - state: 'valid', - }, - }, - domain: 'DEFAULT', - draft: { - advanced_snippet: { - created_at: expect.any(String), - updated_at: expect.any(String), - value: {}, - }, - rules: [ - { - created_at: expect.any(String), - field: '_', - id: 'DEFAULT', - order: 0, - policy: 'include', - rule: 'regex', - updated_at: expect.any(String), - value: '.*', - }, - ], - validation: { - errors: [], - state: 'valid', - }, - }, - }, - ], - index_name: 'search-indexName', - is_native: false, - language: 'fr', - last_access_control_sync_error: null, - last_access_control_sync_scheduled_at: null, - last_access_control_sync_status: null, - last_incremental_sync_scheduled_at: null, - last_seen: null, - last_sync_error: null, - last_sync_scheduled_at: null, - last_sync_status: null, - last_synced: null, - name: 'indexName', + name: 'indexName-name', pipeline: { extract_binary_content: true, name: 'ent-search-generic-ingestion', diff --git a/x-pack/plugins/enterprise_search/server/utils/create_connector_document.ts b/packages/kbn-search-connectors/lib/create_connector_document.ts similarity index 71% rename from x-pack/plugins/enterprise_search/server/utils/create_connector_document.ts rename to packages/kbn-search-connectors/lib/create_connector_document.ts index 8b3883eac5be9..c5654e9a2436a 100644 --- a/x-pack/plugins/enterprise_search/server/utils/create_connector_document.ts +++ b/packages/kbn-search-connectors/lib/create_connector_document.ts @@ -1,24 +1,25 @@ /* * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. + * 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 { NATIVE_CONNECTOR_DEFINITIONS } from '../../common/connectors/native_connectors'; -import { ENTERPRISE_SEARCH_CONNECTOR_CRAWLER_SERVICE_TYPE } from '../../common/constants'; - import { + Connector, + ConnectorConfiguration, ConnectorDocument, ConnectorStatus, FilteringPolicy, FilteringRuleRule, FilteringValidationState, IngestPipelineParams, -} from '../../common/types/connectors'; -import { stripSearchPrefix } from '../../common/utils/strip_search_prefix'; +} from '../types/connectors'; export function createConnectorDocument({ + configuration, + features, indexName, isNative, name, @@ -26,6 +27,8 @@ export function createConnectorDocument({ serviceType, language, }: { + configuration?: ConnectorConfiguration; + features?: Connector['features']; indexName: string | null; isNative: boolean; language: string | null; @@ -34,35 +37,14 @@ export function createConnectorDocument({ serviceType: string | null; }): ConnectorDocument { const currentTimestamp = new Date().toISOString(); - const nativeConnector = - isNative && serviceType ? NATIVE_CONNECTOR_DEFINITIONS[serviceType] : undefined; - - if ( - isNative && - serviceType && - !nativeConnector && - serviceType !== ENTERPRISE_SEARCH_CONNECTOR_CRAWLER_SERVICE_TYPE - ) { - throw new Error(`Could not find connector definition for service type ${serviceType}`); - } - - const nativeFields = nativeConnector - ? { - configuration: nativeConnector.configuration, - features: nativeConnector.features, - name: nativeConnector.name, - service_type: serviceType, - status: ConnectorStatus.NEEDS_CONFIGURATION, - } - : {}; return { api_key_id: null, - configuration: {}, + configuration: configuration || {}, custom_scheduling: {}, description: null, error: null, - features: null, + features: features || null, filtering: [ { active: { @@ -126,7 +108,7 @@ export function createConnectorDocument({ last_sync_scheduled_at: null, last_sync_status: null, last_synced: null, - name: name || stripSearchPrefix(indexName ?? ''), + name: name ?? '', pipeline, scheduling: { access_control: { enabled: false, interval: '0 0 0 * * ?' }, @@ -136,6 +118,5 @@ export function createConnectorDocument({ service_type: serviceType || null, status: ConnectorStatus.CREATED, sync_now: false, - ...nativeFields, }; } diff --git a/x-pack/plugins/enterprise_search/server/lib/connectors/delete_connector.test.ts b/packages/kbn-search-connectors/lib/delete_connector.test.ts similarity index 54% rename from x-pack/plugins/enterprise_search/server/lib/connectors/delete_connector.test.ts rename to packages/kbn-search-connectors/lib/delete_connector.test.ts index 0ce9e53632835..55dfdcbeae92b 100644 --- a/x-pack/plugins/enterprise_search/server/lib/connectors/delete_connector.test.ts +++ b/packages/kbn-search-connectors/lib/delete_connector.test.ts @@ -1,27 +1,25 @@ /* * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. + * 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 { IScopedClusterClient } from '@kbn/core/server'; +import { ElasticsearchClient } from '@kbn/core/server'; -import { CONNECTORS_INDEX } from '../..'; +import { CONNECTORS_INDEX } from '..'; import { deleteConnectorById } from './delete_connector'; -jest.mock('./post_cancel_syncs', () => ({ +jest.mock('./cancel_syncs', () => ({ cancelSyncs: jest.fn(), })); -import { cancelSyncs } from './post_cancel_syncs'; +import { cancelSyncs } from './cancel_syncs'; describe('deleteConnector lib function', () => { const mockClient = { - asCurrentUser: { - delete: jest.fn(), - }, - asInternalUser: {}, + delete: jest.fn(), }; beforeEach(() => { @@ -30,11 +28,11 @@ describe('deleteConnector lib function', () => { }); it('should delete connector and cancel syncs', async () => { - mockClient.asCurrentUser.delete.mockImplementation(() => true); + mockClient.delete.mockImplementation(() => true); - await deleteConnectorById(mockClient as unknown as IScopedClusterClient, 'connectorId'); + await deleteConnectorById(mockClient as unknown as ElasticsearchClient, 'connectorId'); expect(cancelSyncs as jest.Mock).toHaveBeenCalledWith(mockClient, 'connectorId'); - expect(mockClient.asCurrentUser.delete).toHaveBeenCalledWith({ + expect(mockClient.delete).toHaveBeenCalledWith({ id: 'connectorId', index: CONNECTORS_INDEX, refresh: 'wait_for', diff --git a/packages/kbn-search-connectors/lib/delete_connector.ts b/packages/kbn-search-connectors/lib/delete_connector.ts new file mode 100644 index 0000000000000..c64edfd3d906a --- /dev/null +++ b/packages/kbn-search-connectors/lib/delete_connector.ts @@ -0,0 +1,21 @@ +/* + * 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 { ElasticsearchClient } from '@kbn/core-elasticsearch-server'; +import { CONNECTORS_INDEX } from '..'; +import { cancelSyncs } from './cancel_syncs'; + +export const deleteConnectorById = async (client: ElasticsearchClient, id: string) => { + // timeout function to mitigate race condition with external connector running job and recreating index + const timeout = async () => { + const promise = new Promise((resolve) => setTimeout(resolve, 500)); + return promise; + }; + await Promise.all([cancelSyncs(client, id), timeout]); + return await client.delete({ id, index: CONNECTORS_INDEX, refresh: 'wait_for' }); +}; diff --git a/packages/kbn-search-connectors/lib/fetch_connector_index_names.ts b/packages/kbn-search-connectors/lib/fetch_connector_index_names.ts new file mode 100644 index 0000000000000..bed99173c859b --- /dev/null +++ b/packages/kbn-search-connectors/lib/fetch_connector_index_names.ts @@ -0,0 +1,29 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 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 { ElasticsearchClient } from '@kbn/core/server'; + +import { CONNECTORS_INDEX } from '..'; +import { isIndexNotFoundException } from '../utils/identify_exceptions'; + +export async function fetchConnectorIndexNames(client: ElasticsearchClient): Promise { + try { + const result = await client.search({ + _source: false, + fields: [{ field: 'index_name' }], + index: CONNECTORS_INDEX, + size: 10000, + }); + return (result?.hits.hits ?? []).map((field) => field.fields?.index_name[0] ?? ''); + } catch (error) { + if (isIndexNotFoundException(error)) { + return []; + } + throw error; + } +} diff --git a/x-pack/plugins/enterprise_search/server/lib/connectors/fetch_connectors.test.ts b/packages/kbn-search-connectors/lib/fetch_connectors.test.ts similarity index 70% rename from x-pack/plugins/enterprise_search/server/lib/connectors/fetch_connectors.test.ts rename to packages/kbn-search-connectors/lib/fetch_connectors.test.ts index 4196aad469d65..e1bb872710594 100644 --- a/x-pack/plugins/enterprise_search/server/lib/connectors/fetch_connectors.test.ts +++ b/packages/kbn-search-connectors/lib/fetch_connectors.test.ts @@ -1,11 +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; you may not use this file except in compliance with the Elastic License - * 2.0. + * 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 { CONNECTORS_INDEX } from '../..'; +import { CONNECTORS_INDEX } from '..'; import { fetchConnectorById, fetchConnectorByIndexName, fetchConnectors } from './fetch_connectors'; @@ -31,11 +32,8 @@ const otherError = { describe('fetchConnectors lib', () => { const mockClient = { - asCurrentUser: { - get: jest.fn(), - search: jest.fn(), - }, - asInternalUser: {}, + get: jest.fn(), + search: jest.fn(), }; beforeEach(() => { @@ -43,7 +41,7 @@ describe('fetchConnectors lib', () => { }); describe('fetch connector by id', () => { it('should fetch connector by id', async () => { - mockClient.asCurrentUser.get.mockImplementationOnce(() => + mockClient.get.mockImplementationOnce(() => Promise.resolve({ _id: 'connectorId', _primary_term: 'primaryTerm', @@ -56,23 +54,23 @@ describe('fetchConnectors lib', () => { seqNo: 5, value: { id: 'connectorId', source: 'source' }, }); - expect(mockClient.asCurrentUser.get).toHaveBeenCalledWith({ + expect(mockClient.get).toHaveBeenCalledWith({ id: 'id', index: CONNECTORS_INDEX, }); }); it('should return undefined on index not found error', async () => { - mockClient.asCurrentUser.get.mockImplementationOnce(() => Promise.reject(indexNotFoundError)); + mockClient.get.mockImplementationOnce(() => Promise.reject(indexNotFoundError)); await expect(fetchConnectorById(mockClient as any, 'id')).resolves.toEqual(undefined); - expect(mockClient.asCurrentUser.get).toHaveBeenCalledWith({ + expect(mockClient.get).toHaveBeenCalledWith({ id: 'id', index: CONNECTORS_INDEX, }); }); it('should throw on other errors', async () => { - mockClient.asCurrentUser.get.mockImplementationOnce(() => Promise.reject(otherError)); + mockClient.get.mockImplementationOnce(() => Promise.reject(otherError)); await expect(fetchConnectorById(mockClient as any, 'id')).rejects.toEqual(otherError); - expect(mockClient.asCurrentUser.get).toHaveBeenCalledWith({ + expect(mockClient.get).toHaveBeenCalledWith({ id: 'id', index: CONNECTORS_INDEX, }); @@ -80,17 +78,17 @@ describe('fetchConnectors lib', () => { }); describe('fetch connector by name', () => { it('should fetch connector by index name', async () => { - mockClient.asCurrentUser.search.mockImplementationOnce(() => + mockClient.search.mockImplementationOnce(() => Promise.resolve({ hits: { hits: [{ _id: 'connectorId', _source: { source: 'source' } }] } }) ); - mockClient.asCurrentUser.get.mockImplementationOnce(() => + mockClient.get.mockImplementationOnce(() => Promise.resolve({ _id: 'connectorId', _source: { source: 'source' } }) ); await expect(fetchConnectorByIndexName(mockClient as any, 'id')).resolves.toEqual({ id: 'connectorId', source: 'source', }); - expect(mockClient.asCurrentUser.search).toHaveBeenCalledWith({ + expect(mockClient.search).toHaveBeenCalledWith({ index: CONNECTORS_INDEX, query: { term: { @@ -100,11 +98,9 @@ describe('fetchConnectors lib', () => { }); }); it('should return undefined on index not found error', async () => { - mockClient.asCurrentUser.search.mockImplementationOnce(() => - Promise.reject(indexNotFoundError) - ); + mockClient.search.mockImplementationOnce(() => Promise.reject(indexNotFoundError)); await expect(fetchConnectorByIndexName(mockClient as any, 'id')).resolves.toEqual(undefined); - expect(mockClient.asCurrentUser.search).toHaveBeenCalledWith({ + expect(mockClient.search).toHaveBeenCalledWith({ index: CONNECTORS_INDEX, query: { term: { @@ -114,9 +110,9 @@ describe('fetchConnectors lib', () => { }); }); it('should throw on other errors', async () => { - mockClient.asCurrentUser.search.mockImplementationOnce(() => Promise.reject(otherError)); + mockClient.search.mockImplementationOnce(() => Promise.reject(otherError)); await expect(fetchConnectorByIndexName(mockClient as any, 'id')).rejects.toEqual(otherError); - expect(mockClient.asCurrentUser.search).toHaveBeenCalledWith({ + expect(mockClient.search).toHaveBeenCalledWith({ index: CONNECTORS_INDEX, query: { term: { @@ -128,7 +124,7 @@ describe('fetchConnectors lib', () => { }); describe('fetch connectors', () => { it('should fetch connectors', async () => { - mockClient.asCurrentUser.search.mockImplementationOnce(() => + mockClient.search.mockImplementationOnce(() => Promise.resolve({ hits: { hits: [{ _id: 'connectorId', _source: { source: 'source' } }] } }) ); await expect(fetchConnectors(mockClient as any)).resolves.toEqual([ @@ -137,7 +133,7 @@ describe('fetchConnectors lib', () => { source: 'source', }, ]); - expect(mockClient.asCurrentUser.search).toHaveBeenCalledWith({ + expect(mockClient.search).toHaveBeenCalledWith({ from: 0, index: CONNECTORS_INDEX, query: { match_all: {} }, @@ -153,7 +149,7 @@ describe('fetchConnectors lib', () => { let count = 0; - mockClient.asCurrentUser.search.mockImplementation(() => { + mockClient.search.mockImplementation(() => { count += 1; if (count === 3) { return Promise.resolve({ hits: { hits: [] } }); @@ -164,20 +160,18 @@ describe('fetchConnectors lib', () => { ...resultHits, ...resultHits, ]); - expect(mockClient.asCurrentUser.search).toHaveBeenCalledWith({ + expect(mockClient.search).toHaveBeenCalledWith({ from: 0, index: CONNECTORS_INDEX, query: { match_all: {} }, size: 1000, }); - expect(mockClient.asCurrentUser.search).toHaveBeenCalledTimes(3); + expect(mockClient.search).toHaveBeenCalledTimes(3); }); it('should return empty array on index not found error', async () => { - mockClient.asCurrentUser.search.mockImplementationOnce(() => - Promise.reject(indexNotFoundError) - ); + mockClient.search.mockImplementationOnce(() => Promise.reject(indexNotFoundError)); await expect(fetchConnectors(mockClient as any)).resolves.toEqual([]); - expect(mockClient.asCurrentUser.search).toHaveBeenCalledWith({ + expect(mockClient.search).toHaveBeenCalledWith({ from: 0, index: CONNECTORS_INDEX, query: { match_all: {} }, @@ -185,9 +179,9 @@ describe('fetchConnectors lib', () => { }); }); it('should throw on other errors', async () => { - mockClient.asCurrentUser.search.mockImplementationOnce(() => Promise.reject(otherError)); + mockClient.search.mockImplementationOnce(() => Promise.reject(otherError)); await expect(fetchConnectors(mockClient as any)).rejects.toEqual(otherError); - expect(mockClient.asCurrentUser.search).toHaveBeenCalledWith({ + expect(mockClient.search).toHaveBeenCalledWith({ from: 0, index: CONNECTORS_INDEX, query: { match_all: {} }, diff --git a/x-pack/plugins/enterprise_search/server/lib/connectors/fetch_connectors.ts b/packages/kbn-search-connectors/lib/fetch_connectors.ts similarity index 55% rename from x-pack/plugins/enterprise_search/server/lib/connectors/fetch_connectors.ts rename to packages/kbn-search-connectors/lib/fetch_connectors.ts index c1d8b834d0e15..7d9463228c0a9 100644 --- a/x-pack/plugins/enterprise_search/server/lib/connectors/fetch_connectors.ts +++ b/packages/kbn-search-connectors/lib/fetch_connectors.ts @@ -1,25 +1,27 @@ /* * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. + * 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 { QueryDslQueryContainer } from '@elastic/elasticsearch/lib/api/types'; -import { IScopedClusterClient } from '@kbn/core/server'; +import { QueryDslQueryContainer, SearchHit } from '@elastic/elasticsearch/lib/api/types'; +import { ElasticsearchClient } from '@kbn/core/server'; -import { CONNECTORS_INDEX } from '../..'; -import { Connector, ConnectorDocument } from '../../../common/types/connectors'; -import { OptimisticConcurrency } from '../../../common/types/util_types'; -import { isIndexNotFoundException } from '../../utils/identify_exceptions'; -import { fetchAll } from '../fetch_all'; +import { OptimisticConcurrency } from '../types/optimistic_concurrency'; +import { Connector, ConnectorDocument } from '../types/connectors'; + +import { isIndexNotFoundException } from '../utils/identify_exceptions'; +import { CONNECTORS_INDEX } from '..'; +import { isNotNullish } from '../utils/is_not_nullish'; export const fetchConnectorById = async ( - client: IScopedClusterClient, + client: ElasticsearchClient, connectorId: string ): Promise | undefined> => { try { - const connectorResult = await client.asCurrentUser.get({ + const connectorResult = await client.get({ id: connectorId, index: CONNECTORS_INDEX, }); @@ -39,11 +41,11 @@ export const fetchConnectorById = async ( }; export const fetchConnectorByIndexName = async ( - client: IScopedClusterClient, + client: ElasticsearchClient, indexName: string ): Promise => { try { - const connectorResult = await client.asCurrentUser.search({ + const connectorResult = await client.search({ index: CONNECTORS_INDEX, query: { term: { index_name: indexName } }, }); @@ -62,7 +64,7 @@ export const fetchConnectorByIndexName = async ( }; export const fetchConnectors = async ( - client: IScopedClusterClient, + client: ElasticsearchClient, indexNames?: string[] ): Promise => { const query: QueryDslQueryContainer = indexNames @@ -70,7 +72,23 @@ export const fetchConnectors = async ( : { match_all: {} }; try { - return await fetchAll(client, CONNECTORS_INDEX, query); + let hits: Array> = []; + let accumulator: Array> = []; + + do { + const connectorResult = await client.search({ + from: accumulator.length, + index: CONNECTORS_INDEX, + query, + size: 1000, + }); + hits = connectorResult.hits.hits; + accumulator = accumulator.concat(hits); + } while (hits.length >= 1000); + + return accumulator + .map(({ _source, _id }) => (_source ? { ..._source, id: _id } : undefined)) + .filter(isNotNullish); } catch (error) { if (isIndexNotFoundException(error)) { return []; diff --git a/x-pack/plugins/enterprise_search/server/lib/connectors/fetch_sync_jobs.test.ts b/packages/kbn-search-connectors/lib/fetch_sync_jobs.test.ts similarity index 82% rename from x-pack/plugins/enterprise_search/server/lib/connectors/fetch_sync_jobs.test.ts rename to packages/kbn-search-connectors/lib/fetch_sync_jobs.test.ts index 651849e803c41..debfedbcfeb67 100644 --- a/x-pack/plugins/enterprise_search/server/lib/connectors/fetch_sync_jobs.test.ts +++ b/packages/kbn-search-connectors/lib/fetch_sync_jobs.test.ts @@ -1,19 +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; you may not use this file except in compliance with the Elastic License - * 2.0. + * 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 { fetchSyncJobsByConnectorId } from './fetch_sync_jobs'; describe('fetchSyncJobs lib', () => { const mockClient = { - asCurrentUser: { - get: jest.fn(), - search: jest.fn(), - }, - asInternalUser: {}, + get: jest.fn(), + search: jest.fn(), }; beforeEach(() => { @@ -21,7 +19,7 @@ describe('fetchSyncJobs lib', () => { }); describe('fetch sync jobs by connector id', () => { it('should fetch sync jobs by connector id', async () => { - mockClient.asCurrentUser.search.mockImplementationOnce(() => + mockClient.search.mockImplementationOnce(() => Promise.resolve({ hits: { hits: ['result1', 'result2'] }, total: 2 }) ); await expect(fetchSyncJobsByConnectorId(mockClient as any, 'id', 0, 10)).resolves.toEqual({ @@ -35,7 +33,7 @@ describe('fetchSyncJobs lib', () => { }, data: [], }); - expect(mockClient.asCurrentUser.search).toHaveBeenCalledWith({ + expect(mockClient.search).toHaveBeenCalledWith({ from: 0, index: '.elastic-connectors-sync-jobs', query: { @@ -63,10 +61,10 @@ describe('fetchSyncJobs lib', () => { }, data: [], }); - expect(mockClient.asCurrentUser.search).not.toHaveBeenCalled(); + expect(mockClient.search).not.toHaveBeenCalled(); }); it('should return empty array on index not found error', async () => { - mockClient.asCurrentUser.search.mockImplementationOnce(() => + mockClient.search.mockImplementationOnce(() => Promise.reject({ meta: { body: { @@ -88,7 +86,7 @@ describe('fetchSyncJobs lib', () => { }, data: [], }); - expect(mockClient.asCurrentUser.search).toHaveBeenCalledWith({ + expect(mockClient.search).toHaveBeenCalledWith({ from: 0, index: '.elastic-connectors-sync-jobs', query: { @@ -105,7 +103,7 @@ describe('fetchSyncJobs lib', () => { }); }); it('should throw on other errors', async () => { - mockClient.asCurrentUser.search.mockImplementationOnce(() => + mockClient.search.mockImplementationOnce(() => Promise.reject({ meta: { body: { @@ -125,7 +123,7 @@ describe('fetchSyncJobs lib', () => { }, }, }); - expect(mockClient.asCurrentUser.search).toHaveBeenCalledWith({ + expect(mockClient.search).toHaveBeenCalledWith({ from: 0, index: '.elastic-connectors-sync-jobs', query: { diff --git a/x-pack/plugins/enterprise_search/server/lib/connectors/fetch_sync_jobs.ts b/packages/kbn-search-connectors/lib/fetch_sync_jobs.ts similarity index 71% rename from x-pack/plugins/enterprise_search/server/lib/connectors/fetch_sync_jobs.ts rename to packages/kbn-search-connectors/lib/fetch_sync_jobs.ts index 43f373712f753..1a56103702d83 100644 --- a/x-pack/plugins/enterprise_search/server/lib/connectors/fetch_sync_jobs.ts +++ b/packages/kbn-search-connectors/lib/fetch_sync_jobs.ts @@ -1,19 +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; you may not use this file except in compliance with the Elastic License - * 2.0. + * 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 { IScopedClusterClient } from '@kbn/core-elasticsearch-server'; +import { ElasticsearchClient } from '@kbn/core-elasticsearch-server'; -import { CONNECTORS_JOBS_INDEX } from '../..'; -import { ConnectorSyncJob, SyncJobType } from '../../../common/types/connectors'; -import { Paginate } from '../../../common/types/pagination'; -import { isNotNullish } from '../../../common/utils/is_not_nullish'; +import { CONNECTORS_JOBS_INDEX } from '..'; +import { ConnectorSyncJob, SyncJobType } from '../types/connectors'; +import { Paginate } from '../types/pagination'; +import { isNotNullish } from '../utils/is_not_nullish'; -import { fetchWithPagination } from '../../utils/fetch_with_pagination'; -import { isIndexNotFoundException } from '../../utils/identify_exceptions'; +import { fetchWithPagination } from '../utils/fetch_with_pagination'; +import { isIndexNotFoundException } from '../utils/identify_exceptions'; const defaultResult: Paginate = { _meta: { @@ -28,7 +29,7 @@ const defaultResult: Paginate = { }; export const fetchSyncJobsByConnectorId = async ( - client: IScopedClusterClient, + client: ElasticsearchClient, connectorId: string, from: number, size: number, @@ -63,7 +64,7 @@ export const fetchSyncJobsByConnectorId = async ( }; const result = await fetchWithPagination( async () => - await client.asCurrentUser.search({ + await client.search({ from, index: CONNECTORS_JOBS_INDEX, query, diff --git a/packages/kbn-search-connectors/lib/index.ts b/packages/kbn-search-connectors/lib/index.ts new file mode 100644 index 0000000000000..4fd4706268327 --- /dev/null +++ b/packages/kbn-search-connectors/lib/index.ts @@ -0,0 +1,23 @@ +/* + * 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 * from './cancel_syncs'; +export * from './create_connector'; +export * from './create_connector_document'; +export * from './delete_connector'; +export * from './fetch_connectors'; +export * from './fetch_sync_jobs'; +export * from './update_filtering'; +export * from './update_filtering_draft'; +export * from './update_native'; +export * from './start_sync'; +export * from './update_connector_configuration'; +export * from './update_connector_name_and_description'; +export * from './update_connector_scheduling'; +export * from './update_connector_service_type'; +export * from './update_connector_status'; diff --git a/packages/kbn-search-connectors/lib/start_sync.test.ts b/packages/kbn-search-connectors/lib/start_sync.test.ts new file mode 100644 index 0000000000000..c32b82bc7ba7f --- /dev/null +++ b/packages/kbn-search-connectors/lib/start_sync.test.ts @@ -0,0 +1,242 @@ +/* + * 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 { ElasticsearchClient } from '@kbn/core/server'; + +import { CONNECTORS_INDEX, CURRENT_CONNECTORS_JOB_INDEX } from '..'; +import { SyncJobType, SyncStatus, TriggerMethod } from '../types/connectors'; +import { CONNECTORS_ACCESS_CONTROL_INDEX_PREFIX } from '..'; + +import { startConnectorSync } from './start_sync'; + +describe('startSync lib function', () => { + const mockClient = { + get: jest.fn(), + index: jest.fn(), + update: jest.fn(), + }; + + beforeEach(() => { + jest.clearAllMocks(); + }); + + it('should start a full sync', async () => { + mockClient.get.mockImplementation(() => { + return Promise.resolve({ + _id: 'connectorId', + _source: { + api_key_id: null, + configuration: {}, + created_at: null, + custom_scheduling: {}, + error: null, + index_name: 'index_name', + language: null, + last_access_control_sync_error: null, + last_access_control_sync_scheduled_at: null, + last_access_control_sync_status: null, + last_seen: null, + last_sync_error: null, + last_sync_scheduled_at: null, + last_sync_status: null, + last_synced: null, + scheduling: { enabled: true, interval: '1 2 3 4 5' }, + service_type: null, + status: 'not connected', + sync_now: false, + }, + index: CONNECTORS_INDEX, + }); + }); + mockClient.index.mockImplementation(() => ({ _id: 'fakeId' })); + + await expect( + startConnectorSync(mockClient as unknown as ElasticsearchClient, { + connectorId: 'connectorId', + jobType: SyncJobType.FULL, + }) + ).resolves.toEqual({ _id: 'fakeId' }); + expect(mockClient.index).toHaveBeenCalledWith({ + document: { + cancelation_requested_at: null, + canceled_at: null, + completed_at: null, + connector: { + configuration: {}, + filtering: null, + id: 'connectorId', + index_name: 'index_name', + language: null, + pipeline: null, + service_type: null, + }, + created_at: expect.any(String), + deleted_document_count: 0, + error: null, + indexed_document_count: 0, + indexed_document_volume: 0, + job_type: SyncJobType.FULL, + last_seen: null, + metadata: {}, + started_at: null, + status: SyncStatus.PENDING, + total_document_count: null, + trigger_method: TriggerMethod.ON_DEMAND, + worker_hostname: null, + }, + index: CURRENT_CONNECTORS_JOB_INDEX, + }); + }); + + it('should not create index if there is no connector', async () => { + mockClient.get.mockImplementation(() => { + return Promise.resolve({}); + }); + await expect( + startConnectorSync(mockClient as unknown as ElasticsearchClient, { + connectorId: 'connectorId', + jobType: SyncJobType.FULL, + }) + ).rejects.toEqual(new Error('resource_not_found')); + expect(mockClient.index).not.toHaveBeenCalled(); + }); + + it('should start an incremental sync', async () => { + mockClient.get.mockImplementation(() => { + return Promise.resolve({ + _id: 'connectorId', + _source: { + api_key_id: null, + configuration: {}, + created_at: null, + custom_scheduling: {}, + error: null, + filtering: [], + index_name: 'index_name', + language: null, + last_access_control_sync_status: null, + last_seen: null, + last_sync_error: null, + last_sync_scheduled_at: null, + last_sync_status: null, + last_synced: null, + scheduling: { enabled: true, interval: '1 2 3 4 5' }, + service_type: null, + status: 'not connected', + sync_now: false, + }, + index: CONNECTORS_INDEX, + }); + }); + mockClient.index.mockImplementation(() => ({ _id: 'fakeId' })); + + await expect( + startConnectorSync(mockClient as unknown as ElasticsearchClient, { + connectorId: 'connectorId', + jobType: SyncJobType.INCREMENTAL, + }) + ).resolves.toEqual({ _id: 'fakeId' }); + expect(mockClient.index).toHaveBeenCalledWith({ + document: { + cancelation_requested_at: null, + canceled_at: null, + completed_at: null, + connector: { + configuration: {}, + filtering: null, + id: 'connectorId', + index_name: 'index_name', + language: null, + pipeline: null, + service_type: null, + }, + created_at: expect.any(String), + deleted_document_count: 0, + error: null, + indexed_document_count: 0, + indexed_document_volume: 0, + job_type: SyncJobType.INCREMENTAL, + last_seen: null, + metadata: {}, + started_at: null, + status: SyncStatus.PENDING, + total_document_count: null, + trigger_method: TriggerMethod.ON_DEMAND, + worker_hostname: null, + }, + index: CURRENT_CONNECTORS_JOB_INDEX, + }); + }); + + it('should start an access control sync', async () => { + mockClient.get.mockImplementation(() => { + return Promise.resolve({ + _id: 'connectorId', + _source: { + api_key_id: null, + configuration: {}, + created_at: null, + custom_scheduling: {}, + error: null, + index_name: 'search-index_name', + language: null, + last_access_control_sync_status: null, + last_seen: null, + last_sync_error: null, + last_sync_scheduled_at: null, + last_sync_status: null, + last_synced: null, + scheduling: { enabled: true, interval: '1 2 3 4 5' }, + service_type: null, + status: 'not connected', + sync_now: false, + }, + index: CONNECTORS_INDEX, + }); + }); + mockClient.index.mockImplementation(() => ({ _id: 'fakeId' })); + + await expect( + startConnectorSync(mockClient as unknown as ElasticsearchClient, { + connectorId: 'connectorId', + targetIndexName: '.search-acl-filter-index_name', + jobType: SyncJobType.ACCESS_CONTROL, + }) + ).resolves.toEqual({ _id: 'fakeId' }); + expect(mockClient.index).toHaveBeenCalledWith({ + document: { + cancelation_requested_at: null, + canceled_at: null, + completed_at: null, + connector: { + configuration: {}, + filtering: null, + id: 'connectorId', + index_name: `${CONNECTORS_ACCESS_CONTROL_INDEX_PREFIX}index_name`, + language: null, + pipeline: null, + service_type: null, + }, + created_at: expect.any(String), + deleted_document_count: 0, + error: null, + indexed_document_count: 0, + indexed_document_volume: 0, + job_type: SyncJobType.ACCESS_CONTROL, + last_seen: null, + metadata: {}, + started_at: null, + status: SyncStatus.PENDING, + total_document_count: null, + trigger_method: TriggerMethod.ON_DEMAND, + worker_hostname: null, + }, + index: CURRENT_CONNECTORS_JOB_INDEX, + }); + }); +}); diff --git a/packages/kbn-search-connectors/lib/start_sync.ts b/packages/kbn-search-connectors/lib/start_sync.ts new file mode 100644 index 0000000000000..878901953e6a1 --- /dev/null +++ b/packages/kbn-search-connectors/lib/start_sync.ts @@ -0,0 +1,91 @@ +/* + * 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 { ElasticsearchClient } from '@kbn/core/server'; + +import { CONNECTORS_INDEX, CURRENT_CONNECTORS_JOB_INDEX } from '..'; +import { + ConnectorConfiguration, + ConnectorDocument, + SyncJobType, + SyncStatus, + TriggerMethod, +} from '../types/connectors'; +import { isConfigEntry } from '../utils/is_category_entry'; + +export const startConnectorSync = async ( + client: ElasticsearchClient, + { + connectorId, + jobType, + targetIndexName, + }: { + connectorId: string; + jobType?: SyncJobType; + targetIndexName?: string; + } +) => { + const connectorResult = await client.get({ + id: connectorId, + index: CONNECTORS_INDEX, + }); + const connector = connectorResult._source; + if (connector) { + const configuration = Object.entries(connector.configuration).reduce( + (acc, [key, configEntry]) => { + if (isConfigEntry(configEntry)) { + acc[key] = configEntry; + } + return acc; + }, + {} as ConnectorConfiguration + ); + const { + filtering, + index_name: connectorIndexName, + language, + pipeline, + service_type: serviceType, + } = connector; + + const now = new Date().toISOString(); + + return await client.index({ + document: { + cancelation_requested_at: null, + canceled_at: null, + completed_at: null, + connector: { + configuration, + filtering: filtering ? filtering[0]?.active ?? null : null, + id: connectorId, + index_name: targetIndexName || connectorIndexName, + language, + pipeline: pipeline ?? null, + service_type: serviceType, + }, + created_at: now, + deleted_document_count: 0, + error: null, + indexed_document_count: 0, + indexed_document_volume: 0, + job_type: jobType, + last_seen: null, + metadata: {}, + started_at: null, + status: SyncStatus.PENDING, + total_document_count: null, + trigger_method: TriggerMethod.ON_DEMAND, + worker_hostname: null, + }, + index: CURRENT_CONNECTORS_JOB_INDEX, + }); + } else { + throw new Error('resource_not_found'); + } +}; diff --git a/x-pack/plugins/enterprise_search/server/lib/connectors/update_connector_configuration.test.ts b/packages/kbn-search-connectors/lib/update_connector_configuration.test.ts similarity index 69% rename from x-pack/plugins/enterprise_search/server/lib/connectors/update_connector_configuration.test.ts rename to packages/kbn-search-connectors/lib/update_connector_configuration.test.ts index 0b7e328e9ebb4..fd1e014037863 100644 --- a/x-pack/plugins/enterprise_search/server/lib/connectors/update_connector_configuration.test.ts +++ b/packages/kbn-search-connectors/lib/update_connector_configuration.test.ts @@ -1,26 +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. + * 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 { IScopedClusterClient } from '@kbn/core/server'; - -import { CONNECTORS_INDEX } from '../..'; -import { ConnectorStatus } from '../../../common/types/connectors'; +import { ElasticsearchClient } from '@kbn/core/server'; +import { CONNECTORS_INDEX } from '..'; import { fetchConnectorById } from './fetch_connectors'; +import { ConnectorStatus } from '../types/connectors'; + import { updateConnectorConfiguration } from './update_connector_configuration'; jest.mock('./fetch_connectors', () => ({ fetchConnectorById: jest.fn() })); describe('updateConnectorConfiguration lib function', () => { const mockClient = { - asCurrentUser: { - update: jest.fn(), - }, - asInternalUser: {}, + update: jest.fn(), }; beforeEach(() => { @@ -38,11 +36,11 @@ describe('updateConnectorConfiguration lib function', () => { it('should update configuration', async () => { await expect( - updateConnectorConfiguration(mockClient as unknown as IScopedClusterClient, 'connectorId', { + updateConnectorConfiguration(mockClient as unknown as ElasticsearchClient, 'connectorId', { test: 'newValue', }) ).resolves.toEqual({ test: { label: 'haha', value: 'newValue' } }); - expect(mockClient.asCurrentUser.update).toHaveBeenCalledWith({ + expect(mockClient.update).toHaveBeenCalledWith({ doc: { configuration: { test: { label: 'haha', value: 'newValue' } }, status: ConnectorStatus.CONFIGURED, @@ -58,10 +56,10 @@ describe('updateConnectorConfiguration lib function', () => { (fetchConnectorById as jest.Mock).mockImplementation(() => undefined); await expect( - updateConnectorConfiguration(mockClient as unknown as IScopedClusterClient, 'connectorId', { + updateConnectorConfiguration(mockClient as unknown as ElasticsearchClient, 'connectorId', { test: 'newValue', }) ).rejects.toEqual(new Error('Could not find connector')); - expect(mockClient.asCurrentUser.update).not.toHaveBeenCalled(); + expect(mockClient.update).not.toHaveBeenCalled(); }); }); diff --git a/x-pack/plugins/enterprise_search/server/lib/connectors/update_connector_configuration.ts b/packages/kbn-search-connectors/lib/update_connector_configuration.ts similarity index 71% rename from x-pack/plugins/enterprise_search/server/lib/connectors/update_connector_configuration.ts rename to packages/kbn-search-connectors/lib/update_connector_configuration.ts index 7c68a0a08dee7..dfb43af53db44 100644 --- a/x-pack/plugins/enterprise_search/server/lib/connectors/update_connector_configuration.ts +++ b/packages/kbn-search-connectors/lib/update_connector_configuration.ts @@ -1,28 +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. + * 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 { IScopedClusterClient } from '@kbn/core/server'; +import { ElasticsearchClient } from '@kbn/core/server'; import { i18n } from '@kbn/i18n'; -import { CONNECTORS_INDEX } from '../..'; - -import { isConfigEntry } from '../../../common/connectors/is_category_entry'; -import { - ConnectorConfiguration, - ConnectorDocument, - ConnectorStatus, -} from '../../../common/types/connectors'; -import { isNotNullish } from '../../../common/utils/is_not_nullish'; +import { CONNECTORS_INDEX } from '..'; import { fetchConnectorById } from './fetch_connectors'; +import { ConnectorConfiguration, ConnectorDocument, ConnectorStatus } from '../types/connectors'; +import { isConfigEntry } from '../utils/is_category_entry'; +import { isNotNullish } from '../utils/is_not_nullish'; export const updateConnectorConfiguration = async ( - client: IScopedClusterClient, + client: ElasticsearchClient, connectorId: string, configuration: Record ) => { @@ -49,7 +45,7 @@ export const updateConnectorConfiguration = async ( const { key, ...config } = curr; return { ...prev, [curr.key]: config }; }, {}); - await client.asCurrentUser.update({ + await client.update({ doc: { configuration: updatedConfig, status }, id: connectorId, if_primary_term: connectorResult?.primaryTerm, @@ -59,7 +55,7 @@ export const updateConnectorConfiguration = async ( return updatedConfig; } else { throw new Error( - i18n.translate('xpack.enterpriseSearch.server.connectors.configuration.error', { + i18n.translate('searchConnectors.server.connectors.configuration.error', { defaultMessage: 'Could not find connector', }) ); diff --git a/x-pack/plugins/enterprise_search/server/lib/connectors/update_connector_name_and_description.ts b/packages/kbn-search-connectors/lib/update_connector_name_and_description.ts similarity index 52% rename from x-pack/plugins/enterprise_search/server/lib/connectors/update_connector_name_and_description.ts rename to packages/kbn-search-connectors/lib/update_connector_name_and_description.ts index caca94ee2713a..6323387c4259f 100644 --- a/x-pack/plugins/enterprise_search/server/lib/connectors/update_connector_name_and_description.ts +++ b/packages/kbn-search-connectors/lib/update_connector_name_and_description.ts @@ -1,38 +1,39 @@ /* * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. + * 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 { IScopedClusterClient } from '@kbn/core/server'; +import { ElasticsearchClient } from '@kbn/core/server'; import { i18n } from '@kbn/i18n'; -import { CONNECTORS_INDEX } from '../..'; +import { CONNECTORS_INDEX } from '..'; -import { Connector, ConnectorDocument } from '../../../common/types/connectors'; +import { Connector, ConnectorDocument } from '../types/connectors'; export const updateConnectorNameAndDescription = async ( - client: IScopedClusterClient, + client: ElasticsearchClient, connectorId: string, connectorUpdates: Partial> ) => { - const connectorResult = await client.asCurrentUser.get({ + const connectorResult = await client.get({ id: connectorId, index: CONNECTORS_INDEX, }); const connector = connectorResult._source; if (connector) { - const result = await client.asCurrentUser.index({ + const result = await client.index({ document: { ...connector, ...connectorUpdates }, id: connectorId, index: CONNECTORS_INDEX, }); - await client.asCurrentUser.indices.refresh({ index: CONNECTORS_INDEX }); + await client.indices.refresh({ index: CONNECTORS_INDEX }); return result; } else { throw new Error( - i18n.translate('xpack.enterpriseSearch.server.connectors.serviceType.error', { + i18n.translate('searchConnectors.server.connectors.serviceType.error', { defaultMessage: 'Could not find document', }) ); diff --git a/x-pack/plugins/enterprise_search/server/lib/connectors/update_connector_scheduling.test.ts b/packages/kbn-search-connectors/lib/update_connector_scheduling.test.ts similarity index 76% rename from x-pack/plugins/enterprise_search/server/lib/connectors/update_connector_scheduling.test.ts rename to packages/kbn-search-connectors/lib/update_connector_scheduling.test.ts index c314e101624fb..618522831118d 100644 --- a/x-pack/plugins/enterprise_search/server/lib/connectors/update_connector_scheduling.test.ts +++ b/packages/kbn-search-connectors/lib/update_connector_scheduling.test.ts @@ -1,26 +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. + * 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 { IScopedClusterClient } from '@kbn/core/server'; +import { ElasticsearchClient } from '@kbn/core/server'; -import { CONNECTORS_INDEX } from '../..'; +import { CONNECTORS_INDEX } from '..'; import { updateConnectorScheduling } from './update_connector_scheduling'; describe('addConnector lib function', () => { const mockClient = { - asCurrentUser: { - get: jest.fn(), - index: jest.fn(), - indices: { - refresh: jest.fn(), - }, + get: jest.fn(), + index: jest.fn(), + indices: { + refresh: jest.fn(), }, - asInternalUser: {}, }; beforeEach(() => { @@ -28,7 +26,7 @@ describe('addConnector lib function', () => { }); it('should update connector scheduling', async () => { - mockClient.asCurrentUser.get.mockImplementationOnce(() => { + mockClient.get.mockImplementationOnce(() => { return Promise.resolve({ _source: { api_key_id: null, @@ -57,10 +55,10 @@ describe('addConnector lib function', () => { index: CONNECTORS_INDEX, }); }); - mockClient.asCurrentUser.index.mockImplementation(() => ({ _id: 'fakeId' })); + mockClient.index.mockImplementation(() => ({ _id: 'fakeId' })); await expect( - updateConnectorScheduling(mockClient as unknown as IScopedClusterClient, 'connectorId', { + updateConnectorScheduling(mockClient as unknown as ElasticsearchClient, 'connectorId', { access_control: { enabled: false, interval: '* * * * *' }, full: { enabled: true, @@ -69,7 +67,7 @@ describe('addConnector lib function', () => { incremental: { enabled: false, interval: '* * * * *' }, }) ).resolves.toEqual({ _id: 'fakeId' }); - expect(mockClient.asCurrentUser.index).toHaveBeenCalledWith({ + expect(mockClient.index).toHaveBeenCalledWith({ document: { api_key_id: null, configuration: {}, @@ -97,17 +95,17 @@ describe('addConnector lib function', () => { id: 'connectorId', index: CONNECTORS_INDEX, }); - expect(mockClient.asCurrentUser.indices.refresh).toHaveBeenCalledWith({ + expect(mockClient.indices.refresh).toHaveBeenCalledWith({ index: CONNECTORS_INDEX, }); }); it('should not index document if there is no connector', async () => { - mockClient.asCurrentUser.get.mockImplementationOnce(() => { + mockClient.get.mockImplementationOnce(() => { return Promise.resolve({}); }); await expect( - updateConnectorScheduling(mockClient as unknown as IScopedClusterClient, 'connectorId', { + updateConnectorScheduling(mockClient as unknown as ElasticsearchClient, 'connectorId', { access_control: { enabled: false, interval: '* * * * *' }, full: { enabled: true, @@ -116,6 +114,6 @@ describe('addConnector lib function', () => { incremental: { enabled: false, interval: '* * * * *' }, }) ).rejects.toEqual(new Error('Could not find document')); - expect(mockClient.asCurrentUser.index).not.toHaveBeenCalled(); + expect(mockClient.index).not.toHaveBeenCalled(); }); }); diff --git a/x-pack/plugins/enterprise_search/server/lib/connectors/update_connector_scheduling.ts b/packages/kbn-search-connectors/lib/update_connector_scheduling.ts similarity index 50% rename from x-pack/plugins/enterprise_search/server/lib/connectors/update_connector_scheduling.ts rename to packages/kbn-search-connectors/lib/update_connector_scheduling.ts index b6da7f138421d..a0693dc3cd6f6 100644 --- a/x-pack/plugins/enterprise_search/server/lib/connectors/update_connector_scheduling.ts +++ b/packages/kbn-search-connectors/lib/update_connector_scheduling.ts @@ -1,38 +1,39 @@ /* * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. + * 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 { IScopedClusterClient } from '@kbn/core/server'; +import { ElasticsearchClient } from '@kbn/core/server'; import { i18n } from '@kbn/i18n'; -import { CONNECTORS_INDEX } from '../..'; +import { CONNECTORS_INDEX } from '..'; -import { ConnectorDocument, SchedulingConfiguraton } from '../../../common/types/connectors'; +import { ConnectorDocument, SchedulingConfiguraton } from '../types/connectors'; export const updateConnectorScheduling = async ( - client: IScopedClusterClient, + client: ElasticsearchClient, connectorId: string, scheduling: SchedulingConfiguraton ) => { - const connectorResult = await client.asCurrentUser.get({ + const connectorResult = await client.get({ id: connectorId, index: CONNECTORS_INDEX, }); const connector = connectorResult._source; if (connector) { - const result = await client.asCurrentUser.index({ + const result = await client.index({ document: { ...connector, scheduling }, id: connectorId, index: CONNECTORS_INDEX, }); - await client.asCurrentUser.indices.refresh({ index: CONNECTORS_INDEX }); + await client.indices.refresh({ index: CONNECTORS_INDEX }); return result; } else { throw new Error( - i18n.translate('xpack.enterpriseSearch.server.connectors.scheduling.error', { + i18n.translate('searchConnectors.server.connectors.scheduling.error', { defaultMessage: 'Could not find document', }) ); diff --git a/x-pack/plugins/enterprise_search/server/lib/connectors/update_connector_service_type.ts b/packages/kbn-search-connectors/lib/update_connector_service_type.ts similarity index 51% rename from x-pack/plugins/enterprise_search/server/lib/connectors/update_connector_service_type.ts rename to packages/kbn-search-connectors/lib/update_connector_service_type.ts index a88950c48e99f..27732e17c8c2a 100644 --- a/x-pack/plugins/enterprise_search/server/lib/connectors/update_connector_service_type.ts +++ b/packages/kbn-search-connectors/lib/update_connector_service_type.ts @@ -1,38 +1,39 @@ /* * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. + * 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 { IScopedClusterClient } from '@kbn/core/server'; +import { ElasticsearchClient } from '@kbn/core/server'; import { i18n } from '@kbn/i18n'; -import { CONNECTORS_INDEX } from '../..'; +import { CONNECTORS_INDEX } from '..'; -import { ConnectorDocument } from '../../../common/types/connectors'; +import { ConnectorDocument } from '../types/connectors'; export const updateConnectorServiceType = async ( - client: IScopedClusterClient, + client: ElasticsearchClient, connectorId: string, serviceType: string ) => { - const connectorResult = await client.asCurrentUser.get({ + const connectorResult = await client.get({ id: connectorId, index: CONNECTORS_INDEX, }); const connector = connectorResult._source; if (connector) { - const result = await client.asCurrentUser.index({ + const result = await client.index({ document: { ...connector, service_type: serviceType }, id: connectorId, index: CONNECTORS_INDEX, }); - await client.asCurrentUser.indices.refresh({ index: CONNECTORS_INDEX }); + await client.indices.refresh({ index: CONNECTORS_INDEX }); return result; } else { throw new Error( - i18n.translate('xpack.enterpriseSearch.server.connectors.serviceType.error', { + i18n.translate('searchConnectors.server.connectors.serviceType.error', { defaultMessage: 'Could not find document', }) ); diff --git a/packages/kbn-search-connectors/lib/update_connector_status.ts b/packages/kbn-search-connectors/lib/update_connector_status.ts new file mode 100644 index 0000000000000..42ba9adb4f9e0 --- /dev/null +++ b/packages/kbn-search-connectors/lib/update_connector_status.ts @@ -0,0 +1,41 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 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 { ElasticsearchClient } from '@kbn/core/server'; +import { i18n } from '@kbn/i18n'; + +import { CONNECTORS_INDEX } from '..'; + +import { ConnectorDocument, ConnectorStatus } from '../types/connectors'; + +export const updateConnectorStatus = async ( + client: ElasticsearchClient, + connectorId: string, + status: ConnectorStatus +) => { + const connectorResult = await client.get({ + id: connectorId, + index: CONNECTORS_INDEX, + }); + const connector = connectorResult._source; + if (connector) { + const result = await client.index({ + document: { ...connector, status }, + id: connectorId, + index: CONNECTORS_INDEX, + }); + await client.indices.refresh({ index: CONNECTORS_INDEX }); + return result; + } else { + throw new Error( + i18n.translate('searchConnectors.server.connectors.serviceType.error', { + defaultMessage: 'Could not find document', + }) + ); + } +}; diff --git a/x-pack/plugins/enterprise_search/server/lib/connectors/put_update_filtering.ts b/packages/kbn-search-connectors/lib/update_filtering.ts similarity index 80% rename from x-pack/plugins/enterprise_search/server/lib/connectors/put_update_filtering.ts rename to packages/kbn-search-connectors/lib/update_filtering.ts index 4c0e3c2b2e541..5d32639f23396 100644 --- a/x-pack/plugins/enterprise_search/server/lib/connectors/put_update_filtering.ts +++ b/packages/kbn-search-connectors/lib/update_filtering.ts @@ -1,24 +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. + * 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 { IScopedClusterClient } from '@kbn/core-elasticsearch-server'; +import { ElasticsearchClient } from '@kbn/core-elasticsearch-server'; -import { CONNECTORS_INDEX } from '../..'; +import { CONNECTORS_INDEX } from '..'; +import { fetchConnectorById } from './fetch_connectors'; import { Connector, FilteringRule, FilteringRules, FilteringValidationState, -} from '../../../common/types/connectors'; - -import { fetchConnectorById } from './fetch_connectors'; +} from '../types/connectors'; export const updateFiltering = async ( - client: IScopedClusterClient, + client: ElasticsearchClient, connectorId: string, { advancedSnippet, @@ -55,7 +55,7 @@ export const updateFiltering = async ( }, }; - const result = await client.asCurrentUser.update({ + const result = await client.update({ doc: { ...connector, filtering: [{ ...connector.filtering[0], active, draft: active }] }, id: connectorId, if_primary_term: primaryTerm, diff --git a/x-pack/plugins/enterprise_search/server/lib/connectors/put_update_filtering_draft.ts b/packages/kbn-search-connectors/lib/update_filtering_draft.ts similarity index 80% rename from x-pack/plugins/enterprise_search/server/lib/connectors/put_update_filtering_draft.ts rename to packages/kbn-search-connectors/lib/update_filtering_draft.ts index cf82d79008d09..deb6eabd66e23 100644 --- a/x-pack/plugins/enterprise_search/server/lib/connectors/put_update_filtering_draft.ts +++ b/packages/kbn-search-connectors/lib/update_filtering_draft.ts @@ -1,24 +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. + * 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 { IScopedClusterClient } from '@kbn/core-elasticsearch-server'; +import { ElasticsearchClient } from '@kbn/core-elasticsearch-server'; -import { CONNECTORS_INDEX } from '../..'; +import { CONNECTORS_INDEX } from '..'; +import { fetchConnectorById } from './fetch_connectors'; import { Connector, FilteringRule, FilteringRules, FilteringValidationState, -} from '../../../common/types/connectors'; - -import { fetchConnectorById } from './fetch_connectors'; +} from '../types/connectors'; export const updateFilteringDraft = async ( - client: IScopedClusterClient, + client: ElasticsearchClient, connectorId: string, { advancedSnippet, @@ -55,7 +55,7 @@ export const updateFilteringDraft = async ( } const { value: connector, seqNo, primaryTerm } = connectorResult; - const result = await client.asCurrentUser.update({ + const result = await client.update({ doc: { ...connector, filtering: [{ ...connector.filtering[0], draft }] }, id: connectorId, if_primary_term: primaryTerm, diff --git a/packages/kbn-search-connectors/lib/update_native.ts b/packages/kbn-search-connectors/lib/update_native.ts new file mode 100644 index 0000000000000..dff5042961088 --- /dev/null +++ b/packages/kbn-search-connectors/lib/update_native.ts @@ -0,0 +1,28 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 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 { ElasticsearchClient } from '@kbn/core-elasticsearch-server'; + +import { CONNECTORS_INDEX } from '..'; +import { Connector } from '../types/connectors'; + +export const putUpdateNative = async ( + client: ElasticsearchClient, + connectorId: string, + isNative: boolean +) => { + const result = await client.update({ + doc: { + is_native: isNative, + }, + id: connectorId, + index: CONNECTORS_INDEX, + }); + + return result; +}; diff --git a/packages/kbn-search-connectors/package.json b/packages/kbn-search-connectors/package.json new file mode 100644 index 0000000000000..d2fb29822e269 --- /dev/null +++ b/packages/kbn-search-connectors/package.json @@ -0,0 +1,6 @@ +{ + "name": "@kbn/search-connectors", + "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/kbn-search-connectors/tsconfig.json b/packages/kbn-search-connectors/tsconfig.json new file mode 100644 index 0000000000000..a8c8d3c9840a6 --- /dev/null +++ b/packages/kbn-search-connectors/tsconfig.json @@ -0,0 +1,23 @@ +{ + "extends": "../../tsconfig.base.json", + "compilerOptions": { + "outDir": "target/types", + "types": [ + "jest", + "node", + "react" + ] + }, + "include": [ + "**/*.ts", + "**/*.tsx", + ], + "exclude": [ + "target/**/*" + ], + "kbn_references": [ + "@kbn/i18n", + "@kbn/core", + "@kbn/core-elasticsearch-server", + ] +} diff --git a/x-pack/plugins/enterprise_search/common/types/connectors.ts b/packages/kbn-search-connectors/types/connectors.ts similarity index 97% rename from x-pack/plugins/enterprise_search/common/types/connectors.ts rename to packages/kbn-search-connectors/types/connectors.ts index 6354c058b222f..8f649c15f348f 100644 --- a/x-pack/plugins/enterprise_search/common/types/connectors.ts +++ b/packages/kbn-search-connectors/types/connectors.ts @@ -1,8 +1,9 @@ /* * 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. + * 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 interface SelectOption { diff --git a/packages/kbn-search-connectors/types/index.ts b/packages/kbn-search-connectors/types/index.ts new file mode 100644 index 0000000000000..f7ef8e3b4d941 --- /dev/null +++ b/packages/kbn-search-connectors/types/index.ts @@ -0,0 +1,12 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 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 * from './connectors'; +export * from './native_connectors'; +export * from './optimistic_concurrency'; +export * from './pagination'; diff --git a/x-pack/plugins/enterprise_search/common/connectors/native_connectors.ts b/packages/kbn-search-connectors/types/native_connectors.ts similarity index 83% rename from x-pack/plugins/enterprise_search/common/connectors/native_connectors.ts rename to packages/kbn-search-connectors/types/native_connectors.ts index b12c23e26351a..0e767b4bdd345 100644 --- a/x-pack/plugins/enterprise_search/common/connectors/native_connectors.ts +++ b/packages/kbn-search-connectors/types/native_connectors.ts @@ -1,59 +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; you may not use this file except in compliance with the Elastic License - * 2.0. + * 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'; -import { DisplayType, FeatureName, FieldType, NativeConnector } from '../types/connectors'; +import { DisplayType, FeatureName, FieldType, NativeConnector } from './connectors'; -const USERNAME_LABEL = i18n.translate('xpack.enterpriseSearch.nativeConnectors.usernameLabel', { +const USERNAME_LABEL = i18n.translate('searchConnectors.nativeConnectors.usernameLabel', { defaultMessage: 'Username', }); -const PASSWORD_LABEL = i18n.translate('xpack.enterpriseSearch.nativeConnectors.passwordLabel', { +const PASSWORD_LABEL = i18n.translate('searchConnectors.nativeConnectors.passwordLabel', { defaultMessage: 'Password', }); -const ENABLE_SSL_LABEL = i18n.translate('xpack.enterpriseSearch.nativeConnectors.enableSSL.label', { +const ENABLE_SSL_LABEL = i18n.translate('searchConnectors.nativeConnectors.enableSSL.label', { defaultMessage: 'Enable SSL', }); const SSL_CERTIFICATE_LABEL = i18n.translate( - 'xpack.enterpriseSearch.nativeConnectors.sslCertificate.label', + 'searchConnectors.nativeConnectors.sslCertificate.label', { defaultMessage: 'SSL certificate', } ); const RETRIES_PER_REQUEST_LABEL = i18n.translate( - 'xpack.enterpriseSearch.nativeConnectors.retriesPerRequest.label', + 'searchConnectors.nativeConnectors.retriesPerRequest.label', { defaultMessage: 'Retries per request', } ); const ADVANCED_RULES_IGNORED_LABEL = i18n.translate( - 'xpack.enterpriseSearch.nativeConnectors.advancedRulesIgnored.label', + 'searchConnectors.nativeConnectors.advancedRulesIgnored.label', { defaultMessage: 'This configurable field is ignored when Advanced Sync Rules are used.', } ); const MAX_CONCURRENT_DOWNLOADS_LABEL = i18n.translate( - 'xpack.enterpriseSearch.nativeConnectors.nativeConnectors.maximumConcurrentLabel', + 'searchConnectors.nativeConnectors.nativeConnectors.maximumConcurrentLabel', { defaultMessage: 'Maximum concurrent downloads', } ); -const DATABASE_LABEL = i18n.translate('xpack.enterpriseSearch.nativeConnectors.databaseLabel', { +const DATABASE_LABEL = i18n.translate('searchConnectors.nativeConnectors.databaseLabel', { defaultMessage: 'Database', }); -const PORT_LABEL = i18n.translate('xpack.enterpriseSearch.nativeConnectors.portLabel', { +const PORT_LABEL = i18n.translate('searchConnectors.nativeConnectors.portLabel', { defaultMessage: 'Port', }); @@ -65,7 +66,7 @@ export const NATIVE_CONNECTOR_DEFINITIONS: Record { + primaryTerm: number | undefined; + seqNo: number | undefined; + value: T; +} diff --git a/packages/kbn-search-connectors/types/pagination.ts b/packages/kbn-search-connectors/types/pagination.ts new file mode 100644 index 0000000000000..65f397105013b --- /dev/null +++ b/packages/kbn-search-connectors/types/pagination.ts @@ -0,0 +1,22 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 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 interface Page { + from: number; // current page index, 0-based + has_more_hits_than_total?: boolean; + size: number; // size per page + total: number; // total number of hits +} +export interface Meta { + page: Page; +} + +export interface Paginate { + _meta: Meta; + data: T[]; +} diff --git a/packages/kbn-search-connectors/utils/fetch_with_pagination.test.ts b/packages/kbn-search-connectors/utils/fetch_with_pagination.test.ts new file mode 100644 index 0000000000000..9fa0831955840 --- /dev/null +++ b/packages/kbn-search-connectors/utils/fetch_with_pagination.test.ts @@ -0,0 +1,125 @@ +/* + * 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 { SearchResponse } from '@elastic/elasticsearch/lib/api/types'; + +import { fetchWithPagination } from './fetch_with_pagination'; + +describe('fetchWithPagination util', () => { + beforeEach(() => { + jest.clearAllMocks(); + }); + describe('fetchWithPagination', () => { + it('should fetch mock data with pagination', async () => { + const mockFn = jest.fn(); + mockFn.mockImplementation(() => + Promise.resolve({ + hits: { hits: ['result1', 'result2'], total: 2 }, + } as any as SearchResponse) + ); + await expect(fetchWithPagination(mockFn, 0, 10)).resolves.toEqual({ + _meta: { + page: { + from: 0, + has_more_hits_than_total: false, + size: 10, + total: 2, + }, + }, + data: ['result1', 'result2'], + }); + }); + it('should return empty result if size is 0', async () => { + const mockFn = jest.fn(); + mockFn.mockImplementation(() => + Promise.resolve({ + hits: { hits: [], total: 0 }, + } as any as SearchResponse) + ); + await expect(fetchWithPagination(mockFn, 0, 0)).resolves.toEqual({ + _meta: { + page: { + from: 0, + has_more_hits_than_total: false, + size: 10, + total: 0, + }, + }, + data: [], + }); + }); + it('should handle total as an object correctly', async () => { + const mockFn = jest.fn(); + mockFn.mockImplementation(() => + Promise.resolve({ + hits: { + hits: [], + total: { + relation: 'lte', + value: 555, + }, + }, + } as any as SearchResponse) + ); + await expect(fetchWithPagination(mockFn, 0, 10)).resolves.toEqual({ + _meta: { + page: { + from: 0, + has_more_hits_than_total: false, + size: 10, + total: 555, + }, + }, + data: [], + }); + }); + + it('should handle undefined total correctly', async () => { + const mockFn = jest.fn(); + mockFn.mockImplementation(() => + Promise.resolve({ + hits: { + hits: [], + total: undefined, + }, + } as any as SearchResponse) + ); + await expect(fetchWithPagination(mockFn, 0, 10)).resolves.toEqual({ + _meta: { + page: { + from: 0, + has_more_hits_than_total: false, + size: 10, + total: 0, + }, + }, + data: [], + }); + }); + + it('should handle has_more_hits_than_total correctly', async () => { + const mockFn = jest.fn(); + mockFn.mockImplementation(() => + Promise.resolve({ + hits: { hits: ['result1', 'result2'], total: { relation: 'gte', value: 10000 } }, + } as any as SearchResponse) + ); + await expect(fetchWithPagination(mockFn, 50, 10)).resolves.toEqual({ + _meta: { + page: { + from: 50, + has_more_hits_than_total: true, + size: 10, + total: 10000, + }, + }, + data: ['result1', 'result2'], + }); + }); + }); +}); diff --git a/packages/kbn-search-connectors/utils/fetch_with_pagination.ts b/packages/kbn-search-connectors/utils/fetch_with_pagination.ts new file mode 100644 index 0000000000000..fd6c6a5232374 --- /dev/null +++ b/packages/kbn-search-connectors/utils/fetch_with_pagination.ts @@ -0,0 +1,61 @@ +/* + * 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 { SearchHit, SearchResponse, SearchTotalHits } from '@elastic/elasticsearch/lib/api/types'; + +import { Paginate } from '../types/pagination'; + +const defaultResult = (data: T[]) => ({ + _meta: { + page: { + from: 0, + has_more_hits_than_total: false, + size: 10, + total: 0, + }, + }, + data, +}); + +export const fetchWithPagination = async ( + fetchFunction: () => Promise>, + from: number, + size: number +): Promise>> => { + if (size === 0) { + return defaultResult>([]); + } + const result = await fetchFunction(); + const total = totalToPaginateTotal(result.hits.total); + return { + _meta: { + page: { + from, + size, + ...total, + }, + }, + data: result.hits.hits, + }; +}; + +function totalToPaginateTotal(input: number | SearchTotalHits | undefined): { + has_more_hits_than_total: boolean; + total: number; +} { + if (typeof input === 'number') { + return { has_more_hits_than_total: false, total: input }; + } + + return input + ? { + has_more_hits_than_total: input.relation === 'gte' ? true : false, + total: input.value, + } + : { has_more_hits_than_total: false, total: 0 }; +} diff --git a/packages/kbn-search-connectors/utils/identify_exceptions.test.ts b/packages/kbn-search-connectors/utils/identify_exceptions.test.ts new file mode 100644 index 0000000000000..321b0310353bb --- /dev/null +++ b/packages/kbn-search-connectors/utils/identify_exceptions.test.ts @@ -0,0 +1,82 @@ +/* + * 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 { isIndexNotFoundException, isResourceAlreadyExistsException } from './identify_exceptions'; + +describe('IdentifyExceptions', () => { + describe('IsIndexNotFoundException', () => { + it('should return true for index not found exception', () => { + const error = { + meta: { + body: { + error: { + type: 'index_not_found_exception', + }, + status: 404, + }, + name: 'ResponseError', + statusCode: 404, + }, + }; + expect(isIndexNotFoundException(error as any)).toEqual(true); + }); + it('should return false for other exception', () => { + const error = { + meta: { + body: { + error: { + type: 'other_exception', + }, + status: 404, + }, + name: 'ResponseError', + statusCode: 404, + }, + }; + expect(isIndexNotFoundException(error as any)).toEqual(false); + }); + it('should return false for other object', () => { + expect(isIndexNotFoundException({} as any)).toEqual(false); + }); + }); + describe('isResourceAlreadyExistsError', () => { + it('should return true for resource already exists exception', () => { + const error = { + meta: { + body: { + error: { + type: 'resource_already_exists_exception', + }, + status: 400, + }, + name: 'ResponseError', + statusCode: 400, + }, + }; + expect(isResourceAlreadyExistsException(error as any)).toEqual(true); + }); + it('should return false for other exception', () => { + const error = { + meta: { + body: { + error: { + type: 'other_exception', + }, + status: 404, + }, + name: 'ResponseError', + statusCode: 404, + }, + }; + expect(isResourceAlreadyExistsException(error as any)).toEqual(false); + }); + it('should return false for other object', () => { + expect(isResourceAlreadyExistsException({} as any)).toEqual(false); + }); + }); +}); diff --git a/packages/kbn-search-connectors/utils/identify_exceptions.ts b/packages/kbn-search-connectors/utils/identify_exceptions.ts new file mode 100644 index 0000000000000..0bc395710d8f5 --- /dev/null +++ b/packages/kbn-search-connectors/utils/identify_exceptions.ts @@ -0,0 +1,50 @@ +/* + * 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 interface ElasticsearchResponseError { + meta?: { + body?: { + error?: { + type: string; + }; + }; + statusCode?: number; + }; + name: 'ResponseError'; +} + +const MISSING_ALIAS_ERROR = new RegExp(/^alias \[.+\] missing/); + +export const isIndexNotFoundException = (error: ElasticsearchResponseError) => + error?.meta?.body?.error?.type === 'index_not_found_exception'; + +export const isResourceAlreadyExistsException = (error: ElasticsearchResponseError) => + error?.meta?.body?.error?.type === 'resource_already_exists_exception'; + +export const isResourceNotFoundException = (error: ElasticsearchResponseError) => + error?.meta?.body?.error?.type === 'resource_not_found_exception'; + +export const isUnauthorizedException = (error: ElasticsearchResponseError) => + error.meta?.statusCode === 403; + +export const isNotFoundException = (error: ElasticsearchResponseError) => + error.meta?.statusCode === 404; + +export const isIllegalArgumentException = (error: ElasticsearchResponseError) => + error.meta?.body?.error?.type === 'illegal_argument_exception'; + +export const isVersionConflictEngineException = (error: ElasticsearchResponseError) => + error.meta?.body?.error?.type === 'version_conflict_engine_exception'; + +export const isInvalidSearchApplicationNameException = (error: ElasticsearchResponseError) => + error.meta?.body?.error?.type === 'invalid_alias_name_exception'; + +export const isMissingAliasException = (error: ElasticsearchResponseError) => + error.meta?.statusCode === 404 && + typeof error.meta?.body?.error === 'string' && + MISSING_ALIAS_ERROR.test(error.meta?.body?.error); diff --git a/packages/kbn-search-connectors/utils/index.ts b/packages/kbn-search-connectors/utils/index.ts new file mode 100644 index 0000000000000..ae2bbe2a818aa --- /dev/null +++ b/packages/kbn-search-connectors/utils/index.ts @@ -0,0 +1,9 @@ +/* + * 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 * from './is_category_entry'; diff --git a/packages/kbn-search-connectors/utils/is_category_entry.ts b/packages/kbn-search-connectors/utils/is_category_entry.ts new file mode 100644 index 0000000000000..fb72db52944df --- /dev/null +++ b/packages/kbn-search-connectors/utils/is_category_entry.ts @@ -0,0 +1,29 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 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 { ConnectorConfigProperties, ConnectorConfigCategoryProperties } from '../types/connectors'; + +export function isCategoryEntry( + input: + | ConnectorConfigProperties + | ConnectorConfigCategoryProperties + | { label: string; value: boolean } + | null +): input is ConnectorConfigCategoryProperties { + return (input as ConnectorConfigCategoryProperties)?.type === 'category'; +} + +export function isConfigEntry( + input: + | ConnectorConfigProperties + | ConnectorConfigCategoryProperties + | { label: string; value: boolean } + | null +): input is ConnectorConfigProperties { + return (input as ConnectorConfigCategoryProperties).type !== 'category'; +} diff --git a/packages/kbn-search-connectors/utils/is_not_nullish.ts b/packages/kbn-search-connectors/utils/is_not_nullish.ts new file mode 100644 index 0000000000000..88b39b70d4ec8 --- /dev/null +++ b/packages/kbn-search-connectors/utils/is_not_nullish.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. + */ + +export function isNotNullish(value: T | null | undefined): value is T { + return value !== null && value !== undefined; +} diff --git a/tsconfig.base.json b/tsconfig.base.json index afbbdcfe7601b..e5808369793ae 100644 --- a/tsconfig.base.json +++ b/tsconfig.base.json @@ -1186,6 +1186,8 @@ "@kbn/screenshotting-plugin/*": ["x-pack/plugins/screenshotting/*"], "@kbn/search-api-panels": ["packages/kbn-search-api-panels"], "@kbn/search-api-panels/*": ["packages/kbn-search-api-panels/*"], + "@kbn/search-connectors": ["packages/kbn-search-connectors"], + "@kbn/search-connectors/*": ["packages/kbn-search-connectors/*"], "@kbn/search-examples-plugin": ["examples/search_examples"], "@kbn/search-examples-plugin/*": ["examples/search_examples/*"], "@kbn/search-response-warnings": ["packages/kbn-search-response-warnings"], diff --git a/x-pack/plugins/enterprise_search/common/connectors/is_category_entry.ts b/x-pack/plugins/enterprise_search/common/connectors/is_category_entry.ts index 455bd6799e096..75344e1a0b912 100644 --- a/x-pack/plugins/enterprise_search/common/connectors/is_category_entry.ts +++ b/x-pack/plugins/enterprise_search/common/connectors/is_category_entry.ts @@ -5,7 +5,10 @@ * 2.0. */ -import { ConnectorConfigProperties, ConnectorConfigCategoryProperties } from '../types/connectors'; +import { + ConnectorConfigProperties, + ConnectorConfigCategoryProperties, +} from '@kbn/search-connectors'; export function isCategoryEntry( input: diff --git a/x-pack/plugins/enterprise_search/common/constants.ts b/x-pack/plugins/enterprise_search/common/constants.ts index 8c8ace6fd434f..9bbaadc4c2b83 100644 --- a/x-pack/plugins/enterprise_search/common/constants.ts +++ b/x-pack/plugins/enterprise_search/common/constants.ts @@ -7,8 +7,9 @@ import { i18n } from '@kbn/i18n'; +import { IngestPipelineParams } from '@kbn/search-connectors'; + import { ProductFeatures } from './types'; -import { IngestPipelineParams } from './types/connectors'; export const SEARCH_PRODUCT_NAME = i18n.translate('xpack.enterpriseSearch.search.productName', { defaultMessage: 'Search', diff --git a/x-pack/plugins/enterprise_search/common/types/crawler.ts b/x-pack/plugins/enterprise_search/common/types/crawler.ts index 678a99fa448d6..60043444524aa 100644 --- a/x-pack/plugins/enterprise_search/common/types/crawler.ts +++ b/x-pack/plugins/enterprise_search/common/types/crawler.ts @@ -5,7 +5,7 @@ * 2.0. */ -import { ConnectorStatus, SyncStatus } from './connectors'; +import { ConnectorStatus, SyncStatus } from '@kbn/search-connectors'; // See SharedTogo::Crawler::Status for details on how these are generated export enum CrawlerStatus { diff --git a/x-pack/plugins/enterprise_search/common/types/indices.ts b/x-pack/plugins/enterprise_search/common/types/indices.ts index b9e822e5168fd..57807ae98248a 100644 --- a/x-pack/plugins/enterprise_search/common/types/indices.ts +++ b/x-pack/plugins/enterprise_search/common/types/indices.ts @@ -12,7 +12,8 @@ import { Uuid, } from '@elastic/elasticsearch/lib/api/types'; -import { Connector } from './connectors'; +import { Connector } from '@kbn/search-connectors'; + import { Crawler } from './crawler'; export interface AlwaysShowPattern { diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/__mocks__/pipeline.mock.ts b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/__mocks__/pipeline.mock.ts index 55b21f2e4c753..2817716873c7e 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/__mocks__/pipeline.mock.ts +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/__mocks__/pipeline.mock.ts @@ -5,7 +5,7 @@ * 2.0. */ -import { IngestPipelineParams } from '../../../../common/types/connectors'; +import { IngestPipelineParams } from '@kbn/search-connectors'; export const mockPipelineState: IngestPipelineParams = { extract_binary_content: true, diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/__mocks__/search_indices.mock.ts b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/__mocks__/search_indices.mock.ts index 4f92ffa6a7830..d8ebc499400f9 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/__mocks__/search_indices.mock.ts +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/__mocks__/search_indices.mock.ts @@ -5,8 +5,6 @@ * 2.0. */ -import { ENTERPRISE_SEARCH_CONNECTOR_CRAWLER_SERVICE_TYPE } from '../../../../common/constants'; - import { ConnectorStatus, DisplayType, @@ -15,7 +13,10 @@ import { FilteringRuleRule, FilteringValidationState, SyncStatus, -} from '../../../../common/types/connectors'; +} from '@kbn/search-connectors'; + +import { ENTERPRISE_SEARCH_CONNECTOR_CRAWLER_SERVICE_TYPE } from '../../../../common/constants'; + import { ElasticsearchIndexWithIngestion } from '../../../../common/types/indices'; export const indices: ElasticsearchIndexWithIngestion[] = [ diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/__mocks__/sync_job.mock.ts b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/__mocks__/sync_job.mock.ts index db4d1870fba90..d19407961e039 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/__mocks__/sync_job.mock.ts +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/__mocks__/sync_job.mock.ts @@ -7,12 +7,8 @@ import moment from 'moment'; -import { - ConnectorSyncJob, - TriggerMethod, - SyncStatus, - SyncJobType, -} from '../../../../common/types/connectors'; +import { ConnectorSyncJob, TriggerMethod, SyncStatus, SyncJobType } from '@kbn/search-connectors'; + import { SyncJobView } from '../components/search_index/sync_jobs/sync_jobs_view_logic'; export const syncJob: ConnectorSyncJob = { diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/__mocks__/view_index.mock.ts b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/__mocks__/view_index.mock.ts index f10ca7cfba3b0..c548225ef78ac 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/__mocks__/view_index.mock.ts +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/__mocks__/view_index.mock.ts @@ -5,8 +5,6 @@ * 2.0. */ -import { ENTERPRISE_SEARCH_CONNECTOR_CRAWLER_SERVICE_TYPE } from '../../../../common/constants'; - import { ConnectorStatus, DisplayType, @@ -15,7 +13,9 @@ import { FilteringRuleRule, FilteringValidationState, SyncStatus, -} from '../../../../common/types/connectors'; +} from '@kbn/search-connectors'; + +import { ENTERPRISE_SEARCH_CONNECTOR_CRAWLER_SERVICE_TYPE } from '../../../../common/constants'; import { ApiViewIndex, diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/api/connector/fetch_sync_jobs_api_logic.ts b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/api/connector/fetch_sync_jobs_api_logic.ts index 7452c2b7d1600..e7485d6645ce4 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/api/connector/fetch_sync_jobs_api_logic.ts +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/api/connector/fetch_sync_jobs_api_logic.ts @@ -5,7 +5,8 @@ * 2.0. */ -import { ConnectorSyncJob } from '../../../../../common/types/connectors'; +import { ConnectorSyncJob } from '@kbn/search-connectors'; + import { Paginate } from '../../../../../common/types/pagination'; import { createApiLogic } from '../../../shared/api_logic/create_api_logic'; diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/api/connector/get_default_pipeline_api_logic.ts b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/api/connector/get_default_pipeline_api_logic.ts index eddc2f2ced2d5..288a9d17d179f 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/api/connector/get_default_pipeline_api_logic.ts +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/api/connector/get_default_pipeline_api_logic.ts @@ -5,7 +5,7 @@ * 2.0. */ -import { IngestPipelineParams } from '../../../../../common/types/connectors'; +import { IngestPipelineParams } from '@kbn/search-connectors'; import { createApiLogic } from '../../../shared/api_logic/create_api_logic'; import { HttpLogic } from '../../../shared/http'; diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/api/connector/update_connector_configuration_api_logic.ts b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/api/connector/update_connector_configuration_api_logic.ts index 72510ea9fc1d3..5721addbc034f 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/api/connector/update_connector_configuration_api_logic.ts +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/api/connector/update_connector_configuration_api_logic.ts @@ -7,7 +7,8 @@ import { i18n } from '@kbn/i18n'; -import { ConnectorConfiguration } from '../../../../../common/types/connectors'; +import { ConnectorConfiguration } from '@kbn/search-connectors'; + import { Actions, createApiLogic } from '../../../shared/api_logic/create_api_logic'; import { HttpLogic } from '../../../shared/http'; diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/api/connector/update_connector_filtering_api_logic.ts b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/api/connector/update_connector_filtering_api_logic.ts index 023d06b8f957b..00d300c32e058 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/api/connector/update_connector_filtering_api_logic.ts +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/api/connector/update_connector_filtering_api_logic.ts @@ -7,7 +7,8 @@ import { i18n } from '@kbn/i18n'; -import { FilteringRule, FilteringRules } from '../../../../../common/types/connectors'; +import { FilteringRule, FilteringRules } from '@kbn/search-connectors'; + import { createApiLogic } from '../../../shared/api_logic/create_api_logic'; import { HttpLogic } from '../../../shared/http'; diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/api/connector/update_connector_filtering_draft_api_logic.ts b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/api/connector/update_connector_filtering_draft_api_logic.ts index f380af36e849e..245899192726a 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/api/connector/update_connector_filtering_draft_api_logic.ts +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/api/connector/update_connector_filtering_draft_api_logic.ts @@ -7,7 +7,8 @@ import { i18n } from '@kbn/i18n'; -import { FilteringRule, FilteringRules } from '../../../../../common/types/connectors'; +import { FilteringRule, FilteringRules } from '@kbn/search-connectors'; + import { createApiLogic } from '../../../shared/api_logic/create_api_logic'; import { HttpLogic } from '../../../shared/http'; diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/api/connector/update_connector_name_and_description_api_logic.ts b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/api/connector/update_connector_name_and_description_api_logic.ts index 88d2c19a59eb0..2fc296d31c247 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/api/connector/update_connector_name_and_description_api_logic.ts +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/api/connector/update_connector_name_and_description_api_logic.ts @@ -7,7 +7,8 @@ import { i18n } from '@kbn/i18n'; -import { Connector } from '../../../../../common/types/connectors'; +import { Connector } from '@kbn/search-connectors'; + import { createApiLogic } from '../../../shared/api_logic/create_api_logic'; import { HttpLogic } from '../../../shared/http'; diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/api/connector/update_connector_scheduling_api_logic.ts b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/api/connector/update_connector_scheduling_api_logic.ts index c2ffaa647614f..00dce404e322d 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/api/connector/update_connector_scheduling_api_logic.ts +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/api/connector/update_connector_scheduling_api_logic.ts @@ -7,7 +7,8 @@ import { i18n } from '@kbn/i18n'; -import { SchedulingConfiguraton } from '../../../../../common/types/connectors'; +import { SchedulingConfiguraton } from '@kbn/search-connectors'; + import { createApiLogic } from '../../../shared/api_logic/create_api_logic'; import { HttpLogic } from '../../../shared/http'; diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/api/connector/update_default_pipeline_api_logic.ts b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/api/connector/update_default_pipeline_api_logic.ts index 81cfeadf8e39a..61b127d7ddc11 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/api/connector/update_default_pipeline_api_logic.ts +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/api/connector/update_default_pipeline_api_logic.ts @@ -7,7 +7,7 @@ import { i18n } from '@kbn/i18n'; -import { IngestPipelineParams } from '../../../../../common/types/connectors'; +import { IngestPipelineParams } from '@kbn/search-connectors'; import { createApiLogic } from '../../../shared/api_logic/create_api_logic'; import { HttpLogic } from '../../../shared/http'; diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/api/connector/update_pipeline_api_logic.ts b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/api/connector/update_pipeline_api_logic.ts index 496b50fce7444..f9ec661fa8df2 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/api/connector/update_pipeline_api_logic.ts +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/api/connector/update_pipeline_api_logic.ts @@ -7,7 +7,8 @@ import { i18n } from '@kbn/i18n'; -import { IngestPipelineParams } from '../../../../../common/types/connectors'; +import { IngestPipelineParams } from '@kbn/search-connectors'; + import { createApiLogic } from '../../../shared/api_logic/create_api_logic'; import { HttpLogic } from '../../../shared/http'; diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/api/pipelines/fetch_index_pipeline_parameters.ts b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/api/pipelines/fetch_index_pipeline_parameters.ts index 901a40e5c9e23..94be9aade7801 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/api/pipelines/fetch_index_pipeline_parameters.ts +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/api/pipelines/fetch_index_pipeline_parameters.ts @@ -5,7 +5,8 @@ * 2.0. */ -import { IngestPipelineParams } from '../../../../../common/types/connectors'; +import { IngestPipelineParams } from '@kbn/search-connectors'; + import { Actions, createApiLogic } from '../../../shared/api_logic/create_api_logic'; import { HttpLogic } from '../../../shared/http'; diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/components/curl_request/curl_request.tsx b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/components/curl_request/curl_request.tsx index a645a60fb67fb..3061ba03e4556 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/components/curl_request/curl_request.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/components/curl_request/curl_request.tsx @@ -9,7 +9,8 @@ import React from 'react'; import { EuiCodeBlock } from '@elastic/eui'; -import { IngestPipelineParams } from '../../../../../../../common/types/connectors'; +import { IngestPipelineParams } from '@kbn/search-connectors'; + import { useCloudDetails } from '../../../../../shared/cloud_details/cloud_details'; interface CurlRequestParams { diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/connector/connector_configuration.tsx b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/connector/connector_configuration.tsx index 0667451d8e761..90777ddfdb963 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/connector/connector_configuration.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/connector/connector_configuration.tsx @@ -26,7 +26,8 @@ import { i18n } from '@kbn/i18n'; import { FormattedMessage } from '@kbn/i18n-react'; -import { ConnectorStatus } from '../../../../../../common/types/connectors'; +import { ConnectorStatus } from '@kbn/search-connectors'; + import { BetaConnectorCallout } from '../../../../shared/beta/beta_connector_callout'; import { useCloudDetails } from '../../../../shared/cloud_details/cloud_details'; import { docLinks } from '../../../../shared/doc_links'; diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/connector/connector_configuration_field.tsx b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/connector/connector_configuration_field.tsx index a5c7a5b217353..2408d58e4c5f2 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/connector/connector_configuration_field.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/connector/connector_configuration_field.tsx @@ -25,8 +25,9 @@ import { import { i18n } from '@kbn/i18n'; +import { DisplayType } from '@kbn/search-connectors'; + import { Status } from '../../../../../../common/types/api'; -import { DisplayType } from '../../../../../../common/types/connectors'; import { LicensingLogic } from '../../../../shared/licensing'; import { ConnectorConfigurationApiLogic } from '../../../api/connector/update_connector_configuration_api_logic'; diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/connector/connector_configuration_form_items.tsx b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/connector/connector_configuration_form_items.tsx index 68907850bd7a8..2aa2236b51e89 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/connector/connector_configuration_form_items.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/connector/connector_configuration_form_items.tsx @@ -11,7 +11,7 @@ import { EuiFlexGroup, EuiFlexItem, EuiFormRow, EuiIcon, EuiPanel, EuiToolTip } import { i18n } from '@kbn/i18n'; -import { DisplayType } from '../../../../../../common/types/connectors'; +import { DisplayType } from '@kbn/search-connectors'; import { ConnectorConfigurationField } from './connector_configuration_field'; import { ConfigEntryView } from './connector_configuration_logic'; diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/connector/connector_configuration_logic.test.ts b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/connector/connector_configuration_logic.test.ts index d38a58c8940d7..60cc58c1db395 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/connector/connector_configuration_logic.test.ts +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/connector/connector_configuration_logic.test.ts @@ -8,7 +8,7 @@ import { LogicMounter } from '../../../../__mocks__/kea_logic'; import { connectorIndex } from '../../../__mocks__/view_index.mock'; -import { ConnectorStatus, DisplayType, FieldType } from '../../../../../../common/types/connectors'; +import { ConnectorStatus, DisplayType, FieldType } from '@kbn/search-connectors'; import { ConnectorConfigurationApiLogic } from '../../../api/connector/update_connector_configuration_api_logic'; import { CachedFetchIndexApiLogic } from '../../../api/index/cached_fetch_index_api_logic'; diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/connector/connector_configuration_logic.ts b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/connector/connector_configuration_logic.ts index fd13c0d55236c..9f82f4b539344 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/connector/connector_configuration_logic.ts +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/connector/connector_configuration_logic.ts @@ -9,14 +9,15 @@ import { kea, MakeLogicType } from 'kea'; import { i18n } from '@kbn/i18n'; -import { isCategoryEntry } from '../../../../../../common/connectors/is_category_entry'; import { ConnectorConfigProperties, ConnectorConfiguration, ConnectorStatus, Dependency, FieldType, -} from '../../../../../../common/types/connectors'; +} from '@kbn/search-connectors'; + +import { isCategoryEntry } from '../../../../../../common/connectors/is_category_entry'; import { isNotNullish } from '../../../../../../common/utils/is_not_nullish'; import { diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/connector/connector_name_and_description/connector_name_and_description_logic.ts b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/connector/connector_name_and_description/connector_name_and_description_logic.ts index a2869f5a90963..f6cc74d20eb19 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/connector/connector_name_and_description/connector_name_and_description_logic.ts +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/connector/connector_name_and_description/connector_name_and_description_logic.ts @@ -7,7 +7,8 @@ import { kea, MakeLogicType } from 'kea'; -import { Connector } from '../../../../../../../common/types/connectors'; +import { Connector } from '@kbn/search-connectors'; + import { Actions } from '../../../../../shared/api_logic/create_api_logic'; import { ConnectorNameAndDescriptionApiLogic, diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/connector/connector_scheduling.tsx b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/connector/connector_scheduling.tsx index 927f26e195f34..5ade2c11a8b55 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/connector/connector_scheduling.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/connector/connector_scheduling.tsx @@ -23,7 +23,7 @@ import { i18n } from '@kbn/i18n'; import { FormattedMessage } from '@kbn/i18n-react'; -import { ConnectorStatus, SyncJobType } from '../../../../../../common/types/connectors'; +import { ConnectorStatus, SyncJobType } from '@kbn/search-connectors'; import { generateEncodedPath } from '../../../../shared/encode_path_params'; import { KibanaLogic } from '../../../../shared/kibana'; diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/connector/connector_scheduling/connector_cron_editor.tsx b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/connector/connector_scheduling/connector_cron_editor.tsx index 9c38bdea220ca..c15a2ddefa5d6 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/connector/connector_scheduling/connector_cron_editor.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/connector/connector_scheduling/connector_cron_editor.tsx @@ -13,8 +13,9 @@ import { EuiFlexItem, EuiFlexGroup, EuiButton, EuiButtonEmpty } from '@elastic/e import { i18n } from '@kbn/i18n'; +import { ConnectorScheduling, SyncJobType } from '@kbn/search-connectors'; + import { Status } from '../../../../../../../common/types/api'; -import { ConnectorScheduling, SyncJobType } from '../../../../../../../common/types/connectors'; import { CronEditor } from '../../../../../shared/cron_editor'; import { Frequency } from '../../../../../shared/cron_editor/types'; import { UpdateConnectorSchedulingApiLogic } from '../../../../api/connector/update_connector_scheduling_api_logic'; diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/connector/connector_scheduling/full_content.tsx b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/connector/connector_scheduling/full_content.tsx index 3fbe4ef8859f2..2031fc1154dec 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/connector/connector_scheduling/full_content.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/connector/connector_scheduling/full_content.tsx @@ -23,7 +23,7 @@ import { import { i18n } from '@kbn/i18n'; -import { SyncJobType } from '../../../../../../../common/types/connectors'; +import { SyncJobType } from '@kbn/search-connectors'; import { ConnectorViewIndex, CrawlerViewIndex } from '../../../../types'; diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/connector/connector_scheduling_logic.test.ts b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/connector/connector_scheduling_logic.test.ts index 636035aa2ac83..c00392b24b3e3 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/connector/connector_scheduling_logic.test.ts +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/connector/connector_scheduling_logic.test.ts @@ -7,7 +7,7 @@ import { LogicMounter } from '../../../../__mocks__/kea_logic'; -import { SyncJobType } from '../../../../../../common/types/connectors'; +import { SyncJobType } from '@kbn/search-connectors'; import { ConnectorSchedulingLogic } from './connector_scheduling_logic'; diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/connector/connector_scheduling_logic.ts b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/connector/connector_scheduling_logic.ts index fdab8b7c59aef..5688b879b0d28 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/connector/connector_scheduling_logic.ts +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/connector/connector_scheduling_logic.ts @@ -7,7 +7,8 @@ import { kea, MakeLogicType } from 'kea'; -import { ConnectorScheduling, SyncJobType } from '../../../../../../common/types/connectors'; +import { ConnectorScheduling, SyncJobType } from '@kbn/search-connectors'; + import { Actions } from '../../../../shared/api_logic/create_api_logic'; import { diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/connector/constants.ts b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/connector/constants.ts index 64b4dad084d96..16ec910581086 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/connector/constants.ts +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/connector/constants.ts @@ -7,7 +7,7 @@ import dedent from 'dedent'; -import { CONNECTOR_DEFINITIONS } from '../../../../../../common/connectors/connectors'; +import { CONNECTOR_DEFINITIONS } from '@kbn/search-connectors'; import { docLinks } from '../../../../shared/doc_links'; import { CONNECTOR_ICONS } from '../../../../shared/icons/connector_icons'; diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/connector/native_connector_configuration/native_connector_configuration_config.tsx b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/connector/native_connector_configuration/native_connector_configuration_config.tsx index 53a6166ad34e5..0c4fa42a3fedb 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/connector/native_connector_configuration/native_connector_configuration_config.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/connector/native_connector_configuration/native_connector_configuration_config.tsx @@ -11,7 +11,7 @@ import { EuiSpacer, EuiLink, EuiText, EuiFlexGroup, EuiFlexItem, EuiCallOut } fr import { i18n } from '@kbn/i18n'; -import { ConnectorStatus } from '../../../../../../../common/types/connectors'; +import { ConnectorStatus } from '@kbn/search-connectors'; import { docLinks } from '../../../../../shared/doc_links'; diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/connector/sync_rules/connector_filtering_logic.tsx b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/connector/sync_rules/connector_filtering_logic.tsx index 13db854fa79e9..4dfea2cde5895 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/connector/sync_rules/connector_filtering_logic.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/connector/sync_rules/connector_filtering_logic.tsx @@ -9,8 +9,6 @@ import { kea, MakeLogicType } from 'kea'; import { isEqual } from 'lodash'; -import { Status } from '../../../../../../../common/types/api'; - import { FilteringConfig, FilteringPolicy, @@ -18,7 +16,10 @@ import { FilteringRuleRule, FilteringValidation, FilteringValidationState, -} from '../../../../../../../common/types/connectors'; +} from '@kbn/search-connectors'; + +import { Status } from '../../../../../../../common/types/api'; + import { Actions } from '../../../../../shared/api_logic/create_api_logic'; import { clearFlashMessages } from '../../../../../shared/flash_messages'; import { diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/connector/sync_rules/edit_sync_rules_flyout.tsx b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/connector/sync_rules/edit_sync_rules_flyout.tsx index e675b7a149d3b..779c3ec9e8bee 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/connector/sync_rules/edit_sync_rules_flyout.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/connector/sync_rules/edit_sync_rules_flyout.tsx @@ -23,7 +23,8 @@ import { import { i18n } from '@kbn/i18n'; -import { FilteringValidation } from '../../../../../../../common/types/connectors'; +import { FilteringValidation } from '@kbn/search-connectors'; + import { BetaCallOut } from '../../../../../shared/beta/beta_callout'; import { AdvancedSyncRules } from './advanced_sync_rules'; diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/connector/sync_rules/editable_basic_rules_table.tsx b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/connector/sync_rules/editable_basic_rules_table.tsx index b153c6b345431..5e56d34043a04 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/connector/sync_rules/editable_basic_rules_table.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/connector/sync_rules/editable_basic_rules_table.tsx @@ -23,11 +23,8 @@ import { import { i18n } from '@kbn/i18n'; -import { - FilteringPolicy, - FilteringRule, - FilteringRuleRule, -} from '../../../../../../../common/types/connectors'; +import { FilteringPolicy, FilteringRule, FilteringRuleRule } from '@kbn/search-connectors'; + import { docLinks } from '../../../../../shared/doc_links'; import { InlineEditableTable } from '../../../../../shared/tables/inline_editable_table/inline_editable_table'; diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/connector/sync_rules/sync_rules_callouts.tsx b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/connector/sync_rules/sync_rules_callouts.tsx index fe28ea499964e..16c85e24c5a3a 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/connector/sync_rules/sync_rules_callouts.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/connector/sync_rules/sync_rules_callouts.tsx @@ -11,7 +11,7 @@ import { EuiButton, EuiCallOut, EuiFlexGroup, EuiFlexItem, EuiLoadingSpinner } f import { i18n } from '@kbn/i18n'; -import { FilteringValidationState } from '../../../../../../../common/types/connectors'; +import { FilteringValidationState } from '@kbn/search-connectors'; interface FilteringStatusCalloutsProps { applyDraft: () => void; diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/connector/types.ts b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/connector/types.ts index a09a37ad1e93b..bab243892a146 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/connector/types.ts +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/connector/types.ts @@ -5,7 +5,7 @@ * 2.0. */ -import { ConnectorServerSideDefinition } from '../../../../../../common/connectors/connectors'; +import { ConnectorServerSideDefinition } from '@kbn/search-connectors'; export interface ConnectorClientSideDefinition { docsUrl?: string; diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/crawler/automatic_crawl_scheduler/automatic_crawl_scheduler_logic.ts b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/crawler/automatic_crawl_scheduler/automatic_crawl_scheduler_logic.ts index 12d00d64c1056..d7e64f9ea1550 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/crawler/automatic_crawl_scheduler/automatic_crawl_scheduler_logic.ts +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/crawler/automatic_crawl_scheduler/automatic_crawl_scheduler_logic.ts @@ -7,7 +7,7 @@ import { kea, MakeLogicType } from 'kea'; -import { ConnectorScheduling } from '../../../../../../../common/types/connectors'; +import { ConnectorScheduling } from '@kbn/search-connectors'; import { CrawlerIndex } from '../../../../../../../common/types/indices'; import { Actions } from '../../../../../shared/api_logic/create_api_logic'; diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/crawler/crawl_custom_settings_flyout/crawl_custom_settings_flyout_crawl_scheduler.tsx b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/crawler/crawl_custom_settings_flyout/crawl_custom_settings_flyout_crawl_scheduler.tsx index 53daad3dc6d80..7cda2cb4702e3 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/crawler/crawl_custom_settings_flyout/crawl_custom_settings_flyout_crawl_scheduler.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/crawler/crawl_custom_settings_flyout/crawl_custom_settings_flyout_crawl_scheduler.tsx @@ -22,7 +22,8 @@ import { import { i18n } from '@kbn/i18n'; -import { ConnectorScheduling } from '../../../../../../../common/types/connectors'; +import { ConnectorScheduling } from '@kbn/search-connectors'; + import { CrawlerIndex } from '../../../../../../../common/types/indices'; import { EnterpriseSearchCronEditor } from '../../../../../shared/cron_editor/enterprise_search_cron_editor'; import { docLinks } from '../../../../../shared/doc_links/doc_links'; diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/crawler/crawl_custom_settings_flyout/crawl_custom_settings_flyout_multi_crawl_logic.ts b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/crawler/crawl_custom_settings_flyout/crawl_custom_settings_flyout_multi_crawl_logic.ts index aa98f838a8e18..1266c143ba51f 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/crawler/crawl_custom_settings_flyout/crawl_custom_settings_flyout_multi_crawl_logic.ts +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/crawler/crawl_custom_settings_flyout/crawl_custom_settings_flyout_multi_crawl_logic.ts @@ -7,7 +7,8 @@ import { kea, MakeLogicType } from 'kea'; -import { ConnectorScheduling } from '../../../../../../../common/types/connectors'; +import { ConnectorScheduling } from '@kbn/search-connectors'; + import { CrawlerCustomSchedulesServer } from '../../../../../../../common/types/crawler'; import { CrawlerIndex } from '../../../../../../../common/types/indices'; diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/crawler/crawler_configuration/crawler_configuration_logic.ts b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/crawler/crawler_configuration/crawler_configuration_logic.ts index 9298ca3b32585..2bf7d4646d8d6 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/crawler/crawler_configuration/crawler_configuration_logic.ts +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/crawler/crawler_configuration/crawler_configuration_logic.ts @@ -7,8 +7,9 @@ import { kea, MakeLogicType } from 'kea'; +import { Connector } from '@kbn/search-connectors'; + import { Status } from '../../../../../../../common/types/api'; -import { Connector } from '../../../../../../../common/types/connectors'; import { UpdateHtmlExtractionActions, diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/index_view_logic.test.ts b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/index_view_logic.test.ts index 4bdcf6270f19e..65f61fd0d48ad 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/index_view_logic.test.ts +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/index_view_logic.test.ts @@ -12,11 +12,11 @@ import { } from '../../../__mocks__/kea_logic'; import { apiIndex, connectorIndex, crawlerIndex } from '../../__mocks__/view_index.mock'; +import { SyncStatus } from '@kbn/search-connectors'; import { nextTick } from '@kbn/test-jest-helpers'; import { Status } from '../../../../../common/types/api'; -import { SyncStatus } from '../../../../../common/types/connectors'; import { StartSyncApiLogic } from '../../api/connector/start_sync_api_logic'; import { CachedFetchIndexApiLogic } from '../../api/index/cached_fetch_index_api_logic'; diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/index_view_logic.ts b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/index_view_logic.ts index 7605910777dcc..f939b3b3dea63 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/index_view_logic.ts +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/index_view_logic.ts @@ -9,13 +9,9 @@ import { kea, MakeLogicType } from 'kea'; import { i18n } from '@kbn/i18n'; +import { Connector, FeatureName, IngestPipelineParams, SyncStatus } from '@kbn/search-connectors'; + import { Status } from '../../../../../common/types/api'; -import { - Connector, - FeatureName, - IngestPipelineParams, - SyncStatus, -} from '../../../../../common/types/connectors'; import { Actions } from '../../../shared/api_logic/create_api_logic'; import { flashSuccessToast } from '../../../shared/flash_messages'; import { KibanaLogic } from '../../../shared/kibana'; diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/overview.logic.ts b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/overview.logic.ts index dbe0610b4a855..ced2cc0d98099 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/overview.logic.ts +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/overview.logic.ts @@ -7,9 +7,10 @@ import { kea, MakeLogicType } from 'kea'; +import { IngestPipelineParams } from '@kbn/search-connectors'; + import { DEFAULT_PIPELINE_VALUES } from '../../../../../common/constants'; import { Status } from '../../../../../common/types/api'; -import { IngestPipelineParams } from '../../../../../common/types/connectors'; import { KibanaLogic } from '../../../shared/kibana'; import { GenerateApiKeyLogic } from '../../api/generate_api_key/generate_api_key_logic'; diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/pipelines/ingest_pipelines/default_pipeline_item.tsx b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/pipelines/ingest_pipelines/default_pipeline_item.tsx index 087ceda6a8d9d..a0e9e0949bc0c 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/pipelines/ingest_pipelines/default_pipeline_item.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/pipelines/ingest_pipelines/default_pipeline_item.tsx @@ -18,7 +18,8 @@ import { import { i18n } from '@kbn/i18n'; -import { IngestPipelineParams } from '../../../../../../../common/types/connectors'; +import { IngestPipelineParams } from '@kbn/search-connectors'; + import { ElasticsearchIndexWithIngestion } from '../../../../../../../common/types/indices'; import { isApiIndex } from '../../../../utils/indices'; diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/pipelines/ingest_pipelines/ingest_pipeline_flyout.tsx b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/pipelines/ingest_pipelines/ingest_pipeline_flyout.tsx index 1dcffe443855e..e5e3d2a030615 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/pipelines/ingest_pipelines/ingest_pipeline_flyout.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/pipelines/ingest_pipelines/ingest_pipeline_flyout.tsx @@ -28,7 +28,8 @@ import { import { i18n } from '@kbn/i18n'; import { FormattedMessage } from '@kbn/i18n-react'; -import { IngestPipelineParams } from '../../../../../../../common/types/connectors'; +import { IngestPipelineParams } from '@kbn/search-connectors'; + import { docLinks } from '../../../../../shared/doc_links'; import { CurlRequest } from '../../components/curl_request/curl_request'; diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/pipelines/pipeline_settings_form.tsx b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/pipelines/pipeline_settings_form.tsx index 96566f60972ab..140d88a6e9740 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/pipelines/pipeline_settings_form.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/pipelines/pipeline_settings_form.tsx @@ -10,7 +10,8 @@ import React from 'react'; import { EuiFlexGroup, EuiFlexItem } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; -import { IngestPipelineParams } from '../../../../../../common/types/connectors'; +import { IngestPipelineParams } from '@kbn/search-connectors'; + import { SettingsCheckableCard } from '../../shared/settings_checkable_card/settings_checkable_card'; interface PipelineSettingsFormProps { diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/pipelines/pipelines_logic.ts b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/pipelines/pipelines_logic.ts index bf71dc215243f..ccb86f1a7ecb2 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/pipelines/pipelines_logic.ts +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/pipelines/pipelines_logic.ts @@ -11,10 +11,11 @@ import { IngestPipeline } from '@elastic/elasticsearch/lib/api/types'; import { i18n } from '@kbn/i18n'; +import { IngestPipelineParams } from '@kbn/search-connectors'; + import { DEFAULT_PIPELINE_VALUES } from '../../../../../../common/constants'; import { HttpError } from '../../../../../../common/types/api'; -import { IngestPipelineParams } from '../../../../../../common/types/connectors'; import { ElasticsearchIndexWithIngestion } from '../../../../../../common/types/indices'; import { InferencePipeline } from '../../../../../../common/types/pipelines'; import { Actions } from '../../../../shared/api_logic/create_api_logic'; diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/sync_jobs/events_panel.test.tsx b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/sync_jobs/events_panel.test.tsx index 85c65f78a93f6..907072a720210 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/sync_jobs/events_panel.test.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/sync_jobs/events_panel.test.tsx @@ -9,7 +9,7 @@ import React from 'react'; import { shallow } from 'enzyme'; -import { TriggerMethod } from '../../../../../../common/types/connectors'; +import { TriggerMethod } from '@kbn/search-connectors'; import { SyncJobEventsPanel } from './events_panel'; diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/sync_jobs/events_panel.tsx b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/sync_jobs/events_panel.tsx index 00c67249523c3..04134c791a229 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/sync_jobs/events_panel.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/sync_jobs/events_panel.tsx @@ -13,7 +13,8 @@ import { EuiBasicTable, EuiBasicTableColumn } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; -import { TriggerMethod } from '../../../../../../common/types/connectors'; +import { TriggerMethod } from '@kbn/search-connectors'; + import { FormattedDateTime } from '../../../../shared/formatted_date_time'; import { FlyoutPanel } from './flyout_panel'; diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/sync_jobs/filtering_panel.test.tsx b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/sync_jobs/filtering_panel.test.tsx index 007a3b60b7900..14a46c8373ad9 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/sync_jobs/filtering_panel.test.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/sync_jobs/filtering_panel.test.tsx @@ -9,11 +9,7 @@ import React from 'react'; import { shallow } from 'enzyme'; -import { - FilteringPolicy, - FilteringRule, - FilteringRuleRule, -} from '../../../../../../common/types/connectors'; +import { FilteringPolicy, FilteringRule, FilteringRuleRule } from '@kbn/search-connectors'; import { FilteringPanel } from './filtering_panel'; diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/sync_jobs/filtering_panel.tsx b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/sync_jobs/filtering_panel.tsx index f5807525dbabe..8f5dee105df4e 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/sync_jobs/filtering_panel.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/sync_jobs/filtering_panel.tsx @@ -11,7 +11,7 @@ import { EuiCodeBlock, EuiPanel, EuiSpacer } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; -import { FilteringRule, FilteringRules } from '../../../../../../common/types/connectors'; +import { FilteringRule, FilteringRules } from '@kbn/search-connectors'; import { FilteringRulesTable } from '../../shared/filtering_rules_table/filtering_rules_table'; diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/sync_jobs/pipeline_panel.tsx b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/sync_jobs/pipeline_panel.tsx index 191961ad0b21b..f0a3d3945df71 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/sync_jobs/pipeline_panel.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/sync_jobs/pipeline_panel.tsx @@ -11,7 +11,7 @@ import { EuiBasicTable, EuiBasicTableColumn } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; -import { IngestPipelineParams } from '../../../../../../common/types/connectors'; +import { IngestPipelineParams } from '@kbn/search-connectors'; import { FlyoutPanel } from './flyout_panel'; diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/sync_jobs/sync_callouts.test.tsx b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/sync_jobs/sync_callouts.test.tsx index 03e0e4b17e51a..f57b45dee7abc 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/sync_jobs/sync_callouts.test.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/sync_jobs/sync_callouts.test.tsx @@ -11,7 +11,7 @@ import React from 'react'; import { shallow } from 'enzyme'; -import { SyncStatus, TriggerMethod } from '../../../../../../common/types/connectors'; +import { SyncStatus, TriggerMethod } from '@kbn/search-connectors'; import { SyncJobCallouts } from './sync_callouts'; diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/sync_jobs/sync_callouts.tsx b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/sync_jobs/sync_callouts.tsx index 461132980c66b..7c8a26617f2a8 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/sync_jobs/sync_callouts.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/sync_jobs/sync_callouts.tsx @@ -13,7 +13,8 @@ import { i18n } from '@kbn/i18n'; import { FormattedMessage } from '@kbn/i18n-react'; -import { SyncStatus, TriggerMethod } from '../../../../../../common/types/connectors'; +import { SyncStatus, TriggerMethod } from '@kbn/search-connectors'; + import { FormattedDateTime } from '../../../../shared/formatted_date_time'; import { durationToText } from '../../../utils/duration_to_text'; diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/sync_jobs/sync_jobs_history_table.tsx b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/sync_jobs/sync_jobs_history_table.tsx index 84fd9a30436d3..c659320614c6c 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/sync_jobs/sync_jobs_history_table.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/sync_jobs/sync_jobs_history_table.tsx @@ -13,7 +13,8 @@ import { EuiBadge, EuiBasicTable, EuiBasicTableColumn } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; -import { SyncJobType, SyncStatus } from '../../../../../../common/types/connectors'; +import { SyncJobType, SyncStatus } from '@kbn/search-connectors'; + import { FormattedDateTime } from '../../../../shared/formatted_date_time'; import { pageToPagination } from '../../../../shared/pagination/page_to_pagination'; diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/sync_jobs/sync_jobs_view_logic.test.ts b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/sync_jobs/sync_jobs_view_logic.test.ts index d5f21cc46b273..7ccc28de37772 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/sync_jobs/sync_jobs_view_logic.test.ts +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/sync_jobs/sync_jobs_view_logic.test.ts @@ -9,16 +9,11 @@ import { LogicMounter, mockFlashMessageHelpers } from '../../../../__mocks__/kea import moment from 'moment'; +import { ConnectorSyncJob, SyncJobType, SyncStatus, TriggerMethod } from '@kbn/search-connectors'; import { nextTick } from '@kbn/test-jest-helpers'; import { HttpError, Status } from '../../../../../../common/types/api'; -import { - ConnectorSyncJob, - SyncJobType, - SyncStatus, - TriggerMethod, -} from '../../../../../../common/types/connectors'; import { FetchSyncJobsApiLogic } from '../../../api/connector/fetch_sync_jobs_api_logic'; import { IndexViewLogic } from '../index_view_logic'; diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/sync_jobs/sync_jobs_view_logic.ts b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/sync_jobs/sync_jobs_view_logic.ts index cd17eb9a931d6..900b3a8360728 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/sync_jobs/sync_jobs_view_logic.ts +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/sync_jobs/sync_jobs_view_logic.ts @@ -9,9 +9,10 @@ import { kea, MakeLogicType } from 'kea'; import moment from 'moment'; +import { ConnectorSyncJob } from '@kbn/search-connectors'; + import { Status } from '../../../../../../common/types/api'; -import { ConnectorSyncJob } from '../../../../../../common/types/connectors'; import { Page, Paginate } from '../../../../../../common/types/pagination'; import { Actions } from '../../../../shared/api_logic/create_api_logic'; import { diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_indices/indices_logic.test.ts b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_indices/indices_logic.test.ts index 8455b563b4022..de14705f2b234 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_indices/indices_logic.test.ts +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_indices/indices_logic.test.ts @@ -11,12 +11,11 @@ import { connectorIndex, elasticsearchViewIndices } from '../../__mocks__/view_i import moment from 'moment'; +import { ConnectorStatus, SyncStatus } from '@kbn/search-connectors'; import { nextTick } from '@kbn/test-jest-helpers'; import { HttpError, Status } from '../../../../../common/types/api'; -import { ConnectorStatus, SyncStatus } from '../../../../../common/types/connectors'; - import { FetchIndicesAPILogic } from '../../api/index/fetch_indices_api_logic'; import { IngestionMethod, IngestionStatus } from '../../types'; diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_indices/indices_table.tsx b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_indices/indices_table.tsx index aee36cda0b348..244e4a48eca54 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_indices/indices_table.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_indices/indices_table.tsx @@ -19,7 +19,7 @@ import { import { i18n } from '@kbn/i18n'; -import { NATIVE_CONNECTOR_DEFINITIONS } from '../../../../../common/connectors/native_connectors'; +import { NATIVE_CONNECTOR_DEFINITIONS } from '@kbn/search-connectors'; import { Meta } from '../../../../../common/types/pagination'; import { healthColorsMap } from '../../../shared/constants/health_colors'; diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/settings/settings_logic.ts b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/settings/settings_logic.ts index 240ca8e43c15b..43ccf6f47ca39 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/settings/settings_logic.ts +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/settings/settings_logic.ts @@ -9,10 +9,11 @@ import { kea, MakeLogicType } from 'kea'; import { isDeepEqual } from 'react-use/lib/util'; +import { IngestPipelineParams } from '@kbn/search-connectors'; + import { DEFAULT_PIPELINE_VALUES } from '../../../../../common/constants'; import { Status } from '../../../../../common/types/api'; -import { IngestPipelineParams } from '../../../../../common/types/connectors'; import { Actions } from '../../../shared/api_logic/create_api_logic'; import { KibanaLogic } from '../../../shared/kibana'; diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/shared/filtering_rules_table/filtering_rules_table.tsx b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/shared/filtering_rules_table/filtering_rules_table.tsx index fc31f7892261d..763664329b19c 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/shared/filtering_rules_table/filtering_rules_table.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/shared/filtering_rules_table/filtering_rules_table.tsx @@ -11,11 +11,7 @@ import { EuiBasicTable, EuiBasicTableColumn, EuiCode } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; -import { - FilteringRule, - FilteringPolicy, - FilteringRuleRule, -} from '../../../../../../common/types/connectors'; +import { FilteringRule, FilteringPolicy, FilteringRuleRule } from '@kbn/search-connectors'; import { filteringPolicyToText, filteringRuleToText } from '../../../utils/filtering_rule_helpers'; diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/utils/filtering_rule_helpers.ts b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/utils/filtering_rule_helpers.ts index 44d832a0ef51d..b04dd1b37bf4a 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/utils/filtering_rule_helpers.ts +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/utils/filtering_rule_helpers.ts @@ -7,7 +7,7 @@ import { i18n } from '@kbn/i18n'; -import { FilteringPolicy, FilteringRuleRule } from '../../../../common/types/connectors'; +import { FilteringPolicy, FilteringRuleRule } from '@kbn/search-connectors'; const filteringRuleStringMap: Record = { [FilteringRuleRule.CONTAINS]: i18n.translate( diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/utils/has_configured_configuration.ts b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/utils/has_configured_configuration.ts index b9cadd80181b8..6b6d8a53b2c30 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/utils/has_configured_configuration.ts +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/utils/has_configured_configuration.ts @@ -5,8 +5,9 @@ * 2.0. */ +import { ConnectorConfiguration } from '@kbn/search-connectors'; + import { isConfigEntry } from '../../../../common/connectors/is_category_entry'; -import { ConnectorConfiguration } from '../../../../common/types/connectors'; export const hasConfiguredConfiguration = (configuration: ConnectorConfiguration) => { return !Object.entries(configuration).find( diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/utils/indices.test.ts b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/utils/indices.test.ts index e5e4273555b55..13e3482064ff6 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/utils/indices.test.ts +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/utils/indices.test.ts @@ -9,7 +9,8 @@ import { connectorIndex, crawlerIndex, apiIndex } from '../__mocks__/view_index. import moment from 'moment'; -import { ConnectorStatus, SyncStatus } from '../../../../common/types/connectors'; +import { ConnectorStatus, SyncStatus } from '@kbn/search-connectors'; + import { IngestionMethod, IngestionStatus } from '../types'; import { diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/utils/indices.ts b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/utils/indices.ts index e420ab0cf8dcf..2323b1b22cf5f 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/utils/indices.ts +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/utils/indices.ts @@ -9,8 +9,9 @@ import moment from 'moment'; import { i18n } from '@kbn/i18n'; +import { SyncStatus, ConnectorStatus } from '@kbn/search-connectors'; + import { ENTERPRISE_SEARCH_CONNECTOR_CRAWLER_SERVICE_TYPE } from '../../../../common/constants'; -import { SyncStatus, ConnectorStatus } from '../../../../common/types/connectors'; import { ConnectorIndex, CrawlerIndex, diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/utils/sync_status_to_text.test.ts b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/utils/sync_status_to_text.test.ts index 4272eaf11641e..5f11fabe1bc48 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/utils/sync_status_to_text.test.ts +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/utils/sync_status_to_text.test.ts @@ -5,7 +5,7 @@ * 2.0. */ -import { SyncStatus } from '../../../../common/types/connectors'; +import { SyncStatus } from '@kbn/search-connectors'; import { syncStatusToColor, syncStatusToText } from './sync_status_to_text'; diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/utils/sync_status_to_text.ts b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/utils/sync_status_to_text.ts index 6868fba40e59f..83b3245999dfc 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/utils/sync_status_to_text.ts +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/utils/sync_status_to_text.ts @@ -7,7 +7,7 @@ import { i18n } from '@kbn/i18n'; -import { SyncJobType, SyncStatus } from '../../../../common/types/connectors'; +import { SyncJobType, SyncStatus } from '@kbn/search-connectors'; export function syncStatusToText(status: SyncStatus): string { switch (status) { diff --git a/x-pack/plugins/enterprise_search/public/applications/shared/cron_editor/enterprise_search_cron_editor.tsx b/x-pack/plugins/enterprise_search/public/applications/shared/cron_editor/enterprise_search_cron_editor.tsx index 7b915f08c5df9..f31b26cd76e85 100644 --- a/x-pack/plugins/enterprise_search/public/applications/shared/cron_editor/enterprise_search_cron_editor.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/shared/cron_editor/enterprise_search_cron_editor.tsx @@ -9,7 +9,7 @@ import React, { useState } from 'react'; import { Frequency } from '@kbn/es-ui-shared-plugin/public/components/cron_editor/types'; -import { ConnectorScheduling } from '../../../../common/types/connectors'; +import { ConnectorScheduling } from '@kbn/search-connectors'; import { CronEditor } from './cron_editor'; diff --git a/x-pack/plugins/enterprise_search/server/api/connectors_service.ts b/x-pack/plugins/enterprise_search/server/api/connectors_service.ts deleted file mode 100644 index f13f02cb50796..0000000000000 --- a/x-pack/plugins/enterprise_search/server/api/connectors_service.ts +++ /dev/null @@ -1,54 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import { IClusterClient } from '@kbn/core-elasticsearch-server'; -import { HttpServiceStart, KibanaRequest } from '@kbn/core-http-server'; - -import { CONNECTOR_DEFINITIONS } from '../../common/connectors/connectors'; - -import { Connector, IngestPipelineParams } from '../../common/types/connectors'; - -import { addConnector } from '../lib/connectors/add_connector'; -import { fetchConnectors } from '../lib/connectors/fetch_connectors'; - -export class ConnectorsService { - private readonly clusterClient: IClusterClient; - private readonly http: HttpServiceStart; - - constructor({ clusterClient, http }: { clusterClient: IClusterClient; http: HttpServiceStart }) { - this.clusterClient = clusterClient; - this.http = http; - } - - async createConnector( - request: KibanaRequest, - input: { - indexName: string | null; - isNative: boolean; - language: string | null; - pipeline?: IngestPipelineParams | null; - serviceType: string | null; - } - ): Promise { - return await addConnector(this.clusterClient.asScoped(request), input); - } - - getConnectorTypes() { - return CONNECTOR_DEFINITIONS.map((connector) => ({ - ...connector, - iconPath: connector.iconPath - ? this.http.basePath.prepend( - `/plugins/enterpriseSearch/assets/source_icons/${connector.iconPath}` - ) - : 'logoEnterpriseSearch', - })); - } - - async getConnectors(request: KibanaRequest): Promise { - return await fetchConnectors(this.clusterClient.asScoped(request)); - } -} diff --git a/x-pack/plugins/enterprise_search/server/index.ts b/x-pack/plugins/enterprise_search/server/index.ts index e7df036ada1a4..a82d6f18a3b26 100644 --- a/x-pack/plugins/enterprise_search/server/index.ts +++ b/x-pack/plugins/enterprise_search/server/index.ts @@ -52,11 +52,7 @@ export const config: PluginConfigDescriptor = { }, schema: configSchema, }; -export const CONNECTORS_INDEX = '.elastic-connectors'; -export const CURRENT_CONNECTORS_INDEX = '.elastic-connectors-v1'; -export const CONNECTORS_JOBS_INDEX = '.elastic-connectors-sync-jobs'; -export const CURRENT_CONNECTORS_JOB_INDEX = '.elastic-connectors-sync-jobs-v1'; -export const CONNECTORS_VERSION = 1; + export const CRAWLERS_INDEX = '.ent-search-actastic-crawler2_configurations_v2'; export type EnterpriseSearchPluginStart = PluginStart; diff --git a/x-pack/plugins/enterprise_search/server/lib/connectors/add_connector.test.ts b/x-pack/plugins/enterprise_search/server/lib/connectors/add_connector.test.ts index fe18dbccda2d8..cd15faf6b90c1 100644 --- a/x-pack/plugins/enterprise_search/server/lib/connectors/add_connector.test.ts +++ b/x-pack/plugins/enterprise_search/server/lib/connectors/add_connector.test.ts @@ -7,19 +7,24 @@ import { IScopedClusterClient } from '@kbn/core/server'; -import { CURRENT_CONNECTORS_INDEX } from '../..'; -import { ConnectorStatus } from '../../../common/types/connectors'; +import { + createConnector, + fetchConnectorByIndexName, + deleteConnectorById, +} from '@kbn/search-connectors'; + import { ErrorCode } from '../../../common/types/error_codes'; import { fetchCrawlerByIndexName } from '../crawler/fetch_crawlers'; import { textAnalysisSettings } from '../indices/text_analysis'; import { addConnector } from './add_connector'; -import { deleteConnectorById } from './delete_connector'; -import { fetchConnectorByIndexName } from './fetch_connectors'; -jest.mock('./fetch_connectors', () => ({ fetchConnectorByIndexName: jest.fn() })); -jest.mock('./delete_connector', () => ({ deleteConnectorById: jest.fn() })); +jest.mock('@kbn/search-connectors', () => ({ + createConnector: jest.fn(), + deleteConnectorById: jest.fn(), + fetchConnectorByIndexName: jest.fn(), +})); jest.mock('../crawler/fetch_crawlers', () => ({ fetchCrawlerByIndexName: jest.fn() })); describe('addConnector lib function', () => { @@ -57,6 +62,10 @@ describe('addConnector lib function', () => { it('should add connector', async () => { mockClient.asCurrentUser.index.mockImplementation(() => ({ _id: 'fakeId' })); + (createConnector as jest.Mock).mockImplementation(() => ({ + id: 'fakeId', + index_name: 'index_name', + })); mockClient.asCurrentUser.indices.exists.mockImplementation(() => false); (fetchConnectorByIndexName as jest.Mock).mockImplementation(() => undefined); (fetchCrawlerByIndexName as jest.Mock).mockImplementation(() => undefined); @@ -69,95 +78,17 @@ describe('addConnector lib function', () => { language: 'fr', }) ).resolves.toEqual(expect.objectContaining({ id: 'fakeId', index_name: 'index_name' })); - expect(mockClient.asCurrentUser.index).toHaveBeenCalledWith({ - document: { - api_key_id: null, - configuration: {}, - custom_scheduling: {}, - description: null, - error: null, - features: null, - filtering: [ - { - active: { - advanced_snippet: { - created_at: expect.any(String), - updated_at: expect.any(String), - value: {}, - }, - rules: [ - { - created_at: expect.any(String), - field: '_', - id: 'DEFAULT', - order: 0, - policy: 'include', - rule: 'regex', - updated_at: expect.any(String), - value: '.*', - }, - ], - validation: { - errors: [], - state: 'valid', - }, - }, - domain: 'DEFAULT', - draft: { - advanced_snippet: { - created_at: expect.any(String), - updated_at: expect.any(String), - value: {}, - }, - rules: [ - { - created_at: expect.any(String), - field: '_', - id: 'DEFAULT', - order: 0, - policy: 'include', - rule: 'regex', - updated_at: expect.any(String), - value: '.*', - }, - ], - validation: { - errors: [], - state: 'valid', - }, - }, - }, - ], - index_name: 'index_name', - is_native: false, - language: 'fr', - last_access_control_sync_error: null, - last_access_control_sync_scheduled_at: null, - last_access_control_sync_status: null, - last_incremental_sync_scheduled_at: null, - last_seen: null, - last_sync_error: null, - last_sync_scheduled_at: null, - last_sync_status: null, - last_synced: null, - name: 'index_name', - pipeline: { - extract_binary_content: true, - name: 'ent-search-generic-ingestion', - reduce_whitespace: true, - run_ml_inference: false, - }, - scheduling: { - access_control: { enabled: false, interval: '0 0 0 * * ?' }, - full: { enabled: false, interval: '0 0 0 * * ?' }, - incremental: { enabled: false, interval: '0 0 0 * * ?' }, - }, - service_type: null, - status: ConnectorStatus.CREATED, - sync_now: false, + expect(createConnector).toHaveBeenCalledWith(mockClient.asCurrentUser, { + indexName: 'index_name', + isNative: false, + language: 'fr', + name: 'index_name', + pipeline: { + extract_binary_content: true, + name: 'ent-search-generic-ingestion', + reduce_whitespace: true, + run_ml_inference: false, }, - index: CURRENT_CONNECTORS_INDEX, - refresh: 'wait_for', }); expect(mockClient.asCurrentUser.indices.create).toHaveBeenCalledWith({ index: 'index_name', @@ -168,6 +99,10 @@ describe('addConnector lib function', () => { it('should reject if index already exists', async () => { mockClient.asCurrentUser.index.mockImplementation(() => ({ _id: 'fakeId' })); + (createConnector as jest.Mock).mockImplementation(() => ({ + id: 'fakeId', + index_name: 'index_name', + })); mockClient.asCurrentUser.indices.exists.mockImplementation(() => true); (fetchConnectorByIndexName as jest.Mock).mockImplementation(() => undefined); (fetchCrawlerByIndexName as jest.Mock).mockImplementation(() => undefined); @@ -202,6 +137,10 @@ describe('addConnector lib function', () => { it('should reject if crawler already exists', async () => { mockClient.asCurrentUser.index.mockImplementation(() => ({ _id: 'fakeId' })); + (createConnector as jest.Mock).mockImplementation(() => ({ + id: 'fakeId', + index_name: 'index_name', + })); mockClient.asCurrentUser.indices.exists.mockImplementation(() => false); (fetchConnectorByIndexName as jest.Mock).mockImplementation(() => undefined); (fetchCrawlerByIndexName as jest.Mock).mockImplementation(() => true); @@ -215,6 +154,7 @@ describe('addConnector lib function', () => { }) ).rejects.toEqual(new Error(ErrorCode.CRAWLER_ALREADY_EXISTS)); expect(mockClient.asCurrentUser.indices.create).not.toHaveBeenCalled(); + expect(createConnector).not.toHaveBeenCalled(); }); it('should reject with index already exists if connector and index already exist', async () => { @@ -232,10 +172,15 @@ describe('addConnector lib function', () => { }) ).rejects.toEqual(new Error(ErrorCode.INDEX_ALREADY_EXISTS)); expect(mockClient.asCurrentUser.indices.create).not.toHaveBeenCalled(); + expect(createConnector).not.toHaveBeenCalled(); }); it('should replace connector if deleteExistingConnector flag is true', async () => { mockClient.asCurrentUser.index.mockImplementation(() => ({ _id: 'fakeId' })); + (createConnector as jest.Mock).mockImplementation(() => ({ + id: 'fakeId', + index_name: 'index_name', + })); mockClient.asCurrentUser.indices.exists.mockImplementation(() => false); (fetchConnectorByIndexName as jest.Mock).mockImplementation(() => ({ id: 'connectorId' })); (fetchCrawlerByIndexName as jest.Mock).mockImplementation(() => undefined); @@ -249,96 +194,19 @@ describe('addConnector lib function', () => { language: null, }) ).resolves.toEqual(expect.objectContaining({ id: 'fakeId', index_name: 'index_name' })); - expect(deleteConnectorById).toHaveBeenCalledWith(mockClient, 'connectorId'); - expect(mockClient.asCurrentUser.index).toHaveBeenCalledWith({ - document: { - api_key_id: null, - configuration: {}, - custom_scheduling: {}, - description: null, - error: null, - features: null, - filtering: [ - { - active: { - advanced_snippet: { - created_at: expect.any(String), - updated_at: expect.any(String), - value: {}, - }, - rules: [ - { - created_at: expect.any(String), - field: '_', - id: 'DEFAULT', - order: 0, - policy: 'include', - rule: 'regex', - updated_at: expect.any(String), - value: '.*', - }, - ], - validation: { - errors: [], - state: 'valid', - }, - }, - domain: 'DEFAULT', - draft: { - advanced_snippet: { - created_at: expect.any(String), - updated_at: expect.any(String), - value: {}, - }, - rules: [ - { - created_at: expect.any(String), - field: '_', - id: 'DEFAULT', - order: 0, - policy: 'include', - rule: 'regex', - updated_at: expect.any(String), - value: '.*', - }, - ], - validation: { - errors: [], - state: 'valid', - }, - }, - }, - ], - index_name: 'index_name', - is_native: true, - language: null, - last_access_control_sync_error: null, - last_access_control_sync_scheduled_at: null, - last_access_control_sync_status: null, - last_incremental_sync_scheduled_at: null, - last_seen: null, - last_sync_error: null, - last_sync_scheduled_at: null, - last_sync_status: null, - last_synced: null, - name: 'index_name', - pipeline: { - extract_binary_content: true, - name: 'ent-search-generic-ingestion', - reduce_whitespace: true, - run_ml_inference: false, - }, - scheduling: { - access_control: { enabled: false, interval: '0 0 0 * * ?' }, - full: { enabled: false, interval: '0 0 0 * * ?' }, - incremental: { enabled: false, interval: '0 0 0 * * ?' }, - }, - service_type: null, - status: ConnectorStatus.CREATED, - sync_now: false, + expect(deleteConnectorById).toHaveBeenCalledWith(mockClient.asCurrentUser, 'connectorId'); + expect(createConnector).toHaveBeenCalledWith(mockClient.asCurrentUser, { + deleteExistingConnector: true, + indexName: 'index_name', + isNative: true, + language: null, + name: 'index_name', + pipeline: { + extract_binary_content: true, + name: 'ent-search-generic-ingestion', + reduce_whitespace: true, + run_ml_inference: false, }, - index: CURRENT_CONNECTORS_INDEX, - refresh: 'wait_for', }); expect(mockClient.asCurrentUser.indices.create).toHaveBeenCalledWith({ index: 'index_name', diff --git a/x-pack/plugins/enterprise_search/server/lib/connectors/add_connector.ts b/x-pack/plugins/enterprise_search/server/lib/connectors/add_connector.ts index 891a3e14a2a62..623b2f21c2c05 100644 --- a/x-pack/plugins/enterprise_search/server/lib/connectors/add_connector.ts +++ b/x-pack/plugins/enterprise_search/server/lib/connectors/add_connector.ts @@ -7,30 +7,35 @@ import { IScopedClusterClient } from '@kbn/core/server'; -import { CURRENT_CONNECTORS_INDEX } from '../..'; import { + createConnector, Connector, - ConnectorDocument, - IngestPipelineParams, -} from '../../../common/types/connectors'; + deleteConnectorById, + ConnectorStatus, +} from '@kbn/search-connectors'; + +import { fetchConnectorByIndexName, NATIVE_CONNECTOR_DEFINITIONS } from '@kbn/search-connectors'; + +import { ENTERPRISE_SEARCH_CONNECTOR_CRAWLER_SERVICE_TYPE } from '../../../common/constants'; + import { ErrorCode } from '../../../common/types/error_codes'; -import { createConnectorDocument } from '../../utils/create_connector_document'; +import { stripSearchPrefix } from '../../../common/utils/strip_search_prefix'; import { fetchCrawlerByIndexName } from '../crawler/fetch_crawlers'; import { createIndex } from '../indices/create_index'; import { getDefaultPipeline } from '../pipelines/get_default_pipeline'; -import { deleteConnectorById } from './delete_connector'; - -import { fetchConnectorByIndexName } from './fetch_connectors'; - -const createConnector = async ( - document: ConnectorDocument, +export const addConnector = async ( client: IScopedClusterClient, - language: string | null, - deleteExisting: boolean + input: { + deleteExistingConnector?: boolean; + indexName: string | null; + isNative: boolean; + language: string | null; + serviceType?: string | null; + } ): Promise => { - const index = document.index_name; + const index = input.indexName; if (index) { const indexExists = await client.asCurrentUser.indices.exists({ index }); if (indexExists) { @@ -39,10 +44,10 @@ const createConnector = async ( } } - const connector = await fetchConnectorByIndexName(client, index); + const connector = await fetchConnectorByIndexName(client.asCurrentUser, index); if (connector) { - if (deleteExisting) { - await deleteConnectorById(client, connector.id); + if (input.deleteExistingConnector) { + await deleteConnectorById(client.asCurrentUser, connector.id); } else { throw new Error(ErrorCode.CONNECTOR_DOCUMENT_ALREADY_EXISTS); } @@ -52,35 +57,35 @@ const createConnector = async ( if (crawler) { throw new Error(ErrorCode.CRAWLER_ALREADY_EXISTS); } - await createIndex(client, index, language, false); + await createIndex(client, index, input.language, false); } - const result = await client.asCurrentUser.index({ - document, - index: CURRENT_CONNECTORS_INDEX, - refresh: 'wait_for', - }); - return { ...document, id: result._id }; -}; + const nativeConnector = + input.isNative && input.serviceType + ? NATIVE_CONNECTOR_DEFINITIONS[input.serviceType] + : undefined; -export const addConnector = async ( - client: IScopedClusterClient, - input: { - deleteExistingConnector?: boolean; - indexName: string | null; - isNative: boolean; - language: string | null; - pipeline?: IngestPipelineParams | null; - serviceType?: string | null; + if ( + input.isNative && + input.serviceType && + !nativeConnector && + input.serviceType !== ENTERPRISE_SEARCH_CONNECTOR_CRAWLER_SERVICE_TYPE + ) { + throw new Error(`Could not find connector definition for service type ${input.serviceType}`); } -): Promise => { - const pipeline = input.pipeline || (await getDefaultPipeline(client)); - const document = createConnectorDocument({ + const nativeFields = nativeConnector + ? { + configuration: nativeConnector.configuration, + features: nativeConnector.features, + status: ConnectorStatus.NEEDS_CONFIGURATION, + } + : {}; + + return await createConnector(client.asCurrentUser, { ...input, - pipeline, - serviceType: input.serviceType || null, + name: stripSearchPrefix(input.indexName || ''), + ...nativeFields, + pipeline: await getDefaultPipeline(client), }); - - return await createConnector(document, client, input.language, !!input.deleteExistingConnector); }; diff --git a/x-pack/plugins/enterprise_search/server/lib/connectors/delete_connector.ts b/x-pack/plugins/enterprise_search/server/lib/connectors/delete_connector.ts deleted file mode 100644 index cd935f32c2c15..0000000000000 --- a/x-pack/plugins/enterprise_search/server/lib/connectors/delete_connector.ts +++ /dev/null @@ -1,22 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import { IScopedClusterClient } from '@kbn/core/server'; - -import { CONNECTORS_INDEX } from '../..'; - -import { cancelSyncs } from './post_cancel_syncs'; - -export const deleteConnectorById = async (client: IScopedClusterClient, id: string) => { - // timeout function to mitigate race condition with external connector running job and recreating index - const timeout = async () => { - const promise = new Promise((resolve) => setTimeout(resolve, 500)); - return promise; - }; - await Promise.all([cancelSyncs(client, id), timeout]); - return await client.asCurrentUser.delete({ id, index: CONNECTORS_INDEX, refresh: 'wait_for' }); -}; diff --git a/x-pack/plugins/enterprise_search/server/lib/connectors/fetch_connector_index_names.ts b/x-pack/plugins/enterprise_search/server/lib/connectors/fetch_connector_index_names.ts deleted file mode 100644 index 7d087f8e74c75..0000000000000 --- a/x-pack/plugins/enterprise_search/server/lib/connectors/fetch_connector_index_names.ts +++ /dev/null @@ -1,28 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import { IScopedClusterClient } from '@kbn/core/server'; -import { isIndexNotFoundException } from '@kbn/core-saved-objects-migration-server-internal'; - -import { CONNECTORS_INDEX } from '../..'; - -export async function fetchConnectorIndexNames(client: IScopedClusterClient): Promise { - try { - const result = await client.asCurrentUser.search({ - _source: false, - fields: [{ field: 'index_name' }], - index: CONNECTORS_INDEX, - size: 10000, - }); - return (result?.hits.hits ?? []).map((field) => field.fields?.index_name[0] ?? ''); - } catch (error) { - if (isIndexNotFoundException(error)) { - return []; - } - throw error; - } -} diff --git a/x-pack/plugins/enterprise_search/server/lib/connectors/put_update_native.ts b/x-pack/plugins/enterprise_search/server/lib/connectors/put_update_native.ts deleted file mode 100644 index 6b3039974f8a4..0000000000000 --- a/x-pack/plugins/enterprise_search/server/lib/connectors/put_update_native.ts +++ /dev/null @@ -1,27 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import { IScopedClusterClient } from '@kbn/core-elasticsearch-server'; - -import { CONNECTORS_INDEX } from '../..'; -import { Connector } from '../../../common/types/connectors'; - -export const putUpdateNative = async ( - client: IScopedClusterClient, - connectorId: string, - isNative: boolean -) => { - const result = await client.asCurrentUser.update({ - doc: { - is_native: isNative, - }, - id: connectorId, - index: CONNECTORS_INDEX, - }); - - return result; -}; diff --git a/x-pack/plugins/enterprise_search/server/lib/connectors/start_sync.test.ts b/x-pack/plugins/enterprise_search/server/lib/connectors/start_sync.test.ts index 90d82c82aca93..6498d3f4d1a03 100644 --- a/x-pack/plugins/enterprise_search/server/lib/connectors/start_sync.test.ts +++ b/x-pack/plugins/enterprise_search/server/lib/connectors/start_sync.test.ts @@ -6,15 +6,19 @@ */ import { IScopedClusterClient } from '@kbn/core/server'; +import { + CONNECTORS_INDEX, + SyncJobType, + SyncStatus, + TriggerMethod, + CURRENT_CONNECTORS_JOB_INDEX, +} from '@kbn/search-connectors'; -import { CONNECTORS_INDEX, CURRENT_CONNECTORS_JOB_INDEX } from '../..'; import { CONNECTORS_ACCESS_CONTROL_INDEX_PREFIX } from '../../../common/constants'; -import { SyncJobType, SyncStatus, TriggerMethod } from '../../../common/types/connectors'; - import { ErrorCode } from '../../../common/types/error_codes'; -import { startConnectorSync } from './start_sync'; +import { startSync } from './start_sync'; describe('startSync lib function', () => { const mockClient = { @@ -31,7 +35,7 @@ describe('startSync lib function', () => { }); it('should start a full sync', async () => { - mockClient.asCurrentUser.get.mockImplementationOnce(() => { + mockClient.asCurrentUser.get.mockImplementation(() => { return Promise.resolve({ _id: 'connectorId', _source: { @@ -61,11 +65,7 @@ describe('startSync lib function', () => { mockClient.asCurrentUser.index.mockImplementation(() => ({ _id: 'fakeId' })); await expect( - startConnectorSync( - mockClient as unknown as IScopedClusterClient, - 'connectorId', - SyncJobType.FULL - ) + startSync(mockClient as unknown as IScopedClusterClient, 'connectorId', SyncJobType.FULL) ).resolves.toEqual({ _id: 'fakeId' }); expect(mockClient.asCurrentUser.index).toHaveBeenCalledWith({ document: { @@ -98,8 +98,8 @@ describe('startSync lib function', () => { index: CURRENT_CONNECTORS_JOB_INDEX, }); }); - it('should start a full sync with service type, pipeline and nextSyncConfig', async () => { - mockClient.asCurrentUser.get.mockImplementationOnce(() => { + it('should start a full sync with service type, pipeline', async () => { + mockClient.asCurrentUser.get.mockImplementation(() => { return Promise.resolve({ _source: { api_key_id: null, @@ -126,12 +126,7 @@ describe('startSync lib function', () => { mockClient.asCurrentUser.index.mockImplementation(() => ({ _id: 'fakeId' })); await expect( - startConnectorSync( - mockClient as unknown as IScopedClusterClient, - 'connectorId', - SyncJobType.FULL, - 'syncConfig' - ) + startSync(mockClient as unknown as IScopedClusterClient, 'connectorId', SyncJobType.FULL) ).resolves.toEqual({ _id: 'fakeId' }); expect(mockClient.asCurrentUser.index).toHaveBeenCalledWith({ document: { @@ -141,7 +136,6 @@ describe('startSync lib function', () => { connector: { configuration: { config: { label: 'label', value: 'haha' }, - nextSyncConfig: { label: 'nextSyncConfig', value: 'syncConfig' }, }, filtering: 'filtering', id: 'connectorId', @@ -169,21 +163,17 @@ describe('startSync lib function', () => { }); it('should not create index if there is no connector', async () => { - mockClient.asCurrentUser.get.mockImplementationOnce(() => { + mockClient.asCurrentUser.get.mockImplementation(() => { return Promise.resolve({}); }); await expect( - startConnectorSync( - mockClient as unknown as IScopedClusterClient, - 'connectorId', - SyncJobType.FULL - ) + startSync(mockClient as unknown as IScopedClusterClient, 'connectorId', SyncJobType.FULL) ).rejects.toEqual(new Error(ErrorCode.RESOURCE_NOT_FOUND)); expect(mockClient.asCurrentUser.index).not.toHaveBeenCalled(); }); it('should set sync_now for crawler and not index a sync job', async () => { - mockClient.asCurrentUser.get.mockImplementationOnce(() => { + mockClient.asCurrentUser.get.mockImplementation(() => { return Promise.resolve({ _primary_term: 1, _seq_no: 10, @@ -212,7 +202,7 @@ describe('startSync lib function', () => { mockClient.asCurrentUser.update.mockImplementation(() => ({ _id: 'fakeId' })); await expect( - startConnectorSync( + startSync( mockClient as unknown as IScopedClusterClient, 'connectorId', SyncJobType.FULL, @@ -236,7 +226,7 @@ describe('startSync lib function', () => { }); it('should start an incremental sync', async () => { - mockClient.asCurrentUser.get.mockImplementationOnce(() => { + mockClient.asCurrentUser.get.mockImplementation(() => { return Promise.resolve({ _id: 'connectorId', _source: { @@ -265,7 +255,7 @@ describe('startSync lib function', () => { mockClient.asCurrentUser.index.mockImplementation(() => ({ _id: 'fakeId' })); await expect( - startConnectorSync( + startSync( mockClient as unknown as IScopedClusterClient, 'connectorId', SyncJobType.INCREMENTAL @@ -304,7 +294,7 @@ describe('startSync lib function', () => { }); it('should start an access control sync', async () => { - mockClient.asCurrentUser.get.mockImplementationOnce(() => { + mockClient.asCurrentUser.get.mockImplementation(() => { return Promise.resolve({ _id: 'connectorId', _source: { @@ -332,7 +322,7 @@ describe('startSync lib function', () => { mockClient.asCurrentUser.index.mockImplementation(() => ({ _id: 'fakeId' })); await expect( - startConnectorSync( + startSync( mockClient as unknown as IScopedClusterClient, 'connectorId', SyncJobType.ACCESS_CONTROL diff --git a/x-pack/plugins/enterprise_search/server/lib/connectors/start_sync.ts b/x-pack/plugins/enterprise_search/server/lib/connectors/start_sync.ts index faac79a29c0a7..808fd2fc0d40e 100644 --- a/x-pack/plugins/enterprise_search/server/lib/connectors/start_sync.ts +++ b/x-pack/plugins/enterprise_search/server/lib/connectors/start_sync.ts @@ -7,7 +7,14 @@ import { IScopedClusterClient } from '@kbn/core/server'; -import { CONNECTORS_INDEX, CURRENT_CONNECTORS_JOB_INDEX } from '../..'; +import { + ConnectorConfiguration, + ConnectorDocument, + SyncJobType, + CONNECTORS_INDEX, + startConnectorSync, +} from '@kbn/search-connectors'; + import { isConfigEntry } from '../../../common/connectors/is_category_entry'; import { @@ -15,21 +22,14 @@ import { ENTERPRISE_SEARCH_CONNECTOR_CRAWLER_SERVICE_TYPE, } from '../../../common/constants'; -import { - ConnectorConfiguration, - ConnectorDocument, - SyncJobType, - SyncStatus, - TriggerMethod, -} from '../../../common/types/connectors'; import { ErrorCode } from '../../../common/types/error_codes'; import { stripSearchPrefix } from '../../../common/utils/strip_search_prefix'; -export const startConnectorSync = async ( +export const startSync = async ( client: IScopedClusterClient, connectorId: string, jobType: SyncJobType, - nextSyncConfig?: string + nextSyncConfig?: string // only processed for elastic-crawler service types ) => { const connectorResult = await client.asCurrentUser.get({ id: connectorId, @@ -49,9 +49,7 @@ export const startConnectorSync = async ( nextSyncConfig: { label: 'nextSyncConfig', value: nextSyncConfig }, } : config; - const { filtering, index_name, language, pipeline, service_type } = connector; - - const now = new Date().toISOString(); + const { index_name } = connector; if (connector.service_type === ENTERPRISE_SEARCH_CONNECTOR_CRAWLER_SERVICE_TYPE) { return await client.asCurrentUser.update({ @@ -70,37 +68,12 @@ export const startConnectorSync = async ( const targetIndexName = jobType === SyncJobType.ACCESS_CONTROL ? `${CONNECTORS_ACCESS_CONTROL_INDEX_PREFIX}${indexNameWithoutSearchPrefix}` - : index_name; + : index_name ?? undefined; - return await client.asCurrentUser.index({ - document: { - cancelation_requested_at: null, - canceled_at: null, - completed_at: null, - connector: { - configuration, - filtering: filtering ? filtering[0]?.active ?? null : null, - id: connectorId, - index_name: targetIndexName, - language, - pipeline: pipeline ?? null, - service_type, - }, - created_at: now, - deleted_document_count: 0, - error: null, - indexed_document_count: 0, - indexed_document_volume: 0, - job_type: jobType, - last_seen: null, - metadata: {}, - started_at: null, - status: SyncStatus.PENDING, - total_document_count: null, - trigger_method: TriggerMethod.ON_DEMAND, - worker_hostname: null, - }, - index: CURRENT_CONNECTORS_JOB_INDEX, + return await startConnectorSync(client.asCurrentUser, { + connectorId, + jobType, + targetIndexName, }); } else { throw new Error(ErrorCode.RESOURCE_NOT_FOUND); diff --git a/x-pack/plugins/enterprise_search/server/lib/connectors/update_connector_status.ts b/x-pack/plugins/enterprise_search/server/lib/connectors/update_connector_status.ts deleted file mode 100644 index caf8bbc7c7ce9..0000000000000 --- a/x-pack/plugins/enterprise_search/server/lib/connectors/update_connector_status.ts +++ /dev/null @@ -1,40 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import { IScopedClusterClient } from '@kbn/core/server'; -import { i18n } from '@kbn/i18n'; - -import { CONNECTORS_INDEX } from '../..'; - -import { ConnectorDocument, ConnectorStatus } from '../../../common/types/connectors'; - -export const updateConnectorStatus = async ( - client: IScopedClusterClient, - connectorId: string, - status: ConnectorStatus -) => { - const connectorResult = await client.asCurrentUser.get({ - id: connectorId, - index: CONNECTORS_INDEX, - }); - const connector = connectorResult._source; - if (connector) { - const result = await client.asCurrentUser.index({ - document: { ...connector, status }, - id: connectorId, - index: CONNECTORS_INDEX, - }); - await client.asCurrentUser.indices.refresh({ index: CONNECTORS_INDEX }); - return result; - } else { - throw new Error( - i18n.translate('xpack.enterpriseSearch.server.connectors.serviceType.error', { - defaultMessage: 'Could not find document', - }) - ); - } -}; diff --git a/x-pack/plugins/enterprise_search/server/lib/crawler/fetch_crawler_multiple_schedules.ts b/x-pack/plugins/enterprise_search/server/lib/crawler/fetch_crawler_multiple_schedules.ts index 666921a950a8c..d367e02ed6ab1 100644 --- a/x-pack/plugins/enterprise_search/server/lib/crawler/fetch_crawler_multiple_schedules.ts +++ b/x-pack/plugins/enterprise_search/server/lib/crawler/fetch_crawler_multiple_schedules.ts @@ -7,8 +7,9 @@ import { IScopedClusterClient } from '@kbn/core/server'; +import { Connector } from '@kbn/search-connectors'; + import { CONNECTORS_INDEX } from '../..'; -import { Connector } from '../../../common/types/connectors'; const CUSTOM_SCHEDULING = 'custom_scheduling'; diff --git a/x-pack/plugins/enterprise_search/server/lib/crawler/fetch_crawlers.ts b/x-pack/plugins/enterprise_search/server/lib/crawler/fetch_crawlers.ts index 9f6890fb9b8ab..b4766cf0d9d4b 100644 --- a/x-pack/plugins/enterprise_search/server/lib/crawler/fetch_crawlers.ts +++ b/x-pack/plugins/enterprise_search/server/lib/crawler/fetch_crawlers.ts @@ -7,9 +7,8 @@ import { QueryDslQueryContainer } from '@elastic/elasticsearch/lib/api/types'; import { IScopedClusterClient } from '@kbn/core/server'; +import { Connector, CONNECTORS_INDEX } from '@kbn/search-connectors'; -import { CONNECTORS_INDEX } from '../..'; -import { Connector } from '../../../common/types/connectors'; import { Crawler, CrawlRequest } from '../../../common/types/crawler'; import { fetchAll } from '../fetch_all'; diff --git a/x-pack/plugins/enterprise_search/server/lib/crawler/post_connector.test.ts b/x-pack/plugins/enterprise_search/server/lib/crawler/post_connector.test.ts index 8c6ad6cbb6a84..7a8f5edd80330 100644 --- a/x-pack/plugins/enterprise_search/server/lib/crawler/post_connector.test.ts +++ b/x-pack/plugins/enterprise_search/server/lib/crawler/post_connector.test.ts @@ -7,8 +7,7 @@ import { IScopedClusterClient } from '@kbn/core/server'; -import { CONNECTORS_INDEX } from '../..'; -import { ConnectorStatus } from '../../../common/types/connectors'; +import { CONNECTORS_INDEX, ConnectorStatus } from '@kbn/search-connectors'; import { recreateConnectorDocument } from './post_connector'; diff --git a/x-pack/plugins/enterprise_search/server/lib/crawler/post_connector.ts b/x-pack/plugins/enterprise_search/server/lib/crawler/post_connector.ts index 17bf6945d0d82..292e07809b7bd 100644 --- a/x-pack/plugins/enterprise_search/server/lib/crawler/post_connector.ts +++ b/x-pack/plugins/enterprise_search/server/lib/crawler/post_connector.ts @@ -7,12 +7,10 @@ import { IScopedClusterClient } from '@kbn/core-elasticsearch-server'; -import { CONNECTORS_INDEX } from '../..'; +import { createConnectorDocument, CONNECTORS_INDEX, ConnectorStatus } from '@kbn/search-connectors'; import { ENTERPRISE_SEARCH_CONNECTOR_CRAWLER_SERVICE_TYPE } from '../../../common/constants'; -import { ConnectorStatus } from '../../../common/types/connectors'; - -import { createConnectorDocument } from '../../utils/create_connector_document'; +import { stripSearchPrefix } from '../../../common/utils/strip_search_prefix'; export const recreateConnectorDocument = async ( client: IScopedClusterClient, @@ -23,6 +21,7 @@ export const recreateConnectorDocument = async ( isNative: false, // The search index has already been created so we don't need the language, which we can't retrieve anymore anyway language: '', + name: stripSearchPrefix(indexName), pipeline: null, serviceType: ENTERPRISE_SEARCH_CONNECTOR_CRAWLER_SERVICE_TYPE, }); diff --git a/x-pack/plugins/enterprise_search/server/lib/crawler/put_html_extraction.test.ts b/x-pack/plugins/enterprise_search/server/lib/crawler/put_html_extraction.test.ts index 9789be5e40cb1..9e5c62a3d9464 100644 --- a/x-pack/plugins/enterprise_search/server/lib/crawler/put_html_extraction.test.ts +++ b/x-pack/plugins/enterprise_search/server/lib/crawler/put_html_extraction.test.ts @@ -7,8 +7,7 @@ import { IScopedClusterClient } from '@kbn/core/server'; -import { CONNECTORS_INDEX } from '../..'; -import { Connector } from '../../../common/types/connectors'; +import { Connector, CONNECTORS_INDEX } from '@kbn/search-connectors'; import { updateHtmlExtraction } from './put_html_extraction'; diff --git a/x-pack/plugins/enterprise_search/server/lib/crawler/put_html_extraction.ts b/x-pack/plugins/enterprise_search/server/lib/crawler/put_html_extraction.ts index 908f8c27b5a0c..f040f7af85d00 100644 --- a/x-pack/plugins/enterprise_search/server/lib/crawler/put_html_extraction.ts +++ b/x-pack/plugins/enterprise_search/server/lib/crawler/put_html_extraction.ts @@ -7,8 +7,7 @@ import { IScopedClusterClient } from '@kbn/core-elasticsearch-server'; -import { CONNECTORS_INDEX } from '../..'; -import { Connector } from '../../../common/types/connectors'; +import { CONNECTORS_INDEX, Connector } from '@kbn/search-connectors'; export async function updateHtmlExtraction( client: IScopedClusterClient, diff --git a/x-pack/plugins/enterprise_search/server/lib/indices/fetch_index.test.ts b/x-pack/plugins/enterprise_search/server/lib/indices/fetch_index.test.ts index de04b0bed2d47..3db722c0f58b2 100644 --- a/x-pack/plugins/enterprise_search/server/lib/indices/fetch_index.test.ts +++ b/x-pack/plugins/enterprise_search/server/lib/indices/fetch_index.test.ts @@ -8,15 +8,24 @@ import { ByteSizeValue } from '@kbn/config-schema'; import { IScopedClusterClient } from '@kbn/core/server'; +import { fetchConnectorByIndexName } from '@kbn/search-connectors'; + import { ENTERPRISE_SEARCH_CONNECTOR_CRAWLER_SERVICE_TYPE } from '../../../common/constants'; -import { SyncStatus } from '../../../common/types/connectors'; -import { fetchConnectorByIndexName } from '../connectors/fetch_connectors'; import { fetchCrawlerByIndexName } from '../crawler/fetch_crawlers'; import { fetchIndex } from './fetch_index'; -jest.mock('../connectors/fetch_connectors', () => ({ +jest.mock('@kbn/search-connectors', () => ({ + SyncStatus: { + CANCELED: 'canceled', + CANCELING: 'canceling', + COMPLETED: 'completed', + ERROR: 'error', + IN_PROGRESS: 'in_progress', + PENDING: 'pending', + SUSPENDED: 'suspended', + }, fetchConnectorByIndexName: jest.fn(), })); @@ -35,10 +44,7 @@ describe('fetchIndex lib function', () => { }, search: jest.fn().mockReturnValue({ hits: { - hits: [ - { _source: { status: SyncStatus.IN_PROGRESS } }, - { _source: { status: SyncStatus.PENDING } }, - ], + hits: [{ _source: { status: 'in_progress' } }, { _source: { status: 'pending' } }], }, }), }, @@ -111,10 +117,7 @@ describe('fetchIndex lib function', () => { it('should return data and stats for index and connector if connector is present', async () => { mockClient.asCurrentUser.search.mockReturnValue({ hits: { - hits: [ - { _source: { status: SyncStatus.CANCELED } }, - { _source: { status: SyncStatus.PENDING } }, - ], + hits: [{ _source: { status: 'canceled' } }, { _source: { status: 'pending' } }], }, }); mockClient.asCurrentUser.indices.get.mockImplementation(() => @@ -169,10 +172,7 @@ describe('fetchIndex lib function', () => { mockClient.asCurrentUser.count.mockReturnValue({ count: 0 }); mockClient.asCurrentUser.search.mockReturnValue({ hits: { - hits: [ - { _source: { status: SyncStatus.IN_PROGRESS } }, - { _source: { status: SyncStatus.COMPLETED } }, - ], + hits: [{ _source: { status: 'in_progress' } }, { _source: { status: 'completed' } }], }, }); mockClient.asCurrentUser.indices.get.mockImplementation(() => diff --git a/x-pack/plugins/enterprise_search/server/lib/indices/fetch_index.ts b/x-pack/plugins/enterprise_search/server/lib/indices/fetch_index.ts index 4233f8abbeff1..41875daad3717 100644 --- a/x-pack/plugins/enterprise_search/server/lib/indices/fetch_index.ts +++ b/x-pack/plugins/enterprise_search/server/lib/indices/fetch_index.ts @@ -7,13 +7,18 @@ import { IScopedClusterClient } from '@kbn/core/server'; -import { CONNECTORS_JOBS_INDEX } from '../..'; +import {} from '../..'; + +import { + CONNECTORS_JOBS_INDEX, + ConnectorSyncJobDocument, + fetchConnectorByIndexName, + SyncStatus, +} from '@kbn/search-connectors'; import { ENTERPRISE_SEARCH_CONNECTOR_CRAWLER_SERVICE_TYPE } from '../../../common/constants'; -import { ConnectorSyncJobDocument, SyncStatus } from '../../../common/types/connectors'; import { ElasticsearchIndexWithIngestion } from '../../../common/types/indices'; import { isIndexNotFoundException } from '../../utils/identify_exceptions'; -import { fetchConnectorByIndexName } from '../connectors/fetch_connectors'; import { fetchCrawlerByIndexName } from '../crawler/fetch_crawlers'; import { mapIndexStats } from './utils/map_index_stats'; @@ -69,7 +74,7 @@ export const fetchIndex = async ( } const indexStats = indices[index]; - const connector = await fetchConnectorByIndexName(client, index); + const connector = await fetchConnectorByIndexName(client.asCurrentUser, index); const hasInProgressSyncsResult = connector ? await hasInProgressSyncs(client, connector.id) : { inProgress: false, pending: false }; diff --git a/x-pack/plugins/enterprise_search/server/lib/indices/generate_api_key.test.ts b/x-pack/plugins/enterprise_search/server/lib/indices/generate_api_key.test.ts index 00188b37d334a..a28450108290a 100644 --- a/x-pack/plugins/enterprise_search/server/lib/indices/generate_api_key.test.ts +++ b/x-pack/plugins/enterprise_search/server/lib/indices/generate_api_key.test.ts @@ -7,7 +7,7 @@ import { IScopedClusterClient } from '@kbn/core/server'; -import { CONNECTORS_INDEX } from '../..'; +import { CONNECTORS_INDEX } from '@kbn/search-connectors'; import { generateApiKey } from './generate_api_key'; diff --git a/x-pack/plugins/enterprise_search/server/lib/indices/generate_api_key.ts b/x-pack/plugins/enterprise_search/server/lib/indices/generate_api_key.ts index f29dc327dfecc..d256bc6a91d88 100644 --- a/x-pack/plugins/enterprise_search/server/lib/indices/generate_api_key.ts +++ b/x-pack/plugins/enterprise_search/server/lib/indices/generate_api_key.ts @@ -7,8 +7,8 @@ import { IScopedClusterClient } from '@kbn/core/server'; -import { CONNECTORS_INDEX } from '../..'; -import { ConnectorDocument } from '../../../common/types/connectors'; +import { ConnectorDocument, CONNECTORS_INDEX } from '@kbn/search-connectors'; + import { toAlphanumeric } from '../../../common/utils/to_alphanumeric'; export const generateApiKey = async (client: IScopedClusterClient, indexName: string) => { diff --git a/x-pack/plugins/enterprise_search/server/lib/pipelines/get_default_pipeline.ts b/x-pack/plugins/enterprise_search/server/lib/pipelines/get_default_pipeline.ts index c13ee2571b82b..66619b99ef96e 100644 --- a/x-pack/plugins/enterprise_search/server/lib/pipelines/get_default_pipeline.ts +++ b/x-pack/plugins/enterprise_search/server/lib/pipelines/get_default_pipeline.ts @@ -7,11 +7,11 @@ import { IScopedClusterClient } from '@kbn/core/server'; -import { CURRENT_CONNECTORS_INDEX } from '../..'; +import { CURRENT_CONNECTORS_INDEX, IngestPipelineParams } from '@kbn/search-connectors'; + import { DEFAULT_PIPELINE_VALUES } from '../../../common/constants'; import { DefaultConnectorsPipelineMeta } from '../../../common/constants'; -import { IngestPipelineParams } from '../../../common/types/connectors'; import { isIndexNotFoundException } from '../../utils/identify_exceptions'; export const getDefaultPipeline = async ( diff --git a/x-pack/plugins/enterprise_search/server/lib/pipelines/get_index_pipeline.ts b/x-pack/plugins/enterprise_search/server/lib/pipelines/get_index_pipeline.ts index 45813a109de76..54a916898740e 100644 --- a/x-pack/plugins/enterprise_search/server/lib/pipelines/get_index_pipeline.ts +++ b/x-pack/plugins/enterprise_search/server/lib/pipelines/get_index_pipeline.ts @@ -6,9 +6,7 @@ */ import { IScopedClusterClient } from '@kbn/core/server'; - -import { IngestPipelineParams } from '../../../common/types/connectors'; -import { fetchConnectorByIndexName } from '../connectors/fetch_connectors'; +import { IngestPipelineParams, fetchConnectorByIndexName } from '@kbn/search-connectors'; import { getDefaultPipeline } from './get_default_pipeline'; @@ -20,7 +18,7 @@ export const getIndexPipelineParameters = async ( // we want to throw the error if getDefaultPipeline() fails so we're not catching it on purpose const [defaultPipeline, connector, customPipelineResp] = await Promise.all([ getDefaultPipeline(client), - fetchConnectorByIndexName(client, indexName), + fetchConnectorByIndexName(client.asCurrentUser, indexName), client.asCurrentUser.ingest .getPipeline({ id: `${indexName}`, @@ -30,11 +28,7 @@ export const getIndexPipelineParameters = async ( if (connector && connector.pipeline) { return connector.pipeline; } - let pipelineName = defaultPipeline.name; - - if (customPipelineResp && customPipelineResp[indexName]) { - pipelineName = indexName; - } + const pipelineName = customPipelineResp?.[indexName] ? indexName : defaultPipeline.name; return { ...defaultPipeline, diff --git a/x-pack/plugins/enterprise_search/server/lib/pipelines/revert_custom_pipeline.ts b/x-pack/plugins/enterprise_search/server/lib/pipelines/revert_custom_pipeline.ts index 60a9e5cfcf97d..297456b9c00e7 100644 --- a/x-pack/plugins/enterprise_search/server/lib/pipelines/revert_custom_pipeline.ts +++ b/x-pack/plugins/enterprise_search/server/lib/pipelines/revert_custom_pipeline.ts @@ -7,16 +7,14 @@ import { IScopedClusterClient } from '@kbn/core/server'; -import { CONNECTORS_INDEX } from '../..'; - -import { fetchConnectorByIndexName } from '../connectors/fetch_connectors'; +import { CONNECTORS_INDEX, fetchConnectorByIndexName } from '@kbn/search-connectors'; import { deleteIndexPipelines } from './delete_pipelines'; import { getDefaultPipeline } from './get_default_pipeline'; export const revertCustomPipeline = async (client: IScopedClusterClient, indexName: string) => { - const connector = await fetchConnectorByIndexName(client, indexName); + const connector = await fetchConnectorByIndexName(client.asCurrentUser, indexName); if (connector) { const pipeline = await getDefaultPipeline(client); await client.asCurrentUser.update({ diff --git a/x-pack/plugins/enterprise_search/server/lib/pipelines/update_default_pipeline.ts b/x-pack/plugins/enterprise_search/server/lib/pipelines/update_default_pipeline.ts index 060c0edc88316..73e7e85f53d32 100644 --- a/x-pack/plugins/enterprise_search/server/lib/pipelines/update_default_pipeline.ts +++ b/x-pack/plugins/enterprise_search/server/lib/pipelines/update_default_pipeline.ts @@ -7,10 +7,9 @@ import { IScopedClusterClient } from '@kbn/core/server'; -import { CURRENT_CONNECTORS_INDEX } from '../..'; +import { CURRENT_CONNECTORS_INDEX, IngestPipelineParams } from '@kbn/search-connectors'; import { DefaultConnectorsPipelineMeta } from '../../../common/constants'; -import { IngestPipelineParams } from '../../../common/types/connectors'; export const updateDefaultPipeline = async ( client: IScopedClusterClient, diff --git a/x-pack/plugins/enterprise_search/server/lib/pipelines/update_pipeline.ts b/x-pack/plugins/enterprise_search/server/lib/pipelines/update_pipeline.ts index 1acc91f7e2684..f8a9ef82453cb 100644 --- a/x-pack/plugins/enterprise_search/server/lib/pipelines/update_pipeline.ts +++ b/x-pack/plugins/enterprise_search/server/lib/pipelines/update_pipeline.ts @@ -7,9 +7,7 @@ import { IScopedClusterClient } from '@kbn/core/server'; -import { CONNECTORS_INDEX } from '../..'; - -import { IngestPipelineParams } from '../../../common/types/connectors'; +import { CONNECTORS_INDEX, IngestPipelineParams } from '@kbn/search-connectors'; export const updateConnectorPipeline = async ( client: IScopedClusterClient, diff --git a/x-pack/plugins/enterprise_search/server/lib/stats/get_sync_jobs.ts b/x-pack/plugins/enterprise_search/server/lib/stats/get_sync_jobs.ts index a19315507bf4c..0cf096bcd9d53 100644 --- a/x-pack/plugins/enterprise_search/server/lib/stats/get_sync_jobs.ts +++ b/x-pack/plugins/enterprise_search/server/lib/stats/get_sync_jobs.ts @@ -9,10 +9,15 @@ import moment from 'moment'; import { IScopedClusterClient } from '@kbn/core/server'; -import { CONNECTORS_INDEX, CONNECTORS_JOBS_INDEX } from '../..'; +import { + CONNECTORS_INDEX, + CONNECTORS_JOBS_INDEX, + ConnectorStatus, + SyncStatus, +} from '@kbn/search-connectors'; + import { SyncJobsStats } from '../../../common/stats'; -import { ConnectorStatus, SyncStatus } from '../../../common/types/connectors'; import { isIndexNotFoundException } from '../../utils/identify_exceptions'; export const fetchSyncJobsStats = async (client: IScopedClusterClient): Promise => { diff --git a/x-pack/plugins/enterprise_search/server/plugin.ts b/x-pack/plugins/enterprise_search/server/plugin.ts index ed6ef8f3886bf..154a7192d35f0 100644 --- a/x-pack/plugins/enterprise_search/server/plugin.ts +++ b/x-pack/plugins/enterprise_search/server/plugin.ts @@ -15,8 +15,6 @@ import { IRouter, KibanaRequest, DEFAULT_APP_CATEGORIES, - IClusterClient, - CoreStart, } from '@kbn/core/server'; import { CustomIntegrationsPluginSetup } from '@kbn/custom-integrations-plugin/server'; import { DataPluginStart } from '@kbn/data-plugin/server/plugin'; @@ -51,7 +49,6 @@ import { databaseSearchGuideConfig, } from '../common/guided_onboarding/search_guide_config'; -import { ConnectorsService } from './api/connectors_service'; import { registerTelemetryUsageCollector as registerASTelemetryUsageCollector } from './collectors/app_search/telemetry'; import { registerTelemetryUsageCollector as registerESTelemetryUsageCollector } from './collectors/enterprise_search/telemetry'; import { registerTelemetryUsageCollector as registerWSTelemetryUsageCollector } from './collectors/workplace_search/telemetry'; @@ -103,10 +100,6 @@ interface PluginsStart { spaces?: SpacesPluginStart; } -export interface EnterpriseSearchPluginStart { - connectorsService: ConnectorsService; -} - export interface RouteDependencies { config: ConfigType; enterpriseSearchRequestHandler: IEnterpriseSearchRequestHandler; @@ -116,14 +109,12 @@ export interface RouteDependencies { router: IRouter; } -export class EnterpriseSearchPlugin implements Plugin { +export class EnterpriseSearchPlugin implements Plugin { private readonly config: ConfigType; private readonly logger: Logger; - private clusterClient?: IClusterClient; /** * Exposed services */ - private connectorsService?: ConnectorsService; constructor(initializerContext: PluginInitializerContext) { this.config = initializerContext.config.get(); @@ -259,7 +250,6 @@ export class EnterpriseSearchPlugin implements Plugin { - this.clusterClient = coreStart.elasticsearch.client; savedObjectsStarted = coreStart.savedObjects; if (usageCollection) { @@ -322,26 +312,7 @@ export class EnterpriseSearchPlugin implements Plugin({ - connectorsService: this.connectorsService, - }); - } + public start() {} public stop() {} } diff --git a/x-pack/plugins/enterprise_search/server/routes/enterprise_search/connectors.ts b/x-pack/plugins/enterprise_search/server/routes/enterprise_search/connectors.ts index 923009c05d098..fea646d9d726e 100644 --- a/x-pack/plugins/enterprise_search/server/routes/enterprise_search/connectors.ts +++ b/x-pack/plugins/enterprise_search/server/routes/enterprise_search/connectors.ts @@ -6,8 +6,18 @@ */ import { schema } from '@kbn/config-schema'; - import { i18n } from '@kbn/i18n'; +import { + fetchSyncJobsByConnectorId, + putUpdateNative, + updateConnectorConfiguration, + updateConnectorNameAndDescription, + updateConnectorScheduling, + updateConnectorServiceType, + updateConnectorStatus, + updateFiltering, + updateFilteringDraft, +} from '@kbn/search-connectors'; import { ConnectorStatus, @@ -15,21 +25,12 @@ import { FilteringRule, FilteringRuleRule, SyncJobType, -} from '../../../common/types/connectors'; +} from '@kbn/search-connectors'; +import { cancelSyncs } from '@kbn/search-connectors/lib/cancel_syncs'; import { ErrorCode } from '../../../common/types/error_codes'; import { addConnector } from '../../lib/connectors/add_connector'; -import { fetchSyncJobsByConnectorId } from '../../lib/connectors/fetch_sync_jobs'; -import { cancelSyncs } from '../../lib/connectors/post_cancel_syncs'; -import { updateFiltering } from '../../lib/connectors/put_update_filtering'; -import { updateFilteringDraft } from '../../lib/connectors/put_update_filtering_draft'; -import { putUpdateNative } from '../../lib/connectors/put_update_native'; -import { startConnectorSync } from '../../lib/connectors/start_sync'; -import { updateConnectorConfiguration } from '../../lib/connectors/update_connector_configuration'; -import { updateConnectorNameAndDescription } from '../../lib/connectors/update_connector_name_and_description'; -import { updateConnectorScheduling } from '../../lib/connectors/update_connector_scheduling'; -import { updateConnectorServiceType } from '../../lib/connectors/update_connector_service_type'; -import { updateConnectorStatus } from '../../lib/connectors/update_connector_status'; +import { startSync } from '../../lib/connectors/start_sync'; import { getDefaultPipeline } from '../../lib/pipelines/get_default_pipeline'; import { updateDefaultPipeline } from '../../lib/pipelines/update_default_pipeline'; import { updateConnectorPipeline } from '../../lib/pipelines/update_pipeline'; @@ -98,7 +99,7 @@ export function registerConnectorRoutes({ router, log }: RouteDependencies) { }, elasticsearchErrorHandler(log, async (context, request, response) => { const { client } = (await context.core).elasticsearch; - await cancelSyncs(client, request.params.connectorId); + await cancelSyncs(client.asCurrentUser, request.params.connectorId); return response.ok(); }) ); @@ -119,7 +120,7 @@ export function registerConnectorRoutes({ router, log }: RouteDependencies) { elasticsearchErrorHandler(log, async (context, request, response) => { const { client } = (await context.core).elasticsearch; const configuration = await updateConnectorConfiguration( - client, + client.asCurrentUser, request.params.connectorId, request.body ); @@ -143,7 +144,11 @@ export function registerConnectorRoutes({ router, log }: RouteDependencies) { }, elasticsearchErrorHandler(log, async (context, request, response) => { const { client } = (await context.core).elasticsearch; - await updateConnectorScheduling(client, request.params.connectorId, request.body); + await updateConnectorScheduling( + client.asCurrentUser, + request.params.connectorId, + request.body + ); return response.ok(); }) ); @@ -162,7 +167,7 @@ export function registerConnectorRoutes({ router, log }: RouteDependencies) { }, elasticsearchErrorHandler(log, async (context, request, response) => { const { client } = (await context.core).elasticsearch; - await startConnectorSync( + await startSync( client, request.params.connectorId, SyncJobType.FULL, @@ -183,7 +188,7 @@ export function registerConnectorRoutes({ router, log }: RouteDependencies) { }, elasticsearchErrorHandler(log, async (context, request, response) => { const { client } = (await context.core).elasticsearch; - await startConnectorSync(client, request.params.connectorId, SyncJobType.INCREMENTAL); + await startSync(client, request.params.connectorId, SyncJobType.INCREMENTAL); return response.ok(); }) ); @@ -199,7 +204,7 @@ export function registerConnectorRoutes({ router, log }: RouteDependencies) { }, elasticsearchErrorHandler(log, async (context, request, response) => { const { client } = (await context.core).elasticsearch; - await startConnectorSync(client, request.params.connectorId, SyncJobType.ACCESS_CONTROL); + await startSync(client, request.params.connectorId, SyncJobType.ACCESS_CONTROL); return response.ok(); }) ); @@ -221,7 +226,7 @@ export function registerConnectorRoutes({ router, log }: RouteDependencies) { elasticsearchErrorHandler(log, async (context, request, response) => { const { client } = (await context.core).elasticsearch; const result = await fetchSyncJobsByConnectorId( - client, + client.asCurrentUser, request.params.connectorId, request.query.from, request.query.size, @@ -298,7 +303,7 @@ export function registerConnectorRoutes({ router, log }: RouteDependencies) { elasticsearchErrorHandler(log, async (context, request, response) => { const { client } = (await context.core).elasticsearch; const result = await updateConnectorServiceType( - client, + client.asCurrentUser, request.params.connectorId, request.body.serviceType ); @@ -319,7 +324,7 @@ export function registerConnectorRoutes({ router, log }: RouteDependencies) { elasticsearchErrorHandler(log, async (context, request, response) => { const { client } = (await context.core).elasticsearch; const result = await updateConnectorStatus( - client, + client.asCurrentUser, request.params.connectorId, request.body.status as ConnectorStatus ); @@ -343,10 +348,14 @@ export function registerConnectorRoutes({ router, log }: RouteDependencies) { elasticsearchErrorHandler(log, async (context, request, response) => { const { client } = (await context.core).elasticsearch; const { name, description } = request.body; - const result = await updateConnectorNameAndDescription(client, request.params.connectorId, { - description, - name, - }); + const result = await updateConnectorNameAndDescription( + client.asCurrentUser, + request.params.connectorId, + { + description, + name, + } + ); return response.ok({ body: result }); }) ); @@ -383,7 +392,7 @@ export function registerConnectorRoutes({ router, log }: RouteDependencies) { const { client } = (await context.core).elasticsearch; const { connectorId } = request.params; const { advanced_snippet, filtering_rules } = request.body; - const result = await updateFilteringDraft(client, connectorId, { + const result = await updateFilteringDraft(client.asCurrentUser, connectorId, { advancedSnippet: advanced_snippet, // Have to cast here because our API schema validator doesn't know how to deal with enums // We're relying on the schema in the validator above to flag if something goes wrong @@ -425,7 +434,7 @@ export function registerConnectorRoutes({ router, log }: RouteDependencies) { const { client } = (await context.core).elasticsearch; const { connectorId } = request.params; const { advanced_snippet, filtering_rules } = request.body; - const result = await updateFiltering(client, connectorId, { + const result = await updateFiltering(client.asCurrentUser, connectorId, { advancedSnippet: advanced_snippet, // Have to cast here because our API schema validator doesn't know how to deal with enums // We're relying on the schema in the validator above to flag if something goes wrong @@ -450,7 +459,7 @@ export function registerConnectorRoutes({ router, log }: RouteDependencies) { const { client } = (await context.core).elasticsearch; const connectorId = decodeURIComponent(request.params.connectorId); const { is_native } = request.body; - const result = await putUpdateNative(client, connectorId, is_native); + const result = await putUpdateNative(client.asCurrentUser, connectorId, is_native); return result ? response.ok({ body: result }) : response.conflict(); }) ); diff --git a/x-pack/plugins/enterprise_search/server/routes/enterprise_search/crawler/crawler.ts b/x-pack/plugins/enterprise_search/server/routes/enterprise_search/crawler/crawler.ts index c5c45806e560f..18a1c5aa8bca6 100644 --- a/x-pack/plugins/enterprise_search/server/routes/enterprise_search/crawler/crawler.ts +++ b/x-pack/plugins/enterprise_search/server/routes/enterprise_search/crawler/crawler.ts @@ -9,12 +9,12 @@ import { schema } from '@kbn/config-schema'; import { i18n } from '@kbn/i18n'; +import { deleteConnectorById, fetchConnectorByIndexName } from '@kbn/search-connectors'; + import { ENTERPRISE_SEARCH_CONNECTOR_CRAWLER_SERVICE_TYPE } from '../../../../common/constants'; import { ErrorCode } from '../../../../common/types/error_codes'; import { addConnector } from '../../../lib/connectors/add_connector'; -import { deleteConnectorById } from '../../../lib/connectors/delete_connector'; -import { fetchConnectorByIndexName } from '../../../lib/connectors/fetch_connectors'; import { fetchCrawlerByIndexName } from '../../../lib/crawler/fetch_crawlers'; import { recreateConnectorDocument } from '../../../lib/crawler/post_connector'; import { updateHtmlExtraction } from '../../../lib/crawler/put_html_extraction'; @@ -83,7 +83,10 @@ export function registerCrawlerRoutes(routeDependencies: RouteDependencies) { }); } - const connector = await fetchConnectorByIndexName(client, request.body.index_name); + const connector = await fetchConnectorByIndexName( + client.asCurrentUser, + request.body.index_name + ); if (connector) { return createError({ errorCode: ErrorCode.CONNECTOR_DOCUMENT_ALREADY_EXISTS, @@ -110,9 +113,12 @@ export function registerCrawlerRoutes(routeDependencies: RouteDependencies) { return res; } catch (error) { // clean up connector index if it was created - const createdConnector = await fetchConnectorByIndexName(client, request.body.index_name); + const createdConnector = await fetchConnectorByIndexName( + client.asCurrentUser, + request.body.index_name + ); if (createdConnector) { - await deleteConnectorById(client, createdConnector.id); + await deleteConnectorById(client.asCurrentUser, createdConnector.id); if (createdConnector.index_name) { await deleteIndex(client, createdConnector.index_name); } @@ -410,7 +416,10 @@ export function registerCrawlerRoutes(routeDependencies: RouteDependencies) { elasticsearchErrorHandler(log, async (context, request, response) => { const { client } = (await context.core).elasticsearch; - const connector = await fetchConnectorByIndexName(client, request.params.indexName); + const connector = await fetchConnectorByIndexName( + client.asCurrentUser, + request.params.indexName + ); if ( connector && connector.service_type === ENTERPRISE_SEARCH_CONNECTOR_CRAWLER_SERVICE_TYPE @@ -444,7 +453,10 @@ export function registerCrawlerRoutes(routeDependencies: RouteDependencies) { }, elasticsearchErrorHandler(log, async (context, request, response) => { const { client } = (await context.core).elasticsearch; - const connector = await fetchConnectorByIndexName(client, request.params.indexName); + const connector = await fetchConnectorByIndexName( + client.asCurrentUser, + request.params.indexName + ); if (connector) { return createError({ errorCode: ErrorCode.CONNECTOR_DOCUMENT_ALREADY_EXISTS, diff --git a/x-pack/plugins/enterprise_search/server/routes/enterprise_search/indices.ts b/x-pack/plugins/enterprise_search/server/routes/enterprise_search/indices.ts index 25342217e5192..cc031bd3ef684 100644 --- a/x-pack/plugins/enterprise_search/server/routes/enterprise_search/indices.ts +++ b/x-pack/plugins/enterprise_search/server/routes/enterprise_search/indices.ts @@ -14,15 +14,18 @@ import { schema } from '@kbn/config-schema'; import { i18n } from '@kbn/i18n'; +import { deleteConnectorById } from '@kbn/search-connectors'; +import { + fetchConnectorByIndexName, + fetchConnectors, +} from '@kbn/search-connectors/lib/fetch_connectors'; + import { DEFAULT_PIPELINE_NAME } from '../../../common/constants'; import { ErrorCode } from '../../../common/types/error_codes'; import { AlwaysShowPattern } from '../../../common/types/indices'; import type { AttachMlInferencePipelineResponse } from '../../../common/types/pipelines'; -import { deleteConnectorById } from '../../lib/connectors/delete_connector'; - -import { fetchConnectorByIndexName, fetchConnectors } from '../../lib/connectors/fetch_connectors'; import { fetchCrawlerByIndexName, fetchCrawlers } from '../../lib/crawler/fetch_crawlers'; import { createIndex } from '../../lib/indices/create_index'; @@ -113,7 +116,7 @@ export function registerIndexRoutes({ from, size ); - const connectors = await fetchConnectors(client, indexNames); + const connectors = await fetchConnectors(client.asCurrentUser, indexNames); const crawlers = await fetchCrawlers(client, indexNames); const enrichedIndices = indices.map((index) => ({ ...index, @@ -186,7 +189,7 @@ export function registerIndexRoutes({ try { const crawler = await fetchCrawlerByIndexName(client, indexName); - const connector = await fetchConnectorByIndexName(client, indexName); + const connector = await fetchConnectorByIndexName(client.asCurrentUser, indexName); if (crawler) { const crawlerRes = await enterpriseSearchRequestHandler.createRequest({ @@ -199,7 +202,7 @@ export function registerIndexRoutes({ } if (connector) { - await deleteConnectorById(client, connector.id); + await deleteConnectorById(client.asCurrentUser, connector.id); } await deleteIndexPipelines(client, indexName); @@ -575,7 +578,10 @@ export function registerIndexRoutes({ }); } - const connector = await fetchConnectorByIndexName(client, request.body.index_name); + const connector = await fetchConnectorByIndexName( + client.asCurrentUser, + request.body.index_name + ); if (connector) { return createError({ diff --git a/x-pack/plugins/enterprise_search/server/utils/search_result_provider.ts b/x-pack/plugins/enterprise_search/server/utils/search_result_provider.ts index 0869a16b79dc7..3f98b5368c7d2 100644 --- a/x-pack/plugins/enterprise_search/server/utils/search_result_provider.ts +++ b/x-pack/plugins/enterprise_search/server/utils/search_result_provider.ts @@ -11,11 +11,9 @@ import { IBasePath } from '@kbn/core-http-server'; import { GlobalSearchResultProvider } from '@kbn/global-search-plugin/server'; import { i18n } from '@kbn/i18n'; +import { CONNECTOR_DEFINITIONS, ConnectorServerSideDefinition } from '@kbn/search-connectors'; + import { ConfigType } from '..'; -import { - CONNECTOR_DEFINITIONS, - ConnectorServerSideDefinition, -} from '../../common/connectors/connectors'; import { ENTERPRISE_SEARCH_CONNECTOR_CRAWLER_SERVICE_TYPE, ENTERPRISE_SEARCH_CONTENT_PLUGIN, diff --git a/x-pack/plugins/enterprise_search/tsconfig.json b/x-pack/plugins/enterprise_search/tsconfig.json index 25cc264924d47..4195acec083ff 100644 --- a/x-pack/plugins/enterprise_search/tsconfig.json +++ b/x-pack/plugins/enterprise_search/tsconfig.json @@ -11,7 +11,6 @@ "common/**/*", "public/**/*", "server/**/*", - "../../../typings/**/*", ], "kbn_references": [ "@kbn/core", @@ -61,7 +60,7 @@ "@kbn/global-search-plugin", "@kbn/logs-shared-plugin", "@kbn/share-plugin", - "@kbn/core-saved-objects-migration-server-internal", "@kbn/search-api-panels", + "@kbn/search-connectors" ] } diff --git a/x-pack/plugins/serverless_search/kibana.jsonc b/x-pack/plugins/serverless_search/kibana.jsonc index d056148e3aa79..bcf4cc540df14 100644 --- a/x-pack/plugins/serverless_search/kibana.jsonc +++ b/x-pack/plugins/serverless_search/kibana.jsonc @@ -7,14 +7,17 @@ "id": "serverlessSearch", "server": true, "browser": true, - "configPath": ["xpack", "serverless", "search"], + "configPath": [ + "xpack", + "serverless", + "search" + ], "requiredPlugins": [ "cloud", "console", "dashboard", "devTools", "discover", - "enterpriseSearch", "grokdebugger", "management", "ml", @@ -26,6 +29,8 @@ "visualizations" ], "optionalPlugins": [], - "requiredBundles": ["kibanaReact"] + "requiredBundles": [ + "kibanaReact" + ] } } diff --git a/x-pack/plugins/serverless_search/public/application/components/connectors_overview.tsx b/x-pack/plugins/serverless_search/public/application/components/connectors_overview.tsx index 97a3b5887389f..540c78ac521ab 100644 --- a/x-pack/plugins/serverless_search/public/application/components/connectors_overview.tsx +++ b/x-pack/plugins/serverless_search/public/application/components/connectors_overview.tsx @@ -17,13 +17,12 @@ import { EuiTitle, EuiToolTip, } from '@elastic/eui'; -import { Connector } from '@kbn/enterprise-search-plugin/common/types/connectors'; +import { Connector, ConnectorServerSideDefinition } from '@kbn/search-connectors'; import { i18n } from '@kbn/i18n'; import { FormattedMessage } from '@kbn/i18n-react'; import { useQuery } from '@tanstack/react-query'; import React from 'react'; -import { ConnectorServerSideDefinition } from '@kbn/enterprise-search-plugin/common/connectors/connectors'; import { LEARN_MORE_LABEL } from '../../../common/i18n_string'; import { PLUGIN_ID } from '../../../common'; import { useKibanaServices } from '../hooks/use_kibana'; 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 ddcc4e08cce13..a01ebdb941eda 100644 --- a/x-pack/plugins/serverless_search/public/application/components/overview.tsx +++ b/x-pack/plugins/serverless_search/public/application/components/overview.tsx @@ -38,7 +38,7 @@ import type { LanguageDefinitionSnippetArguments, } from '@kbn/search-api-panels'; import { useQuery } from '@tanstack/react-query'; -import { Connector } from '@kbn/enterprise-search-plugin/common/types/connectors'; +import { Connector } from '@kbn/search-connectors'; import { docLinks } from '../../../common/doc_links'; import { PLUGIN_ID } from '../../../common'; import { useKibanaServices } from '../hooks/use_kibana'; diff --git a/x-pack/plugins/serverless_search/server/plugin.ts b/x-pack/plugins/serverless_search/server/plugin.ts index 2798a4333d35c..693cdc1e7035e 100644 --- a/x-pack/plugins/serverless_search/server/plugin.ts +++ b/x-pack/plugins/serverless_search/server/plugin.ts @@ -13,7 +13,6 @@ import type { CoreSetup, } from '@kbn/core/server'; import type { SecurityPluginStart } from '@kbn/security-plugin/server'; -import { EnterpriseSearchPluginStart } from '@kbn/enterprise-search-plugin/server'; import { registerApiKeyRoutes } from './routes/api_key_routes'; import { registerIndicesRoutes } from './routes/indices_routes'; @@ -27,9 +26,9 @@ import type { import { registerConnectorsRoutes } from './routes/connectors_routes'; export interface RouteDependencies { + http: CoreSetup['http']; logger: Logger; router: IRouter; - search: EnterpriseSearchPluginStart; security: SecurityPluginStart; } @@ -46,7 +45,6 @@ export class ServerlessSearchPlugin private readonly config: ServerlessSearchConfig; private readonly logger: Logger; private security?: SecurityPluginStart; - private enterpriseSearch?: EnterpriseSearchPluginStart; constructor(initializerContext: PluginInitializerContext) { this.config = initializerContext.config.get(); @@ -58,13 +56,12 @@ export class ServerlessSearchPlugin pluginsSetup: SetupDependencies ) { const router = http.createRouter(); - getStartServices().then(([, { enterpriseSearch, security }]) => { + getStartServices().then(([, { security }]) => { this.security = security; - this.enterpriseSearch = enterpriseSearch; const dependencies = { + http, logger: this.logger, router, - search: this.enterpriseSearch, security: this.security, }; diff --git a/x-pack/plugins/serverless_search/server/routes/connectors_routes.ts b/x-pack/plugins/serverless_search/server/routes/connectors_routes.ts index c74c18f6d7414..766564bb9eaa7 100644 --- a/x-pack/plugins/serverless_search/server/routes/connectors_routes.ts +++ b/x-pack/plugins/serverless_search/server/routes/connectors_routes.ts @@ -5,16 +5,18 @@ * 2.0. */ +import { CONNECTOR_DEFINITIONS, fetchConnectors } from '@kbn/search-connectors'; import { RouteDependencies } from '../plugin'; -export const registerConnectorsRoutes = ({ router, search, security }: RouteDependencies) => { +export const registerConnectorsRoutes = ({ http, router }: RouteDependencies) => { router.get( { path: '/internal/serverless_search/connectors', validate: {}, }, async (context, request, response) => { - const connectors = await search.connectorsService.getConnectors(request); + const { client } = (await context.core).elasticsearch; + const connectors = await fetchConnectors(client.asCurrentUser); return response.ok({ body: { @@ -31,7 +33,14 @@ export const registerConnectorsRoutes = ({ router, search, security }: RouteDepe validate: {}, }, async (context, request, response) => { - const connectors = await search.connectorsService.getConnectorTypes(); + const connectors = CONNECTOR_DEFINITIONS.map((connector) => ({ + ...connector, + iconPath: connector.iconPath + ? http.basePath.prepend( + `/plugins/enterpriseSearch/assets/source_icons/${connector.iconPath}` + ) + : 'logoEnterpriseSearch', + })); return response.ok({ body: { diff --git a/x-pack/plugins/serverless_search/server/types.ts b/x-pack/plugins/serverless_search/server/types.ts index 38100d36f330e..8e8f7f15a8124 100644 --- a/x-pack/plugins/serverless_search/server/types.ts +++ b/x-pack/plugins/serverless_search/server/types.ts @@ -6,7 +6,6 @@ */ import type { SecurityPluginStart } from '@kbn/security-plugin/server'; -import type { EnterpriseSearchPluginStart } from '@kbn/enterprise-search-plugin/server'; import type { MlPluginSetup } from '@kbn/ml-plugin/server'; // eslint-disable-next-line @typescript-eslint/no-empty-interface @@ -15,7 +14,6 @@ export interface ServerlessSearchPluginSetup {} export interface ServerlessSearchPluginStart {} export interface StartDependencies { - enterpriseSearch: EnterpriseSearchPluginStart; security: SecurityPluginStart; } export interface SetupDependencies { diff --git a/x-pack/plugins/serverless_search/tsconfig.json b/x-pack/plugins/serverless_search/tsconfig.json index 1187c90cd1a79..c149beabd33ec 100644 --- a/x-pack/plugins/serverless_search/tsconfig.json +++ b/x-pack/plugins/serverless_search/tsconfig.json @@ -17,7 +17,6 @@ "kbn_references": [ "@kbn/core", "@kbn/config-schema", - "@kbn/enterprise-search-plugin", "@kbn/management-plugin", "@kbn/shared-ux-chrome-navigation", "@kbn/doc-links", @@ -34,5 +33,6 @@ "@kbn/search-api-panels", "@kbn/core-lifecycle-browser", "@kbn/react-kibana-context-theme", + "@kbn/search-connectors", ] } diff --git a/x-pack/plugins/translations/translations/fr-FR.json b/x-pack/plugins/translations/translations/fr-FR.json index e320b5a24c8be..14688c6898e1f 100644 --- a/x-pack/plugins/translations/translations/fr-FR.json +++ b/x-pack/plugins/translations/translations/fr-FR.json @@ -2299,36 +2299,7 @@ "discover.docTable.tableRow.viewSurroundingDocumentsLinkText": "Afficher les documents alentour", "discover.documentsAriaLabel": "Documents", "discover.documentsErrorTitle": "Erreur lors de la recherche", - "unifiedDocViewer.docView.table.actions.label": "Actions", - "unifiedDocViewer.docView.table.actions.open": "Actions ouvertes", - "unifiedDocViewer.docView.table.ignored.multiAboveTooltip": "Une ou plusieurs valeurs dans ce champ sont trop longues et ne peuvent pas être recherchées ni filtrées.", - "unifiedDocViewer.docView.table.ignored.multiMalformedTooltip": "Ce champ comporte une ou plusieurs valeurs mal formées qui ne peuvent pas être recherchées ni filtrées.", - "unifiedDocViewer.docView.table.ignored.multiUnknownTooltip": "Une ou plusieurs valeurs dans ce champ ont été ignorées par Elasticsearch et ne peuvent pas être recherchées ni filtrées.", - "unifiedDocViewer.docView.table.ignored.singleAboveTooltip": "La valeur dans ce champ est trop longue et ne peut pas être recherchée ni filtrée.", - "unifiedDocViewer.docView.table.ignored.singleMalformedTooltip": "La valeur dans ce champ est mal formée et ne peut pas être recherchée ni filtrée.", - "unifiedDocViewer.docView.table.ignored.singleUnknownTooltip": "La valeur dans ce champ a été ignorée par Elasticsearch et ne peut pas être recherchée ni filtrée.", - "unifiedDocViewer.docView.table.searchPlaceHolder": "Rechercher les noms de champs", - "unifiedDocViewer.docViews.json.jsonTitle": "JSON", - "unifiedDocViewer.docViews.table.filterForFieldPresentButtonAriaLabel": "Filtrer sur le champ", - "unifiedDocViewer.docViews.table.filterForFieldPresentButtonTooltip": "Filtrer sur le champ", - "unifiedDocViewer.docViews.table.filterForValueButtonAriaLabel": "Filtrer sur la valeur", - "unifiedDocViewer.docViews.table.filterForValueButtonTooltip": "Filtrer sur la valeur", - "unifiedDocViewer.docViews.table.filterOutValueButtonAriaLabel": "Exclure la valeur", - "unifiedDocViewer.docViews.table.filterOutValueButtonTooltip": "Exclure la valeur", - "unifiedDocViewer.docViews.table.ignored.multiValueLabel": "Contient des valeurs ignorées", - "unifiedDocViewer.docViews.table.ignored.singleValueLabel": "Valeur ignorée", - "unifiedDocViewer.docViews.table.pinFieldAriaLabel": "Épingler le champ", - "unifiedDocViewer.docViews.table.pinFieldLabel": "Épingler le champ", "discover.docViews.table.scoreSortWarningTooltip": "Filtrez sur _score pour pouvoir récupérer les valeurs correspondantes.", - "unifiedDocViewer.docViews.table.tableTitle": "Tableau", - "unifiedDocViewer.docViews.table.toggleColumnInTableButtonAriaLabel": "Afficher/Masquer la colonne dans le tableau", - "unifiedDocViewer.docViews.table.toggleColumnInTableButtonTooltip": "Afficher/Masquer la colonne dans le tableau", - "unifiedDocViewer.fieldChooser.discoverField.name": "Afficher/Masquer les détails du champ", - "unifiedDocViewer.docViews.table.unableToFilterForPresenceOfMetaFieldsTooltip": "Impossible de filtrer sur les champs méta", - "unifiedDocViewer.docViews.table.unableToFilterForPresenceOfScriptedFieldsTooltip": "Impossible de filtrer sur les champs scriptés", - "unifiedDocViewer.docViews.table.unindexedFieldsCanNotBeSearchedTooltip": "Les champs non indexés ou les valeurs ignorées ne peuvent pas être recherchés", - "unifiedDocViewer.docViews.table.unpinFieldAriaLabel": "Désépingler le champ", - "unifiedDocViewer.docViews.table.unpinFieldLabel": "Désépingler le champ", "discover.dropZoneTableLabel": "Abandonner la zone pour ajouter un champ en tant que colonne dans la table", "discover.dscTour.stepAddFields.imageAltText": "Dans la liste Champs disponibles, cliquez sur l'icône Plus pour afficher/masquer un champ dans le tableau de documents.", "discover.dscTour.stepAddFields.title": "Ajouter des champs dans le tableau", @@ -2349,13 +2320,8 @@ "discover.embeddable.search.displayName": "rechercher", "discover.errorCalloutShowErrorMessage": "Afficher les détails", "discover.fieldChooser.availableFieldsTooltip": "Champs disponibles pour l'affichage dans le tableau.", - "unifiedDocViewer.fieldChooser.discoverField.actions": "Actions", "discover.fieldChooser.discoverField.addFieldTooltip": "Ajouter le champ en tant que colonne", - "unifiedDocViewer.fieldChooser.discoverField.multiField": "champ multiple", - "unifiedDocViewer.fieldChooser.discoverField.multiFieldTooltipContent": "Les champs multiples peuvent avoir plusieurs valeurs.", - "unifiedDocViewer.fieldChooser.discoverField.name": "Champ", "discover.fieldChooser.discoverField.removeFieldTooltip": "Supprimer le champ du tableau", - "unifiedDocViewer.fieldChooser.discoverField.value": "Valeur", "discover.goToDiscoverButtonText": "Aller à Discover", "discover.grid.flyout.documentNavigation": "Navigation dans le document", "discover.grid.flyout.toastColumnAdded": "La colonne \"{columnName}\" a été ajoutée.", @@ -2371,10 +2337,8 @@ "discover.inspectorRequestDescriptionDocument": "Cette requête interroge Elasticsearch afin de récupérer les documents.", "discover.invalidFiltersWarnToast.description": "Les références d'ID de la vue de données dans certains filtres appliqués diffèrent de la vue de données actuelle.", "discover.invalidFiltersWarnToast.title": "Références d'index différentes", - "unifiedDocViewer.json.codeEditorAriaLabel": "Affichage JSON en lecture seule d’un document Elasticsearch", - "unifiedDocViewer.json.copyToClipboardLabel": "Copier dans le presse-papiers", "discover.loadingDocuments": "Chargement des documents", - "unifiedDocViewer.loadingJSON": "Chargement de JSON", + "discover.loadingResults": "Chargement des résultats", "discover.localMenu.alertsDescription": "Alertes", "discover.localMenu.fallbackReportTitle": "Recherche Discover sans titre", "discover.localMenu.inspectTitle": "Inspecter", @@ -2431,9 +2395,6 @@ "discover.serverLocatorExtension.titleFromLocatorUnknown": "Recherche inconnue", "discover.singleDocRoute.errorTitle": "Une erreur s'est produite", "discover.skipToBottomButtonLabel": "Atteindre la fin du tableau", - "unifiedDocViewer.sourceViewer.errorMessage": "Impossible de récupérer les données pour le moment. Actualisez l'onglet et réessayez.", - "unifiedDocViewer.sourceViewer.errorMessageTitle": "Une erreur s'est produite.", - "unifiedDocViewer.sourceViewer.refresh": "Actualiser", "discover.toggleSidebarAriaLabel": "Activer/Désactiver la barre latérale", "discover.topNav.openSearchPanel.manageSearchesButtonLabel": "Gérer les recherches", "discover.topNav.openSearchPanel.noSearchesFoundDescription": "Aucune recherche correspondante trouvée.", @@ -2450,25 +2411,73 @@ "discover.viewAlert.searchSourceErrorTitle": "Erreur lors de la récupération de la source de recherche", "discover.viewModes.document.label": "Documents", "discover.viewModes.fieldStatistics.label": "Statistiques de champ", - "unifiedDataTable.tableHeader.timeFieldIconTooltipAriaLabel": "{timeFieldName} – Ce champ représente l'heure à laquelle les événements se sont produits.", - "unifiedDataTable.searchGenerationWithDescription": "Tableau généré par la recherche {searchTitle}", - "unifiedDataTable.searchGenerationWithDescriptionGrid": "Tableau généré par la recherche {searchTitle} ({searchDescription})", - "unifiedDataTable.selectedDocumentsNumber": "{nr} documents sélectionnés", - "unifiedDataTable.clearSelection": "Effacer la sélection", - "unifiedDataTable.controlColumnHeader": "Colonne de commande", - "unifiedDataTable.copyToClipboardJSON": "Copier les documents dans le presse-papiers (JSON)", - "unifiedDataTable.tableHeader.timeFieldIconTooltip": "Ce champ représente l'heure à laquelle les événements se sont produits.", - "unifiedDataTable.grid.copyColumnNameToClipBoardButton": "Copier le nom", - "unifiedDataTable.grid.copyColumnValuesToClipBoardButton": "Copier la colonne", - "unifiedDataTable.grid.documentHeader": "Document", - "unifiedDataTable.grid.editFieldButton": "Modifier le champ de la vue de données", - "unifiedDataTable.grid.selectDoc": "Sélectionner le document \"{rowNumber}\"", - "unifiedDataTable.loadingResults": "Chargement des résultats", - "unifiedDataTable.noResultsFound": "Résultat introuvable", - "unifiedDataTable.removeColumnLabel": "Supprimer la colonne", - "unifiedDataTable.selectColumnHeader": "Sélectionner la colonne", - "unifiedDataTable.showAllDocuments": "Afficher tous les documents", - "unifiedDataTable.showSelectedDocumentsOnly": "Afficher uniquement les documents sélectionnés", + "discover.fieldNameIcons.binaryAriaLabel": "Binaire", + "discover.fieldNameIcons.booleanAriaLabel": "Booléen", + "discover.fieldNameIcons.conflictFieldAriaLabel": "Conflit", + "discover.fieldNameIcons.counterFieldAriaLabel": "Indicateur de compteur", + "discover.fieldNameIcons.dateFieldAriaLabel": "Date", + "discover.fieldNameIcons.dateRangeFieldAriaLabel": "Plage de dates", + "discover.fieldNameIcons.denseVectorFieldAriaLabel": "Vecteur dense", + "discover.fieldNameIcons.flattenedFieldAriaLabel": "Lissé", + "discover.fieldNameIcons.gaugeFieldAriaLabel": "Indicateur de jauge", + "discover.fieldNameIcons.geoPointFieldAriaLabel": "Point géographique", + "discover.fieldNameIcons.geoShapeFieldAriaLabel": "Forme géométrique", + "discover.fieldNameIcons.histogramFieldAriaLabel": "Histogramme", + "discover.fieldNameIcons.ipAddressFieldAriaLabel": "Adresse IP", + "discover.fieldNameIcons.ipRangeFieldAriaLabel": "Plage d'IP", + "discover.fieldNameIcons.keywordFieldAriaLabel": "Mot-clé", + "discover.fieldNameIcons.murmur3FieldAriaLabel": "Murmur3", + "discover.fieldNameIcons.nestedFieldAriaLabel": "Imbriqué", + "discover.fieldNameIcons.numberFieldAriaLabel": "Nombre", + "discover.fieldNameIcons.pointFieldAriaLabel": "Point", + "discover.fieldNameIcons.rankFeatureFieldAriaLabel": "Fonctionnalité de rang", + "discover.fieldNameIcons.rankFeaturesFieldAriaLabel": "Fonctionnalités de rang", + "discover.fieldNameIcons.recordAriaLabel": "Enregistrements", + "discover.fieldNameIcons.shapeFieldAriaLabel": "Forme", + "discover.fieldNameIcons.sourceFieldAriaLabel": "Champ source", + "discover.fieldNameIcons.stringFieldAriaLabel": "Chaîne", + "discover.fieldNameIcons.textFieldAriaLabel": "Texte", + "discover.fieldNameIcons.unknownFieldAriaLabel": "Champ inconnu", + "discover.fieldNameIcons.versionFieldAriaLabel": "Version", + "unifiedDocViewer.docView.table.actions.label": "Actions", + "unifiedDocViewer.docView.table.actions.open": "Actions ouvertes", + "unifiedDocViewer.docView.table.ignored.multiAboveTooltip": "Une ou plusieurs valeurs dans ce champ sont trop longues et ne peuvent pas être recherchées ni filtrées.", + "unifiedDocViewer.docView.table.ignored.multiMalformedTooltip": "Ce champ comporte une ou plusieurs valeurs mal formées qui ne peuvent pas être recherchées ni filtrées.", + "unifiedDocViewer.docView.table.ignored.multiUnknownTooltip": "Une ou plusieurs valeurs dans ce champ ont été ignorées par Elasticsearch et ne peuvent pas être recherchées ni filtrées.", + "unifiedDocViewer.docView.table.ignored.singleAboveTooltip": "La valeur dans ce champ est trop longue et ne peut pas être recherchée ni filtrée.", + "unifiedDocViewer.docView.table.ignored.singleMalformedTooltip": "La valeur dans ce champ est mal formée et ne peut pas être recherchée ni filtrée.", + "unifiedDocViewer.docView.table.ignored.singleUnknownTooltip": "La valeur dans ce champ a été ignorée par Elasticsearch et ne peut pas être recherchée ni filtrée.", + "unifiedDocViewer.docView.table.searchPlaceHolder": "Rechercher les noms de champs", + "unifiedDocViewer.docViews.json.jsonTitle": "JSON", + "unifiedDocViewer.docViews.table.filterForFieldPresentButtonAriaLabel": "Filtrer sur le champ", + "unifiedDocViewer.docViews.table.filterForFieldPresentButtonTooltip": "Filtrer sur le champ", + "unifiedDocViewer.docViews.table.filterForValueButtonAriaLabel": "Filtrer sur la valeur", + "unifiedDocViewer.docViews.table.filterForValueButtonTooltip": "Filtrer sur la valeur", + "unifiedDocViewer.docViews.table.filterOutValueButtonAriaLabel": "Exclure la valeur", + "unifiedDocViewer.docViews.table.filterOutValueButtonTooltip": "Exclure la valeur", + "unifiedDocViewer.docViews.table.ignored.multiValueLabel": "Contient des valeurs ignorées", + "unifiedDocViewer.docViews.table.ignored.singleValueLabel": "Valeur ignorée", + "unifiedDocViewer.docViews.table.pinFieldAriaLabel": "Épingler le champ", + "unifiedDocViewer.docViews.table.pinFieldLabel": "Épingler le champ", + "unifiedDocViewer.docViews.table.tableTitle": "Tableau", + "unifiedDocViewer.docViews.table.toggleColumnInTableButtonAriaLabel": "Afficher/Masquer la colonne dans le tableau", + "unifiedDocViewer.docViews.table.toggleColumnInTableButtonTooltip": "Afficher/Masquer la colonne dans le tableau", + "unifiedDocViewer.fieldChooser.discoverField.name": "Champ", + "unifiedDocViewer.docViews.table.unableToFilterForPresenceOfMetaFieldsTooltip": "Impossible de filtrer sur les champs méta", + "unifiedDocViewer.docViews.table.unableToFilterForPresenceOfScriptedFieldsTooltip": "Impossible de filtrer sur les champs scriptés", + "unifiedDocViewer.docViews.table.unindexedFieldsCanNotBeSearchedTooltip": "Les champs non indexés ou les valeurs ignorées ne peuvent pas être recherchés", + "unifiedDocViewer.docViews.table.unpinFieldAriaLabel": "Désépingler le champ", + "unifiedDocViewer.docViews.table.unpinFieldLabel": "Désépingler le champ", + "unifiedDocViewer.fieldChooser.discoverField.actions": "Actions", + "unifiedDocViewer.fieldChooser.discoverField.multiField": "champ multiple", + "unifiedDocViewer.fieldChooser.discoverField.multiFieldTooltipContent": "Les champs multiples peuvent avoir plusieurs valeurs.", + "unifiedDocViewer.fieldChooser.discoverField.value": "Valeur", + "unifiedDocViewer.json.codeEditorAriaLabel": "Affichage JSON en lecture seule d’un document Elasticsearch", + "unifiedDocViewer.json.copyToClipboardLabel": "Copier dans le presse-papiers", + "unifiedDocViewer.loadingJSON": "Chargement de JSON", + "unifiedDocViewer.sourceViewer.errorMessage": "Impossible de récupérer les données pour le moment. Actualisez l'onglet et réessayez.", + "unifiedDocViewer.sourceViewer.errorMessageTitle": "Une erreur s'est produite.", + "unifiedDocViewer.sourceViewer.refresh": "Actualiser", "domDragDrop.announce.cancelled": "Mouvement annulé. {label} revenu à sa position initiale", "domDragDrop.announce.cancelledItem": "Mouvement annulé. {label} revenu au groupe {groupLabel} à la position {position}", "domDragDrop.announce.dropped.combineCompatible": "{label} combiné dans le groupe {groupLabel} en {dropLabel} dans le groupe {dropGroupLabel} à la position {dropPosition} dans le calque {dropLayerNumber}", @@ -5685,34 +5694,6 @@ "unifiedFieldList.fieldNameDescription.textField": "Texte intégral tel que le corps d'un e-mail ou la description d'un produit.", "unifiedFieldList.fieldNameDescription.unknownField": "Champ inconnu", "unifiedFieldList.fieldNameDescription.versionField": "Versions des logiciels. Prend en charge les règles de priorité de la Gestion sémantique des versions.", - "discover.fieldNameIcons.binaryAriaLabel": "Binaire", - "discover.fieldNameIcons.booleanAriaLabel": "Booléen", - "discover.fieldNameIcons.conflictFieldAriaLabel": "Conflit", - "discover.fieldNameIcons.counterFieldAriaLabel": "Indicateur de compteur", - "discover.fieldNameIcons.dateFieldAriaLabel": "Date", - "discover.fieldNameIcons.dateRangeFieldAriaLabel": "Plage de dates", - "discover.fieldNameIcons.denseVectorFieldAriaLabel": "Vecteur dense", - "discover.fieldNameIcons.flattenedFieldAriaLabel": "Lissé", - "discover.fieldNameIcons.gaugeFieldAriaLabel": "Indicateur de jauge", - "discover.fieldNameIcons.geoPointFieldAriaLabel": "Point géographique", - "discover.fieldNameIcons.geoShapeFieldAriaLabel": "Forme géométrique", - "discover.fieldNameIcons.histogramFieldAriaLabel": "Histogramme", - "discover.fieldNameIcons.ipAddressFieldAriaLabel": "Adresse IP", - "discover.fieldNameIcons.ipRangeFieldAriaLabel": "Plage d'IP", - "discover.fieldNameIcons.keywordFieldAriaLabel": "Mot-clé", - "discover.fieldNameIcons.murmur3FieldAriaLabel": "Murmur3", - "discover.fieldNameIcons.nestedFieldAriaLabel": "Imbriqué", - "discover.fieldNameIcons.numberFieldAriaLabel": "Nombre", - "discover.fieldNameIcons.pointFieldAriaLabel": "Point", - "discover.fieldNameIcons.rankFeatureFieldAriaLabel": "Fonctionnalité de rang", - "discover.fieldNameIcons.rankFeaturesFieldAriaLabel": "Fonctionnalités de rang", - "discover.fieldNameIcons.recordAriaLabel": "Enregistrements", - "discover.fieldNameIcons.shapeFieldAriaLabel": "Forme", - "discover.fieldNameIcons.sourceFieldAriaLabel": "Champ source", - "discover.fieldNameIcons.stringFieldAriaLabel": "Chaîne", - "discover.fieldNameIcons.textFieldAriaLabel": "Texte", - "discover.fieldNameIcons.unknownFieldAriaLabel": "Champ inconnu", - "discover.fieldNameIcons.versionFieldAriaLabel": "Version", "unifiedFieldList.fieldNameSearch.filterByNameLabel": "Rechercher les noms de champs", "unifiedFieldList.fieldPopover.addExistsFilterLabel": "Filtrer sur le champ", "unifiedFieldList.fieldPopover.deleteFieldLabel": "Supprimer le champ de la vue de données", @@ -13655,19 +13636,6 @@ "xpack.enterpriseSearch.content.ml_inference.text_embedding": "Incorporation de texte vectoriel dense", "xpack.enterpriseSearch.content.ml_inference.text_expansion": "Expansion de texte ELSER", "xpack.enterpriseSearch.content.ml_inference.zero_shot_classification": "Classification de texte Zero-Shot", - "xpack.enterpriseSearch.content.nativeConnectors.azureBlob.name": "Stockage Blob Azure", - "xpack.enterpriseSearch.content.nativeConnectors.confluence.name": "Confluence Cloud & Server", - "xpack.enterpriseSearch.content.nativeConnectors.customConnector.name": "Connecteur personnalisé", - "xpack.enterpriseSearch.content.nativeConnectors.googleCloud.name": "Google Cloud Storage", - "xpack.enterpriseSearch.content.nativeConnectors.jira.name": "Jira Cloud & Server", - "xpack.enterpriseSearch.content.nativeConnectors.microsoftSQL.name": "Microsoft SQL", - "xpack.enterpriseSearch.content.nativeConnectors.mongodb.name": "MongoDB", - "xpack.enterpriseSearch.content.nativeConnectors.mysql.name": "MySQL", - "xpack.enterpriseSearch.content.nativeConnectors.networkDrive.name": "Lecteur réseau", - "xpack.enterpriseSearch.content.nativeConnectors.oracle.name": "Oracle", - "xpack.enterpriseSearch.content.nativeConnectors.postgresql.name": "PostgreSQL", - "xpack.enterpriseSearch.content.nativeConnectors.s3.name": "S3", - "xpack.enterpriseSearch.content.nativeConnectors.sharepoint_online.name": "SharePoint en ligne", "xpack.enterpriseSearch.content.navTitle": "Contenu", "xpack.enterpriseSearch.content.new_index.apiDescription": "Utilisez l’API pour ajouter des documents par programme à un index Elasticsearch. Commencez par créer votre index.", "xpack.enterpriseSearch.content.new_index.apiTitle": "Nouvel index de recherche", @@ -14278,40 +14246,6 @@ "xpack.enterpriseSearch.licenseDocumentationLink": "En savoir plus sur les fonctionnalités incluses dans la licence", "xpack.enterpriseSearch.licenseManagementLink": "Gérer votre licence", "xpack.enterpriseSearch.nameLabel": "Nom", - "xpack.enterpriseSearch.nativeConnectors.mongodb.configuration.collectionLabel": "Collection", - "xpack.enterpriseSearch.nativeConnectors.mongodb.configuration.directConnectionLabel": "Connexion directe", - "xpack.enterpriseSearch.nativeConnectors.mongodb.configuration.hostLabel": "Nom d'hôte du serveur", - "xpack.enterpriseSearch.nativeConnectors.mongodb.name": "MongoDB", - "xpack.enterpriseSearch.nativeConnectors.mssql.configuration.hostLabel": "Hôte", - "xpack.enterpriseSearch.nativeConnectors.mssql.configuration.passwordLabel": "Mot de passe", - "xpack.enterpriseSearch.nativeConnectors.mssql.configuration.retriesLabel": "Nouvelles tentatives par requête", - "xpack.enterpriseSearch.nativeConnectors.mssql.configuration.rowsFetchedLabel": "Lignes extraites par requête", - "xpack.enterpriseSearch.nativeConnectors.mssql.configuration.schemaLabel": "Schéma", - "xpack.enterpriseSearch.nativeConnectors.mssql.configuration.tablesLabel": "Liste de tables séparées par des virgules", - "xpack.enterpriseSearch.nativeConnectors.mssql.configuration.usernameLabel": "Nom d'utilisateur", - "xpack.enterpriseSearch.nativeConnectors.mssql.configuration.validateHostLabel": "Valider l’hôte", - "xpack.enterpriseSearch.nativeConnectors.mssql.name": "Microsoft SQL", - "xpack.enterpriseSearch.nativeConnectors.mysql.configuration.hostLabel": "Hôte", - "xpack.enterpriseSearch.nativeConnectors.mysql.configuration.passwordLabel": "Mot de passe", - "xpack.enterpriseSearch.nativeConnectors.mysql.configuration.retriesLabel": "Nouvelles tentatives par requête", - "xpack.enterpriseSearch.nativeConnectors.mysql.configuration.rowsFetchedLabel": "Lignes extraites par requête", - "xpack.enterpriseSearch.nativeConnectors.mysql.configuration.tablesLabel": "Liste de tables séparées par des virgules", - "xpack.enterpriseSearch.nativeConnectors.mysql.configuration.usernameLabel": "Nom d'utilisateur", - "xpack.enterpriseSearch.nativeConnectors.mysql.name": "MySQL", - "xpack.enterpriseSearch.nativeConnectors.postgresql.configuration.hostLabel": "Hôte", - "xpack.enterpriseSearch.nativeConnectors.postgresql.configuration.retriesLabel": "Nouvelles tentatives par requête", - "xpack.enterpriseSearch.nativeConnectors.postgresql.configuration.rowsFetchedLabel": "Lignes extraites par requête", - "xpack.enterpriseSearch.nativeConnectors.postgresql.configuration.tablesLabel": "Liste de tables séparées par des virgules", - "xpack.enterpriseSearch.nativeConnectors.postgresql.name": "PostgreSQL", - "xpack.enterpriseSearch.nativeConnectors.sharepoint_online.configuration.clientIdLabel": "ID client", - "xpack.enterpriseSearch.nativeConnectors.sharepoint_online.configuration.secretValueLabel": "Valeur secrète", - "xpack.enterpriseSearch.nativeConnectors.sharepoint_online.configuration.siteCollectionsLabel": "Liste de sites séparées par des virgules", - "xpack.enterpriseSearch.nativeConnectors.sharepoint_online.configuration.siteCollectionsTooltip": "Une liste de sites séparés par des virgules dont les données doivent être ingérées. Utilisez \"*\" pour inclure tous les sites disponibles.", - "xpack.enterpriseSearch.nativeConnectors.sharepoint_online.configuration.tenantIdLabel": "ID locataire", - "xpack.enterpriseSearch.nativeConnectors.sharepoint_online.configuration.tenantNameLabel": "Nom du locataire", - "xpack.enterpriseSearch.nativeConnectors.sharepoint_online.configuration.textExtractionServiceLabel": "Utiliser un service d’extraction de texte", - "xpack.enterpriseSearch.nativeConnectors.sharepoint_online.configuration.textExtractionServiceTooltip": "Nécessite un déploiement distinct du service d’extraction de données d’Elastic. Nécessite également que les paramètres de pipeline désactivent l’extraction de texte.", - "xpack.enterpriseSearch.nativeConnectors.sharepoint_online.name": "SharePoint en ligne", "xpack.enterpriseSearch.nativeLabel": "Natif", "xpack.enterpriseSearch.nav.analyticsCollections.explorerTitle": "Explorer", "xpack.enterpriseSearch.nav.analyticsCollections.integrationTitle": "Intégration", @@ -14497,9 +14431,6 @@ "xpack.enterpriseSearch.searchExperiences.navTitle": "Expériences de recherche", "xpack.enterpriseSearch.searchExperiences.productDescription": "Construisez une expérience de recherche attrayante et intuitive sans perdre votre temps à tout réinventer.", "xpack.enterpriseSearch.searchExperiences.productName": "Expériences de recherche", - "xpack.enterpriseSearch.server.connectors.configuration.error": "Connecteur introuvable", - "xpack.enterpriseSearch.server.connectors.scheduling.error": "Document introuvable", - "xpack.enterpriseSearch.server.connectors.serviceType.error": "Document introuvable", "xpack.enterpriseSearch.server.routes.addAnalyticsCollection.analyticsCollectionExistsError": "Le nom de collection existe déjà. Choisissez un autre nom.", "xpack.enterpriseSearch.server.routes.addAnalyticsCollection.analyticsCollectionNotFoundErrorMessage": "Collection d'analyses introuvable", "xpack.enterpriseSearch.server.routes.addConnector.connectorExistsError": "Le connecteur ou l'index existe déjà", diff --git a/x-pack/plugins/translations/translations/ja-JP.json b/x-pack/plugins/translations/translations/ja-JP.json index 26fa98a750f8d..6849a96b4bd4a 100644 --- a/x-pack/plugins/translations/translations/ja-JP.json +++ b/x-pack/plugins/translations/translations/ja-JP.json @@ -2314,36 +2314,7 @@ "discover.docTable.tableRow.viewSurroundingDocumentsLinkText": "周りのドキュメントを表示", "discover.documentsAriaLabel": "ドキュメント", "discover.documentsErrorTitle": "検索エラー", - "unifiedDocViewer.docView.table.actions.label": "アクション", - "unifiedDocViewer.docView.table.actions.open": "アクションを開く", - "unifiedDocViewer.docView.table.ignored.multiAboveTooltip": "このフィールドの1つ以上の値が長すぎるため、検索またはフィルタリングできません。", - "unifiedDocViewer.docView.table.ignored.multiMalformedTooltip": "このフィールドは、検索またはフィルタリングできない正しくない形式の値が1つ以上あります。", - "unifiedDocViewer.docView.table.ignored.multiUnknownTooltip": "このフィールドの1つ以上の値がElasticsearchによって無視されたため、検索またはフィルタリングできません。", - "unifiedDocViewer.docView.table.ignored.singleAboveTooltip": "このフィールドの値が長すぎるため、検索またはフィルタリングできません。", - "unifiedDocViewer.docView.table.ignored.singleMalformedTooltip": "このフィールドの値の形式が正しくないため、検索またはフィルタリングできません。", - "unifiedDocViewer.docView.table.ignored.singleUnknownTooltip": "このフィールドの値はElasticsearchによって無視されたため、検索またはフィルタリングできません。", - "unifiedDocViewer.docView.table.searchPlaceHolder": "検索フィールド名", - "unifiedDocViewer.docViews.json.jsonTitle": "JSON", - "unifiedDocViewer.docViews.table.filterForFieldPresentButtonAriaLabel": "フィールド表示のフィルター", - "unifiedDocViewer.docViews.table.filterForFieldPresentButtonTooltip": "フィールド表示のフィルター", - "unifiedDocViewer.docViews.table.filterForValueButtonAriaLabel": "値でフィルター", - "unifiedDocViewer.docViews.table.filterForValueButtonTooltip": "値でフィルター", - "unifiedDocViewer.docViews.table.filterOutValueButtonAriaLabel": "値を除外", - "unifiedDocViewer.docViews.table.filterOutValueButtonTooltip": "値を除外", - "unifiedDocViewer.docViews.table.ignored.multiValueLabel": "無視された値を含む", - "unifiedDocViewer.docViews.table.ignored.singleValueLabel": "無視された値", - "unifiedDocViewer.docViews.table.pinFieldAriaLabel": "フィールドを固定", - "unifiedDocViewer.docViews.table.pinFieldLabel": "フィールドを固定", "discover.docViews.table.scoreSortWarningTooltip": "_scoreの値を取得するには、並べ替える必要があります。", - "unifiedDocViewer.docViews.table.tableTitle": "表", - "unifiedDocViewer.docViews.table.toggleColumnInTableButtonAriaLabel": "表の列を切り替える", - "unifiedDocViewer.docViews.table.toggleColumnInTableButtonTooltip": "表の列を切り替える", - "unifiedDocViewer.fieldChooser.discoverField.name": "フィールド詳細を切り替える", - "unifiedDocViewer.docViews.table.unableToFilterForPresenceOfMetaFieldsTooltip": "メタフィールドの有無でフィルタリングできません", - "unifiedDocViewer.docViews.table.unableToFilterForPresenceOfScriptedFieldsTooltip": "スクリプトフィールドの有無でフィルタリングできません", - "unifiedDocViewer.docViews.table.unindexedFieldsCanNotBeSearchedTooltip": "インデックスがないフィールドまたは無視された値は検索できません", - "unifiedDocViewer.docViews.table.unpinFieldAriaLabel": "フィールドを固定解除", - "unifiedDocViewer.docViews.table.unpinFieldLabel": "フィールドを固定解除", "discover.dropZoneTableLabel": "フィールドを列として表に追加するには、ゾーンをドロップします", "discover.dscTour.stepAddFields.imageAltText": "[使用可能なフィールド]リストで、プラスアイコンをクリックし、フィールドをドキュメントテーブルに切り替えます。", "discover.dscTour.stepAddFields.title": "フィールドをテーブルに追加", @@ -2364,13 +2335,8 @@ "discover.embeddable.search.displayName": "検索", "discover.errorCalloutShowErrorMessage": "詳細を表示", "discover.fieldChooser.availableFieldsTooltip": "フィールドをテーブルに表示できます。", - "unifiedDocViewer.fieldChooser.discoverField.actions": "アクション", "discover.fieldChooser.discoverField.addFieldTooltip": "フィールドを列として追加", - "unifiedDocViewer.fieldChooser.discoverField.multiField": "複数フィールド", - "unifiedDocViewer.fieldChooser.discoverField.multiFieldTooltipContent": "複数フィールドにはフィールドごとに複数の値を入力できます", - "unifiedDocViewer.fieldChooser.discoverField.name": "フィールド", "discover.fieldChooser.discoverField.removeFieldTooltip": "フィールドを表から削除", - "unifiedDocViewer.fieldChooser.discoverField.value": "値", "discover.goToDiscoverButtonText": "Discoverに移動", "discover.grid.flyout.documentNavigation": "ドキュメントナビゲーション", "discover.grid.flyout.toastColumnAdded": "列'{columnName}'が追加されました", @@ -2386,10 +2352,8 @@ "discover.inspectorRequestDescriptionDocument": "このリクエストはElasticsearchにクエリをかけ、ドキュメントを取得します。", "discover.invalidFiltersWarnToast.description": "一部の適用されたフィルターのデータビューID参照は、現在のデータビューとは異なります。", "discover.invalidFiltersWarnToast.title": "別のインデックス参照", - "unifiedDocViewer.json.codeEditorAriaLabel": "Elasticsearch ドキュメントの JSON ビューのみを読み込む", - "unifiedDocViewer.json.copyToClipboardLabel": "クリップボードにコピー", "discover.loadingDocuments": "ドキュメントを読み込み中", - "unifiedDocViewer.loadingJSON": "JSONを読み込んでいます", + "discover.loadingResults": "結果を読み込み中", "discover.localMenu.alertsDescription": "アラート", "discover.localMenu.fallbackReportTitle": "無題のDiscover検索", "discover.localMenu.inspectTitle": "検査", @@ -2446,9 +2410,6 @@ "discover.serverLocatorExtension.titleFromLocatorUnknown": "不明な検索", "discover.singleDocRoute.errorTitle": "エラーが発生しました", "discover.skipToBottomButtonLabel": "テーブルの最後に移動", - "unifiedDocViewer.sourceViewer.errorMessage": "現在データを取得できませんでした。タブを更新して、再試行してください。", - "unifiedDocViewer.sourceViewer.errorMessageTitle": "エラーが発生しました", - "unifiedDocViewer.sourceViewer.refresh": "更新", "discover.toggleSidebarAriaLabel": "サイドバーを切り替える", "discover.topNav.openSearchPanel.manageSearchesButtonLabel": "検索の管理", "discover.topNav.openSearchPanel.noSearchesFoundDescription": "一致する検索が見つかりませんでした。", @@ -2465,25 +2426,73 @@ "discover.viewAlert.searchSourceErrorTitle": "検索ソースの取得エラー", "discover.viewModes.document.label": "ドキュメント", "discover.viewModes.fieldStatistics.label": "フィールド統計情報", - "unifiedDataTable.tableHeader.timeFieldIconTooltipAriaLabel": "{timeFieldName} - このフィールドはイベントの発生時刻を表します。", - "unifiedDataTable.searchGenerationWithDescription": "検索{searchTitle}で生成されたテーブル", - "unifiedDataTable.searchGenerationWithDescriptionGrid": "検索{searchTitle}で生成されたテーブル({searchDescription})", - "unifiedDataTable.selectedDocumentsNumber": "{nr}個のドキュメントが選択されました", - "unifiedDataTable.clearSelection": "選択した項目をクリア", - "unifiedDataTable.controlColumnHeader": "列の制御", - "unifiedDataTable.copyToClipboardJSON": "ドキュメントをクリップボードにコピー(JSON)", - "unifiedDataTable.tableHeader.timeFieldIconTooltip": "このフィールドはイベントの発生時刻を表します。", - "unifiedDataTable.grid.copyColumnNameToClipBoardButton": "名前をコピー", - "unifiedDataTable.grid.copyColumnValuesToClipBoardButton": "列をコピー", - "unifiedDataTable.grid.documentHeader": "ドキュメント", - "unifiedDataTable.grid.editFieldButton": "データビューフィールドを編集", - "unifiedDataTable.grid.selectDoc": "ドキュメント'{rowNumber}'を選択", - "unifiedDataTable.loadingResults": "結果を読み込み中", - "unifiedDataTable.noResultsFound": "結果が見つかりませんでした", - "unifiedDataTable.removeColumnLabel": "列を削除", - "unifiedDataTable.selectColumnHeader": "列を選択", - "unifiedDataTable.showAllDocuments": "すべてのドキュメントを表示", - "unifiedDataTable.showSelectedDocumentsOnly": "選択したドキュメントのみを表示", + "discover.fieldNameIcons.binaryAriaLabel": "バイナリー", + "discover.fieldNameIcons.booleanAriaLabel": "ブール", + "discover.fieldNameIcons.conflictFieldAriaLabel": "競合", + "discover.fieldNameIcons.counterFieldAriaLabel": "カウンターメトリック", + "discover.fieldNameIcons.dateFieldAriaLabel": "日付", + "discover.fieldNameIcons.dateRangeFieldAriaLabel": "日付範囲", + "discover.fieldNameIcons.denseVectorFieldAriaLabel": "密集ベクトル", + "discover.fieldNameIcons.flattenedFieldAriaLabel": "平坦化済み", + "discover.fieldNameIcons.gaugeFieldAriaLabel": "ゲージメトリック", + "discover.fieldNameIcons.geoPointFieldAriaLabel": "地理ポイント", + "discover.fieldNameIcons.geoShapeFieldAriaLabel": "地理情報図形", + "discover.fieldNameIcons.histogramFieldAriaLabel": "ヒストグラム", + "discover.fieldNameIcons.ipAddressFieldAriaLabel": "IP アドレス", + "discover.fieldNameIcons.ipRangeFieldAriaLabel": "IP範囲", + "discover.fieldNameIcons.keywordFieldAriaLabel": "キーワード", + "discover.fieldNameIcons.murmur3FieldAriaLabel": "Murmur3", + "discover.fieldNameIcons.nestedFieldAriaLabel": "ネスト済み", + "discover.fieldNameIcons.numberFieldAriaLabel": "数字", + "discover.fieldNameIcons.pointFieldAriaLabel": "点", + "discover.fieldNameIcons.rankFeatureFieldAriaLabel": "ランク特性", + "discover.fieldNameIcons.rankFeaturesFieldAriaLabel": "ランク特性", + "discover.fieldNameIcons.recordAriaLabel": "記録", + "discover.fieldNameIcons.shapeFieldAriaLabel": "形状", + "discover.fieldNameIcons.sourceFieldAriaLabel": "ソースフィールド", + "discover.fieldNameIcons.stringFieldAriaLabel": "文字列", + "discover.fieldNameIcons.textFieldAriaLabel": "テキスト", + "discover.fieldNameIcons.unknownFieldAriaLabel": "不明なフィールド", + "discover.fieldNameIcons.versionFieldAriaLabel": "バージョン", + "unifiedDocViewer.docView.table.actions.label": "アクション", + "unifiedDocViewer.docView.table.actions.open": "アクションを開く", + "unifiedDocViewer.docView.table.ignored.multiAboveTooltip": "このフィールドの1つ以上の値が長すぎるため、検索またはフィルタリングできません。", + "unifiedDocViewer.docView.table.ignored.multiMalformedTooltip": "このフィールドは、検索またはフィルタリングできない正しくない形式の値が1つ以上あります。", + "unifiedDocViewer.docView.table.ignored.multiUnknownTooltip": "このフィールドの1つ以上の値がElasticsearchによって無視されたため、検索またはフィルタリングできません。", + "unifiedDocViewer.docView.table.ignored.singleAboveTooltip": "このフィールドの値が長すぎるため、検索またはフィルタリングできません。", + "unifiedDocViewer.docView.table.ignored.singleMalformedTooltip": "このフィールドの値の形式が正しくないため、検索またはフィルタリングできません。", + "unifiedDocViewer.docView.table.ignored.singleUnknownTooltip": "このフィールドの値はElasticsearchによって無視されたため、検索またはフィルタリングできません。", + "unifiedDocViewer.docView.table.searchPlaceHolder": "検索フィールド名", + "unifiedDocViewer.docViews.json.jsonTitle": "JSON", + "unifiedDocViewer.docViews.table.filterForFieldPresentButtonAriaLabel": "フィールド表示のフィルター", + "unifiedDocViewer.docViews.table.filterForFieldPresentButtonTooltip": "フィールド表示のフィルター", + "unifiedDocViewer.docViews.table.filterForValueButtonAriaLabel": "値でフィルター", + "unifiedDocViewer.docViews.table.filterForValueButtonTooltip": "値でフィルター", + "unifiedDocViewer.docViews.table.filterOutValueButtonAriaLabel": "値を除外", + "unifiedDocViewer.docViews.table.filterOutValueButtonTooltip": "値を除外", + "unifiedDocViewer.docViews.table.ignored.multiValueLabel": "無視された値を含む", + "unifiedDocViewer.docViews.table.ignored.singleValueLabel": "無視された値", + "unifiedDocViewer.docViews.table.pinFieldAriaLabel": "フィールドを固定", + "unifiedDocViewer.docViews.table.pinFieldLabel": "フィールドを固定", + "unifiedDocViewer.docViews.table.tableTitle": "表", + "unifiedDocViewer.docViews.table.toggleColumnInTableButtonAriaLabel": "表の列を切り替える", + "unifiedDocViewer.docViews.table.toggleColumnInTableButtonTooltip": "表の列を切り替える", + "unifiedDocViewer.fieldChooser.discoverField.name": "フィールド", + "unifiedDocViewer.docViews.table.unableToFilterForPresenceOfMetaFieldsTooltip": "メタフィールドの有無でフィルタリングできません", + "unifiedDocViewer.docViews.table.unableToFilterForPresenceOfScriptedFieldsTooltip": "スクリプトフィールドの有無でフィルタリングできません", + "unifiedDocViewer.docViews.table.unindexedFieldsCanNotBeSearchedTooltip": "インデックスがないフィールドまたは無視された値は検索できません", + "unifiedDocViewer.docViews.table.unpinFieldAriaLabel": "フィールドを固定解除", + "unifiedDocViewer.docViews.table.unpinFieldLabel": "フィールドを固定解除", + "unifiedDocViewer.fieldChooser.discoverField.actions": "アクション", + "unifiedDocViewer.fieldChooser.discoverField.multiField": "複数フィールド", + "unifiedDocViewer.fieldChooser.discoverField.multiFieldTooltipContent": "複数フィールドにはフィールドごとに複数の値を入力できます", + "unifiedDocViewer.fieldChooser.discoverField.value": "値", + "unifiedDocViewer.json.codeEditorAriaLabel": "Elasticsearch ドキュメントの JSON ビューのみを読み込む", + "unifiedDocViewer.json.copyToClipboardLabel": "クリップボードにコピー", + "unifiedDocViewer.loadingJSON": "JSONを読み込んでいます", + "unifiedDocViewer.sourceViewer.errorMessage": "現在データを取得できませんでした。タブを更新して、再試行してください。", + "unifiedDocViewer.sourceViewer.errorMessageTitle": "エラーが発生しました", + "unifiedDocViewer.sourceViewer.refresh": "更新", "domDragDrop.announce.cancelled": "移動がキャンセルされました。{label}は初期位置に戻りました", "domDragDrop.announce.cancelledItem": "移動がキャンセルされました。{label}は位置{position}の{groupLabel}グループに戻りました", "domDragDrop.announce.dropped.combineCompatible": "レイヤー{dropLayerNumber}の位置{dropPosition}でグループ{dropGroupLabel}の{dropLabel}にグループ{groupLabel}の{label}を結合しました。", @@ -5701,34 +5710,6 @@ "unifiedFieldList.fieldNameDescription.textField": "電子メール本文や製品説明などの全文テキスト。", "unifiedFieldList.fieldNameDescription.unknownField": "不明なフィールド", "unifiedFieldList.fieldNameDescription.versionField": "ソフトウェアバージョン。「セマンティックバージョニング」優先度ルールをサポートします。", - "discover.fieldNameIcons.binaryAriaLabel": "バイナリー", - "discover.fieldNameIcons.booleanAriaLabel": "ブール", - "discover.fieldNameIcons.conflictFieldAriaLabel": "競合", - "discover.fieldNameIcons.counterFieldAriaLabel": "カウンターメトリック", - "discover.fieldNameIcons.dateFieldAriaLabel": "日付", - "discover.fieldNameIcons.dateRangeFieldAriaLabel": "日付範囲", - "discover.fieldNameIcons.denseVectorFieldAriaLabel": "密集ベクトル", - "discover.fieldNameIcons.flattenedFieldAriaLabel": "平坦化済み", - "discover.fieldNameIcons.gaugeFieldAriaLabel": "ゲージメトリック", - "discover.fieldNameIcons.geoPointFieldAriaLabel": "地理ポイント", - "discover.fieldNameIcons.geoShapeFieldAriaLabel": "地理情報図形", - "discover.fieldNameIcons.histogramFieldAriaLabel": "ヒストグラム", - "discover.fieldNameIcons.ipAddressFieldAriaLabel": "IP アドレス", - "discover.fieldNameIcons.ipRangeFieldAriaLabel": "IP範囲", - "discover.fieldNameIcons.keywordFieldAriaLabel": "キーワード", - "discover.fieldNameIcons.murmur3FieldAriaLabel": "Murmur3", - "discover.fieldNameIcons.nestedFieldAriaLabel": "ネスト済み", - "discover.fieldNameIcons.numberFieldAriaLabel": "数字", - "discover.fieldNameIcons.pointFieldAriaLabel": "点", - "discover.fieldNameIcons.rankFeatureFieldAriaLabel": "ランク特性", - "discover.fieldNameIcons.rankFeaturesFieldAriaLabel": "ランク特性", - "discover.fieldNameIcons.recordAriaLabel": "記録", - "discover.fieldNameIcons.shapeFieldAriaLabel": "形状", - "discover.fieldNameIcons.sourceFieldAriaLabel": "ソースフィールド", - "discover.fieldNameIcons.stringFieldAriaLabel": "文字列", - "discover.fieldNameIcons.textFieldAriaLabel": "テキスト", - "discover.fieldNameIcons.unknownFieldAriaLabel": "不明なフィールド", - "discover.fieldNameIcons.versionFieldAriaLabel": "バージョン", "unifiedFieldList.fieldNameSearch.filterByNameLabel": "検索フィールド名", "unifiedFieldList.fieldPopover.addExistsFilterLabel": "フィールド表示のフィルター", "unifiedFieldList.fieldPopover.deleteFieldLabel": "データビューフィールドを削除", @@ -13669,19 +13650,6 @@ "xpack.enterpriseSearch.content.ml_inference.text_embedding": "密ベクトルテキスト埋め込み", "xpack.enterpriseSearch.content.ml_inference.text_expansion": "ELSERテキスト拡張", "xpack.enterpriseSearch.content.ml_inference.zero_shot_classification": "ゼロショットテキスト分類", - "xpack.enterpriseSearch.content.nativeConnectors.azureBlob.name": "Azure Blob Storage", - "xpack.enterpriseSearch.content.nativeConnectors.confluence.name": "Confluence Cloud & Server", - "xpack.enterpriseSearch.content.nativeConnectors.customConnector.name": "カスタマイズされたコネクター", - "xpack.enterpriseSearch.content.nativeConnectors.googleCloud.name": "Google Cloud Storage", - "xpack.enterpriseSearch.content.nativeConnectors.jira.name": "Jira Cloud & Server", - "xpack.enterpriseSearch.content.nativeConnectors.microsoftSQL.name": "Microsoft SQL", - "xpack.enterpriseSearch.content.nativeConnectors.mongodb.name": "MongoDB", - "xpack.enterpriseSearch.content.nativeConnectors.mysql.name": "MySQL", - "xpack.enterpriseSearch.content.nativeConnectors.networkDrive.name": "ネットワークドライブ", - "xpack.enterpriseSearch.content.nativeConnectors.oracle.name": "Oracle", - "xpack.enterpriseSearch.content.nativeConnectors.postgresql.name": "PostgreSQL", - "xpack.enterpriseSearch.content.nativeConnectors.s3.name": "S3", - "xpack.enterpriseSearch.content.nativeConnectors.sharepoint_online.name": "Sharepoint Online", "xpack.enterpriseSearch.content.navTitle": "コンテンツ", "xpack.enterpriseSearch.content.new_index.apiDescription": "プログラム的にElasticsearchインデックスにドキュメントを追加するにはAPIを使用します。パイプラインを作成して開始", "xpack.enterpriseSearch.content.new_index.apiTitle": "新しい検索インデックス", @@ -14292,40 +14260,6 @@ "xpack.enterpriseSearch.licenseDocumentationLink": "ライセンス機能の詳細", "xpack.enterpriseSearch.licenseManagementLink": "ライセンスを更新", "xpack.enterpriseSearch.nameLabel": "名前", - "xpack.enterpriseSearch.nativeConnectors.mongodb.configuration.collectionLabel": "収集", - "xpack.enterpriseSearch.nativeConnectors.mongodb.configuration.directConnectionLabel": "直接接続", - "xpack.enterpriseSearch.nativeConnectors.mongodb.configuration.hostLabel": "サーバーホスト名", - "xpack.enterpriseSearch.nativeConnectors.mongodb.name": "MongoDB", - "xpack.enterpriseSearch.nativeConnectors.mssql.configuration.hostLabel": "ホスト", - "xpack.enterpriseSearch.nativeConnectors.mssql.configuration.passwordLabel": "パスワード", - "xpack.enterpriseSearch.nativeConnectors.mssql.configuration.retriesLabel": "リクエストごとの再試行回数", - "xpack.enterpriseSearch.nativeConnectors.mssql.configuration.rowsFetchedLabel": "リクエストごとに取得された行数", - "xpack.enterpriseSearch.nativeConnectors.mssql.configuration.schemaLabel": "スキーマ", - "xpack.enterpriseSearch.nativeConnectors.mssql.configuration.tablesLabel": "カンマ区切りのテーブルのリスト", - "xpack.enterpriseSearch.nativeConnectors.mssql.configuration.usernameLabel": "ユーザー名", - "xpack.enterpriseSearch.nativeConnectors.mssql.configuration.validateHostLabel": "ホストを検証", - "xpack.enterpriseSearch.nativeConnectors.mssql.name": "Microsoft SQL", - "xpack.enterpriseSearch.nativeConnectors.mysql.configuration.hostLabel": "ホスト", - "xpack.enterpriseSearch.nativeConnectors.mysql.configuration.passwordLabel": "パスワード", - "xpack.enterpriseSearch.nativeConnectors.mysql.configuration.retriesLabel": "リクエストごとの再試行回数", - "xpack.enterpriseSearch.nativeConnectors.mysql.configuration.rowsFetchedLabel": "リクエストごとに取得された行数", - "xpack.enterpriseSearch.nativeConnectors.mysql.configuration.tablesLabel": "カンマ区切りのテーブルのリスト", - "xpack.enterpriseSearch.nativeConnectors.mysql.configuration.usernameLabel": "ユーザー名", - "xpack.enterpriseSearch.nativeConnectors.mysql.name": "MySQL", - "xpack.enterpriseSearch.nativeConnectors.postgresql.configuration.hostLabel": "ホスト", - "xpack.enterpriseSearch.nativeConnectors.postgresql.configuration.retriesLabel": "リクエストごとの再試行回数", - "xpack.enterpriseSearch.nativeConnectors.postgresql.configuration.rowsFetchedLabel": "リクエストごとに取得された行数", - "xpack.enterpriseSearch.nativeConnectors.postgresql.configuration.tablesLabel": "カンマ区切りのテーブルのリスト", - "xpack.enterpriseSearch.nativeConnectors.postgresql.name": "PostgreSQL", - "xpack.enterpriseSearch.nativeConnectors.sharepoint_online.configuration.clientIdLabel": "クライアントID", - "xpack.enterpriseSearch.nativeConnectors.sharepoint_online.configuration.secretValueLabel": "シークレット値", - "xpack.enterpriseSearch.nativeConnectors.sharepoint_online.configuration.siteCollectionsLabel": "カンマ区切りのサイトのリスト", - "xpack.enterpriseSearch.nativeConnectors.sharepoint_online.configuration.siteCollectionsTooltip": "データのインジェスト元のサイトのリスト(カンマ区切り)。すべての使用可能なサイトを含めるには、*を使用します。", - "xpack.enterpriseSearch.nativeConnectors.sharepoint_online.configuration.tenantIdLabel": "テナントID", - "xpack.enterpriseSearch.nativeConnectors.sharepoint_online.configuration.tenantNameLabel": "テナント名", - "xpack.enterpriseSearch.nativeConnectors.sharepoint_online.configuration.textExtractionServiceLabel": "テキスト抽出サービスを使用", - "xpack.enterpriseSearch.nativeConnectors.sharepoint_online.configuration.textExtractionServiceTooltip": "Elastic Data Extraction Serviceを別途デプロイする必要があります。また、パイプラインの設定でテキスト抽出を無効にする必要があります。", - "xpack.enterpriseSearch.nativeConnectors.sharepoint_online.name": "Sharepoint Online", "xpack.enterpriseSearch.nativeLabel": "ネイティブ", "xpack.enterpriseSearch.nav.analyticsCollections.explorerTitle": "エクスプローラー", "xpack.enterpriseSearch.nav.analyticsCollections.integrationTitle": "統合", @@ -14511,9 +14445,6 @@ "xpack.enterpriseSearch.searchExperiences.navTitle": "検索エクスペリエンス", "xpack.enterpriseSearch.searchExperiences.productDescription": "直感的で、魅力的な検索エクスペリエンスを簡単に構築できます。", "xpack.enterpriseSearch.searchExperiences.productName": "検索エクスペリエンス", - "xpack.enterpriseSearch.server.connectors.configuration.error": "コネクターが見つかりませんでした", - "xpack.enterpriseSearch.server.connectors.scheduling.error": "ドキュメントが見つかりませんでした", - "xpack.enterpriseSearch.server.connectors.serviceType.error": "ドキュメントが見つかりませんでした", "xpack.enterpriseSearch.server.routes.addAnalyticsCollection.analyticsCollectionExistsError": "コレクション名はすでに存在します。別の名前を選択してください。", "xpack.enterpriseSearch.server.routes.addAnalyticsCollection.analyticsCollectionNotFoundErrorMessage": "分析コレクションが見つかりません", "xpack.enterpriseSearch.server.routes.addConnector.connectorExistsError": "コネクターまたはインデックスはすでに存在します", diff --git a/x-pack/plugins/translations/translations/zh-CN.json b/x-pack/plugins/translations/translations/zh-CN.json index e96481d694485..9e1a41ddaea15 100644 --- a/x-pack/plugins/translations/translations/zh-CN.json +++ b/x-pack/plugins/translations/translations/zh-CN.json @@ -2314,36 +2314,7 @@ "discover.docTable.tableRow.viewSurroundingDocumentsLinkText": "查看周围文档", "discover.documentsAriaLabel": "文档", "discover.documentsErrorTitle": "搜索错误", - "unifiedDocViewer.docView.table.actions.label": "操作", - "unifiedDocViewer.docView.table.actions.open": "打开操作", - "unifiedDocViewer.docView.table.ignored.multiAboveTooltip": "此字段中的一个或多个值过长,无法搜索或筛选。", - "unifiedDocViewer.docView.table.ignored.multiMalformedTooltip": "此字段包含一个或多个格式错误的值,无法搜索或筛选。", - "unifiedDocViewer.docView.table.ignored.multiUnknownTooltip": "此字段中的一个或多个值被 Elasticsearch 忽略,无法搜索或筛选。", - "unifiedDocViewer.docView.table.ignored.singleAboveTooltip": "此字段中的值过长,无法搜索或筛选。", - "unifiedDocViewer.docView.table.ignored.singleMalformedTooltip": "此字段中的值格式错误,无法搜索或筛选。", - "unifiedDocViewer.docView.table.ignored.singleUnknownTooltip": "此字段中的值被 Elasticsearch 忽略,无法搜索或筛选。", - "unifiedDocViewer.docView.table.searchPlaceHolder": "搜索字段名称", - "unifiedDocViewer.docViews.json.jsonTitle": "JSON", - "unifiedDocViewer.docViews.table.filterForFieldPresentButtonAriaLabel": "筛留存在的字段", - "unifiedDocViewer.docViews.table.filterForFieldPresentButtonTooltip": "字段是否存在筛选", - "unifiedDocViewer.docViews.table.filterForValueButtonAriaLabel": "筛留值", - "unifiedDocViewer.docViews.table.filterForValueButtonTooltip": "筛留值", - "unifiedDocViewer.docViews.table.filterOutValueButtonAriaLabel": "筛除值", - "unifiedDocViewer.docViews.table.filterOutValueButtonTooltip": "筛除值", - "unifiedDocViewer.docViews.table.ignored.multiValueLabel": "包含被忽略的值", - "unifiedDocViewer.docViews.table.ignored.singleValueLabel": "被忽略的值", - "unifiedDocViewer.docViews.table.pinFieldAriaLabel": "固定字段", - "unifiedDocViewer.docViews.table.pinFieldLabel": "固定字段", "discover.docViews.table.scoreSortWarningTooltip": "要检索 _score 的值,必须按其筛选。", - "unifiedDocViewer.docViews.table.tableTitle": "表", - "unifiedDocViewer.docViews.table.toggleColumnInTableButtonAriaLabel": "在表中切换列", - "unifiedDocViewer.docViews.table.toggleColumnInTableButtonTooltip": "在表中切换列", - "unifiedDocViewer.fieldChooser.discoverField.name": "切换字段详细信息", - "unifiedDocViewer.docViews.table.unableToFilterForPresenceOfMetaFieldsTooltip": "无法筛选元数据字段是否存在", - "unifiedDocViewer.docViews.table.unableToFilterForPresenceOfScriptedFieldsTooltip": "无法筛选脚本字段是否存在", - "unifiedDocViewer.docViews.table.unindexedFieldsCanNotBeSearchedTooltip": "无法搜索未编入索引的字段或被忽略的值", - "unifiedDocViewer.docViews.table.unpinFieldAriaLabel": "取消固定字段", - "unifiedDocViewer.docViews.table.unpinFieldLabel": "取消固定字段", "discover.dropZoneTableLabel": "放置区域以将字段作为列添加到表中", "discover.dscTour.stepAddFields.imageAltText": "在可用字段列表中,单击加号图标将字段切换为文档表。", "discover.dscTour.stepAddFields.title": "将字段添加到表中", @@ -2364,13 +2335,8 @@ "discover.embeddable.search.displayName": "搜索", "discover.errorCalloutShowErrorMessage": "显示详情", "discover.fieldChooser.availableFieldsTooltip": "适用于在表中显示的字段。", - "unifiedDocViewer.fieldChooser.discoverField.actions": "操作", "discover.fieldChooser.discoverField.addFieldTooltip": "将字段添加为列", - "unifiedDocViewer.fieldChooser.discoverField.multiField": "多字段", - "unifiedDocViewer.fieldChooser.discoverField.multiFieldTooltipContent": "多字段的每个字段可以有多个值", - "unifiedDocViewer.fieldChooser.discoverField.name": "字段", "discover.fieldChooser.discoverField.removeFieldTooltip": "从表中移除字段", - "unifiedDocViewer.fieldChooser.discoverField.value": "值", "discover.goToDiscoverButtonText": "前往 Discover", "discover.grid.flyout.documentNavigation": "文档导航", "discover.grid.flyout.toastColumnAdded": "已添加列“{columnName}”", @@ -2386,10 +2352,8 @@ "discover.inspectorRequestDescriptionDocument": "此请求将查询 Elasticsearch 以获取文档。", "discover.invalidFiltersWarnToast.description": "某些应用的筛选中的数据视图 ID 引用与当前数据视图不同。", "discover.invalidFiltersWarnToast.title": "不同的索引引用", - "unifiedDocViewer.json.codeEditorAriaLabel": "Elasticsearch 文档的只读 JSON 视图", - "unifiedDocViewer.json.copyToClipboardLabel": "复制到剪贴板", "discover.loadingDocuments": "正在加载文档", - "unifiedDocViewer.loadingJSON": "正在加载 JSON", + "discover.loadingResults": "正在加载结果", "discover.localMenu.alertsDescription": "告警", "discover.localMenu.fallbackReportTitle": "未命名 Discover 搜索", "discover.localMenu.inspectTitle": "检查", @@ -2446,9 +2410,6 @@ "discover.serverLocatorExtension.titleFromLocatorUnknown": "未知搜索", "discover.singleDocRoute.errorTitle": "发生错误", "discover.skipToBottomButtonLabel": "转到表尾", - "unifiedDocViewer.sourceViewer.errorMessage": "当前无法获取数据。请刷新选项卡以重试。", - "unifiedDocViewer.sourceViewer.errorMessageTitle": "发生错误", - "unifiedDocViewer.sourceViewer.refresh": "刷新", "discover.toggleSidebarAriaLabel": "切换侧边栏", "discover.topNav.openSearchPanel.manageSearchesButtonLabel": "管理搜索", "discover.topNav.openSearchPanel.noSearchesFoundDescription": "未找到匹配的搜索。", @@ -2465,25 +2426,73 @@ "discover.viewAlert.searchSourceErrorTitle": "提取搜索源时出错", "discover.viewModes.document.label": "文档", "discover.viewModes.fieldStatistics.label": "字段统计信息", - "unifiedDataTable.tableHeader.timeFieldIconTooltipAriaLabel": "{timeFieldName} - 此字段表示事件发生的时间。", - "unifiedDataTable.searchGenerationWithDescription": "搜索 {searchTitle} 生成的表", - "unifiedDataTable.searchGenerationWithDescriptionGrid": "搜索 {searchTitle} 生成的表({searchDescription})", - "unifiedDataTable.selectedDocumentsNumber": "{nr} 个文档已选择", - "unifiedDataTable.clearSelection": "清除所选内容", - "unifiedDataTable.controlColumnHeader": "控制列", - "unifiedDataTable.copyToClipboardJSON": "将文档复制到剪贴板 (JSON)", - "unifiedDataTable.tableHeader.timeFieldIconTooltip": "此字段表示事件发生的时间。", - "unifiedDataTable.grid.copyColumnNameToClipBoardButton": "复制名称", - "unifiedDataTable.grid.copyColumnValuesToClipBoardButton": "复制列", - "unifiedDataTable.grid.documentHeader": "文档", - "unifiedDataTable.grid.editFieldButton": "编辑数据视图字段", - "unifiedDataTable.grid.selectDoc": "选择文档“{rowNumber}”", - "unifiedDataTable.loadingResults": "正在加载结果", - "unifiedDataTable.noResultsFound": "找不到结果", - "unifiedDataTable.removeColumnLabel": "移除列", - "unifiedDataTable.selectColumnHeader": "选择列", - "unifiedDataTable.showAllDocuments": "显示所有文档", - "unifiedDataTable.showSelectedDocumentsOnly": "仅显示选定的文档", + "discover.fieldNameIcons.binaryAriaLabel": "二进制", + "discover.fieldNameIcons.booleanAriaLabel": "布尔型", + "discover.fieldNameIcons.conflictFieldAriaLabel": "冲突", + "discover.fieldNameIcons.counterFieldAriaLabel": "计数器指标", + "discover.fieldNameIcons.dateFieldAriaLabel": "日期", + "discover.fieldNameIcons.dateRangeFieldAriaLabel": "日期范围", + "discover.fieldNameIcons.denseVectorFieldAriaLabel": "密集向量", + "discover.fieldNameIcons.flattenedFieldAriaLabel": "扁平", + "discover.fieldNameIcons.gaugeFieldAriaLabel": "仪表盘指标", + "discover.fieldNameIcons.geoPointFieldAriaLabel": "地理点", + "discover.fieldNameIcons.geoShapeFieldAriaLabel": "几何形状", + "discover.fieldNameIcons.histogramFieldAriaLabel": "直方图", + "discover.fieldNameIcons.ipAddressFieldAriaLabel": "IP 地址", + "discover.fieldNameIcons.ipRangeFieldAriaLabel": "IP 范围", + "discover.fieldNameIcons.keywordFieldAriaLabel": "关键字", + "discover.fieldNameIcons.murmur3FieldAriaLabel": "Murmur3", + "discover.fieldNameIcons.nestedFieldAriaLabel": "嵌套", + "discover.fieldNameIcons.numberFieldAriaLabel": "数字", + "discover.fieldNameIcons.pointFieldAriaLabel": "点", + "discover.fieldNameIcons.rankFeatureFieldAriaLabel": "排名特征", + "discover.fieldNameIcons.rankFeaturesFieldAriaLabel": "排名特征", + "discover.fieldNameIcons.recordAriaLabel": "记录", + "discover.fieldNameIcons.shapeFieldAriaLabel": "形状", + "discover.fieldNameIcons.sourceFieldAriaLabel": "源字段", + "discover.fieldNameIcons.stringFieldAriaLabel": "字符串", + "discover.fieldNameIcons.textFieldAriaLabel": "文本", + "discover.fieldNameIcons.unknownFieldAriaLabel": "未知字段", + "discover.fieldNameIcons.versionFieldAriaLabel": "版本", + "unifiedDocViewer.docView.table.actions.label": "操作", + "unifiedDocViewer.docView.table.actions.open": "打开操作", + "unifiedDocViewer.docView.table.ignored.multiAboveTooltip": "此字段中的一个或多个值过长,无法搜索或筛选。", + "unifiedDocViewer.docView.table.ignored.multiMalformedTooltip": "此字段包含一个或多个格式错误的值,无法搜索或筛选。", + "unifiedDocViewer.docView.table.ignored.multiUnknownTooltip": "此字段中的一个或多个值被 Elasticsearch 忽略,无法搜索或筛选。", + "unifiedDocViewer.docView.table.ignored.singleAboveTooltip": "此字段中的值过长,无法搜索或筛选。", + "unifiedDocViewer.docView.table.ignored.singleMalformedTooltip": "此字段中的值格式错误,无法搜索或筛选。", + "unifiedDocViewer.docView.table.ignored.singleUnknownTooltip": "此字段中的值被 Elasticsearch 忽略,无法搜索或筛选。", + "unifiedDocViewer.docView.table.searchPlaceHolder": "搜索字段名称", + "unifiedDocViewer.docViews.json.jsonTitle": "JSON", + "unifiedDocViewer.docViews.table.filterForFieldPresentButtonAriaLabel": "筛留存在的字段", + "unifiedDocViewer.docViews.table.filterForFieldPresentButtonTooltip": "字段是否存在筛选", + "unifiedDocViewer.docViews.table.filterForValueButtonAriaLabel": "筛留值", + "unifiedDocViewer.docViews.table.filterForValueButtonTooltip": "筛留值", + "unifiedDocViewer.docViews.table.filterOutValueButtonAriaLabel": "筛除值", + "unifiedDocViewer.docViews.table.filterOutValueButtonTooltip": "筛除值", + "unifiedDocViewer.docViews.table.ignored.multiValueLabel": "包含被忽略的值", + "unifiedDocViewer.docViews.table.ignored.singleValueLabel": "被忽略的值", + "unifiedDocViewer.docViews.table.pinFieldAriaLabel": "固定字段", + "unifiedDocViewer.docViews.table.pinFieldLabel": "固定字段", + "unifiedDocViewer.docViews.table.tableTitle": "表", + "unifiedDocViewer.docViews.table.toggleColumnInTableButtonAriaLabel": "在表中切换列", + "unifiedDocViewer.docViews.table.toggleColumnInTableButtonTooltip": "在表中切换列", + "unifiedDocViewer.fieldChooser.discoverField.name": "字段", + "unifiedDocViewer.docViews.table.unableToFilterForPresenceOfMetaFieldsTooltip": "无法筛选元数据字段是否存在", + "unifiedDocViewer.docViews.table.unableToFilterForPresenceOfScriptedFieldsTooltip": "无法筛选脚本字段是否存在", + "unifiedDocViewer.docViews.table.unindexedFieldsCanNotBeSearchedTooltip": "无法搜索未编入索引的字段或被忽略的值", + "unifiedDocViewer.docViews.table.unpinFieldAriaLabel": "取消固定字段", + "unifiedDocViewer.docViews.table.unpinFieldLabel": "取消固定字段", + "unifiedDocViewer.fieldChooser.discoverField.actions": "操作", + "unifiedDocViewer.fieldChooser.discoverField.multiField": "多字段", + "unifiedDocViewer.fieldChooser.discoverField.multiFieldTooltipContent": "多字段的每个字段可以有多个值", + "unifiedDocViewer.fieldChooser.discoverField.value": "值", + "unifiedDocViewer.json.codeEditorAriaLabel": "Elasticsearch 文档的只读 JSON 视图", + "unifiedDocViewer.json.copyToClipboardLabel": "复制到剪贴板", + "unifiedDocViewer.loadingJSON": "正在加载 JSON", + "unifiedDocViewer.sourceViewer.errorMessage": "当前无法获取数据。请刷新选项卡以重试。", + "unifiedDocViewer.sourceViewer.errorMessageTitle": "发生错误", + "unifiedDocViewer.sourceViewer.refresh": "刷新", "domDragDrop.announce.cancelled": "移动已取消。{label} 已返回至其初始位置", "domDragDrop.announce.cancelledItem": "移动已取消。{label} 返回至 {groupLabel} 组中的位置 {position}", "domDragDrop.announce.dropped.combineCompatible": "已将组 {groupLabel} 中的 {label} 组合到图层 {dropLayerNumber} 的组 {dropGroupLabel} 中的位置 {dropPosition} 上的 {dropLabel}", @@ -5700,34 +5709,6 @@ "unifiedFieldList.fieldNameDescription.textField": "全文本,如电子邮件正文或产品描述。", "unifiedFieldList.fieldNameDescription.unknownField": "未知字段", "unifiedFieldList.fieldNameDescription.versionField": "软件版本。支持“语义版本控制”优先规则。", - "discover.fieldNameIcons.binaryAriaLabel": "二进制", - "discover.fieldNameIcons.booleanAriaLabel": "布尔型", - "discover.fieldNameIcons.conflictFieldAriaLabel": "冲突", - "discover.fieldNameIcons.counterFieldAriaLabel": "计数器指标", - "discover.fieldNameIcons.dateFieldAriaLabel": "日期", - "discover.fieldNameIcons.dateRangeFieldAriaLabel": "日期范围", - "discover.fieldNameIcons.denseVectorFieldAriaLabel": "密集向量", - "discover.fieldNameIcons.flattenedFieldAriaLabel": "扁平", - "discover.fieldNameIcons.gaugeFieldAriaLabel": "仪表盘指标", - "discover.fieldNameIcons.geoPointFieldAriaLabel": "地理点", - "discover.fieldNameIcons.geoShapeFieldAriaLabel": "几何形状", - "discover.fieldNameIcons.histogramFieldAriaLabel": "直方图", - "discover.fieldNameIcons.ipAddressFieldAriaLabel": "IP 地址", - "discover.fieldNameIcons.ipRangeFieldAriaLabel": "IP 范围", - "discover.fieldNameIcons.keywordFieldAriaLabel": "关键字", - "discover.fieldNameIcons.murmur3FieldAriaLabel": "Murmur3", - "discover.fieldNameIcons.nestedFieldAriaLabel": "嵌套", - "discover.fieldNameIcons.numberFieldAriaLabel": "数字", - "discover.fieldNameIcons.pointFieldAriaLabel": "点", - "discover.fieldNameIcons.rankFeatureFieldAriaLabel": "排名特征", - "discover.fieldNameIcons.rankFeaturesFieldAriaLabel": "排名特征", - "discover.fieldNameIcons.recordAriaLabel": "记录", - "discover.fieldNameIcons.shapeFieldAriaLabel": "形状", - "discover.fieldNameIcons.sourceFieldAriaLabel": "源字段", - "discover.fieldNameIcons.stringFieldAriaLabel": "字符串", - "discover.fieldNameIcons.textFieldAriaLabel": "文本", - "discover.fieldNameIcons.unknownFieldAriaLabel": "未知字段", - "discover.fieldNameIcons.versionFieldAriaLabel": "版本", "unifiedFieldList.fieldNameSearch.filterByNameLabel": "搜索字段名称", "unifiedFieldList.fieldPopover.addExistsFilterLabel": "筛留存在的字段", "unifiedFieldList.fieldPopover.deleteFieldLabel": "删除数据视图字段", @@ -13669,19 +13650,6 @@ "xpack.enterpriseSearch.content.ml_inference.text_embedding": "密集向量文本嵌入", "xpack.enterpriseSearch.content.ml_inference.text_expansion": "ELSER 文本扩展", "xpack.enterpriseSearch.content.ml_inference.zero_shot_classification": "Zero-Shot 文本分类", - "xpack.enterpriseSearch.content.nativeConnectors.azureBlob.name": "Azure Blob 存储", - "xpack.enterpriseSearch.content.nativeConnectors.confluence.name": "Confluence Cloud 和 Confluence Server", - "xpack.enterpriseSearch.content.nativeConnectors.customConnector.name": "定制连接器", - "xpack.enterpriseSearch.content.nativeConnectors.googleCloud.name": "Google Cloud Storage", - "xpack.enterpriseSearch.content.nativeConnectors.jira.name": "Jira Cloud 和 Jira Server", - "xpack.enterpriseSearch.content.nativeConnectors.microsoftSQL.name": "Microsoft SQL", - "xpack.enterpriseSearch.content.nativeConnectors.mongodb.name": "MongoDB", - "xpack.enterpriseSearch.content.nativeConnectors.mysql.name": "MySQL", - "xpack.enterpriseSearch.content.nativeConnectors.networkDrive.name": "网络驱动器", - "xpack.enterpriseSearch.content.nativeConnectors.oracle.name": "Oracle", - "xpack.enterpriseSearch.content.nativeConnectors.postgresql.name": "PostgreSQL", - "xpack.enterpriseSearch.content.nativeConnectors.s3.name": "S3", - "xpack.enterpriseSearch.content.nativeConnectors.sharepoint_online.name": "Sharepoint", "xpack.enterpriseSearch.content.navTitle": "内容", "xpack.enterpriseSearch.content.new_index.apiDescription": "使用 API 以编程方式将文档添加到 Elasticsearch 索引。首先创建索引。", "xpack.enterpriseSearch.content.new_index.apiTitle": "新搜索索引", @@ -14292,40 +14260,6 @@ "xpack.enterpriseSearch.licenseDocumentationLink": "详细了解许可证功能", "xpack.enterpriseSearch.licenseManagementLink": "管理您的许可", "xpack.enterpriseSearch.nameLabel": "名称", - "xpack.enterpriseSearch.nativeConnectors.mongodb.configuration.collectionLabel": "集合", - "xpack.enterpriseSearch.nativeConnectors.mongodb.configuration.directConnectionLabel": "直接连接", - "xpack.enterpriseSearch.nativeConnectors.mongodb.configuration.hostLabel": "服务器主机名", - "xpack.enterpriseSearch.nativeConnectors.mongodb.name": "MongoDB", - "xpack.enterpriseSearch.nativeConnectors.mssql.configuration.hostLabel": "主机", - "xpack.enterpriseSearch.nativeConnectors.mssql.configuration.passwordLabel": "密码", - "xpack.enterpriseSearch.nativeConnectors.mssql.configuration.retriesLabel": "根据请求重试", - "xpack.enterpriseSearch.nativeConnectors.mssql.configuration.rowsFetchedLabel": "根据请求提取的行", - "xpack.enterpriseSearch.nativeConnectors.mssql.configuration.schemaLabel": "架构", - "xpack.enterpriseSearch.nativeConnectors.mssql.configuration.tablesLabel": "表的逗号分隔列表", - "xpack.enterpriseSearch.nativeConnectors.mssql.configuration.usernameLabel": "用户名", - "xpack.enterpriseSearch.nativeConnectors.mssql.configuration.validateHostLabel": "验证主机", - "xpack.enterpriseSearch.nativeConnectors.mssql.name": "Microsoft SQL", - "xpack.enterpriseSearch.nativeConnectors.mysql.configuration.hostLabel": "主机", - "xpack.enterpriseSearch.nativeConnectors.mysql.configuration.passwordLabel": "密码", - "xpack.enterpriseSearch.nativeConnectors.mysql.configuration.retriesLabel": "根据请求重试", - "xpack.enterpriseSearch.nativeConnectors.mysql.configuration.rowsFetchedLabel": "根据请求提取的行", - "xpack.enterpriseSearch.nativeConnectors.mysql.configuration.tablesLabel": "表的逗号分隔列表", - "xpack.enterpriseSearch.nativeConnectors.mysql.configuration.usernameLabel": "用户名", - "xpack.enterpriseSearch.nativeConnectors.mysql.name": "MySQL", - "xpack.enterpriseSearch.nativeConnectors.postgresql.configuration.hostLabel": "主机", - "xpack.enterpriseSearch.nativeConnectors.postgresql.configuration.retriesLabel": "根据请求重试", - "xpack.enterpriseSearch.nativeConnectors.postgresql.configuration.rowsFetchedLabel": "根据请求提取的行", - "xpack.enterpriseSearch.nativeConnectors.postgresql.configuration.tablesLabel": "表的逗号分隔列表", - "xpack.enterpriseSearch.nativeConnectors.postgresql.name": "PostgreSQL", - "xpack.enterpriseSearch.nativeConnectors.sharepoint_online.configuration.clientIdLabel": "客户端 ID", - "xpack.enterpriseSearch.nativeConnectors.sharepoint_online.configuration.secretValueLabel": "机密值", - "xpack.enterpriseSearch.nativeConnectors.sharepoint_online.configuration.siteCollectionsLabel": "网站的逗号分隔列表", - "xpack.enterpriseSearch.nativeConnectors.sharepoint_online.configuration.siteCollectionsTooltip": "要从中采集数据的网站的逗号分隔列表。使用 * 以包括所有可用网站。", - "xpack.enterpriseSearch.nativeConnectors.sharepoint_online.configuration.tenantIdLabel": "租户 ID", - "xpack.enterpriseSearch.nativeConnectors.sharepoint_online.configuration.tenantNameLabel": "租户名称", - "xpack.enterpriseSearch.nativeConnectors.sharepoint_online.configuration.textExtractionServiceLabel": "使用文本提取服务", - "xpack.enterpriseSearch.nativeConnectors.sharepoint_online.configuration.textExtractionServiceTooltip": "需要独立部署的 Elastic 数据提取服务。还需要管道设置禁用文本提取。", - "xpack.enterpriseSearch.nativeConnectors.sharepoint_online.name": "Sharepoint", "xpack.enterpriseSearch.nativeLabel": "原生", "xpack.enterpriseSearch.nav.analyticsCollections.explorerTitle": "浏览器", "xpack.enterpriseSearch.nav.analyticsCollections.integrationTitle": "集成", @@ -14511,9 +14445,6 @@ "xpack.enterpriseSearch.searchExperiences.navTitle": "搜索体验", "xpack.enterpriseSearch.searchExperiences.productDescription": "构建直观、具有吸引力的搜索体验,而无需浪费时间进行重复工作。", "xpack.enterpriseSearch.searchExperiences.productName": "搜索体验", - "xpack.enterpriseSearch.server.connectors.configuration.error": "找不到连接器", - "xpack.enterpriseSearch.server.connectors.scheduling.error": "无法找到文档", - "xpack.enterpriseSearch.server.connectors.serviceType.error": "无法找到文档", "xpack.enterpriseSearch.server.routes.addAnalyticsCollection.analyticsCollectionExistsError": "集合名称已存在。请选择其他名称。", "xpack.enterpriseSearch.server.routes.addAnalyticsCollection.analyticsCollectionNotFoundErrorMessage": "未找到分析集合", "xpack.enterpriseSearch.server.routes.addConnector.connectorExistsError": "连接器或索引已存在", diff --git a/yarn.lock b/yarn.lock index 3ff002d5dfe50..69e5329560e94 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5315,6 +5315,10 @@ version "0.0.0" uid "" +"@kbn/search-connectors@link:packages/kbn-search-connectors": + version "0.0.0" + uid "" + "@kbn/search-examples-plugin@link:examples/search_examples": version "0.0.0" uid "" From e8699cedaffaa3b88ada47c5e0867cf9693cb9dc Mon Sep 17 00:00:00 2001 From: Kevin Delemme Date: Wed, 6 Sep 2023 09:07:10 -0400 Subject: [PATCH 11/97] feat(slo): add public access (#165698) --- .../plugins/observability/server/routes/slo/route.ts | 12 ++++++++++++ x-pack/plugins/observability/server/routes/types.ts | 1 + 2 files changed, 13 insertions(+) diff --git a/x-pack/plugins/observability/server/routes/slo/route.ts b/x-pack/plugins/observability/server/routes/slo/route.ts index 99eec0b54ee5a..2dfdcb2308ee3 100644 --- a/x-pack/plugins/observability/server/routes/slo/route.ts +++ b/x-pack/plugins/observability/server/routes/slo/route.ts @@ -74,6 +74,7 @@ const createSLORoute = createObservabilityServerRoute({ endpoint: 'POST /api/observability/slos 2023-10-31', options: { tags: ['access:slo_write'], + access: 'public', }, params: createSLOParamsSchema, handler: async ({ context, params, logger }) => { @@ -95,6 +96,7 @@ const updateSLORoute = createObservabilityServerRoute({ endpoint: 'PUT /api/observability/slos/{id} 2023-10-31', options: { tags: ['access:slo_write'], + access: 'public', }, params: updateSLOParamsSchema, handler: async ({ context, params, logger }) => { @@ -117,6 +119,7 @@ const deleteSLORoute = createObservabilityServerRoute({ endpoint: 'DELETE /api/observability/slos/{id} 2023-10-31', options: { tags: ['access:slo_write'], + access: 'public', }, params: deleteSLOParamsSchema, handler: async ({ @@ -145,6 +148,7 @@ const getSLORoute = createObservabilityServerRoute({ endpoint: 'GET /api/observability/slos/{id} 2023-10-31', options: { tags: ['access:slo_read'], + access: 'public', }, params: getSLOParamsSchema, handler: async ({ context, params }) => { @@ -166,6 +170,7 @@ const enableSLORoute = createObservabilityServerRoute({ endpoint: 'POST /api/observability/slos/{id}/enable 2023-10-31', options: { tags: ['access:slo_write'], + access: 'public', }, params: manageSLOParamsSchema, handler: async ({ context, params, logger }) => { @@ -188,6 +193,7 @@ const disableSLORoute = createObservabilityServerRoute({ endpoint: 'POST /api/observability/slos/{id}/disable 2023-10-31', options: { tags: ['access:slo_write'], + access: 'public', }, params: manageSLOParamsSchema, handler: async ({ context, params, logger }) => { @@ -210,6 +216,7 @@ const findSLORoute = createObservabilityServerRoute({ endpoint: 'GET /api/observability/slos 2023-10-31', options: { tags: ['access:slo_read'], + access: 'public', }, params: findSLOParamsSchema, handler: async ({ context, params, logger }) => { @@ -247,6 +254,7 @@ const findSloDefinitionsRoute = createObservabilityServerRoute({ endpoint: 'GET /internal/observability/slos/_definitions', options: { tags: ['access:slo_read'], + access: 'internal', }, params: findSloDefinitionsParamsSchema, handler: async ({ context, params }) => { @@ -288,6 +296,7 @@ const getSLOInstancesRoute = createObservabilityServerRoute({ endpoint: 'GET /internal/observability/slos/{id}/_instances', options: { tags: ['access:slo_read'], + access: 'internal', }, params: getSLOInstancesParamsSchema, handler: async ({ context, params }) => { @@ -309,6 +318,7 @@ const getDiagnosisRoute = createObservabilityServerRoute({ endpoint: 'GET /internal/observability/slos/_diagnosis', options: { tags: [], + access: 'internal', }, params: undefined, handler: async ({ context }) => { @@ -331,6 +341,7 @@ const getSloBurnRates = createObservabilityServerRoute({ endpoint: 'POST /internal/observability/slos/{id}/_burn_rates', options: { tags: ['access:slo_read'], + access: 'internal', }, params: getSLOBurnRatesParamsSchema, handler: async ({ context, params }) => { @@ -355,6 +366,7 @@ const getPreviewData = createObservabilityServerRoute({ endpoint: 'POST /internal/observability/slos/_preview', options: { tags: ['access:slo_read'], + access: 'internal', }, params: getPreviewDataParamsSchema, handler: async ({ context, params }) => { diff --git a/x-pack/plugins/observability/server/routes/types.ts b/x-pack/plugins/observability/server/routes/types.ts index 866bd3c79c1d1..a0ef6ee6c0c74 100644 --- a/x-pack/plugins/observability/server/routes/types.ts +++ b/x-pack/plugins/observability/server/routes/types.ts @@ -25,6 +25,7 @@ export interface ObservabilityRouteHandlerResources { export interface ObservabilityRouteCreateOptions { options: { tags: string[]; + access?: 'public' | 'internal'; }; } From b48dc8409977e2cae5363756a772fc4ed1104593 Mon Sep 17 00:00:00 2001 From: Julien Lind Date: Wed, 6 Sep 2023 15:16:39 +0200 Subject: [PATCH 12/97] [Fleet] Add Fleet Settings link to the output section (#165678) ## Summary Update the fleet output page and add links for users. Update the fleet ES output page and add link for the custom yaml box Co-authored-by: julienlind --- packages/kbn-doc-links/src/get_doc_links.ts | 1 + packages/kbn-doc-links/src/types.ts | 1 + .../components/edit_output_flyout/index.tsx | 10 +++++++--- .../components/settings_page/output_section.tsx | 15 +++++++++------ 4 files changed, 18 insertions(+), 9 deletions(-) diff --git a/packages/kbn-doc-links/src/get_doc_links.ts b/packages/kbn-doc-links/src/get_doc_links.ts index 147b26fc6e03a..014bd64bbb68a 100644 --- a/packages/kbn-doc-links/src/get_doc_links.ts +++ b/packages/kbn-doc-links/src/get_doc_links.ts @@ -728,6 +728,7 @@ export const getDocLinks = ({ kibanaBranch }: GetDocLinkOptions): DocLinks => { settings: `${FLEET_DOCS}fleet-settings.html`, kafkaSettings: `${FLEET_DOCS}kafka-output-settings.html`, logstashSettings: `${FLEET_DOCS}ls-output-settings.html`, + esSettings: `${FLEET_DOCS}es-output-settings.html`, settingsFleetServerHostSettings: `${FLEET_DOCS}fleet-settings.html#fleet-server-hosts-setting`, settingsFleetServerProxySettings: `${KIBANA_DOCS}fleet-settings-kb.html#fleet-data-visualizer-settings`, troubleshooting: `${FLEET_DOCS}fleet-troubleshooting.html`, diff --git a/packages/kbn-doc-links/src/types.ts b/packages/kbn-doc-links/src/types.ts index 428ef86267dd1..b576a38239e2e 100644 --- a/packages/kbn-doc-links/src/types.ts +++ b/packages/kbn-doc-links/src/types.ts @@ -489,6 +489,7 @@ export interface DocLinks { guide: string; fleetServer: string; fleetServerAddFleetServer: string; + esSettings: string; settings: string; logstashSettings: string; kafkaSettings: string; diff --git a/x-pack/plugins/fleet/public/applications/fleet/sections/settings/components/edit_output_flyout/index.tsx b/x-pack/plugins/fleet/public/applications/fleet/sections/settings/components/edit_output_flyout/index.tsx index 3270facd176b9..0e9ca6725a1a9 100644 --- a/x-pack/plugins/fleet/public/applications/fleet/sections/settings/components/edit_output_flyout/index.tsx +++ b/x-pack/plugins/fleet/public/applications/fleet/sections/settings/components/edit_output_flyout/index.tsx @@ -424,9 +424,13 @@ export const EditOutputFlyout: React.FunctionComponent = /> + {i18n.translate('xpack.fleet.settings.editOutputFlyout.yamlConfigInputLabel', { + defaultMessage: 'Advanced YAML configuration', + })} + + } {...inputs.additionalYamlConfigInput.formRowProps} fullWidth > diff --git a/x-pack/plugins/fleet/public/applications/fleet/sections/settings/components/settings_page/output_section.tsx b/x-pack/plugins/fleet/public/applications/fleet/sections/settings/components/settings_page/output_section.tsx index 6f053316ac58b..dd65df3e41c8f 100644 --- a/x-pack/plugins/fleet/public/applications/fleet/sections/settings/components/settings_page/output_section.tsx +++ b/x-pack/plugins/fleet/public/applications/fleet/sections/settings/components/settings_page/output_section.tsx @@ -6,10 +6,10 @@ */ import React from 'react'; -import { EuiTitle, EuiText, EuiSpacer, EuiButtonEmpty } from '@elastic/eui'; +import { EuiTitle, EuiText, EuiSpacer, EuiButtonEmpty, EuiLink } from '@elastic/eui'; import { FormattedMessage } from '@kbn/i18n-react'; -import { useLink } from '../../../../hooks'; +import { useLink, useStartServices } from '../../../../hooks'; import type { Output } from '../../../../types'; import { OutputsTable } from '../outputs_table'; @@ -23,6 +23,7 @@ export const OutputSection: React.FunctionComponent = ({ deleteOutput, }) => { const { getHref } = useLink(); + const { docLinks } = useStartServices(); return ( <> @@ -33,10 +34,12 @@ export const OutputSection: React.FunctionComponent = ({ - + + + From d6a2bd77788c318a9f74247a52a1b6da05779b4b Mon Sep 17 00:00:00 2001 From: Steph Milovic Date: Wed, 6 Sep 2023 07:38:39 -0600 Subject: [PATCH 13/97] [Actions] Adjust axios payload for APIs that do not want `data` sent (#165756) --- x-pack/plugins/actions/server/lib/axios_utils.test.ts | 3 --- x-pack/plugins/actions/server/lib/axios_utils.ts | 2 +- 2 files changed, 1 insertion(+), 4 deletions(-) diff --git a/x-pack/plugins/actions/server/lib/axios_utils.test.ts b/x-pack/plugins/actions/server/lib/axios_utils.test.ts index 1f94e610f60bf..7423042e68228 100644 --- a/x-pack/plugins/actions/server/lib/axios_utils.test.ts +++ b/x-pack/plugins/actions/server/lib/axios_utils.test.ts @@ -66,7 +66,6 @@ describe('request', () => { expect(axiosMock).toHaveBeenCalledWith('/test', { method: 'get', - data: {}, httpAgent: undefined, httpsAgent: expect.any(HttpsAgent), proxy: false, @@ -100,7 +99,6 @@ describe('request', () => { expect(axiosMock).toHaveBeenCalledWith(TestUrl, { method: 'get', - data: {}, httpAgent, httpsAgent, proxy: false, @@ -132,7 +130,6 @@ describe('request', () => { expect(axiosMock).toHaveBeenCalledWith('https://testProxy', { method: 'get', - data: {}, httpAgent: undefined, httpsAgent: expect.any(HttpsAgent), proxy: false, diff --git a/x-pack/plugins/actions/server/lib/axios_utils.ts b/x-pack/plugins/actions/server/lib/axios_utils.ts index 181893db15f0c..163eac3eada2b 100644 --- a/x-pack/plugins/actions/server/lib/axios_utils.ts +++ b/x-pack/plugins/actions/server/lib/axios_utils.ts @@ -51,7 +51,7 @@ export const request = async ({ ...config, method, headers, - data: data ?? {}, + ...(data ? { data } : {}), // use httpAgent and httpsAgent and set axios proxy: false, to be able to handle fail on invalid certs httpAgent, httpsAgent, From 8c39735fcf45d19b68339d646a8b1defb108ff10 Mon Sep 17 00:00:00 2001 From: Marco Antonio Ghiani Date: Wed, 6 Sep 2023 15:44:48 +0200 Subject: [PATCH 14/97] [Logs Onboarding] Implement Observability Onboarding locator (#165805) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## 📓 Summary In preparation for #165486 where we'll implement a call to action to bring into the logs onboarding, this PR implement the onboarding locator for the `observability_onboarding` plugin. The locator is both returned in the plugin contract and registered in the central registry so that we'll be able to consume it without creating circular dependencies between `observability_onboarding` and `observability_log_explorer` plugins. With this first iteration, the locator allows to navigate to the landing page or to specify a log source to onboard: ```ts // Navigate to onboarding landing page: /app/observabilityOnboarding plugins.share.url.locators.get(OBSERVABILITY_ONBOARDING_LOCATOR).navigate() // Navigate to system logs onboarding: /app/observabilityOnboarding/systemLogs plugins.share.url.locators.get(OBSERVABILITY_ONBOARDING_LOCATOR).navigate({source: 'systemLogs'}) // Navigate to custom logs onboarding: /app/observabilityOnboarding/customLogs plugins.share.url.locators.get(OBSERVABILITY_ONBOARDING_LOCATOR).navigate({source: 'customLogs'}) ``` --------- Co-authored-by: Marco Antonio Ghiani Co-authored-by: kibanamachine <42973632+kibanamachine@users.noreply.github.com> Co-authored-by: Yngrid Coello --- .../observability_onboarding/kibana.jsonc | 2 +- .../observability_onboarding/public/index.ts | 2 ++ .../public/locators/index.ts | 12 +++++++ .../onboarding_locator/get_location.ts | 21 ++++++++++++ .../locator_definition.test.ts | 32 +++++++++++++++++++ .../onboarding_locator/locator_definition.ts | 25 +++++++++++++++ .../locators/onboarding_locator/types.ts | 18 +++++++++++ .../observability_onboarding/public/plugin.ts | 27 ++++++++++++++-- .../observability_onboarding/tsconfig.json | 2 ++ 9 files changed, 137 insertions(+), 4 deletions(-) create mode 100644 x-pack/plugins/observability_onboarding/public/locators/index.ts create mode 100644 x-pack/plugins/observability_onboarding/public/locators/onboarding_locator/get_location.ts create mode 100644 x-pack/plugins/observability_onboarding/public/locators/onboarding_locator/locator_definition.test.ts create mode 100644 x-pack/plugins/observability_onboarding/public/locators/onboarding_locator/locator_definition.ts create mode 100644 x-pack/plugins/observability_onboarding/public/locators/onboarding_locator/types.ts diff --git a/x-pack/plugins/observability_onboarding/kibana.jsonc b/x-pack/plugins/observability_onboarding/kibana.jsonc index 97689407aff41..0379aec27b496 100644 --- a/x-pack/plugins/observability_onboarding/kibana.jsonc +++ b/x-pack/plugins/observability_onboarding/kibana.jsonc @@ -7,7 +7,7 @@ "server": true, "browser": true, "configPath": ["xpack", "observability_onboarding"], - "requiredPlugins": ["data", "observability", "observabilityShared", "discover"], + "requiredPlugins": ["data", "observability", "observabilityShared", "discover", "share"], "optionalPlugins": ["cloud", "usageCollection"], "requiredBundles": ["kibanaReact"], "extraPublicDirs": ["common"] diff --git a/x-pack/plugins/observability_onboarding/public/index.ts b/x-pack/plugins/observability_onboarding/public/index.ts index 9454626e80dc8..d4a667b9e7269 100644 --- a/x-pack/plugins/observability_onboarding/public/index.ts +++ b/x-pack/plugins/observability_onboarding/public/index.ts @@ -17,6 +17,8 @@ import { ObservabilityOnboardingPluginStart, } from './plugin'; +export { OBSERVABILITY_ONBOARDING_LOCATOR } from './locators/onboarding_locator/locator_definition'; + export interface ConfigSchema { ui: { enabled: boolean; diff --git a/x-pack/plugins/observability_onboarding/public/locators/index.ts b/x-pack/plugins/observability_onboarding/public/locators/index.ts new file mode 100644 index 0000000000000..5f82c40181259 --- /dev/null +++ b/x-pack/plugins/observability_onboarding/public/locators/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; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { ObservabilityOnboardingLocator } from './onboarding_locator/types'; + +export interface ObservabilityOnboardingPluginLocators { + onboarding: ObservabilityOnboardingLocator; +} diff --git a/x-pack/plugins/observability_onboarding/public/locators/onboarding_locator/get_location.ts b/x-pack/plugins/observability_onboarding/public/locators/onboarding_locator/get_location.ts new file mode 100644 index 0000000000000..93bb3861740cd --- /dev/null +++ b/x-pack/plugins/observability_onboarding/public/locators/onboarding_locator/get_location.ts @@ -0,0 +1,21 @@ +/* + * 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 { ObservabilityOnboardingLocatorParams } from './types'; +import { PLUGIN_ID } from '../../../common'; + +export function getLocation(params: ObservabilityOnboardingLocatorParams) { + const { source } = params; + + const path = ['/', source].filter(Boolean).join(''); + + return { + app: PLUGIN_ID, + path, + state: {}, + }; +} diff --git a/x-pack/plugins/observability_onboarding/public/locators/onboarding_locator/locator_definition.test.ts b/x-pack/plugins/observability_onboarding/public/locators/onboarding_locator/locator_definition.test.ts new file mode 100644 index 0000000000000..6caf9222a239f --- /dev/null +++ b/x-pack/plugins/observability_onboarding/public/locators/onboarding_locator/locator_definition.test.ts @@ -0,0 +1,32 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { ObservabilityOnboardingLocatorDefinition } from './locator_definition'; + +describe('Observability onboarding locator', () => { + test('should create a link to the overview page', async () => { + const locator = new ObservabilityOnboardingLocatorDefinition(); + const location = await locator.getLocation(); + + expect(location).toMatchObject({ + app: 'observabilityOnboarding', + path: '/', + state: {}, + }); + }); + + test('should create a link to specified log source onboarding', async () => { + const locator = new ObservabilityOnboardingLocatorDefinition(); + const systemLocation = await locator.getLocation({ source: 'systemLogs' }); + + expect(systemLocation).toMatchObject({ + app: 'observabilityOnboarding', + path: '/systemLogs', + state: {}, + }); + }); +}); diff --git a/x-pack/plugins/observability_onboarding/public/locators/onboarding_locator/locator_definition.ts b/x-pack/plugins/observability_onboarding/public/locators/onboarding_locator/locator_definition.ts new file mode 100644 index 0000000000000..0c18e06cb92f5 --- /dev/null +++ b/x-pack/plugins/observability_onboarding/public/locators/onboarding_locator/locator_definition.ts @@ -0,0 +1,25 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import type { LocatorDefinition } from '@kbn/share-plugin/public'; +import type { ObservabilityOnboardingLocatorParams } from './types'; + +export const OBSERVABILITY_ONBOARDING_LOCATOR = + 'OBSERVABILITY_ONBOARDING_LOCATOR' as const; + +export class ObservabilityOnboardingLocatorDefinition + implements LocatorDefinition +{ + public readonly id = OBSERVABILITY_ONBOARDING_LOCATOR; + + public readonly getLocation = async ( + params: ObservabilityOnboardingLocatorParams = {} + ) => { + const { getLocation } = await import('./get_location'); + return getLocation(params); + }; +} diff --git a/x-pack/plugins/observability_onboarding/public/locators/onboarding_locator/types.ts b/x-pack/plugins/observability_onboarding/public/locators/onboarding_locator/types.ts new file mode 100644 index 0000000000000..b8709f6af361d --- /dev/null +++ b/x-pack/plugins/observability_onboarding/public/locators/onboarding_locator/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; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import type { LocatorPublic } from '@kbn/share-plugin/public'; +import { SerializableRecord } from '@kbn/utility-types'; + +export interface ObservabilityOnboardingLocatorParams + extends SerializableRecord { + /** If given, it will load the given map else will load the create a new map page. */ + source?: 'customLogs' | 'systemLogs'; +} + +export type ObservabilityOnboardingLocator = + LocatorPublic; diff --git a/x-pack/plugins/observability_onboarding/public/plugin.ts b/x-pack/plugins/observability_onboarding/public/plugin.ts index 8769991169090..45fa8a640c02f 100644 --- a/x-pack/plugins/observability_onboarding/public/plugin.ts +++ b/x-pack/plugins/observability_onboarding/public/plugin.ts @@ -24,15 +24,20 @@ import { DataPublicPluginStart, } from '@kbn/data-plugin/public'; import type { DiscoverSetup } from '@kbn/discover-plugin/public'; +import { SharePluginSetup } from '@kbn/share-plugin/public'; import type { ObservabilityOnboardingConfig } from '../server'; +import { PLUGIN_ID } from '../common'; +import { ObservabilityOnboardingLocatorDefinition } from './locators/onboarding_locator/locator_definition'; +import { ObservabilityOnboardingPluginLocators } from './locators'; export type ObservabilityOnboardingPluginSetup = void; export type ObservabilityOnboardingPluginStart = void; export interface ObservabilityOnboardingPluginSetupDeps { data: DataPublicPluginSetup; - observability: ObservabilityPublicSetup; discover: DiscoverSetup; + observability: ObservabilityPublicSetup; + share: SharePluginSetup; } export interface ObservabilityOnboardingPluginStartDeps { @@ -48,6 +53,8 @@ export class ObservabilityOnboardingPlugin ObservabilityOnboardingPluginStart > { + private locators?: ObservabilityOnboardingPluginLocators; + constructor(private ctx: PluginInitializerContext) {} public setup( @@ -69,7 +76,7 @@ export class ObservabilityOnboardingPlugin navLinkStatus: isServerlessEnabled ? AppNavLinkStatus.visible : AppNavLinkStatus.hidden, - id: 'observabilityOnboarding', + id: PLUGIN_ID, title: 'Observability Onboarding', order: 8500, euiIconType: 'logoObservability', @@ -98,9 +105,23 @@ export class ObservabilityOnboardingPlugin }, }); } + + this.locators = { + onboarding: plugins.share.url.locators.create( + new ObservabilityOnboardingLocatorDefinition() + ), + }; + + return { + locators: this.locators, + }; } public start( core: CoreStart, plugins: ObservabilityOnboardingPluginStartDeps - ) {} + ) { + return { + locators: this.locators, + }; + } } diff --git a/x-pack/plugins/observability_onboarding/tsconfig.json b/x-pack/plugins/observability_onboarding/tsconfig.json index 2119563923cb9..d2b4d9a223a2b 100644 --- a/x-pack/plugins/observability_onboarding/tsconfig.json +++ b/x-pack/plugins/observability_onboarding/tsconfig.json @@ -33,6 +33,8 @@ "@kbn/data-views-plugin", "@kbn/es-query", "@kbn/use-tracked-promise", + "@kbn/share-plugin", + "@kbn/utility-types", ], "exclude": [ "target/**/*", From 630a95bc10ace25c4d2db09928e6dacb77267109 Mon Sep 17 00:00:00 2001 From: Tomasz Ciecierski Date: Wed, 6 Sep 2023 15:47:47 +0200 Subject: [PATCH 15/97] [Defend Workflows] Adjust headers in fleet api (#165823) --- .../pipelines/pull_request/pipeline.ts | 1 + x-pack/plugins/fleet/common/index.ts | 2 ++ .../details_page/hooks/use_agent_status.tsx | 3 +++ .../use_package_policies_with_agent_policy.ts | 3 +++ .../public/hooks/use_request/use_request.ts | 1 + .../scripts/create_agents/create_agents.ts | 2 ++ .../osquery/cypress/tasks/api_fixtures.ts | 6 ++++++ .../osquery/cypress/tasks/integrations.ts | 5 +++-- .../data_loaders/index_fleet_agent.ts | 3 ++- .../index_fleet_endpoint_policy.ts | 18 +++++++++++++++- .../data_loaders/setup_fleet_for_endpoint.ts | 14 ++++++++++++- .../common/endpoint/utils/package.ts | 3 ++- .../cypress/tasks/endpoint_policy.ts | 16 ++++++++++++-- .../public/management/cypress/tasks/fleet.ts | 13 ++++++++++++ .../policy/use_fetch_endpoint_policy.test.ts | 2 ++ .../hooks/policy/use_fetch_endpoint_policy.ts | 5 +++-- ...etch_endpoint_policy_agent_summary.test.ts | 3 ++- ...use_fetch_endpoint_policy_agent_summary.ts | 3 ++- .../policy/use_update_endpoint_policy.test.ts | 3 ++- .../policy/use_update_endpoint_policy.ts | 3 ++- .../policy_settings_layout.test.tsx | 3 ++- .../services/policies/ingest.test.ts | 11 +++++++--- .../management/services/policies/ingest.ts | 14 ++++++++++--- .../services/policies/policies.test.ts | 4 +++- .../management/services/policies/policies.ts | 3 ++- .../scripts/endpoint/common/fleet_services.ts | 17 +++++++++++++++ .../endpoint_agent_runner/fleet_server.ts | 21 ++++++++++++++++++- x-pack/test/osquery_cypress/utils.ts | 16 ++++++++++++-- 28 files changed, 172 insertions(+), 26 deletions(-) diff --git a/.buildkite/scripts/pipelines/pull_request/pipeline.ts b/.buildkite/scripts/pipelines/pull_request/pipeline.ts index 6fe1bb1b251e1..80d1312af6e64 100644 --- a/.buildkite/scripts/pipelines/pull_request/pipeline.ts +++ b/.buildkite/scripts/pipelines/pull_request/pipeline.ts @@ -141,6 +141,7 @@ const uploadPipeline = (pipelineContent: string | object) => { ) { pipeline.push(getPipeline('.buildkite/pipelines/pull_request/fleet_cypress.yml')); pipeline.push(getPipeline('.buildkite/pipelines/pull_request/defend_workflows.yml')); + pipeline.push(getPipeline('.buildkite/pipelines/pull_request/osquery_cypress.yml')); } if ( diff --git a/x-pack/plugins/fleet/common/index.ts b/x-pack/plugins/fleet/common/index.ts index df9ecae76bea5..9ac36d753c4e8 100644 --- a/x-pack/plugins/fleet/common/index.ts +++ b/x-pack/plugins/fleet/common/index.ts @@ -59,6 +59,8 @@ export { // dashboards ids DASHBOARD_LOCATORS_IDS, FLEET_ENROLLMENT_API_PREFIX, + API_VERSIONS, + APP_API_ROUTES, } from './constants'; export { // Route services diff --git a/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/details_page/hooks/use_agent_status.tsx b/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/details_page/hooks/use_agent_status.tsx index 4a92e44436fcd..c31140aca3a96 100644 --- a/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/details_page/hooks/use_agent_status.tsx +++ b/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/details_page/hooks/use_agent_status.tsx @@ -7,6 +7,8 @@ import React from 'react'; +import { API_VERSIONS } from '../../../../../../../common/constants'; + import type { UseRequestConfig } from '../../../../hooks'; import { useRequest } from '../../../../hooks'; import type { GetAgentStatusResponse } from '../../../../types'; @@ -21,6 +23,7 @@ export function useGetAgentStatus(policyId?: string, options?: RequestOptions) { policyId, }, method: 'get', + version: API_VERSIONS.public.v1, ...options, }); diff --git a/x-pack/plugins/fleet/public/applications/integrations/sections/epm/screens/detail/policies/use_package_policies_with_agent_policy.ts b/x-pack/plugins/fleet/public/applications/integrations/sections/epm/screens/detail/policies/use_package_policies_with_agent_policy.ts index 399016ebf2042..a7ecbf95d25c1 100644 --- a/x-pack/plugins/fleet/public/applications/integrations/sections/epm/screens/detail/policies/use_package_policies_with_agent_policy.ts +++ b/x-pack/plugins/fleet/public/applications/integrations/sections/epm/screens/detail/policies/use_package_policies_with_agent_policy.ts @@ -7,6 +7,8 @@ import { useEffect, useMemo, useState } from 'react'; +import { API_VERSIONS } from '../../../../../../../../common/constants'; + import type { PackagePolicy, GetAgentPoliciesResponse, @@ -75,6 +77,7 @@ export const usePackagePoliciesWithAgentPolicy = ( full: true, ignoreMissing: true, }, + version: API_VERSIONS.public.v1, shouldSendRequest: agentPoliciesIds.length > 0, } as SendConditionalRequestConfig); diff --git a/x-pack/plugins/fleet/public/hooks/use_request/use_request.ts b/x-pack/plugins/fleet/public/hooks/use_request/use_request.ts index 9bd7d482e7e4a..69bf82061d89c 100644 --- a/x-pack/plugins/fleet/public/hooks/use_request/use_request.ts +++ b/x-pack/plugins/fleet/public/hooks/use_request/use_request.ts @@ -109,6 +109,7 @@ export const useConditionalRequest = ( path: config.path, query: config.query, body: config.body, + version: config.version, }); if (res.error) { throw res.error; diff --git a/x-pack/plugins/fleet/scripts/create_agents/create_agents.ts b/x-pack/plugins/fleet/scripts/create_agents/create_agents.ts index 206d30cabbb79..52723d0450351 100644 --- a/x-pack/plugins/fleet/scripts/create_agents/create_agents.ts +++ b/x-pack/plugins/fleet/scripts/create_agents/create_agents.ts @@ -201,6 +201,7 @@ async function getAgentPolicy(id: string) { 'Content-Type': 'application/json', 'kbn-xsrf': 'kibana', 'x-elastic-product-origin': 'fleet', + 'Elastic-Api-Version': PUBLIC_VERSION_V1, }, }); const data = await res.json(); @@ -346,6 +347,7 @@ async function bumpAgentPolicyRevision(id: string, policy: any) { 'Content-Type': 'application/json', 'kbn-xsrf': 'kibana', 'x-elastic-product-origin': 'fleet', + 'Elastic-Api-Version': PUBLIC_VERSION_V1, }, }); diff --git a/x-pack/plugins/osquery/cypress/tasks/api_fixtures.ts b/x-pack/plugins/osquery/cypress/tasks/api_fixtures.ts index 9a139eadf9adf..d7b9f7d43ce43 100644 --- a/x-pack/plugins/osquery/cypress/tasks/api_fixtures.ts +++ b/x-pack/plugins/osquery/cypress/tasks/api_fixtures.ts @@ -294,6 +294,9 @@ export const loadAgentPolicy = () => monitoring_enabled: ['logs', 'metrics'], inactivity_timeout: 1209600, }, + headers: { + 'Elastic-Api-Version': API_VERSIONS.public.v1, + }, url: '/api/fleet/agent_policies', }).then((response) => response.body.item); @@ -301,5 +304,8 @@ export const cleanupAgentPolicy = (agentPolicyId: string) => request({ method: 'POST', body: { agentPolicyId }, + headers: { + 'Elastic-Api-Version': API_VERSIONS.public.v1, + }, url: '/api/fleet/agent_policies/delete', }); diff --git a/x-pack/plugins/osquery/cypress/tasks/integrations.ts b/x-pack/plugins/osquery/cypress/tasks/integrations.ts index 09948eca70538..c8bb688dac0f5 100644 --- a/x-pack/plugins/osquery/cypress/tasks/integrations.ts +++ b/x-pack/plugins/osquery/cypress/tasks/integrations.ts @@ -5,6 +5,7 @@ * 2.0. */ +import { API_VERSIONS } from '../../common/constants'; import { DEFAULT_POLICY } from '../screens/fleet'; import { ADD_POLICY_BTN, @@ -125,7 +126,7 @@ export const deleteIntegrations = async (integrationName: string) => { .then(() => { cy.request({ url: `/api/fleet/package_policies/delete`, - headers: { 'kbn-xsrf': 'cypress' }, + headers: { 'kbn-xsrf': 'cypress', 'Elastic-Api-Version': API_VERSIONS.public.v1 }, body: `{ "packagePolicyIds": ${JSON.stringify(ids)} }`, method: 'POST', }); @@ -135,7 +136,7 @@ export const deleteIntegrations = async (integrationName: string) => { export const installPackageWithVersion = (integration: string, version: string) => { cy.request({ url: `/api/fleet/epm/packages/${integration}-${version}`, - headers: { 'kbn-xsrf': 'cypress' }, + headers: { 'kbn-xsrf': 'cypress', 'Elastic-Api-Version': API_VERSIONS.public.v1 }, body: '{ "force": true }', method: 'POST', }); 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 0b988d831c923..781d6243384e9 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 @@ -10,7 +10,7 @@ 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 } from '@kbn/fleet-plugin/common'; +import { AGENT_API_ROUTES, API_VERSIONS } from '@kbn/fleet-plugin/common'; import type { HostMetadata } from '../types'; import { FleetAgentGenerator } from '../data_generators/fleet_agent_generator'; import { wrapErrorAndRejectPromise } from './utils'; @@ -90,6 +90,7 @@ const fetchFleetAgent = async (kbnClient: KbnClient, agentId: string): Promise ).data.item; 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 0730eba99306c..fda862d247bae 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 @@ -16,7 +16,11 @@ import type { DeleteAgentPolicyResponse, PostDeletePackagePoliciesResponse, } from '@kbn/fleet-plugin/common'; -import { AGENT_POLICY_API_ROUTES, PACKAGE_POLICY_API_ROUTES } from '@kbn/fleet-plugin/common'; +import { + AGENT_POLICY_API_ROUTES, + PACKAGE_POLICY_API_ROUTES, + API_VERSIONS, +} from '@kbn/fleet-plugin/common'; import { memoize } from 'lodash'; import { getEndpointPackageInfo } from '../utils/package'; import type { PolicyData } from '../types'; @@ -61,6 +65,9 @@ export const indexFleetEndpointPolicy = async ( agentPolicy = (await kbnClient .request({ path: AGENT_POLICY_API_ROUTES.CREATE_PATTERN, + headers: { + 'elastic-api-version': API_VERSIONS.public.v1, + }, method: 'POST', body: newAgentPolicyData, }) @@ -101,6 +108,9 @@ export const indexFleetEndpointPolicy = async ( path: PACKAGE_POLICY_API_ROUTES.CREATE_PATTERN, method: 'POST', body: newPackagePolicyData, + headers: { + 'elastic-api-version': API_VERSIONS.public.v1, + }, }) .catch(wrapErrorAndRejectPromise)) as AxiosResponse; @@ -135,6 +145,9 @@ export const deleteIndexedFleetEndpointPolicies = async ( (await kbnClient .request({ path: PACKAGE_POLICY_API_ROUTES.DELETE_PATTERN, + headers: { + 'elastic-api-version': API_VERSIONS.public.v1, + }, method: 'POST', body: { packagePolicyIds: indexData.integrationPolicies.map((policy) => policy.id), @@ -153,6 +166,9 @@ export const deleteIndexedFleetEndpointPolicies = async ( (await kbnClient .request({ path: AGENT_POLICY_API_ROUTES.DELETE_PATTERN, + headers: { + 'elastic-api-version': API_VERSIONS.public.v1, + }, method: 'POST', body: { agentPolicyId: agentPolicy.id, 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 177dccce73714..6c84cd6e5738f 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 @@ -13,7 +13,12 @@ import type { IBulkInstallPackageHTTPError, PostFleetSetupResponse, } from '@kbn/fleet-plugin/common'; -import { AGENTS_SETUP_API_ROUTES, EPM_API_ROUTES, SETUP_API_ROUTE } from '@kbn/fleet-plugin/common'; +import { + AGENTS_SETUP_API_ROUTES, + EPM_API_ROUTES, + SETUP_API_ROUTE, + API_VERSIONS, +} from '@kbn/fleet-plugin/common'; import { ToolingLog } from '@kbn/tooling-log'; import { UsageTracker } from './usage_tracker'; import { EndpointDataLoadingError, retryOnError, wrapErrorAndRejectPromise } from './utils'; @@ -43,6 +48,7 @@ export const setupFleetForEndpoint = async ( const setupResponse = (await kbnClient .request({ path: SETUP_API_ROUTE, + headers: { 'Elastic-Api-Version': API_VERSIONS.public.v1 }, method: 'POST', }) .catch(wrapErrorAndRejectPromise)) as AxiosResponse; @@ -64,6 +70,9 @@ export const setupFleetForEndpoint = async ( .request({ path: AGENTS_SETUP_API_ROUTES.CREATE_PATTERN, method: 'POST', + headers: { + 'elastic-api-version': API_VERSIONS.public.v1, + }, }) .catch(wrapErrorAndRejectPromise)) as AxiosResponse; @@ -118,6 +127,9 @@ export const installOrUpgradeEndpointFleetPackage = async ( query: { prerelease: true, }, + headers: { + 'elastic-api-version': API_VERSIONS.public.v1, + }, }) .catch(wrapErrorAndRejectPromise)) as AxiosResponse; 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 c45c44fa9c561..599fcabe24c9c 100644 --- a/x-pack/plugins/security_solution/common/endpoint/utils/package.ts +++ b/x-pack/plugins/security_solution/common/endpoint/utils/package.ts @@ -9,7 +9,7 @@ import type { AxiosResponse } from 'axios'; import type { KbnClient } from '@kbn/test'; import type { GetInfoResponse } from '@kbn/fleet-plugin/common'; -import { epmRouteService } from '@kbn/fleet-plugin/common'; +import { API_VERSIONS, epmRouteService } from '@kbn/fleet-plugin/common'; export const getEndpointPackageInfo = async ( kbnClient: KbnClient @@ -18,6 +18,7 @@ export const getEndpointPackageInfo = async ( const endpointPackage = ( (await kbnClient.request({ path, + headers: { 'Elastic-Api-Version': API_VERSIONS.public.v1 }, method: 'GET', })) as AxiosResponse ).data.item; diff --git a/x-pack/plugins/security_solution/public/management/cypress/tasks/endpoint_policy.ts b/x-pack/plugins/security_solution/public/management/cypress/tasks/endpoint_policy.ts index 9353cdf9ed822..a1b5972758742 100644 --- a/x-pack/plugins/security_solution/public/management/cypress/tasks/endpoint_policy.ts +++ b/x-pack/plugins/security_solution/public/management/cypress/tasks/endpoint_policy.ts @@ -10,7 +10,7 @@ import type { UpdatePackagePolicy, UpdatePackagePolicyResponse, } from '@kbn/fleet-plugin/common'; -import { packagePolicyRouteService } from '@kbn/fleet-plugin/common'; +import { packagePolicyRouteService, API_VERSIONS } from '@kbn/fleet-plugin/common'; import { request } from './common'; import { ProtectionModes } from '../../../../common/endpoint/types'; @@ -24,6 +24,9 @@ export const enableAllPolicyProtections = ( return request({ method: 'GET', url: packagePolicyRouteService.getInfoPath(endpointPolicyId), + headers: { + 'elastic-api-version': API_VERSIONS.public.v1, + }, }).then(({ body: { item: endpointPolicy } }) => { const { created_by: _createdBy, @@ -58,6 +61,9 @@ export const enableAllPolicyProtections = ( method: 'PUT', url: packagePolicyRouteService.getUpdatePath(endpointPolicyId), body: updatedEndpointPolicy, + headers: { + 'elastic-api-version': API_VERSIONS.public.v1, + }, }); }); }; @@ -69,6 +75,9 @@ export const setCustomProtectionUpdatesManifestVersion = ( return request({ method: 'GET', url: packagePolicyRouteService.getInfoPath(endpointPolicyId), + headers: { + 'elastic-api-version': API_VERSIONS.public.v1, + }, }).then(({ body: { item: endpointPolicy } }) => { const { created_by: _createdBy, @@ -91,6 +100,9 @@ export const setCustomProtectionUpdatesManifestVersion = ( method: 'PUT', url: packagePolicyRouteService.getUpdatePath(endpointPolicyId), body: updatedEndpointPolicy, + headers: { + 'elastic-api-version': API_VERSIONS.public.v1, + }, }); }); }; @@ -103,6 +115,6 @@ export const setCustomProtectionUpdatesNote = ( method: 'POST', url: `/api/endpoint/protection_updates_note/${endpointPolicyId}`, body: { note }, - headers: { 'Elastic-Api-Version': '2023-10-31' }, + headers: { 'Elastic-Api-Version': API_VERSIONS.public.v1 }, }); }; diff --git a/x-pack/plugins/security_solution/public/management/cypress/tasks/fleet.ts b/x-pack/plugins/security_solution/public/management/cypress/tasks/fleet.ts index 775baa7409f0a..bd6edbea158ce 100644 --- a/x-pack/plugins/security_solution/public/management/cypress/tasks/fleet.ts +++ b/x-pack/plugins/security_solution/public/management/cypress/tasks/fleet.ts @@ -15,6 +15,7 @@ import { agentRouteService, epmRouteService, packagePolicyRouteService, + API_VERSIONS, } from '@kbn/fleet-plugin/common'; import type { PutAgentReassignResponse } from '@kbn/fleet-plugin/common/types'; import type { IndexedFleetEndpointPolicyResponse } from '../../../../common/endpoint/data_loaders/index_fleet_endpoint_policy'; @@ -24,6 +25,9 @@ export const getEndpointIntegrationVersion = (): Cypress.Chainable => request({ url: epmRouteService.getInfoPath('endpoint'), method: 'GET', + headers: { + 'elastic-api-version': API_VERSIONS.public.v1, + }, }).then((response) => response.body.item.version); export const getAgentByHostName = (hostname: string): Cypress.Chainable => @@ -33,6 +37,9 @@ export const getAgentByHostName = (hostname: string): Cypress.Chainable = qs: { kuery: `local_metadata.host.hostname: "${hostname}"`, }, + headers: { + 'elastic-api-version': API_VERSIONS.public.v1, + }, }).then((response) => response.body.items[0]); export const reassignAgentPolicy = ( @@ -45,6 +52,9 @@ export const reassignAgentPolicy = ( body: { policy_id: agentPolicyId, }, + headers: { + 'elastic-api-version': API_VERSIONS.public.v1, + }, }); export const yieldEndpointPolicyRevision = (): Cypress.Chainable => @@ -54,6 +64,9 @@ export const yieldEndpointPolicyRevision = (): Cypress.Chainable => qs: { kuery: 'ingest-package-policies.package.name: endpoint', }, + headers: { + 'elastic-api-version': API_VERSIONS.public.v1, + }, }).then(({ body }) => { return body.items?.[0]?.revision ?? -1; }); diff --git a/x-pack/plugins/security_solution/public/management/hooks/policy/use_fetch_endpoint_policy.test.ts b/x-pack/plugins/security_solution/public/management/hooks/policy/use_fetch_endpoint_policy.test.ts index 78cb1282f94a8..85647202a755c 100644 --- a/x-pack/plugins/security_solution/public/management/hooks/policy/use_fetch_endpoint_policy.test.ts +++ b/x-pack/plugins/security_solution/public/management/hooks/policy/use_fetch_endpoint_policy.test.ts @@ -17,6 +17,7 @@ import { DefaultPolicyRuleNotificationMessage, } from '../../../../common/endpoint/models/policy_config'; import { set } from 'lodash'; +import { API_VERSIONS } from '@kbn/fleet-plugin/common'; const useQueryMock = _useQuery as jest.Mock; @@ -60,6 +61,7 @@ describe('When using the `useGetFileInfo()` hook', () => { expect(apiMocks.responseProvider.endpointPackagePolicy).toHaveBeenCalledWith({ path: `/api/fleet/package_policies/${policy.id}`, + version: API_VERSIONS.public.v1, }); }); diff --git a/x-pack/plugins/security_solution/public/management/hooks/policy/use_fetch_endpoint_policy.ts b/x-pack/plugins/security_solution/public/management/hooks/policy/use_fetch_endpoint_policy.ts index 35d8a0f2ea255..bb8033ae012bb 100644 --- a/x-pack/plugins/security_solution/public/management/hooks/policy/use_fetch_endpoint_policy.ts +++ b/x-pack/plugins/security_solution/public/management/hooks/policy/use_fetch_endpoint_policy.ts @@ -8,7 +8,7 @@ import type { UseQueryOptions, UseQueryResult } from '@tanstack/react-query'; import type { IHttpFetchError } from '@kbn/core-http-browser'; import { useQuery } from '@tanstack/react-query'; -import { packagePolicyRouteService } from '@kbn/fleet-plugin/common'; +import { packagePolicyRouteService, API_VERSIONS } from '@kbn/fleet-plugin/common'; import { DefaultPolicyNotificationMessage, DefaultPolicyRuleNotificationMessage, @@ -45,7 +45,8 @@ export const useFetchEndpointPolicy = ( ...options, queryFn: async () => { const apiResponse = await http.get( - packagePolicyRouteService.getInfoPath(policyId) + packagePolicyRouteService.getInfoPath(policyId), + { version: API_VERSIONS.public.v1 } ); applyDefaultsToPolicyIfNeeded(apiResponse.item); diff --git a/x-pack/plugins/security_solution/public/management/hooks/policy/use_fetch_endpoint_policy_agent_summary.test.ts b/x-pack/plugins/security_solution/public/management/hooks/policy/use_fetch_endpoint_policy_agent_summary.test.ts index 0513fee664dc1..80fd6d41dfd6e 100644 --- a/x-pack/plugins/security_solution/public/management/hooks/policy/use_fetch_endpoint_policy_agent_summary.test.ts +++ b/x-pack/plugins/security_solution/public/management/hooks/policy/use_fetch_endpoint_policy_agent_summary.test.ts @@ -12,7 +12,7 @@ import type { PolicyData } from '../../../../common/endpoint/types'; import { allFleetHttpMocks } from '../../mocks'; import { FleetPackagePolicyGenerator } from '../../../../common/endpoint/data_generators/fleet_package_policy_generator'; import { useFetchAgentByAgentPolicySummary } from './use_fetch_endpoint_policy_agent_summary'; -import { agentRouteService } from '@kbn/fleet-plugin/common'; +import { agentRouteService, API_VERSIONS } from '@kbn/fleet-plugin/common'; const useQueryMock = _useQuery as jest.Mock; @@ -57,6 +57,7 @@ describe('When using the `useFetchEndpointPolicyAgentSummary()` hook', () => { expect(apiMocks.responseProvider.agentStatus).toHaveBeenCalledWith({ path: agentRouteService.getStatusPath(), query: { policyId: policy.policy_id }, + version: API_VERSIONS.public.v1, }); expect(data).toEqual({ total: 50, diff --git a/x-pack/plugins/security_solution/public/management/hooks/policy/use_fetch_endpoint_policy_agent_summary.ts b/x-pack/plugins/security_solution/public/management/hooks/policy/use_fetch_endpoint_policy_agent_summary.ts index cbe69a321d1f5..82cebb6263f96 100644 --- a/x-pack/plugins/security_solution/public/management/hooks/policy/use_fetch_endpoint_policy_agent_summary.ts +++ b/x-pack/plugins/security_solution/public/management/hooks/policy/use_fetch_endpoint_policy_agent_summary.ts @@ -9,7 +9,7 @@ import type { UseQueryOptions, UseQueryResult } from '@tanstack/react-query'; import type { IHttpFetchError } from '@kbn/core-http-browser'; import type { GetAgentStatusResponse } from '@kbn/fleet-plugin/common'; import { useQuery } from '@tanstack/react-query'; -import { agentRouteService } from '@kbn/fleet-plugin/common'; +import { agentRouteService, API_VERSIONS } from '@kbn/fleet-plugin/common'; import { useHttp } from '../../../common/lib/kibana'; type EndpointPolicyAgentSummary = GetAgentStatusResponse['results']; @@ -30,6 +30,7 @@ export const useFetchAgentByAgentPolicySummary = ( return ( await http.get(agentRouteService.getStatusPath(), { query: { policyId: agentPolicyId }, + version: API_VERSIONS.public.v1, }) ).results; }, diff --git a/x-pack/plugins/security_solution/public/management/hooks/policy/use_update_endpoint_policy.test.ts b/x-pack/plugins/security_solution/public/management/hooks/policy/use_update_endpoint_policy.test.ts index 1f9dc8e300f05..8b6be08b41b46 100644 --- a/x-pack/plugins/security_solution/public/management/hooks/policy/use_update_endpoint_policy.test.ts +++ b/x-pack/plugins/security_solution/public/management/hooks/policy/use_update_endpoint_policy.test.ts @@ -17,7 +17,7 @@ import type { RenderHookResult } from '@testing-library/react-hooks/src/types'; import { useUpdateEndpointPolicy } from './use_update_endpoint_policy'; import type { PolicyData } from '../../../../common/endpoint/types'; import { FleetPackagePolicyGenerator } from '../../../../common/endpoint/data_generators/fleet_package_policy_generator'; -import { packagePolicyRouteService } from '@kbn/fleet-plugin/common'; +import { API_VERSIONS, packagePolicyRouteService } from '@kbn/fleet-plugin/common'; import { getPolicyDataForUpdate } from '../../../../common/endpoint/service/policy'; const useMutationMock = _useMutation as jest.Mock; @@ -64,6 +64,7 @@ describe('When using the `useFetchEndpointPolicyAgentSummary()` hook', () => { expect(apiMocks.responseProvider.updateEndpointPolicy).toHaveBeenCalledWith({ path: packagePolicyRouteService.getUpdatePath(policy.id), body: JSON.stringify(getPolicyDataForUpdate(policy)), + version: API_VERSIONS.public.v1, }); expect(result).toEqual({ item: expect.any(Object) }); diff --git a/x-pack/plugins/security_solution/public/management/hooks/policy/use_update_endpoint_policy.ts b/x-pack/plugins/security_solution/public/management/hooks/policy/use_update_endpoint_policy.ts index 2e7f8b83ac19b..5e078ad563481 100644 --- a/x-pack/plugins/security_solution/public/management/hooks/policy/use_update_endpoint_policy.ts +++ b/x-pack/plugins/security_solution/public/management/hooks/policy/use_update_endpoint_policy.ts @@ -8,7 +8,7 @@ import type { UseMutationOptions, UseMutationResult } from '@tanstack/react-query'; import type { IHttpFetchError } from '@kbn/core-http-browser'; import { useMutation } from '@tanstack/react-query'; -import { packagePolicyRouteService } from '@kbn/fleet-plugin/common'; +import { packagePolicyRouteService, API_VERSIONS } from '@kbn/fleet-plugin/common'; import { getPolicyDataForUpdate } from '../../../../common/endpoint/service/policy'; import { useHttp } from '../../../common/lib/kibana'; import type { PolicyData } from '../../../../common/endpoint/types'; @@ -39,6 +39,7 @@ export const useUpdateEndpointPolicy = ( return http.put(packagePolicyRouteService.getUpdatePath(policy.id), { body: JSON.stringify(update), + version: API_VERSIONS.public.v1, }); }, options); }; diff --git a/x-pack/plugins/security_solution/public/management/pages/policy/view/policy_settings_layout/policy_settings_layout.test.tsx b/x-pack/plugins/security_solution/public/management/pages/policy/view/policy_settings_layout/policy_settings_layout.test.tsx index 64188ce296c6e..0c5a98281eec6 100644 --- a/x-pack/plugins/security_solution/public/management/pages/policy/view/policy_settings_layout/policy_settings_layout.test.tsx +++ b/x-pack/plugins/security_solution/public/management/pages/policy/view/policy_settings_layout/policy_settings_layout.test.tsx @@ -20,7 +20,7 @@ import { expectIsViewOnly, getPolicySettingsFormTestSubjects } from '../policy_s import { cloneDeep, set } from 'lodash'; import { ProtectionModes } from '../../../../../../common/endpoint/types'; import { waitFor, cleanup } from '@testing-library/react'; -import { packagePolicyRouteService } from '@kbn/fleet-plugin/common'; +import { packagePolicyRouteService, API_VERSIONS } from '@kbn/fleet-plugin/common'; import { getPolicyDataForUpdate } from '../../../../../../common/endpoint/service/policy'; import { getDeferred } from '../../../../mocks/utils'; @@ -133,6 +133,7 @@ describe('When rendering PolicySettingsLayout', () => { expect(apiMocks.responseProvider.updateEndpointPolicy).toHaveBeenCalledWith({ path: packagePolicyRouteService.getUpdatePath(policyData.id), body: JSON.stringify(getPolicyDataForUpdate(expectedUpdatedPolicy)), + version: API_VERSIONS.public.v1, }); }); diff --git a/x-pack/plugins/security_solution/public/management/services/policies/ingest.test.ts b/x-pack/plugins/security_solution/public/management/services/policies/ingest.test.ts index a3644ce691478..d498f32bb1cab 100644 --- a/x-pack/plugins/security_solution/public/management/services/policies/ingest.test.ts +++ b/x-pack/plugins/security_solution/public/management/services/policies/ingest.test.ts @@ -7,7 +7,7 @@ import { sendGetPackagePolicy, sendGetEndpointSecurityPackage } from './ingest'; import { httpServiceMock } from '@kbn/core/public/mocks'; -import { PACKAGE_POLICY_API_ROOT, epmRouteService } from '@kbn/fleet-plugin/common'; +import { PACKAGE_POLICY_API_ROOT, epmRouteService, API_VERSIONS } from '@kbn/fleet-plugin/common'; import { policyListApiPathHandlers } from '../../pages/policy/store/test_mock_utils'; describe('ingest service', () => { @@ -20,7 +20,9 @@ describe('ingest service', () => { describe('sendGetPackagePolicy()', () => { it('builds correct API path', async () => { await sendGetPackagePolicy(http, '123'); - expect(http.get).toHaveBeenCalledWith(`${PACKAGE_POLICY_API_ROOT}/123`, undefined); + expect(http.get).toHaveBeenCalledWith(`${PACKAGE_POLICY_API_ROOT}/123`, { + version: API_VERSIONS.public.v1, + }); }); it('supports http options', async () => { await sendGetPackagePolicy(http, '123', { query: { page: 1 } }); @@ -28,6 +30,7 @@ describe('ingest service', () => { query: { page: 1, }, + version: API_VERSIONS.public.v1, }); }); }); @@ -37,7 +40,9 @@ describe('ingest service', () => { const path = epmRouteService.getInfoPath('endpoint'); http.get.mockReturnValue(Promise.resolve(policyListApiPathHandlers()[path]())); await sendGetEndpointSecurityPackage(http); - expect(http.get).toHaveBeenCalledWith(path); + expect(http.get).toHaveBeenCalledWith(path, { + version: API_VERSIONS.public.v1, + }); }); it('should throw if package is not found', async () => { diff --git a/x-pack/plugins/security_solution/public/management/services/policies/ingest.ts b/x-pack/plugins/security_solution/public/management/services/policies/ingest.ts index e5347449d4dbe..4a2690a112e24 100644 --- a/x-pack/plugins/security_solution/public/management/services/policies/ingest.ts +++ b/x-pack/plugins/security_solution/public/management/services/policies/ingest.ts @@ -11,7 +11,7 @@ import type { GetPackagePoliciesResponse, GetInfoResponse, } from '@kbn/fleet-plugin/common'; -import { epmRouteService } from '@kbn/fleet-plugin/common'; +import { epmRouteService, API_VERSIONS } from '@kbn/fleet-plugin/common'; import type { NewPolicyData } from '../../../../common/endpoint/types'; import type { GetPolicyResponse, UpdatePolicyResponse } from '../../pages/policy/types'; @@ -34,7 +34,10 @@ export const sendGetPackagePolicy = ( packagePolicyId: string, options?: HttpFetchOptions ) => { - return http.get(`${INGEST_API_PACKAGE_POLICIES}/${packagePolicyId}`, options); + return http.get(`${INGEST_API_PACKAGE_POLICIES}/${packagePolicyId}`, { + ...options, + version: API_VERSIONS.public.v1, + }); }; /** @@ -50,6 +53,7 @@ export const sendBulkGetPackagePolicies = ( ) => { return http.post(`${INGEST_API_PACKAGE_POLICIES}/_bulk_get`, { ...options, + version: API_VERSIONS.public.v1, body: JSON.stringify({ ids: packagePolicyIds, ignoreMissing: true, @@ -73,6 +77,7 @@ export const sendPutPackagePolicy = ( ): Promise => { return http.put(`${INGEST_API_PACKAGE_POLICIES}/${packagePolicyId}`, { ...options, + version: API_VERSIONS.public.v1, body: JSON.stringify(packagePolicy), }); }; @@ -92,6 +97,7 @@ export const sendGetFleetAgentStatusForPolicy = ( ): Promise => { return http.get(INGEST_API_FLEET_AGENT_STATUS, { ...options, + version: API_VERSIONS.public.v1, query: { policyId, }, @@ -105,7 +111,9 @@ export const sendGetEndpointSecurityPackage = async ( http: HttpStart ): Promise => { const path = epmRouteService.getInfoPath('endpoint'); - const endpointPackageResponse = await http.get(path); + const endpointPackageResponse = await http.get(path, { + version: API_VERSIONS.public.v1, + }); const endpointPackageInfo = endpointPackageResponse.item; if (!endpointPackageInfo) { throw new Error('Endpoint package was not found.'); diff --git a/x-pack/plugins/security_solution/public/management/services/policies/policies.test.ts b/x-pack/plugins/security_solution/public/management/services/policies/policies.test.ts index 86715ebff3f75..a523f94d489c5 100644 --- a/x-pack/plugins/security_solution/public/management/services/policies/policies.test.ts +++ b/x-pack/plugins/security_solution/public/management/services/policies/policies.test.ts @@ -7,7 +7,7 @@ import { httpServiceMock } from '@kbn/core/public/mocks'; import { PACKAGE_POLICY_SAVED_OBJECT_TYPE } from '@kbn/fleet-plugin/common'; -import { PACKAGE_POLICY_API_ROUTES } from '@kbn/fleet-plugin/common/constants/routes'; +import { API_VERSIONS, PACKAGE_POLICY_API_ROUTES } from '@kbn/fleet-plugin/common/constants'; import { sendGetEndpointSpecificPackagePolicies } from './policies'; describe('ingest service', () => { @@ -24,6 +24,7 @@ describe('ingest service', () => { query: { kuery: `${PACKAGE_POLICY_SAVED_OBJECT_TYPE}.package.name: endpoint`, }, + version: API_VERSIONS.public.v1, }); }); it('supports additional KQL to be defined on input for query params', async () => { @@ -36,6 +37,7 @@ describe('ingest service', () => { perPage: 10, page: 1, }, + version: API_VERSIONS.public.v1, }); }); }); diff --git a/x-pack/plugins/security_solution/public/management/services/policies/policies.ts b/x-pack/plugins/security_solution/public/management/services/policies/policies.ts index de700e20e8c40..a7a45f832b56d 100644 --- a/x-pack/plugins/security_solution/public/management/services/policies/policies.ts +++ b/x-pack/plugins/security_solution/public/management/services/policies/policies.ts @@ -7,7 +7,7 @@ import type { HttpFetchOptions, HttpStart } from '@kbn/core/public'; import type { GetPackagePoliciesRequest } from '@kbn/fleet-plugin/common'; -import { PACKAGE_POLICY_SAVED_OBJECT_TYPE } from '@kbn/fleet-plugin/common'; +import { PACKAGE_POLICY_SAVED_OBJECT_TYPE, API_VERSIONS } from '@kbn/fleet-plugin/common'; import type { GetPolicyListResponse } from '../../pages/policy/types'; import { INGEST_API_PACKAGE_POLICIES } from './ingest'; @@ -29,5 +29,6 @@ export const sendGetEndpointSpecificPackagePolicies = ( options?.query?.kuery ? `${options.query.kuery} and ` : '' }${PACKAGE_POLICY_SAVED_OBJECT_TYPE}.package.name: endpoint`, }, + version: API_VERSIONS.public.v1, }); }; 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 0eca2cbf03501..95f000fd00355 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 @@ -19,6 +19,7 @@ import { agentPolicyRouteService, agentRouteService, AGENTS_INDEX, + API_VERSIONS, } from '@kbn/fleet-plugin/common'; import { ToolingLog } from '@kbn/tooling-log'; import type { KbnClient } from '@kbn/test'; @@ -106,6 +107,9 @@ export const fetchFleetAgents = async ( .request({ method: 'GET', path: AGENT_API_ROUTES.LIST_PATTERN, + headers: { + 'elastic-api-version': API_VERSIONS.public.v1, + }, query: options, }) .catch(catchAxiosErrorFormatAndThrow) @@ -160,6 +164,9 @@ export const fetchFleetServerUrl = async (kbnClient: KbnClient): Promise({ method: 'GET', path: fleetServerHostsRoutesService.getListPath(), + headers: { + 'elastic-api-version': API_VERSIONS.public.v1, + }, query: { perPage: 100, }, @@ -197,6 +204,9 @@ export const fetchAgentPolicyEnrollmentKey = async ( .request({ method: 'GET', path: enrollmentAPIKeyRouteService.getListPath(), + headers: { + 'elastic-api-version': API_VERSIONS.public.v1, + }, query: { kuery: `policy_id: "${agentPolicyId}"` }, }) .catch(catchAxiosErrorFormatAndThrow) @@ -222,6 +232,9 @@ export const fetchAgentPolicyList = async ( .request({ method: 'GET', path: agentPolicyRouteService.getListPath(), + headers: { + 'elastic-api-version': API_VERSIONS.public.v1, + }, query: options, }) .catch(catchAxiosErrorFormatAndThrow) @@ -323,6 +336,7 @@ export const getAgentDownloadUrl = async ( * Given a stack version number, function will return the closest Agent download version available * for download. THis could be the actual version passed in or lower. * @param version + * @param log */ export const getLatestAgentDownloadVersion = async ( version: string, @@ -386,6 +400,9 @@ export const unEnrollFleetAgent = async ( method: 'POST', path: agentRouteService.getUnenrollPath(agentId), body: { revoke: force }, + headers: { + 'elastic-api-version': API_VERSIONS.public.v1, + }, }) .catch(catchAxiosErrorFormatAndThrow); diff --git a/x-pack/plugins/security_solution/scripts/endpoint/endpoint_agent_runner/fleet_server.ts b/x-pack/plugins/security_solution/scripts/endpoint/endpoint_agent_runner/fleet_server.ts index f9d88382d81c7..60471c5c46864 100644 --- a/x-pack/plugins/security_solution/scripts/endpoint/endpoint_agent_runner/fleet_server.ts +++ b/x-pack/plugins/security_solution/scripts/endpoint/endpoint_agent_runner/fleet_server.ts @@ -17,8 +17,9 @@ import { FLEET_SERVER_PACKAGE, PACKAGE_POLICY_API_ROUTES, PACKAGE_POLICY_SAVED_OBJECT_TYPE, + API_VERSIONS, + APP_API_ROUTES, } from '@kbn/fleet-plugin/common'; -import { APP_API_ROUTES } from '@kbn/fleet-plugin/common/constants'; import type { FleetServerHost, GenerateServiceTokenResponse, @@ -87,6 +88,9 @@ const getFleetServerPackagePolicy = async (): Promise .request({ method: 'GET', path: PACKAGE_POLICY_API_ROUTES.LIST_PATTERN, + headers: { + 'elastic-api-version': API_VERSIONS.public.v1, + }, query: { perPage: 1, kuery: `${PACKAGE_POLICY_SAVED_OBJECT_TYPE}.package.name: "${FLEET_SERVER_PACKAGE}"`, @@ -121,6 +125,9 @@ const getOrCreateFleetServerAgentPolicyId = async (): Promise => { .request({ method: 'POST', path: AGENT_POLICY_API_ROUTES.CREATE_PATTERN, + headers: { + 'elastic-api-version': API_VERSIONS.public.v1, + }, body: { name: `Fleet Server policy (${Math.random().toString(32).substring(2)})`, description: `Created by CLI Tool via: ${__filename}`, @@ -150,6 +157,9 @@ const generateFleetServiceToken = async (): Promise => { .request({ method: 'POST', path: APP_API_ROUTES.GENERATE_SERVICE_TOKEN_PATTERN, + headers: { + 'elastic-api-version': API_VERSIONS.public.v1, + }, body: {}, }) .then((response) => response.data.value); @@ -279,6 +289,9 @@ const configureFleetIfNeeded = async () => { const fleetOutputs = await kbnClient .request({ method: 'GET', + headers: { + 'elastic-api-version': API_VERSIONS.public.v1, + }, path: outputRoutesService.getListPath(), }) .then((response) => response.data); @@ -318,6 +331,9 @@ const configureFleetIfNeeded = async () => { await kbnClient .request({ method: 'PUT', + headers: { + 'elastic-api-version': API_VERSIONS.public.v1, + }, path: outputRoutesService.getUpdatePath(id), body: update, }) @@ -356,6 +372,9 @@ const addFleetServerHostToFleetSettings = async ( .request({ method: 'POST', path: fleetServerHostsRoutesService.getCreatePath(), + headers: { + 'elastic-api-version': API_VERSIONS.public.v1, + }, body: newFleetHostEntry, }) .catch(catchAxiosErrorFormatAndThrow) diff --git a/x-pack/test/osquery_cypress/utils.ts b/x-pack/test/osquery_cypress/utils.ts index 572170e0ec301..a852cfd8bed99 100644 --- a/x-pack/test/osquery_cypress/utils.ts +++ b/x-pack/test/osquery_cypress/utils.ts @@ -8,7 +8,7 @@ import axios from 'axios'; import semver from 'semver'; import { map } from 'lodash'; -import { PackagePolicy, CreatePackagePolicyResponse } from '@kbn/fleet-plugin/common'; +import { PackagePolicy, CreatePackagePolicyResponse, API_VERSIONS } from '@kbn/fleet-plugin/common'; import { KbnClient } from '@kbn/test'; import { GetEnrollmentAPIKeysResponse, @@ -26,7 +26,10 @@ export const getInstalledIntegration = async (kbnClient: KbnClient, integrationN } = await kbnClient.request<{ item: PackagePolicy }>({ method: 'GET', path: `/api/fleet/epm/packages/${integrationName}`, - headers: DEFAULT_HEADERS, + headers: { + ...DEFAULT_HEADERS, + 'elastic-api-version': API_VERSIONS.public.v1, + }, }); return item; @@ -46,6 +49,9 @@ export const createAgentPolicy = async ( } = await kbnClient.request({ method: 'POST', path: `/api/fleet/agent_policies?sys_monitoring=true`, + headers: { + 'elastic-api-version': API_VERSIONS.public.v1, + }, body: { name: agentPolicyName, description: '', @@ -62,6 +68,9 @@ export const createAgentPolicy = async ( log.info('Getting agent enrollment key'); const { data: apiKeys } = await kbnClient.request({ method: 'GET', + headers: { + 'elastic-api-version': API_VERSIONS.public.v1, + }, path: '/api/fleet/enrollment_api_keys', }); @@ -79,6 +88,9 @@ export const addIntegrationToAgentPolicy = async ( return kbnClient.request({ method: 'POST', path: '/api/fleet/package_policies', + headers: { + 'elastic-api-version': API_VERSIONS.public.v1, + }, body: { policy_id: agentPolicyId, package: { From 66f4f9f773e098d12c143655026121ec548157e6 Mon Sep 17 00:00:00 2001 From: Stratoula Kalafateli Date: Wed, 6 Sep 2023 17:08:47 +0300 Subject: [PATCH 16/97] [Dashboard] Unskips the by value lens tests (#165798) ## Summary Closes https://github.com/elastic/kibana/issues/165461 https://buildkite.com/elastic/kibana-flaky-test-suite-runner/builds/3069 --> 50 times https://buildkite.com/elastic/kibana-flaky-test-suite-runner/builds/3071 --> 100 times ### Checklist - [ ] [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 --- .../apps/dashboard/group2/dashboard_lens_by_value.ts | 3 +-- x-pack/test/functional/page_objects/lens_page.ts | 11 +++++------ 2 files changed, 6 insertions(+), 8 deletions(-) diff --git a/x-pack/test/functional/apps/dashboard/group2/dashboard_lens_by_value.ts b/x-pack/test/functional/apps/dashboard/group2/dashboard_lens_by_value.ts index aec34ba0d5d9e..2604b942f7313 100644 --- a/x-pack/test/functional/apps/dashboard/group2/dashboard_lens_by_value.ts +++ b/x-pack/test/functional/apps/dashboard/group2/dashboard_lens_by_value.ts @@ -16,8 +16,7 @@ export default function ({ getPageObjects, getService }: FtrProviderContext) { const dashboardPanelActions = getService('dashboardPanelActions'); const kibanaServer = getService('kibanaServer'); - // FLAKY: https://github.com/elastic/kibana/issues/165461 - describe.skip('dashboard lens by value', function () { + describe('dashboard lens by value', function () { before(async () => { await esArchiver.loadIfNeeded('x-pack/test/functional/es_archives/logstash_functional'); await kibanaServer.importExport.load( diff --git a/x-pack/test/functional/page_objects/lens_page.ts b/x-pack/test/functional/page_objects/lens_page.ts index a46d90eb915e0..5d3f316b7a83a 100644 --- a/x-pack/test/functional/page_objects/lens_page.ts +++ b/x-pack/test/functional/page_objects/lens_page.ts @@ -1367,17 +1367,16 @@ export function LensPageProvider({ getService, getPageObjects }: FtrProviderCont } await dashboardAddPanel.clickCreateNewLink(); await this.goToTimeRange(); - await this.configureDimension({ - dimension: 'lnsXY_xDimensionPanel > lns-empty-dimension', - operation: 'date_histogram', - field: '@timestamp', - }); - await this.configureDimension({ dimension: 'lnsXY_yDimensionPanel > lns-empty-dimension', operation: 'average', field: 'bytes', }); + await this.configureDimension({ + dimension: 'lnsXY_xDimensionPanel > lns-empty-dimension', + operation: 'date_histogram', + field: '@timestamp', + }); await this.configureDimension({ dimension: 'lnsXY_splitDimensionPanel > lns-empty-dimension', From c5eb3f435ae27204133783bdf1251b7b2b5a130f Mon Sep 17 00:00:00 2001 From: Ersin Erdal <92688503+ersin-erdal@users.noreply.github.com> Date: Wed, 6 Sep 2023 16:10:14 +0200 Subject: [PATCH 17/97] Add functional tests for summarized alerts (#164020) fixes: #163041 This PR adds functional tests to test getSummarizedAlerts method of the alertsClient by testing summarised alerts content and number of new, ongoing and recovered alerts. --------- Co-authored-by: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> --- .../common/lib/alert_utils.ts | 125 +++++- .../common/plugins/alerts/server/plugin.ts | 3 + .../group2/tests/alerting/alerts.ts | 399 +++++++++++++++++- 3 files changed, 506 insertions(+), 21 deletions(-) diff --git a/x-pack/test/alerting_api_integration/common/lib/alert_utils.ts b/x-pack/test/alerting_api_integration/common/lib/alert_utils.ts index 480c4baaab198..5b4aeb496b125 100644 --- a/x-pack/test/alerting_api_integration/common/lib/alert_utils.ts +++ b/x-pack/test/alerting_api_integration/common/lib/alert_utils.ts @@ -29,6 +29,7 @@ export interface CreateAlertWithActionOpts { summary?: boolean; throttle?: string | null; alertsFilter?: AlertsFilter; + messageTemplate?: string; } export interface CreateNoopAlertOpts { objectRemover?: ObjectRemover; @@ -264,7 +265,7 @@ export class AlertUtils { return response; } - public async createAlwaysFiringSummaryAction({ + public async createAlwaysFiringRuleWithSummaryAction({ objectRemover, overwrites = {}, indexRecordActionId, @@ -272,6 +273,7 @@ export class AlertUtils { notifyWhen, throttle, alertsFilter, + messageTemplate, }: CreateAlertWithActionOpts) { const objRemover = objectRemover || this.objectRemover; const actionId = indexRecordActionId || this.indexRecordActionId; @@ -294,7 +296,52 @@ export class AlertUtils { actionId, notifyWhen, throttle, - alertsFilter + alertsFilter, + messageTemplate + ); + + const response = await request.send({ ...rule, ...overwrites }); + if (response.statusCode === 200) { + objRemover.add(this.space.id, response.body.id, 'rule', 'alerting'); + } + return response; + } + + public async createPatternFiringRuleWithSummaryAction({ + objectRemover, + overwrites = {}, + indexRecordActionId, + reference, + notifyWhen, + throttle, + alertsFilter, + messageTemplate, + pattern, + }: CreateAlertWithActionOpts & { pattern: object }) { + const objRemover = objectRemover || this.objectRemover; + const actionId = indexRecordActionId || this.indexRecordActionId; + + if (!objRemover) { + throw new Error('objectRemover is required'); + } + if (!actionId) { + throw new Error('indexRecordActionId is required '); + } + + let request = this.supertestWithoutAuth + .post(`${getUrlPrefix(this.space.id)}/api/alerting/rule`) + .set('kbn-xsrf', 'foo'); + if (this.user) { + request = request.auth(this.user.username, this.user.password); + } + const rule = getPatternFiringRuleWithSummaryAction( + reference, + pattern, + actionId, + notifyWhen, + throttle, + alertsFilter, + messageTemplate ); const response = await request.send({ ...rule, ...overwrites }); @@ -409,6 +456,17 @@ export class AlertUtils { } return response; } + + public async runSoon(ruleId: string) { + let request = this.supertestWithoutAuth + .post(`${getUrlPrefix(this.space.id)}/internal/alerting/rule/${ruleId}/_run_soon`) + .set('kbn-xsrf', 'foo'); + + if (this.user) { + request = request.auth(this.user.username, this.user.password); + } + return await request.send(); + } } export function getConsumerUnauthorizedErrorMessage( @@ -521,14 +579,16 @@ function getAlwaysFiringRuleWithSummaryAction( actionId: string, notifyWhen = 'onActiveAlert', throttle: string | null = '1m', - alertsFilter?: AlertsFilter + alertsFilter?: AlertsFilter, + messageTemplate?: string ) { - const messageTemplate = + const message = + messageTemplate ?? `Alerts, ` + - `all:{{alerts.all.count}}, ` + - `new:{{alerts.new.count}} IDs:[{{#alerts.new.data}}{{kibana.alert.instance.id}},{{/alerts.new.data}}], ` + - `ongoing:{{alerts.ongoing.count}} IDs:[{{#alerts.ongoing.data}}{{kibana.alert.instance.id}},{{/alerts.ongoing.data}}], ` + - `recovered:{{alerts.recovered.count}} IDs:[{{#alerts.recovered.data}}{{kibana.alert.instance.id}},{{/alerts.recovered.data}}]`.trim(); + `all:{{alerts.all.count}}, ` + + `new:{{alerts.new.count}} IDs:[{{#alerts.new.data}}{{kibana.alert.instance.id}},{{/alerts.new.data}}], ` + + `ongoing:{{alerts.ongoing.count}} IDs:[{{#alerts.ongoing.data}}{{kibana.alert.instance.id}},{{/alerts.ongoing.data}}], ` + + `recovered:{{alerts.recovered.count}} IDs:[{{#alerts.recovered.data}}{{kibana.alert.instance.id}},{{/alerts.recovered.data}}]`.trim(); return { enabled: true, @@ -548,7 +608,54 @@ function getAlwaysFiringRuleWithSummaryAction( params: { index: ES_TEST_INDEX_NAME, reference, - message: messageTemplate, + message, + }, + frequency: { + summary: true, + notify_when: notifyWhen, + throttle, + }, + ...(alertsFilter && { alerts_filter: alertsFilter }), + }, + ], + }; +} + +function getPatternFiringRuleWithSummaryAction( + reference: string, + pattern: object, + actionId: string, + notifyWhen = 'onActiveAlert', + throttle: string | null = null, + alertsFilter?: AlertsFilter, + messageTemplate?: string +) { + const message = + messageTemplate ?? + `Alerts, ` + + `all:{{alerts.all.count}}, ` + + `new:{{alerts.new.count}} IDs:[{{#alerts.new.data}}{{kibana.alert.instance.id}},{{/alerts.new.data}}], ` + + `ongoing:{{alerts.ongoing.count}} IDs:[{{#alerts.ongoing.data}}{{kibana.alert.instance.id}},{{/alerts.ongoing.data}}], ` + + `recovered:{{alerts.recovered.count}} IDs:[{{#alerts.recovered.data}}{{kibana.alert.instance.id}},{{/alerts.recovered.data}}]`.trim(); + + return { + enabled: true, + name: 'pattern-firing-rule-aad', + schedule: { interval: '1m' }, + tags: ['tag-A', 'tag-B'], + rule_type_id: 'test.patternFiringAad', + consumer: 'alertsFixture', + params: { + pattern, + }, + actions: [ + { + group: 'default', + id: actionId, + params: { + index: ES_TEST_INDEX_NAME, + reference, + message, }, frequency: { summary: true, diff --git a/x-pack/test/alerting_api_integration/common/plugins/alerts/server/plugin.ts b/x-pack/test/alerting_api_integration/common/plugins/alerts/server/plugin.ts index 807bd82d5f917..0809a4a5b71c7 100644 --- a/x-pack/test/alerting_api_integration/common/plugins/alerts/server/plugin.ts +++ b/x-pack/test/alerting_api_integration/common/plugins/alerts/server/plugin.ts @@ -87,6 +87,7 @@ export class FixturePlugin implements Plugin { const reference = alertUtils.generateReference(); - const response = await alertUtils.createAlwaysFiringSummaryAction({ + const response = await alertUtils.createAlwaysFiringRuleWithSummaryAction({ reference, overwrites: { schedule: { interval: '1s' }, @@ -1297,7 +1298,7 @@ instanceStateValue: true it('should filter alerts by kql', async () => { const reference = alertUtils.generateReference(); - const response = await alertUtils.createAlwaysFiringSummaryAction({ + const response = await alertUtils.createAlwaysFiringRuleWithSummaryAction({ reference, overwrites: { schedule: { interval: '1s' }, @@ -1367,7 +1368,7 @@ instanceStateValue: true const end = `${hour}:${minutes}`; const reference = alertUtils.generateReference(); - const response = await alertUtils.createAlwaysFiringSummaryAction({ + const response = await alertUtils.createAlwaysFiringRuleWithSummaryAction({ reference, overwrites: { schedule: { interval: '1s' }, @@ -1428,7 +1429,7 @@ instanceStateValue: true it('should schedule actions for summary of alerts on a custom interval', async () => { const reference = alertUtils.generateReference(); - const response = await alertUtils.createAlwaysFiringSummaryAction({ + const response = await alertUtils.createAlwaysFiringRuleWithSummaryAction({ reference, overwrites: { schedule: { interval: '1s' }, @@ -1436,6 +1437,7 @@ instanceStateValue: true notifyWhen: 'onThrottleInterval', throttle: '10s', summary: true, + messageTemplate: `{{alerts}}`, }); switch (scenario.id) { @@ -1474,21 +1476,394 @@ instanceStateValue: true ); // @ts-expect-error doesnt handle total: number expect(searchResult.body.hits.total.value).to.eql(2); - // Summary action is executed on first rule run then skipped 4 times (throttle is 5s and schedule.interval is 1s) - // @ts-expect-error _source: unknown - expect(searchResult.body.hits.hits[0]._source.params.message).to.eql( - 'Alerts, all:2, new:2 IDs:[1,2,], ongoing:0 IDs:[], recovered:0 IDs:[]' + expectExpect( + // Summary action is executed on first rule run then skipped 4 times (throttle is 5s and schedule.interval is 1s) + // @ts-expect-error _source: unknown + JSON.parse(searchResult.body.hits.hits[0]._source.params.message) + ).toEqual( + expectExpect.objectContaining({ + new: { + count: 2, + data: [ + { + _id: expectExpect.any(String), + _index: '.internal.alerts-observability.test.alerts.alerts-default-000001', + kibana: { + alert: { + rule: { + parameters: { + index: '.kibana-alerting-test-data', + reference, + }, + category: 'Test: Always Firing Alert As Data', + consumer: 'alertsFixture', + execution: { uuid: expectExpect.any(String) }, + name: 'abc', + producer: 'alertsFixture', + revision: 0, + rule_type_id: 'test.always-firing-alert-as-data', + uuid: expectExpect.any(String), + tags: ['tag-A', 'tag-B'], + }, + duration: { us: 0 }, + time_range: { gte: expectExpect.any(String) }, + instance: { id: '1' }, + start: expectExpect.any(String), + uuid: expectExpect.any(String), + status: 'active', + workflow_status: 'open', + flapping: false, + }, + space_ids: ['space1'], + version: expectExpect.any(String), + }, + '@timestamp': expectExpect.any(String), + event: { kind: 'signal', action: 'open' }, + tags: ['tag-A', 'tag-B'], + }, + { + _id: expectExpect.any(String), + _index: '.internal.alerts-observability.test.alerts.alerts-default-000001', + kibana: { + alert: { + rule: { + parameters: { + index: '.kibana-alerting-test-data', + reference, + }, + category: 'Test: Always Firing Alert As Data', + consumer: 'alertsFixture', + execution: { uuid: expectExpect.any(String) }, + name: 'abc', + producer: 'alertsFixture', + revision: 0, + rule_type_id: 'test.always-firing-alert-as-data', + uuid: expectExpect.any(String), + tags: ['tag-A', 'tag-B'], + }, + duration: { us: 0 }, + time_range: { gte: expectExpect.any(String) }, + instance: { id: '2' }, + start: expectExpect.any(String), + uuid: expectExpect.any(String), + status: 'active', + workflow_status: 'open', + flapping: false, + }, + space_ids: ['space1'], + version: expectExpect.any(String), + }, + '@timestamp': expectExpect.any(String), + event: { kind: 'signal', action: 'open' }, + tags: ['tag-A', 'tag-B'], + }, + ], + }, + ongoing: { count: 0, data: [] }, + recovered: { count: 0, data: [] }, + }) ); - // @ts-expect-error _source: unknown - // Summary action is executed on the fifth rule run. The new alerts in the first execution become ongoing - expect(searchResult.body.hits.hits[1]._source.params.message).to.eql( - 'Alerts, all:2, new:0 IDs:[], ongoing:2 IDs:[1,2,], recovered:0 IDs:[]' + expectExpect( + // @ts-expect-error _source: unknown + // Summary action is executed on the fifth rule run. The new alerts in the first execution become ongoing + JSON.parse(searchResult.body.hits.hits[1]._source.params.message) + ).toEqual( + expectExpect.objectContaining({ + new: { count: 0, data: [] }, + ongoing: { + count: 2, + data: [ + { + _id: expectExpect.any(String), + _index: '.internal.alerts-observability.test.alerts.alerts-default-000001', + kibana: { + alert: { + rule: { + parameters: { + index: '.kibana-alerting-test-data', + reference, + }, + category: 'Test: Always Firing Alert As Data', + consumer: 'alertsFixture', + execution: { uuid: expectExpect.any(String) }, + name: 'abc', + producer: 'alertsFixture', + revision: 0, + rule_type_id: 'test.always-firing-alert-as-data', + uuid: expectExpect.any(String), + tags: ['tag-A', 'tag-B'], + }, + duration: { us: expectExpect.any(Number) }, + time_range: { gte: expectExpect.any(String) }, + instance: { id: '1' }, + start: expectExpect.any(String), + uuid: expectExpect.any(String), + status: 'active', + workflow_status: 'open', + flapping: false, + }, + space_ids: ['space1'], + version: expectExpect.any(String), + }, + '@timestamp': expectExpect.any(String), + event: { kind: 'signal', action: 'active' }, + tags: ['tag-A', 'tag-B'], + }, + { + _id: expectExpect.any(String), + _index: '.internal.alerts-observability.test.alerts.alerts-default-000001', + kibana: { + alert: { + rule: { + parameters: { + index: '.kibana-alerting-test-data', + reference, + }, + category: 'Test: Always Firing Alert As Data', + consumer: 'alertsFixture', + execution: { uuid: expectExpect.any(String) }, + name: 'abc', + producer: 'alertsFixture', + revision: 0, + rule_type_id: 'test.always-firing-alert-as-data', + uuid: expectExpect.any(String), + tags: ['tag-A', 'tag-B'], + }, + duration: { us: expectExpect.any(Number) }, + time_range: { gte: expectExpect.any(String) }, + instance: { id: '2' }, + start: expectExpect.any(String), + uuid: expectExpect.any(String), + status: 'active', + workflow_status: 'open', + flapping: false, + }, + space_ids: ['space1'], + version: expectExpect.any(String), + }, + '@timestamp': expectExpect.any(String), + event: { kind: 'signal', action: 'active' }, + tags: ['tag-A', 'tag-B'], + }, + ], + }, + recovered: { count: 0, data: [] }, + }) ); break; default: throw new Error(`Scenario untested: ${JSON.stringify(scenario)}`); } }); + + it('should pass summarized alerts to actions', async () => { + const reference = alertUtils.generateReference(); + const response = await alertUtils.createAlwaysFiringRuleWithSummaryAction({ + reference, + overwrites: { + schedule: { interval: '1s' }, + }, + notifyWhen: 'onActiveAlert', + throttle: null, + summary: true, + messageTemplate: `[{{alerts.all.data}}]`, + }); + + switch (scenario.id) { + case 'no_kibana_privileges at space1': + case 'space_1_all at space2': + case 'global_read at space1': + expect(response.statusCode).to.eql(403); + expect(response.body).to.eql({ + error: 'Forbidden', + message: getConsumerUnauthorizedErrorMessage( + 'create', + 'test.always-firing-alert-as-data', + 'alertsFixture' + ), + statusCode: 403, + }); + break; + case 'space_1_all_alerts_none_actions at space1': + expect(response.statusCode).to.eql(403); + expect(response.body).to.eql({ + error: 'Forbidden', + message: `Unauthorized to get actions`, + statusCode: 403, + }); + break; + case 'space_1_all at space1': + case 'space_1_all_with_restricted_fixture at space1': + case 'superuser at space1': + expect(response.statusCode).to.eql(200); + + await esTestIndexTool.waitForDocs('rule:test.always-firing-alert-as-data', reference); + await esTestIndexTool.waitForDocs('action:test.index-record', reference); + const searchResult = await esTestIndexTool.search( + 'action:test.index-record', + reference + ); + // @ts-expect-error doesnt handle total: number + expect(searchResult.body.hits.total.value).to.eql(1); + expectExpect( + // @ts-expect-error _source: unknown + JSON.parse(searchResult.body.hits.hits[0]._source.params.message) + ).toEqual([ + expectExpect.objectContaining({ + _id: expectExpect.any(String), + _index: '.internal.alerts-observability.test.alerts.alerts-default-000001', + kibana: { + alert: { + rule: { + parameters: { + index: '.kibana-alerting-test-data', + reference, + }, + category: 'Test: Always Firing Alert As Data', + consumer: 'alertsFixture', + execution: { uuid: expectExpect.any(String) }, + name: 'abc', + producer: 'alertsFixture', + revision: 0, + rule_type_id: 'test.always-firing-alert-as-data', + uuid: expectExpect.any(String), + tags: ['tag-A', 'tag-B'], + }, + duration: { us: 0 }, + time_range: { gte: expectExpect.any(String) }, + instance: { id: '1' }, + start: expectExpect.any(String), + uuid: expectExpect.any(String), + status: 'active', + workflow_status: 'open', + flapping: false, + }, + space_ids: ['space1'], + version: expectExpect.any(String), + }, + '@timestamp': expectExpect.any(String), + event: { kind: 'signal', action: 'open' }, + tags: ['tag-A', 'tag-B'], + }), + expectExpect.objectContaining({ + _id: expectExpect.any(String), + _index: '.internal.alerts-observability.test.alerts.alerts-default-000001', + kibana: { + alert: { + rule: { + parameters: { + index: '.kibana-alerting-test-data', + reference, + }, + category: 'Test: Always Firing Alert As Data', + consumer: 'alertsFixture', + execution: { uuid: expectExpect.any(String) }, + name: 'abc', + producer: 'alertsFixture', + revision: 0, + rule_type_id: 'test.always-firing-alert-as-data', + uuid: expectExpect.any(String), + tags: ['tag-A', 'tag-B'], + }, + duration: { us: 0 }, + time_range: { gte: expectExpect.any(String) }, + instance: { id: '2' }, + start: expectExpect.any(String), + uuid: expectExpect.any(String), + status: 'active', + workflow_status: 'open', + flapping: false, + }, + space_ids: ['space1'], + version: expectExpect.any(String), + }, + '@timestamp': expectExpect.any(String), + event: { kind: 'signal', action: 'open' }, + tags: ['tag-A', 'tag-B'], + }), + ]); + + break; + default: + throw new Error(`Scenario untested: ${JSON.stringify(scenario)}`); + } + }); + + it('should create new, ongoing and recovered alerts', async () => { + const reference = alertUtils.generateReference(); + const createdRule = await alertUtils.createPatternFiringRuleWithSummaryAction({ + reference, + overwrites: { + // set the schedule long so we can use "runSoon" to specify rule runs + schedule: { interval: '1d' }, + }, + pattern: { alertA: [true, true, false, false, false, false] }, + }); + + const ruleId = createdRule.body.id; + + switch (scenario.id) { + case 'no_kibana_privileges at space1': + case 'space_1_all at space2': + case 'space_1_all at space2': + case 'global_read at space1': + case 'space_1_all_alerts_none_actions at space1': + expect(createdRule.statusCode).to.eql(403); + break; + case 'space_1_all at space1': + case 'space_1_all_with_restricted_fixture at space1': + break; + case 'superuser at space1': + expect(createdRule.statusCode).to.eql(200); + + // ##################################### + // first run (new alerts) + // ##################################### + const searchResult = await esTestIndexTool.waitForDocs( + 'action:test.index-record', + reference, + 1 + ); // action execution + + expect(searchResult[0]._source.params.message).to.be( + 'Alerts, all:1, new:1 IDs:[alertA,], ongoing:0 IDs:[], recovered:0 IDs:[]' + ); + + // ##################################### + // second run (ongoing alerts) + // ##################################### + await alertUtils.runSoon(ruleId); + + const secondSearchResult = await esTestIndexTool.waitForDocs( + 'action:test.index-record', + reference, + 2 + ); + + expect(secondSearchResult[1]._source.params.message).to.be( + 'Alerts, all:1, new:0 IDs:[], ongoing:1 IDs:[alertA,], recovered:0 IDs:[]' + ); + + // ##################################### + // third run (recovered alerts) + // ##################################### + await alertUtils.runSoon(ruleId); + + const thirdSearchResult = await esTestIndexTool.waitForDocs( + 'action:test.index-record', + reference, + 3 + ); + + expect(thirdSearchResult[2]._source.params.message).to.be( + 'Alerts, all:1, new:0 IDs:[], ongoing:0 IDs:[], recovered:1 IDs:[alertA,]' + ); + + break; + default: + throw new Error(`Scenario untested: ${JSON.stringify(scenario)}`); + } + }); }); } }); From 28aafeddb25d3f4f413133331cd7d5820ee8fde9 Mon Sep 17 00:00:00 2001 From: Mykola Harmash Date: Wed, 6 Sep 2023 16:17:47 +0200 Subject: [PATCH 18/97] [Infra UI] Use stacked area chart for CPU usage breakdown (#165828) Closes #165807 ## Summary Converts CPU usage breakdown chart from `area_percentage_stacked` to `area_stacked` Co-authored-by: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> --- .../lens/dashboards/asset_details/metric_charts/cpu.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/x-pack/plugins/infra/public/common/visualizations/lens/dashboards/asset_details/metric_charts/cpu.ts b/x-pack/plugins/infra/public/common/visualizations/lens/dashboards/asset_details/metric_charts/cpu.ts index 6e9c53cce635e..b0878ceccef1e 100644 --- a/x-pack/plugins/infra/public/common/visualizations/lens/dashboards/asset_details/metric_charts/cpu.ts +++ b/x-pack/plugins/infra/public/common/visualizations/lens/dashboards/asset_details/metric_charts/cpu.ts @@ -45,7 +45,7 @@ export const cpuUsageBreakdown: XYConfig = { hostLensFormulas.cpuUsageSystem, ], options: { - seriesType: 'area_percentage_stacked', + seriesType: 'area_stacked', }, type: 'visualization', }, From bb96b8caf30f699a4d6ada2883f4703e18132f4f Mon Sep 17 00:00:00 2001 From: Tiago Costa Date: Wed, 6 Sep 2023 15:38:00 +0100 Subject: [PATCH 19/97] skip flaky suite #(165539) --- .../api_integration/test_suites/common/ingest_pipelines.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/x-pack/test_serverless/api_integration/test_suites/common/ingest_pipelines.ts b/x-pack/test_serverless/api_integration/test_suites/common/ingest_pipelines.ts index 1e5ee6d39bb71..3a1ffba020246 100644 --- a/x-pack/test_serverless/api_integration/test_suites/common/ingest_pipelines.ts +++ b/x-pack/test_serverless/api_integration/test_suites/common/ingest_pipelines.ts @@ -350,7 +350,8 @@ export default function ({ getService }: FtrProviderContext) { }); }); - describe('Fetch documents', () => { + // FLAKY: https://github.com/elastic/kibana/issues/165539 + describe.skip('Fetch documents', () => { const INDEX = 'test_index'; const DOCUMENT_ID = '1'; const DOCUMENT = { From 42f377b746f68749ce882ed193dccab99ce07295 Mon Sep 17 00:00:00 2001 From: Tiago Costa Date: Wed, 6 Sep 2023 15:39:59 +0100 Subject: [PATCH 20/97] skip flaky suite (#165709) --- .../cypress/e2e/overview/cti_link_panel.cy.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/x-pack/test/security_solution_cypress/cypress/e2e/overview/cti_link_panel.cy.ts b/x-pack/test/security_solution_cypress/cypress/e2e/overview/cti_link_panel.cy.ts index d6936f86e9e89..fa99225543e89 100644 --- a/x-pack/test/security_solution_cypress/cypress/e2e/overview/cti_link_panel.cy.ts +++ b/x-pack/test/security_solution_cypress/cypress/e2e/overview/cti_link_panel.cy.ts @@ -15,7 +15,8 @@ import { import { login, visit } from '../../tasks/login'; import { OVERVIEW_URL } from '../../urls/navigation'; -describe('CTI Link Panel', { tags: ['@ess', '@serverless'] }, () => { +// FLAKY: https://github.com/elastic/kibana/issues/165709 +describe.skip('CTI Link Panel', { tags: ['@ess', '@serverless'] }, () => { beforeEach(() => { login(); }); From 9f2f739edfbb66a548fe638515622209add785c8 Mon Sep 17 00:00:00 2001 From: Maxim Palenov Date: Wed, 6 Sep 2023 16:41:55 +0200 Subject: [PATCH 21/97] [Security Solution] Prevent junit tranformation command from breaking a build step (#165824) ## Summary This PR implements a temporary fix to prevent `yarn junit:merge` command from breaking a build step by returning non zero code. `yarn junit:merge` fails in case if it can't find reports or folders it operates on weren't created beforehand. --- .buildkite/scripts/steps/functional/defend_workflows.sh | 2 +- .buildkite/scripts/steps/functional/defend_workflows_vagrant.sh | 2 +- .buildkite/scripts/steps/functional/response_ops.sh | 2 +- .buildkite/scripts/steps/functional/response_ops_cases.sh | 2 +- .buildkite/scripts/steps/functional/security_serverless.sh | 2 +- .../scripts/steps/functional/security_serverless_explore.sh | 2 +- .../steps/functional/security_serverless_investigations.sh | 2 +- .buildkite/scripts/steps/functional/security_solution.sh | 2 +- .../scripts/steps/functional/security_solution_explore.sh | 2 +- .../steps/functional/security_solution_investigations.sh | 2 +- 10 files changed, 10 insertions(+), 10 deletions(-) diff --git a/.buildkite/scripts/steps/functional/defend_workflows.sh b/.buildkite/scripts/steps/functional/defend_workflows.sh index 111fa6a23d289..c85321869f836 100755 --- a/.buildkite/scripts/steps/functional/defend_workflows.sh +++ b/.buildkite/scripts/steps/functional/defend_workflows.sh @@ -13,4 +13,4 @@ echo "--- Defend Workflows Cypress tests" cd x-pack/plugins/security_solution set +e -yarn cypress:dw:run; status=$?; yarn junit:merge && exit $status +yarn cypress:dw:run; status=$?; yarn junit:merge || :; exit $status diff --git a/.buildkite/scripts/steps/functional/defend_workflows_vagrant.sh b/.buildkite/scripts/steps/functional/defend_workflows_vagrant.sh index 0dfabadb90687..390078d3076f7 100755 --- a/.buildkite/scripts/steps/functional/defend_workflows_vagrant.sh +++ b/.buildkite/scripts/steps/functional/defend_workflows_vagrant.sh @@ -13,4 +13,4 @@ echo "--- Defend Workflows Endpoint Cypress tests" cd x-pack/plugins/security_solution set +e -yarn cypress:dw:endpoint:run; status=$?; yarn junit:merge && exit $status +yarn cypress:dw:endpoint:run; status=$?; yarn junit:merge || :; exit $status diff --git a/.buildkite/scripts/steps/functional/response_ops.sh b/.buildkite/scripts/steps/functional/response_ops.sh index 05e740bbf8d55..47e19393d8dc9 100755 --- a/.buildkite/scripts/steps/functional/response_ops.sh +++ b/.buildkite/scripts/steps/functional/response_ops.sh @@ -13,4 +13,4 @@ echo "--- Response Ops Cypress Tests on Security Solution" cd x-pack/test/security_solution_cypress set +e -yarn cypress:run:respops:ess; status=$?; yarn junit:merge && exit $status +yarn cypress:run:respops:ess; status=$?; yarn junit:merge || :; exit $status diff --git a/.buildkite/scripts/steps/functional/response_ops_cases.sh b/.buildkite/scripts/steps/functional/response_ops_cases.sh index 895edf0395dd0..739cca4e97dc0 100755 --- a/.buildkite/scripts/steps/functional/response_ops_cases.sh +++ b/.buildkite/scripts/steps/functional/response_ops_cases.sh @@ -13,4 +13,4 @@ echo "--- Response Ops Cases Cypress Tests on Security Solution" cd x-pack/test/security_solution_cypress set +e -yarn cypress:run:cases:ess; status=$?; yarn junit:merge && exit $status +yarn cypress:run:cases:ess; status=$?; yarn junit:merge || :; exit $status diff --git a/.buildkite/scripts/steps/functional/security_serverless.sh b/.buildkite/scripts/steps/functional/security_serverless.sh index 984697ba6129b..9903f44da0373 100644 --- a/.buildkite/scripts/steps/functional/security_serverless.sh +++ b/.buildkite/scripts/steps/functional/security_serverless.sh @@ -13,4 +13,4 @@ echo "--- Security Serverless Cypress Tests" cd x-pack/test/security_solution_cypress set +e -yarn cypress:run:serverless; status=$?; yarn junit:merge && exit $status +yarn cypress:run:serverless; status=$?; yarn junit:merge || :; exit $status diff --git a/.buildkite/scripts/steps/functional/security_serverless_explore.sh b/.buildkite/scripts/steps/functional/security_serverless_explore.sh index 64cd304a4bff2..52237e4d8f902 100644 --- a/.buildkite/scripts/steps/functional/security_serverless_explore.sh +++ b/.buildkite/scripts/steps/functional/security_serverless_explore.sh @@ -13,4 +13,4 @@ echo "--- Explore - Security Solution Cypress Tests" cd x-pack/test/security_solution_cypress set +e -yarn cypress:explore:run:serverless; status=$?; yarn junit:merge && exit $status +yarn cypress:explore:run:serverless; status=$?; yarn junit:merge || :; exit $status diff --git a/.buildkite/scripts/steps/functional/security_serverless_investigations.sh b/.buildkite/scripts/steps/functional/security_serverless_investigations.sh index 49a9392f23de1..6a79a92871fb2 100644 --- a/.buildkite/scripts/steps/functional/security_serverless_investigations.sh +++ b/.buildkite/scripts/steps/functional/security_serverless_investigations.sh @@ -13,4 +13,4 @@ echo "--- Investigations Cypress Tests on Serverless" cd x-pack/test/security_solution_cypress set +e -yarn cypress:investigations:run:serverless; status=$?; yarn junit:merge && exit $status +yarn cypress:investigations:run:serverless; status=$?; yarn junit:merge || :; exit $status diff --git a/.buildkite/scripts/steps/functional/security_solution.sh b/.buildkite/scripts/steps/functional/security_solution.sh index ffd82a3601ba4..fdba86f4dee4e 100755 --- a/.buildkite/scripts/steps/functional/security_solution.sh +++ b/.buildkite/scripts/steps/functional/security_solution.sh @@ -13,4 +13,4 @@ echo "--- Security Solution Cypress tests (Chrome)" cd x-pack/test/security_solution_cypress set +e -yarn cypress:run:ess; status=$?; yarn junit:merge && exit $status +yarn cypress:run:ess; status=$?; yarn junit:merge || :; exit $status diff --git a/.buildkite/scripts/steps/functional/security_solution_explore.sh b/.buildkite/scripts/steps/functional/security_solution_explore.sh index 03295b993dafd..e5513e63a7664 100644 --- a/.buildkite/scripts/steps/functional/security_solution_explore.sh +++ b/.buildkite/scripts/steps/functional/security_solution_explore.sh @@ -13,4 +13,4 @@ echo "--- Explore Cypress Tests on Security Solution" cd x-pack/test/security_solution_cypress set +e -yarn cypress:explore:run:ess; status=$?; yarn junit:merge && exit $status +yarn cypress:explore:run:ess; status=$?; yarn junit:merge || :; exit $status diff --git a/.buildkite/scripts/steps/functional/security_solution_investigations.sh b/.buildkite/scripts/steps/functional/security_solution_investigations.sh index 11e0d1fb7fea7..d26261b638d5a 100644 --- a/.buildkite/scripts/steps/functional/security_solution_investigations.sh +++ b/.buildkite/scripts/steps/functional/security_solution_investigations.sh @@ -13,4 +13,4 @@ echo "--- Investigations - Security Solution Cypress Tests" cd x-pack/test/security_solution_cypress set +e -yarn cypress:investigations:run:ess; status=$?; yarn junit:merge && exit $status +yarn cypress:investigations:run:ess; status=$?; yarn junit:merge || :; exit $status From 79e11c268d9a8aa2a008a2ee468d9b04f329bcf6 Mon Sep 17 00:00:00 2001 From: Tiago Costa Date: Wed, 6 Sep 2023 16:14:35 +0100 Subject: [PATCH 22/97] skip flaky suite (#165763) --- .../common/examples/search_examples/partial_results_example.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/x-pack/test_serverless/functional/test_suites/common/examples/search_examples/partial_results_example.ts b/x-pack/test_serverless/functional/test_suites/common/examples/search_examples/partial_results_example.ts index 93364f85cc94f..38f055d9be277 100644 --- a/x-pack/test_serverless/functional/test_suites/common/examples/search_examples/partial_results_example.ts +++ b/x-pack/test_serverless/functional/test_suites/common/examples/search_examples/partial_results_example.ts @@ -13,7 +13,8 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { const PageObjects = getPageObjects(['common']); const retry = getService('retry'); - describe('Partial results example', () => { + // FLAKY: https://github.com/elastic/kibana/issues/165763 + describe.skip('Partial results example', () => { before(async () => { await PageObjects.common.navigateToApp('searchExamples'); await testSubjects.click('/search'); From c76c4d09b4db5720e9749eee721d3d33c3626b29 Mon Sep 17 00:00:00 2001 From: Tiago Costa Date: Wed, 6 Sep 2023 16:15:42 +0100 Subject: [PATCH 23/97] skip flaky suite (#165688) --- .../cypress/e2e/investigations/timelines/inspect.cy.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/x-pack/test/security_solution_cypress/cypress/e2e/investigations/timelines/inspect.cy.ts b/x-pack/test/security_solution_cypress/cypress/e2e/investigations/timelines/inspect.cy.ts index 2c468d46036aa..bf7fc80857754 100644 --- a/x-pack/test/security_solution_cypress/cypress/e2e/investigations/timelines/inspect.cy.ts +++ b/x-pack/test/security_solution_cypress/cypress/e2e/investigations/timelines/inspect.cy.ts @@ -13,7 +13,8 @@ import { executeTimelineKQL, openTimelineInspectButton } from '../../../tasks/ti import { HOSTS_URL } from '../../../urls/navigation'; -describe('Inspect', { tags: ['@ess', '@serverless'] }, () => { +// FLAKY: https://github.com/elastic/kibana/issues/165688 +describe('Inspect', { tags: ['@ess', '@serverless', '@brokenInServerless'] }, () => { context('Timeline', () => { it('inspects the timeline', () => { const hostExistsQuery = 'host.name: *'; From 516603f2d658e4ae388291949a75043ce75c9c5d Mon Sep 17 00:00:00 2001 From: Tiago Costa Date: Wed, 6 Sep 2023 16:19:33 +0100 Subject: [PATCH 24/97] skip flaky suite (#165760) --- .../cypress/e2e/investigations/timeline_templates/export.cy.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/x-pack/test/security_solution_cypress/cypress/e2e/investigations/timeline_templates/export.cy.ts b/x-pack/test/security_solution_cypress/cypress/e2e/investigations/timeline_templates/export.cy.ts index a87061d02d513..f0bda2b4e3703 100644 --- a/x-pack/test/security_solution_cypress/cypress/e2e/investigations/timeline_templates/export.cy.ts +++ b/x-pack/test/security_solution_cypress/cypress/e2e/investigations/timeline_templates/export.cy.ts @@ -17,7 +17,8 @@ import { createTimelineTemplate } from '../../../tasks/api_calls/timelines'; import { cleanKibana } from '../../../tasks/common'; import { searchByTitle } from '../../../tasks/table_pagination'; -describe('Export timelines', { tags: ['@ess', '@serverless'] }, () => { +// FLAKY: https://github.com/elastic/kibana/issues/165760 +describe('Export timelines', { tags: ['@ess', '@serverless', '@brokenInServerless'] }, () => { before(() => { cleanKibana(); From e6621b28e6fd04b9c17f82ba2ea0c998de9f49d0 Mon Sep 17 00:00:00 2001 From: Tiago Costa Date: Wed, 6 Sep 2023 16:22:39 +0100 Subject: [PATCH 25/97] skip flaky suite (#165804) --- .../functional/test_suites/common/data_view_mgmt.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/x-pack/test_serverless/functional/test_suites/common/data_view_mgmt.ts b/x-pack/test_serverless/functional/test_suites/common/data_view_mgmt.ts index 7e41ed68f8def..5bd1012a82de3 100644 --- a/x-pack/test_serverless/functional/test_suites/common/data_view_mgmt.ts +++ b/x-pack/test_serverless/functional/test_suites/common/data_view_mgmt.ts @@ -17,7 +17,8 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { const supertest = getService('supertest'); const testSubjects = getService('testSubjects'); - describe('Data View Management', function () { + // FLAKY: https://github.com/elastic/kibana/issues/165804 + describe.skip('Data View Management', function () { let dataViewId = ''; before(async () => { From d702521722c9e9a9fd367f297b9a0caacdee9dde Mon Sep 17 00:00:00 2001 From: Tiago Costa Date: Wed, 6 Sep 2023 16:24:45 +0100 Subject: [PATCH 26/97] skip flaky suite (#165797) --- .../common/examples/unified_field_list_examples/field_stats.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/x-pack/test_serverless/functional/test_suites/common/examples/unified_field_list_examples/field_stats.ts b/x-pack/test_serverless/functional/test_suites/common/examples/unified_field_list_examples/field_stats.ts index 1df48eed373de..492f6951fb3b5 100644 --- a/x-pack/test_serverless/functional/test_suites/common/examples/unified_field_list_examples/field_stats.ts +++ b/x-pack/test_serverless/functional/test_suites/common/examples/unified_field_list_examples/field_stats.ts @@ -58,7 +58,8 @@ export default ({ getService, getPageObjects }: FtrProviderContext) => { await PageObjects.unifiedFieldList.cleanSidebarLocalStorage(); }); - describe('field distribution', () => { + // FLAKY: https://github.com/elastic/kibana/issues/165797 + describe.skip('field distribution', () => { before(async () => { await PageObjects.unifiedFieldList.toggleSidebarSection('empty'); // it will allow to render more fields in Available fields section }); From 51ab17e9901752c4b28d503b4c1f26910ba376f5 Mon Sep 17 00:00:00 2001 From: Tiago Costa Date: Wed, 6 Sep 2023 16:26:15 +0100 Subject: [PATCH 27/97] skip flaky suite (#165796) --- .../functional/test_suites/common/data_view_mgmt.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/x-pack/test_serverless/functional/test_suites/common/data_view_mgmt.ts b/x-pack/test_serverless/functional/test_suites/common/data_view_mgmt.ts index 5bd1012a82de3..c768a11dc1fbc 100644 --- a/x-pack/test_serverless/functional/test_suites/common/data_view_mgmt.ts +++ b/x-pack/test_serverless/functional/test_suites/common/data_view_mgmt.ts @@ -18,6 +18,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { const testSubjects = getService('testSubjects'); // FLAKY: https://github.com/elastic/kibana/issues/165804 + // FLAKY: https://github.com/elastic/kibana/issues/165796 describe.skip('Data View Management', function () { let dataViewId = ''; From 861e9ffcd216d898a6e7e35581c99a22f2b159ac Mon Sep 17 00:00:00 2001 From: Tiago Costa Date: Wed, 6 Sep 2023 16:28:14 +0100 Subject: [PATCH 28/97] skip flaky suite (#165766) --- .../cypress/e2e/data_sources/sourcerer.cy.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/x-pack/test/security_solution_cypress/cypress/e2e/data_sources/sourcerer.cy.ts b/x-pack/test/security_solution_cypress/cypress/e2e/data_sources/sourcerer.cy.ts index 77ce5b56d30ae..7ea130b0230d3 100644 --- a/x-pack/test/security_solution_cypress/cypress/e2e/data_sources/sourcerer.cy.ts +++ b/x-pack/test/security_solution_cypress/cypress/e2e/data_sources/sourcerer.cy.ts @@ -52,7 +52,8 @@ describe('Sourcerer', () => { }); }); - describe('Default scope', { tags: ['@ess', '@serverless'] }, () => { + // FLAKY: https://github.com/elastic/kibana/issues/165766 + describe('Default scope', { tags: ['@ess', '@serverless', '@brokenInServerless'] }, () => { beforeEach(() => { cy.clearLocalStorage(); login(); From 9f06803c1ef3c9d02d6e3890acc09a922813bac9 Mon Sep 17 00:00:00 2001 From: Tiago Costa Date: Wed, 6 Sep 2023 16:29:59 +0100 Subject: [PATCH 29/97] skip flaky suite (#165862) --- .../rule_management/rules_table/rules_table_sorting.cy.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/rule_management/rules_table/rules_table_sorting.cy.ts b/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/rule_management/rules_table/rules_table_sorting.cy.ts index 47a7aa80f1dd9..d61d6fca98958 100644 --- a/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/rule_management/rules_table/rules_table_sorting.cy.ts +++ b/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/rule_management/rules_table/rules_table_sorting.cy.ts @@ -36,7 +36,7 @@ import { } from '../../../../tasks/table_pagination'; import { TABLE_FIRST_PAGE, TABLE_SECOND_PAGE } from '../../../../screens/table_pagination'; -describe('Rules table: sorting', { tags: ['@ess', '@serverless'] }, () => { +describe('Rules table: sorting', { tags: ['@ess', '@serverless', '@brokenInServerless'] }, () => { before(() => { cleanKibana(); login(); From 227ea36935fb600f2cf4a89885067f02c82b5478 Mon Sep 17 00:00:00 2001 From: Tiago Costa Date: Wed, 6 Sep 2023 16:31:32 +0100 Subject: [PATCH 30/97] skip flaky suite (#165768) --- .../functional/test_suites/common/index_management/indices.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/x-pack/test_serverless/functional/test_suites/common/index_management/indices.ts b/x-pack/test_serverless/functional/test_suites/common/index_management/indices.ts index b4473f0ba16a5..cad35fe102060 100644 --- a/x-pack/test_serverless/functional/test_suites/common/index_management/indices.ts +++ b/x-pack/test_serverless/functional/test_suites/common/index_management/indices.ts @@ -16,6 +16,7 @@ export default ({ getPageObjects, getService }: FtrProviderContext) => { const retry = getService('retry'); // Flaky on serverless + // FLAKY: https://github.com/elastic/kibana/issues/165768 describe.skip('Indices', function () { before(async () => { await security.testUser.setRoles(['index_management_user']); From ed0e10791ffb92a52f9da7f309ebee6dc45c7f7f Mon Sep 17 00:00:00 2001 From: Dmitrii Shevchenko Date: Wed, 6 Sep 2023 17:32:35 +0200 Subject: [PATCH 31/97] [Security Solution] Migrate detection engine API to versioned router (#164851) --- .../detection_engine/rule_exceptions/urls.ts | 4 +- .../common/containers/alert_tags/api.ts | 1 + .../common/containers/dashboards/api.ts | 1 + .../public/common/containers/tags/api.ts | 7 +- .../public/common/store/store.ts | 1 + .../use_fetch_security_tags.test.ts | 11 +- .../fleet_integrations/api/api_client.ts | 1 + .../rule_management/api/api.ts | 3 + .../detection_engine/alerts/api.test.ts | 109 ++- .../containers/detection_engine/alerts/api.ts | 7 + .../hooks/use_create_shared_list/index.tsx | 1 + .../routes/get_dashboards_by_tags.ts | 67 +- .../api/get_installed_integrations/route.ts | 74 +- .../routes/index/create_index_route.ts | 47 +- .../routes/index/delete_index_route.ts | 85 +- .../index/read_alerts_index_exists_route.ts | 61 +- .../routes/index/read_index_route.ts | 123 +-- .../privileges/read_privileges_route.ts | 69 +- .../signals/create_signals_migration_route.ts | 194 ++--- .../signals/delete_signals_migration_route.ts | 143 ++-- .../finalize_signals_migration_route.ts | 161 ++-- .../get_signals_migration_status_route.ts | 137 ++-- .../signals/open_close_signals_route.ts | 142 ++-- .../routes/signals/query_signals_route.ts | 113 +-- .../routes/signals/set_alert_tags_route.ts | 134 +-- ...telemetry_detection_rules_preview_route.ts | 75 +- .../api/create_legacy_notification/route.ts | 152 ++-- .../api/create_rule_exceptions/route.ts | 118 +-- .../api/find_exception_references/route.ts | 180 ++-- .../rule_preview/api/preview_rules/route.ts | 768 +++++++++--------- .../exceptions/api/manage_exceptions/route.ts | 87 +- .../server/lib/tags/routes/create_tag.ts | 69 +- .../lib/tags/routes/get_tags_by_name.ts | 69 +- .../group1/export_rules.ts | 17 +- .../group1/find_rule_exception_references.ts | 4 + .../security_and_spaces/group1/find_rules.ts | 8 +- .../security_and_spaces/group10/read_rules.ts | 8 +- .../utils/create_legacy_rule_action.ts | 3 +- .../utils/create_signals_index.ts | 6 +- .../utils/delete_all_alerts.ts | 6 +- .../utils/get_security_telemetry_stats.ts | 1 + 41 files changed, 1740 insertions(+), 1527 deletions(-) diff --git a/x-pack/plugins/security_solution/common/api/detection_engine/rule_exceptions/urls.ts b/x-pack/plugins/security_solution/common/api/detection_engine/rule_exceptions/urls.ts index 1cc8e2ded7483..aeddf2c9117e6 100644 --- a/x-pack/plugins/security_solution/common/api/detection_engine/rule_exceptions/urls.ts +++ b/x-pack/plugins/security_solution/common/api/detection_engine/rule_exceptions/urls.ts @@ -10,8 +10,8 @@ import { INTERNAL_DETECTION_ENGINE_URL as INTERNAL_URL, } from '../../../constants'; -const INTERNAL_RULES_URL = `${INTERNAL_URL}/rules`; +const INTERNAL_RULES_URL = `${INTERNAL_URL}/rules` as const; -export const CREATE_RULE_EXCEPTIONS_URL = `${PUBLIC_RULES_URL}/{id}/exceptions`; +export const CREATE_RULE_EXCEPTIONS_URL = `${PUBLIC_RULES_URL}/{id}/exceptions` as const; export const DETECTION_ENGINE_RULES_EXCEPTIONS_REFERENCE_URL = `${INTERNAL_RULES_URL}/exceptions/_find_references` as const; diff --git a/x-pack/plugins/security_solution/public/common/containers/alert_tags/api.ts b/x-pack/plugins/security_solution/public/common/containers/alert_tags/api.ts index daa378af198a2..ee5f8520ca4c7 100644 --- a/x-pack/plugins/security_solution/public/common/containers/alert_tags/api.ts +++ b/x-pack/plugins/security_solution/public/common/containers/alert_tags/api.ts @@ -23,6 +23,7 @@ export const setAlertTags = async ({ DETECTION_ENGINE_ALERT_TAGS_URL, { method: 'POST', + version: '2023-10-31', body: JSON.stringify({ tags, ids }), signal, } diff --git a/x-pack/plugins/security_solution/public/common/containers/dashboards/api.ts b/x-pack/plugins/security_solution/public/common/containers/dashboards/api.ts index e9a443a2f1b8a..b4ca92bb4705b 100644 --- a/x-pack/plugins/security_solution/public/common/containers/dashboards/api.ts +++ b/x-pack/plugins/security_solution/public/common/containers/dashboards/api.ts @@ -23,6 +23,7 @@ export const getDashboardsByTagIds = ( abortSignal?: AbortSignal ): Promise => http.post(INTERNAL_DASHBOARDS_URL, { + version: '1', body: JSON.stringify({ tagIds }), signal: abortSignal, }); diff --git a/x-pack/plugins/security_solution/public/common/containers/tags/api.ts b/x-pack/plugins/security_solution/public/common/containers/tags/api.ts index 479ae07cc4eb7..6a402c150b84a 100644 --- a/x-pack/plugins/security_solution/public/common/containers/tags/api.ts +++ b/x-pack/plugins/security_solution/public/common/containers/tags/api.ts @@ -21,7 +21,12 @@ export interface Tag { export const getTagsByName = ( { http, tagName }: { http: HttpSetup; tagName: string }, abortSignal?: AbortSignal -): Promise => http.get(INTERNAL_TAGS_URL, { query: { name: tagName }, signal: abortSignal }); +): Promise => + http.get(INTERNAL_TAGS_URL, { + version: '1', + query: { name: tagName }, + signal: abortSignal, + }); // Dashboard listing needs savedObjectsTaggingClient to work correctly with cache. // https://github.com/elastic/kibana/issues/160723#issuecomment-1641904984 diff --git a/x-pack/plugins/security_solution/public/common/store/store.ts b/x-pack/plugins/security_solution/public/common/store/store.ts index 87c208a45e506..9b7f59bd2f978 100644 --- a/x-pack/plugins/security_solution/public/common/store/store.ts +++ b/x-pack/plugins/security_solution/public/common/store/store.ts @@ -69,6 +69,7 @@ export const createStoreFactory = async ( try { if (coreStart.application.capabilities[SERVER_APP_ID].show === true) { signal = await coreStart.http.fetch(DETECTION_ENGINE_INDEX_URL, { + version: '2023-10-31', method: 'GET', }); } diff --git a/x-pack/plugins/security_solution/public/dashboards/containers/use_fetch_security_tags.test.ts b/x-pack/plugins/security_solution/public/dashboards/containers/use_fetch_security_tags.test.ts index 4cf79cf4ce10b..3dadc008a9efa 100644 --- a/x-pack/plugins/security_solution/public/dashboards/containers/use_fetch_security_tags.test.ts +++ b/x-pack/plugins/security_solution/public/dashboards/containers/use_fetch_security_tags.test.ts @@ -56,10 +56,13 @@ describe('useFetchSecurityTags', () => { mockGet.mockResolvedValue([]); await asyncRenderUseCreateSecurityDashboardLink(); - expect(mockGet).toHaveBeenCalledWith(INTERNAL_TAGS_URL, { - query: { name: SECURITY_TAG_NAME }, - signal: mockAbortSignal, - }); + expect(mockGet).toHaveBeenCalledWith( + INTERNAL_TAGS_URL, + expect.objectContaining({ + query: { name: SECURITY_TAG_NAME }, + signal: mockAbortSignal, + }) + ); }); test('should create a Security Solution tag if no Security Solution tags were found', async () => { diff --git a/x-pack/plugins/security_solution/public/detection_engine/fleet_integrations/api/api_client.ts b/x-pack/plugins/security_solution/public/detection_engine/fleet_integrations/api/api_client.ts index a90f2b0531948..192683f84fc46 100644 --- a/x-pack/plugins/security_solution/public/detection_engine/fleet_integrations/api/api_client.ts +++ b/x-pack/plugins/security_solution/public/detection_engine/fleet_integrations/api/api_client.ts @@ -22,6 +22,7 @@ export const fleetIntegrationsApi: IFleetIntegrationsApiClient = { return http().fetch(GET_INSTALLED_INTEGRATIONS_URL, { method: 'GET', + version: '1', query: { packages: packages?.sort()?.join(','), }, diff --git a/x-pack/plugins/security_solution/public/detection_engine/rule_management/api/api.ts b/x-pack/plugins/security_solution/public/detection_engine/rule_management/api/api.ts index c90b48860bbf6..8a6a70cbee96b 100644 --- a/x-pack/plugins/security_solution/public/detection_engine/rule_management/api/api.ts +++ b/x-pack/plugins/security_solution/public/detection_engine/rule_management/api/api.ts @@ -153,6 +153,7 @@ export const patchRule = async ({ export const previewRule = async ({ rule, signal }: PreviewRulesProps): Promise => KibanaServices.get().http.fetch(DETECTION_ENGINE_RULES_PREVIEW, { method: 'POST', + version: '2023-10-31', body: JSON.stringify(rule), signal, }); @@ -542,6 +543,7 @@ export const findRuleExceptionReferences = async ({ DETECTION_ENGINE_RULES_EXCEPTIONS_REFERENCE_URL, { method: 'GET', + version: '1', query, signal, } @@ -570,6 +572,7 @@ export const addRuleExceptions = async ({ `${DETECTION_ENGINE_RULES_URL}/${ruleId}/exceptions`, { method: 'POST', + version: '2023-10-31', body: JSON.stringify({ items }), signal, } diff --git a/x-pack/plugins/security_solution/public/detections/containers/detection_engine/alerts/api.test.ts b/x-pack/plugins/security_solution/public/detections/containers/detection_engine/alerts/api.test.ts index 601bbf9498617..92801daeba514 100644 --- a/x-pack/plugins/security_solution/public/detections/containers/detection_engine/alerts/api.test.ts +++ b/x-pack/plugins/security_solution/public/detections/containers/detection_engine/alerts/api.test.ts @@ -42,11 +42,14 @@ describe('Detections Alerts API', () => { test('check parameter url, body', async () => { await fetchQueryAlerts({ query: mockAlertsQuery, signal: abortCtrl.signal }); - expect(fetchMock).toHaveBeenCalledWith('/api/detection_engine/signals/search', { - body: '{"aggs":{"alertsByGrouping":{"terms":{"field":"signal.rule.risk_score","missing":"All others","order":{"_count":"desc"},"size":10},"aggs":{"alerts":{"date_histogram":{"field":"@timestamp","fixed_interval":"81000000ms","min_doc_count":0,"extended_bounds":{"min":1579644343954,"max":1582236343955}}}}}},"query":{"bool":{"filter":[{"bool":{"must":[],"filter":[{"match_all":{}}],"should":[],"must_not":[]}},{"range":{"@timestamp":{"gte":1579644343954,"lte":1582236343955}}}]}}}', - method: 'POST', - signal: abortCtrl.signal, - }); + expect(fetchMock).toHaveBeenCalledWith( + '/api/detection_engine/signals/search', + expect.objectContaining({ + body: '{"aggs":{"alertsByGrouping":{"terms":{"field":"signal.rule.risk_score","missing":"All others","order":{"_count":"desc"},"size":10},"aggs":{"alerts":{"date_histogram":{"field":"@timestamp","fixed_interval":"81000000ms","min_doc_count":0,"extended_bounds":{"min":1579644343954,"max":1582236343955}}}}}},"query":{"bool":{"filter":[{"bool":{"must":[],"filter":[{"match_all":{}}],"should":[],"must_not":[]}},{"range":{"@timestamp":{"gte":1579644343954,"lte":1582236343955}}}]}}}', + method: 'POST', + signal: abortCtrl.signal, + }) + ); }); test('happy path', async () => { @@ -70,11 +73,14 @@ describe('Detections Alerts API', () => { signal: abortCtrl.signal, status: 'closed', }); - expect(fetchMock).toHaveBeenCalledWith('/api/detection_engine/signals/status', { - body: '{"conflicts":"proceed","status":"closed","query":{"bool":{"filter":{"terms":{"_id":["b4ee5c32e3a321057edcc953ca17228c6fdfe5ba43fdbbdaffa8cefa11605cc5"]}}}}}', - method: 'POST', - signal: abortCtrl.signal, - }); + expect(fetchMock).toHaveBeenCalledWith( + '/api/detection_engine/signals/status', + expect.objectContaining({ + body: '{"conflicts":"proceed","status":"closed","query":{"bool":{"filter":{"terms":{"_id":["b4ee5c32e3a321057edcc953ca17228c6fdfe5ba43fdbbdaffa8cefa11605cc5"]}}}}}', + method: 'POST', + signal: abortCtrl.signal, + }) + ); }); test('check parameter url, body when opening an alert', async () => { @@ -83,11 +89,14 @@ describe('Detections Alerts API', () => { signal: abortCtrl.signal, status: 'open', }); - expect(fetchMock).toHaveBeenCalledWith('/api/detection_engine/signals/status', { - body: '{"conflicts":"proceed","status":"open","query":{"bool":{"filter":{"terms":{"_id":["b4ee5c32e3a321057edcc953ca17228c6fdfe5ba43fdbbdaffa8cefa11605cc5"]}}}}}', - method: 'POST', - signal: abortCtrl.signal, - }); + expect(fetchMock).toHaveBeenCalledWith( + '/api/detection_engine/signals/status', + expect.objectContaining({ + body: '{"conflicts":"proceed","status":"open","query":{"bool":{"filter":{"terms":{"_id":["b4ee5c32e3a321057edcc953ca17228c6fdfe5ba43fdbbdaffa8cefa11605cc5"]}}}}}', + method: 'POST', + signal: abortCtrl.signal, + }) + ); }); test('happy path', async () => { @@ -112,11 +121,14 @@ describe('Detections Alerts API', () => { signal: abortCtrl.signal, status: 'closed', }); - expect(fetchMock).toHaveBeenCalledWith('/api/detection_engine/signals/status', { - body: '{"status":"closed","signal_ids":["123"]}', - method: 'POST', - signal: abortCtrl.signal, - }); + expect(fetchMock).toHaveBeenCalledWith( + '/api/detection_engine/signals/status', + expect.objectContaining({ + body: '{"status":"closed","signal_ids":["123"]}', + method: 'POST', + signal: abortCtrl.signal, + }) + ); }); test('check parameter url, body when opening an alert', async () => { @@ -125,11 +137,14 @@ describe('Detections Alerts API', () => { signal: abortCtrl.signal, status: 'open', }); - expect(fetchMock).toHaveBeenCalledWith('/api/detection_engine/signals/status', { - body: '{"status":"open","signal_ids":["123"]}', - method: 'POST', - signal: abortCtrl.signal, - }); + expect(fetchMock).toHaveBeenCalledWith( + '/api/detection_engine/signals/status', + expect.objectContaining({ + body: '{"status":"open","signal_ids":["123"]}', + method: 'POST', + signal: abortCtrl.signal, + }) + ); }); test('happy path', async () => { @@ -150,10 +165,13 @@ describe('Detections Alerts API', () => { test('check parameter url', async () => { await getSignalIndex({ signal: abortCtrl.signal }); - expect(fetchMock).toHaveBeenCalledWith('/api/detection_engine/index', { - method: 'GET', - signal: abortCtrl.signal, - }); + expect(fetchMock).toHaveBeenCalledWith( + '/api/detection_engine/index', + expect.objectContaining({ + method: 'GET', + signal: abortCtrl.signal, + }) + ); }); test('happy path', async () => { @@ -172,10 +190,13 @@ describe('Detections Alerts API', () => { test('check parameter url', async () => { await getUserPrivilege({ signal: abortCtrl.signal }); - expect(fetchMock).toHaveBeenCalledWith('/api/detection_engine/privileges', { - method: 'GET', - signal: abortCtrl.signal, - }); + expect(fetchMock).toHaveBeenCalledWith( + '/api/detection_engine/privileges', + expect.objectContaining({ + method: 'GET', + signal: abortCtrl.signal, + }) + ); }); test('happy path', async () => { @@ -194,10 +215,13 @@ describe('Detections Alerts API', () => { test('check parameter url', async () => { await createSignalIndex({ signal: abortCtrl.signal }); - expect(fetchMock).toHaveBeenCalledWith('/api/detection_engine/index', { - method: 'POST', - signal: abortCtrl.signal, - }); + expect(fetchMock).toHaveBeenCalledWith( + '/api/detection_engine/index', + expect.objectContaining({ + method: 'POST', + signal: abortCtrl.signal, + }) + ); }); test('happy path', async () => { @@ -222,10 +246,13 @@ describe('Detections Alerts API', () => { comment: 'commento', caseIds: ['88c04a90-b19c-11eb-b838-bf3c7840b969'], }); - expect(postMock).toHaveBeenCalledWith('/api/endpoint/action/isolate', { - body: '{"endpoint_ids":["fd8a122b-4c54-4c05-b295-e5f8381fc59d"],"comment":"commento","case_ids":["88c04a90-b19c-11eb-b838-bf3c7840b969"]}', - version: '2023-10-31', - }); + expect(postMock).toHaveBeenCalledWith( + '/api/endpoint/action/isolate', + expect.objectContaining({ + body: '{"endpoint_ids":["fd8a122b-4c54-4c05-b295-e5f8381fc59d"],"comment":"commento","case_ids":["88c04a90-b19c-11eb-b838-bf3c7840b969"]}', + version: '2023-10-31', + }) + ); }); test('happy path', async () => { diff --git a/x-pack/plugins/security_solution/public/detections/containers/detection_engine/alerts/api.ts b/x-pack/plugins/security_solution/public/detections/containers/detection_engine/alerts/api.ts index 20f258679f76f..ecd53bbf76a89 100644 --- a/x-pack/plugins/security_solution/public/detections/containers/detection_engine/alerts/api.ts +++ b/x-pack/plugins/security_solution/public/detections/containers/detection_engine/alerts/api.ts @@ -47,6 +47,7 @@ export const fetchQueryAlerts = async ({ return KibanaServices.get().http.fetch>( DETECTION_ENGINE_QUERY_SIGNALS_URL, { + version: '2023-10-31', method: 'POST', body: JSON.stringify(query), signal, @@ -91,6 +92,7 @@ export const updateAlertStatusByQuery = async ({ signal, }: UpdateAlertStatusByQueryProps): Promise => KibanaServices.get().http.fetch(DETECTION_ENGINE_SIGNALS_STATUS_URL, { + version: '2023-10-31', method: 'POST', body: JSON.stringify({ conflicts: 'proceed', status, query }), signal, @@ -111,6 +113,7 @@ export const updateAlertStatusByIds = async ({ signal, }: UpdateAlertStatusByIdsProps): Promise => KibanaServices.get().http.fetch(DETECTION_ENGINE_SIGNALS_STATUS_URL, { + version: '2023-10-31', method: 'POST', body: JSON.stringify({ status, signal_ids: signalIds }), signal, @@ -125,6 +128,7 @@ export const updateAlertStatusByIds = async ({ */ export const getSignalIndex = async ({ signal }: BasicSignals): Promise => KibanaServices.get().http.fetch(DETECTION_ENGINE_INDEX_URL, { + version: '2023-10-31', method: 'GET', signal, }); @@ -138,6 +142,7 @@ export const getSignalIndex = async ({ signal }: BasicSignals): Promise => KibanaServices.get().http.fetch(DETECTION_ENGINE_ALERTS_INDEX_URL, { + version: '2023-10-31', method: 'GET', signal, }); @@ -151,6 +156,7 @@ export const checkSignalIndex = async ({ signal }: BasicSignals): Promise => KibanaServices.get().http.fetch(DETECTION_ENGINE_PRIVILEGES_URL, { + version: '2023-10-31', method: 'GET', signal, }); @@ -164,6 +170,7 @@ export const getUserPrivilege = async ({ signal }: BasicSignals): Promise => KibanaServices.get().http.fetch(DETECTION_ENGINE_INDEX_URL, { + version: '2023-10-31', method: 'POST', signal, }); diff --git a/x-pack/plugins/security_solution/public/exceptions/hooks/use_create_shared_list/index.tsx b/x-pack/plugins/security_solution/public/exceptions/hooks/use_create_shared_list/index.tsx index 4789a762bf71b..4aee4dea525a4 100644 --- a/x-pack/plugins/security_solution/public/exceptions/hooks/use_create_shared_list/index.tsx +++ b/x-pack/plugins/security_solution/public/exceptions/hooks/use_create_shared_list/index.tsx @@ -24,6 +24,7 @@ export const createSharedExceptionList = async ({ description: string; }): Promise => { const res: ExceptionListSchema = await http.post(SHARED_EXCEPTION_LIST_URL, { + version: '2023-10-31', body: JSON.stringify({ name, description }), headers: { 'Content-Type': 'application/json' }, method: 'POST', diff --git a/x-pack/plugins/security_solution/server/lib/dashboards/routes/get_dashboards_by_tags.ts b/x-pack/plugins/security_solution/server/lib/dashboards/routes/get_dashboards_by_tags.ts index 356e4c1996e24..ef4695aea6ea5 100644 --- a/x-pack/plugins/security_solution/server/lib/dashboards/routes/get_dashboards_by_tags.ts +++ b/x-pack/plugins/security_solution/server/lib/dashboards/routes/get_dashboards_by_tags.ts @@ -22,43 +22,48 @@ export const getDashboardsByTagsRoute = ( logger: Logger, security: SetupPlugins['security'] ) => { - router.post( - { + router.versioned + .post({ path: INTERNAL_DASHBOARDS_URL, - validate: { body: buildRouteValidationWithExcess(getDashboardsRequest) }, + access: 'internal', options: { tags: ['access:securitySolution'], }, - }, - async (context, request, response) => { - const frameworkRequest = await buildFrameworkRequest(context, security, request); - const savedObjectsClient = (await frameworkRequest.context.core).savedObjects.client; - const { tagIds } = request.body; + }) + .addVersion( + { + version: '1', + validate: { request: { body: buildRouteValidationWithExcess(getDashboardsRequest) } }, + }, + async (context, request, response) => { + const frameworkRequest = await buildFrameworkRequest(context, security, request); + const savedObjectsClient = (await frameworkRequest.context.core).savedObjects.client; + const { tagIds } = request.body; - try { - const dashboardsResponse = await savedObjectsClient.find({ - type: 'dashboard', - hasReference: tagIds.map((id) => ({ id, type: 'tag' })), - }); - const dashboards = dashboardsResponse.saved_objects ?? []; + try { + const dashboardsResponse = await savedObjectsClient.find({ + type: 'dashboard', + hasReference: tagIds.map((id) => ({ id, type: 'tag' })), + }); + const dashboards = dashboardsResponse.saved_objects ?? []; - return response.ok({ body: dashboards }); - } catch (err) { - const error = transformError(err); - logger.error(`Failed to find dashboards tags - ${JSON.stringify(error.message)}`); + return response.ok({ body: dashboards }); + } catch (err) { + const error = transformError(err); + logger.error(`Failed to find dashboards tags - ${JSON.stringify(error.message)}`); - const siemResponse = buildSiemResponse(response); - return siemResponse.error({ - statusCode: error.statusCode ?? 500, - body: i18n.translate( - 'xpack.securitySolution.dashboards.getSecuritySolutionDashboardsErrorTitle', - { - values: { message: error.message }, - defaultMessage: `Failed to find dashboards - {message}`, - } - ), - }); + const siemResponse = buildSiemResponse(response); + return siemResponse.error({ + statusCode: error.statusCode ?? 500, + body: i18n.translate( + 'xpack.securitySolution.dashboards.getSecuritySolutionDashboardsErrorTitle', + { + values: { message: error.message }, + defaultMessage: `Failed to find dashboards - {message}`, + } + ), + }); + } } - } - ); + ); }; diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/fleet_integrations/api/get_installed_integrations/route.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/fleet_integrations/api/get_installed_integrations/route.ts index e4e4e2f4a6f78..bf13e1f49134e 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/fleet_integrations/api/get_installed_integrations/route.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/fleet_integrations/api/get_installed_integrations/route.ts @@ -21,48 +21,56 @@ export const getInstalledIntegrationsRoute = ( router: SecuritySolutionPluginRouter, logger: Logger ) => { - router.get( - { + router.versioned + .get({ + access: 'internal', path: GET_INSTALLED_INTEGRATIONS_URL, - validate: {}, options: { tags: ['access:securitySolution'], }, - }, - async (context, request, response) => { - const siemResponse = buildSiemResponse(response); + }) + .addVersion( + { + version: '1', + validate: false, + }, + async (context, request, response) => { + const siemResponse = buildSiemResponse(response); - try { - const ctx = await context.resolve(['core', 'securitySolution']); - const fleet = ctx.securitySolution.getInternalFleetServices(); - const set = createInstalledIntegrationSet(); + try { + const ctx = await context.resolve(['core', 'securitySolution']); + const fleet = ctx.securitySolution.getInternalFleetServices(); + const set = createInstalledIntegrationSet(); - // Pulls all packages into memory just like the main fleet landing page - // No pagination support currently, so cannot batch this call - const allThePackages = await fleet.packages.getPackages(); - allThePackages.forEach((fleetPackage) => { - set.addPackage(fleetPackage); - }); + // Pulls all packages into memory just like the main fleet landing page + // No pagination support currently, so cannot batch this call + const allThePackages = await fleet.packages.getPackages(); + allThePackages.forEach((fleetPackage) => { + set.addPackage(fleetPackage); + }); - const packagePolicies = await fleet.packagePolicy.list(fleet.internalReadonlySoClient, {}); - packagePolicies.items.forEach((policy) => { - set.addPackagePolicy(policy); - }); + const packagePolicies = await fleet.packagePolicy.list( + fleet.internalReadonlySoClient, + {} + ); + packagePolicies.items.forEach((policy) => { + set.addPackagePolicy(policy); + }); - const installedIntegrations = set.getIntegrations(); + const installedIntegrations = set.getIntegrations(); - const body: GetInstalledIntegrationsResponse = { - installed_integrations: installedIntegrations, - }; + const body: GetInstalledIntegrationsResponse = { + installed_integrations: installedIntegrations, + }; - return response.ok({ body }); - } catch (err) { - const error = transformError(err); - return siemResponse.error({ - body: error.message, - statusCode: error.statusCode, - }); + return response.ok({ body }); + } catch (err) { + const error = transformError(err); + return siemResponse.error({ + body: error.message, + statusCode: error.statusCode, + }); + } } - } - ); + ); }; diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/routes/index/create_index_route.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/routes/index/create_index_route.ts index bc6d2a6247f34..7053c913e4a3e 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/routes/index/create_index_route.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/routes/index/create_index_route.ts @@ -36,34 +36,39 @@ import { getIndexVersion } from './get_index_version'; import { isOutdated } from '../../migrations/helpers'; export const createIndexRoute = (router: SecuritySolutionPluginRouter) => { - router.post( - { + router.versioned + .post({ path: DETECTION_ENGINE_INDEX_URL, - validate: false, + access: 'public', options: { tags: ['access:securitySolution'], }, - }, - async (context, _, response): Promise> => { - const siemResponse = buildSiemResponse(response); + }) + .addVersion( + { + version: '2023-10-31', + validate: false, + }, + async (context, _, response): Promise> => { + const siemResponse = buildSiemResponse(response); - try { - const securitySolution = await context.securitySolution; - const siemClient = securitySolution?.getAppClient(); - if (!siemClient) { - return siemResponse.error({ statusCode: 404 }); + try { + const securitySolution = await context.securitySolution; + const siemClient = securitySolution?.getAppClient(); + if (!siemClient) { + return siemResponse.error({ statusCode: 404 }); + } + await createDetectionIndex(securitySolution); + return response.ok({ body: { acknowledged: true } }); + } catch (err) { + const error = transformError(err); + return siemResponse.error({ + body: error.message, + statusCode: error.statusCode, + }); } - await createDetectionIndex(securitySolution); - return response.ok({ body: { acknowledged: true } }); - } catch (err) { - const error = transformError(err); - return siemResponse.error({ - body: error.message, - statusCode: error.statusCode, - }); } - } - ); + ); }; export const createDetectionIndex = async ( diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/routes/index/delete_index_route.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/routes/index/delete_index_route.ts index e0f73108bf437..4bad93c04edc0 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/routes/index/delete_index_route.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/routes/index/delete_index_route.ts @@ -31,57 +31,62 @@ import type { DeleteIndexResponse } from '../../../../../common/api/detection_en * And ensuring they're all gone */ export const deleteIndexRoute = (router: SecuritySolutionPluginRouter) => { - router.delete( - { + router.versioned + .delete({ path: DETECTION_ENGINE_INDEX_URL, - validate: false, + access: 'public', options: { tags: ['access:securitySolution'], }, - }, - async (context, _, response): Promise> => { - const siemResponse = buildSiemResponse(response); + }) + .addVersion( + { + version: '2023-10-31', + validate: false, + }, + async (context, _, response): Promise> => { + const siemResponse = buildSiemResponse(response); - try { - const esClient = (await context.core).elasticsearch.client.asCurrentUser; + try { + const esClient = (await context.core).elasticsearch.client.asCurrentUser; - const siemClient = (await context.securitySolution)?.getAppClient(); + const siemClient = (await context.securitySolution)?.getAppClient(); - if (!siemClient) { - return siemResponse.error({ statusCode: 404 }); - } + if (!siemClient) { + return siemResponse.error({ statusCode: 404 }); + } - const index = siemClient.getSignalsIndex(); - const indexExists = await getIndexExists(esClient, index); + const index = siemClient.getSignalsIndex(); + const indexExists = await getIndexExists(esClient, index); - if (!indexExists) { + if (!indexExists) { + return siemResponse.error({ + statusCode: 404, + body: `index: "${index}" does not exist`, + }); + } else { + await deleteAllIndex(esClient, index, true); + const policyExists = await getPolicyExists(esClient, index); + if (policyExists) { + await deletePolicy(esClient, index); + } + const templateExists = await esClient.indices.existsIndexTemplate({ name: index }); + if (templateExists) { + await esClient.indices.deleteIndexTemplate({ name: index }); + } + const legacyTemplateExists = await esClient.indices.existsTemplate({ name: index }); + if (legacyTemplateExists) { + await esClient.indices.deleteTemplate({ name: index }); + } + return response.ok({ body: { acknowledged: true } }); + } + } catch (err) { + const error = transformError(err); return siemResponse.error({ - statusCode: 404, - body: `index: "${index}" does not exist`, + body: error.message, + statusCode: error.statusCode, }); - } else { - await deleteAllIndex(esClient, index, true); - const policyExists = await getPolicyExists(esClient, index); - if (policyExists) { - await deletePolicy(esClient, index); - } - const templateExists = await esClient.indices.existsIndexTemplate({ name: index }); - if (templateExists) { - await esClient.indices.deleteIndexTemplate({ name: index }); - } - const legacyTemplateExists = await esClient.indices.existsTemplate({ name: index }); - if (legacyTemplateExists) { - await esClient.indices.deleteTemplate({ name: index }); - } - return response.ok({ body: { acknowledged: true } }); } - } catch (err) { - const error = transformError(err); - return siemResponse.error({ - body: error.message, - statusCode: error.statusCode, - }); } - } - ); + ); }; diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/routes/index/read_alerts_index_exists_route.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/routes/index/read_alerts_index_exists_route.ts index 7f33c2bad1e20..56f37df726823 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/routes/index/read_alerts_index_exists_route.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/routes/index/read_alerts_index_exists_route.ts @@ -14,41 +14,46 @@ import { buildSiemResponse } from '../utils'; import type { ReadAlertsIndexExistsResponse } from '../../../../../common/api/detection_engine'; export const readAlertsIndexExistsRoute = (router: SecuritySolutionPluginRouter) => { - router.get( - { + router.versioned + .get({ path: DETECTION_ENGINE_ALERTS_INDEX_URL, - validate: false, + access: 'public', options: { tags: ['access:securitySolution'], }, - }, - async (context, _, response): Promise> => { - const siemResponse = buildSiemResponse(response); + }) + .addVersion( + { + version: '2023-10-31', + validate: false, + }, + async (context, _, response): Promise> => { + const siemResponse = buildSiemResponse(response); - try { - const core = await context.core; - const securitySolution = await context.securitySolution; - const siemClient = securitySolution?.getAppClient(); + try { + const core = await context.core; + const securitySolution = await context.securitySolution; + const siemClient = securitySolution?.getAppClient(); - if (!siemClient) { - return siemResponse.error({ statusCode: 404 }); - } + if (!siemClient) { + return siemResponse.error({ statusCode: 404 }); + } - const index = siemClient.getSignalsIndex(); + const index = siemClient.getSignalsIndex(); - const indexExists = await getIndexExists(core.elasticsearch.client.asInternalUser, index); - return response.ok({ - body: { - indexExists, - }, - }); - } catch (err) { - const error = transformError(err); - return siemResponse.error({ - body: error.message, - statusCode: error.statusCode, - }); + const indexExists = await getIndexExists(core.elasticsearch.client.asInternalUser, index); + return response.ok({ + body: { + indexExists, + }, + }); + } catch (err) { + const error = transformError(err); + return siemResponse.error({ + body: error.message, + statusCode: error.statusCode, + }); + } } - } - ); + ); }; diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/routes/index/read_index_route.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/routes/index/read_index_route.ts index 34ccd59f95946..27adbd71be823 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/routes/index/read_index_route.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/routes/index/read_index_route.ts @@ -22,79 +22,84 @@ export const readIndexRoute = ( router: SecuritySolutionPluginRouter, ruleDataService: RuleDataPluginService ) => { - router.get( - { + router.versioned + .get({ path: DETECTION_ENGINE_INDEX_URL, - validate: false, + access: 'public', options: { tags: ['access:securitySolution'], }, - }, - async (context, _, response): Promise> => { - const siemResponse = buildSiemResponse(response); + }) + .addVersion( + { + version: '2023-10-31', + validate: false, + }, + async (context, _, response): Promise> => { + const siemResponse = buildSiemResponse(response); - try { - const core = await context.core; - const securitySolution = await context.securitySolution; + try { + const core = await context.core; + const securitySolution = await context.securitySolution; - const siemClient = securitySolution?.getAppClient(); - const esClient = core.elasticsearch.client.asCurrentUser; + const siemClient = securitySolution?.getAppClient(); + const esClient = core.elasticsearch.client.asCurrentUser; - if (!siemClient) { - return siemResponse.error({ statusCode: 404 }); - } + if (!siemClient) { + return siemResponse.error({ statusCode: 404 }); + } - const spaceId = securitySolution.getSpaceId(); - const indexName = ruleDataService.getResourceName(`security.alerts-${spaceId}`); + const spaceId = securitySolution.getSpaceId(); + const indexName = ruleDataService.getResourceName(`security.alerts-${spaceId}`); - const index = siemClient.getSignalsIndex(); - const indexExists = await getBootstrapIndexExists( - core.elasticsearch.client.asInternalUser, - index - ); + const index = siemClient.getSignalsIndex(); + const indexExists = await getBootstrapIndexExists( + core.elasticsearch.client.asInternalUser, + index + ); - if (indexExists) { - let mappingOutdated: boolean | null = null; - let aliasesOutdated: boolean | null = null; - try { - const indexVersion = await getIndexVersion(esClient, index); - mappingOutdated = isOutdated({ - current: indexVersion, - target: SIGNALS_TEMPLATE_VERSION, - }); - aliasesOutdated = await fieldAliasesOutdated(esClient, index); - } catch (err) { - const error = transformError(err); - // Some users may not have the view_index_metadata permission necessary to check the index mapping version - // so just continue and return null for index_mapping_outdated if the error is a 403 - if (error.statusCode !== 403) { - return siemResponse.error({ - body: error.message, - statusCode: error.statusCode, + if (indexExists) { + let mappingOutdated: boolean | null = null; + let aliasesOutdated: boolean | null = null; + try { + const indexVersion = await getIndexVersion(esClient, index); + mappingOutdated = isOutdated({ + current: indexVersion, + target: SIGNALS_TEMPLATE_VERSION, }); + aliasesOutdated = await fieldAliasesOutdated(esClient, index); + } catch (err) { + const error = transformError(err); + // Some users may not have the view_index_metadata permission necessary to check the index mapping version + // so just continue and return null for index_mapping_outdated if the error is a 403 + if (error.statusCode !== 403) { + return siemResponse.error({ + body: error.message, + statusCode: error.statusCode, + }); + } } + return response.ok({ + body: { + name: indexName, + index_mapping_outdated: mappingOutdated || aliasesOutdated, + }, + }); + } else { + return response.ok({ + body: { + name: indexName, + index_mapping_outdated: false, + }, + }); } - return response.ok({ - body: { - name: indexName, - index_mapping_outdated: mappingOutdated || aliasesOutdated, - }, - }); - } else { - return response.ok({ - body: { - name: indexName, - index_mapping_outdated: false, - }, + } catch (err) { + const error = transformError(err); + return siemResponse.error({ + body: error.message, + statusCode: error.statusCode, }); } - } catch (err) { - const error = transformError(err); - return siemResponse.error({ - body: error.message, - statusCode: error.statusCode, - }); } - } - ); + ); }; diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/routes/privileges/read_privileges_route.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/routes/privileges/read_privileges_route.ts index ebd06e62aab1d..314d2c273b04a 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/routes/privileges/read_privileges_route.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/routes/privileges/read_privileges_route.ts @@ -18,45 +18,50 @@ export const readPrivilegesRoute = ( router: SecuritySolutionPluginRouter, hasEncryptionKey: boolean ) => { - router.get( - { + router.versioned + .get({ path: DETECTION_ENGINE_PRIVILEGES_URL, - validate: false, + access: 'public', options: { tags: ['access:securitySolution'], }, - }, - async (context, request, response): Promise> => { - const siemResponse = buildSiemResponse(response); + }) + .addVersion( + { + version: '2023-10-31', + validate: false, + }, + async (context, request, response): Promise> => { + const siemResponse = buildSiemResponse(response); - try { - const core = await context.core; - const securitySolution = await context.securitySolution; - const esClient = core.elasticsearch.client.asCurrentUser; - const siemClient = securitySolution?.getAppClient(); + try { + const core = await context.core; + const securitySolution = await context.securitySolution; + const esClient = core.elasticsearch.client.asCurrentUser; + const siemClient = securitySolution?.getAppClient(); - if (!siemClient) { - return siemResponse.error({ statusCode: 404 }); - } + if (!siemClient) { + return siemResponse.error({ statusCode: 404 }); + } - const spaceId = securitySolution.getSpaceId(); - const index = securitySolution - .getRuleDataService() - .getResourceName(`security.alerts-${spaceId}`); - const clusterPrivileges = await readPrivileges(esClient, index); - const privileges = merge(clusterPrivileges, { - is_authenticated: request.auth.isAuthenticated ?? false, - has_encryption_key: hasEncryptionKey, - }); + const spaceId = securitySolution.getSpaceId(); + const index = securitySolution + .getRuleDataService() + .getResourceName(`security.alerts-${spaceId}`); + const clusterPrivileges = await readPrivileges(esClient, index); + const privileges = merge(clusterPrivileges, { + is_authenticated: request.auth.isAuthenticated ?? false, + has_encryption_key: hasEncryptionKey, + }); - return response.ok({ body: privileges }); - } catch (err) { - const error = transformError(err); - return siemResponse.error({ - body: error.message, - statusCode: error.statusCode, - }); + return response.ok({ body: privileges }); + } catch (err) { + const error = transformError(err); + return siemResponse.error({ + body: error.message, + statusCode: error.statusCode, + }); + } } - } - ); + ); }; diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/routes/signals/create_signals_migration_route.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/routes/signals/create_signals_migration_route.ts index 25360a12d34b5..198a1992058fa 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/routes/signals/create_signals_migration_route.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/routes/signals/create_signals_migration_route.ts @@ -24,123 +24,129 @@ export const createSignalsMigrationRoute = ( router: SecuritySolutionPluginRouter, security: SetupPlugins['security'] ) => { - router.post( - { + router.versioned + .post({ path: DETECTION_ENGINE_SIGNALS_MIGRATION_URL, - validate: { - body: buildRouteValidation(createSignalsMigrationSchema), - }, + access: 'public', options: { tags: ['access:securitySolution'], }, - }, - async (context, request, response) => { - const siemResponse = buildSiemResponse(response); - const { index: indices, ...reindexOptions } = request.body; + }) + .addVersion( + { + version: '2023-10-31', + validate: { request: { body: buildRouteValidation(createSignalsMigrationSchema) } }, + }, + async (context, request, response) => { + const siemResponse = buildSiemResponse(response); + const { index: indices, ...reindexOptions } = request.body; - try { - const core = await context.core; - const securitySolution = await context.securitySolution; + try { + const core = await context.core; + const securitySolution = await context.securitySolution; - const esClient = core.elasticsearch.client.asCurrentUser; - const soClient = core.savedObjects.client; - const appClient = securitySolution?.getAppClient(); - if (!appClient) { - return siemResponse.error({ statusCode: 404 }); - } - const user = await security?.authc.getCurrentUser(request); - const migrationService = signalsMigrationService({ - esClient, - soClient, - username: user?.username ?? 'elastic', - }); + const esClient = core.elasticsearch.client.asCurrentUser; + const soClient = core.savedObjects.client; + const appClient = securitySolution?.getAppClient(); + if (!appClient) { + return siemResponse.error({ statusCode: 404 }); + } + const user = await security?.authc.getCurrentUser(request); + const migrationService = signalsMigrationService({ + esClient, + soClient, + username: user?.username ?? 'elastic', + }); - const signalsAlias = appClient.getSignalsIndex(); - const currentVersion = await getTemplateVersion({ - alias: signalsAlias, - esClient, - }); + const signalsAlias = appClient.getSignalsIndex(); + const currentVersion = await getTemplateVersion({ + alias: signalsAlias, + esClient, + }); - if (isOutdated({ current: currentVersion, target: SIGNALS_TEMPLATE_VERSION })) { - throw new BadRequestError( - `Cannot migrate due to the signals template being out of date. Latest version: [${SIGNALS_TEMPLATE_VERSION}], template version: [${currentVersion}]. Please visit Detections to automatically update your template, then try again.` - ); - } + if (isOutdated({ current: currentVersion, target: SIGNALS_TEMPLATE_VERSION })) { + throw new BadRequestError( + `Cannot migrate due to the signals template being out of date. Latest version: [${SIGNALS_TEMPLATE_VERSION}], template version: [${currentVersion}]. Please visit Detections to automatically update your template, then try again.` + ); + } - const signalsIndexAliases = await getIndexAliases({ esClient, alias: signalsAlias }); + const signalsIndexAliases = await getIndexAliases({ esClient, alias: signalsAlias }); - const nonSignalsIndices = indices.filter( - (index) => !signalsIndexAliases.some((alias) => alias.index === index) - ); - if (nonSignalsIndices.length > 0) { - throw new BadRequestError( - `The following indices are not signals indices and cannot be migrated: [${nonSignalsIndices.join()}].` + const nonSignalsIndices = indices.filter( + (index) => !signalsIndexAliases.some((alias) => alias.index === index) ); - } + if (nonSignalsIndices.length > 0) { + throw new BadRequestError( + `The following indices are not signals indices and cannot be migrated: [${nonSignalsIndices.join()}].` + ); + } - const indexVersionsByIndex = await getIndexVersionsByIndex({ esClient, index: indices }); - const signalVersionsByIndex = await getSignalVersionsByIndex({ esClient, index: indices }); + const indexVersionsByIndex = await getIndexVersionsByIndex({ esClient, index: indices }); + const signalVersionsByIndex = await getSignalVersionsByIndex({ + esClient, + index: indices, + }); - const migrationResults = await Promise.all( - indices.map(async (index) => { - const indexVersion = indexVersionsByIndex[index] ?? 0; - const signalVersions = signalVersionsByIndex[index] ?? []; + const migrationResults = await Promise.all( + indices.map(async (index) => { + const indexVersion = indexVersionsByIndex[index] ?? 0; + const signalVersions = signalVersionsByIndex[index] ?? []; - if ( - isOutdated({ current: indexVersion, target: currentVersion }) || - signalsAreOutdated({ signalVersions, target: currentVersion }) - ) { - try { - const isWriteIndex = signalsIndexAliases.some( - (alias) => alias.isWriteIndex && alias.index === index - ); - if (isWriteIndex) { - throw new BadRequestError( - 'The specified index is a write index and cannot be migrated.' + if ( + isOutdated({ current: indexVersion, target: currentVersion }) || + signalsAreOutdated({ signalVersions, target: currentVersion }) + ) { + try { + const isWriteIndex = signalsIndexAliases.some( + (alias) => alias.isWriteIndex && alias.index === index ); - } + if (isWriteIndex) { + throw new BadRequestError( + 'The specified index is a write index and cannot be migrated.' + ); + } - const migration = await migrationService.create({ - index, - reindexOptions, - version: currentVersion, - }); + const migration = await migrationService.create({ + index, + reindexOptions, + version: currentVersion, + }); - return { - index: migration.attributes.sourceIndex, - migration_id: migration.id, - migration_index: migration.attributes.destinationIndex, - }; - } catch (err) { - const error = transformError(err); + return { + index: migration.attributes.sourceIndex, + migration_id: migration.id, + migration_index: migration.attributes.destinationIndex, + }; + } catch (err) { + const error = transformError(err); + return { + index, + error: { + message: error.message, + status_code: error.statusCode, + }, + migration_id: null, + migration_index: null, + }; + } + } else { return { index, - error: { - message: error.message, - status_code: error.statusCode, - }, migration_id: null, migration_index: null, }; } - } else { - return { - index, - migration_id: null, - migration_index: null, - }; - } - }) - ); + }) + ); - return response.ok({ body: { indices: migrationResults } }); - } catch (err) { - const error = transformError(err); - return siemResponse.error({ - body: error.message, - statusCode: error.statusCode, - }); + return response.ok({ body: { indices: migrationResults } }); + } catch (err) { + const error = transformError(err); + return siemResponse.error({ + body: error.message, + statusCode: error.statusCode, + }); + } } - } - ); + ); }; diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/routes/signals/delete_signals_migration_route.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/routes/signals/delete_signals_migration_route.ts index da49f0a8ace3a..4a4a38e074c0b 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/routes/signals/delete_signals_migration_route.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/routes/signals/delete_signals_migration_route.ts @@ -20,86 +20,89 @@ export const deleteSignalsMigrationRoute = ( router: SecuritySolutionPluginRouter, security: SetupPlugins['security'] ) => { - router.delete( - { + router.versioned + .delete({ path: DETECTION_ENGINE_SIGNALS_MIGRATION_URL, - validate: { - body: buildRouteValidation(deleteSignalsMigrationSchema), - }, + access: 'public', options: { tags: ['access:securitySolution'], }, - }, - async (context, request, response) => { - const siemResponse = buildSiemResponse(response); - const { migration_ids: migrationIds } = request.body; + }) + .addVersion( + { + version: '2023-10-31', + validate: { request: { body: buildRouteValidation(deleteSignalsMigrationSchema) } }, + }, + async (context, request, response) => { + const siemResponse = buildSiemResponse(response); + const { migration_ids: migrationIds } = request.body; - try { - const core = await context.core; - const securitySolution = await context.securitySolution; + try { + const core = await context.core; + const securitySolution = await context.securitySolution; - const esClient = core.elasticsearch.client.asCurrentUser; - const soClient = core.savedObjects.client; - const appClient = securitySolution?.getAppClient(); - if (!appClient) { - return siemResponse.error({ statusCode: 404 }); - } + const esClient = core.elasticsearch.client.asCurrentUser; + const soClient = core.savedObjects.client; + const appClient = securitySolution?.getAppClient(); + if (!appClient) { + return siemResponse.error({ statusCode: 404 }); + } - const user = await security?.authc.getCurrentUser(request); - const migrationService = signalsMigrationService({ - esClient, - soClient, - username: user?.username ?? 'elastic', - }); + const user = await security?.authc.getCurrentUser(request); + const migrationService = signalsMigrationService({ + esClient, + soClient, + username: user?.username ?? 'elastic', + }); - const signalsAlias = appClient.getSignalsIndex(); - const migrations = await getMigrationSavedObjectsById({ - ids: migrationIds, - soClient, - }); + const signalsAlias = appClient.getSignalsIndex(); + const migrations = await getMigrationSavedObjectsById({ + ids: migrationIds, + soClient, + }); - const deletionResults = await Promise.all( - migrations.map(async (migration) => { - try { - const deletedMigration = await migrationService.delete({ - migration, - signalsAlias, - }); + const deletionResults = await Promise.all( + migrations.map(async (migration) => { + try { + const deletedMigration = await migrationService.delete({ + migration, + signalsAlias, + }); - return { - id: deletedMigration.id, - destinationIndex: deletedMigration.attributes.destinationIndex, - status: deletedMigration.attributes.status, - sourceIndex: deletedMigration.attributes.sourceIndex, - version: deletedMigration.attributes.version, - updated: deletedMigration.attributes.updated, - }; - } catch (err) { - const error = transformError(err); - return { - id: migration.id, - destinationIndex: migration.attributes.destinationIndex, - error: { - message: error.message, - status_code: error.statusCode, - }, - status: migration.attributes.status, - sourceIndex: migration.attributes.sourceIndex, - version: migration.attributes.version, - updated: migration.attributes.updated, - }; - } - }) - ); + return { + id: deletedMigration.id, + destinationIndex: deletedMigration.attributes.destinationIndex, + status: deletedMigration.attributes.status, + sourceIndex: deletedMigration.attributes.sourceIndex, + version: deletedMigration.attributes.version, + updated: deletedMigration.attributes.updated, + }; + } catch (err) { + const error = transformError(err); + return { + id: migration.id, + destinationIndex: migration.attributes.destinationIndex, + error: { + message: error.message, + status_code: error.statusCode, + }, + status: migration.attributes.status, + sourceIndex: migration.attributes.sourceIndex, + version: migration.attributes.version, + updated: migration.attributes.updated, + }; + } + }) + ); - return response.ok({ body: { migrations: deletionResults } }); - } catch (err) { - const error = transformError(err); - return siemResponse.error({ - body: error.message, - statusCode: error.statusCode, - }); + return response.ok({ body: { migrations: deletionResults } }); + } catch (err) { + const error = transformError(err); + return siemResponse.error({ + body: error.message, + statusCode: error.statusCode, + }); + } } - } - ); + ); }; diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/routes/signals/finalize_signals_migration_route.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/routes/signals/finalize_signals_migration_route.ts index 0cdcef4e987d6..12d6520fa52d1 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/routes/signals/finalize_signals_migration_route.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/routes/signals/finalize_signals_migration_route.ts @@ -23,95 +23,98 @@ export const finalizeSignalsMigrationRoute = ( ruleDataService: RuleDataPluginService, security: SetupPlugins['security'] ) => { - router.post( - { + router.versioned + .post({ path: DETECTION_ENGINE_SIGNALS_FINALIZE_MIGRATION_URL, - validate: { - body: buildRouteValidation(finalizeSignalsMigrationSchema), - }, + access: 'public', options: { tags: ['access:securitySolution'], }, - }, - async (context, request, response) => { - const siemResponse = buildSiemResponse(response); + }) + .addVersion( + { + version: '2023-10-31', + validate: { request: { body: buildRouteValidation(finalizeSignalsMigrationSchema) } }, + }, + async (context, request, response) => { + const siemResponse = buildSiemResponse(response); - const core = await context.core; - const securitySolution = await context.securitySolution; + const core = await context.core; + const securitySolution = await context.securitySolution; - const esClient = core.elasticsearch.client.asCurrentUser; - const soClient = core.savedObjects.client; - const { migration_ids: migrationIds } = request.body; + const esClient = core.elasticsearch.client.asCurrentUser; + const soClient = core.savedObjects.client; + const { migration_ids: migrationIds } = request.body; - try { - const appClient = securitySolution?.getAppClient(); - if (!appClient) { - return siemResponse.error({ statusCode: 404 }); - } - const user = await security?.authc.getCurrentUser(request); - const migrationService = signalsMigrationService({ - esClient, - soClient, - username: user?.username ?? 'elastic', - }); - const migrations = await getMigrationSavedObjectsById({ - ids: migrationIds, - soClient, - }); + try { + const appClient = securitySolution?.getAppClient(); + if (!appClient) { + return siemResponse.error({ statusCode: 404 }); + } + const user = await security?.authc.getCurrentUser(request); + const migrationService = signalsMigrationService({ + esClient, + soClient, + username: user?.username ?? 'elastic', + }); + const migrations = await getMigrationSavedObjectsById({ + ids: migrationIds, + soClient, + }); - const spaceId = securitySolution.getSpaceId(); - const signalsAlias = ruleDataService.getResourceName(`security.alerts-${spaceId}`); - const finalizeResults = await Promise.all( - migrations.map(async (migration) => { - try { - const finalizedMigration = await migrationService.finalize({ - migration, - signalsAlias, - }); + const spaceId = securitySolution.getSpaceId(); + const signalsAlias = ruleDataService.getResourceName(`security.alerts-${spaceId}`); + const finalizeResults = await Promise.all( + migrations.map(async (migration) => { + try { + const finalizedMigration = await migrationService.finalize({ + migration, + signalsAlias, + }); - if (isMigrationFailed(finalizedMigration)) { - throw new BadRequestError( - finalizedMigration.attributes.error ?? 'The migration was not successful.' - ); - } + if (isMigrationFailed(finalizedMigration)) { + throw new BadRequestError( + finalizedMigration.attributes.error ?? 'The migration was not successful.' + ); + } - return { - id: finalizedMigration.id, - completed: !isMigrationPending(finalizedMigration), - destinationIndex: finalizedMigration.attributes.destinationIndex, - status: finalizedMigration.attributes.status, - sourceIndex: finalizedMigration.attributes.sourceIndex, - version: finalizedMigration.attributes.version, - updated: finalizedMigration.attributes.updated, - }; - } catch (err) { - const error = transformError(err); - return { - id: migration.id, - destinationIndex: migration.attributes.destinationIndex, - error: { - message: error.message, - status_code: error.statusCode, - }, - status: migration.attributes.status, - sourceIndex: migration.attributes.sourceIndex, - version: migration.attributes.version, - updated: migration.attributes.updated, - }; - } - }) - ); + return { + id: finalizedMigration.id, + completed: !isMigrationPending(finalizedMigration), + destinationIndex: finalizedMigration.attributes.destinationIndex, + status: finalizedMigration.attributes.status, + sourceIndex: finalizedMigration.attributes.sourceIndex, + version: finalizedMigration.attributes.version, + updated: finalizedMigration.attributes.updated, + }; + } catch (err) { + const error = transformError(err); + return { + id: migration.id, + destinationIndex: migration.attributes.destinationIndex, + error: { + message: error.message, + status_code: error.statusCode, + }, + status: migration.attributes.status, + sourceIndex: migration.attributes.sourceIndex, + version: migration.attributes.version, + updated: migration.attributes.updated, + }; + } + }) + ); - return response.ok({ - body: { migrations: finalizeResults }, - }); - } catch (err) { - const error = transformError(err); - return siemResponse.error({ - body: error.message, - statusCode: error.statusCode, - }); + return response.ok({ + body: { migrations: finalizeResults }, + }); + } catch (err) { + const error = transformError(err); + return siemResponse.error({ + body: error.message, + statusCode: error.statusCode, + }); + } } - } - ); + ); }; diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/routes/signals/get_signals_migration_status_route.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/routes/signals/get_signals_migration_status_route.ts index 7ceecf83268cf..dbf6d97d4b72b 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/routes/signals/get_signals_migration_status_route.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/routes/signals/get_signals_migration_status_route.ts @@ -19,83 +19,86 @@ import { getTemplateVersion } from '../index/check_template_version'; import { buildSiemResponse } from '../utils'; export const getSignalsMigrationStatusRoute = (router: SecuritySolutionPluginRouter) => { - router.get( - { + router.versioned + .get({ path: DETECTION_ENGINE_SIGNALS_MIGRATION_STATUS_URL, - validate: { - query: buildRouteValidation(getSignalsMigrationStatusSchema), - }, + access: 'public', options: { tags: ['access:securitySolution'], }, - }, - async (context, request, response) => { - const siemResponse = buildSiemResponse(response); + }) + .addVersion( + { + version: '2023-10-31', + validate: { request: { query: buildRouteValidation(getSignalsMigrationStatusSchema) } }, + }, + async (context, request, response) => { + const siemResponse = buildSiemResponse(response); - const core = await context.core; - const securitySolution = await context.securitySolution; + const core = await context.core; + const securitySolution = await context.securitySolution; - const esClient = core.elasticsearch.client.asCurrentUser; - const soClient = core.savedObjects.client; + const esClient = core.elasticsearch.client.asCurrentUser; + const soClient = core.savedObjects.client; - try { - const appClient = securitySolution?.getAppClient(); - if (!appClient) { - return siemResponse.error({ statusCode: 404 }); - } - const { from } = request.query; + try { + const appClient = securitySolution?.getAppClient(); + if (!appClient) { + return siemResponse.error({ statusCode: 404 }); + } + const { from } = request.query; - const signalsAlias = appClient.getSignalsIndex(); - const currentVersion = await getTemplateVersion({ alias: signalsAlias, esClient }); - const indexAliases = await getIndexAliases({ alias: signalsAlias, esClient }); - const signalsIndices = indexAliases.map((indexAlias) => indexAlias.index); - const indicesInRange = await getSignalsIndicesInRange({ - esClient, - index: signalsIndices, - from, - }); - const migrationsByIndex = await getMigrationSavedObjectsByIndex({ - index: indicesInRange, - soClient, - }); - const indexVersionsByIndex = await getIndexVersionsByIndex({ - esClient, - index: indicesInRange, - }); - const signalVersionsByIndex = await getSignalVersionsByIndex({ - esClient, - index: indicesInRange, - }); + const signalsAlias = appClient.getSignalsIndex(); + const currentVersion = await getTemplateVersion({ alias: signalsAlias, esClient }); + const indexAliases = await getIndexAliases({ alias: signalsAlias, esClient }); + const signalsIndices = indexAliases.map((indexAlias) => indexAlias.index); + const indicesInRange = await getSignalsIndicesInRange({ + esClient, + index: signalsIndices, + from, + }); + const migrationsByIndex = await getMigrationSavedObjectsByIndex({ + index: indicesInRange, + soClient, + }); + const indexVersionsByIndex = await getIndexVersionsByIndex({ + esClient, + index: indicesInRange, + }); + const signalVersionsByIndex = await getSignalVersionsByIndex({ + esClient, + index: indicesInRange, + }); - const indexStatuses = indicesInRange.map((index) => { - const version = indexVersionsByIndex[index] ?? 0; - const signalVersions = signalVersionsByIndex[index] ?? []; - const migrations = migrationsByIndex[index] ?? []; + const indexStatuses = indicesInRange.map((index) => { + const version = indexVersionsByIndex[index] ?? 0; + const signalVersions = signalVersionsByIndex[index] ?? []; + const migrations = migrationsByIndex[index] ?? []; - return { - index, - version, - signal_versions: signalVersions, - migrations: migrations.map((m) => ({ - id: m.id, - status: m.attributes.status, - version: m.attributes.version, - updated: m.attributes.updated, - })), - is_outdated: - isOutdated({ current: version, target: currentVersion }) || - signalsAreOutdated({ signalVersions, target: currentVersion }), - }; - }); + return { + index, + version, + signal_versions: signalVersions, + migrations: migrations.map((m) => ({ + id: m.id, + status: m.attributes.status, + version: m.attributes.version, + updated: m.attributes.updated, + })), + is_outdated: + isOutdated({ current: version, target: currentVersion }) || + signalsAreOutdated({ signalVersions, target: currentVersion }), + }; + }); - return response.ok({ body: { indices: indexStatuses } }); - } catch (err) { - const error = transformError(err); - return siemResponse.error({ - body: error.message, - statusCode: error.statusCode, - }); + return response.ok({ body: { indices: indexStatuses } }); + } catch (err) { + const error = transformError(err); + return siemResponse.error({ + body: error.message, + statusCode: error.statusCode, + }); + } } - } - ); + ); }; diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/routes/signals/open_close_signals_route.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/routes/signals/open_close_signals_route.ts index 42d4b81ffa703..c3060fcc93b88 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/routes/signals/open_close_signals_route.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/routes/signals/open_close_signals_route.ts @@ -35,84 +35,92 @@ export const setSignalsStatusRoute = ( security: SetupPlugins['security'], sender: ITelemetryEventsSender ) => { - router.post( - { + router.versioned + .post({ path: DETECTION_ENGINE_SIGNALS_STATUS_URL, - validate: { - body: buildRouteValidation( - setSignalsStatusSchema - ), - }, + access: 'public', options: { tags: ['access:securitySolution'], }, - }, - async (context, request, response) => { - const { conflicts, signal_ids: signalIds, query, status } = request.body; - const core = await context.core; - const securitySolution = await context.securitySolution; - const esClient = core.elasticsearch.client.asCurrentUser; - const siemClient = securitySolution?.getAppClient(); - const siemResponse = buildSiemResponse(response); - const validationErrors = setSignalStatusValidateTypeDependents(request.body); - const spaceId = securitySolution?.getSpaceId() ?? 'default'; + }) + .addVersion( + { + version: '2023-10-31', + validate: { + request: { + body: buildRouteValidation< + typeof setSignalsStatusSchema, + SetSignalsStatusSchemaDecoded + >(setSignalsStatusSchema), + }, + }, + }, + async (context, request, response) => { + const { conflicts, signal_ids: signalIds, query, status } = request.body; + const core = await context.core; + const securitySolution = await context.securitySolution; + const esClient = core.elasticsearch.client.asCurrentUser; + const siemClient = securitySolution?.getAppClient(); + const siemResponse = buildSiemResponse(response); + const validationErrors = setSignalStatusValidateTypeDependents(request.body); + const spaceId = securitySolution?.getSpaceId() ?? 'default'; - if (validationErrors.length) { - return siemResponse.error({ statusCode: 400, body: validationErrors }); - } + if (validationErrors.length) { + return siemResponse.error({ statusCode: 400, body: validationErrors }); + } - if (!siemClient) { - return siemResponse.error({ statusCode: 404 }); - } + if (!siemClient) { + return siemResponse.error({ statusCode: 404 }); + } - const clusterId = sender.getClusterID(); - const [isTelemetryOptedIn, username] = await Promise.all([ - sender.isTelemetryOptedIn(), - security?.authc.getCurrentUser(request)?.username, - ]); - if (isTelemetryOptedIn && clusterId) { - // Sometimes the ids are in the query not passed in the request? - const toSendAlertIds = get(query, 'bool.filter.terms._id') || signalIds; - // Get Context for Insights Payloads - const sessionId = getSessionIDfromKibanaRequest(clusterId, request); - if (username && toSendAlertIds && sessionId && status) { - const insightsPayloads = createAlertStatusPayloads( - clusterId, - toSendAlertIds, - sessionId, - username, - DETECTION_ENGINE_SIGNALS_STATUS_URL, - status - ); - logger.debug(`Sending Insights Payloads ${JSON.stringify(insightsPayloads)}`); - await sender.sendOnDemand(INSIGHTS_CHANNEL, insightsPayloads); + const clusterId = sender.getClusterID(); + const [isTelemetryOptedIn, username] = await Promise.all([ + sender.isTelemetryOptedIn(), + security?.authc.getCurrentUser(request)?.username, + ]); + if (isTelemetryOptedIn && clusterId) { + // Sometimes the ids are in the query not passed in the request? + const toSendAlertIds = get(query, 'bool.filter.terms._id') || signalIds; + // Get Context for Insights Payloads + const sessionId = getSessionIDfromKibanaRequest(clusterId, request); + if (username && toSendAlertIds && sessionId && status) { + const insightsPayloads = createAlertStatusPayloads( + clusterId, + toSendAlertIds, + sessionId, + username, + DETECTION_ENGINE_SIGNALS_STATUS_URL, + status + ); + logger.debug(`Sending Insights Payloads ${JSON.stringify(insightsPayloads)}`); + await sender.sendOnDemand(INSIGHTS_CHANNEL, insightsPayloads); + } } - } - try { - if (signalIds) { - const body = await updateSignalsStatusByIds(status, signalIds, spaceId, esClient); - return response.ok({ body }); - } else { - const body = await updateSignalsStatusByQuery( - status, - query, - { conflicts: conflicts ?? 'abort' }, - spaceId, - esClient - ); - return response.ok({ body }); + try { + if (signalIds) { + const body = await updateSignalsStatusByIds(status, signalIds, spaceId, esClient); + return response.ok({ body }); + } else { + const body = await updateSignalsStatusByQuery( + status, + query, + { conflicts: conflicts ?? 'abort' }, + spaceId, + esClient + ); + return response.ok({ body }); + } + } catch (err) { + // error while getting or updating signal with id: id in signal index .siem-signals + const error = transformError(err); + return siemResponse.error({ + body: error.message, + statusCode: error.statusCode, + }); } - } catch (err) { - // error while getting or updating signal with id: id in signal index .siem-signals - const error = transformError(err); - return siemResponse.error({ - body: error.message, - statusCode: error.statusCode, - }); } - } - ); + ); }; const updateSignalsStatusByIds = async ( diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/routes/signals/query_signals_route.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/routes/signals/query_signals_route.ts index 922a032ffc78f..673b6c2d85818 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/routes/signals/query_signals_route.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/routes/signals/query_signals_route.ts @@ -20,63 +20,70 @@ export const querySignalsRoute = ( router: SecuritySolutionPluginRouter, ruleDataClient: IRuleDataClient | null ) => { - router.post( - { + router.versioned + .post({ path: DETECTION_ENGINE_QUERY_SIGNALS_URL, - validate: { - body: buildRouteValidation( - querySignalsSchema - ), - }, + access: 'public', options: { tags: ['access:securitySolution'], }, - }, - async (context, request, response) => { - // eslint-disable-next-line @typescript-eslint/naming-convention - const { query, aggs, _source, fields, track_total_hits, size, runtime_mappings, sort } = - request.body; - const siemResponse = buildSiemResponse(response); - if ( - query == null && - aggs == null && - _source == null && - fields == null && - track_total_hits == null && - size == null && - sort == null - ) { - return siemResponse.error({ - statusCode: 400, - body: '"value" must have at least 1 children', - }); - } - - try { - const spaceId = (await context.securitySolution).getSpaceId(); - const result = await ruleDataClient?.getReader({ namespace: spaceId }).search({ - body: { - query, - // Note: I use a spread operator to please TypeScript with aggs: { ...aggs } - aggs: { ...aggs }, - _source, - fields, - track_total_hits, - size, - runtime_mappings: runtime_mappings as MappingRuntimeFields, - sort: sort as Sort, + }) + .addVersion( + { + version: '2023-10-31', + validate: { + request: { + body: buildRouteValidation( + querySignalsSchema + ), }, - ignore_unavailable: true, - }); - return response.ok({ body: result }); - } catch (err) { - // error while getting or updating signal with id: id in signal index .siem-signals - const error = transformError(err); - return siemResponse.error({ - body: error.message, - statusCode: error.statusCode, - }); + }, + }, + async (context, request, response) => { + // eslint-disable-next-line @typescript-eslint/naming-convention + const { query, aggs, _source, fields, track_total_hits, size, runtime_mappings, sort } = + request.body; + const siemResponse = buildSiemResponse(response); + if ( + query == null && + aggs == null && + _source == null && + fields == null && + track_total_hits == null && + size == null && + sort == null + ) { + return siemResponse.error({ + statusCode: 400, + body: '"value" must have at least 1 children', + }); + } + + try { + const spaceId = (await context.securitySolution).getSpaceId(); + const result = await ruleDataClient?.getReader({ namespace: spaceId }).search({ + body: { + query, + // Note: I use a spread operator to please TypeScript with aggs: { ...aggs } + aggs: { ...aggs }, + _source, + fields, + track_total_hits, + size, + runtime_mappings: runtime_mappings as MappingRuntimeFields, + sort: sort as Sort, + }, + ignore_unavailable: true, + }); + return response.ok({ body: result }); + } catch (err) { + // error while getting or updating signal with id: id in signal index .siem-signals + const error = transformError(err); + return siemResponse.error({ + body: error.message, + statusCode: error.statusCode, + }); + } } - } - ); + ); }; diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/routes/signals/set_alert_tags_route.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/routes/signals/set_alert_tags_route.ts index 1fc13037e1f9a..36d3e57169cce 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/routes/signals/set_alert_tags_route.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/routes/signals/set_alert_tags_route.ts @@ -19,42 +19,50 @@ import { buildRouteValidation } from '../../../../utils/build_validation/route_v import { validateAlertTagsArrays } from './helpers'; export const setAlertTagsRoute = (router: SecuritySolutionPluginRouter) => { - router.post( - { + router.versioned + .post({ path: DETECTION_ENGINE_ALERT_TAGS_URL, - validate: { - body: buildRouteValidation( - setAlertTagsRequestBody - ), - }, + access: 'public', options: { tags: ['access:securitySolution'], }, - }, - async (context, request, response) => { - const { tags, ids } = request.body; - const core = await context.core; - const securitySolution = await context.securitySolution; - const esClient = core.elasticsearch.client.asCurrentUser; - const siemClient = securitySolution?.getAppClient(); - const siemResponse = buildSiemResponse(response); - const validationErrors = validateAlertTagsArrays(tags, ids); - const spaceId = securitySolution?.getSpaceId() ?? 'default'; + }) + .addVersion( + { + version: '2023-10-31', + validate: { + request: { + body: buildRouteValidation< + typeof setAlertTagsRequestBody, + SetAlertTagsRequestBodyDecoded + >(setAlertTagsRequestBody), + }, + }, + }, + async (context, request, response) => { + const { tags, ids } = request.body; + const core = await context.core; + const securitySolution = await context.securitySolution; + const esClient = core.elasticsearch.client.asCurrentUser; + const siemClient = securitySolution?.getAppClient(); + const siemResponse = buildSiemResponse(response); + const validationErrors = validateAlertTagsArrays(tags, ids); + const spaceId = securitySolution?.getSpaceId() ?? 'default'; - if (validationErrors.length) { - return siemResponse.error({ statusCode: 400, body: validationErrors }); - } + if (validationErrors.length) { + return siemResponse.error({ statusCode: 400, body: validationErrors }); + } - if (!siemClient) { - return siemResponse.error({ statusCode: 404 }); - } + if (!siemClient) { + return siemResponse.error({ statusCode: 404 }); + } - const tagsToAdd = uniq(tags.tags_to_add); - const tagsToRemove = uniq(tags.tags_to_remove); + const tagsToAdd = uniq(tags.tags_to_add); + const tagsToRemove = uniq(tags.tags_to_remove); - const painlessScript = { - params: { tagsToAdd, tagsToRemove }, - source: `List newTagsArray = []; + const painlessScript = { + params: { tagsToAdd, tagsToRemove }, + source: `List newTagsArray = []; if (ctx._source["kibana.alert.workflow_tags"] != null) { for (tag in ctx._source["kibana.alert.workflow_tags"]) { if (!params.tagsToRemove.contains(tag)) { @@ -71,45 +79,45 @@ export const setAlertTagsRoute = (router: SecuritySolutionPluginRouter) => { ctx._source["kibana.alert.workflow_tags"] = params.tagsToAdd; } `, - lang: 'painless', - }; + lang: 'painless', + }; - const bulkUpdateRequest = []; - for (const id of ids) { - bulkUpdateRequest.push( - { - update: { - _index: `${DEFAULT_ALERTS_INDEX}-${spaceId}`, - _id: id, + const bulkUpdateRequest = []; + for (const id of ids) { + bulkUpdateRequest.push( + { + update: { + _index: `${DEFAULT_ALERTS_INDEX}-${spaceId}`, + _id: id, + }, }, - }, - { - script: painlessScript, - } - ); - } + { + script: painlessScript, + } + ); + } - try { - const body = await esClient.updateByQuery({ - index: `${DEFAULT_ALERTS_INDEX}-${spaceId}`, - refresh: false, - body: { - script: painlessScript, - query: { - bool: { - filter: { terms: { _id: ids } }, + try { + const body = await esClient.updateByQuery({ + index: `${DEFAULT_ALERTS_INDEX}-${spaceId}`, + refresh: false, + body: { + script: painlessScript, + query: { + bool: { + filter: { terms: { _id: ids } }, + }, }, }, - }, - }); - return response.ok({ body }); - } catch (err) { - const error = transformError(err); - return siemResponse.error({ - body: error.message, - statusCode: error.statusCode, - }); + }); + return response.ok({ body }); + } catch (err) { + const error = transformError(err); + return siemResponse.error({ + body: error.message, + statusCode: error.statusCode, + }); + } } - } - ); + ); }; diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/routes/telemetry/telemetry_detection_rules_preview_route.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/routes/telemetry/telemetry_detection_rules_preview_route.ts index 077aa561ef82d..271e6e7d27749 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/routes/telemetry/telemetry_detection_rules_preview_route.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/routes/telemetry/telemetry_detection_rules_preview_route.ts @@ -22,47 +22,52 @@ export const telemetryDetectionRulesPreviewRoute = ( telemetryReceiver: ITelemetryReceiver, telemetrySender: ITelemetryEventsSender ) => { - router.get( - { + router.versioned + .get({ path: SECURITY_TELEMETRY_URL, - validate: false, + access: 'internal', options: { tags: ['access:securitySolution'], }, - }, - async (context, request, response) => { - const detectionRules = await getDetectionRulesPreview({ - logger, - telemetryReceiver, - telemetrySender, - }); + }) + .addVersion( + { + version: '1', + validate: false, + }, + async (context, request, response) => { + const detectionRules = await getDetectionRulesPreview({ + logger, + telemetryReceiver, + telemetrySender, + }); - const securityLists = await getSecurityListsPreview({ - logger, - telemetryReceiver, - telemetrySender, - }); + const securityLists = await getSecurityListsPreview({ + logger, + telemetryReceiver, + telemetrySender, + }); - const endpoints = await getEndpointPreview({ - logger, - telemetryReceiver, - telemetrySender, - }); + const endpoints = await getEndpointPreview({ + logger, + telemetryReceiver, + telemetrySender, + }); - const diagnostics = await getDiagnosticsPreview({ - logger, - telemetryReceiver, - telemetrySender, - }); + const diagnostics = await getDiagnosticsPreview({ + logger, + telemetryReceiver, + telemetrySender, + }); - return response.ok({ - body: { - detection_rules: detectionRules, - security_lists: securityLists, - endpoints, - diagnostics, - }, - }); - } - ); + return response.ok({ + body: { + detection_rules: detectionRules, + security_lists: securityLists, + endpoints, + diagnostics, + }, + }); + } + ); }; diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rule_actions_legacy/api/create_legacy_notification/route.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/rule_actions_legacy/api/create_legacy_notification/route.ts index 5b20d410db8ce..df2c4bb3366b9 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rule_actions_legacy/api/create_legacy_notification/route.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rule_actions_legacy/api/create_legacy_notification/route.ts @@ -17,6 +17,7 @@ import { legacyReadNotifications } from '../../logic/notifications/legacy_read_n import type { LegacyRuleNotificationAlertTypeParams } from '../../logic/notifications/legacy_types'; // eslint-disable-next-line no-restricted-imports import { legacyCreateNotifications } from '../../logic/notifications/legacy_create_notifications'; +import { UPDATE_OR_CREATE_LEGACY_ACTIONS } from '../../../../../../common/constants'; /** * Given an "alert_id" and a valid "action_id" this will create a legacy notification. This is for testing @@ -29,86 +30,93 @@ export const legacyCreateLegacyNotificationRoute = ( router: SecuritySolutionPluginRouter, logger: Logger ): void => { - router.post( - { - path: '/internal/api/detection/legacy/notifications', - validate: { - query: schema.object({ alert_id: schema.string() }), - body: schema.object({ - name: schema.string(), - interval: schema.string(), - actions: schema.arrayOf( - schema.object({ - id: schema.string(), - group: schema.string(), - params: schema.object({ - message: schema.string(), - }), - actionTypeId: schema.string(), - }) - ), - }), - }, + router.versioned + .post({ + path: UPDATE_OR_CREATE_LEGACY_ACTIONS, + access: 'internal', options: { tags: ['access:securitySolution'], }, - }, - async (context, request, response) => { - const rulesClient = (await context.alerting).getRulesClient(); - const savedObjectsClient = (await context.core).savedObjects.client; - const { alert_id: ruleAlertId } = request.query; - const { actions, interval, name } = request.body; - try { - // This is to ensure it exists before continuing. - await rulesClient.get({ id: ruleAlertId }); - const notification = await legacyReadNotifications({ - rulesClient, - id: undefined, - ruleAlertId, - }); - if (notification != null) { - await rulesClient.update({ - id: notification.id, - data: { - tags: [], - name, - schedule: { - interval, + }) + .addVersion( + { + version: '1', + validate: { + request: { + query: schema.object({ alert_id: schema.string() }), + body: schema.object({ + name: schema.string(), + interval: schema.string(), + actions: schema.arrayOf( + schema.object({ + id: schema.string(), + group: schema.string(), + params: schema.object({ + message: schema.string(), + }), + actionTypeId: schema.string(), + }) + ), + }), + }, + }, + }, + async (context, request, response) => { + const rulesClient = (await context.alerting).getRulesClient(); + const savedObjectsClient = (await context.core).savedObjects.client; + const { alert_id: ruleAlertId } = request.query; + const { actions, interval, name } = request.body; + try { + // This is to ensure it exists before continuing. + await rulesClient.get({ id: ruleAlertId }); + const notification = await legacyReadNotifications({ + rulesClient, + id: undefined, + ruleAlertId, + }); + if (notification != null) { + await rulesClient.update({ + id: notification.id, + data: { + tags: [], + name, + schedule: { + interval, + }, + actions, + params: { + ruleAlertId, + }, + throttle: null, + notifyWhen: null, }, + }); + } else { + await legacyCreateNotifications({ + rulesClient, actions, - params: { - ruleAlertId, - }, - throttle: null, - notifyWhen: null, - }, - }); - } else { - await legacyCreateNotifications({ - rulesClient, - actions, - enabled: true, + enabled: true, + ruleAlertId, + interval, + name, + }); + } + await legacyUpdateOrCreateRuleActionsSavedObject({ ruleAlertId, - interval, - name, + savedObjectsClient, + actions, + throttle: interval, + logger, }); + } catch (error) { + const message = error instanceof Error ? error.message : 'unknown'; + return response.badRequest({ body: message }); } - await legacyUpdateOrCreateRuleActionsSavedObject({ - ruleAlertId, - savedObjectsClient, - actions, - throttle: interval, - logger, + return response.ok({ + body: { + ok: 'acknowledged', + }, }); - } catch (error) { - const message = error instanceof Error ? error.message : 'unknown'; - return response.badRequest({ body: message }); } - return response.ok({ - body: { - ok: 'acknowledged', - }, - }); - } - ); + ); }; diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rule_exceptions/api/create_rule_exceptions/route.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/rule_exceptions/api/create_rule_exceptions/route.ts index e962b48485020..5f5b29abdf38e 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rule_exceptions/api/create_rule_exceptions/route.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rule_exceptions/api/create_rule_exceptions/route.ts @@ -47,71 +47,83 @@ import { buildSiemResponse } from '../../../routes/utils'; import { buildRouteValidation } from '../../../../../utils/build_validation/route_validation'; export const createRuleExceptionsRoute = (router: SecuritySolutionPluginRouter) => { - router.post( - { + router.versioned + .post({ path: CREATE_RULE_EXCEPTIONS_URL, - validate: { - params: buildRouteValidation< - typeof CreateRuleExceptionsRequestParams, - CreateRuleExceptionsRequestParamsDecoded - >(CreateRuleExceptionsRequestParams), - body: buildRouteValidation< - typeof CreateRuleExceptionsRequestBody, - CreateRuleExceptionsRequestBodyDecoded - >(CreateRuleExceptionsRequestBody), - }, + access: 'public', options: { tags: ['access:securitySolution'], }, - }, - async (context, request, response) => { - const siemResponse = buildSiemResponse(response); - - try { - const ctx = await context.resolve([ - 'core', - 'securitySolution', - 'alerting', - 'licensing', - 'lists', - ]); - const rulesClient = ctx.alerting.getRulesClient(); - const listsClient = ctx.securitySolution.getExceptionListClient(); + }) + .addVersion( + { + version: '2023-10-31', + validate: { + request: { + params: buildRouteValidation< + typeof CreateRuleExceptionsRequestParams, + CreateRuleExceptionsRequestParamsDecoded + >(CreateRuleExceptionsRequestParams), + body: buildRouteValidation< + typeof CreateRuleExceptionsRequestBody, + CreateRuleExceptionsRequestBodyDecoded + >(CreateRuleExceptionsRequestBody), + }, + }, + }, + async (context, request, response) => { + const siemResponse = buildSiemResponse(response); - const { items } = request.body; - const { id: ruleId } = request.params; + try { + const ctx = await context.resolve([ + 'core', + 'securitySolution', + 'alerting', + 'licensing', + 'lists', + ]); + const rulesClient = ctx.alerting.getRulesClient(); + const listsClient = ctx.securitySolution.getExceptionListClient(); - // Check that the rule they're trying to add an exception list to exists - const rule = await readRules({ - rulesClient, - ruleId: undefined, - id: ruleId, - }); + const { items } = request.body; + const { id: ruleId } = request.params; - if (rule == null) { - return siemResponse.error({ - statusCode: 500, - body: `Unable to add exception to rule - rule with id:"${ruleId}" not found`, + // Check that the rule they're trying to add an exception list to exists + const rule = await readRules({ + rulesClient, + ruleId: undefined, + id: ruleId, }); - } - const createdItems = await createRuleExceptions({ items, rule, listsClient, rulesClient }); + if (rule == null) { + return siemResponse.error({ + statusCode: 500, + body: `Unable to add exception to rule - rule with id:"${ruleId}" not found`, + }); + } - const [validated, errors] = validate(createdItems, t.array(exceptionListItemSchema)); - if (errors != null) { - return siemResponse.error({ body: errors, statusCode: 500 }); - } else { - return response.ok({ body: validated ?? {} }); + const createdItems = await createRuleExceptions({ + items, + rule, + listsClient, + rulesClient, + }); + + const [validated, errors] = validate(createdItems, t.array(exceptionListItemSchema)); + if (errors != null) { + return siemResponse.error({ body: errors, statusCode: 500 }); + } else { + return response.ok({ body: validated ?? {} }); + } + } catch (err) { + const error = transformError(err); + return siemResponse.error({ + body: error.message, + statusCode: error.statusCode, + }); } - } catch (err) { - const error = transformError(err); - return siemResponse.error({ - body: error.message, - statusCode: error.statusCode, - }); } - } - ); + ); }; export const createRuleExceptions = async ({ diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rule_exceptions/api/find_exception_references/route.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/rule_exceptions/api/find_exception_references/route.ts index 05e8a58d3e972..be7fbc83aa1ff 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rule_exceptions/api/find_exception_references/route.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rule_exceptions/api/find_exception_references/route.ts @@ -27,105 +27,115 @@ import { enrichFilterWithRuleTypeMapping } from '../../../rule_management/logic/ import type { RuleParams } from '../../../rule_schema'; export const findRuleExceptionReferencesRoute = (router: SecuritySolutionPluginRouter) => { - router.get( - { + router.versioned + .get({ path: DETECTION_ENGINE_RULES_EXCEPTIONS_REFERENCE_URL, - validate: { - query: buildRouteValidation< - typeof findExceptionReferencesOnRuleSchema, - FindExceptionReferencesOnRuleSchemaDecoded - >(findExceptionReferencesOnRuleSchema), - }, + access: 'internal', options: { tags: ['access:securitySolution'], }, - }, - async (context, request, response) => { - const siemResponse = buildSiemResponse(response); + }) + .addVersion( + { + version: '1', + validate: { + request: { + query: buildRouteValidation< + typeof findExceptionReferencesOnRuleSchema, + FindExceptionReferencesOnRuleSchemaDecoded + >(findExceptionReferencesOnRuleSchema), + }, + }, + }, + async (context, request, response) => { + const siemResponse = buildSiemResponse(response); - try { - const { ids, namespace_types: namespaceTypes, list_ids: listIds } = request.query; + try { + const { ids, namespace_types: namespaceTypes, list_ids: listIds } = request.query; - const ctx = await context.resolve(['core', 'securitySolution', 'alerting']); - const rulesClient = ctx.alerting.getRulesClient(); - const listsClient = ctx.securitySolution.getExceptionListClient(); + const ctx = await context.resolve(['core', 'securitySolution', 'alerting']); + const rulesClient = ctx.alerting.getRulesClient(); + const listsClient = ctx.securitySolution.getExceptionListClient(); - if ( - ids != null && - listIds != null && - (ids.length !== namespaceTypes.length || ids.length !== listIds.length) - ) { - return siemResponse.error({ - body: `"ids", "list_ids" and "namespace_types" need to have the same comma separated number of values. Expected "ids" length: ${ids.length} to equal "namespace_types" length: ${namespaceTypes.length} and "list_ids" length: ${listIds.length}.`, - statusCode: 400, - }); - } + if ( + ids != null && + listIds != null && + (ids.length !== namespaceTypes.length || ids.length !== listIds.length) + ) { + return siemResponse.error({ + body: `"ids", "list_ids" and "namespace_types" need to have the same comma separated number of values. Expected "ids" length: ${ids.length} to equal "namespace_types" length: ${namespaceTypes.length} and "list_ids" length: ${listIds.length}.`, + statusCode: 400, + }); + } - const fetchExact = ids != null && listIds != null; - const foundExceptionLists = await listsClient?.findExceptionList({ - filter: fetchExact - ? `(${listIds - .map( - (listId, index) => - `${getSavedObjectType({ - namespaceType: namespaceTypes[index], - })}.attributes.list_id:${listId}` - ) - .join(' OR ')})` - : undefined, - namespaceType: namespaceTypes, - page: 1, - perPage: 10000, - sortField: undefined, - sortOrder: undefined, - }); + const fetchExact = ids != null && listIds != null; + const foundExceptionLists = await listsClient?.findExceptionList({ + filter: fetchExact + ? `(${listIds + .map( + (listId, index) => + `${getSavedObjectType({ + namespaceType: namespaceTypes[index], + })}.attributes.list_id:${listId}` + ) + .join(' OR ')})` + : undefined, + namespaceType: namespaceTypes, + page: 1, + perPage: 10000, + sortField: undefined, + sortOrder: undefined, + }); - if (foundExceptionLists == null) { - return response.ok({ body: { references: [] } }); - } - const references: RuleReferencesSchema[] = await Promise.all( - foundExceptionLists.data.map(async (list, index) => { - const foundRules = await rulesClient.find({ - options: { - perPage: 10000, - filter: enrichFilterWithRuleTypeMapping(null), - hasReference: { - id: list.id, - type: getSavedObjectType({ namespaceType: list.namespace_type }), + if (foundExceptionLists == null) { + return response.ok({ body: { references: [] } }); + } + const references: RuleReferencesSchema[] = await Promise.all( + foundExceptionLists.data.map(async (list, index) => { + const foundRules = await rulesClient.find({ + options: { + perPage: 10000, + filter: enrichFilterWithRuleTypeMapping(null), + hasReference: { + id: list.id, + type: getSavedObjectType({ namespaceType: list.namespace_type }), + }, }, - }, - }); + }); - const ruleData = foundRules.data.map(({ name, id, params }) => ({ - name, - id, - rule_id: params.ruleId, - exception_lists: params.exceptionsList, - })); + const ruleData = foundRules.data.map(({ name, id, params }) => ({ + name, + id, + rule_id: params.ruleId, + exception_lists: params.exceptionsList, + })); - return { - [list.list_id]: { - ...list, - referenced_rules: ruleData, - }, - }; - }) - ); + return { + [list.list_id]: { + ...list, + referenced_rules: ruleData, + }, + }; + }) + ); - const [validated, errors] = validate({ references }, rulesReferencedByExceptionListsSchema); + const [validated, errors] = validate( + { references }, + rulesReferencedByExceptionListsSchema + ); - if (errors != null) { - return siemResponse.error({ statusCode: 500, body: errors }); - } else { - return response.ok({ body: validated ?? { references: [] } }); + if (errors != null) { + return siemResponse.error({ statusCode: 500, body: errors }); + } else { + return response.ok({ body: validated ?? { references: [] } }); + } + } catch (err) { + const error = transformError(err); + return siemResponse.error({ + body: error.message, + statusCode: error.statusCode, + }); } - } catch (err) { - const error = transformError(err); - return siemResponse.error({ - body: error.message, - statusCode: error.statusCode, - }); } - } - ); + ); }; diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rule_preview/api/preview_rules/route.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/rule_preview/api/preview_rules/route.ts index dd283b57d9d6b..21cac11b558ff 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rule_preview/api/preview_rules/route.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rule_preview/api/preview_rules/route.ts @@ -78,407 +78,413 @@ export const previewRulesRoute = async ( getStartServices: StartServicesAccessor, logger: Logger ) => { - router.post( - { + router.versioned + .post({ path: DETECTION_ENGINE_RULES_PREVIEW, - validate: { - body: buildRouteValidation(previewRulesSchema), - }, + access: 'public', options: { tags: ['access:securitySolution', routeLimitedConcurrencyTag(MAX_ROUTE_CONCURRENCY)], }, - }, - async (context, request, response): Promise> => { - const siemResponse = buildSiemResponse(response); - const validationErrors = validateCreateRuleProps(request.body); - const coreContext = await context.core; - if (validationErrors.length) { - return siemResponse.error({ statusCode: 400, body: validationErrors }); - } - try { - const [, { data, security: securityService, share, dataViews }] = await getStartServices(); - const searchSourceClient = await data.search.searchSource.asScoped(request); - const savedObjectsClient = coreContext.savedObjects.client; - const siemClient = (await context.securitySolution).getAppClient(); - - const timeframeEnd = request.body.timeframeEnd; - let invocationCount = request.body.invocationCount; - if (invocationCount < 1) { - return response.ok({ - body: { - logs: [{ errors: ['Invalid invocation count'], warnings: [], duration: 0 }], - previewId: undefined, - isAborted: undefined, - }, - }); + }) + .addVersion( + { + version: '2023-10-31', + validate: { request: { body: buildRouteValidation(previewRulesSchema) } }, + }, + async (context, request, response): Promise> => { + const siemResponse = buildSiemResponse(response); + const validationErrors = validateCreateRuleProps(request.body); + const coreContext = await context.core; + if (validationErrors.length) { + return siemResponse.error({ statusCode: 400, body: validationErrors }); } - - const internalRule = convertCreateAPIToInternalSchema(request.body); - const previewRuleParams = internalRule.params; - - const mlAuthz = buildMlAuthz({ - license: (await context.licensing).license, - ml, - request, - savedObjectsClient, - }); - throwAuthzError(await mlAuthz.validateRuleType(internalRule.params.type)); - - const listsContext = await context.lists; - await listsContext?.getExceptionListClient().createEndpointList(); - - const spaceId = siemClient.getSpaceId(); - const previewId = uuidv4(); - const username = security?.authc.getCurrentUser(request)?.username; - const loggedStatusChanges: Array = []; - const previewRuleExecutionLogger = createPreviewRuleExecutionLogger(loggedStatusChanges); - const runState: Record = {}; - const logs: RulePreviewLogs[] = []; - let isAborted = false; - - const { hasAllRequested } = await securityService.authz - .checkPrivilegesWithRequest(request) - .atSpace(spaceId, { - elasticsearch: { - index: { - [`${DEFAULT_PREVIEW_INDEX}-${spaceId}`]: ['read'], - [`.internal${DEFAULT_PREVIEW_INDEX}-${spaceId}-*`]: ['read'], + try { + const [, { data, security: securityService, share, dataViews }] = + await getStartServices(); + const searchSourceClient = await data.search.searchSource.asScoped(request); + const savedObjectsClient = coreContext.savedObjects.client; + const siemClient = (await context.securitySolution).getAppClient(); + + const timeframeEnd = request.body.timeframeEnd; + let invocationCount = request.body.invocationCount; + if (invocationCount < 1) { + return response.ok({ + body: { + logs: [{ errors: ['Invalid invocation count'], warnings: [], duration: 0 }], + previewId: undefined, + isAborted: undefined, }, - cluster: [], - }, - }); - - if (!hasAllRequested) { - return response.ok({ - body: { - logs: [ - { - errors: [ - 'Missing "read" privileges for the ".preview.alerts-security.alerts" or ".internal.preview.alerts-security.alerts" indices. Without these privileges you cannot use the Rule Preview feature.', - ], - warnings: [], - duration: 0, - }, - ], - previewId: undefined, - isAborted: undefined, - }, - }); - } - - const previewRuleTypeWrapper = createSecurityRuleTypeWrapper({ - ...securityRuleTypeOptions, - ruleDataClient: previewRuleDataClient, - ruleExecutionLoggerFactory: previewRuleExecutionLogger.factory, - isPreview: true, - }); - - const runExecutors = async < - TParams extends RuleParams, - TState extends RuleTypeState, - TInstanceState extends AlertInstanceState, - TInstanceContext extends AlertInstanceContext, - TActionGroupIds extends string = '' - >( - executor: ExecutorType< - TParams, - TState, - TInstanceState, - TInstanceContext, - TActionGroupIds - >, - ruleTypeId: string, - ruleTypeName: string, - params: TParams, - shouldWriteAlerts: () => boolean, - alertFactory: { - create: ( - id: string - ) => Pick< - Alert, - | 'getState' - | 'replaceState' - | 'scheduleActions' - | 'setContext' - | 'getContext' - | 'hasContext' - | 'getUuid' - | 'getStart' - >; - alertLimit: { - getValue: () => number; - setLimitReached: () => void; - }; - done: () => { getRecoveredAlerts: () => [] }; + }); } - ) => { - let statePreview = runState as TState; - - const abortController = new AbortController(); - setTimeout(() => { - abortController.abort(); - isAborted = true; - }, PREVIEW_TIMEOUT_SECONDS * 1000); - - const startedAt = moment(timeframeEnd); - const parsedDuration = parseDuration(internalRule.schedule.interval) ?? 0; - startedAt.subtract(moment.duration(parsedDuration * (invocationCount - 1))); - - let previousStartedAt = null; - - const rule = { - ...internalRule, - id: previewId, - createdAt: new Date(), - createdBy: username ?? 'preview-created-by', - producer: 'preview-producer', - revision: 0, - ruleTypeId, - ruleTypeName, - updatedAt: new Date(), - updatedBy: username ?? 'preview-updated-by', - muteAll: false, - snoozeSchedule: [], - }; - let invocationStartTime; + const internalRule = convertCreateAPIToInternalSchema(request.body); + const previewRuleParams = internalRule.params; - const dataViewsService = await dataViews.dataViewsServiceFactory( + const mlAuthz = buildMlAuthz({ + license: (await context.licensing).license, + ml, + request, savedObjectsClient, - coreContext.elasticsearch.client.asInternalUser - ); + }); + throwAuthzError(await mlAuthz.validateRuleType(internalRule.params.type)); + + const listsContext = await context.lists; + await listsContext?.getExceptionListClient().createEndpointList(); + + const spaceId = siemClient.getSpaceId(); + const previewId = uuidv4(); + const username = security?.authc.getCurrentUser(request)?.username; + const loggedStatusChanges: Array = []; + const previewRuleExecutionLogger = createPreviewRuleExecutionLogger(loggedStatusChanges); + const runState: Record = {}; + const logs: RulePreviewLogs[] = []; + let isAborted = false; + + const { hasAllRequested } = await securityService.authz + .checkPrivilegesWithRequest(request) + .atSpace(spaceId, { + elasticsearch: { + index: { + [`${DEFAULT_PREVIEW_INDEX}-${spaceId}`]: ['read'], + [`.internal${DEFAULT_PREVIEW_INDEX}-${spaceId}-*`]: ['read'], + }, + cluster: [], + }, + }); - while (invocationCount > 0 && !isAborted) { - invocationStartTime = moment(); - - ({ state: statePreview } = (await executor({ - executionId: uuidv4(), - params, - previousStartedAt, - rule, - services: { - shouldWriteAlerts, - shouldStopExecution: () => false, - alertsClient: null, - alertFactory, - savedObjectsClient: coreContext.savedObjects.client, - scopedClusterClient: wrapScopedClusterClient({ - abortController, - scopedClusterClient: coreContext.elasticsearch.client, - }), - searchSourceClient: wrapSearchSourceClient({ - abortController, - searchSourceClient, - }), - uiSettingsClient: coreContext.uiSettings.client, - dataViews: dataViewsService, - share, + if (!hasAllRequested) { + return response.ok({ + body: { + logs: [ + { + errors: [ + 'Missing "read" privileges for the ".preview.alerts-security.alerts" or ".internal.preview.alerts-security.alerts" indices. Without these privileges you cannot use the Rule Preview feature.', + ], + warnings: [], + duration: 0, + }, + ], + previewId: undefined, + isAborted: undefined, }, - spaceId, - startedAt: startedAt.toDate(), - state: statePreview, - logger, - flappingSettings: DISABLE_FLAPPING_SETTINGS, - })) as { state: TState }); - - const errors = loggedStatusChanges - .filter((item) => item.newStatus === RuleExecutionStatus.failed) - .map((item) => item.message ?? 'Unknown Error'); - - const warnings = loggedStatusChanges - .filter((item) => item.newStatus === RuleExecutionStatus['partial failure']) - .map((item) => item.message ?? 'Unknown Warning'); - - logs.push({ - errors, - warnings, - startedAt: startedAt.toDate().toISOString(), - duration: moment().diff(invocationStartTime, 'milliseconds'), }); + } - loggedStatusChanges.length = 0; + const previewRuleTypeWrapper = createSecurityRuleTypeWrapper({ + ...securityRuleTypeOptions, + ruleDataClient: previewRuleDataClient, + ruleExecutionLoggerFactory: previewRuleExecutionLogger.factory, + isPreview: true, + }); - if (errors.length) { - break; + const runExecutors = async < + TParams extends RuleParams, + TState extends RuleTypeState, + TInstanceState extends AlertInstanceState, + TInstanceContext extends AlertInstanceContext, + TActionGroupIds extends string = '' + >( + executor: ExecutorType< + TParams, + TState, + TInstanceState, + TInstanceContext, + TActionGroupIds + >, + ruleTypeId: string, + ruleTypeName: string, + params: TParams, + shouldWriteAlerts: () => boolean, + alertFactory: { + create: ( + id: string + ) => Pick< + Alert, + | 'getState' + | 'replaceState' + | 'scheduleActions' + | 'setContext' + | 'getContext' + | 'hasContext' + | 'getUuid' + | 'getStart' + >; + alertLimit: { + getValue: () => number; + setLimitReached: () => void; + }; + done: () => { getRecoveredAlerts: () => [] }; } + ) => { + let statePreview = runState as TState; + + const abortController = new AbortController(); + setTimeout(() => { + abortController.abort(); + isAborted = true; + }, PREVIEW_TIMEOUT_SECONDS * 1000); + + const startedAt = moment(timeframeEnd); + const parsedDuration = parseDuration(internalRule.schedule.interval) ?? 0; + startedAt.subtract(moment.duration(parsedDuration * (invocationCount - 1))); + + let previousStartedAt = null; + + const rule = { + ...internalRule, + id: previewId, + createdAt: new Date(), + createdBy: username ?? 'preview-created-by', + producer: 'preview-producer', + revision: 0, + ruleTypeId, + ruleTypeName, + updatedAt: new Date(), + updatedBy: username ?? 'preview-updated-by', + muteAll: false, + snoozeSchedule: [], + }; - previousStartedAt = startedAt.toDate(); - startedAt.add(parseInterval(internalRule.schedule.interval)); - invocationCount--; - } - }; - - switch (previewRuleParams.type) { - case 'query': - const queryAlertType = previewRuleTypeWrapper( - createQueryAlertType({ - ...ruleOptions, - id: QUERY_RULE_TYPE_ID, - name: 'Custom Query Rule', - }) - ); - await runExecutors( - queryAlertType.executor, - queryAlertType.id, - queryAlertType.name, - previewRuleParams, - () => true, - { - create: alertInstanceFactoryStub, - alertLimit: { - getValue: () => 1000, - setLimitReached: () => {}, - }, - done: () => ({ getRecoveredAlerts: () => [] }), - } - ); - break; - case 'saved_query': - const savedQueryAlertType = previewRuleTypeWrapper( - createQueryAlertType({ - ...ruleOptions, - id: SAVED_QUERY_RULE_TYPE_ID, - name: 'Saved Query Rule', - }) - ); - await runExecutors( - savedQueryAlertType.executor, - savedQueryAlertType.id, - savedQueryAlertType.name, - previewRuleParams, - () => true, - { - create: alertInstanceFactoryStub, - alertLimit: { - getValue: () => 1000, - setLimitReached: () => {}, - }, - done: () => ({ getRecoveredAlerts: () => [] }), - } - ); - break; - case 'threshold': - const thresholdAlertType = previewRuleTypeWrapper( - createThresholdAlertType(ruleOptions) - ); - await runExecutors( - thresholdAlertType.executor, - thresholdAlertType.id, - thresholdAlertType.name, - previewRuleParams, - () => true, - { - create: alertInstanceFactoryStub, - alertLimit: { - getValue: () => 1000, - setLimitReached: () => {}, - }, - done: () => ({ getRecoveredAlerts: () => [] }), - } - ); - break; - case 'threat_match': - const threatMatchAlertType = previewRuleTypeWrapper( - createIndicatorMatchAlertType(ruleOptions) - ); - await runExecutors( - threatMatchAlertType.executor, - threatMatchAlertType.id, - threatMatchAlertType.name, - previewRuleParams, - () => true, - { - create: alertInstanceFactoryStub, - alertLimit: { - getValue: () => 1000, - setLimitReached: () => {}, - }, - done: () => ({ getRecoveredAlerts: () => [] }), - } - ); - break; - case 'eql': - const eqlAlertType = previewRuleTypeWrapper(createEqlAlertType(ruleOptions)); - await runExecutors( - eqlAlertType.executor, - eqlAlertType.id, - eqlAlertType.name, - previewRuleParams, - () => true, - { - create: alertInstanceFactoryStub, - alertLimit: { - getValue: () => 1000, - setLimitReached: () => {}, - }, - done: () => ({ getRecoveredAlerts: () => [] }), - } - ); - break; - case 'machine_learning': - const mlAlertType = previewRuleTypeWrapper(createMlAlertType(ruleOptions)); - await runExecutors( - mlAlertType.executor, - mlAlertType.id, - mlAlertType.name, - previewRuleParams, - () => true, - { - create: alertInstanceFactoryStub, - alertLimit: { - getValue: () => 1000, - setLimitReached: () => {}, - }, - done: () => ({ getRecoveredAlerts: () => [] }), - } + let invocationStartTime; + + const dataViewsService = await dataViews.dataViewsServiceFactory( + savedObjectsClient, + coreContext.elasticsearch.client.asInternalUser ); - break; - case 'new_terms': - const newTermsAlertType = previewRuleTypeWrapper(createNewTermsAlertType(ruleOptions)); - await runExecutors( - newTermsAlertType.executor, - newTermsAlertType.id, - newTermsAlertType.name, - previewRuleParams, - () => true, - { - create: alertInstanceFactoryStub, - alertLimit: { - getValue: () => 1000, - setLimitReached: () => {}, + + while (invocationCount > 0 && !isAborted) { + invocationStartTime = moment(); + + ({ state: statePreview } = (await executor({ + executionId: uuidv4(), + params, + previousStartedAt, + rule, + services: { + shouldWriteAlerts, + shouldStopExecution: () => false, + alertsClient: null, + alertFactory, + savedObjectsClient: coreContext.savedObjects.client, + scopedClusterClient: wrapScopedClusterClient({ + abortController, + scopedClusterClient: coreContext.elasticsearch.client, + }), + searchSourceClient: wrapSearchSourceClient({ + abortController, + searchSourceClient, + }), + uiSettingsClient: coreContext.uiSettings.client, + dataViews: dataViewsService, + share, }, - done: () => ({ getRecoveredAlerts: () => [] }), + spaceId, + startedAt: startedAt.toDate(), + state: statePreview, + logger, + flappingSettings: DISABLE_FLAPPING_SETTINGS, + })) as { state: TState }); + + const errors = loggedStatusChanges + .filter((item) => item.newStatus === RuleExecutionStatus.failed) + .map((item) => item.message ?? 'Unknown Error'); + + const warnings = loggedStatusChanges + .filter((item) => item.newStatus === RuleExecutionStatus['partial failure']) + .map((item) => item.message ?? 'Unknown Warning'); + + logs.push({ + errors, + warnings, + startedAt: startedAt.toDate().toISOString(), + duration: moment().diff(invocationStartTime, 'milliseconds'), + }); + + loggedStatusChanges.length = 0; + + if (errors.length) { + break; } - ); - break; - default: - assertUnreachable(previewRuleParams); - } - // Refreshes alias to ensure index is able to be read before returning - await coreContext.elasticsearch.client.asInternalUser.indices.refresh( - { - index: previewRuleDataClient.indexNameWithNamespace(spaceId), - }, - { ignore: [404] } - ); - - return response.ok({ - body: { - previewId, - logs, - isAborted, - }, - }); - } catch (err) { - const error = transformError(err as Error); - return siemResponse.error({ - body: { - errors: [error.message], - }, - statusCode: error.statusCode, - }); + previousStartedAt = startedAt.toDate(); + startedAt.add(parseInterval(internalRule.schedule.interval)); + invocationCount--; + } + }; + + switch (previewRuleParams.type) { + case 'query': + const queryAlertType = previewRuleTypeWrapper( + createQueryAlertType({ + ...ruleOptions, + id: QUERY_RULE_TYPE_ID, + name: 'Custom Query Rule', + }) + ); + await runExecutors( + queryAlertType.executor, + queryAlertType.id, + queryAlertType.name, + previewRuleParams, + () => true, + { + create: alertInstanceFactoryStub, + alertLimit: { + getValue: () => 1000, + setLimitReached: () => {}, + }, + done: () => ({ getRecoveredAlerts: () => [] }), + } + ); + break; + case 'saved_query': + const savedQueryAlertType = previewRuleTypeWrapper( + createQueryAlertType({ + ...ruleOptions, + id: SAVED_QUERY_RULE_TYPE_ID, + name: 'Saved Query Rule', + }) + ); + await runExecutors( + savedQueryAlertType.executor, + savedQueryAlertType.id, + savedQueryAlertType.name, + previewRuleParams, + () => true, + { + create: alertInstanceFactoryStub, + alertLimit: { + getValue: () => 1000, + setLimitReached: () => {}, + }, + done: () => ({ getRecoveredAlerts: () => [] }), + } + ); + break; + case 'threshold': + const thresholdAlertType = previewRuleTypeWrapper( + createThresholdAlertType(ruleOptions) + ); + await runExecutors( + thresholdAlertType.executor, + thresholdAlertType.id, + thresholdAlertType.name, + previewRuleParams, + () => true, + { + create: alertInstanceFactoryStub, + alertLimit: { + getValue: () => 1000, + setLimitReached: () => {}, + }, + done: () => ({ getRecoveredAlerts: () => [] }), + } + ); + break; + case 'threat_match': + const threatMatchAlertType = previewRuleTypeWrapper( + createIndicatorMatchAlertType(ruleOptions) + ); + await runExecutors( + threatMatchAlertType.executor, + threatMatchAlertType.id, + threatMatchAlertType.name, + previewRuleParams, + () => true, + { + create: alertInstanceFactoryStub, + alertLimit: { + getValue: () => 1000, + setLimitReached: () => {}, + }, + done: () => ({ getRecoveredAlerts: () => [] }), + } + ); + break; + case 'eql': + const eqlAlertType = previewRuleTypeWrapper(createEqlAlertType(ruleOptions)); + await runExecutors( + eqlAlertType.executor, + eqlAlertType.id, + eqlAlertType.name, + previewRuleParams, + () => true, + { + create: alertInstanceFactoryStub, + alertLimit: { + getValue: () => 1000, + setLimitReached: () => {}, + }, + done: () => ({ getRecoveredAlerts: () => [] }), + } + ); + break; + case 'machine_learning': + const mlAlertType = previewRuleTypeWrapper(createMlAlertType(ruleOptions)); + await runExecutors( + mlAlertType.executor, + mlAlertType.id, + mlAlertType.name, + previewRuleParams, + () => true, + { + create: alertInstanceFactoryStub, + alertLimit: { + getValue: () => 1000, + setLimitReached: () => {}, + }, + done: () => ({ getRecoveredAlerts: () => [] }), + } + ); + break; + case 'new_terms': + const newTermsAlertType = previewRuleTypeWrapper( + createNewTermsAlertType(ruleOptions) + ); + await runExecutors( + newTermsAlertType.executor, + newTermsAlertType.id, + newTermsAlertType.name, + previewRuleParams, + () => true, + { + create: alertInstanceFactoryStub, + alertLimit: { + getValue: () => 1000, + setLimitReached: () => {}, + }, + done: () => ({ getRecoveredAlerts: () => [] }), + } + ); + break; + default: + assertUnreachable(previewRuleParams); + } + + // Refreshes alias to ensure index is able to be read before returning + await coreContext.elasticsearch.client.asInternalUser.indices.refresh( + { + index: previewRuleDataClient.indexNameWithNamespace(spaceId), + }, + { ignore: [404] } + ); + + return response.ok({ + body: { + previewId, + logs, + isAborted, + }, + }); + } catch (err) { + const error = transformError(err as Error); + return siemResponse.error({ + body: { + errors: [error.message], + }, + statusCode: error.statusCode, + }); + } } - } - ); + ); }; diff --git a/x-pack/plugins/security_solution/server/lib/exceptions/api/manage_exceptions/route.ts b/x-pack/plugins/security_solution/server/lib/exceptions/api/manage_exceptions/route.ts index 88c3dc91b37a7..35dbfea0c2125 100644 --- a/x-pack/plugins/security_solution/server/lib/exceptions/api/manage_exceptions/route.ts +++ b/x-pack/plugins/security_solution/server/lib/exceptions/api/manage_exceptions/route.ts @@ -16,50 +16,57 @@ import { buildSiemResponse } from '../../../detection_engine/routes/utils'; import { buildRouteValidation } from '../../../../utils/build_validation/route_validation'; export const createSharedExceptionListRoute = (router: SecuritySolutionPluginRouter) => { - router.post( - { + router.versioned + .post({ path: SHARED_EXCEPTION_LIST_URL, - validate: { - body: buildRouteValidation< - typeof CreateSharedExceptionListRequest, - CreateSharedExceptionListRequest - >(CreateSharedExceptionListRequest), - }, + access: 'public', options: { tags: ['access:securitySolution'], }, - }, - async (context, request, response): Promise> => { - const siemResponse = buildSiemResponse(response); - const { description, name } = request.body; + }) + .addVersion( + { + version: '2023-10-31', + validate: { + request: { + body: buildRouteValidation< + typeof CreateSharedExceptionListRequest, + CreateSharedExceptionListRequest + >(CreateSharedExceptionListRequest), + }, + }, + }, + async (context, request, response): Promise> => { + const siemResponse = buildSiemResponse(response); + const { description, name } = request.body; - try { - const ctx = await context.resolve([ - 'core', - 'securitySolution', - 'alerting', - 'licensing', - 'lists', - ]); - const listsClient = ctx.securitySolution.getExceptionListClient(); - const createdSharedList = await listsClient?.createExceptionList({ - description, - immutable: false, - listId: uuidv4(), - meta: undefined, - name, - namespaceType: 'single', - tags: [], - type: 'detection', - version: 1, - }); - return response.ok({ body: createdSharedList }); - } catch (exc) { - return siemResponse.error({ - body: exc.message, - statusCode: 404, - }); + try { + const ctx = await context.resolve([ + 'core', + 'securitySolution', + 'alerting', + 'licensing', + 'lists', + ]); + const listsClient = ctx.securitySolution.getExceptionListClient(); + const createdSharedList = await listsClient?.createExceptionList({ + description, + immutable: false, + listId: uuidv4(), + meta: undefined, + name, + namespaceType: 'single', + tags: [], + type: 'detection', + version: 1, + }); + return response.ok({ body: createdSharedList }); + } catch (exc) { + return siemResponse.error({ + body: exc.message, + statusCode: 404, + }); + } } - } - ); + ); }; diff --git a/x-pack/plugins/security_solution/server/lib/tags/routes/create_tag.ts b/x-pack/plugins/security_solution/server/lib/tags/routes/create_tag.ts index 6ddc14d64d53f..97499b76ae354 100644 --- a/x-pack/plugins/security_solution/server/lib/tags/routes/create_tag.ts +++ b/x-pack/plugins/security_solution/server/lib/tags/routes/create_tag.ts @@ -22,42 +22,47 @@ export const createTagRoute = ( logger: Logger, security: SetupPlugins['security'] ) => { - router.put( - { + router.versioned + .put({ path: INTERNAL_TAGS_URL, - validate: { body: buildRouteValidationWithExcess(createTagRequest) }, + access: 'internal', options: { tags: ['access:securitySolution'], }, - }, - async (context, request, response) => { - const frameworkRequest = await buildFrameworkRequest(context, security, request); - const savedObjectsClient = (await frameworkRequest.context.core).savedObjects.client; - const { name: tagName, description, color } = request.body; - try { - const tag = await createTag({ - savedObjectsClient, - tagName, - description, - color, - }); - return response.ok({ body: tag }); - } catch (err) { - const error = transformError(err); - logger.error(`Failed to create ${tagName} tag - ${JSON.stringify(error.message)}`); + }) + .addVersion( + { + version: '1', + validate: { request: { body: buildRouteValidationWithExcess(createTagRequest) } }, + }, + async (context, request, response) => { + const frameworkRequest = await buildFrameworkRequest(context, security, request); + const savedObjectsClient = (await frameworkRequest.context.core).savedObjects.client; + const { name: tagName, description, color } = request.body; + try { + const tag = await createTag({ + savedObjectsClient, + tagName, + description, + color, + }); + return response.ok({ body: tag }); + } catch (err) { + const error = transformError(err); + logger.error(`Failed to create ${tagName} tag - ${JSON.stringify(error.message)}`); - const siemResponse = buildSiemResponse(response); - return siemResponse.error({ - statusCode: error.statusCode ?? 500, - body: i18n.translate( - 'xpack.securitySolution.dashboards.createSecuritySolutionTagErrorTitle', - { - values: { tagName, message: error.message }, - defaultMessage: `Failed to create {tagName} tag - {message}`, - } - ), - }); + const siemResponse = buildSiemResponse(response); + return siemResponse.error({ + statusCode: error.statusCode ?? 500, + body: i18n.translate( + 'xpack.securitySolution.dashboards.createSecuritySolutionTagErrorTitle', + { + values: { tagName, message: error.message }, + defaultMessage: `Failed to create {tagName} tag - {message}`, + } + ), + }); + } } - } - ); + ); }; diff --git a/x-pack/plugins/security_solution/server/lib/tags/routes/get_tags_by_name.ts b/x-pack/plugins/security_solution/server/lib/tags/routes/get_tags_by_name.ts index a88578365f037..cd07a71db5a1c 100644 --- a/x-pack/plugins/security_solution/server/lib/tags/routes/get_tags_by_name.ts +++ b/x-pack/plugins/security_solution/server/lib/tags/routes/get_tags_by_name.ts @@ -22,45 +22,50 @@ export const getTagsByNameRoute = ( logger: Logger, security: SetupPlugins['security'] ) => { - router.get( - { + router.versioned + .get({ path: INTERNAL_TAGS_URL, - validate: { query: buildRouteValidationWithExcess(getTagsByNameRequest) }, + access: 'internal', options: { tags: ['access:securitySolution'], }, - }, - async (context, request, response) => { - const frameworkRequest = await buildFrameworkRequest(context, security, request); - const savedObjectsClient = (await frameworkRequest.context.core).savedObjects.client; + }) + .addVersion( + { + version: '1', + validate: { request: { query: buildRouteValidationWithExcess(getTagsByNameRequest) } }, + }, + async (context, request, response) => { + const frameworkRequest = await buildFrameworkRequest(context, security, request); + const savedObjectsClient = (await frameworkRequest.context.core).savedObjects.client; - const { name: tagName } = request.query; + const { name: tagName } = request.query; - try { - const tags = await findTagsByName({ - savedObjectsClient, - tagName, - }); + try { + const tags = await findTagsByName({ + savedObjectsClient, + tagName, + }); - return response.ok({ - body: tags, - }); - } catch (err) { - const error = transformError(err); - logger.error(`Failed to find ${tagName} tags - ${JSON.stringify(error.message)}`); + return response.ok({ + body: tags, + }); + } catch (err) { + const error = transformError(err); + logger.error(`Failed to find ${tagName} tags - ${JSON.stringify(error.message)}`); - const siemResponse = buildSiemResponse(response); - return siemResponse.error({ - statusCode: error.statusCode ?? 500, - body: i18n.translate( - 'xpack.securitySolution.dashboards.getSecuritySolutionTagsErrorTitle', - { - values: { tagName, message: error.message }, - defaultMessage: `Failed to find {tagName} tags - {message}`, - } - ), - }); + const siemResponse = buildSiemResponse(response); + return siemResponse.error({ + statusCode: error.statusCode ?? 500, + body: i18n.translate( + 'xpack.securitySolution.dashboards.getSecuritySolutionTagsErrorTitle', + { + values: { tagName, message: error.message }, + defaultMessage: `Failed to find {tagName} tags - {message}`, + } + ), + }); + } } - } - ); + ); }; diff --git a/x-pack/test/detection_engine_api_integration/security_and_spaces/group1/export_rules.ts b/x-pack/test/detection_engine_api_integration/security_and_spaces/group1/export_rules.ts index 44ac35cf9569d..80719b25ef295 100644 --- a/x-pack/test/detection_engine_api_integration/security_and_spaces/group1/export_rules.ts +++ b/x-pack/test/detection_engine_api_integration/security_and_spaces/group1/export_rules.ts @@ -7,7 +7,10 @@ import expect from 'expect'; -import { DETECTION_ENGINE_RULES_URL } from '@kbn/security-solution-plugin/common/constants'; +import { + DETECTION_ENGINE_RULES_URL, + UPDATE_OR_CREATE_LEGACY_ACTIONS, +} from '@kbn/security-solution-plugin/common/constants'; import { RuleResponse } from '@kbn/security-solution-plugin/common/api/detection_engine'; import { FtrProviderContext } from '../../common/ftr_provider_context'; import { @@ -427,8 +430,9 @@ export default ({ getService }: FtrProviderContext): void => { // attach the legacy notification await supertest - .post(`/internal/api/detection/legacy/notifications?alert_id=${rule.id}`) + .post(`${UPDATE_OR_CREATE_LEGACY_ACTIONS}?alert_id=${rule.id}`) .set('kbn-xsrf', 'true') + .set('elastic-api-version', '1') .send({ name: 'Legacy notification with one action', interval: '1h', @@ -496,8 +500,9 @@ export default ({ getService }: FtrProviderContext): void => { // attach the legacy notification with actions await supertest - .post(`/internal/api/detection/legacy/notifications?alert_id=${rule.id}`) + .post(`${UPDATE_OR_CREATE_LEGACY_ACTIONS}?alert_id=${rule.id}`) .set('kbn-xsrf', 'true') + .set('elastic-api-version', '1') .send({ name: 'Legacy notification with one action', interval: '1h', @@ -585,8 +590,9 @@ export default ({ getService }: FtrProviderContext): void => { // attach the legacy notification with actions to the first rule await supertest - .post(`/internal/api/detection/legacy/notifications?alert_id=${rule1.id}`) + .post(`${UPDATE_OR_CREATE_LEGACY_ACTIONS}?alert_id=${rule1.id}`) .set('kbn-xsrf', 'true') + .set('elastic-api-version', '1') .send({ name: 'Legacy notification with one action', interval: '1h', @@ -615,8 +621,9 @@ export default ({ getService }: FtrProviderContext): void => { // attach the legacy notification with actions to the 2nd rule await supertest - .post(`/internal/api/detection/legacy/notifications?alert_id=${rule2.id}`) + .post(`${UPDATE_OR_CREATE_LEGACY_ACTIONS}?alert_id=${rule2.id}`) .set('kbn-xsrf', 'true') + .set('elastic-api-version', '1') .send({ name: 'Legacy notification with one action', interval: '1h', diff --git a/x-pack/test/detection_engine_api_integration/security_and_spaces/group1/find_rule_exception_references.ts b/x-pack/test/detection_engine_api_integration/security_and_spaces/group1/find_rule_exception_references.ts index 831c41dc07063..dc63651aafc14 100644 --- a/x-pack/test/detection_engine_api_integration/security_and_spaces/group1/find_rule_exception_references.ts +++ b/x-pack/test/detection_engine_api_integration/security_and_spaces/group1/find_rule_exception_references.ts @@ -67,6 +67,7 @@ export default ({ getService }: FtrProviderContext) => { const { body: references } = await supertest .get(DETECTION_ENGINE_RULES_EXCEPTIONS_REFERENCE_URL) .set('kbn-xsrf', 'true') + .set('elastic-api-version', '1') .query({ ids: `${exceptionList.id}`, list_ids: `${exceptionList.list_id}`, @@ -120,6 +121,7 @@ export default ({ getService }: FtrProviderContext) => { const { body: references } = await supertest .get(DETECTION_ENGINE_RULES_EXCEPTIONS_REFERENCE_URL) .set('kbn-xsrf', 'true') + .set('elastic-api-version', '1') .query({ ids: `1234`, list_ids: `i_dont_exist`, @@ -166,6 +168,7 @@ export default ({ getService }: FtrProviderContext) => { const { body: references } = await supertest .get(DETECTION_ENGINE_RULES_EXCEPTIONS_REFERENCE_URL) .set('kbn-xsrf', 'true') + .set('elastic-api-version', '1') .query({ ids: `${exceptionList.id},${exceptionList2.id}`, list_ids: `${exceptionList.list_id},${exceptionList2.list_id}`, @@ -214,6 +217,7 @@ export default ({ getService }: FtrProviderContext) => { const { body: references } = await supertest .get(DETECTION_ENGINE_RULES_EXCEPTIONS_REFERENCE_URL) .set('kbn-xsrf', 'true') + .set('elastic-api-version', '1') .query({ namespace_types: 'single,agnostic', }) diff --git a/x-pack/test/detection_engine_api_integration/security_and_spaces/group1/find_rules.ts b/x-pack/test/detection_engine_api_integration/security_and_spaces/group1/find_rules.ts index 5e5d193d55d8a..81a7c8c749172 100644 --- a/x-pack/test/detection_engine_api_integration/security_and_spaces/group1/find_rules.ts +++ b/x-pack/test/detection_engine_api_integration/security_and_spaces/group1/find_rules.ts @@ -7,7 +7,10 @@ import expect from '@kbn/expect'; -import { DETECTION_ENGINE_RULES_URL } from '@kbn/security-solution-plugin/common/constants'; +import { + DETECTION_ENGINE_RULES_URL, + UPDATE_OR_CREATE_LEGACY_ACTIONS, +} from '@kbn/security-solution-plugin/common/constants'; import { FtrProviderContext } from '../../common/ftr_provider_context'; import { createRule, @@ -211,8 +214,9 @@ export default ({ getService }: FtrProviderContext): void => { // attach the legacy notification await supertest - .post(`/internal/api/detection/legacy/notifications?alert_id=${createRuleBody.id}`) + .post(`${UPDATE_OR_CREATE_LEGACY_ACTIONS}?alert_id=${createRuleBody.id}`) .set('kbn-xsrf', 'true') + .set('elastic-api-version', '1') .send({ name: 'Legacy notification with one action', interval: '1h', diff --git a/x-pack/test/detection_engine_api_integration/security_and_spaces/group10/read_rules.ts b/x-pack/test/detection_engine_api_integration/security_and_spaces/group10/read_rules.ts index 87fee66b44767..364731d4864b4 100644 --- a/x-pack/test/detection_engine_api_integration/security_and_spaces/group10/read_rules.ts +++ b/x-pack/test/detection_engine_api_integration/security_and_spaces/group10/read_rules.ts @@ -7,7 +7,10 @@ import expect from '@kbn/expect'; -import { DETECTION_ENGINE_RULES_URL } from '@kbn/security-solution-plugin/common/constants'; +import { + DETECTION_ENGINE_RULES_URL, + UPDATE_OR_CREATE_LEGACY_ACTIONS, +} from '@kbn/security-solution-plugin/common/constants'; import { FtrProviderContext } from '../../common/ftr_provider_context'; import { createRule, @@ -216,8 +219,9 @@ export default ({ getService }: FtrProviderContext) => { // attach the legacy notification await supertest - .post(`/internal/api/detection/legacy/notifications?alert_id=${createRuleBody.id}`) + .post(`${UPDATE_OR_CREATE_LEGACY_ACTIONS}?alert_id=${createRuleBody.id}`) .set('kbn-xsrf', 'true') + .set('elastic-api-version', '1') .send({ name: 'Legacy notification with one action', interval: '1h', diff --git a/x-pack/test/detection_engine_api_integration/utils/create_legacy_rule_action.ts b/x-pack/test/detection_engine_api_integration/utils/create_legacy_rule_action.ts index 6428b41cdeba8..8e0cb59d5ee90 100644 --- a/x-pack/test/detection_engine_api_integration/utils/create_legacy_rule_action.ts +++ b/x-pack/test/detection_engine_api_integration/utils/create_legacy_rule_action.ts @@ -15,8 +15,9 @@ export const createLegacyRuleAction = async ( connectorId: string ): Promise => supertest - .post(`${UPDATE_OR_CREATE_LEGACY_ACTIONS}`) + .post(UPDATE_OR_CREATE_LEGACY_ACTIONS) .set('kbn-xsrf', 'true') + .set('elastic-api-version', '1') .query({ alert_id: alertId }) .send({ name: 'Legacy notification with one action', diff --git a/x-pack/test/detection_engine_api_integration/utils/create_signals_index.ts b/x-pack/test/detection_engine_api_integration/utils/create_signals_index.ts index 5f490f2dc7c60..59fd8828e667f 100644 --- a/x-pack/test/detection_engine_api_integration/utils/create_signals_index.ts +++ b/x-pack/test/detection_engine_api_integration/utils/create_signals_index.ts @@ -22,7 +22,11 @@ export const createSignalsIndex = async ( ): Promise => { await countDownTest( async () => { - await supertest.post(DETECTION_ENGINE_INDEX_URL).set('kbn-xsrf', 'true').send(); + await supertest + .post(DETECTION_ENGINE_INDEX_URL) + .set('kbn-xsrf', 'true') + .set('elastic-api-version', '2023-10-31') + .send(); return { passed: true, }; diff --git a/x-pack/test/detection_engine_api_integration/utils/delete_all_alerts.ts b/x-pack/test/detection_engine_api_integration/utils/delete_all_alerts.ts index d1b45b0c33a44..8a4447e931120 100644 --- a/x-pack/test/detection_engine_api_integration/utils/delete_all_alerts.ts +++ b/x-pack/test/detection_engine_api_integration/utils/delete_all_alerts.ts @@ -25,7 +25,11 @@ export const deleteAllAlerts = async ( ): Promise => { await countDownTest( async () => { - await supertest.delete(DETECTION_ENGINE_INDEX_URL).set('kbn-xsrf', 'true').send(); + await supertest + .delete(DETECTION_ENGINE_INDEX_URL) + .set('kbn-xsrf', 'true') + .set('elastic-api-version', '2023-10-31') + .send(); await es.deleteByQuery({ index, body: { diff --git a/x-pack/test/detection_engine_api_integration/utils/get_security_telemetry_stats.ts b/x-pack/test/detection_engine_api_integration/utils/get_security_telemetry_stats.ts index dd243dd3ca581..7eb00b7ff3138 100644 --- a/x-pack/test/detection_engine_api_integration/utils/get_security_telemetry_stats.ts +++ b/x-pack/test/detection_engine_api_integration/utils/get_security_telemetry_stats.ts @@ -23,6 +23,7 @@ export const getSecurityTelemetryStats = async ( const response = await supertest .get(SECURITY_TELEMETRY_URL) .set('kbn-xsrf', 'true') + .set('elastic-api-version', '1') .send({ unencrypted: true, refreshCache: true }); if (response.status !== 200) { log.error( From 3f2feb93a282e13695b436c299c97dd3dde861da Mon Sep 17 00:00:00 2001 From: Tiago Costa Date: Wed, 6 Sep 2023 16:35:00 +0100 Subject: [PATCH 32/97] skip flaky suite (#165779) --- .../test_suites/common/alerting/alert_documents.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/x-pack/test_serverless/api_integration/test_suites/common/alerting/alert_documents.ts b/x-pack/test_serverless/api_integration/test_suites/common/alerting/alert_documents.ts index a8a6d2d44cd64..ebc24f10a844d 100644 --- a/x-pack/test_serverless/api_integration/test_suites/common/alerting/alert_documents.ts +++ b/x-pack/test_serverless/api_integration/test_suites/common/alerting/alert_documents.ts @@ -19,7 +19,8 @@ export default function ({ getService }: FtrProviderContext) { const esClient = getService('es'); const objectRemover = new ObjectRemover(supertest); - describe('Alert documents', () => { + // FLAKY: https://github.com/elastic/kibana/issues/165779 + describe.skip('Alert documents', () => { const RULE_TYPE_ID = '.es-query'; const ALERT_INDEX = '.alerts-stack.alerts-default'; let ruleId: string; From ecc372d4087362cbf9c4ee69c75c5effe3b81f54 Mon Sep 17 00:00:00 2001 From: Tiago Costa Date: Wed, 6 Sep 2023 16:36:25 +0100 Subject: [PATCH 33/97] skip flaky suite (#165795) --- .../shared_exception_lists_management/manage_exceptions.cy.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/x-pack/test/security_solution_cypress/cypress/e2e/exceptions/shared_exception_lists_management/manage_exceptions.cy.ts b/x-pack/test/security_solution_cypress/cypress/e2e/exceptions/shared_exception_lists_management/manage_exceptions.cy.ts index 5c9b93ed1507b..e60c1be5ddbb7 100644 --- a/x-pack/test/security_solution_cypress/cypress/e2e/exceptions/shared_exception_lists_management/manage_exceptions.cy.ts +++ b/x-pack/test/security_solution_cypress/cypress/e2e/exceptions/shared_exception_lists_management/manage_exceptions.cy.ts @@ -60,7 +60,8 @@ describe('Add, edit and delete exception', { tags: ['@ess', '@serverless'] }, () const FIELD_DIFFERENT_FROM_EXISTING_ITEM_FIELD = 'agent.name'; const EXCEPTION_LIST_NAME = 'Newly created list'; - describe('Add, Edit and delete Exception item', () => { + // FLAKY: https://github.com/elastic/kibana/issues/165795 + describe('Add, Edit and delete Exception item', { tags: ['@ess', '@serverless', '@brokenInServerless'] }, () => { it('should create exception item from Shared Exception List page and linked to a Rule', () => { // Click on "Create shared exception list" button on the header // Click on "Create exception item" From 0568e5f9993c9f327bf33e87cf67eddd7c0e7ac4 Mon Sep 17 00:00:00 2001 From: Tiago Costa Date: Wed, 6 Sep 2023 16:44:48 +0100 Subject: [PATCH 34/97] skip flaky suite (#164998) --- x-pack/test/fleet_api_integration/apis/fleet_telemetry.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/x-pack/test/fleet_api_integration/apis/fleet_telemetry.ts b/x-pack/test/fleet_api_integration/apis/fleet_telemetry.ts index 3efb072907fac..66107ff6e6aac 100644 --- a/x-pack/test/fleet_api_integration/apis/fleet_telemetry.ts +++ b/x-pack/test/fleet_api_integration/apis/fleet_telemetry.ts @@ -22,7 +22,8 @@ export default function (providerContext: FtrProviderContext) { let agentCount = 0; let pkgVersion: string; - describe('fleet_telemetry', () => { + // FLAKY: https://github.com/elastic/kibana/issues/164998 + describe.skip('fleet_telemetry', () => { skipIfNoDockerRegistry(providerContext); before(async () => { await kibanaServer.savedObjects.cleanStandardList(); From bc51d3a0b4a1477cd700e685c2ecba13c197acbb Mon Sep 17 00:00:00 2001 From: Tiago Costa Date: Wed, 6 Sep 2023 16:47:41 +0100 Subject: [PATCH 35/97] skip flaky suite (#165379) --- .../functional/test_suites/common/examples/search/warnings.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/x-pack/test_serverless/functional/test_suites/common/examples/search/warnings.ts b/x-pack/test_serverless/functional/test_suites/common/examples/search/warnings.ts index b1e5be5f9f835..5a5d504849b86 100644 --- a/x-pack/test_serverless/functional/test_suites/common/examples/search/warnings.ts +++ b/x-pack/test_serverless/functional/test_suites/common/examples/search/warnings.ts @@ -25,6 +25,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { const esArchiver = getService('esArchiver'); // Failing: See https://github.com/elastic/kibana/issues/165623 + // FLAKY: https://github.com/elastic/kibana/issues/165379 describe.skip('handling warnings with search source fetch', function () { const dataViewTitle = 'sample-01,sample-01-rollup'; const fromTime = 'Jun 17, 2022 @ 00:00:00.000'; From 03319b590b3ecba2ff371f5b2032436674574d15 Mon Sep 17 00:00:00 2001 From: Tiago Costa Date: Wed, 6 Sep 2023 16:49:03 +0100 Subject: [PATCH 36/97] fix(NA): eslint check --- .../manage_exceptions.cy.ts | 126 +++++++++--------- 1 file changed, 65 insertions(+), 61 deletions(-) diff --git a/x-pack/test/security_solution_cypress/cypress/e2e/exceptions/shared_exception_lists_management/manage_exceptions.cy.ts b/x-pack/test/security_solution_cypress/cypress/e2e/exceptions/shared_exception_lists_management/manage_exceptions.cy.ts index e60c1be5ddbb7..3df8598d86fa2 100644 --- a/x-pack/test/security_solution_cypress/cypress/e2e/exceptions/shared_exception_lists_management/manage_exceptions.cy.ts +++ b/x-pack/test/security_solution_cypress/cypress/e2e/exceptions/shared_exception_lists_management/manage_exceptions.cy.ts @@ -61,89 +61,93 @@ describe('Add, edit and delete exception', { tags: ['@ess', '@serverless'] }, () const EXCEPTION_LIST_NAME = 'Newly created list'; // FLAKY: https://github.com/elastic/kibana/issues/165795 - describe('Add, Edit and delete Exception item', { tags: ['@ess', '@serverless', '@brokenInServerless'] }, () => { - it('should create exception item from Shared Exception List page and linked to a Rule', () => { - // Click on "Create shared exception list" button on the header - // Click on "Create exception item" - addExceptionListFromSharedExceptionListHeaderMenu(); + describe( + 'Add, Edit and delete Exception item', + { tags: ['@ess', '@serverless', '@brokenInServerless'] }, + () => { + it('should create exception item from Shared Exception List page and linked to a Rule', () => { + // Click on "Create shared exception list" button on the header + // Click on "Create exception item" + addExceptionListFromSharedExceptionListHeaderMenu(); - // Add exception item name - addExceptionFlyoutItemName(exceptionName); + // Add exception item name + addExceptionFlyoutItemName(exceptionName); - // Add Condition - editException(FIELD_DIFFERENT_FROM_EXISTING_ITEM_FIELD, 0, 0); + // Add Condition + editException(FIELD_DIFFERENT_FROM_EXISTING_ITEM_FIELD, 0, 0); - // Confirm button should disabled until a rule(s) is selected - cy.get(CONFIRM_BTN).should('have.attr', 'disabled'); + // Confirm button should disabled until a rule(s) is selected + cy.get(CONFIRM_BTN).should('have.attr', 'disabled'); - // select rule - linkFirstRuleOnExceptionFlyout(); + // select rule + linkFirstRuleOnExceptionFlyout(); - // should be able to submit - cy.get(CONFIRM_BTN).should('not.have.attr', 'disabled'); + // should be able to submit + cy.get(CONFIRM_BTN).should('not.have.attr', 'disabled'); - submitNewExceptionItem(); + submitNewExceptionItem(); - // Navigate to Rule page - visitWithoutDateRange(DETECTIONS_RULE_MANAGEMENT_URL); - goToRuleDetails(); + // Navigate to Rule page + visitWithoutDateRange(DETECTIONS_RULE_MANAGEMENT_URL); + goToRuleDetails(); - goToExceptionsTab(); + goToExceptionsTab(); - // Only one Exception should generated - cy.get(EXCEPTION_ITEM_VIEWER_CONTAINER).should('have.length', 1); + // Only one Exception should generated + cy.get(EXCEPTION_ITEM_VIEWER_CONTAINER).should('have.length', 1); - // validate the And operator is displayed correctly - cy.get(EXCEPTION_CARD_ITEM_NAME).should('have.text', exceptionName); - }); + // validate the And operator is displayed correctly + cy.get(EXCEPTION_CARD_ITEM_NAME).should('have.text', exceptionName); + }); - it('should create exception item from Shared Exception List page, linked to a Shared List and validate Edit/delete in list detail page', function () { - createSharedExceptionList( - { name: 'Newly created list', description: 'This is my list.' }, - true - ); + it('should create exception item from Shared Exception List page, linked to a Shared List and validate Edit/delete in list detail page', function () { + createSharedExceptionList( + { name: 'Newly created list', description: 'This is my list.' }, + true + ); - // After creation - directed to list detail page - cy.get(EXCEPTIONS_LIST_MANAGEMENT_NAME).should('have.text', EXCEPTION_LIST_NAME); + // After creation - directed to list detail page + cy.get(EXCEPTIONS_LIST_MANAGEMENT_NAME).should('have.text', EXCEPTION_LIST_NAME); - // Go back to Shared Exception List - visitWithoutDateRange(EXCEPTIONS_URL); + // Go back to Shared Exception List + visitWithoutDateRange(EXCEPTIONS_URL); - // Click on "Create shared exception list" button on the header - // Click on "Create exception item" - addExceptionListFromSharedExceptionListHeaderMenu(); + // Click on "Create shared exception list" button on the header + // Click on "Create exception item" + addExceptionListFromSharedExceptionListHeaderMenu(); - // Add exception item name - addExceptionFlyoutItemName(exceptionName); + // Add exception item name + addExceptionFlyoutItemName(exceptionName); - // Add Condition - editException(FIELD_DIFFERENT_FROM_EXISTING_ITEM_FIELD, 0, 0); + // Add Condition + editException(FIELD_DIFFERENT_FROM_EXISTING_ITEM_FIELD, 0, 0); - // select shared list radio option and select the first one - linkFirstSharedListOnExceptionFlyout(); + // select shared list radio option and select the first one + linkFirstSharedListOnExceptionFlyout(); - submitNewExceptionItem(); + submitNewExceptionItem(); - // New exception is added to the new List - findSharedExceptionListItemsByName(`${EXCEPTION_LIST_NAME}`, [exceptionName]); + // New exception is added to the new List + findSharedExceptionListItemsByName(`${EXCEPTION_LIST_NAME}`, [exceptionName]); - // Click on the first exception overflow menu items - // Open the edit modal - editFirstExceptionItemInListDetailPage(); - // edit exception item name - editExceptionFlyoutItemName(exceptionNameEdited); + // Click on the first exception overflow menu items + // Open the edit modal + editFirstExceptionItemInListDetailPage(); + // edit exception item name + editExceptionFlyoutItemName(exceptionNameEdited); - // submit - submitEditedExceptionItem(); + // submit + submitEditedExceptionItem(); - // check the new name after edit - cy.get(EXECPTION_ITEM_CARD_HEADER_TITLE).should('have.text', exceptionNameEdited); + // check the new name after edit + cy.get(EXECPTION_ITEM_CARD_HEADER_TITLE).should('have.text', exceptionNameEdited); - // Click on the first exception overflow menu items - // delete the exception - deleteFirstExceptionItemInListDetailPage(); + // Click on the first exception overflow menu items + // delete the exception + deleteFirstExceptionItemInListDetailPage(); - cy.get(EMPTY_EXCEPTIONS_VIEWER).should('exist'); - }); - }); + cy.get(EMPTY_EXCEPTIONS_VIEWER).should('exist'); + }); + } + ); }); From 9ea8627757b35a56bb6b2c2c38b5fa0a1ed34cac Mon Sep 17 00:00:00 2001 From: Tiago Costa Date: Wed, 6 Sep 2023 16:52:04 +0100 Subject: [PATCH 37/97] skip flaky suite (#165388) --- .../test_suites/common/alerting/alert_documents.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/x-pack/test_serverless/api_integration/test_suites/common/alerting/alert_documents.ts b/x-pack/test_serverless/api_integration/test_suites/common/alerting/alert_documents.ts index ebc24f10a844d..fbb2b2498d92d 100644 --- a/x-pack/test_serverless/api_integration/test_suites/common/alerting/alert_documents.ts +++ b/x-pack/test_serverless/api_integration/test_suites/common/alerting/alert_documents.ts @@ -20,6 +20,7 @@ export default function ({ getService }: FtrProviderContext) { const objectRemover = new ObjectRemover(supertest); // FLAKY: https://github.com/elastic/kibana/issues/165779 + // FLAKY: https://github.com/elastic/kibana/issues/165388 describe.skip('Alert documents', () => { const RULE_TYPE_ID = '.es-query'; const ALERT_INDEX = '.alerts-stack.alerts-default'; From 852513a1bd37e5e4e2ae8cfb735b57249b4e1148 Mon Sep 17 00:00:00 2001 From: Jedrzej Blaszyk Date: Wed, 6 Sep 2023 17:53:09 +0200 Subject: [PATCH 38/97] [Enterprise Search] Fix crawler domain management bugs (#165820) ## Summary Tackles 2 known crawler domain management issues: - [Crawler manage domain doesn't clear data when creating multiple Crawler Indices](https://github.com/elastic/enterprise-search-team/issues/5659) - [Crawler with multiple domain doesn't show newly added domains when "All domains" button clicked](https://github.com/elastic/enterprise-search-team/issues/5660) Solution: - When domain is added successfully we perform 2 additional steps: - Fetch current domain list into domain management logic (this solves 2 issues but uncovers another issue): Crawler manage domain doesn't clear user input field for domain, so when adding new crawler index this field will be pre-populated with the last user input - Therfore, we also clear user input from add domain form on successful submission of a domain Video: https://github.com/elastic/kibana/assets/14121688/a2ba8941-cb76-4d97-9587-3392e815a338 --- .../domain_management/add_domain/add_domain_logic.test.ts | 8 ++++++++ .../domain_management/add_domain/add_domain_logic.ts | 4 ++++ 2 files changed, 12 insertions(+) diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/crawler/domain_management/add_domain/add_domain_logic.test.ts b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/crawler/domain_management/add_domain/add_domain_logic.test.ts index 16947a575cf5f..83101c4b90fd6 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/crawler/domain_management/add_domain/add_domain_logic.test.ts +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/crawler/domain_management/add_domain/add_domain_logic.test.ts @@ -21,6 +21,14 @@ jest.mock('../../crawler_logic', () => ({ }, })); +jest.mock('../domain_management_logic', () => ({ + DomainManagementLogic: { + actions: { + getDomains: jest.fn(), + }, + }, +})); + jest.mock('./utils', () => ({ ...(jest.requireActual('./utils') as object), getDomainWithProtocol: jest.fn().mockImplementation((domain) => domain), diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/crawler/domain_management/add_domain/add_domain_logic.ts b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/crawler/domain_management/add_domain/add_domain_logic.ts index 3ad7c67042026..762ba90e3b319 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/crawler/domain_management/add_domain/add_domain_logic.ts +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/crawler/domain_management/add_domain/add_domain_logic.ts @@ -9,6 +9,7 @@ import { kea, MakeLogicType } from 'kea'; import { i18n } from '@kbn/i18n'; +import { DEFAULT_META } from '../../../../../../shared/constants'; import { generateEncodedPath } from '../../../../../../shared/encode_path_params'; import { flashSuccessToast } from '../../../../../../shared/flash_messages'; import { getErrorsFromHttpResponse } from '../../../../../../shared/flash_messages/handle_api_errors'; @@ -28,6 +29,7 @@ import { import { SEARCH_INDEX_CRAWLER_DOMAIN_DETAIL_PATH } from '../../../../../routes'; import { IndexNameLogic } from '../../../index_name_logic'; import { CrawlerLogic } from '../../crawler_logic'; +import { DomainManagementLogic } from '../domain_management_logic'; import { domainValidationFailureResultChange, @@ -252,6 +254,8 @@ export const AddDomainLogic = kea { const { http } = HttpLogic.values; From 828983890907ac770087c3963440e91e937b11d6 Mon Sep 17 00:00:00 2001 From: Tiago Costa Date: Wed, 6 Sep 2023 16:54:31 +0100 Subject: [PATCH 39/97] skip flaky suite (#165414) --- .../test_serverless/functional/test_suites/common/home_page.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/x-pack/test_serverless/functional/test_suites/common/home_page.ts b/x-pack/test_serverless/functional/test_suites/common/home_page.ts index 9660b21d6e7d2..744fc48c3ee41 100644 --- a/x-pack/test_serverless/functional/test_suites/common/home_page.ts +++ b/x-pack/test_serverless/functional/test_suites/common/home_page.ts @@ -12,6 +12,7 @@ export default function ({ getPageObject, getService }: FtrProviderContext) { const svlCommonNavigation = getService('svlCommonNavigation'); // Failing: See https://github.com/elastic/kibana/issues/165386 + // FLAKY: https://github.com/elastic/kibana/issues/165414 describe.skip('home page', function () { it('has project header', async () => { await svlCommonNavigation.navigateToKibanaHome(); From 28665e3c0bbf590478d787a6a38e43403b1aa7f0 Mon Sep 17 00:00:00 2001 From: Tiago Costa Date: Wed, 6 Sep 2023 16:56:29 +0100 Subject: [PATCH 40/97] skip flaky suite (#165425) --- .../functional/test_suites/common/data_view_mgmt.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/x-pack/test_serverless/functional/test_suites/common/data_view_mgmt.ts b/x-pack/test_serverless/functional/test_suites/common/data_view_mgmt.ts index c768a11dc1fbc..3bbf9eec4b20f 100644 --- a/x-pack/test_serverless/functional/test_suites/common/data_view_mgmt.ts +++ b/x-pack/test_serverless/functional/test_suites/common/data_view_mgmt.ts @@ -19,6 +19,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { // FLAKY: https://github.com/elastic/kibana/issues/165804 // FLAKY: https://github.com/elastic/kibana/issues/165796 + // FLAKY: https://github.com/elastic/kibana/issues/165425 describe.skip('Data View Management', function () { let dataViewId = ''; From 1b83004b0803a3fa58cef7551daab68b08ec27a6 Mon Sep 17 00:00:00 2001 From: Tiago Costa Date: Wed, 6 Sep 2023 16:58:13 +0100 Subject: [PATCH 41/97] skip flaky suite (#165502) --- .../functional/test_suites/common/examples/search/warnings.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/x-pack/test_serverless/functional/test_suites/common/examples/search/warnings.ts b/x-pack/test_serverless/functional/test_suites/common/examples/search/warnings.ts index 5a5d504849b86..ab6cdfb846495 100644 --- a/x-pack/test_serverless/functional/test_suites/common/examples/search/warnings.ts +++ b/x-pack/test_serverless/functional/test_suites/common/examples/search/warnings.ts @@ -26,6 +26,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { // Failing: See https://github.com/elastic/kibana/issues/165623 // FLAKY: https://github.com/elastic/kibana/issues/165379 + // FLAKY: https://github.com/elastic/kibana/issues/165502 describe.skip('handling warnings with search source fetch', function () { const dataViewTitle = 'sample-01,sample-01-rollup'; const fromTime = 'Jun 17, 2022 @ 00:00:00.000'; From a2663b8c25ee5452c408931cdf7512334a03ca78 Mon Sep 17 00:00:00 2001 From: Tiago Costa Date: Wed, 6 Sep 2023 16:59:14 +0100 Subject: [PATCH 42/97] skip flaky suite (#165503) --- .../functional/test_suites/common/examples/search/warnings.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/x-pack/test_serverless/functional/test_suites/common/examples/search/warnings.ts b/x-pack/test_serverless/functional/test_suites/common/examples/search/warnings.ts index ab6cdfb846495..6340199931fb0 100644 --- a/x-pack/test_serverless/functional/test_suites/common/examples/search/warnings.ts +++ b/x-pack/test_serverless/functional/test_suites/common/examples/search/warnings.ts @@ -27,6 +27,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { // Failing: See https://github.com/elastic/kibana/issues/165623 // FLAKY: https://github.com/elastic/kibana/issues/165379 // FLAKY: https://github.com/elastic/kibana/issues/165502 + // FLAKY: https://github.com/elastic/kibana/issues/165503 describe.skip('handling warnings with search source fetch', function () { const dataViewTitle = 'sample-01,sample-01-rollup'; const fromTime = 'Jun 17, 2022 @ 00:00:00.000'; From 57197cb59c67138d19ac4c8eafabcd8876ce9728 Mon Sep 17 00:00:00 2001 From: Tiago Costa Date: Wed, 6 Sep 2023 17:02:36 +0100 Subject: [PATCH 43/97] skip flaky suite (#165619) --- .../apps/observability/pages/rule_details_page.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/x-pack/test/observability_functional/apps/observability/pages/rule_details_page.ts b/x-pack/test/observability_functional/apps/observability/pages/rule_details_page.ts index 2234f478ed3c8..5f09137850a2d 100644 --- a/x-pack/test/observability_functional/apps/observability/pages/rule_details_page.ts +++ b/x-pack/test/observability_functional/apps/observability/pages/rule_details_page.ts @@ -36,7 +36,8 @@ export default ({ getService }: FtrProviderContext) => { return true; } - describe('Observability Rule Details page', function () { + // FLAKY: https://github.com/elastic/kibana/issues/165619 + describe.skip('Observability Rule Details page', function () { this.tags('includeFirefox'); let uptimeRuleId: string; From ec3b875fda40b170f849882eff3dff10619f63f4 Mon Sep 17 00:00:00 2001 From: Tiago Costa Date: Wed, 6 Sep 2023 17:03:38 +0100 Subject: [PATCH 44/97] skip flaky suite (#165624) --- .../functional/test_suites/common/examples/search/warnings.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/x-pack/test_serverless/functional/test_suites/common/examples/search/warnings.ts b/x-pack/test_serverless/functional/test_suites/common/examples/search/warnings.ts index 6340199931fb0..87b2cedecf371 100644 --- a/x-pack/test_serverless/functional/test_suites/common/examples/search/warnings.ts +++ b/x-pack/test_serverless/functional/test_suites/common/examples/search/warnings.ts @@ -28,6 +28,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { // FLAKY: https://github.com/elastic/kibana/issues/165379 // FLAKY: https://github.com/elastic/kibana/issues/165502 // FLAKY: https://github.com/elastic/kibana/issues/165503 + // FLAKY: https://github.com/elastic/kibana/issues/165624 describe.skip('handling warnings with search source fetch', function () { const dataViewTitle = 'sample-01,sample-01-rollup'; const fromTime = 'Jun 17, 2022 @ 00:00:00.000'; From 30e82c0e5ab82f90fe2863f3c289bc4e5efb4ff2 Mon Sep 17 00:00:00 2001 From: Tiago Costa Date: Wed, 6 Sep 2023 17:05:43 +0100 Subject: [PATCH 45/97] skip flaky suite (#165635) --- .../functional/test_suites/common/examples/search/warnings.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/x-pack/test_serverless/functional/test_suites/common/examples/search/warnings.ts b/x-pack/test_serverless/functional/test_suites/common/examples/search/warnings.ts index 87b2cedecf371..01808d0a3175b 100644 --- a/x-pack/test_serverless/functional/test_suites/common/examples/search/warnings.ts +++ b/x-pack/test_serverless/functional/test_suites/common/examples/search/warnings.ts @@ -29,6 +29,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { // FLAKY: https://github.com/elastic/kibana/issues/165502 // FLAKY: https://github.com/elastic/kibana/issues/165503 // FLAKY: https://github.com/elastic/kibana/issues/165624 + // FLAKY: https://github.com/elastic/kibana/issues/165635 describe.skip('handling warnings with search source fetch', function () { const dataViewTitle = 'sample-01,sample-01-rollup'; const fromTime = 'Jun 17, 2022 @ 00:00:00.000'; From 7fb4b99afd29fb4817e98ebf20e3033a7c46f65e Mon Sep 17 00:00:00 2001 From: Tiago Costa Date: Wed, 6 Sep 2023 17:07:14 +0100 Subject: [PATCH 46/97] skip flaky suite (#165637) --- .../cypress/e2e/header/search_bar.cy.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/x-pack/test/security_solution_cypress/cypress/e2e/header/search_bar.cy.ts b/x-pack/test/security_solution_cypress/cypress/e2e/header/search_bar.cy.ts index b4c33004e9675..4f1c23aa4ebf8 100644 --- a/x-pack/test/security_solution_cypress/cypress/e2e/header/search_bar.cy.ts +++ b/x-pack/test/security_solution_cypress/cypress/e2e/header/search_bar.cy.ts @@ -22,7 +22,8 @@ import { getHostIpFilter } from '../../objects/filter'; import { HOSTS_URL } from '../../urls/navigation'; import { waitForAllHostsToBeLoaded } from '../../tasks/hosts/all_hosts'; -describe('SearchBar', { tags: ['@ess', '@serverless'] }, () => { +// FLAKY: https://github.com/elastic/kibana/issues/165637 +describe('SearchBar', { tags: ['@ess', '@serverless', '@brokenInServerless'] }, () => { beforeEach(() => { login(); visit(HOSTS_URL); From 1a9bb19e572e75232e81f225ea4d9029ec3d2c50 Mon Sep 17 00:00:00 2001 From: Tiago Costa Date: Wed, 6 Sep 2023 17:09:20 +0100 Subject: [PATCH 47/97] skip flaky suite (#165638) --- .../cypress/e2e/investigations/timelines/full_screen.cy.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/x-pack/test/security_solution_cypress/cypress/e2e/investigations/timelines/full_screen.cy.ts b/x-pack/test/security_solution_cypress/cypress/e2e/investigations/timelines/full_screen.cy.ts index 78aeca210a4e0..3f07971d66f3c 100644 --- a/x-pack/test/security_solution_cypress/cypress/e2e/investigations/timelines/full_screen.cy.ts +++ b/x-pack/test/security_solution_cypress/cypress/e2e/investigations/timelines/full_screen.cy.ts @@ -18,7 +18,8 @@ import { populateTimeline } from '../../../tasks/timeline'; import { HOSTS_URL } from '../../../urls/navigation'; -describe('Toggle full screen', { tags: ['@ess', '@serverless'] }, () => { +// FLAKY: https://github.com/elastic/kibana/issues/165638 +describe('Toggle full screen', { tags: ['@ess', '@serverless', '@brokenInServerless'] }, () => { before(() => { cleanKibana(); }); From 456f47f3aba9804670cb463ed9fd6002672956a9 Mon Sep 17 00:00:00 2001 From: Jiawei Wu <74562234+JiaweiWu@users.noreply.github.com> Date: Wed, 6 Sep 2023 09:13:36 -0700 Subject: [PATCH 48/97] [RAM] Introduce maxScheduledPerMinute rule circuit breaker and route (#164791) ## Summary Resolves: https://github.com/elastic/kibana/issues/162262 This PR is the backend changes to add a circuit breaker `xpack.alerting.rules.maxScheduledPerMinute` to both serverless and other environments that limits the number of rules to 400 runs / minute and 10000 runs / minute, respectively. There will be another PR to follow this one that gives the user UI hints when creating/editing rules that go over this limit. This circuit breaker check is applied to the following routes: - Create Rule - Update Rule - Enable Rule - Bulk Enable Rule - Bulk Edit Rule Also adds a new route: `/internal/alerting/rules/_schedule_frequency` to get the current total schedules per minute (of enabled rules) and the remaining interval allotment. ### 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 --------- Co-authored-by: kibanamachine <42973632+kibanamachine@users.noreply.github.com> Co-authored-by: lcawl Co-authored-by: Xavier Mouligneau --- .buildkite/ftr_configs.yml | 1 + config/serverless.yml | 1 + docs/settings/alert-action-settings.asciidoc | 3 + .../alerting/common/parse_duration.test.ts | 24 ++ .../plugins/alerting/common/parse_duration.ts | 15 ++ .../rule/apis/get_schedule_frequency/index.ts | 26 ++ .../get_schedule_frequency/schemas/latest.ts | 8 + .../apis/get_schedule_frequency/schemas/v1.ts | 17 ++ .../get_schedule_frequency/types/latest.ts | 8 + .../apis/get_schedule_frequency/types/v1.ts | 15 ++ .../methods/bulk_edit/bulk_edit_rules.test.ts | 74 +++++- .../rule/methods/bulk_edit/bulk_edit_rules.ts | 64 ++++- .../rule/methods/create/create_rule.test.ts | 13 +- .../rule/methods/create/create_rule.ts | 7 + .../get_schedule_frequency.test.ts | 233 ++++++++++++++++++ .../get_schedule_frequency.ts | 115 +++++++++ .../methods/get_schedule_frequency/index.ts | 10 + .../get_schedule_frequency_result_schema.ts | 13 + .../get_schedule_frequency/schema/index.ts | 8 + .../types/get_schedule_frequency_result.ts | 11 + .../get_schedule_frequency/types/index.ts | 8 + x-pack/plugins/alerting/server/config.test.ts | 1 + x-pack/plugins/alerting/server/config.ts | 6 +- x-pack/plugins/alerting/server/plugin.test.ts | 1 + x-pack/plugins/alerting/server/plugin.ts | 4 +- .../plugins/alerting/server/routes/index.ts | 2 + .../get_schedule_frequency_route.test.ts | 59 +++++ .../get_schedule_frequency_route.ts | 38 +++ .../rule/apis/get_schedule_frequency/index.ts | 8 + .../transforms/index.ts | 10 + .../latest.ts | 8 + .../v1.ts | 18 ++ .../alerting/server/rules_client.mock.ts | 1 + .../lib/create_new_api_key_set.test.ts | 9 +- .../rules_client/methods/bulk_enable.ts | 210 +++++++++------- .../server/rules_client/methods/enable.ts | 11 + .../server/rules_client/methods/update.ts | 16 ++ .../server/rules_client/rules_client.ts | 3 + .../rules_client/tests/aggregate.test.ts | 9 +- .../rules_client/tests/bulk_delete.test.ts | 5 +- .../rules_client/tests/bulk_disable.test.ts | 5 +- .../rules_client/tests/bulk_enable.test.ts | 9 +- .../tests/clear_expired_snoozes.test.ts | 9 +- .../server/rules_client/tests/delete.test.ts | 9 +- .../server/rules_client/tests/disable.test.ts | 9 +- .../server/rules_client/tests/enable.test.ts | 13 +- .../server/rules_client/tests/find.test.ts | 9 +- .../server/rules_client/tests/get.test.ts | 9 +- .../tests/get_action_error_log.test.ts | 9 +- .../tests/get_alert_state.test.ts | 9 +- .../tests/get_alert_summary.test.ts | 9 +- .../tests/get_execution_log.test.ts | 9 +- .../rules_client/tests/get_tags.test.ts | 9 +- .../tests/list_rule_types.test.ts | 9 +- .../rules_client/tests/mute_all.test.ts | 9 +- .../rules_client/tests/mute_instance.test.ts | 9 +- .../server/rules_client/tests/resolve.test.ts | 9 +- .../rules_client/tests/run_soon.test.ts | 9 +- .../rules_client/tests/unmute_all.test.ts | 9 +- .../tests/unmute_instance.test.ts | 9 +- .../server/rules_client/tests/update.test.ts | 13 +- .../rules_client/tests/update_api_key.test.ts | 9 +- .../alerting/server/rules_client/types.ts | 9 +- .../rules_client_conflict_retries.test.ts | 13 +- .../server/rules_client_factory.test.ts | 8 + .../alerting/server/rules_client_factory.ts | 9 + .../alerting/server/test_utils/index.ts | 1 + .../server/routes/config.test.ts | 8 +- .../alerting_api_integration/common/config.ts | 8 + .../config_with_schedule_circuit_breaker.ts | 20 ++ .../bulk_edit_with_circuit_breaker.ts | 124 ++++++++++ .../bulk_enable_with_circuit_breaker.ts | 66 +++++ .../create_with_circuit_breaker.ts | 73 ++++++ .../enable_with_circuit_breaker.ts | 52 ++++ .../get_schedule_frequency.ts | 83 +++++++ .../schedule_circuit_breaker/index.ts | 31 +++ .../update_with_circuit_breaker.ts | 99 ++++++++ 77 files changed, 1767 insertions(+), 132 deletions(-) create mode 100644 x-pack/plugins/alerting/common/routes/rule/apis/get_schedule_frequency/index.ts create mode 100644 x-pack/plugins/alerting/common/routes/rule/apis/get_schedule_frequency/schemas/latest.ts create mode 100644 x-pack/plugins/alerting/common/routes/rule/apis/get_schedule_frequency/schemas/v1.ts create mode 100644 x-pack/plugins/alerting/common/routes/rule/apis/get_schedule_frequency/types/latest.ts create mode 100644 x-pack/plugins/alerting/common/routes/rule/apis/get_schedule_frequency/types/v1.ts create mode 100644 x-pack/plugins/alerting/server/application/rule/methods/get_schedule_frequency/get_schedule_frequency.test.ts create mode 100644 x-pack/plugins/alerting/server/application/rule/methods/get_schedule_frequency/get_schedule_frequency.ts create mode 100644 x-pack/plugins/alerting/server/application/rule/methods/get_schedule_frequency/index.ts create mode 100644 x-pack/plugins/alerting/server/application/rule/methods/get_schedule_frequency/schema/get_schedule_frequency_result_schema.ts create mode 100644 x-pack/plugins/alerting/server/application/rule/methods/get_schedule_frequency/schema/index.ts create mode 100644 x-pack/plugins/alerting/server/application/rule/methods/get_schedule_frequency/types/get_schedule_frequency_result.ts create mode 100644 x-pack/plugins/alerting/server/application/rule/methods/get_schedule_frequency/types/index.ts create mode 100644 x-pack/plugins/alerting/server/routes/rule/apis/get_schedule_frequency/get_schedule_frequency_route.test.ts create mode 100644 x-pack/plugins/alerting/server/routes/rule/apis/get_schedule_frequency/get_schedule_frequency_route.ts create mode 100644 x-pack/plugins/alerting/server/routes/rule/apis/get_schedule_frequency/index.ts create mode 100644 x-pack/plugins/alerting/server/routes/rule/apis/get_schedule_frequency/transforms/index.ts create mode 100644 x-pack/plugins/alerting/server/routes/rule/apis/get_schedule_frequency/transforms/transform_get_schedule_frequency_result/latest.ts create mode 100644 x-pack/plugins/alerting/server/routes/rule/apis/get_schedule_frequency/transforms/transform_get_schedule_frequency_result/v1.ts create mode 100644 x-pack/test/alerting_api_integration/security_and_spaces/group3/config_with_schedule_circuit_breaker.ts create mode 100644 x-pack/test/alerting_api_integration/security_and_spaces/group3/tests/alerting/schedule_circuit_breaker/bulk_edit_with_circuit_breaker.ts create mode 100644 x-pack/test/alerting_api_integration/security_and_spaces/group3/tests/alerting/schedule_circuit_breaker/bulk_enable_with_circuit_breaker.ts create mode 100644 x-pack/test/alerting_api_integration/security_and_spaces/group3/tests/alerting/schedule_circuit_breaker/create_with_circuit_breaker.ts create mode 100644 x-pack/test/alerting_api_integration/security_and_spaces/group3/tests/alerting/schedule_circuit_breaker/enable_with_circuit_breaker.ts create mode 100644 x-pack/test/alerting_api_integration/security_and_spaces/group3/tests/alerting/schedule_circuit_breaker/get_schedule_frequency.ts create mode 100644 x-pack/test/alerting_api_integration/security_and_spaces/group3/tests/alerting/schedule_circuit_breaker/index.ts create mode 100644 x-pack/test/alerting_api_integration/security_and_spaces/group3/tests/alerting/schedule_circuit_breaker/update_with_circuit_breaker.ts diff --git a/.buildkite/ftr_configs.yml b/.buildkite/ftr_configs.yml index 7d83c0851eb8c..c838c83e5253b 100644 --- a/.buildkite/ftr_configs.yml +++ b/.buildkite/ftr_configs.yml @@ -171,6 +171,7 @@ enabled: - x-pack/test/alerting_api_integration/security_and_spaces/group1/config.ts - x-pack/test/alerting_api_integration/security_and_spaces/group2/config.ts - x-pack/test/alerting_api_integration/security_and_spaces/group3/config.ts + - x-pack/test/alerting_api_integration/security_and_spaces/group3/config_with_schedule_circuit_breaker.ts - x-pack/test/alerting_api_integration/security_and_spaces/group2/config_non_dedicated_task_runner.ts - x-pack/test/alerting_api_integration/spaces_only/tests/alerting/group1/config.ts - x-pack/test/alerting_api_integration/spaces_only/tests/alerting/group2/config.ts diff --git a/config/serverless.yml b/config/serverless.yml index 1349f71d019e6..6f5235ffdedd2 100644 --- a/config/serverless.yml +++ b/config/serverless.yml @@ -117,6 +117,7 @@ xpack.alerting.rules.run.ruleTypeOverrides: - id: siem.indicatorRule timeout: 1m xpack.alerting.rules.minimumScheduleInterval.enforce: true +xpack.alerting.rules.maxScheduledPerMinute: 400 xpack.actions.run.maxAttempts: 10 # Disables ESQL in advanced settings (hides it from the UI) diff --git a/docs/settings/alert-action-settings.asciidoc b/docs/settings/alert-action-settings.asciidoc index c7a43932fa1f8..37d391404bcb8 100644 --- a/docs/settings/alert-action-settings.asciidoc +++ b/docs/settings/alert-action-settings.asciidoc @@ -301,6 +301,9 @@ Specifies whether to skip writing alerts and scheduling actions if rule processing was cancelled due to a timeout. Default: `true`. This setting can be overridden by individual rule types. +`xpack.alerting.rules.maxScheduledPerMinute` {ess-icon}:: +Specifies the maximum number of rules to run per minute. Default: 10000 + `xpack.alerting.rules.minimumScheduleInterval.value` {ess-icon}:: Specifies the minimum schedule interval for rules. This minimum is applied to all rules created or updated after you set this value. The time is formatted as a number and a time unit (`s`, `m`, `h`, or `d`). diff --git a/x-pack/plugins/alerting/common/parse_duration.test.ts b/x-pack/plugins/alerting/common/parse_duration.test.ts index c661eab2691fe..279676a524550 100644 --- a/x-pack/plugins/alerting/common/parse_duration.test.ts +++ b/x-pack/plugins/alerting/common/parse_duration.test.ts @@ -10,6 +10,7 @@ import { formatDuration, getDurationNumberInItsUnit, getDurationUnitValue, + convertDurationToFrequency, } from './parse_duration'; test('parses seconds', () => { @@ -180,3 +181,26 @@ test('getDurationUnitValue hours', () => { const result = getDurationUnitValue('100h'); expect(result).toEqual('h'); }); + +test('convertDurationToFrequency converts duration', () => { + let result = convertDurationToFrequency('1m'); + expect(result).toEqual(1); + result = convertDurationToFrequency('5m'); + expect(result).toEqual(0.2); + result = convertDurationToFrequency('10s'); + expect(result).toEqual(6); + result = convertDurationToFrequency('1s'); + expect(result).toEqual(60); +}); + +test('convertDurationToFrequency throws when duration is invalid', () => { + expect(() => convertDurationToFrequency('0d')).toThrowErrorMatchingInlineSnapshot( + `"Invalid duration \\"0d\\". Durations must be of the form {number}x. Example: 5s, 5m, 5h or 5d\\""` + ); +}); + +test('convertDurationToFrequency throws when denomination is 0', () => { + expect(() => convertDurationToFrequency('1s', 0)).toThrowErrorMatchingInlineSnapshot( + `"Invalid denomination value: value cannot be 0"` + ); +}); diff --git a/x-pack/plugins/alerting/common/parse_duration.ts b/x-pack/plugins/alerting/common/parse_duration.ts index 3040b601fd64b..afbbf8609e6e3 100644 --- a/x-pack/plugins/alerting/common/parse_duration.ts +++ b/x-pack/plugins/alerting/common/parse_duration.ts @@ -10,6 +10,8 @@ const MINUTES_REGEX = /^[1-9][0-9]*m$/; const HOURS_REGEX = /^[1-9][0-9]*h$/; const DAYS_REGEX = /^[1-9][0-9]*d$/; +const MS_PER_MINUTE = 60 * 1000; + // parse an interval string '{digit*}{s|m|h|d}' into milliseconds export function parseDuration(duration: string): number { const parsed = parseInt(duration, 10); @@ -43,6 +45,19 @@ export function formatDuration(duration: string, fullUnit?: boolean): string { ); } +export function convertDurationToFrequency( + duration: string, + denomination: number = MS_PER_MINUTE +): number { + const durationInMs = parseDuration(duration); + if (denomination === 0) { + throw new Error(`Invalid denomination value: value cannot be 0`); + } + + const intervalInDenominationUnits = durationInMs / denomination; + return 1 / intervalInDenominationUnits; +} + export function getDurationNumberInItsUnit(duration: string): number { return parseInt(duration.replace(/[^0-9.]/g, ''), 10); } diff --git a/x-pack/plugins/alerting/common/routes/rule/apis/get_schedule_frequency/index.ts b/x-pack/plugins/alerting/common/routes/rule/apis/get_schedule_frequency/index.ts new file mode 100644 index 0000000000000..79955cf7058c5 --- /dev/null +++ b/x-pack/plugins/alerting/common/routes/rule/apis/get_schedule_frequency/index.ts @@ -0,0 +1,26 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +export { + getScheduleFrequencyResponseSchema, + getScheduleFrequencyResponseBodySchema, +} from './schemas/latest'; + +export type { + GetScheduleFrequencyResponse, + GetScheduleFrequencyResponseBody, +} from './types/latest'; + +export { + getScheduleFrequencyResponseSchema as getScheduleFrequencyResponseSchemaV1, + getScheduleFrequencyResponseBodySchema as getScheduleFrequencyResponseBodySchemaV1, +} from './schemas/v1'; + +export type { + GetScheduleFrequencyResponse as GetScheduleFrequencyResponseV1, + GetScheduleFrequencyResponseBody as GetScheduleFrequencyResponseBodyV1, +} from './types/v1'; diff --git a/x-pack/plugins/alerting/common/routes/rule/apis/get_schedule_frequency/schemas/latest.ts b/x-pack/plugins/alerting/common/routes/rule/apis/get_schedule_frequency/schemas/latest.ts new file mode 100644 index 0000000000000..25300c97a6d2e --- /dev/null +++ b/x-pack/plugins/alerting/common/routes/rule/apis/get_schedule_frequency/schemas/latest.ts @@ -0,0 +1,8 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +export * from './v1'; diff --git a/x-pack/plugins/alerting/common/routes/rule/apis/get_schedule_frequency/schemas/v1.ts b/x-pack/plugins/alerting/common/routes/rule/apis/get_schedule_frequency/schemas/v1.ts new file mode 100644 index 0000000000000..a5afa275a21c8 --- /dev/null +++ b/x-pack/plugins/alerting/common/routes/rule/apis/get_schedule_frequency/schemas/v1.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; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { schema } from '@kbn/config-schema'; + +export const getScheduleFrequencyResponseBodySchema = schema.object({ + total_scheduled_per_minute: schema.number(), + remaining_schedules_per_minute: schema.number(), +}); + +export const getScheduleFrequencyResponseSchema = schema.object({ + body: getScheduleFrequencyResponseBodySchema, +}); diff --git a/x-pack/plugins/alerting/common/routes/rule/apis/get_schedule_frequency/types/latest.ts b/x-pack/plugins/alerting/common/routes/rule/apis/get_schedule_frequency/types/latest.ts new file mode 100644 index 0000000000000..25300c97a6d2e --- /dev/null +++ b/x-pack/plugins/alerting/common/routes/rule/apis/get_schedule_frequency/types/latest.ts @@ -0,0 +1,8 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +export * from './v1'; diff --git a/x-pack/plugins/alerting/common/routes/rule/apis/get_schedule_frequency/types/v1.ts b/x-pack/plugins/alerting/common/routes/rule/apis/get_schedule_frequency/types/v1.ts new file mode 100644 index 0000000000000..2d117b03c49b9 --- /dev/null +++ b/x-pack/plugins/alerting/common/routes/rule/apis/get_schedule_frequency/types/v1.ts @@ -0,0 +1,15 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import type { TypeOf } from '@kbn/config-schema'; +import { getScheduleFrequencyResponseSchemaV1, getScheduleFrequencyResponseBodySchemaV1 } from '..'; + +export type GetScheduleFrequencyResponseBody = TypeOf< + typeof getScheduleFrequencyResponseBodySchemaV1 +>; + +export type GetScheduleFrequencyResponse = TypeOf; diff --git a/x-pack/plugins/alerting/server/application/rule/methods/bulk_edit/bulk_edit_rules.test.ts b/x-pack/plugins/alerting/server/application/rule/methods/bulk_edit/bulk_edit_rules.test.ts index 5e672bcc83c68..af51009d71da1 100644 --- a/x-pack/plugins/alerting/server/application/rule/methods/bulk_edit/bulk_edit_rules.test.ts +++ b/x-pack/plugins/alerting/server/application/rule/methods/bulk_edit/bulk_edit_rules.test.ts @@ -10,7 +10,11 @@ import { omit } from 'lodash'; import { v4 as uuidv4 } from 'uuid'; import { AlertConsumers } from '@kbn/rule-data-utils'; import { RulesClient, ConstructorOptions } from '../../../../rules_client/rules_client'; -import { savedObjectsClientMock, loggingSystemMock } from '@kbn/core/server/mocks'; +import { + savedObjectsClientMock, + loggingSystemMock, + savedObjectsRepositoryMock, +} from '@kbn/core/server/mocks'; import { taskManagerMock } from '@kbn/task-manager-plugin/server/mocks'; import { ruleTypeRegistryMock } from '../../../../rule_type_registry.mock'; import { alertingAuthorizationMock } from '../../../../authorization/alerting_authorization.mock'; @@ -56,7 +60,12 @@ jest.mock('uuid', () => { return { v4: () => `${uuid++}` }; }); +jest.mock('../get_schedule_frequency', () => ({ + validateScheduleLimit: jest.fn(), +})); + const { isSnoozeActive } = jest.requireMock('../../../../lib/snooze/is_snooze_active'); +const { validateScheduleLimit } = jest.requireMock('../get_schedule_frequency'); const taskManager = taskManagerMock.createStart(); const ruleTypeRegistry = ruleTypeRegistryMock.create(); @@ -65,6 +74,7 @@ const encryptedSavedObjects = encryptedSavedObjectsMock.createClient(); const authorization = alertingAuthorizationMock.create(); const actionsAuthorization = actionsAuthorizationMock.create(); const auditLogger = auditLoggerMock.create(); +const internalSavedObjectsRepository = savedObjectsRepositoryMock.create(); const kibanaVersion = 'v8.2.0'; const createAPIKeyMock = jest.fn(); @@ -82,11 +92,13 @@ const rulesClientParams: jest.Mocked = { getUserName: jest.fn(), createAPIKey: createAPIKeyMock, logger: loggingSystemMock.create().get(), + internalSavedObjectsRepository, encryptedSavedObjectsClient: encryptedSavedObjects, getActionsClient: jest.fn(), getEventLogClient: jest.fn(), kibanaVersion, auditLogger, + maxScheduledPerMinute: 10000, minimumScheduleInterval: { value: '1m', enforce: false }, isAuthenticationTypeAPIKey: isAuthenticationTypeApiKeyMock, getAuthenticationAPIKey: getAuthenticationApiKeyMock, @@ -2495,6 +2507,66 @@ describe('bulkEdit()', () => { `Error updating rule with ID "${existingDecryptedRule.id}": the interval 10m is longer than the action frequencies` ); }); + + test('should only validate schedule limit if schedule is being modified', async () => { + unsecuredSavedObjectsClient.bulkCreate.mockResolvedValue({ + saved_objects: [ + { + id: '1', + type: 'alert', + attributes: { + enabled: true, + tags: ['foo', 'test-1'], + alertTypeId: 'myType', + schedule: { interval: '1m' }, + consumer: 'myApp', + scheduledTaskId: 'task-123', + executionStatus: { + lastExecutionDate: '2019-02-12T21:01:22.479Z', + status: 'pending', + }, + params: {}, + throttle: null, + notifyWhen: null, + actions: [], + revision: 0, + }, + references: [], + version: '123', + }, + ], + }); + + await rulesClient.bulkEdit({ + filter: '', + operations: [ + { + field: 'tags', + operation: 'add', + value: ['test-1'], + }, + ], + }); + + expect(validateScheduleLimit).toHaveBeenCalledTimes(0); + + await rulesClient.bulkEdit({ + operations: [ + { + field: 'schedule', + operation: 'set', + value: { interval: '2m' }, + }, + { + field: 'tags', + operation: 'add', + value: ['test-1'], + }, + ], + }); + + expect(validateScheduleLimit).toHaveBeenCalledTimes(1); + }); }); describe('paramsModifier', () => { diff --git a/x-pack/plugins/alerting/server/application/rule/methods/bulk_edit/bulk_edit_rules.ts b/x-pack/plugins/alerting/server/application/rule/methods/bulk_edit/bulk_edit_rules.ts index 050b138eddd6b..d76162696ead2 100644 --- a/x-pack/plugins/alerting/server/application/rule/methods/bulk_edit/bulk_edit_rules.ts +++ b/x-pack/plugins/alerting/server/application/rule/methods/bulk_edit/bulk_edit_rules.ts @@ -77,6 +77,11 @@ import { transformRuleDomainToRuleAttributes, transformRuleDomainToRule, } from '../../transforms'; +import { validateScheduleLimit } from '../get_schedule_frequency'; + +const isValidInterval = (interval: string | undefined): interval is string => { + return interval !== undefined; +}; export const bulkEditFieldsToExcludeFromRevisionUpdates = new Set(['snoozeSchedule', 'apiKey']); @@ -286,8 +291,16 @@ async function bulkEditRulesOcc( const errors: BulkOperationError[] = []; const apiKeysMap: ApiKeysMap = new Map(); const username = await context.getUserName(); + const prevInterval: string[] = []; for await (const response of rulesFinder.find()) { + const intervals = response.saved_objects + .filter((rule) => rule.attributes.enabled) + .map((rule) => rule.attributes.schedule?.interval) + .filter(isValidInterval); + + prevInterval.concat(intervals); + await pMap( response.saved_objects, async (rule: SavedObjectsFindResult) => @@ -308,9 +321,44 @@ async function bulkEditRulesOcc( } await rulesFinder.close(); + const updatedInterval = rules + .filter((rule) => rule.attributes.enabled) + .map((rule) => rule.attributes.schedule?.interval) + .filter(isValidInterval); + + try { + if (operations.some((operation) => operation.field === 'schedule')) { + await validateScheduleLimit({ + context, + prevInterval, + updatedInterval, + }); + } + } catch (error) { + return { + apiKeysToInvalidate: Array.from(apiKeysMap.values()) + .filter((value) => value.newApiKey) + .map((value) => value.newApiKey as string), + resultSavedObjects: [], + rules: [], + errors: rules.map((rule) => ({ + message: `Failed to bulk edit rule - ${error.message}`, + rule: { + id: rule.id, + name: rule.attributes.name || 'n/a', + }, + })), + skipped: [], + }; + } + const { result, apiKeysToInvalidate } = rules.length > 0 - ? await saveBulkUpdatedRules(context, rules, apiKeysMap) + ? await saveBulkUpdatedRules({ + context, + rules, + apiKeysMap, + }) : { result: { saved_objects: [] }, apiKeysToInvalidate: [], @@ -821,11 +869,15 @@ function updateAttributes( }; } -async function saveBulkUpdatedRules( - context: RulesClientContext, - rules: Array>, - apiKeysMap: ApiKeysMap -) { +async function saveBulkUpdatedRules({ + context, + rules, + apiKeysMap, +}: { + context: RulesClientContext; + rules: Array>; + apiKeysMap: ApiKeysMap; +}) { const apiKeysToInvalidate: string[] = []; let result; try { diff --git a/x-pack/plugins/alerting/server/application/rule/methods/create/create_rule.test.ts b/x-pack/plugins/alerting/server/application/rule/methods/create/create_rule.test.ts index 496cfe317586f..ef2d91ea484ff 100644 --- a/x-pack/plugins/alerting/server/application/rule/methods/create/create_rule.test.ts +++ b/x-pack/plugins/alerting/server/application/rule/methods/create/create_rule.test.ts @@ -8,7 +8,11 @@ import { schema } from '@kbn/config-schema'; import { CreateRuleParams } from './create_rule'; import { RulesClient, ConstructorOptions } from '../../../../rules_client'; -import { savedObjectsClientMock, loggingSystemMock } from '@kbn/core/server/mocks'; +import { + savedObjectsClientMock, + loggingSystemMock, + savedObjectsRepositoryMock, +} from '@kbn/core/server/mocks'; import { taskManagerMock } from '@kbn/task-manager-plugin/server/mocks'; import { ruleTypeRegistryMock } from '../../../../rule_type_registry.mock'; import { alertingAuthorizationMock } from '../../../../authorization/alerting_authorization.mock'; @@ -43,6 +47,10 @@ jest.mock('uuid', () => { return { v4: () => `${uuid++}` }; }); +jest.mock('../get_schedule_frequency', () => ({ + validateScheduleLimit: jest.fn(), +})); + const taskManager = taskManagerMock.createStart(); const ruleTypeRegistry = ruleTypeRegistryMock.create(); const unsecuredSavedObjectsClient = savedObjectsClientMock.create(); @@ -50,6 +58,7 @@ const encryptedSavedObjects = encryptedSavedObjectsMock.createClient(); const authorization = alertingAuthorizationMock.create(); const actionsAuthorization = actionsAuthorizationMock.create(); const auditLogger = auditLoggerMock.create(); +const internalSavedObjectsRepository = savedObjectsRepositoryMock.create(); const kibanaVersion = 'v8.0.0'; const rulesClientParams: jest.Mocked = { @@ -63,11 +72,13 @@ const rulesClientParams: jest.Mocked = { getUserName: jest.fn(), createAPIKey: jest.fn(), logger: loggingSystemMock.create().get(), + internalSavedObjectsRepository, encryptedSavedObjectsClient: encryptedSavedObjects, getActionsClient: jest.fn(), getEventLogClient: jest.fn(), kibanaVersion, auditLogger, + maxScheduledPerMinute: 10000, minimumScheduleInterval: { value: '1m', enforce: false }, isAuthenticationTypeAPIKey: jest.fn(), getAuthenticationAPIKey: jest.fn(), diff --git a/x-pack/plugins/alerting/server/application/rule/methods/create/create_rule.ts b/x-pack/plugins/alerting/server/application/rule/methods/create/create_rule.ts index ddd6691a635a3..616a16a8315ed 100644 --- a/x-pack/plugins/alerting/server/application/rule/methods/create/create_rule.ts +++ b/x-pack/plugins/alerting/server/application/rule/methods/create/create_rule.ts @@ -36,6 +36,7 @@ import { RuleAttributes } from '../../../../data/rule/types'; import type { CreateRuleData } from './types'; import { createRuleDataSchema } from './schemas'; import { createRuleSavedObject } from '../../../../rules_client/lib'; +import { validateScheduleLimit } from '../get_schedule_frequency'; export interface CreateRuleOptions { id?: string; @@ -60,6 +61,12 @@ export async function createRule( try { createRuleDataSchema.validate(data); + if (data.enabled) { + await validateScheduleLimit({ + context, + updatedInterval: data.schedule.interval, + }); + } } catch (error) { throw Boom.badRequest(`Error validating create data - ${error.message}`); } diff --git a/x-pack/plugins/alerting/server/application/rule/methods/get_schedule_frequency/get_schedule_frequency.test.ts b/x-pack/plugins/alerting/server/application/rule/methods/get_schedule_frequency/get_schedule_frequency.test.ts new file mode 100644 index 0000000000000..cbd1476e111a1 --- /dev/null +++ b/x-pack/plugins/alerting/server/application/rule/methods/get_schedule_frequency/get_schedule_frequency.test.ts @@ -0,0 +1,233 @@ +/* + * 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 { validateScheduleLimit } from './get_schedule_frequency'; +import { RulesClient, ConstructorOptions } from '../../../../rules_client'; +import { + savedObjectsClientMock, + loggingSystemMock, + savedObjectsRepositoryMock, +} from '@kbn/core/server/mocks'; +import { taskManagerMock } from '@kbn/task-manager-plugin/server/mocks'; +import { ruleTypeRegistryMock } from '../../../../rule_type_registry.mock'; +import { alertingAuthorizationMock } from '../../../../authorization/alerting_authorization.mock'; +import { encryptedSavedObjectsMock } from '@kbn/encrypted-saved-objects-plugin/server/mocks'; +import { actionsAuthorizationMock } from '@kbn/actions-plugin/server/mocks'; +import { AlertingAuthorization } from '../../../../authorization/alerting_authorization'; +import { ActionsAuthorization } from '@kbn/actions-plugin/server'; +import { auditLoggerMock } from '@kbn/security-plugin/server/audit/mocks'; + +const taskManager = taskManagerMock.createStart(); +const ruleTypeRegistry = ruleTypeRegistryMock.create(); +const unsecuredSavedObjectsClient = savedObjectsClientMock.create(); +const encryptedSavedObjects = encryptedSavedObjectsMock.createClient(); +const authorization = alertingAuthorizationMock.create(); +const actionsAuthorization = actionsAuthorizationMock.create(); +const auditLogger = auditLoggerMock.create(); +const internalSavedObjectsRepository = savedObjectsRepositoryMock.create(); + +const kibanaVersion = 'v8.0.0'; + +const rulesClientParams: jest.Mocked = { + taskManager, + ruleTypeRegistry, + unsecuredSavedObjectsClient, + authorization: authorization as unknown as AlertingAuthorization, + actionsAuthorization: actionsAuthorization as unknown as ActionsAuthorization, + spaceId: 'default', + namespace: 'default', + getUserName: jest.fn(), + createAPIKey: jest.fn(), + logger: loggingSystemMock.create().get(), + internalSavedObjectsRepository, + encryptedSavedObjectsClient: encryptedSavedObjects, + getActionsClient: jest.fn(), + getEventLogClient: jest.fn(), + kibanaVersion, + auditLogger, + maxScheduledPerMinute: 100, + minimumScheduleInterval: { value: '1m', enforce: false }, + isAuthenticationTypeAPIKey: jest.fn(), + getAuthenticationAPIKey: jest.fn(), +}; + +const getMockAggregationResult = ( + intervalAggs: Array<{ + interval: string; + count: number; + }> +) => { + return { + aggregations: { + schedule_intervals: { + buckets: intervalAggs.map(({ interval, count }) => ({ + key: interval, + doc_count: count, + })), + }, + }, + page: 1, + per_page: 20, + total: 1, + saved_objects: [], + }; +}; + +describe('getScheduleFrequency()', () => { + beforeEach(() => { + internalSavedObjectsRepository.find.mockResolvedValue( + getMockAggregationResult([ + { interval: '1m', count: 1 }, + { interval: '1m', count: 2 }, + { interval: '1m', count: 3 }, + { interval: '5m', count: 5 }, + { interval: '5m', count: 10 }, + { interval: '5m', count: 15 }, + ]) + ); + }); + + afterEach(() => { + jest.clearAllMocks(); + }); + + test('should return the correct schedule frequency results', async () => { + const rulesClient = new RulesClient(rulesClientParams); + const result = await rulesClient.getScheduleFrequency(); + + // (1 * 6) + (1/5 * 30) = 12 + expect(result.totalScheduledPerMinute).toEqual(12); + + // 100 - 88 + expect(result.remainingSchedulesPerMinute).toEqual(88); + }); + + test('should handle empty bucket correctly', async () => { + internalSavedObjectsRepository.find.mockResolvedValue({ + page: 1, + per_page: 20, + total: 1, + saved_objects: [], + }); + + const rulesClient = new RulesClient(rulesClientParams); + const result = await rulesClient.getScheduleFrequency(); + + expect(result.totalScheduledPerMinute).toEqual(0); + expect(result.remainingSchedulesPerMinute).toEqual(100); + }); + + test('should handle malformed schedule interval correctly', async () => { + internalSavedObjectsRepository.find.mockResolvedValue( + getMockAggregationResult([ + { interval: '1m', count: 1 }, + { interval: '1m', count: 2 }, + { interval: '1m', count: 3 }, + { interval: '5m', count: 5 }, + { interval: '5m', count: 10 }, + { interval: '5m', count: 15 }, + { interval: 'invalid', count: 15 }, + ]) + ); + + const rulesClient = new RulesClient(rulesClientParams); + const result = await rulesClient.getScheduleFrequency(); + + expect(result.totalScheduledPerMinute).toEqual(12); + expect(result.remainingSchedulesPerMinute).toEqual(88); + }); + + test('should not go below 0 for remaining schedules', async () => { + internalSavedObjectsRepository.find.mockResolvedValue( + getMockAggregationResult([ + { interval: '1m', count: 1 }, + { interval: '1m', count: 2 }, + { interval: '1m', count: 3 }, + { interval: '5m', count: 5 }, + { interval: '5m', count: 10 }, + { interval: '5m', count: 15 }, + ]) + ); + + const rulesClient = new RulesClient({ + ...rulesClientParams, + maxScheduledPerMinute: 10, + }); + const result = await rulesClient.getScheduleFrequency(); + expect(result.totalScheduledPerMinute).toEqual(12); + expect(result.remainingSchedulesPerMinute).toEqual(0); + }); +}); + +describe('validateScheduleLimit', () => { + const context = { + ...rulesClientParams, + maxScheduledPerMinute: 5, + minimumScheduleIntervalInMs: 1000, + fieldsToExcludeFromPublicApi: [], + }; + + beforeEach(() => { + internalSavedObjectsRepository.find.mockResolvedValue( + getMockAggregationResult([{ interval: '1m', count: 2 }]) + ); + }); + + afterEach(() => { + jest.clearAllMocks(); + }); + + test('should not throw if the updated interval does not exceed limits', () => { + return expect( + validateScheduleLimit({ + context, + updatedInterval: ['1m', '1m'], + }) + ).resolves.toBe(undefined); + }); + + test('should throw if the updated interval exceeds limits', () => { + return expect( + validateScheduleLimit({ + context, + updatedInterval: ['1m', '1m', '1m', '2m'], + }) + ).rejects.toThrowErrorMatchingInlineSnapshot( + `"Run limit reached: The rule has 3.5 runs per minute; there are only 3 runs per minute available."` + ); + }); + + test('should not throw if previous interval was modified to be under the limit', () => { + internalSavedObjectsRepository.find.mockResolvedValue( + getMockAggregationResult([{ interval: '1m', count: 6 }]) + ); + + return expect( + validateScheduleLimit({ + context, + prevInterval: ['1m', '1m'], + updatedInterval: ['2m', '2m'], + }) + ).resolves.toBe(undefined); + }); + + test('should throw if the previous interval was modified to exceed the limit', () => { + internalSavedObjectsRepository.find.mockResolvedValue( + getMockAggregationResult([{ interval: '1m', count: 5 }]) + ); + + return expect( + validateScheduleLimit({ + context, + prevInterval: ['1m'], + updatedInterval: ['30s'], + }) + ).rejects.toThrowErrorMatchingInlineSnapshot( + `"Run limit reached: The rule has 2 runs per minute; there are only 1 runs per minute available."` + ); + }); +}); diff --git a/x-pack/plugins/alerting/server/application/rule/methods/get_schedule_frequency/get_schedule_frequency.ts b/x-pack/plugins/alerting/server/application/rule/methods/get_schedule_frequency/get_schedule_frequency.ts new file mode 100644 index 0000000000000..254cad93fd341 --- /dev/null +++ b/x-pack/plugins/alerting/server/application/rule/methods/get_schedule_frequency/get_schedule_frequency.ts @@ -0,0 +1,115 @@ +/* + * 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 { RulesClientContext } from '../../../../rules_client/types'; +import { RuleDomain } from '../../types'; +import { convertDurationToFrequency } from '../../../../../common/parse_duration'; +import { GetScheduleFrequencyResult } from './types'; +import { getSchemaFrequencyResultSchema } from './schema'; + +export interface SchedulesIntervalAggregationResult { + schedule_intervals: { + buckets: Array<{ + key: string; + doc_count: number; + }>; + }; +} + +const convertIntervalToFrequency = (context: RulesClientContext, schedule: string) => { + let scheduleFrequency = 0; + + try { + // Normalize the interval (period) in terms of minutes + scheduleFrequency = convertDurationToFrequency(schedule); + } catch (e) { + context.logger.warn( + `Failed to parse rule schedule interval for schedule frequency calculation: ${e.message}` + ); + } + + return scheduleFrequency; +}; + +export const getScheduleFrequency = async ( + context: RulesClientContext +): Promise => { + const response = await context.internalSavedObjectsRepository.find< + RuleDomain, + SchedulesIntervalAggregationResult + >({ + type: 'alert', + filter: 'alert.attributes.enabled: true', + namespaces: ['*'], + aggs: { + schedule_intervals: { + terms: { + field: 'alert.attributes.schedule.interval', + }, + }, + }, + }); + + const buckets = response.aggregations?.schedule_intervals.buckets ?? []; + + const totalScheduledPerMinute = buckets.reduce((result, { key, doc_count: occurrence }) => { + const scheduleFrequency = convertIntervalToFrequency(context, key); + + // Sum up all of the frequencies, since this is an aggregation. + return result + scheduleFrequency * occurrence; + }, 0); + + const result = { + totalScheduledPerMinute, + remainingSchedulesPerMinute: Math.max( + context.maxScheduledPerMinute - totalScheduledPerMinute, + 0 + ), + }; + + try { + getSchemaFrequencyResultSchema.validate(result); + } catch (e) { + context.logger.warn(`Error validating rule schedules per minute: ${e}`); + } + + return result; +}; + +interface ValidateScheduleLimitParams { + context: RulesClientContext; + prevInterval?: string | string[]; + updatedInterval: string | string[]; +} + +export const validateScheduleLimit = async (params: ValidateScheduleLimitParams) => { + const { context, prevInterval = [], updatedInterval = [] } = params; + + const prevIntervalArray = Array.isArray(prevInterval) ? prevInterval : [prevInterval]; + const updatedIntervalArray = Array.isArray(updatedInterval) ? updatedInterval : [updatedInterval]; + + const prevSchedulePerMinute = prevIntervalArray.reduce((result, interval) => { + const scheduleFrequency = convertIntervalToFrequency(context, interval); + return result + scheduleFrequency; + }, 0); + + const updatedSchedulesPerMinute = updatedIntervalArray.reduce((result, interval) => { + const scheduleFrequency = convertIntervalToFrequency(context, interval); + return result + scheduleFrequency; + }, 0); + + const { remainingSchedulesPerMinute } = await getScheduleFrequency(context); + + // Compute the new remaining schedules per minute if we are editing rules. + // So we add back the edited schedules, since we assume those are being edited. + const computedRemainingSchedulesPerMinute = remainingSchedulesPerMinute + prevSchedulePerMinute; + + if (computedRemainingSchedulesPerMinute < updatedSchedulesPerMinute) { + throw new Error( + `Run limit reached: The rule has ${updatedSchedulesPerMinute} runs per minute; there are only ${computedRemainingSchedulesPerMinute} runs per minute available.` + ); + } +}; diff --git a/x-pack/plugins/alerting/server/application/rule/methods/get_schedule_frequency/index.ts b/x-pack/plugins/alerting/server/application/rule/methods/get_schedule_frequency/index.ts new file mode 100644 index 0000000000000..e39a1cd8a671c --- /dev/null +++ b/x-pack/plugins/alerting/server/application/rule/methods/get_schedule_frequency/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; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +export type { GetScheduleFrequencyResult } from './types'; + +export { getScheduleFrequency, validateScheduleLimit } from './get_schedule_frequency'; diff --git a/x-pack/plugins/alerting/server/application/rule/methods/get_schedule_frequency/schema/get_schedule_frequency_result_schema.ts b/x-pack/plugins/alerting/server/application/rule/methods/get_schedule_frequency/schema/get_schedule_frequency_result_schema.ts new file mode 100644 index 0000000000000..b547c33323a80 --- /dev/null +++ b/x-pack/plugins/alerting/server/application/rule/methods/get_schedule_frequency/schema/get_schedule_frequency_result_schema.ts @@ -0,0 +1,13 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { schema } from '@kbn/config-schema'; + +export const getSchemaFrequencyResultSchema = schema.object({ + totalScheduledPerMinute: schema.number({ min: 0 }), + remainingSchedulesPerMinute: schema.number({ min: 0 }), +}); diff --git a/x-pack/plugins/alerting/server/application/rule/methods/get_schedule_frequency/schema/index.ts b/x-pack/plugins/alerting/server/application/rule/methods/get_schedule_frequency/schema/index.ts new file mode 100644 index 0000000000000..474bcdd524433 --- /dev/null +++ b/x-pack/plugins/alerting/server/application/rule/methods/get_schedule_frequency/schema/index.ts @@ -0,0 +1,8 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +export { getSchemaFrequencyResultSchema } from './get_schedule_frequency_result_schema'; diff --git a/x-pack/plugins/alerting/server/application/rule/methods/get_schedule_frequency/types/get_schedule_frequency_result.ts b/x-pack/plugins/alerting/server/application/rule/methods/get_schedule_frequency/types/get_schedule_frequency_result.ts new file mode 100644 index 0000000000000..4f53ea2e82810 --- /dev/null +++ b/x-pack/plugins/alerting/server/application/rule/methods/get_schedule_frequency/types/get_schedule_frequency_result.ts @@ -0,0 +1,11 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { TypeOf } from '@kbn/config-schema'; +import { getSchemaFrequencyResultSchema } from '../schema'; + +export type GetScheduleFrequencyResult = TypeOf; diff --git a/x-pack/plugins/alerting/server/application/rule/methods/get_schedule_frequency/types/index.ts b/x-pack/plugins/alerting/server/application/rule/methods/get_schedule_frequency/types/index.ts new file mode 100644 index 0000000000000..24e3465bbf3ae --- /dev/null +++ b/x-pack/plugins/alerting/server/application/rule/methods/get_schedule_frequency/types/index.ts @@ -0,0 +1,8 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +export type { GetScheduleFrequencyResult } from './get_schedule_frequency_result'; diff --git a/x-pack/plugins/alerting/server/config.test.ts b/x-pack/plugins/alerting/server/config.test.ts index 7df579771a91c..164b317cdf2ac 100644 --- a/x-pack/plugins/alerting/server/config.test.ts +++ b/x-pack/plugins/alerting/server/config.test.ts @@ -23,6 +23,7 @@ describe('config validation', () => { }, "maxEphemeralActionsPerAlert": 10, "rules": Object { + "maxScheduledPerMinute": 10000, "minimumScheduleInterval": Object { "enforce": false, "value": "1m", diff --git a/x-pack/plugins/alerting/server/config.ts b/x-pack/plugins/alerting/server/config.ts index b1b9817ce1b9f..3ec1edb2f3c1c 100644 --- a/x-pack/plugins/alerting/server/config.ts +++ b/x-pack/plugins/alerting/server/config.ts @@ -38,6 +38,7 @@ const rulesSchema = schema.object({ }), enforce: schema.boolean({ defaultValue: false }), // if enforce is false, only warnings will be shown }), + maxScheduledPerMinute: schema.number({ defaultValue: 10000, max: 10000, min: 0 }), run: schema.object({ timeout: schema.maybe(schema.string({ validate: validateDurationSchema })), actions: schema.object({ @@ -70,7 +71,10 @@ export const configSchema = schema.object({ export type AlertingConfig = TypeOf; export type RulesConfig = TypeOf; -export type AlertingRulesConfig = Pick & { +export type AlertingRulesConfig = Pick< + AlertingConfig['rules'], + 'minimumScheduleInterval' | 'maxScheduledPerMinute' +> & { isUsingSecurity: boolean; }; export type ActionsConfig = RulesConfig['run']['actions']; diff --git a/x-pack/plugins/alerting/server/plugin.test.ts b/x-pack/plugins/alerting/server/plugin.test.ts index b355ecbf370a5..302bc7210c9f3 100644 --- a/x-pack/plugins/alerting/server/plugin.test.ts +++ b/x-pack/plugins/alerting/server/plugin.test.ts @@ -139,6 +139,7 @@ describe('Alerting Plugin', () => { await waitForSetupComplete(setupMocks); expect(setupContract.getConfig()).toEqual({ + maxScheduledPerMinute: 10000, isUsingSecurity: false, minimumScheduleInterval: { value: '1m', enforce: false }, }); diff --git a/x-pack/plugins/alerting/server/plugin.ts b/x-pack/plugins/alerting/server/plugin.ts index fafd9a13925ab..e2e98347d88fe 100644 --- a/x-pack/plugins/alerting/server/plugin.ts +++ b/x-pack/plugins/alerting/server/plugin.ts @@ -415,7 +415,7 @@ export class AlertingPlugin { }, getConfig: () => { return { - ...pick(this.config.rules, 'minimumScheduleInterval'), + ...pick(this.config.rules, ['minimumScheduleInterval', 'maxScheduledPerMinute']), isUsingSecurity: this.licenseState ? !!this.licenseState.getIsSecurityEnabled() : false, }; }, @@ -481,6 +481,7 @@ export class AlertingPlugin { taskManager: plugins.taskManager, securityPluginSetup: security, securityPluginStart: plugins.security, + internalSavedObjectsRepository: core.savedObjects.createInternalRepository(['alert']), encryptedSavedObjectsClient, spaceIdToNamespace, getSpaceId(request: KibanaRequest) { @@ -492,6 +493,7 @@ export class AlertingPlugin { authorization: alertingAuthorizationClientFactory, eventLogger: this.eventLogger, minimumScheduleInterval: this.config.rules.minimumScheduleInterval, + maxScheduledPerMinute: this.config.rules.maxScheduledPerMinute, }); rulesSettingsClientFactory.initialize({ diff --git a/x-pack/plugins/alerting/server/routes/index.ts b/x-pack/plugins/alerting/server/routes/index.ts index 7b9acfc7f77df..bdc9dcee21895 100644 --- a/x-pack/plugins/alerting/server/routes/index.ts +++ b/x-pack/plugins/alerting/server/routes/index.ts @@ -47,6 +47,7 @@ import { cloneRuleRoute } from './clone_rule'; import { getFlappingSettingsRoute } from './get_flapping_settings'; import { updateFlappingSettingsRoute } from './update_flapping_settings'; import { getRuleTagsRoute } from './get_rule_tags'; +import { getScheduleFrequencyRoute } from './rule/apis/get_schedule_frequency'; import { createMaintenanceWindowRoute } from './maintenance_window/create_maintenance_window'; import { getMaintenanceWindowRoute } from './maintenance_window/get_maintenance_window'; @@ -129,4 +130,5 @@ export function defineRoutes(opts: RouteOptions) { registerRulesValueSuggestionsRoute(router, licenseState, config$!); registerFieldsRoute(router, licenseState); bulkGetMaintenanceWindowRoute(router, licenseState); + getScheduleFrequencyRoute(router, licenseState); } diff --git a/x-pack/plugins/alerting/server/routes/rule/apis/get_schedule_frequency/get_schedule_frequency_route.test.ts b/x-pack/plugins/alerting/server/routes/rule/apis/get_schedule_frequency/get_schedule_frequency_route.test.ts new file mode 100644 index 0000000000000..9778bc12afc68 --- /dev/null +++ b/x-pack/plugins/alerting/server/routes/rule/apis/get_schedule_frequency/get_schedule_frequency_route.test.ts @@ -0,0 +1,59 @@ +/* + * 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 { getScheduleFrequencyRoute } from './get_schedule_frequency_route'; +import { httpServiceMock } from '@kbn/core/server/mocks'; +import { licenseStateMock } from '../../../../lib/license_state.mock'; +import { mockHandlerArguments } from '../../../_mock_handler_arguments'; +import { rulesClientMock } from '../../../../rules_client.mock'; + +const rulesClient = rulesClientMock.create(); + +jest.mock('../../../../lib/license_api_access', () => ({ + verifyApiAccess: jest.fn(), +})); + +beforeEach(() => { + jest.resetAllMocks(); +}); + +describe('getScheduleFrequencyRoute', () => { + it('gets the schedule frequency limit and remaining allotment', async () => { + const licenseState = licenseStateMock.create(); + const router = httpServiceMock.createRouter(); + + getScheduleFrequencyRoute(router, licenseState); + + const [config, handler] = router.get.mock.calls[0]; + + expect(config.path).toBe('/internal/alerting/rules/_schedule_frequency'); + + expect(config).toMatchInlineSnapshot(` + Object { + "path": "/internal/alerting/rules/_schedule_frequency", + "validate": Object {}, + } + `); + + rulesClient.getScheduleFrequency.mockResolvedValueOnce({ + totalScheduledPerMinute: 9000, + remainingSchedulesPerMinute: 1000, + }); + + const [context, req, res] = mockHandlerArguments({ rulesClient }, {}, ['ok']); + + await handler(context, req, res); + + expect(rulesClient.getScheduleFrequency).toHaveBeenCalledTimes(1); + expect(res.ok).toHaveBeenCalledWith({ + body: { + total_scheduled_per_minute: 9000, + remaining_schedules_per_minute: 1000, + }, + }); + }); +}); diff --git a/x-pack/plugins/alerting/server/routes/rule/apis/get_schedule_frequency/get_schedule_frequency_route.ts b/x-pack/plugins/alerting/server/routes/rule/apis/get_schedule_frequency/get_schedule_frequency_route.ts new file mode 100644 index 0000000000000..438c2f2b4aa54 --- /dev/null +++ b/x-pack/plugins/alerting/server/routes/rule/apis/get_schedule_frequency/get_schedule_frequency_route.ts @@ -0,0 +1,38 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { IRouter } from '@kbn/core/server'; +import { ILicenseState } from '../../../../lib'; +import { verifyAccessAndContext } from '../../../lib'; +import { AlertingRequestHandlerContext, INTERNAL_BASE_ALERTING_API_PATH } from '../../../../types'; +import { GetScheduleFrequencyResponseV1 } from '../../../../../common/routes/rule/apis/get_schedule_frequency'; +import { transformGetScheduleFrequencyResultV1 } from './transforms'; + +export const getScheduleFrequencyRoute = ( + router: IRouter, + licenseState: ILicenseState +) => { + router.get( + { + path: `${INTERNAL_BASE_ALERTING_API_PATH}/rules/_schedule_frequency`, + validate: {}, + }, + router.handleLegacyErrors( + verifyAccessAndContext(licenseState, async (context, req, res) => { + const rulesClient = (await context.alerting).getRulesClient(); + + const scheduleFrequencyResult = await rulesClient.getScheduleFrequency(); + + const response: GetScheduleFrequencyResponseV1 = { + body: transformGetScheduleFrequencyResultV1(scheduleFrequencyResult), + }; + + return res.ok(response); + }) + ) + ); +}; diff --git a/x-pack/plugins/alerting/server/routes/rule/apis/get_schedule_frequency/index.ts b/x-pack/plugins/alerting/server/routes/rule/apis/get_schedule_frequency/index.ts new file mode 100644 index 0000000000000..a27588e2cf9da --- /dev/null +++ b/x-pack/plugins/alerting/server/routes/rule/apis/get_schedule_frequency/index.ts @@ -0,0 +1,8 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +export { getScheduleFrequencyRoute } from './get_schedule_frequency_route'; diff --git a/x-pack/plugins/alerting/server/routes/rule/apis/get_schedule_frequency/transforms/index.ts b/x-pack/plugins/alerting/server/routes/rule/apis/get_schedule_frequency/transforms/index.ts new file mode 100644 index 0000000000000..06bdc9e64f637 --- /dev/null +++ b/x-pack/plugins/alerting/server/routes/rule/apis/get_schedule_frequency/transforms/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; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +export { transformGetScheduleFrequencyResult } from './transform_get_schedule_frequency_result/latest'; + +export { transformGetScheduleFrequencyResult as transformGetScheduleFrequencyResultV1 } from './transform_get_schedule_frequency_result/v1'; diff --git a/x-pack/plugins/alerting/server/routes/rule/apis/get_schedule_frequency/transforms/transform_get_schedule_frequency_result/latest.ts b/x-pack/plugins/alerting/server/routes/rule/apis/get_schedule_frequency/transforms/transform_get_schedule_frequency_result/latest.ts new file mode 100644 index 0000000000000..25300c97a6d2e --- /dev/null +++ b/x-pack/plugins/alerting/server/routes/rule/apis/get_schedule_frequency/transforms/transform_get_schedule_frequency_result/latest.ts @@ -0,0 +1,8 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +export * from './v1'; diff --git a/x-pack/plugins/alerting/server/routes/rule/apis/get_schedule_frequency/transforms/transform_get_schedule_frequency_result/v1.ts b/x-pack/plugins/alerting/server/routes/rule/apis/get_schedule_frequency/transforms/transform_get_schedule_frequency_result/v1.ts new file mode 100644 index 0000000000000..228de89cab7ca --- /dev/null +++ b/x-pack/plugins/alerting/server/routes/rule/apis/get_schedule_frequency/transforms/transform_get_schedule_frequency_result/v1.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. + */ + +import type { GetScheduleFrequencyResponseBodyV1 } from '../../../../../../../common/routes/rule/apis/get_schedule_frequency'; +import type { GetScheduleFrequencyResult } from '../../../../../../application/rule/methods/get_schedule_frequency'; + +export const transformGetScheduleFrequencyResult = ( + result: GetScheduleFrequencyResult +): GetScheduleFrequencyResponseBodyV1 => { + return { + total_scheduled_per_minute: result.totalScheduledPerMinute, + remaining_schedules_per_minute: result.remainingSchedulesPerMinute, + }; +}; diff --git a/x-pack/plugins/alerting/server/rules_client.mock.ts b/x-pack/plugins/alerting/server/rules_client.mock.ts index 4b98ef3abaf9d..ebe6f6c555a67 100644 --- a/x-pack/plugins/alerting/server/rules_client.mock.ts +++ b/x-pack/plugins/alerting/server/rules_client.mock.ts @@ -52,6 +52,7 @@ const createRulesClientMock = () => { runSoon: jest.fn(), clone: jest.fn(), getAlertFromRaw: jest.fn(), + getScheduleFrequency: jest.fn(), }; return mocked; }; diff --git a/x-pack/plugins/alerting/server/rules_client/lib/create_new_api_key_set.test.ts b/x-pack/plugins/alerting/server/rules_client/lib/create_new_api_key_set.test.ts index 6f3e595a1ab46..0548c5f7fc783 100644 --- a/x-pack/plugins/alerting/server/rules_client/lib/create_new_api_key_set.test.ts +++ b/x-pack/plugins/alerting/server/rules_client/lib/create_new_api_key_set.test.ts @@ -5,7 +5,11 @@ * 2.0. */ -import { savedObjectsClientMock, loggingSystemMock } from '@kbn/core/server/mocks'; +import { + savedObjectsClientMock, + loggingSystemMock, + savedObjectsRepositoryMock, +} from '@kbn/core/server/mocks'; import { taskManagerMock } from '@kbn/task-manager-plugin/server/mocks'; import { ruleTypeRegistryMock } from '../../rule_type_registry.mock'; import { alertingAuthorizationMock } from '../../authorization/alerting_authorization.mock'; @@ -24,6 +28,7 @@ const unsecuredSavedObjectsClient = savedObjectsClientMock.create(); const encryptedSavedObjects = encryptedSavedObjectsMock.createClient(); const authorization = alertingAuthorizationMock.create(); const actionsAuthorization = actionsAuthorizationMock.create(); +const internalSavedObjectsRepository = savedObjectsRepositoryMock.create(); const kibanaVersion = 'v8.0.0'; const rulesClientParams: jest.Mocked = { @@ -36,10 +41,12 @@ const rulesClientParams: jest.Mocked = { getUserName: jest.fn(), createAPIKey: jest.fn(), logger: loggingSystemMock.create().get(), + internalSavedObjectsRepository, encryptedSavedObjectsClient: encryptedSavedObjects, getActionsClient: jest.fn(), getEventLogClient: jest.fn(), kibanaVersion, + maxScheduledPerMinute: 10000, minimumScheduleInterval: { value: '1m', enforce: false }, minimumScheduleIntervalInMs: 1, fieldsToExcludeFromPublicApi: [], diff --git a/x-pack/plugins/alerting/server/rules_client/methods/bulk_enable.ts b/x-pack/plugins/alerting/server/rules_client/methods/bulk_enable.ts index 42b20e65585c1..0e3f0eb042ec5 100644 --- a/x-pack/plugins/alerting/server/rules_client/methods/bulk_enable.ts +++ b/x-pack/plugins/alerting/server/rules_client/methods/bulk_enable.ts @@ -4,9 +4,10 @@ * 2.0; you may not use this file except in compliance with the Elastic License * 2.0. */ + import pMap from 'p-map'; import { KueryNode, nodeBuilder } from '@kbn/es-query'; -import { SavedObjectsBulkUpdateObject } from '@kbn/core/server'; +import { SavedObjectsBulkUpdateObject, SavedObjectsFindResult } from '@kbn/core/server'; import { withSpan } from '@kbn/apm-utils'; import { Logger } from '@kbn/core/server'; import { TaskManagerStartContract, TaskStatus } from '@kbn/task-manager-plugin/server'; @@ -28,6 +29,7 @@ import { migrateLegacyActions, } from '../lib'; import { RulesClientContext, BulkOperationError, BulkOptions } from '../types'; +import { validateScheduleLimit } from '../../application/rule/methods/get_schedule_frequency'; const getShouldScheduleTask = async ( context: RulesClientContext, @@ -121,116 +123,136 @@ const bulkEnableRulesWithOCC = async ( ) ); + const rulesFinderRules: Array> = []; const rulesToEnable: Array> = []; const errors: BulkOperationError[] = []; const ruleNameToRuleIdMapping: Record = {}; const username = await context.getUserName(); + let scheduleValidationError = ''; await withSpan( { name: 'Get rules, collect them and their attributes', type: 'rules' }, async () => { for await (const response of rulesFinder.find()) { - await pMap(response.saved_objects, async (rule) => { - try { - if (rule.attributes.actions.length) { - try { - await context.actionsAuthorization.ensureAuthorized({ operation: 'execute' }); - } catch (error) { - throw Error(`Rule not authorized for bulk enable - ${error.message}`); - } - } - if (rule.attributes.name) { - ruleNameToRuleIdMapping[rule.id] = rule.attributes.name; - } - - const migratedActions = await migrateLegacyActions(context, { - ruleId: rule.id, - actions: rule.attributes.actions, - references: rule.references, - attributes: rule.attributes, - }); + rulesFinderRules.push(...response.saved_objects); + } + await rulesFinder.close(); - const updatedAttributes = updateMeta(context, { - ...rule.attributes, - ...(!rule.attributes.apiKey && - (await createNewAPIKeySet(context, { - id: rule.attributes.alertTypeId, - ruleName: rule.attributes.name, - username, - shouldUpdateApiKey: true, - }))), - ...(migratedActions.hasLegacyActions - ? { - actions: migratedActions.resultedActions, - throttle: undefined, - notifyWhen: undefined, - } - : {}), - enabled: true, - updatedBy: username, - updatedAt: new Date().toISOString(), - executionStatus: { - status: 'pending', - lastDuration: 0, - lastExecutionDate: new Date().toISOString(), - error: null, - warning: null, - }, - }); + const updatedInterval = rulesFinderRules + .filter((rule) => !rule.attributes.enabled) + .map((rule) => rule.attributes.schedule?.interval); - const shouldScheduleTask = await getShouldScheduleTask( - context, - rule.attributes.scheduledTaskId - ); + try { + await validateScheduleLimit({ + context, + updatedInterval, + }); + } catch (error) { + scheduleValidationError = `Error validating enable rule data - ${error.message}`; + } - let scheduledTaskId; - if (shouldScheduleTask) { - const scheduledTask = await scheduleTask(context, { - id: rule.id, - consumer: rule.attributes.consumer, - ruleTypeId: rule.attributes.alertTypeId, - schedule: rule.attributes.schedule as IntervalSchedule, - throwOnConflict: false, - }); - scheduledTaskId = scheduledTask.id; + await pMap(rulesFinderRules, async (rule) => { + try { + if (scheduleValidationError) { + throw Error(scheduleValidationError); + } + if (rule.attributes.actions.length) { + try { + await context.actionsAuthorization.ensureAuthorized({ operation: 'execute' }); + } catch (error) { + throw Error(`Rule not authorized for bulk enable - ${error.message}`); } + } + if (rule.attributes.name) { + ruleNameToRuleIdMapping[rule.id] = rule.attributes.name; + } - rulesToEnable.push({ - ...rule, - attributes: { - ...updatedAttributes, - ...(scheduledTaskId ? { scheduledTaskId } : undefined), - }, - ...(migratedActions.hasLegacyActions - ? { references: migratedActions.resultedReferences } - : {}), - }); + const migratedActions = await migrateLegacyActions(context, { + ruleId: rule.id, + actions: rule.attributes.actions, + references: rule.references, + attributes: rule.attributes, + }); + + const updatedAttributes = updateMeta(context, { + ...rule.attributes, + ...(!rule.attributes.apiKey && + (await createNewAPIKeySet(context, { + id: rule.attributes.alertTypeId, + ruleName: rule.attributes.name, + username, + shouldUpdateApiKey: true, + }))), + ...(migratedActions.hasLegacyActions + ? { + actions: migratedActions.resultedActions, + throttle: undefined, + notifyWhen: undefined, + } + : {}), + enabled: true, + updatedBy: username, + updatedAt: new Date().toISOString(), + executionStatus: { + status: 'pending', + lastDuration: 0, + lastExecutionDate: new Date().toISOString(), + error: null, + warning: null, + }, + }); - context.auditLogger?.log( - ruleAuditEvent({ - action: RuleAuditAction.ENABLE, - outcome: 'unknown', - savedObject: { type: 'alert', id: rule.id }, - }) - ); - } catch (error) { - errors.push({ - message: error.message, - rule: { - id: rule.id, - name: rule.attributes?.name, - }, + const shouldScheduleTask = await getShouldScheduleTask( + context, + rule.attributes.scheduledTaskId + ); + + let scheduledTaskId; + if (shouldScheduleTask) { + const scheduledTask = await scheduleTask(context, { + id: rule.id, + consumer: rule.attributes.consumer, + ruleTypeId: rule.attributes.alertTypeId, + schedule: rule.attributes.schedule as IntervalSchedule, + throwOnConflict: false, }); - context.auditLogger?.log( - ruleAuditEvent({ - action: RuleAuditAction.ENABLE, - error, - }) - ); + scheduledTaskId = scheduledTask.id; } - }); - } - await rulesFinder.close(); + + rulesToEnable.push({ + ...rule, + attributes: { + ...updatedAttributes, + ...(scheduledTaskId ? { scheduledTaskId } : undefined), + }, + ...(migratedActions.hasLegacyActions + ? { references: migratedActions.resultedReferences } + : {}), + }); + + context.auditLogger?.log( + ruleAuditEvent({ + action: RuleAuditAction.ENABLE, + outcome: 'unknown', + savedObject: { type: 'alert', id: rule.id }, + }) + ); + } catch (error) { + errors.push({ + message: error.message, + rule: { + id: rule.id, + name: rule.attributes?.name, + }, + }); + context.auditLogger?.log( + ruleAuditEvent({ + action: RuleAuditAction.ENABLE, + error, + }) + ); + } + }); } ); diff --git a/x-pack/plugins/alerting/server/rules_client/methods/enable.ts b/x-pack/plugins/alerting/server/rules_client/methods/enable.ts index 948f254fe462a..97e677a0c28cc 100644 --- a/x-pack/plugins/alerting/server/rules_client/methods/enable.ts +++ b/x-pack/plugins/alerting/server/rules_client/methods/enable.ts @@ -4,6 +4,7 @@ * 2.0; you may not use this file except in compliance with the Elastic License * 2.0. */ +import Boom from '@hapi/boom'; import type { SavedObjectReference } from '@kbn/core/server'; import { TaskStatus } from '@kbn/task-manager-plugin/server'; import { RawRule, IntervalSchedule } from '../../types'; @@ -13,6 +14,7 @@ import { retryIfConflicts } from '../../lib/retry_if_conflicts'; import { ruleAuditEvent, RuleAuditAction } from '../common/audit_events'; import { RulesClientContext } from '../types'; import { updateMeta, createNewAPIKeySet, scheduleTask, migrateLegacyActions } from '../lib'; +import { validateScheduleLimit } from '../../application/rule/methods/get_schedule_frequency'; export async function enable(context: RulesClientContext, { id }: { id: string }): Promise { return await retryIfConflicts( @@ -46,6 +48,15 @@ async function enableWithOCC(context: RulesClientContext, { id }: { id: string } references = alert.references; } + try { + await validateScheduleLimit({ + context, + updatedInterval: attributes.schedule.interval, + }); + } catch (error) { + throw Boom.badRequest(`Error validating enable rule data - ${error.message}`); + } + try { await context.authorization.ensureAuthorized({ ruleTypeId: attributes.alertTypeId, diff --git a/x-pack/plugins/alerting/server/rules_client/methods/update.ts b/x-pack/plugins/alerting/server/rules_client/methods/update.ts index 68dc7fa0dd6a7..925f128f0b8b3 100644 --- a/x-pack/plugins/alerting/server/rules_client/methods/update.ts +++ b/x-pack/plugins/alerting/server/rules_client/methods/update.ts @@ -33,6 +33,7 @@ import { createNewAPIKeySet, migrateLegacyActions, } from '../lib'; +import { validateScheduleLimit } from '../../application/rule/methods/get_schedule_frequency'; type ShouldIncrementRevision = (params?: RuleTypeParams) => boolean; @@ -88,6 +89,21 @@ async function updateWithOCC( alertSavedObject = await context.unsecuredSavedObjectsClient.get('alert', id); } + const { + attributes: { enabled, schedule }, + } = alertSavedObject; + try { + if (enabled && schedule.interval !== data.schedule.interval) { + await validateScheduleLimit({ + context, + prevInterval: alertSavedObject.attributes.schedule?.interval, + updatedInterval: data.schedule.interval, + }); + } + } catch (error) { + throw Boom.badRequest(`Error validating update data - ${error.message}`); + } + try { await context.authorization.ensureAuthorized({ ruleTypeId: alertSavedObject.attributes.alertTypeId, diff --git a/x-pack/plugins/alerting/server/rules_client/rules_client.ts b/x-pack/plugins/alerting/server/rules_client/rules_client.ts index d34a8d10ef172..b27bb9b5a6747 100644 --- a/x-pack/plugins/alerting/server/rules_client/rules_client.ts +++ b/x-pack/plugins/alerting/server/rules_client/rules_client.ts @@ -57,6 +57,7 @@ import { runSoon } from './methods/run_soon'; import { listRuleTypes } from './methods/list_rule_types'; import { getAlertFromRaw, GetAlertFromRawParams } from './lib/get_alert_from_raw'; import { getTags, GetTagsParams } from './methods/get_tags'; +import { getScheduleFrequency } from '../application/rule/methods/get_schedule_frequency/get_schedule_frequency'; export type ConstructorOptions = Omit< RulesClientContext, @@ -179,6 +180,8 @@ export class RulesClient { public getTags = (params: GetTagsParams) => getTags(this.context, params); + public getScheduleFrequency = () => getScheduleFrequency(this.context); + public getAlertFromRaw = (params: GetAlertFromRawParams) => getAlertFromRaw( this.context, diff --git a/x-pack/plugins/alerting/server/rules_client/tests/aggregate.test.ts b/x-pack/plugins/alerting/server/rules_client/tests/aggregate.test.ts index c45e74da45999..64f7325092691 100644 --- a/x-pack/plugins/alerting/server/rules_client/tests/aggregate.test.ts +++ b/x-pack/plugins/alerting/server/rules_client/tests/aggregate.test.ts @@ -6,7 +6,11 @@ */ import { RulesClient, ConstructorOptions } from '../rules_client'; -import { savedObjectsClientMock, loggingSystemMock } from '@kbn/core/server/mocks'; +import { + savedObjectsClientMock, + loggingSystemMock, + savedObjectsRepositoryMock, +} from '@kbn/core/server/mocks'; import { taskManagerMock } from '@kbn/task-manager-plugin/server/mocks'; import { ruleTypeRegistryMock } from '../../rule_type_registry.mock'; import { alertingAuthorizationMock } from '../../authorization/alerting_authorization.mock'; @@ -32,12 +36,14 @@ const encryptedSavedObjects = encryptedSavedObjectsMock.createClient(); const authorization = alertingAuthorizationMock.create(); const actionsAuthorization = actionsAuthorizationMock.create(); const auditLogger = auditLoggerMock.create(); +const internalSavedObjectsRepository = savedObjectsRepositoryMock.create(); const kibanaVersion = 'v7.10.0'; const rulesClientParams: jest.Mocked = { taskManager, ruleTypeRegistry, unsecuredSavedObjectsClient, + maxScheduledPerMinute: 10000, minimumScheduleInterval: { value: '1m', enforce: false }, authorization: authorization as unknown as AlertingAuthorization, actionsAuthorization: actionsAuthorization as unknown as ActionsAuthorization, @@ -46,6 +52,7 @@ const rulesClientParams: jest.Mocked = { getUserName: jest.fn(), createAPIKey: jest.fn(), logger: loggingSystemMock.create().get(), + internalSavedObjectsRepository, encryptedSavedObjectsClient: encryptedSavedObjects, getActionsClient: jest.fn(), getEventLogClient: jest.fn(), diff --git a/x-pack/plugins/alerting/server/rules_client/tests/bulk_delete.test.ts b/x-pack/plugins/alerting/server/rules_client/tests/bulk_delete.test.ts index dbe04ec420000..febf66a1d2f60 100644 --- a/x-pack/plugins/alerting/server/rules_client/tests/bulk_delete.test.ts +++ b/x-pack/plugins/alerting/server/rules_client/tests/bulk_delete.test.ts @@ -6,7 +6,7 @@ */ import { RulesClient, ConstructorOptions } from '../rules_client'; -import { savedObjectsClientMock } from '@kbn/core/server/mocks'; +import { savedObjectsClientMock, savedObjectsRepositoryMock } from '@kbn/core/server/mocks'; import { taskManagerMock } from '@kbn/task-manager-plugin/server/mocks'; import { ruleTypeRegistryMock } from '../../rule_type_registry.mock'; import { alertingAuthorizationMock } from '../../authorization/alerting_authorization.mock'; @@ -53,6 +53,7 @@ const authorization = alertingAuthorizationMock.create(); const actionsAuthorization = actionsAuthorizationMock.create(); const auditLogger = auditLoggerMock.create(); const logger = loggerMock.create(); +const internalSavedObjectsRepository = savedObjectsRepositoryMock.create(); const kibanaVersion = 'v8.2.0'; const createAPIKeyMock = jest.fn(); @@ -67,11 +68,13 @@ const rulesClientParams: jest.Mocked = { getUserName: jest.fn(), createAPIKey: createAPIKeyMock, logger, + internalSavedObjectsRepository, encryptedSavedObjectsClient: encryptedSavedObjects, getActionsClient: jest.fn(), getEventLogClient: jest.fn(), kibanaVersion, auditLogger, + maxScheduledPerMinute: 10000, minimumScheduleInterval: { value: '1m', enforce: false }, isAuthenticationTypeAPIKey: jest.fn(), getAuthenticationAPIKey: jest.fn(), diff --git a/x-pack/plugins/alerting/server/rules_client/tests/bulk_disable.test.ts b/x-pack/plugins/alerting/server/rules_client/tests/bulk_disable.test.ts index 18cc4492be8c9..c4d7e6eb4f755 100644 --- a/x-pack/plugins/alerting/server/rules_client/tests/bulk_disable.test.ts +++ b/x-pack/plugins/alerting/server/rules_client/tests/bulk_disable.test.ts @@ -6,7 +6,7 @@ */ import { AlertConsumers } from '@kbn/rule-data-utils'; import { RulesClient, ConstructorOptions } from '../rules_client'; -import { savedObjectsClientMock } from '@kbn/core/server/mocks'; +import { savedObjectsClientMock, savedObjectsRepositoryMock } from '@kbn/core/server/mocks'; import { taskManagerMock } from '@kbn/task-manager-plugin/server/mocks'; import type { SavedObject } from '@kbn/core-saved-objects-server'; import { ruleTypeRegistryMock } from '../../rule_type_registry.mock'; @@ -61,6 +61,7 @@ const actionsAuthorization = actionsAuthorizationMock.create(); const auditLogger = auditLoggerMock.create(); const logger = loggerMock.create(); const eventLogger = eventLoggerMock.create(); +const internalSavedObjectsRepository = savedObjectsRepositoryMock.create(); const kibanaVersion = 'v8.2.0'; const createAPIKeyMock = jest.fn(); @@ -75,12 +76,14 @@ const rulesClientParams: jest.Mocked = { getUserName: jest.fn(), createAPIKey: createAPIKeyMock, logger, + internalSavedObjectsRepository, encryptedSavedObjectsClient: encryptedSavedObjects, getActionsClient: jest.fn(), getEventLogClient: jest.fn(), kibanaVersion, auditLogger, eventLogger, + maxScheduledPerMinute: 10000, minimumScheduleInterval: { value: '1m', enforce: false }, isAuthenticationTypeAPIKey: jest.fn(), getAuthenticationAPIKey: jest.fn(), diff --git a/x-pack/plugins/alerting/server/rules_client/tests/bulk_enable.test.ts b/x-pack/plugins/alerting/server/rules_client/tests/bulk_enable.test.ts index 03f9c06109059..acba28bf20ac6 100644 --- a/x-pack/plugins/alerting/server/rules_client/tests/bulk_enable.test.ts +++ b/x-pack/plugins/alerting/server/rules_client/tests/bulk_enable.test.ts @@ -6,7 +6,7 @@ */ import { AlertConsumers } from '@kbn/rule-data-utils'; import { RulesClient, ConstructorOptions } from '../rules_client'; -import { savedObjectsClientMock } from '@kbn/core/server/mocks'; +import { savedObjectsClientMock, savedObjectsRepositoryMock } from '@kbn/core/server/mocks'; import { taskManagerMock } from '@kbn/task-manager-plugin/server/mocks'; import { ruleTypeRegistryMock } from '../../rule_type_registry.mock'; import { alertingAuthorizationMock } from '../../authorization/alerting_authorization.mock'; @@ -45,6 +45,10 @@ jest.mock('../../invalidate_pending_api_keys/bulk_mark_api_keys_for_invalidation bulkMarkApiKeysForInvalidation: jest.fn(), })); +jest.mock('../../application/rule/methods/get_schedule_frequency', () => ({ + validateScheduleLimit: jest.fn(), +})); + const taskManager = taskManagerMock.createStart(); const ruleTypeRegistry = ruleTypeRegistryMock.create(); const unsecuredSavedObjectsClient = savedObjectsClientMock.create(); @@ -53,6 +57,7 @@ const authorization = alertingAuthorizationMock.create(); const actionsAuthorization = actionsAuthorizationMock.create(); const auditLogger = auditLoggerMock.create(); const logger = loggerMock.create(); +const internalSavedObjectsRepository = savedObjectsRepositoryMock.create(); const kibanaVersion = 'v8.2.0'; const createAPIKeyMock = jest.fn(); @@ -67,11 +72,13 @@ const rulesClientParams: jest.Mocked = { getUserName: jest.fn(), createAPIKey: createAPIKeyMock, logger, + internalSavedObjectsRepository, encryptedSavedObjectsClient: encryptedSavedObjects, getActionsClient: jest.fn(), getEventLogClient: jest.fn(), kibanaVersion, auditLogger, + maxScheduledPerMinute: 10000, minimumScheduleInterval: { value: '1m', enforce: false }, isAuthenticationTypeAPIKey: jest.fn(), getAuthenticationAPIKey: jest.fn(), diff --git a/x-pack/plugins/alerting/server/rules_client/tests/clear_expired_snoozes.test.ts b/x-pack/plugins/alerting/server/rules_client/tests/clear_expired_snoozes.test.ts index 786400557977d..efebe91a90272 100644 --- a/x-pack/plugins/alerting/server/rules_client/tests/clear_expired_snoozes.test.ts +++ b/x-pack/plugins/alerting/server/rules_client/tests/clear_expired_snoozes.test.ts @@ -8,7 +8,11 @@ import moment from 'moment'; import sinon from 'sinon'; import { RulesClient, ConstructorOptions } from '../rules_client'; -import { savedObjectsClientMock, loggingSystemMock } from '@kbn/core/server/mocks'; +import { + savedObjectsClientMock, + loggingSystemMock, + savedObjectsRepositoryMock, +} from '@kbn/core/server/mocks'; import { taskManagerMock } from '@kbn/task-manager-plugin/server/mocks'; import { ruleTypeRegistryMock } from '../../rule_type_registry.mock'; import { alertingAuthorizationMock } from '../../authorization/alerting_authorization.mock'; @@ -40,6 +44,7 @@ const authorization = alertingAuthorizationMock.create(); const actionsAuthorization = actionsAuthorizationMock.create(); const auditLogger = auditLoggerMock.create(); const eventLogger = eventLoggerMock.create(); +const internalSavedObjectsRepository = savedObjectsRepositoryMock.create(); const kibanaVersion = 'v7.10.0'; const rulesClientParams: jest.Mocked = { @@ -50,10 +55,12 @@ const rulesClientParams: jest.Mocked = { actionsAuthorization: actionsAuthorization as unknown as ActionsAuthorization, spaceId: 'default', namespace: 'default', + maxScheduledPerMinute: 10000, minimumScheduleInterval: { value: '1m', enforce: false }, getUserName: jest.fn(), createAPIKey: jest.fn(), logger: loggingSystemMock.create().get(), + internalSavedObjectsRepository, encryptedSavedObjectsClient: encryptedSavedObjects, getActionsClient: jest.fn(), getEventLogClient: jest.fn(), diff --git a/x-pack/plugins/alerting/server/rules_client/tests/delete.test.ts b/x-pack/plugins/alerting/server/rules_client/tests/delete.test.ts index a8f13dc25869d..ece860c63c30e 100644 --- a/x-pack/plugins/alerting/server/rules_client/tests/delete.test.ts +++ b/x-pack/plugins/alerting/server/rules_client/tests/delete.test.ts @@ -8,7 +8,11 @@ import { AlertConsumers } from '@kbn/rule-data-utils'; import { RulesClient, ConstructorOptions } from '../rules_client'; -import { savedObjectsClientMock, loggingSystemMock } from '@kbn/core/server/mocks'; +import { + savedObjectsClientMock, + loggingSystemMock, + savedObjectsRepositoryMock, +} from '@kbn/core/server/mocks'; import { taskManagerMock } from '@kbn/task-manager-plugin/server/mocks'; import { ruleTypeRegistryMock } from '../../rule_type_registry.mock'; import { alertingAuthorizationMock } from '../../authorization/alerting_authorization.mock'; @@ -43,12 +47,14 @@ const encryptedSavedObjects = encryptedSavedObjectsMock.createClient(); const authorization = alertingAuthorizationMock.create(); const actionsAuthorization = actionsAuthorizationMock.create(); const auditLogger = auditLoggerMock.create(); +const internalSavedObjectsRepository = savedObjectsRepositoryMock.create(); const kibanaVersion = 'v7.10.0'; const rulesClientParams: jest.Mocked = { taskManager, ruleTypeRegistry, unsecuredSavedObjectsClient, + maxScheduledPerMinute: 10000, minimumScheduleInterval: { value: '1m', enforce: false }, authorization: authorization as unknown as AlertingAuthorization, actionsAuthorization: actionsAuthorization as unknown as ActionsAuthorization, @@ -57,6 +63,7 @@ const rulesClientParams: jest.Mocked = { getUserName: jest.fn(), createAPIKey: jest.fn(), logger: loggingSystemMock.create().get(), + internalSavedObjectsRepository, encryptedSavedObjectsClient: encryptedSavedObjects, getActionsClient: jest.fn(), getEventLogClient: jest.fn(), diff --git a/x-pack/plugins/alerting/server/rules_client/tests/disable.test.ts b/x-pack/plugins/alerting/server/rules_client/tests/disable.test.ts index b135f9b0ee23d..23b23b607cd04 100644 --- a/x-pack/plugins/alerting/server/rules_client/tests/disable.test.ts +++ b/x-pack/plugins/alerting/server/rules_client/tests/disable.test.ts @@ -7,7 +7,11 @@ import { AlertConsumers } from '@kbn/rule-data-utils'; import { RulesClient, ConstructorOptions } from '../rules_client'; -import { savedObjectsClientMock, loggingSystemMock } from '@kbn/core/server/mocks'; +import { + savedObjectsClientMock, + loggingSystemMock, + savedObjectsRepositoryMock, +} from '@kbn/core/server/mocks'; import { taskManagerMock } from '@kbn/task-manager-plugin/server/mocks'; import { ruleTypeRegistryMock } from '../../rule_type_registry.mock'; import { alertingAuthorizationMock } from '../../authorization/alerting_authorization.mock'; @@ -44,6 +48,7 @@ const authorization = alertingAuthorizationMock.create(); const actionsAuthorization = actionsAuthorizationMock.create(); const auditLogger = auditLoggerMock.create(); const eventLogger = eventLoggerMock.create(); +const internalSavedObjectsRepository = savedObjectsRepositoryMock.create(); const kibanaVersion = 'v7.10.0'; const rulesClientParams: jest.Mocked = { @@ -54,10 +59,12 @@ const rulesClientParams: jest.Mocked = { actionsAuthorization: actionsAuthorization as unknown as ActionsAuthorization, spaceId: 'default', namespace: 'default', + maxScheduledPerMinute: 10000, minimumScheduleInterval: { value: '1m', enforce: false }, getUserName: jest.fn(), createAPIKey: jest.fn(), logger: loggingSystemMock.create().get(), + internalSavedObjectsRepository, encryptedSavedObjectsClient: encryptedSavedObjects, getActionsClient: jest.fn(), getEventLogClient: jest.fn(), diff --git a/x-pack/plugins/alerting/server/rules_client/tests/enable.test.ts b/x-pack/plugins/alerting/server/rules_client/tests/enable.test.ts index d123469527ad5..e7e09c55a7920 100644 --- a/x-pack/plugins/alerting/server/rules_client/tests/enable.test.ts +++ b/x-pack/plugins/alerting/server/rules_client/tests/enable.test.ts @@ -7,7 +7,11 @@ import { AlertConsumers } from '@kbn/rule-data-utils'; import { RulesClient, ConstructorOptions } from '../rules_client'; -import { savedObjectsClientMock, loggingSystemMock } from '@kbn/core/server/mocks'; +import { + savedObjectsClientMock, + loggingSystemMock, + savedObjectsRepositoryMock, +} from '@kbn/core/server/mocks'; import { taskManagerMock } from '@kbn/task-manager-plugin/server/mocks'; import { ruleTypeRegistryMock } from '../../rule_type_registry.mock'; import { alertingAuthorizationMock } from '../../authorization/alerting_authorization.mock'; @@ -31,6 +35,10 @@ jest.mock('../../invalidate_pending_api_keys/bulk_mark_api_keys_for_invalidation bulkMarkApiKeysForInvalidation: jest.fn(), })); +jest.mock('../../application/rule/methods/get_schedule_frequency', () => ({ + validateScheduleLimit: jest.fn(), +})); + const taskManager = taskManagerMock.createStart(); const ruleTypeRegistry = ruleTypeRegistryMock.create(); const unsecuredSavedObjectsClient = savedObjectsClientMock.create(); @@ -38,6 +46,7 @@ const encryptedSavedObjects = encryptedSavedObjectsMock.createClient(); const authorization = alertingAuthorizationMock.create(); const actionsAuthorization = actionsAuthorizationMock.create(); const auditLogger = auditLoggerMock.create(); +const internalSavedObjectsRepository = savedObjectsRepositoryMock.create(); const kibanaVersion = 'v7.10.0'; const rulesClientParams: jest.Mocked = { @@ -48,10 +57,12 @@ const rulesClientParams: jest.Mocked = { actionsAuthorization: actionsAuthorization as unknown as ActionsAuthorization, spaceId: 'default', namespace: 'default', + maxScheduledPerMinute: 10000, minimumScheduleInterval: { value: '1m', enforce: false }, getUserName: jest.fn(), createAPIKey: jest.fn(), logger: loggingSystemMock.create().get(), + internalSavedObjectsRepository, encryptedSavedObjectsClient: encryptedSavedObjects, getActionsClient: jest.fn(), getEventLogClient: jest.fn(), diff --git a/x-pack/plugins/alerting/server/rules_client/tests/find.test.ts b/x-pack/plugins/alerting/server/rules_client/tests/find.test.ts index 4b1a6fc2eba8c..227988aaa6da0 100644 --- a/x-pack/plugins/alerting/server/rules_client/tests/find.test.ts +++ b/x-pack/plugins/alerting/server/rules_client/tests/find.test.ts @@ -6,7 +6,11 @@ */ import { RulesClient, ConstructorOptions } from '../rules_client'; -import { savedObjectsClientMock, loggingSystemMock } from '@kbn/core/server/mocks'; +import { + savedObjectsClientMock, + loggingSystemMock, + savedObjectsRepositoryMock, +} from '@kbn/core/server/mocks'; import { taskManagerMock } from '@kbn/task-manager-plugin/server/mocks'; import { ruleTypeRegistryMock } from '../../rule_type_registry.mock'; import { alertingAuthorizationMock } from '../../authorization/alerting_authorization.mock'; @@ -36,6 +40,7 @@ const encryptedSavedObjects = encryptedSavedObjectsMock.createClient(); const authorization = alertingAuthorizationMock.create(); const actionsAuthorization = actionsAuthorizationMock.create(); const auditLogger = auditLoggerMock.create(); +const internalSavedObjectsRepository = savedObjectsRepositoryMock.create(); const kibanaVersion = 'v7.10.0'; const rulesClientParams: jest.Mocked = { @@ -46,10 +51,12 @@ const rulesClientParams: jest.Mocked = { actionsAuthorization: actionsAuthorization as unknown as ActionsAuthorization, spaceId: 'default', namespace: 'default', + maxScheduledPerMinute: 10000, minimumScheduleInterval: { value: '1m', enforce: false }, getUserName: jest.fn(), createAPIKey: jest.fn(), logger: loggingSystemMock.create().get(), + internalSavedObjectsRepository, encryptedSavedObjectsClient: encryptedSavedObjects, getActionsClient: jest.fn(), getEventLogClient: jest.fn(), diff --git a/x-pack/plugins/alerting/server/rules_client/tests/get.test.ts b/x-pack/plugins/alerting/server/rules_client/tests/get.test.ts index 20af52838652a..a5259a2ddd1e0 100644 --- a/x-pack/plugins/alerting/server/rules_client/tests/get.test.ts +++ b/x-pack/plugins/alerting/server/rules_client/tests/get.test.ts @@ -7,7 +7,11 @@ import { AlertConsumers } from '@kbn/rule-data-utils'; import { RulesClient, ConstructorOptions } from '../rules_client'; -import { savedObjectsClientMock, loggingSystemMock } from '@kbn/core/server/mocks'; +import { + savedObjectsClientMock, + loggingSystemMock, + savedObjectsRepositoryMock, +} from '@kbn/core/server/mocks'; import { taskManagerMock } from '@kbn/task-manager-plugin/server/mocks'; import { ruleTypeRegistryMock } from '../../rule_type_registry.mock'; import { alertingAuthorizationMock } from '../../authorization/alerting_authorization.mock'; @@ -33,6 +37,7 @@ const encryptedSavedObjects = encryptedSavedObjectsMock.createClient(); const authorization = alertingAuthorizationMock.create(); const actionsAuthorization = actionsAuthorizationMock.create(); const auditLogger = auditLoggerMock.create(); +const internalSavedObjectsRepository = savedObjectsRepositoryMock.create(); const kibanaVersion = 'v7.10.0'; const rulesClientParams: jest.Mocked = { @@ -43,10 +48,12 @@ const rulesClientParams: jest.Mocked = { actionsAuthorization: actionsAuthorization as unknown as ActionsAuthorization, spaceId: 'default', namespace: 'default', + maxScheduledPerMinute: 10000, minimumScheduleInterval: { value: '1m', enforce: false }, getUserName: jest.fn(), createAPIKey: jest.fn(), logger: loggingSystemMock.create().get(), + internalSavedObjectsRepository, encryptedSavedObjectsClient: encryptedSavedObjects, getActionsClient: jest.fn(), getEventLogClient: jest.fn(), diff --git a/x-pack/plugins/alerting/server/rules_client/tests/get_action_error_log.test.ts b/x-pack/plugins/alerting/server/rules_client/tests/get_action_error_log.test.ts index fdece7b756d42..d8069721c4a5c 100644 --- a/x-pack/plugins/alerting/server/rules_client/tests/get_action_error_log.test.ts +++ b/x-pack/plugins/alerting/server/rules_client/tests/get_action_error_log.test.ts @@ -7,7 +7,11 @@ import { RulesClient, ConstructorOptions } from '../rules_client'; import { GetActionErrorLogByIdParams } from '../methods/get_action_error_log'; -import { savedObjectsClientMock, loggingSystemMock } from '@kbn/core/server/mocks'; +import { + savedObjectsClientMock, + loggingSystemMock, + savedObjectsRepositoryMock, +} from '@kbn/core/server/mocks'; import { taskManagerMock } from '@kbn/task-manager-plugin/server/mocks'; import { fromKueryExpression } from '@kbn/es-query'; import { ruleTypeRegistryMock } from '../../rule_type_registry.mock'; @@ -31,6 +35,7 @@ const encryptedSavedObjects = encryptedSavedObjectsMock.createClient(); const authorization = alertingAuthorizationMock.create(); const actionsAuthorization = actionsAuthorizationMock.create(); const auditLogger = auditLoggerMock.create(); +const internalSavedObjectsRepository = savedObjectsRepositoryMock.create(); const kibanaVersion = 'v7.10.0'; const rulesClientParams: jest.Mocked = { @@ -41,10 +46,12 @@ const rulesClientParams: jest.Mocked = { actionsAuthorization: actionsAuthorization as unknown as ActionsAuthorization, spaceId: 'default', namespace: 'default', + maxScheduledPerMinute: 10000, minimumScheduleInterval: { value: '1m', enforce: false }, getUserName: jest.fn(), createAPIKey: jest.fn(), logger: loggingSystemMock.create().get(), + internalSavedObjectsRepository, encryptedSavedObjectsClient: encryptedSavedObjects, getActionsClient: jest.fn(), getEventLogClient: jest.fn(), diff --git a/x-pack/plugins/alerting/server/rules_client/tests/get_alert_state.test.ts b/x-pack/plugins/alerting/server/rules_client/tests/get_alert_state.test.ts index c35bcd6c56311..644cc6190f605 100644 --- a/x-pack/plugins/alerting/server/rules_client/tests/get_alert_state.test.ts +++ b/x-pack/plugins/alerting/server/rules_client/tests/get_alert_state.test.ts @@ -6,7 +6,11 @@ */ import { RulesClient, ConstructorOptions } from '../rules_client'; -import { savedObjectsClientMock, loggingSystemMock } from '@kbn/core/server/mocks'; +import { + savedObjectsClientMock, + loggingSystemMock, + savedObjectsRepositoryMock, +} from '@kbn/core/server/mocks'; import { taskManagerMock } from '@kbn/task-manager-plugin/server/mocks'; import { ruleTypeRegistryMock } from '../../rule_type_registry.mock'; import { alertingAuthorizationMock } from '../../authorization/alerting_authorization.mock'; @@ -24,6 +28,7 @@ const unsecuredSavedObjectsClient = savedObjectsClientMock.create(); const encryptedSavedObjects = encryptedSavedObjectsMock.createClient(); const authorization = alertingAuthorizationMock.create(); const actionsAuthorization = actionsAuthorizationMock.create(); +const internalSavedObjectsRepository = savedObjectsRepositoryMock.create(); const kibanaVersion = 'v7.10.0'; const rulesClientParams: jest.Mocked = { @@ -34,10 +39,12 @@ const rulesClientParams: jest.Mocked = { actionsAuthorization: actionsAuthorization as unknown as ActionsAuthorization, spaceId: 'default', namespace: 'default', + maxScheduledPerMinute: 10000, minimumScheduleInterval: { value: '1m', enforce: false }, getUserName: jest.fn(), createAPIKey: jest.fn(), logger: loggingSystemMock.create().get(), + internalSavedObjectsRepository, encryptedSavedObjectsClient: encryptedSavedObjects, getActionsClient: jest.fn(), getEventLogClient: jest.fn(), diff --git a/x-pack/plugins/alerting/server/rules_client/tests/get_alert_summary.test.ts b/x-pack/plugins/alerting/server/rules_client/tests/get_alert_summary.test.ts index dbfcc5f3fc017..68160306d3424 100644 --- a/x-pack/plugins/alerting/server/rules_client/tests/get_alert_summary.test.ts +++ b/x-pack/plugins/alerting/server/rules_client/tests/get_alert_summary.test.ts @@ -7,7 +7,11 @@ import { omit, mean } from 'lodash'; import { RulesClient, ConstructorOptions } from '../rules_client'; -import { savedObjectsClientMock, loggingSystemMock } from '@kbn/core/server/mocks'; +import { + savedObjectsClientMock, + loggingSystemMock, + savedObjectsRepositoryMock, +} from '@kbn/core/server/mocks'; import { taskManagerMock } from '@kbn/task-manager-plugin/server/mocks'; import { ruleTypeRegistryMock } from '../../rule_type_registry.mock'; import { alertingAuthorizationMock } from '../../authorization/alerting_authorization.mock'; @@ -30,6 +34,7 @@ const eventLogClient = eventLogClientMock.create(); const encryptedSavedObjects = encryptedSavedObjectsMock.createClient(); const authorization = alertingAuthorizationMock.create(); const actionsAuthorization = actionsAuthorizationMock.create(); +const internalSavedObjectsRepository = savedObjectsRepositoryMock.create(); const kibanaVersion = 'v7.10.0'; const rulesClientParams: jest.Mocked = { @@ -40,10 +45,12 @@ const rulesClientParams: jest.Mocked = { actionsAuthorization: actionsAuthorization as unknown as ActionsAuthorization, spaceId: 'default', namespace: 'default', + maxScheduledPerMinute: 10000, minimumScheduleInterval: { value: '1m', enforce: false }, getUserName: jest.fn(), createAPIKey: jest.fn(), logger: loggingSystemMock.create().get(), + internalSavedObjectsRepository, encryptedSavedObjectsClient: encryptedSavedObjects, getActionsClient: jest.fn(), getEventLogClient: jest.fn(), diff --git a/x-pack/plugins/alerting/server/rules_client/tests/get_execution_log.test.ts b/x-pack/plugins/alerting/server/rules_client/tests/get_execution_log.test.ts index 33fb19c40f7fd..0704a0e7afe16 100644 --- a/x-pack/plugins/alerting/server/rules_client/tests/get_execution_log.test.ts +++ b/x-pack/plugins/alerting/server/rules_client/tests/get_execution_log.test.ts @@ -7,7 +7,11 @@ import type * as estypes from '@elastic/elasticsearch/lib/api/typesWithBodyKey'; import { RulesClient, ConstructorOptions } from '../rules_client'; -import { savedObjectsClientMock, loggingSystemMock } from '@kbn/core/server/mocks'; +import { + savedObjectsClientMock, + loggingSystemMock, + savedObjectsRepositoryMock, +} from '@kbn/core/server/mocks'; import { taskManagerMock } from '@kbn/task-manager-plugin/server/mocks'; import { ruleTypeRegistryMock } from '../../rule_type_registry.mock'; import { alertingAuthorizationMock } from '../../authorization/alerting_authorization.mock'; @@ -32,6 +36,7 @@ const encryptedSavedObjects = encryptedSavedObjectsMock.createClient(); const authorization = alertingAuthorizationMock.create(); const actionsAuthorization = actionsAuthorizationMock.create(); const auditLogger = auditLoggerMock.create(); +const internalSavedObjectsRepository = savedObjectsRepositoryMock.create(); const kibanaVersion = 'v7.10.0'; const rulesClientParams: jest.Mocked = { @@ -42,10 +47,12 @@ const rulesClientParams: jest.Mocked = { actionsAuthorization: actionsAuthorization as unknown as ActionsAuthorization, spaceId: 'default', namespace: 'default', + maxScheduledPerMinute: 10000, minimumScheduleInterval: { value: '1m', enforce: false }, getUserName: jest.fn(), createAPIKey: jest.fn(), logger: loggingSystemMock.create().get(), + internalSavedObjectsRepository, encryptedSavedObjectsClient: encryptedSavedObjects, getActionsClient: jest.fn(), getEventLogClient: jest.fn(), diff --git a/x-pack/plugins/alerting/server/rules_client/tests/get_tags.test.ts b/x-pack/plugins/alerting/server/rules_client/tests/get_tags.test.ts index 1f0c4f405f2c2..ca1ef9c275779 100644 --- a/x-pack/plugins/alerting/server/rules_client/tests/get_tags.test.ts +++ b/x-pack/plugins/alerting/server/rules_client/tests/get_tags.test.ts @@ -6,7 +6,11 @@ */ import { v4 } from 'uuid'; import { RulesClient, ConstructorOptions } from '../rules_client'; -import { savedObjectsClientMock, loggingSystemMock } from '@kbn/core/server/mocks'; +import { + savedObjectsClientMock, + loggingSystemMock, + savedObjectsRepositoryMock, +} from '@kbn/core/server/mocks'; import { taskManagerMock } from '@kbn/task-manager-plugin/server/mocks'; import { ruleTypeRegistryMock } from '../../rule_type_registry.mock'; import { alertingAuthorizationMock } from '../../authorization/alerting_authorization.mock'; @@ -27,12 +31,14 @@ const encryptedSavedObjects = encryptedSavedObjectsMock.createClient(); const authorization = alertingAuthorizationMock.create(); const actionsAuthorization = actionsAuthorizationMock.create(); const auditLogger = auditLoggerMock.create(); +const internalSavedObjectsRepository = savedObjectsRepositoryMock.create(); const kibanaVersion = 'v7.10.0'; const rulesClientParams: jest.Mocked = { taskManager, ruleTypeRegistry, unsecuredSavedObjectsClient, + maxScheduledPerMinute: 10000, minimumScheduleInterval: { value: '1m', enforce: false }, authorization: authorization as unknown as AlertingAuthorization, actionsAuthorization: actionsAuthorization as unknown as ActionsAuthorization, @@ -41,6 +47,7 @@ const rulesClientParams: jest.Mocked = { getUserName: jest.fn(), createAPIKey: jest.fn(), logger: loggingSystemMock.create().get(), + internalSavedObjectsRepository, encryptedSavedObjectsClient: encryptedSavedObjects, getActionsClient: jest.fn(), getEventLogClient: jest.fn(), diff --git a/x-pack/plugins/alerting/server/rules_client/tests/list_rule_types.test.ts b/x-pack/plugins/alerting/server/rules_client/tests/list_rule_types.test.ts index 9c8c78f2753f4..8aa5615269404 100644 --- a/x-pack/plugins/alerting/server/rules_client/tests/list_rule_types.test.ts +++ b/x-pack/plugins/alerting/server/rules_client/tests/list_rule_types.test.ts @@ -6,7 +6,11 @@ */ import { RulesClient, ConstructorOptions } from '../rules_client'; -import { savedObjectsClientMock, loggingSystemMock } from '@kbn/core/server/mocks'; +import { + savedObjectsClientMock, + loggingSystemMock, + savedObjectsRepositoryMock, +} from '@kbn/core/server/mocks'; import { taskManagerMock } from '@kbn/task-manager-plugin/server/mocks'; import { ruleTypeRegistryMock } from '../../rule_type_registry.mock'; import { alertingAuthorizationMock } from '../../authorization/alerting_authorization.mock'; @@ -28,6 +32,7 @@ const unsecuredSavedObjectsClient = savedObjectsClientMock.create(); const encryptedSavedObjects = encryptedSavedObjectsMock.createClient(); const authorization = alertingAuthorizationMock.create(); const actionsAuthorization = actionsAuthorizationMock.create(); +const internalSavedObjectsRepository = savedObjectsRepositoryMock.create(); const kibanaVersion = 'v7.10.0'; const rulesClientParams: jest.Mocked = { @@ -38,10 +43,12 @@ const rulesClientParams: jest.Mocked = { actionsAuthorization: actionsAuthorization as unknown as ActionsAuthorization, spaceId: 'default', namespace: 'default', + maxScheduledPerMinute: 10000, minimumScheduleInterval: { value: '1m', enforce: false }, getUserName: jest.fn(), createAPIKey: jest.fn(), logger: loggingSystemMock.create().get(), + internalSavedObjectsRepository, encryptedSavedObjectsClient: encryptedSavedObjects, getActionsClient: jest.fn(), getEventLogClient: jest.fn(), diff --git a/x-pack/plugins/alerting/server/rules_client/tests/mute_all.test.ts b/x-pack/plugins/alerting/server/rules_client/tests/mute_all.test.ts index 0c9c34f1cbabe..7466d7405fa24 100644 --- a/x-pack/plugins/alerting/server/rules_client/tests/mute_all.test.ts +++ b/x-pack/plugins/alerting/server/rules_client/tests/mute_all.test.ts @@ -6,7 +6,11 @@ */ import { RulesClient, ConstructorOptions } from '../rules_client'; -import { savedObjectsClientMock, loggingSystemMock } from '@kbn/core/server/mocks'; +import { + savedObjectsClientMock, + loggingSystemMock, + savedObjectsRepositoryMock, +} from '@kbn/core/server/mocks'; import { taskManagerMock } from '@kbn/task-manager-plugin/server/mocks'; import { ruleTypeRegistryMock } from '../../rule_type_registry.mock'; import { alertingAuthorizationMock } from '../../authorization/alerting_authorization.mock'; @@ -24,6 +28,7 @@ const encryptedSavedObjects = encryptedSavedObjectsMock.createClient(); const authorization = alertingAuthorizationMock.create(); const actionsAuthorization = actionsAuthorizationMock.create(); const auditLogger = auditLoggerMock.create(); +const internalSavedObjectsRepository = savedObjectsRepositoryMock.create(); const kibanaVersion = 'v7.10.0'; const rulesClientParams: jest.Mocked = { @@ -34,10 +39,12 @@ const rulesClientParams: jest.Mocked = { actionsAuthorization: actionsAuthorization as unknown as ActionsAuthorization, spaceId: 'default', namespace: 'default', + maxScheduledPerMinute: 10000, minimumScheduleInterval: { value: '1m', enforce: false }, getUserName: jest.fn(), createAPIKey: jest.fn(), logger: loggingSystemMock.create().get(), + internalSavedObjectsRepository, encryptedSavedObjectsClient: encryptedSavedObjects, getActionsClient: jest.fn(), getEventLogClient: jest.fn(), diff --git a/x-pack/plugins/alerting/server/rules_client/tests/mute_instance.test.ts b/x-pack/plugins/alerting/server/rules_client/tests/mute_instance.test.ts index 2d369bad2ce69..2dedc7f92f38d 100644 --- a/x-pack/plugins/alerting/server/rules_client/tests/mute_instance.test.ts +++ b/x-pack/plugins/alerting/server/rules_client/tests/mute_instance.test.ts @@ -6,7 +6,11 @@ */ import { RulesClient, ConstructorOptions } from '../rules_client'; -import { savedObjectsClientMock, loggingSystemMock } from '@kbn/core/server/mocks'; +import { + savedObjectsClientMock, + loggingSystemMock, + savedObjectsRepositoryMock, +} from '@kbn/core/server/mocks'; import { taskManagerMock } from '@kbn/task-manager-plugin/server/mocks'; import { ruleTypeRegistryMock } from '../../rule_type_registry.mock'; import { alertingAuthorizationMock } from '../../authorization/alerting_authorization.mock'; @@ -24,6 +28,7 @@ const encryptedSavedObjects = encryptedSavedObjectsMock.createClient(); const authorization = alertingAuthorizationMock.create(); const actionsAuthorization = actionsAuthorizationMock.create(); const auditLogger = auditLoggerMock.create(); +const internalSavedObjectsRepository = savedObjectsRepositoryMock.create(); const kibanaVersion = 'v7.10.0'; const rulesClientParams: jest.Mocked = { @@ -34,10 +39,12 @@ const rulesClientParams: jest.Mocked = { actionsAuthorization: actionsAuthorization as unknown as ActionsAuthorization, spaceId: 'default', namespace: 'default', + maxScheduledPerMinute: 10000, minimumScheduleInterval: { value: '1m', enforce: false }, getUserName: jest.fn(), createAPIKey: jest.fn(), logger: loggingSystemMock.create().get(), + internalSavedObjectsRepository, encryptedSavedObjectsClient: encryptedSavedObjects, getActionsClient: jest.fn(), getEventLogClient: jest.fn(), diff --git a/x-pack/plugins/alerting/server/rules_client/tests/resolve.test.ts b/x-pack/plugins/alerting/server/rules_client/tests/resolve.test.ts index 37372752d53a3..4733fd81786e9 100644 --- a/x-pack/plugins/alerting/server/rules_client/tests/resolve.test.ts +++ b/x-pack/plugins/alerting/server/rules_client/tests/resolve.test.ts @@ -7,7 +7,11 @@ import { AlertConsumers } from '@kbn/rule-data-utils'; import { RulesClient, ConstructorOptions } from '../rules_client'; -import { savedObjectsClientMock, loggingSystemMock } from '@kbn/core/server/mocks'; +import { + savedObjectsClientMock, + loggingSystemMock, + savedObjectsRepositoryMock, +} from '@kbn/core/server/mocks'; import { taskManagerMock } from '@kbn/task-manager-plugin/server/mocks'; import { ruleTypeRegistryMock } from '../../rule_type_registry.mock'; import { alertingAuthorizationMock } from '../../authorization/alerting_authorization.mock'; @@ -33,6 +37,7 @@ const encryptedSavedObjects = encryptedSavedObjectsMock.createClient(); const authorization = alertingAuthorizationMock.create(); const actionsAuthorization = actionsAuthorizationMock.create(); const auditLogger = auditLoggerMock.create(); +const internalSavedObjectsRepository = savedObjectsRepositoryMock.create(); const kibanaVersion = 'v7.10.0'; const rulesClientParams: jest.Mocked = { @@ -43,10 +48,12 @@ const rulesClientParams: jest.Mocked = { actionsAuthorization: actionsAuthorization as unknown as ActionsAuthorization, spaceId: 'default', namespace: 'default', + maxScheduledPerMinute: 10000, minimumScheduleInterval: { value: '1m', enforce: false }, getUserName: jest.fn(), createAPIKey: jest.fn(), logger: loggingSystemMock.create().get(), + internalSavedObjectsRepository, encryptedSavedObjectsClient: encryptedSavedObjects, getActionsClient: jest.fn(), getEventLogClient: jest.fn(), diff --git a/x-pack/plugins/alerting/server/rules_client/tests/run_soon.test.ts b/x-pack/plugins/alerting/server/rules_client/tests/run_soon.test.ts index 080ed8cd44287..20bbd2fb72f1a 100644 --- a/x-pack/plugins/alerting/server/rules_client/tests/run_soon.test.ts +++ b/x-pack/plugins/alerting/server/rules_client/tests/run_soon.test.ts @@ -6,7 +6,11 @@ */ import { RulesClient, ConstructorOptions } from '../rules_client'; -import { savedObjectsClientMock, loggingSystemMock } from '@kbn/core/server/mocks'; +import { + savedObjectsClientMock, + loggingSystemMock, + savedObjectsRepositoryMock, +} from '@kbn/core/server/mocks'; import { taskManagerMock } from '@kbn/task-manager-plugin/server/mocks'; import { ruleTypeRegistryMock } from '../../rule_type_registry.mock'; import { alertingAuthorizationMock } from '../../authorization/alerting_authorization.mock'; @@ -25,6 +29,7 @@ const encryptedSavedObjects = encryptedSavedObjectsMock.createClient(); const authorization = alertingAuthorizationMock.create(); const actionsAuthorization = actionsAuthorizationMock.create(); const auditLogger = auditLoggerMock.create(); +const internalSavedObjectsRepository = savedObjectsRepositoryMock.create(); const kibanaVersion = 'v7.10.0'; const rulesClientParams: jest.Mocked = { @@ -35,10 +40,12 @@ const rulesClientParams: jest.Mocked = { actionsAuthorization: actionsAuthorization as unknown as ActionsAuthorization, spaceId: 'default', namespace: 'default', + maxScheduledPerMinute: 10000, minimumScheduleInterval: { value: '1m', enforce: false }, getUserName: jest.fn(), createAPIKey: jest.fn(), logger: loggingSystemMock.create().get(), + internalSavedObjectsRepository, encryptedSavedObjectsClient: encryptedSavedObjects, getActionsClient: jest.fn(), getEventLogClient: jest.fn(), diff --git a/x-pack/plugins/alerting/server/rules_client/tests/unmute_all.test.ts b/x-pack/plugins/alerting/server/rules_client/tests/unmute_all.test.ts index 37f3b06f137a7..ecdea250916be 100644 --- a/x-pack/plugins/alerting/server/rules_client/tests/unmute_all.test.ts +++ b/x-pack/plugins/alerting/server/rules_client/tests/unmute_all.test.ts @@ -6,7 +6,11 @@ */ import { RulesClient, ConstructorOptions } from '../rules_client'; -import { savedObjectsClientMock, loggingSystemMock } from '@kbn/core/server/mocks'; +import { + savedObjectsClientMock, + loggingSystemMock, + savedObjectsRepositoryMock, +} from '@kbn/core/server/mocks'; import { taskManagerMock } from '@kbn/task-manager-plugin/server/mocks'; import { ruleTypeRegistryMock } from '../../rule_type_registry.mock'; import { alertingAuthorizationMock } from '../../authorization/alerting_authorization.mock'; @@ -24,6 +28,7 @@ const encryptedSavedObjects = encryptedSavedObjectsMock.createClient(); const authorization = alertingAuthorizationMock.create(); const actionsAuthorization = actionsAuthorizationMock.create(); const auditLogger = auditLoggerMock.create(); +const internalSavedObjectsRepository = savedObjectsRepositoryMock.create(); const kibanaVersion = 'v7.10.0'; const rulesClientParams: jest.Mocked = { @@ -34,10 +39,12 @@ const rulesClientParams: jest.Mocked = { actionsAuthorization: actionsAuthorization as unknown as ActionsAuthorization, spaceId: 'default', namespace: 'default', + maxScheduledPerMinute: 10000, minimumScheduleInterval: { value: '1m', enforce: false }, getUserName: jest.fn(), createAPIKey: jest.fn(), logger: loggingSystemMock.create().get(), + internalSavedObjectsRepository, encryptedSavedObjectsClient: encryptedSavedObjects, getActionsClient: jest.fn(), getEventLogClient: jest.fn(), diff --git a/x-pack/plugins/alerting/server/rules_client/tests/unmute_instance.test.ts b/x-pack/plugins/alerting/server/rules_client/tests/unmute_instance.test.ts index f4f8d58f50e32..4b030bb7eb2b5 100644 --- a/x-pack/plugins/alerting/server/rules_client/tests/unmute_instance.test.ts +++ b/x-pack/plugins/alerting/server/rules_client/tests/unmute_instance.test.ts @@ -6,7 +6,11 @@ */ import { RulesClient, ConstructorOptions } from '../rules_client'; -import { savedObjectsClientMock, loggingSystemMock } from '@kbn/core/server/mocks'; +import { + savedObjectsClientMock, + loggingSystemMock, + savedObjectsRepositoryMock, +} from '@kbn/core/server/mocks'; import { taskManagerMock } from '@kbn/task-manager-plugin/server/mocks'; import { ruleTypeRegistryMock } from '../../rule_type_registry.mock'; import { alertingAuthorizationMock } from '../../authorization/alerting_authorization.mock'; @@ -24,6 +28,7 @@ const encryptedSavedObjects = encryptedSavedObjectsMock.createClient(); const authorization = alertingAuthorizationMock.create(); const actionsAuthorization = actionsAuthorizationMock.create(); const auditLogger = auditLoggerMock.create(); +const internalSavedObjectsRepository = savedObjectsRepositoryMock.create(); const kibanaVersion = 'v7.10.0'; const rulesClientParams: jest.Mocked = { @@ -34,10 +39,12 @@ const rulesClientParams: jest.Mocked = { actionsAuthorization: actionsAuthorization as unknown as ActionsAuthorization, spaceId: 'default', namespace: 'default', + maxScheduledPerMinute: 10000, minimumScheduleInterval: { value: '1m', enforce: false }, getUserName: jest.fn(), createAPIKey: jest.fn(), logger: loggingSystemMock.create().get(), + internalSavedObjectsRepository, encryptedSavedObjectsClient: encryptedSavedObjects, getActionsClient: jest.fn(), getEventLogClient: jest.fn(), diff --git a/x-pack/plugins/alerting/server/rules_client/tests/update.test.ts b/x-pack/plugins/alerting/server/rules_client/tests/update.test.ts index 26350664b8445..76b62cdad887e 100644 --- a/x-pack/plugins/alerting/server/rules_client/tests/update.test.ts +++ b/x-pack/plugins/alerting/server/rules_client/tests/update.test.ts @@ -9,7 +9,11 @@ import { v4 as uuidv4 } from 'uuid'; import { schema } from '@kbn/config-schema'; import { AlertConsumers } from '@kbn/rule-data-utils'; import { RulesClient, ConstructorOptions } from '../rules_client'; -import { savedObjectsClientMock, loggingSystemMock } from '@kbn/core/server/mocks'; +import { + savedObjectsClientMock, + loggingSystemMock, + savedObjectsRepositoryMock, +} from '@kbn/core/server/mocks'; import { taskManagerMock } from '@kbn/task-manager-plugin/server/mocks'; import { ruleTypeRegistryMock } from '../../rule_type_registry.mock'; import { alertingAuthorizationMock } from '../../authorization/alerting_authorization.mock'; @@ -50,6 +54,10 @@ jest.mock('uuid', () => { return { v4: () => `${uuid++}` }; }); +jest.mock('../../application/rule/methods/get_schedule_frequency', () => ({ + validateScheduleLimit: jest.fn(), +})); + const bulkMarkApiKeysForInvalidationMock = bulkMarkApiKeysForInvalidation as jest.Mock; const taskManager = taskManagerMock.createStart(); const ruleTypeRegistry = ruleTypeRegistryMock.create(); @@ -58,6 +66,7 @@ const encryptedSavedObjects = encryptedSavedObjectsMock.createClient(); const authorization = alertingAuthorizationMock.create(); const actionsAuthorization = actionsAuthorizationMock.create(); const auditLogger = auditLoggerMock.create(); +const internalSavedObjectsRepository = savedObjectsRepositoryMock.create(); const kibanaVersion = 'v7.10.0'; const rulesClientParams: jest.Mocked = { @@ -71,11 +80,13 @@ const rulesClientParams: jest.Mocked = { getUserName: jest.fn(), createAPIKey: jest.fn(), logger: loggingSystemMock.create().get(), + internalSavedObjectsRepository, encryptedSavedObjectsClient: encryptedSavedObjects, getActionsClient: jest.fn(), getEventLogClient: jest.fn(), kibanaVersion, auditLogger, + maxScheduledPerMinute: 10000, minimumScheduleInterval: { value: '1m', enforce: false }, isAuthenticationTypeAPIKey: jest.fn(), getAuthenticationAPIKey: jest.fn(), diff --git a/x-pack/plugins/alerting/server/rules_client/tests/update_api_key.test.ts b/x-pack/plugins/alerting/server/rules_client/tests/update_api_key.test.ts index c915ccf1fe5c4..cc5d4e32511bc 100644 --- a/x-pack/plugins/alerting/server/rules_client/tests/update_api_key.test.ts +++ b/x-pack/plugins/alerting/server/rules_client/tests/update_api_key.test.ts @@ -6,7 +6,11 @@ */ import { RulesClient, ConstructorOptions } from '../rules_client'; -import { savedObjectsClientMock, loggingSystemMock } from '@kbn/core/server/mocks'; +import { + savedObjectsClientMock, + loggingSystemMock, + savedObjectsRepositoryMock, +} from '@kbn/core/server/mocks'; import { taskManagerMock } from '@kbn/task-manager-plugin/server/mocks'; import { ruleTypeRegistryMock } from '../../rule_type_registry.mock'; import { alertingAuthorizationMock } from '../../authorization/alerting_authorization.mock'; @@ -30,6 +34,7 @@ const encryptedSavedObjects = encryptedSavedObjectsMock.createClient(); const authorization = alertingAuthorizationMock.create(); const actionsAuthorization = actionsAuthorizationMock.create(); const auditLogger = auditLoggerMock.create(); +const internalSavedObjectsRepository = savedObjectsRepositoryMock.create(); const kibanaVersion = 'v7.10.0'; const rulesClientParams: jest.Mocked = { @@ -40,10 +45,12 @@ const rulesClientParams: jest.Mocked = { actionsAuthorization: actionsAuthorization as unknown as ActionsAuthorization, spaceId: 'default', namespace: 'default', + maxScheduledPerMinute: 10000, minimumScheduleInterval: { value: '1m', enforce: false }, getUserName: jest.fn(), createAPIKey: jest.fn(), logger: loggingSystemMock.create().get(), + internalSavedObjectsRepository, encryptedSavedObjectsClient: encryptedSavedObjects, getActionsClient: jest.fn(), getEventLogClient: jest.fn(), diff --git a/x-pack/plugins/alerting/server/rules_client/types.ts b/x-pack/plugins/alerting/server/rules_client/types.ts index afcaaaaf34499..c755651f5524d 100644 --- a/x-pack/plugins/alerting/server/rules_client/types.ts +++ b/x-pack/plugins/alerting/server/rules_client/types.ts @@ -6,7 +6,12 @@ */ import { KueryNode } from '@kbn/es-query'; -import { Logger, SavedObjectsClientContract, PluginInitializerContext } from '@kbn/core/server'; +import { + Logger, + SavedObjectsClientContract, + PluginInitializerContext, + ISavedObjectsRepository, +} from '@kbn/core/server'; import { ActionsClient, ActionsAuthorization } from '@kbn/actions-plugin/server'; import { GrantAPIKeyResult as SecurityPluginGrantAPIKeyResult, @@ -55,11 +60,13 @@ export interface RulesClientContext { readonly authorization: AlertingAuthorization; readonly ruleTypeRegistry: RuleTypeRegistry; readonly minimumScheduleInterval: AlertingRulesConfig['minimumScheduleInterval']; + readonly maxScheduledPerMinute: AlertingRulesConfig['maxScheduledPerMinute']; readonly minimumScheduleIntervalInMs: number; readonly createAPIKey: (name: string) => Promise; readonly getActionsClient: () => Promise; readonly actionsAuthorization: ActionsAuthorization; readonly getEventLogClient: () => Promise; + readonly internalSavedObjectsRepository: ISavedObjectsRepository; readonly encryptedSavedObjectsClient: EncryptedSavedObjectsClient; readonly kibanaVersion: PluginInitializerContext['env']['packageInfo']['version']; readonly auditLogger?: AuditLogger; diff --git a/x-pack/plugins/alerting/server/rules_client_conflict_retries.test.ts b/x-pack/plugins/alerting/server/rules_client_conflict_retries.test.ts index fcde2f6e4f444..6b4ce4c16fe8b 100644 --- a/x-pack/plugins/alerting/server/rules_client_conflict_retries.test.ts +++ b/x-pack/plugins/alerting/server/rules_client_conflict_retries.test.ts @@ -8,7 +8,11 @@ import { cloneDeep } from 'lodash'; import { RulesClient, ConstructorOptions } from './rules_client'; -import { savedObjectsClientMock, loggingSystemMock } from '@kbn/core/server/mocks'; +import { + savedObjectsClientMock, + loggingSystemMock, + savedObjectsRepositoryMock, +} from '@kbn/core/server/mocks'; import { taskManagerMock } from '@kbn/task-manager-plugin/server/mocks'; import { ruleTypeRegistryMock } from './rule_type_registry.mock'; import { alertingAuthorizationMock } from './authorization/alerting_authorization.mock'; @@ -21,6 +25,10 @@ import { RetryForConflictsAttempts } from './lib/retry_if_conflicts'; import { TaskStatus } from '@kbn/task-manager-plugin/server/task'; import { RecoveredActionGroup } from '../common'; +jest.mock('./application/rule/methods/get_schedule_frequency', () => ({ + validateScheduleLimit: jest.fn(), +})); + let rulesClient: RulesClient; const MockAlertId = 'alert-id'; @@ -34,6 +42,7 @@ const unsecuredSavedObjectsClient = savedObjectsClientMock.create(); const encryptedSavedObjects = encryptedSavedObjectsMock.createClient(); const authorization = alertingAuthorizationMock.create(); const actionsAuthorization = actionsAuthorizationMock.create(); +const internalSavedObjectsRepository = savedObjectsRepositoryMock.create(); const kibanaVersion = 'v7.10.0'; const logger = loggingSystemMock.create().get(); @@ -48,10 +57,12 @@ const rulesClientParams: jest.Mocked = { getUserName: jest.fn(), createAPIKey: jest.fn(), logger, + internalSavedObjectsRepository, encryptedSavedObjectsClient: encryptedSavedObjects, getActionsClient: jest.fn(), getEventLogClient: jest.fn(), kibanaVersion, + maxScheduledPerMinute: 10000, minimumScheduleInterval: { value: '1m', enforce: false }, isAuthenticationTypeAPIKey: jest.fn(), getAuthenticationAPIKey: jest.fn(), diff --git a/x-pack/plugins/alerting/server/rules_client_factory.test.ts b/x-pack/plugins/alerting/server/rules_client_factory.test.ts index d1554a46991fd..6bb4f945d5430 100644 --- a/x-pack/plugins/alerting/server/rules_client_factory.test.ts +++ b/x-pack/plugins/alerting/server/rules_client_factory.test.ts @@ -12,6 +12,7 @@ import { savedObjectsClientMock, savedObjectsServiceMock, loggingSystemMock, + savedObjectsRepositoryMock, } from '@kbn/core/server/mocks'; import { encryptedSavedObjectsMock } from '@kbn/encrypted-saved-objects-plugin/server/mocks'; import { AuthenticatedUser } from '@kbn/security-plugin/common/model'; @@ -37,6 +38,7 @@ const securityPluginStart = securityMock.createStart(); const alertingAuthorization = alertingAuthorizationMock.create(); const alertingAuthorizationClientFactory = alertingAuthorizationClientFactoryMock.createFactory(); +const internalSavedObjectsRepository = savedObjectsRepositoryMock.create(); const rulesClientFactoryParams: jest.Mocked = { logger: loggingSystemMock.create().get(), @@ -44,7 +46,9 @@ const rulesClientFactoryParams: jest.Mocked = { ruleTypeRegistry: ruleTypeRegistryMock.create(), getSpaceId: jest.fn(), spaceIdToNamespace: jest.fn(), + maxScheduledPerMinute: 10000, minimumScheduleInterval: { value: '1m', enforce: false }, + internalSavedObjectsRepository, encryptedSavedObjectsClient: encryptedSavedObjectsMock.createClient(), actions: actionsMock.createStart(), eventLog: eventLogMock.createStart(), @@ -101,8 +105,10 @@ test('creates a rules client with proper constructor arguments when security is getActionsClient: expect.any(Function), getEventLogClient: expect.any(Function), createAPIKey: expect.any(Function), + internalSavedObjectsRepository: rulesClientFactoryParams.internalSavedObjectsRepository, encryptedSavedObjectsClient: rulesClientFactoryParams.encryptedSavedObjectsClient, kibanaVersion: '7.10.0', + maxScheduledPerMinute: 10000, minimumScheduleInterval: { value: '1m', enforce: false }, isAuthenticationTypeAPIKey: expect.any(Function), getAuthenticationAPIKey: expect.any(Function), @@ -139,10 +145,12 @@ test('creates a rules client with proper constructor arguments', async () => { namespace: 'default', getUserName: expect.any(Function), createAPIKey: expect.any(Function), + internalSavedObjectsRepository: rulesClientFactoryParams.internalSavedObjectsRepository, encryptedSavedObjectsClient: rulesClientFactoryParams.encryptedSavedObjectsClient, getActionsClient: expect.any(Function), getEventLogClient: expect.any(Function), kibanaVersion: '7.10.0', + maxScheduledPerMinute: 10000, minimumScheduleInterval: { value: '1m', enforce: false }, isAuthenticationTypeAPIKey: expect.any(Function), getAuthenticationAPIKey: expect.any(Function), diff --git a/x-pack/plugins/alerting/server/rules_client_factory.ts b/x-pack/plugins/alerting/server/rules_client_factory.ts index d99dc12b13e28..e0b9de5dc53e2 100644 --- a/x-pack/plugins/alerting/server/rules_client_factory.ts +++ b/x-pack/plugins/alerting/server/rules_client_factory.ts @@ -10,6 +10,7 @@ import { Logger, SavedObjectsServiceStart, PluginInitializerContext, + ISavedObjectsRepository, } from '@kbn/core/server'; import { PluginStartContract as ActionsPluginStartContract } from '@kbn/actions-plugin/server'; import { @@ -34,12 +35,14 @@ export interface RulesClientFactoryOpts { getSpaceId: (request: KibanaRequest) => string; spaceIdToNamespace: SpaceIdToNamespaceFunction; encryptedSavedObjectsClient: EncryptedSavedObjectsClient; + internalSavedObjectsRepository: ISavedObjectsRepository; actions: ActionsPluginStartContract; eventLog: IEventLogClientService; kibanaVersion: PluginInitializerContext['env']['packageInfo']['version']; authorization: AlertingAuthorizationClientFactory; eventLogger?: IEventLogger; minimumScheduleInterval: AlertingRulesConfig['minimumScheduleInterval']; + maxScheduledPerMinute: AlertingRulesConfig['maxScheduledPerMinute']; } export class RulesClientFactory { @@ -52,12 +55,14 @@ export class RulesClientFactory { private getSpaceId!: (request: KibanaRequest) => string; private spaceIdToNamespace!: SpaceIdToNamespaceFunction; private encryptedSavedObjectsClient!: EncryptedSavedObjectsClient; + private internalSavedObjectsRepository!: ISavedObjectsRepository; private actions!: ActionsPluginStartContract; private eventLog!: IEventLogClientService; private kibanaVersion!: PluginInitializerContext['env']['packageInfo']['version']; private authorization!: AlertingAuthorizationClientFactory; private eventLogger?: IEventLogger; private minimumScheduleInterval!: AlertingRulesConfig['minimumScheduleInterval']; + private maxScheduledPerMinute!: AlertingRulesConfig['maxScheduledPerMinute']; public initialize(options: RulesClientFactoryOpts) { if (this.isInitialized) { @@ -72,12 +77,14 @@ export class RulesClientFactory { this.securityPluginStart = options.securityPluginStart; this.spaceIdToNamespace = options.spaceIdToNamespace; this.encryptedSavedObjectsClient = options.encryptedSavedObjectsClient; + this.internalSavedObjectsRepository = options.internalSavedObjectsRepository; this.actions = options.actions; this.eventLog = options.eventLog; this.kibanaVersion = options.kibanaVersion; this.authorization = options.authorization; this.eventLogger = options.eventLogger; this.minimumScheduleInterval = options.minimumScheduleInterval; + this.maxScheduledPerMinute = options.maxScheduledPerMinute; } public create(request: KibanaRequest, savedObjects: SavedObjectsServiceStart): RulesClient { @@ -95,6 +102,7 @@ export class RulesClientFactory { taskManager: this.taskManager, ruleTypeRegistry: this.ruleTypeRegistry, minimumScheduleInterval: this.minimumScheduleInterval, + maxScheduledPerMinute: this.maxScheduledPerMinute, unsecuredSavedObjectsClient: savedObjects.getScopedClient(request, { excludedExtensions: [SECURITY_EXTENSION_ID], includedHiddenTypes: ['alert', 'api_key_pending_invalidation'], @@ -102,6 +110,7 @@ export class RulesClientFactory { authorization: this.authorization.create(request), actionsAuthorization: actions.getActionsAuthorizationWithRequest(request), namespace: this.spaceIdToNamespace(spaceId), + internalSavedObjectsRepository: this.internalSavedObjectsRepository, encryptedSavedObjectsClient: this.encryptedSavedObjectsClient, auditLogger: securityPluginSetup?.audit.asScoped(request), async getUserName() { diff --git a/x-pack/plugins/alerting/server/test_utils/index.ts b/x-pack/plugins/alerting/server/test_utils/index.ts index ec82b884fb427..9985f43348eb0 100644 --- a/x-pack/plugins/alerting/server/test_utils/index.ts +++ b/x-pack/plugins/alerting/server/test_utils/index.ts @@ -60,6 +60,7 @@ export function generateAlertingConfig(): AlertingConfig { maxEphemeralActionsPerAlert: 10, cancelAlertsOnRuleTimeout: true, rules: { + maxScheduledPerMinute: 10000, minimumScheduleInterval: { value: '1m', enforce: false }, run: { actions: { diff --git a/x-pack/plugins/triggers_actions_ui/server/routes/config.test.ts b/x-pack/plugins/triggers_actions_ui/server/routes/config.test.ts index 371ee93a6dfa0..e6a81ddbfd1ca 100644 --- a/x-pack/plugins/triggers_actions_ui/server/routes/config.test.ts +++ b/x-pack/plugins/triggers_actions_ui/server/routes/config.test.ts @@ -51,6 +51,7 @@ describe('createConfigRoute', () => { baseRoute: `/internal/triggers_actions_ui`, alertingConfig: () => ({ isUsingSecurity: true, + maxScheduledPerMinute: 10000, minimumScheduleInterval: { value: '1m', enforce: false }, }), getRulesClientWithRequest: () => mockRulesClient, @@ -64,7 +65,11 @@ describe('createConfigRoute', () => { expect(mockResponse.ok).toBeCalled(); expect(mockResponse.ok.mock.calls[0][0]).toEqual({ - body: { isUsingSecurity: true, minimumScheduleInterval: { value: '1m', enforce: false } }, + body: { + isUsingSecurity: true, + maxScheduledPerMinute: 10000, + minimumScheduleInterval: { value: '1m', enforce: false }, + }, }); }); @@ -80,6 +85,7 @@ describe('createConfigRoute', () => { baseRoute: `/internal/triggers_actions_ui`, alertingConfig: () => ({ isUsingSecurity: true, + maxScheduledPerMinute: 10000, minimumScheduleInterval: { value: '1m', enforce: false }, }), getRulesClientWithRequest: () => mockRulesClient, diff --git a/x-pack/test/alerting_api_integration/common/config.ts b/x-pack/test/alerting_api_integration/common/config.ts index 3ba6caf872159..7509a8842af52 100644 --- a/x-pack/test/alerting_api_integration/common/config.ts +++ b/x-pack/test/alerting_api_integration/common/config.ts @@ -28,6 +28,7 @@ interface CreateTestConfigOptions { reportName?: string; useDedicatedTaskRunner: boolean; enableFooterInEmail?: boolean; + maxScheduledPerMinute?: number; } // test.not-enabled is specifically not enabled @@ -82,6 +83,7 @@ export function createTestConfig(name: string, options: CreateTestConfigOptions) reportName = undefined, useDedicatedTaskRunner, enableFooterInEmail = true, + maxScheduledPerMinute, } = options; return async ({ readConfigFile }: FtrConfigProviderContext) => { @@ -151,6 +153,11 @@ export function createTestConfig(name: string, options: CreateTestConfigOptions) ? [`--xpack.actions.email.domain_allowlist=${JSON.stringify(emailDomainsAllowed)}`] : []; + const maxScheduledPerMinuteSettings = + typeof maxScheduledPerMinute === 'number' + ? [`--xpack.alerting.rules.maxScheduledPerMinute=${maxScheduledPerMinute}`] + : []; + return { testFiles: testFiles ? testFiles : [require.resolve(`../${name}/tests/`)], servers, @@ -199,6 +206,7 @@ export function createTestConfig(name: string, options: CreateTestConfigOptions) ...actionsProxyUrl, ...customHostSettings, ...emailSettings, + ...maxScheduledPerMinuteSettings, '--xpack.eventLog.logEntries=true', '--xpack.task_manager.ephemeral_tasks.enabled=false', `--xpack.task_manager.unsafe.exclude_task_types=${JSON.stringify([ diff --git a/x-pack/test/alerting_api_integration/security_and_spaces/group3/config_with_schedule_circuit_breaker.ts b/x-pack/test/alerting_api_integration/security_and_spaces/group3/config_with_schedule_circuit_breaker.ts new file mode 100644 index 0000000000000..e6441be2e7226 --- /dev/null +++ b/x-pack/test/alerting_api_integration/security_and_spaces/group3/config_with_schedule_circuit_breaker.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; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { createTestConfig } from '../../common/config'; + +// eslint-disable-next-line import/no-default-export +export default createTestConfig('security_and_spaces', { + disabledPlugins: [], + license: 'trial', + ssl: true, + enableActionsProxy: true, + publicBaseUrl: true, + testFiles: [require.resolve('./tests/alerting/schedule_circuit_breaker')], + useDedicatedTaskRunner: true, + maxScheduledPerMinute: 10, +}); diff --git a/x-pack/test/alerting_api_integration/security_and_spaces/group3/tests/alerting/schedule_circuit_breaker/bulk_edit_with_circuit_breaker.ts b/x-pack/test/alerting_api_integration/security_and_spaces/group3/tests/alerting/schedule_circuit_breaker/bulk_edit_with_circuit_breaker.ts new file mode 100644 index 0000000000000..d878eb7404238 --- /dev/null +++ b/x-pack/test/alerting_api_integration/security_and_spaces/group3/tests/alerting/schedule_circuit_breaker/bulk_edit_with_circuit_breaker.ts @@ -0,0 +1,124 @@ +/* + * 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 '../../../../../common/ftr_provider_context'; +import { getUrlPrefix, getTestRuleData, ObjectRemover } from '../../../../../common/lib'; + +// eslint-disable-next-line import/no-default-export +export default function bulkEditWithCircuitBreakerTests({ getService }: FtrProviderContext) { + const supertest = getService('supertest'); + const objectRemover = new ObjectRemover(supertest); + + describe('Bulk edit with circuit breaker', () => { + afterEach(async () => { + await objectRemover.removeAll(); + }); + + it('should prevent rules from being bulk edited if max schedules have been reached', async () => { + const { body: createdRule1 } = await supertest + .post(`${getUrlPrefix('space1')}/api/alerting/rule`) + .set('kbn-xsrf', 'foo') + .send(getTestRuleData({ schedule: { interval: '20s' } })) + .expect(200); + objectRemover.add('space1', createdRule1.id, 'rule', 'alerting'); + + const { body: createdRule2 } = await supertest + .post(`${getUrlPrefix('space1')}/api/alerting/rule`) + .set('kbn-xsrf', 'foo') + .send(getTestRuleData({ schedule: { interval: '20s' } })) + .expect(200); + objectRemover.add('space1', createdRule2.id, 'rule', 'alerting'); + + const { body: createdRule3 } = await supertest + .post(`${getUrlPrefix('space1')}/api/alerting/rule`) + .set('kbn-xsrf', 'foo') + .send(getTestRuleData({ schedule: { interval: '20s' } })) + .expect(200); + objectRemover.add('space1', createdRule3.id, 'rule', 'alerting'); + + const payload = { + ids: [createdRule2.id, createdRule3.id], + operations: [ + { + operation: 'set', + field: 'schedule', + value: { + interval: '10s', + }, + }, + ], + }; + + const { body } = await supertest + .post(`${getUrlPrefix('space1')}/internal/alerting/rules/_bulk_edit`) + .set('kbn-xsrf', 'foo') + .send(payload) + .expect(200); + + expect(body.errors.length).eql(2); + expect(body.errors[0].message).eql( + 'Failed to bulk edit rule - Run limit reached: The rule has 12 runs per minute; there are only 1 runs per minute available.' + ); + }); + + it('should allow disabled rules to go over the circuit breaker', async () => { + const { body: createdRule1 } = await supertest + .post(`${getUrlPrefix('space1')}/api/alerting/rule`) + .set('kbn-xsrf', 'foo') + .send(getTestRuleData({ schedule: { interval: '20s' } })) + .expect(200); + objectRemover.add('space1', createdRule1.id, 'rule', 'alerting'); + + const { body: createdRule2 } = await supertest + .post(`${getUrlPrefix('space1')}/api/alerting/rule`) + .set('kbn-xsrf', 'foo') + .send( + getTestRuleData({ + enabled: false, + schedule: { interval: '20s' }, + }) + ) + .expect(200); + objectRemover.add('space1', createdRule2.id, 'rule', 'alerting'); + + const { body: createdRule3 } = await supertest + .post(`${getUrlPrefix('space1')}/api/alerting/rule`) + .set('kbn-xsrf', 'foo') + .send( + getTestRuleData({ + enabled: false, + schedule: { interval: '20s' }, + }) + ) + .expect(200); + objectRemover.add('space1', createdRule3.id, 'rule', 'alerting'); + + const payload = { + ids: [createdRule2.id, createdRule3.id], + operations: [ + { + operation: 'set', + field: 'schedule', + value: { + interval: '10s', + }, + }, + ], + }; + + const { body } = await supertest + .post(`${getUrlPrefix('space1')}/internal/alerting/rules/_bulk_edit`) + .set('kbn-xsrf', 'foo') + .send(payload) + .expect(200); + + expect(body.rules.length).eql(2); + expect(body.errors.length).eql(0); + }); + }); +} diff --git a/x-pack/test/alerting_api_integration/security_and_spaces/group3/tests/alerting/schedule_circuit_breaker/bulk_enable_with_circuit_breaker.ts b/x-pack/test/alerting_api_integration/security_and_spaces/group3/tests/alerting/schedule_circuit_breaker/bulk_enable_with_circuit_breaker.ts new file mode 100644 index 0000000000000..d60409223b2b3 --- /dev/null +++ b/x-pack/test/alerting_api_integration/security_and_spaces/group3/tests/alerting/schedule_circuit_breaker/bulk_enable_with_circuit_breaker.ts @@ -0,0 +1,66 @@ +/* + * 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 '../../../../../common/ftr_provider_context'; +import { getUrlPrefix, getTestRuleData, ObjectRemover } from '../../../../../common/lib'; + +// eslint-disable-next-line import/no-default-export +export default function bulkEnableWithCircuitBreakerTests({ getService }: FtrProviderContext) { + const supertest = getService('supertest'); + const objectRemover = new ObjectRemover(supertest); + + describe('Bulk enable with circuit breaker', () => { + afterEach(async () => { + await objectRemover.removeAll(); + }); + + it('should prevent rules from being bulk enabled if max schedules have been reached', async () => { + const { body: createdRule1 } = await supertest + .post(`${getUrlPrefix('space1')}/api/alerting/rule`) + .set('kbn-xsrf', 'foo') + .send(getTestRuleData({ schedule: { interval: '10s' } })) + .expect(200); + objectRemover.add('space1', createdRule1.id, 'rule', 'alerting'); + + const { body: createdRule2 } = await supertest + .post(`${getUrlPrefix('space1')}/api/alerting/rule`) + .set('kbn-xsrf', 'foo') + .send( + getTestRuleData({ + enabled: false, + schedule: { interval: '20s' }, + }) + ) + .expect(200); + objectRemover.add('space1', createdRule2.id, 'rule', 'alerting'); + + const { body: createdRule3 } = await supertest + .post(`${getUrlPrefix('space1')}/api/alerting/rule`) + .set('kbn-xsrf', 'foo') + .send( + getTestRuleData({ + enabled: false, + schedule: { interval: '10s' }, + }) + ) + .expect(200); + objectRemover.add('space1', createdRule3.id, 'rule', 'alerting'); + + const { body } = await supertest + .patch(`${getUrlPrefix('space1')}/internal/alerting/rules/_bulk_enable`) + .set('kbn-xsrf', 'foo') + .send({ ids: [createdRule2.id, createdRule3.id] }) + .expect(200); + + expect(body.errors.length).eql(2); + expect(body.errors[0].message).eql( + 'Error validating enable rule data - Run limit reached: The rule has 9 runs per minute; there are only 4 runs per minute available.' + ); + }); + }); +} diff --git a/x-pack/test/alerting_api_integration/security_and_spaces/group3/tests/alerting/schedule_circuit_breaker/create_with_circuit_breaker.ts b/x-pack/test/alerting_api_integration/security_and_spaces/group3/tests/alerting/schedule_circuit_breaker/create_with_circuit_breaker.ts new file mode 100644 index 0000000000000..8183f6b48f4ed --- /dev/null +++ b/x-pack/test/alerting_api_integration/security_and_spaces/group3/tests/alerting/schedule_circuit_breaker/create_with_circuit_breaker.ts @@ -0,0 +1,73 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { FtrProviderContext } from '../../../../../common/ftr_provider_context'; +import { getUrlPrefix, getTestRuleData, ObjectRemover } from '../../../../../common/lib'; + +// eslint-disable-next-line import/no-default-export +export default function createWithCircuitBreakerTests({ getService }: FtrProviderContext) { + const supertest = getService('supertest'); + const objectRemover = new ObjectRemover(supertest); + + describe('Create with circuit breaker', () => { + afterEach(async () => { + await objectRemover.removeAll(); + }); + + it('should prevent rules from being created if max schedules have been reached', async () => { + const { body: createdRule } = await supertest + .post(`${getUrlPrefix('space1')}/api/alerting/rule`) + .set('kbn-xsrf', 'foo') + .send(getTestRuleData({ schedule: { interval: '10s' } })) + .expect(200); + objectRemover.add('space1', createdRule.id, 'rule', 'alerting'); + + const { body } = await supertest + .post(`${getUrlPrefix('space1')}/api/alerting/rule`) + .set('kbn-xsrf', 'foo') + .send(getTestRuleData({ schedule: { interval: '10s' } })) + .expect(400); + }); + + it('should prevent rules from being created across spaces', async () => { + const { body: createdRule } = await supertest + .post(`${getUrlPrefix('space1')}/api/alerting/rule`) + .set('kbn-xsrf', 'foo') + .send(getTestRuleData({ schedule: { interval: '10s' } })) + .expect(200); + objectRemover.add('space1', createdRule.id, 'rule', 'alerting'); + + const { body } = await supertest + .post(`${getUrlPrefix('space2')}/api/alerting/rule`) + .set('kbn-xsrf', 'foo') + .send(getTestRuleData({ schedule: { interval: '10s' } })) + .expect(400); + }); + + it('should allow disabled rules to go over the circuit breaker', async () => { + const { body: createdRule1 } = await supertest + .post(`${getUrlPrefix('space1')}/api/alerting/rule`) + .set('kbn-xsrf', 'foo') + .send(getTestRuleData({ schedule: { interval: '10s' } })) + .expect(200); + objectRemover.add('space1', createdRule1.id, 'rule', 'alerting'); + + const { body: createdRule2 } = await supertest + .post(`${getUrlPrefix('space1')}/api/alerting/rule`) + .set('kbn-xsrf', 'foo') + .send( + getTestRuleData({ + enabled: false, + schedule: { interval: '10s' }, + }) + ) + .expect(200); + + objectRemover.add('space1', createdRule2.id, 'rule', 'alerting'); + }); + }); +} diff --git a/x-pack/test/alerting_api_integration/security_and_spaces/group3/tests/alerting/schedule_circuit_breaker/enable_with_circuit_breaker.ts b/x-pack/test/alerting_api_integration/security_and_spaces/group3/tests/alerting/schedule_circuit_breaker/enable_with_circuit_breaker.ts new file mode 100644 index 0000000000000..89a90952ed6a7 --- /dev/null +++ b/x-pack/test/alerting_api_integration/security_and_spaces/group3/tests/alerting/schedule_circuit_breaker/enable_with_circuit_breaker.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; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import expect from '@kbn/expect'; +import { FtrProviderContext } from '../../../../../common/ftr_provider_context'; +import { getUrlPrefix, getTestRuleData, ObjectRemover } from '../../../../../common/lib'; + +// eslint-disable-next-line import/no-default-export +export default function enableWithCircuitBreakerTests({ getService }: FtrProviderContext) { + const supertest = getService('supertest'); + const objectRemover = new ObjectRemover(supertest); + + describe('Enable with circuit breaker', () => { + afterEach(async () => { + await objectRemover.removeAll(); + }); + + it('should prevent rules from being enabled if max schedules have been reached', async () => { + const { body: createdRule1 } = await supertest + .post(`${getUrlPrefix('space1')}/api/alerting/rule`) + .set('kbn-xsrf', 'foo') + .send(getTestRuleData({ schedule: { interval: '10s' } })) + .expect(200); + objectRemover.add('space1', createdRule1.id, 'rule', 'alerting'); + + const { body: createdRule2 } = await supertest + .post(`${getUrlPrefix('space1')}/api/alerting/rule`) + .set('kbn-xsrf', 'foo') + .send( + getTestRuleData({ + enabled: false, + schedule: { interval: '5s' }, + }) + ) + .expect(200); + objectRemover.add('space1', createdRule2.id, 'rule', 'alerting'); + + const { body } = await supertest + .post(`${getUrlPrefix('space1')}/api/alerting/rule/${createdRule2.id}/_enable`) + .set('kbn-xsrf', 'foo') + .expect(400); + + expect(body.message).eql( + 'Error validating enable rule data - Run limit reached: The rule has 12 runs per minute; there are only 4 runs per minute available.' + ); + }); + }); +} diff --git a/x-pack/test/alerting_api_integration/security_and_spaces/group3/tests/alerting/schedule_circuit_breaker/get_schedule_frequency.ts b/x-pack/test/alerting_api_integration/security_and_spaces/group3/tests/alerting/schedule_circuit_breaker/get_schedule_frequency.ts new file mode 100644 index 0000000000000..97cf3a74282a5 --- /dev/null +++ b/x-pack/test/alerting_api_integration/security_and_spaces/group3/tests/alerting/schedule_circuit_breaker/get_schedule_frequency.ts @@ -0,0 +1,83 @@ +/* + * 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 '../../../../../common/ftr_provider_context'; +import { UserAtSpaceScenarios } from '../../../../scenarios'; +import { getUrlPrefix, getTestRuleData, ObjectRemover } from '../../../../../common/lib'; + +// eslint-disable-next-line import/no-default-export +export default function getScheduleFrequencyTests({ getService }: FtrProviderContext) { + const supertest = getService('supertest'); + const supertestWithoutAuth = getService('supertestWithoutAuth'); + const objectRemover = new ObjectRemover(supertest); + + describe('getScheduleFrequency', () => { + before(async () => { + const { body: createdRule1 } = await supertest + .post(`${getUrlPrefix('space1')}/api/alerting/rule`) + .set('kbn-xsrf', 'foo') + .send(getTestRuleData({ schedule: { interval: '30s' } })) + .expect(200); + objectRemover.add('space1', createdRule1.id, 'rule', 'alerting'); + + const { body: createdRule2 } = await supertest + .post(`${getUrlPrefix('space1')}/api/alerting/rule`) + .set('kbn-xsrf', 'foo') + .send(getTestRuleData({ schedule: { interval: '1m' } })) + .expect(200); + objectRemover.add('space1', createdRule2.id, 'rule', 'alerting'); + + const { body: createdRule3 } = await supertest + .post(`${getUrlPrefix('space2')}/api/alerting/rule`) + .set('kbn-xsrf', 'foo') + .send(getTestRuleData({ schedule: { interval: '2m' } })) + .expect(200); + objectRemover.add('space2', createdRule3.id, 'rule', 'alerting'); + + const { body: createdRule4 } = await supertest + .post(`${getUrlPrefix('space2')}/api/alerting/rule`) + .set('kbn-xsrf', 'foo') + .send(getTestRuleData({ schedule: { interval: '30s' } })) + .expect(200); + objectRemover.add('space2', createdRule4.id, 'rule', 'alerting'); + }); + + after(async () => { + await objectRemover.removeAll(); + }); + + for (const scenario of UserAtSpaceScenarios) { + const { user, space } = scenario; + + describe(scenario.id, () => { + it('should get the total and remaining schedule frequency', async () => { + const { body } = await supertestWithoutAuth + .get(`${getUrlPrefix(space.id)}/internal/alerting/rules/_schedule_frequency`) + .set('kbn-xsrf', 'foo') + .send() + .auth(user.username, user.password); + + switch (scenario.id) { + case 'no_kibana_privileges at space1': + case 'space_1_all at space2': + case 'global_read at space1': + case 'space_1_all_alerts_none_actions at space1': + case 'superuser at space1': + case 'space_1_all at space1': + case 'space_1_all_with_restricted_fixture at space1': + expect(body.total_scheduled_per_minute).eql(5.5); + expect(body.remaining_schedules_per_minute).eql(4.5); + break; + default: + throw new Error(`Scenario untested: ${JSON.stringify(scenario)}`); + } + }); + }); + } + }); +} diff --git a/x-pack/test/alerting_api_integration/security_and_spaces/group3/tests/alerting/schedule_circuit_breaker/index.ts b/x-pack/test/alerting_api_integration/security_and_spaces/group3/tests/alerting/schedule_circuit_breaker/index.ts new file mode 100644 index 0000000000000..963b1bda33245 --- /dev/null +++ b/x-pack/test/alerting_api_integration/security_and_spaces/group3/tests/alerting/schedule_circuit_breaker/index.ts @@ -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; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { FtrProviderContext } from '../../../../../common/ftr_provider_context'; +import { setupSpacesAndUsers, tearDown } from '../../../../setup'; + +// eslint-disable-next-line import/no-default-export +export default function alertingTests({ loadTestFile, getService }: FtrProviderContext) { + describe('Alerts - Group 3 - schedule circuit breaker', () => { + describe('alerts', () => { + before(async () => { + await setupSpacesAndUsers(getService); + }); + + after(async () => { + await tearDown(getService); + }); + + loadTestFile(require.resolve('./get_schedule_frequency')); + loadTestFile(require.resolve('./create_with_circuit_breaker')); + loadTestFile(require.resolve('./update_with_circuit_breaker')); + loadTestFile(require.resolve('./enable_with_circuit_breaker')); + loadTestFile(require.resolve('./bulk_enable_with_circuit_breaker')); + loadTestFile(require.resolve('./bulk_edit_with_circuit_breaker')); + }); + }); +} diff --git a/x-pack/test/alerting_api_integration/security_and_spaces/group3/tests/alerting/schedule_circuit_breaker/update_with_circuit_breaker.ts b/x-pack/test/alerting_api_integration/security_and_spaces/group3/tests/alerting/schedule_circuit_breaker/update_with_circuit_breaker.ts new file mode 100644 index 0000000000000..2b1b8e749def9 --- /dev/null +++ b/x-pack/test/alerting_api_integration/security_and_spaces/group3/tests/alerting/schedule_circuit_breaker/update_with_circuit_breaker.ts @@ -0,0 +1,99 @@ +/* + * 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 '../../../../../common/ftr_provider_context'; +import { getUrlPrefix, getTestRuleData, ObjectRemover } from '../../../../../common/lib'; + +// eslint-disable-next-line import/no-default-export +export default function updateWithCircuitBreakerTests({ getService }: FtrProviderContext) { + const supertest = getService('supertest'); + const objectRemover = new ObjectRemover(supertest); + + describe('Update with circuit breaker', () => { + afterEach(async () => { + await objectRemover.removeAll(); + }); + + it('should prevent rules from being updated if max schedules have been reached', async () => { + const { body: createdRule1 } = await supertest + .post(`${getUrlPrefix('space1')}/api/alerting/rule`) + .set('kbn-xsrf', 'foo') + .send(getTestRuleData({ schedule: { interval: '20s' } })) + .expect(200); + objectRemover.add('space1', createdRule1.id, 'rule', 'alerting'); + + const { body: createdRule2 } = await supertest + .post(`${getUrlPrefix('space1')}/api/alerting/rule`) + .set('kbn-xsrf', 'foo') + .send(getTestRuleData({ schedule: { interval: '20s' } })) + .expect(200); + objectRemover.add('space1', createdRule2.id, 'rule', 'alerting'); + + const updatedData = { + name: 'bcd', + tags: ['bar'], + params: { + foo: true, + }, + schedule: { interval: '5s' }, + actions: [], + throttle: '1m', + notify_when: 'onThrottleInterval', + }; + + const { body } = await supertest + .put(`${getUrlPrefix('space1')}/api/alerting/rule/${createdRule2.id}`) + .set('kbn-xsrf', 'foo') + .send(updatedData) + .expect(400); + + expect(body.message).eql( + 'Error validating update data - Run limit reached: The rule has 12 runs per minute; there are only 7 runs per minute available.' + ); + }); + + it('should allow disabled rules to go over the circuit breaker', async () => { + const { body: createdRule1 } = await supertest + .post(`${getUrlPrefix('space1')}/api/alerting/rule`) + .set('kbn-xsrf', 'foo') + .send(getTestRuleData({ schedule: { interval: '20s' } })) + .expect(200); + objectRemover.add('space1', createdRule1.id, 'rule', 'alerting'); + + const { body: createdRule2 } = await supertest + .post(`${getUrlPrefix('space1')}/api/alerting/rule`) + .set('kbn-xsrf', 'foo') + .send( + getTestRuleData({ + enabled: false, + schedule: { interval: '20s' }, + }) + ) + .expect(200); + objectRemover.add('space1', createdRule2.id, 'rule', 'alerting'); + + const updatedData = { + name: 'bcd', + tags: ['bar'], + params: { + foo: true, + }, + schedule: { interval: '5s' }, + actions: [], + throttle: '1m', + notify_when: 'onThrottleInterval', + }; + + await supertest + .put(`${getUrlPrefix('space1')}/api/alerting/rule/${createdRule2.id}`) + .set('kbn-xsrf', 'foo') + .send(updatedData) + .expect(200); + }); + }); +} From d09ba9090c2ee9138220e70dc184a3ab3c6ceb14 Mon Sep 17 00:00:00 2001 From: Tiago Costa Date: Wed, 6 Sep 2023 17:14:54 +0100 Subject: [PATCH 49/97] skip flaky suite (#165640) --- .../list_detail_page/list_details.cy.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/x-pack/test/security_solution_cypress/cypress/e2e/exceptions/shared_exception_lists_management/list_detail_page/list_details.cy.ts b/x-pack/test/security_solution_cypress/cypress/e2e/exceptions/shared_exception_lists_management/list_detail_page/list_details.cy.ts index 50cd2dae04ec5..4eb947890dc55 100644 --- a/x-pack/test/security_solution_cypress/cypress/e2e/exceptions/shared_exception_lists_management/list_detail_page/list_details.cy.ts +++ b/x-pack/test/security_solution_cypress/cypress/e2e/exceptions/shared_exception_lists_management/list_detail_page/list_details.cy.ts @@ -40,7 +40,8 @@ const getExceptionList1 = () => ({ const EXCEPTION_LIST_NAME = 'Newly created list'; -describe('Exception list detail page', { tags: ['@ess', '@serverless'] }, () => { +// FLAKY: https://github.com/elastic/kibana/issues/165640 +describe('Exception list detail page', { tags: ['@ess', '@serverless', '@brokenInServerless'] }, () => { before(() => { cy.task('esArchiverResetKibana'); login(); From 5f0c79e4241bd78e6c21f74e354e76cefefd7736 Mon Sep 17 00:00:00 2001 From: Cristina Amico Date: Wed, 6 Sep 2023 18:15:28 +0200 Subject: [PATCH 50/97] [Fleet] Readme improvements (#165854) ## Summary Related to https://github.com/elastic/kibana/pull/163570 Add a section to Readme about option to provide a default version for API headers. --- x-pack/plugins/fleet/README.md | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/x-pack/plugins/fleet/README.md b/x-pack/plugins/fleet/README.md index b4a14c83ff986..ebe65d77e3bbf 100644 --- a/x-pack/plugins/fleet/README.md +++ b/x-pack/plugins/fleet/README.md @@ -67,6 +67,14 @@ yarn kbn bootstrap #### Useful tips +To avoid the enforcing of version headers when running in dev mode, add the following to your `kibana.dev.yml`: + +``` +server.versioned.versionResolution: oldest +``` +This will provide a default version for the public apis. + + If Kibana fails to start, it is possible that your local setup got corrupted. An easy fix is to run: ``` From bf3eb268765c2a558f61ac55b228ae291b87f69f Mon Sep 17 00:00:00 2001 From: Tiago Costa Date: Wed, 6 Sep 2023 17:16:40 +0100 Subject: [PATCH 51/97] fix(NA): eslint check --- .../list_detail_page/list_details.cy.ts | 152 +++++++++--------- 1 file changed, 78 insertions(+), 74 deletions(-) diff --git a/x-pack/test/security_solution_cypress/cypress/e2e/exceptions/shared_exception_lists_management/list_detail_page/list_details.cy.ts b/x-pack/test/security_solution_cypress/cypress/e2e/exceptions/shared_exception_lists_management/list_detail_page/list_details.cy.ts index 4eb947890dc55..74c47b853d95c 100644 --- a/x-pack/test/security_solution_cypress/cypress/e2e/exceptions/shared_exception_lists_management/list_detail_page/list_details.cy.ts +++ b/x-pack/test/security_solution_cypress/cypress/e2e/exceptions/shared_exception_lists_management/list_detail_page/list_details.cy.ts @@ -41,88 +41,92 @@ const getExceptionList1 = () => ({ const EXCEPTION_LIST_NAME = 'Newly created list'; // FLAKY: https://github.com/elastic/kibana/issues/165640 -describe('Exception list detail page', { tags: ['@ess', '@serverless', '@brokenInServerless'] }, () => { - before(() => { - cy.task('esArchiverResetKibana'); - login(); - - // Create exception list associated with a rule - createExceptionList(getExceptionList1(), getExceptionList1().list_id).then((response) => - createRule( - getNewRule({ - exceptions_list: [ - { - id: response.body.id, - list_id: getExceptionList1().list_id, - type: getExceptionList1().type, - namespace_type: getExceptionList1().namespace_type, - }, - ], - }) - ) - ); - createRule(getNewRule({ name: 'Rule to link to shared list' })); - }); - - beforeEach(() => { - login(); - visitWithoutDateRange(EXCEPTIONS_URL); - }); - - it('Should edit list details', () => { - visitWithoutDateRange(exceptionsListDetailsUrl(getExceptionList1().list_id)); - waitForExceptionListDetailToBeLoaded(); - // Check list details are loaded - cy.get(EXCEPTIONS_LIST_MANAGEMENT_NAME).should('have.text', LIST_NAME); - cy.get(EXCEPTIONS_LIST_MANAGEMENT_DESCRIPTION).should('have.text', LIST_DESCRIPTION); - - // Update list details in edit modal - editExceptionLisDetails({ - name: { original: LIST_NAME, updated: UPDATED_LIST_NAME }, - description: { original: LIST_DESCRIPTION, updated: UPDATED_LIST_DESCRIPTION }, +describe( + 'Exception list detail page', + { tags: ['@ess', '@serverless', '@brokenInServerless'] }, + () => { + before(() => { + cy.task('esArchiverResetKibana'); + login(); + + // Create exception list associated with a rule + createExceptionList(getExceptionList1(), getExceptionList1().list_id).then((response) => + createRule( + getNewRule({ + exceptions_list: [ + { + id: response.body.id, + list_id: getExceptionList1().list_id, + type: getExceptionList1().type, + namespace_type: getExceptionList1().namespace_type, + }, + ], + }) + ) + ); + createRule(getNewRule({ name: 'Rule to link to shared list' })); }); - // Ensure that list details were updated - cy.get(EXCEPTIONS_LIST_MANAGEMENT_NAME).should('have.text', UPDATED_LIST_NAME); - cy.get(EXCEPTIONS_LIST_MANAGEMENT_DESCRIPTION).should('have.text', UPDATED_LIST_DESCRIPTION); - - // Ensure that list details changes persisted - visitWithoutDateRange(exceptionsListDetailsUrl(getExceptionList1().list_id)); - cy.get(EXCEPTIONS_LIST_MANAGEMENT_NAME).should('have.text', UPDATED_LIST_NAME); - cy.get(EXCEPTIONS_LIST_MANAGEMENT_DESCRIPTION).should('have.text', UPDATED_LIST_DESCRIPTION); - - // Remove description - editExceptionLisDetails({ - description: { original: UPDATED_LIST_DESCRIPTION, updated: null }, + beforeEach(() => { + login(); + visitWithoutDateRange(EXCEPTIONS_URL); }); - cy.get(EXCEPTIONS_LIST_MANAGEMENT_DESCRIPTION).should('have.text', 'Add a description'); - // Ensure description removal persisted - visitWithoutDateRange(exceptionsListDetailsUrl(getExceptionList1().list_id)); - cy.get(EXCEPTIONS_LIST_MANAGEMENT_DESCRIPTION).should('have.text', 'Add a description'); - }); + it('Should edit list details', () => { + visitWithoutDateRange(exceptionsListDetailsUrl(getExceptionList1().list_id)); + waitForExceptionListDetailToBeLoaded(); + // Check list details are loaded + cy.get(EXCEPTIONS_LIST_MANAGEMENT_NAME).should('have.text', LIST_NAME); + cy.get(EXCEPTIONS_LIST_MANAGEMENT_DESCRIPTION).should('have.text', LIST_DESCRIPTION); + + // Update list details in edit modal + editExceptionLisDetails({ + name: { original: LIST_NAME, updated: UPDATED_LIST_NAME }, + description: { original: LIST_DESCRIPTION, updated: UPDATED_LIST_DESCRIPTION }, + }); + + // Ensure that list details were updated + cy.get(EXCEPTIONS_LIST_MANAGEMENT_NAME).should('have.text', UPDATED_LIST_NAME); + cy.get(EXCEPTIONS_LIST_MANAGEMENT_DESCRIPTION).should('have.text', UPDATED_LIST_DESCRIPTION); + + // Ensure that list details changes persisted + visitWithoutDateRange(exceptionsListDetailsUrl(getExceptionList1().list_id)); + cy.get(EXCEPTIONS_LIST_MANAGEMENT_NAME).should('have.text', UPDATED_LIST_NAME); + cy.get(EXCEPTIONS_LIST_MANAGEMENT_DESCRIPTION).should('have.text', UPDATED_LIST_DESCRIPTION); + + // Remove description + editExceptionLisDetails({ + description: { original: UPDATED_LIST_DESCRIPTION, updated: null }, + }); + cy.get(EXCEPTIONS_LIST_MANAGEMENT_DESCRIPTION).should('have.text', 'Add a description'); + + // Ensure description removal persisted + visitWithoutDateRange(exceptionsListDetailsUrl(getExceptionList1().list_id)); + cy.get(EXCEPTIONS_LIST_MANAGEMENT_DESCRIPTION).should('have.text', 'Add a description'); + }); - it('Should create a new list and link it to two rules', () => { - createSharedExceptionList( - { name: 'Newly created list', description: 'This is my list.' }, - true - ); + it('Should create a new list and link it to two rules', () => { + createSharedExceptionList( + { name: 'Newly created list', description: 'This is my list.' }, + true + ); - // After creation - directed to list detail page - cy.get(EXCEPTIONS_LIST_MANAGEMENT_NAME).should('have.text', EXCEPTION_LIST_NAME); + // After creation - directed to list detail page + cy.get(EXCEPTIONS_LIST_MANAGEMENT_NAME).should('have.text', EXCEPTION_LIST_NAME); - // Open Link rules flyout - cy.get(EXCEPTION_LIST_DETAILS_LINK_RULES_BTN).click(); + // Open Link rules flyout + cy.get(EXCEPTION_LIST_DETAILS_LINK_RULES_BTN).click(); - // Link the first two Rules - linkSharedListToRulesFromListDetails(2); + // Link the first two Rules + linkSharedListToRulesFromListDetails(2); - // Save the 2 linked Rules - saveLinkedRules(); + // Save the 2 linked Rules + saveLinkedRules(); - const linkedRulesNames = ['Rule to link to shared list', 'New Rule Test']; + const linkedRulesNames = ['Rule to link to shared list', 'New Rule Test']; - // Validate the number of linked rules as well as the Rules' names - validateSharedListLinkedRules(2, linkedRulesNames); - }); -}); + // Validate the number of linked rules as well as the Rules' names + validateSharedListLinkedRules(2, linkedRulesNames); + }); + } +); From 14253cd42b30d00c7fd1c98d5bdc793c232ec75a Mon Sep 17 00:00:00 2001 From: Angela Chuang <6295984+angorayc@users.noreply.github.com> Date: Wed, 6 Sep 2023 17:17:09 +0100 Subject: [PATCH 52/97] [SecuritySolution] Update Get Started Page (#165085) ## Summary Relevant issue: https://github.com/elastic/security-team/issues/6489 Implements https://github.com/elastic/security-team/issues/7447 ![localhost_5601_app_security_get_started](https://github.com/elastic/kibana/assets/6295984/d41e23b5-3065-4304-908d-a62730cd97cd) https://github.com/elastic/kibana/assets/6295984/871d4cd9-d24a-42f9-a943-408399940006 https://github.com/elastic/kibana/assets/6295984/be6a3856-6916-4600-b82a-703eb41f4a37 - [x] Update CSS (sizing, spaces, fonts, etc.) - [x] Make subtitle one line at top page (or at least adjust to width of page), add "!" to "Welcome", remove "3 min left" in Intro - [x] Add action buttons (vs hyperlinks) and images - [x] Update text - Update expand/collapse behavior - [x] Parent Section (Intro, Configure, Explore) cannot be collapsed (default open) - [x] Only one sub step open at a time - [x] Hide mark as done when sub step is collapsed - [ ] Animation + step state when the user is pressing "click." [design](https://www.figma.com/file/1eOeaxZobHpw2pq5Rmubc1/Get-Started-Newest-Screens-%5BVersion-0--%3E%5D?type=design&node-id=657%3A115557&mode=design&t=ijf8v2IqWm2lSqeS-1) ### Checklist Delete any items that are not applicable to this PR. - [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] [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: kibanamachine <42973632+kibanamachine@users.noreply.github.com> Co-authored-by: Sergi Massaneda --- .../public/get_started/__mocks__/storage.ts | 1 + .../public/get_started/card_item.test.tsx | 3 - .../public/get_started/card_item.tsx | 27 ++- .../__mocks__/index.tsx} | 0 .../index.test.tsx} | 8 +- .../{card_step.tsx => card_step/index.tsx} | 166 +++++++++--------- .../card_step/step_content.test.tsx | 49 ++++++ .../get_started/card_step/step_content.tsx | 101 +++++++++++ .../public/get_started/get_started.test.tsx | 2 +- .../public/get_started/get_started.tsx | 27 ++- .../images/analyze_data_using_dashboards.png | Bin 0 -> 49520 bytes .../images/connect_to_existing_sources.png | Bin 0 -> 51948 bytes ...elastic_agent_to_protect_your_endpoint.png | Bin 0 -> 66701 bytes .../images/enable_prebuilt_rules.png | Bin 0 -> 57083 bytes .../images/learn_about_elastic_agent.png | Bin 0 -> 47791 bytes .../public/get_started/images/view_alerts.png | Bin 0 -> 52021 bytes .../public/get_started/reducer.tsx | 58 +++--- .../public/get_started/sections.tsx | 51 ++++-- .../step_links/add_elastic_rules_button.tsx | 22 +++ .../step_links/add_integration_button.tsx | 22 +++ .../get_started/step_links/alerts_link.tsx | 36 +--- .../step_links/dashboard_button.tsx | 22 +++ .../step_links/endpoint_management_link.tsx | 46 ----- .../get_started/step_links/explore_link.tsx | 41 ----- .../step_links/fleet_overview_link.tsx | 27 +-- .../step_links/install_agent_button.tsx | 28 +++ .../step_links/integrations_link.tsx | 44 ----- .../get_started/step_links/overview_link.tsx | 44 ----- .../step_links/rules_management_link.tsx | 40 ----- .../public/get_started/storage.test.ts | 102 ++++++++++- .../public/get_started/storage.ts | 30 +++- .../public/get_started/translations.ts | 71 ++------ .../public/get_started/types.ts | 16 +- .../public/get_started/use_setup_cards.tsx | 1 + .../get_started/use_toggle_panel.test.tsx | 31 +++- .../public/get_started/use_toggle_panel.tsx | 14 +- .../__mocks__/index.tsx} | 0 .../welcome_panel/change_plan_link.test.tsx | 45 +++++ .../welcome_panel/change_plan_link.tsx | 65 +++++++ .../index.test.tsx} | 29 ++- .../index.tsx} | 73 +++----- .../welcome_panel/product_tier_badge.test.tsx | 29 +++ .../welcome_panel/product_tier_badge.tsx | 34 ++++ .../welcome_panel/progress_tracker.test.tsx | 32 ++++ .../{ => welcome_panel}/progress_tracker.tsx | 0 .../get_started/welcome_panel/translations.ts | 62 +++++++ .../public/get_started/welcome_panel/types.ts | 15 ++ .../welcome_panel/use_welcome_panel.test.tsx | 34 ++++ .../welcome_panel/use_welcome_panel.tsx | 98 +++++++++++ .../public/navigation/links/types.ts | 2 + .../public/navigation/links/util.ts | 7 +- 51 files changed, 1121 insertions(+), 534 deletions(-) rename x-pack/plugins/security_solution_serverless/public/get_started/{__mocks__/card_step.tsx => card_step/__mocks__/index.tsx} (100%) rename x-pack/plugins/security_solution_serverless/public/get_started/{card_step.test.tsx => card_step/index.test.tsx} (93%) rename x-pack/plugins/security_solution_serverless/public/get_started/{card_step.tsx => card_step/index.tsx} (52%) create mode 100644 x-pack/plugins/security_solution_serverless/public/get_started/card_step/step_content.test.tsx create mode 100644 x-pack/plugins/security_solution_serverless/public/get_started/card_step/step_content.tsx create mode 100644 x-pack/plugins/security_solution_serverless/public/get_started/images/analyze_data_using_dashboards.png create mode 100644 x-pack/plugins/security_solution_serverless/public/get_started/images/connect_to_existing_sources.png create mode 100644 x-pack/plugins/security_solution_serverless/public/get_started/images/deploy_elastic_agent_to_protect_your_endpoint.png create mode 100644 x-pack/plugins/security_solution_serverless/public/get_started/images/enable_prebuilt_rules.png create mode 100644 x-pack/plugins/security_solution_serverless/public/get_started/images/learn_about_elastic_agent.png create mode 100644 x-pack/plugins/security_solution_serverless/public/get_started/images/view_alerts.png create mode 100644 x-pack/plugins/security_solution_serverless/public/get_started/step_links/add_elastic_rules_button.tsx create mode 100644 x-pack/plugins/security_solution_serverless/public/get_started/step_links/add_integration_button.tsx create mode 100644 x-pack/plugins/security_solution_serverless/public/get_started/step_links/dashboard_button.tsx delete mode 100644 x-pack/plugins/security_solution_serverless/public/get_started/step_links/endpoint_management_link.tsx delete mode 100644 x-pack/plugins/security_solution_serverless/public/get_started/step_links/explore_link.tsx create mode 100644 x-pack/plugins/security_solution_serverless/public/get_started/step_links/install_agent_button.tsx delete mode 100644 x-pack/plugins/security_solution_serverless/public/get_started/step_links/integrations_link.tsx delete mode 100644 x-pack/plugins/security_solution_serverless/public/get_started/step_links/overview_link.tsx delete mode 100644 x-pack/plugins/security_solution_serverless/public/get_started/step_links/rules_management_link.tsx rename x-pack/plugins/security_solution_serverless/public/get_started/{__mocks__/welcome_panel.tsx => welcome_panel/__mocks__/index.tsx} (100%) create mode 100644 x-pack/plugins/security_solution_serverless/public/get_started/welcome_panel/change_plan_link.test.tsx create mode 100644 x-pack/plugins/security_solution_serverless/public/get_started/welcome_panel/change_plan_link.tsx rename x-pack/plugins/security_solution_serverless/public/get_started/{welcome_panel.test.tsx => welcome_panel/index.test.tsx} (73%) rename x-pack/plugins/security_solution_serverless/public/get_started/{welcome_panel.tsx => welcome_panel/index.tsx} (51%) create mode 100644 x-pack/plugins/security_solution_serverless/public/get_started/welcome_panel/product_tier_badge.test.tsx create mode 100644 x-pack/plugins/security_solution_serverless/public/get_started/welcome_panel/product_tier_badge.tsx create mode 100644 x-pack/plugins/security_solution_serverless/public/get_started/welcome_panel/progress_tracker.test.tsx rename x-pack/plugins/security_solution_serverless/public/get_started/{ => welcome_panel}/progress_tracker.tsx (100%) create mode 100644 x-pack/plugins/security_solution_serverless/public/get_started/welcome_panel/translations.ts create mode 100644 x-pack/plugins/security_solution_serverless/public/get_started/welcome_panel/types.ts create mode 100644 x-pack/plugins/security_solution_serverless/public/get_started/welcome_panel/use_welcome_panel.test.tsx create mode 100644 x-pack/plugins/security_solution_serverless/public/get_started/welcome_panel/use_welcome_panel.tsx diff --git a/x-pack/plugins/security_solution_serverless/public/get_started/__mocks__/storage.ts b/x-pack/plugins/security_solution_serverless/public/get_started/__mocks__/storage.ts index 7192a1337fde4..48e43b8fb49df 100644 --- a/x-pack/plugins/security_solution_serverless/public/get_started/__mocks__/storage.ts +++ b/x-pack/plugins/security_solution_serverless/public/get_started/__mocks__/storage.ts @@ -10,6 +10,7 @@ export const getStartedStorage = { getFinishedStepsFromStorageByCardId: jest.fn(() => []), getActiveProductsFromStorage: jest.fn(() => []), toggleActiveProductsInStorage: jest.fn(() => []), + resetAllExpandedCardStepsToStorage: jest.fn(), addFinishedStepToStorage: jest.fn(), removeFinishedStepFromStorage: jest.fn(), addExpandedCardStepToStorage: jest.fn(), diff --git a/x-pack/plugins/security_solution_serverless/public/get_started/card_item.test.tsx b/x-pack/plugins/security_solution_serverless/public/get_started/card_item.test.tsx index fdaa493b88e86..bb6844e75b7d1 100644 --- a/x-pack/plugins/security_solution_serverless/public/get_started/card_item.test.tsx +++ b/x-pack/plugins/security_solution_serverless/public/get_started/card_item.test.tsx @@ -52,9 +52,6 @@ describe('CardItemComponent', () => { const step = getByText('1 step left'); expect(step).toBeInTheDocument(); - const time = getByText('• About 30 mins'); - expect(time).toBeInTheDocument(); - const step1 = queryByText('Step 1'); expect(step1).not.toBeInTheDocument(); }); diff --git a/x-pack/plugins/security_solution_serverless/public/get_started/card_item.tsx b/x-pack/plugins/security_solution_serverless/public/get_started/card_item.tsx index 472b24ba6b5e2..23d697cc2748a 100644 --- a/x-pack/plugins/security_solution_serverless/public/get_started/card_item.tsx +++ b/x-pack/plugins/security_solution_serverless/public/get_started/card_item.tsx @@ -70,28 +70,29 @@ const CardItemComponent: React.FC<{ return cardItem && hasActiveSteps ? ( - + - {cardItem.icon && } + {cardItem.icon && ( + + )} 0 && ( {i18n.STEPS_LEFT(stepsLeft)} )} - {timeInMins != null && timeInMins > 0 && ( - - {' • '} - {i18n.STEP_TIME_MIN(timeInMins)} - - )} )} diff --git a/x-pack/plugins/security_solution_serverless/public/get_started/__mocks__/card_step.tsx b/x-pack/plugins/security_solution_serverless/public/get_started/card_step/__mocks__/index.tsx similarity index 100% rename from x-pack/plugins/security_solution_serverless/public/get_started/__mocks__/card_step.tsx rename to x-pack/plugins/security_solution_serverless/public/get_started/card_step/__mocks__/index.tsx diff --git a/x-pack/plugins/security_solution_serverless/public/get_started/card_step.test.tsx b/x-pack/plugins/security_solution_serverless/public/get_started/card_step/index.test.tsx similarity index 93% rename from x-pack/plugins/security_solution_serverless/public/get_started/card_step.test.tsx rename to x-pack/plugins/security_solution_serverless/public/get_started/card_step/index.test.tsx index 43c9b2182656c..a20b2c2c270e3 100644 --- a/x-pack/plugins/security_solution_serverless/public/get_started/card_step.test.tsx +++ b/x-pack/plugins/security_solution_serverless/public/get_started/card_step/index.test.tsx @@ -6,10 +6,10 @@ */ import React from 'react'; import { render, fireEvent } from '@testing-library/react'; -import { CardStep } from './card_step'; -import type { StepId } from './types'; -import { GetSetUpCardId, IntroductionSteps, SectionId } from './types'; -import { ProductLine } from '../../common/product'; +import { CardStep } from '.'; +import type { StepId } from '../types'; +import { GetSetUpCardId, IntroductionSteps, SectionId } from '../types'; +import { ProductLine } from '../../../common/product'; describe('CardStepComponent', () => { const step = { diff --git a/x-pack/plugins/security_solution_serverless/public/get_started/card_step.tsx b/x-pack/plugins/security_solution_serverless/public/get_started/card_step/index.tsx similarity index 52% rename from x-pack/plugins/security_solution_serverless/public/get_started/card_step.tsx rename to x-pack/plugins/security_solution_serverless/public/get_started/card_step/index.tsx index 50f1a0b16133f..c48ea85d80cc8 100644 --- a/x-pack/plugins/security_solution_serverless/public/get_started/card_step.tsx +++ b/x-pack/plugins/security_solution_serverless/public/get_started/card_step/index.tsx @@ -11,22 +11,22 @@ import { EuiFlexItem, EuiIcon, EuiBadge, - EuiSplitPanel, - EuiSpacer, - EuiText, useEuiTheme, EuiButtonEmpty, + useEuiBackgroundColorCSS, } from '@elastic/eui'; import { css } from '@emotion/react'; import React, { useCallback, useMemo } from 'react'; -import type { CardId, OnStepButtonClicked, OnStepClicked, SectionId, StepId } from './types'; -import icon_step from './images/icon_step.svg'; -import icon_cross from './images/icon_cross.svg'; -import { UNDO_MARK_AS_DONE_TITLE, MARK_AS_DONE_TITLE } from './translations'; -import { getStepsByActiveProduct } from './helpers'; -import type { ProductLine } from '../../common/product'; -import { getProductBadges } from './badge'; +import classnames from 'classnames'; +import type { CardId, OnStepButtonClicked, OnStepClicked, SectionId, StepId } from '../types'; +import icon_step from '../images/icon_step.svg'; +import icon_cross from '../images/icon_cross.svg'; +import { UNDO_MARK_AS_DONE_TITLE, MARK_AS_DONE_TITLE } from '../translations'; +import { getStepsByActiveProduct } from '../helpers'; +import type { ProductLine } from '../../../common/product'; +import { getProductBadges } from '../badge'; +import { StepContent } from './step_content'; const CardStepComponent: React.FC<{ activeProducts: Set; @@ -48,8 +48,8 @@ const CardStepComponent: React.FC<{ stepId, }) => { const { euiTheme } = useEuiTheme(); - - const expandStep = expandedSteps.has(stepId); + const backgroundColorStyles = useEuiBackgroundColorCSS(); + const isExpandedStep = expandedSteps.has(stepId); const steps = useMemo( () => getStepsByActiveProduct({ activeProducts, cardId, sectionId }), [activeProducts, cardId, sectionId] @@ -62,15 +62,15 @@ const CardStepComponent: React.FC<{ const toggleStep = useCallback( (e) => { e.preventDefault(); - const newState = !expandStep; + const newState = !isExpandedStep; onStepClicked({ stepId, cardId, sectionId, isExpanded: newState }); }, - [cardId, expandStep, onStepClicked, sectionId, stepId] + [cardId, isExpandedStep, onStepClicked, sectionId, stepId] ); const isDone = finishedStepsByCard.has(stepId); - const hasStepContent = description || splitPanel; + const hasStepContent = description != null || splitPanel != null; const handleStepButtonClicked = useCallback( (e) => { @@ -80,8 +80,29 @@ const CardStepComponent: React.FC<{ [cardId, isDone, onStepButtonClicked, sectionId, stepId] ); + const panelClassNames = classnames({ + 'step-panel-collapsed': !isExpandedStep, + 'step-panel-expanded': isExpandedStep, + }); + return ( - + @@ -101,12 +122,21 @@ const CardStepComponent: React.FC<{ {title} {badges.map((badge) => ( - + {badge.name} ))} @@ -119,76 +149,52 @@ const CardStepComponent: React.FC<{ `} >
- + {isDone ? UNDO_MARK_AS_DONE_TITLE : MARK_AS_DONE_TITLE} + + )} + {/* Use button here to avoid styles added by EUI*/} +
- {expandStep && hasStepContent && ( - <> - - - {description && ( - - - {description?.map((desc, index) => ( -

- {desc} -

- ))} -
-
- )} - {splitPanel && ( - - {splitPanel} - - )} -
- - )} +
); }; diff --git a/x-pack/plugins/security_solution_serverless/public/get_started/card_step/step_content.test.tsx b/x-pack/plugins/security_solution_serverless/public/get_started/card_step/step_content.test.tsx new file mode 100644 index 0000000000000..cb6a18387a538 --- /dev/null +++ b/x-pack/plugins/security_solution_serverless/public/get_started/card_step/step_content.test.tsx @@ -0,0 +1,49 @@ +/* + * 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 React from 'react'; +import { render } from '@testing-library/react'; +import { StepContent } from './step_content'; + +describe('StepContent', () => { + it('renders nothing when hasStepContent is false', () => { + const { container } = render( + + ); + + expect(container.firstChild).toBeNull(); + }); + + it('renders step content when hasStepContent is true and isExpandedStep is true', () => { + const description = ['Description Line 1', 'Description Line 2']; + const splitPanel =
{'Split Panel Content'}
; + const { getByTestId, getByText } = render( + + ); + + const splitPanelElement = getByTestId('split-panel'); + + expect(getByText('Description Line 1')).toBeInTheDocument(); + expect(getByText('Description Line 2')).toBeInTheDocument(); + + expect(splitPanelElement).toBeInTheDocument(); + expect(splitPanelElement).toHaveTextContent('Split Panel Content'); + }); + + it('renders nothing when hasStepContent is true but isExpandedStep is false', () => { + const { container } = render( + + ); + + expect(container.firstChild).toBeNull(); + }); +}); diff --git a/x-pack/plugins/security_solution_serverless/public/get_started/card_step/step_content.tsx b/x-pack/plugins/security_solution_serverless/public/get_started/card_step/step_content.tsx new file mode 100644 index 0000000000000..372d773829259 --- /dev/null +++ b/x-pack/plugins/security_solution_serverless/public/get_started/card_step/step_content.tsx @@ -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; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { EuiFlexGroup, EuiFlexItem, useEuiTheme, useEuiShadow, EuiText } from '@elastic/eui'; +import { css } from '@emotion/react'; +import React from 'react'; + +const LEFT_CONTENT_PANEL_WIDTH = 486; +const RIGHT_CONTENT_PANEL_WIDTH = 510; +const RIGHT_CONTENT_HEIGHT = 270; +const RIGHT_CONTENT_WIDTH = 480; + +const StepContentComponent = ({ + description, + hasStepContent, + isExpandedStep, + splitPanel, + stepId, +}: { + description?: React.ReactNode[]; + hasStepContent: boolean; + isExpandedStep: boolean; + splitPanel?: React.ReactNode; + stepId: string; +}) => { + const { euiTheme } = useEuiTheme(); + const shadow = useEuiShadow('s'); + + return hasStepContent && isExpandedStep ? ( + <> + + {description && ( + + + {description?.map((desc, index) => ( +

+ {desc} +

+ ))} +
+
+ )} + {splitPanel && ( + + {splitPanel && ( +
+ {splitPanel} +
+ )} +
+ )} +
+ + ) : null; +}; +export const StepContent = React.memo(StepContentComponent); diff --git a/x-pack/plugins/security_solution_serverless/public/get_started/get_started.test.tsx b/x-pack/plugins/security_solution_serverless/public/get_started/get_started.test.tsx index 51896789c6b31..5c67562385897 100644 --- a/x-pack/plugins/security_solution_serverless/public/get_started/get_started.test.tsx +++ b/x-pack/plugins/security_solution_serverless/public/get_started/get_started.test.tsx @@ -31,7 +31,7 @@ describe('GetStartedComponent', () => { it('should render page title, subtitle, and description', () => { const { getByText } = render(); - const pageTitle = getByText('Welcome'); + const pageTitle = getByText('Welcome!'); const subtitle = getByText(`Let's get started`); const description = getByText( `Set up your Elastic Security workspace. Use the toggles below to curate a list of tasks that best fits your environment` diff --git a/x-pack/plugins/security_solution_serverless/public/get_started/get_started.tsx b/x-pack/plugins/security_solution_serverless/public/get_started/get_started.tsx index 6468ebd602543..126f9b178236d 100644 --- a/x-pack/plugins/security_solution_serverless/public/get_started/get_started.tsx +++ b/x-pack/plugins/security_solution_serverless/public/get_started/get_started.tsx @@ -5,7 +5,7 @@ * 2.0. */ -import { EuiTitle, useEuiTheme, useEuiShadow } from '@elastic/eui'; +import { EuiTitle, useEuiTheme, useEuiShadow, EuiSpacer } from '@elastic/eui'; import React from 'react'; import { KibanaPageTemplate } from '@kbn/shared-ux-page-kibana-template'; import { css } from '@emotion/react'; @@ -19,7 +19,7 @@ import { import type { SecurityProductTypes } from '../../common/config'; import { ProductSwitch } from './product_switch'; import { useTogglePanel } from './use_toggle_panel'; -import { useKibana } from '../common/services'; +import { ProductLine } from '../../common/product'; const CONTENT_WIDTH = 1150; @@ -30,6 +30,7 @@ export interface GetStartedProps { export const GetStartedComponent: React.FC = ({ productTypes }) => { const { euiTheme } = useEuiTheme(); const shadow = useEuiShadow('s'); + const { onProductSwitchChanged, onCardClicked, @@ -44,7 +45,10 @@ export const GetStartedComponent: React.FC = ({ productTypes }) expandedCardSteps, }, } = useTogglePanel({ productTypes }); - const services = useKibana().services; + const productTier = productTypes.find( + (product) => product.product_line === ProductLine.security + )?.product_tier; + return ( = ({ productTypes }) size="l" css={css` padding-left: ${euiTheme.size.xs}; + padding-bottom: ${euiTheme.size.l}; `} > {GET_STARTED_PAGE_TITLE} @@ -78,12 +83,24 @@ export const GetStartedComponent: React.FC = ({ productTypes }) } description={ <> - {GET_STARTED_PAGE_SUBTITLE} + + {GET_STARTED_PAGE_SUBTITLE} + + {GET_STARTED_PAGE_DESCRIPTION} } > - + 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 literal 0 HcmV?d00001 diff --git a/x-pack/plugins/security_solution_serverless/public/get_started/images/connect_to_existing_sources.png b/x-pack/plugins/security_solution_serverless/public/get_started/images/connect_to_existing_sources.png new file mode 100644 index 0000000000000000000000000000000000000000..e2d03aca29008af50ef69e085f179271a5f214c2 GIT binary patch literal 51948 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 literal 0 HcmV?d00001 diff --git a/x-pack/plugins/security_solution_serverless/public/get_started/images/deploy_elastic_agent_to_protect_your_endpoint.png b/x-pack/plugins/security_solution_serverless/public/get_started/images/deploy_elastic_agent_to_protect_your_endpoint.png new file mode 100644 index 0000000000000000000000000000000000000000..0234284257fa62e87cef37e57a3d6d15eff36141 GIT binary patch literal 66701 zcmZrY1wfNs*Puv9iKu|2qJYvN%}`JfX;8Y6?$}_YNQsn6H;9yUgLKC>n!%VbkY;~pJ(@;dr#hT&$)MDYAW*NS8rd%!^0z2c>Yua5ASk29^R!uVnW=L z;l#=z+=amEiSiRXyz*$$Q`0NBdlvKO8p?QhUTk=HZ-VgfPH>Ojtl;4R`S9@8Oz`l; z6Y=n9oKwH4OX9u=vd~emR941&h$|E0UBSPOcNtg0$Nk~q-^Tk14OhZ@flvQWSp%Qr z?>d+8@Ir0y2>!04hr9lKeZYNww)u6voQeNmh?$rEQ~Ppz=H>sCF9rT=CV2OjHSR*< z{9M-!5AW9fpC5b$jeA=-Xu38pb=-B7mBh`R9C%D$JDFMVcse-$Y=tN3DUK^TSh$
C=!oniy`r1-l z1Jv=;kJOp{1T&;Nd#l*yT`2=_c1h{cExZS{x?xvpHj&7{K zfcyu}Qwuk9R~u({8z)DWpKwjhoPh39cklk}=%3fGak|@B{50GIM3VYi9=Jq*I0K#f_O;>uoq~od&uI&;T)(V`H%OahVIOa5 zOioL`o`EmOHAqa)myWM68OYpCe5%7F9neEa&qZIU*UlxZrxQVS{rctWww>m2dZf>% z4X0nlp?$ZXediV2(X!NfrNtBX%J_Lwd79hZAO23D#XcQJ_w6p4p1d@Wp8GCrP?`5z zZ=xbkeJ6_()Gd;dSx^M!WA8o#?ly3X<&{pW&pZ@K12v4@+ggO!ZC zzFQ6*x29wyW=b69*DGN&$6zFT@8rS3U>+Mi}un zk!2JW!iHS0C_gBgI_E4YI};rQ<_OX_k(%R0cPC1+pk_4JtIOth9S|-JfTQwH>?Jpm zk5!XThyBBmDIPWzPDVX!(YcZ9;t2lg0}?hLLp%Cdt0t$1K8F}E96>%*1Y#ru4sT{U z=(k*4^*01dha57TyrU1E$hASO&H43STGQ_t^`aCOlWD8mohPSrAxlz6)^42y8Kj(L zN}-HAnX|h0Z5(-~oJ!rW-a}Wx_YRuvX3#72^`9APj_BmSJ(~2BnW&lP$?_*HDP?Be z#P1c}5QB)Ea;Xy@>>oS%-2!tv7w;WAHDPbtfA>w8hTa%nmYyyi^aqI?dCU4=U{KPh z#SbI?`DpX~xr8Ic1B7)- zaf@0{P(rhbNmDxE*d09{xOuf@zkbyw&leg6ncRa7FpZGW7`lJt41DbFlH9#)=nM22 zlv>W~Ve$sL4@w<=+4MU!X7(Ly@@W35h2x+Md#;Vw^|+hiZ;0Rh_HOMZc{+@bF7<2B zNj%zHSch88Y{SF-gsl8o(rc-oZrSagd2hI7=+{!WP%->i`C3@=P;EAv#|s^}(X^aS znK-7LTA@?^2iP~n_STnNu3unkFcLGah=z+FJu54xrwI6+^F+6IPJSD1nr>nII#(QI zZyWk-zX}fL5tsIz>|j2|F4|(0;UqJwU-#H9-DUaxJ^z$Nfatx#oGJ>t(Q>5dPOong zExvY9h`l2@!ILChP(I)svHyco>a0j4fpgrWmxL*gv#9y~Z%Dr(uDbRdHt?eQgof9D z+zu6CF_Pb~nc(-J8(?OCrJKo2=_-5e+0nO&G28vx8V*j@--m%4nE8v=bT{Bk9>A@u z?P3SQej19X>`C<-J6}0KI@K zjGoPvKN{duP5KawRQYYhY5UKwP^(G`^GMA)ddR`SphVXo5mYt&-P6Yezr6)6NjG8O z+NfFwfhpio=U6%mBf^TTC(?>I{L}y9v+$*ATTFS(;VBn?&uzEmb$j2Pyq@tzVyBwI zqV3hKOM4KdQUGpXGJ?EElp>-(V6r#@qdH zu}8aG#5v56=^cFWG< z5&`;j#?cCVv5zVd;60DbOO!fnYEP6kc3@Oo&4cqdfB!<%Vrz6J!7LoQvhKfs3mo41Jn`M^-QO%{L^QEd|KY}|#ue+IK zRa6OvWot6+5G#$8aGI>{>ht=f>7GIgmG>n)5|8S{Dlz_2<4;4+C&d~KBaw)?6)Nqd zyo(dach}XDimx|*6Y&6kHs_t0&}4SNKEl$~^(&f#LO1lt&iGsd#rQ+L*1v5Av&601 z)Dj^0o%_2>nf;7EX4=>79qQ=hVt;mOZ0w`Vg9rB&>OV2KwHVTPpj&O%W)9Oml8<1< zeAUe7?O}QH{gywp50h6~^)X*|vo_e&jCqqrpkhl9<6}J!-SOY`zBTc>=!J`_0FC5E zUw6rnp$kC_2u`cQ**@sE({XcAo0V_v!1%CEY6%#Pa$qCfem@q5d z*zXc zJ2C$4?^+QkY(3O4JCR;x+0@vckMut_j~3ze+2cQUEKc-4uJ1{j zka9eH@5)IMt9V~fOg(~Mx#8v4A{15k`AkQ3MOclp@RSNuO;2L*rqB*2+gBnONza(p z4fMS?zI|B7`eBUf#=Xj!ozN-j(u)D6)0{sHs@)yuZ_|{g#znG7J5ls-%Sa;QMpt(} zvd7Ovw5lnD25{m>sQ7h)nhpBpK|+l6=elbc4&H8bGF5lMkTZopsKs!}YSS|}$#=pH zy0@9(#CDE0ieb_XWR0M@2^T5bf82*Q+AqxjM*CcaWbSJ0o~Yy2vU^q1M%=hL-p9A%c7k6s?X=&5 zbJY$Hh9cg0zds?xU(&hg_^_dnJS>Ar0j3%~X0JQ#a~9TOwRB)y^I4WbYDE<`9^PV_ z4&IJjsvQK3N_iZu4tk}Fx#t51`EMU%Xqtvh!giiCFkn&Z^GWCP^eFo(Mz-^#$WlRx z^%)C-Ucb$FeHc!Ml0te9Fm8_B9?`&W%atI<@+cmr~bc;$=lEY?f+EN#s-;rjcOyENYDaBf$(Z1_pgn7T;3H8ja-NfLKz{o8Ky!=^fv-y_} zNy{R-t={~WYDjwHa864r=q+H}(C4jW0#@s;D#j6lq3>k}Qy zGM_(}jS6e&i<@?2{2_flKOvUlY%o`Lo+||=Up(Flk@l->W13T)N_^ zFrKq=mj0op7-9zR(-T$6+-ZzN)Gwr@_m5`MCQex<=3n->Fx(6eu2WNvId-ic*^O{^ zH)%l_8TbX=NS&=z5q-^5w~c}|_#MdZW|sQ*oeoTULmwSpa8jrF2J$!f4?fNF?>F!q zS3wi-dOW4%f-70%?&~;kDV(Ppeq-QCIR9+e9g#E_XK7ka<~73;9l~|VGK|U(CO(mm zek9pBz~V2U<2YT&xEl6{n?)A?7$)9c?Il&LWe3ta%KRxi-WJBLZJWu8E&4WlM{%K&e4@ho^E^R^X+Fk z@4r7VsiB4BW)ZPZMpaSqkwzda$1W%v5@@{xoyxu6q0AvG_e6pu?ybD^$k+PAJr%ta zO2M=OG1cV*9U5XMlz?LxluM@B!8%t-JqmNfvB|B#aQkcj)dFC!@~2qRVC%m0+tZb- z5%>EtD!f6In5GOQ=c#sdl8~`Z9n9dg$(K>Wb$(8E$)njLrhaYD?YlkS!IkBX@IgSg zPd4n1j3OHZUtx*N{N8<~X5{ct&NivIldPL(TA#ThUCIR?AUy9GU zUR&7oJRo$MWL{@l-cyq@2KQr@aJkkmLG$)=x<$Z8h{g)B!e2h$o z&bL!!1JkuzK&4Ht8_Lx_is96azCQviSDVd+W2qzXdr3At>0aIWch6;nm$ZGiE2YFL zMGOwB)Ax1^>48|Mi*~n3_Qm64vfh{2Jd2KW)B&vdwfo^FIFhZ+5v{^4PED`@zkB~ z1G)WwtQfu%r=D+BLi@a#Z9(gkHc?W3wdnJ#%S6y=k4+KLRRp7}#UTylL!5l$Ruvp> zIA0f*&Pcs9Hh-3+>HJ~4?tZG!bg67jFQsBOI;M*?xT->@Na+=}LO!wE*de0_JBIT8 zSl^k>;=3Qv2EB|ReULFt zu75N6uNgD&?uUE9?k)uefoCs(;)Y<&&D-8@5k`{w|8vDAd?`S$`1XAThOT{?Y3Qbi zuSbwbJIgrH|5!$|1avad8VHHe-g_7CNznk*vd zkNXl;{_5)^?#P)U8r}Kpzb(D+skR8pguJ{2l)sL9y}u44Mi2ZCFk=Lt*UY52pKXY> z)8?y0&Wt7K2U7n5>D_!EM|wnd*o!;d+~Yuu?X6^koHo&<&R1o(;WkoYf4E=usoN%Ys;of1 zsO?V=!`|l7=5dOuw2zm5Rh>?X(YyXoMe#>oiYSWPf9R#X-=!F&<)=x2yr;Lu`}bX+ z*r6-%i8SSH?LS1U+-aa~^CHcsg4m9i8HxI@O50T$&xwaB?nZ_BulDY|14_g=r>RNsYwhq$BpY~tjd%+Pu<6U zs+k2EgO1lrHV-djbAn%KN({1@$|3Vo4BGbM_lU>sW;YbnnFwPywq?jVN(R}D^ z+?+ZO0WhrX6N4En2`EH5wdsS^o!i;d{(*-8C*X4~C8yT|l@lZ;?Q#bF6v2Pvf#sAXUqPRC{ zRKmHhEuo*2lG5LMgMu)EiSQ|R`Qv*o(XMMcEy?dmov@CB6wcPnf_;gvjGT^E1B&Nc zgNn*zX5|kNc`r+^b>>NAN^FYNSuo6gcv@^EQi}q!aB1lM8(n3VnmjpG73E~t>++=G ziu>t|bJIN=d^+&P858VWyjNApR@+3U(26B+f-kd-)9BU6_QIy14z8Ru;ry5H?C>fRwkTvaU#CI z*hf!`G$VAwR1Y~LbWQ&qbX;K%sF-Gztae~49?OfVv;HbINPJkSS#ke&)xpgJfp^Pb zH#+qwpX=(Y{)j|K8!}jBQ z@^y^&<9;^^kC}SQsYhl1^*6IaV)^RM&R{RsA*i<33~S?XI_r08 z@&~_n-ik+JznGV^M~}8mR~apUnH@09<$O`gNKSt7v%e{~API7v#ouQ|zK54Q4T@y^ ziHoejVwORMIyypKX8daisu}A+strm#U8>)Va=llF<$R}j8Hx&F}T zF)PcOqz1~kH5@Cv=YemP>OR_#F2il3em0h66@F%u$Jy;0k> z==vZzMbOfh=MneATfYq&p9&Z89@q-p6hYLe1b5s~DsuIQU}7;%rJdw4*O_r{r{PUzF+3hJ@$UTN?ctP*2pi#9AAwSh|>v5 za8O&(mRHAs%c)&o=NECOlEuoy}i&tM^PW zGomjXbPB2Z{#SCS?%GkSytKEafhvXeT3lD1^$RK9NTvk*!i@hQx1sH^0}wY5m*BS!(Yv0fQi6&$dJ{ z7_rm)@UKt)hd8pSRoi{0_Li}$7EZdA@X7jYkbdoZyzTGv9Bw`{Ss<`I=v?`B*77n< zm0GY^s-3mv?%E##i+8P$Nlc=hH42^vyNV^JRS!}#S=$Nl{15ZR%C5%W2eq%7wvS$- zp@ai%_j-BXiT@F}xy$$bl8vc&iK$kd!TYsp+akKTCnNEHW`hDgQgg&Z*dim6qOaQ2 zYbcXCd3Mk%-+0ERJSw;D9kxuS-xqbKT3o9=%u~!MZ$n5A-N=m!>D$wD=%8>Zi%{?f5Z02PI}@mw5;3_LT80;KF29txjYx2Rz8n+`n~BD07YkBo9hoFcM4if@oKC z;HC$0tb2z9u6{%Qd-A0o8FsNp-|*zLLd2(@Ff19ec?Oc7Vkb5>1Fh(Yk@wc02$QW7 zA+Ms_g%;Z@99K_ir}jfFj%y0&Yx)Fg`otqb{V%J92w`O6SJjwT`Iy%hAs?+CCu2T> z*{4CEeAN_F07|t#)1f9zpjVv|n8koro9Sb6c*4eP9saF|67!kMo*6tADA8YlR0*|+ z4d9X0p_wAV-k3p;Wpgd6sbH(Z1p3PXu~xbqJzi60OajEmJ0OQe-NUI+wZYmA6pmFv zt`V}jU(}-j!2xG-hP99D9R*Aov5y;u28rU;L-xnWk+112bZ7+Rk^mRy;vx2ZSJ!2X zUiT$V1bpM7+*c>8-vY>-$(^0Lktuvi^ve1m*VXwl`X$4cw^A}w6uHNyOOK`A!0Btm ztS@>xY=>*YeSJrsi)?!M%nmUvY}=l*GCezwrkS$q*Qa`ph{}Q<27@<098vmK`mUW! z`YVLW$~KgBJ@$@B@wGc3J$ov(?_>O-hk0VjQ)hs`tK6vv#Q@{ij1q1lNBOUCZIX6J zYTFw(r!%kT7G*D#FsF%hlGzI~OK|tZLsP`_&6#c3V-GF-3|5%SE6B%|_me2Gw9&?d}r5rGFFS&hb$hCBS zQ*aN4ZujGmO)23!3~>paCn?ODSO{|ev`xkcUD`L3mZA5vKc5PTlBorh!?Z$RAd?m` zKi~7dI&jk|kaSbNe{1G4lFj(Le0nM10@je=uuaWV?aQ0P4Jcwh03iX&RGB{S$^pq!zCBUIAJlxelm@SOW9 zdh%9(yU-3X7b!NLm(s$vI@yj!z+O5-E*)QBLs8`*kOQ1qN^CC@EAMT(GDfk`%FZCN zr*(bA)gGU*yR1P+c@bs!{bh+HsH6L zzV`@%vI+OHrp(fBF-`GWzr6U7k}jlXk|rv{fu9o5Xt+{F4lger5*{Hd%40&3Ksu^$ zvRC;Oz7UMQECIi`2dD|Suye+2 zw05OxQ7C{hcSvgnaH0?@R?|S6$=n}`VTFlz5`Um<=B@KGUS{;EA<|t7S@oe?JEh$_ zrbH|xJrcV!{u+(IRxCB)}3eI`>{mQv~*TbRFpkQ$>M=rlT8Qrx;0h>CJL-OamX6>v#1*8K8V@83=Td} zyR}phF0djPmsUD6ky;Ro^3gSl-!JPD7kEa89GD1Q zEF0!|9CGjgH6UzZ9SH7Rp}sU)6}ICX@xhdF)RgRu@3HWh)kS^>fMw9#`tn4aIf-;n zmhui6_8C3L{A7C#f~iNIo7XDO7S5{@?;yaPm&`#(D-5maDK+_Skt7@TEX@MO$LXIux#%l zX?sS~i|CSQy)^QNcP%p|cQ7Md=Fk9j>Czt8{#r;S5Be*$sjdV#K6u-9L6$C8qN@xh zUPHaqvDaTwRi+Vv9*s4nkI?OqG>@%S47C6oF465;ex@*om$EtLbqI80)`Ngbf+3QL zv%A+S`j8}x1u+RW33*0>2O7{&aR}sXxW$!@lY!M-U+LUj@-;pRq@{Qf>1felk%-R6 zr0D%)cJ>PN4cRClI4y2%XTOoKYE%rqoB^ftj?X?jt>lg9036$ep+lr6;bLW*2k0l} zmc;v*bGaRw%^|keR5~}O*4OdO50OQDxIgHnIhh`j==~} z>}OpDkKG9}o;7@OaLe^^a*a$<8JR;6xQdE!>M>Eh7hG6c@BJbzVW!QNhTGQdD)~pF_4&I-( z9~MUD0nBEQS%5`a&2-G2Xd1M-3VW!)J0#*uv08@BS_nv2PJhfw%nTmvRYljY$uss$ zJT{9wcKexJ;kcbu%pv{HQT2i7LVe#-EU1URamh>vYbVCBM!NP6-9qciBdgkc&S!GS zSIVQv=t66D53EIENk-S1&HF<^Y6+BCJ{*c-vE>XFn3EUhSqweIjIpd$qrjU7saLUsrbjgfREesZle_lr#5=*^%FRNRl4l7O5yQkI zC#RGLyV3sJXVauV3MmuY+1dqytcv4w_W$&u%uPTP&bFR-*tD_R8>-QpXFDrwy?I+g;;>UGh6X zVk%?&$`V640Bm>SNfn70ygWi6!iE%_OQo6Mx=v(aodE7FkNjZ8(Iey#;xMFQM0h;J zv}h9Oi_@+t`3M2RwTcK#Wh%ILd6XmDx0^#Y6L8W|RjPYFP*XrNb#*j<5TcQ%iBgNc zc5o*n7X}h;tntrdLc~0>uqHZgEOusy&6es7-R~7#u-I8NW!?cHR9DKRG5wQ-`*)c8 z?+iYc0H>9u+N=Z#7f{Dnaz)58)<9f7N7+mT@a(Hc3z@HtTI%!&^z-F%FC@t+P5acJ zm9szUGSjQglN%ghgVCAZehQ@scF`FOnJnNNtg1G{RDs^tP-*hm2U1-&(69$ zZK!M6GqFz7bQ`;_DI0h>Zo=4oURgY31W=~y#)$)N>?q!r!$u0^VLjZgPkbs{iPoDA z=Ptds|3D-{kegr}xaIf#UWUIX8 zHA&ykm!)$kOJ4*}tCeaRTC>JxDNmWCa8Q;??^9`pSX2ch-YGJt`%%VVv(#~*9wLeE z5T7!m+s&dtW+^rEjF~b5X=^#H80XbOEbOVl1igHGX%i5LI-t=XH|bS!<1pr5>ky9* z#Z&^Sy4*d_vceyOGj_rK9$)i{aQGA?M6hY9ym~0i#vw~<^ z-rll^vtA_GuF^6v(JG~P{ux$j8JX#0ogf~YL*~Fjae1dGn_?ccSY*!7Ul!qTHyV$Q zFqba7(e{E*mCfblJ5rk*y$Z+|B*DXl`9==3?o4uziSB5GzC|+Qk~E;micI;7>||`t ztA5aXWFHj+kfTGC%j!1&K1XQcVyw9?Eo6LO0Iw|qd!=+>0$Sa+p2?PlxrS~hle;_Cs_{DO0cR=ml4&^pqJ4(IF>M9cuGiVcsmO^b z)?8xDno>7}n4(`LLAQ)rt|=k!UkzL$kau(N|QH z>M+8yiN8|G!v#U+C~+{yFGBj>9xCfFPsybagX?{m1lA=+$c_PJlFXs5&jq7FJM)%? z)|V|zGt_9}gKgkzaN7ONEK;2t>c z1cUM?RHA^5JY(k26UT4I-}snwO-aFxqHhQV9 z5Xl9Z7?smu?q`8XS|E%P^T^gd3@q=8oBB5MK(mdjLS2`VC@f@Co|oQN(v=rAtWeG1 zcxmp|=?El_vq^N(nc$gL6*Hp6IXFp{-a#F%D`in9(?8UBl|se2C@~dWv9jMZ!A4QX zLu`<1qbdLjiyfQ(ipCfRIO_m92w13~nc*VBcwqIYB8zb?i|kvkU>T273{Dyu;zMoV zf&)l%F*D>98ksZ49n6BvaoLRi#<|Mz5TVe{v5H02j7mDtK9CDI< z@qKIa;;a;vQsBC*$XRu-T0B2Sz*6i7$ino@cC@O)^L|sK0YLRkWwFTEPRTo>AY(Aw zC#NEA4T-SMi%Eb$7Ir^ScD&gC0D}Y_^C>rA`gLmKJ&Qpc8PO9XOSTq>ZrjB>6UuoL z;x#B`e{O+T3#En#-KaW4U7eOGAq=090xxgEpk|Av7<%IND3kfx@-ByQfql*iNO)=$ z$8mvU$%T$G4XM|=0;T|^QO5=WI4~097POtRr}3af6^f9hlQs3DGGTyMD<0~X7}A^S zP8ubKC;^z)irJ-z8v@Jv_$fw&kvfWv@#jGmrnfP{$9#+j7LOLwUdu>Kj}(p@D>&wy z_%OpCW=t3>r#s+Al!tP)v*AU704<-2$KjOi8!Yy&l7Uq)VfgjZ9O*3kL^*HVSVDbu zmBH*uLn^iIMyTaV<37Im6fl%4>#_rz0Dx)0ou)kyGt?}%${vVgfoZOa@n@cjF`}=^b+ep`rK+n7pqOFdhKrGy1` z-~Bu4H!s72i!#zEsu!yruxr;a#6RK*RFnQYplb4xpdDed*Tx$l*WP?vvn{{xEoZG_ z9_B8Wgg;c{zv*w;dnO{pc?t&6?+?aSUfb}0VwHS)Wc%VTOiWHmOoS)JI<|ZSTi`H) zj=5^yvGF_9W8O|l*sz|A0J;A}70u-{HTZ3YJ44ZndS()(Qtjp*SH?~M!ZSdf+IgT1 z{d9@M3c%0s!_p8A>5eV;_#{8=QT?C9rGCugt}*485?-!%qhe$Xqqg9Uq(Zj8nlq7@ zbkpFg@aDcTv>$bp5p{c~KA#)@Q5BP6So$M;|DOmbpUaSeZ|JTe_@h!jkw7W{k@$eBwA5g#MyWHi<2nzx@8CkWz>7r!$Y3a zWBc?!`5qRQ54W33gz6oWDF8V-GV~f^c{W$tL@n?xxb??aca0fn51uS zp@}{Up(s0@g}Dn_bNxbgUM|x>VJ%lr&{82<^>(dY-ubU=bVShOrSCOW(*}1V%|uAo z*OL09U|&VzwtW7ZaSNEE=1AaVQ+PN$qET=3knN*NB-8n$f2b&*nReOkki?t;E-y!> zjp%7^#ZcEMKreM%JOd0z-Mgmw_kMtYte<&j?1bltl5*Gfm$VyjrnxNROOH7I5`VsQ zg4s38=%+gh%f|v?{1&8H(_8E9E8V7gehNZ6&T%*YO9N$=sI!^bq*Xf2hbwujrn}nS z|L{}Ae(Aee2+e$%6QiL%dz1(}iH!*7`gN~=(%ZBT11ju_7iR2MKPFoSg}yhA{ADB} z*aM(RU1L1wRv?7Q${pm@-g@SYl#+@AV&2QSm;Tmp+N%MpUQ)_GR`U&bo^_ewvfZIF zhLOKG5Fv&G0E-vKGQ=xL_}2pMlk)Z197Y{W%i`YH{?N9l?&oCxPjsKp`O>2Xp>JmW z)%o$cG1L<7wmq$3g};(m0m?FXqpe#$DcB&vj9Sc*LE6ncvhyEisIq^yzqM|WbjHM} zYizeX*ZxYR$^9>GDB!6S`63DoMfg)K63DNdyWZmCT(3NsmXdpr|K)?(-GkXn- z^$1{PzpNk<9^s{QpYy*!((vNtXx?{?anWj~@btI_h5C_FbNd z(RDezp!rwI3%5x%oI2I+{kik#e)Xlj2#4#7p3g5EqQ=gNr(s3|jTOJd828`z9_~2G z_TKB{$+%%2Ya4gwx&GK+_^`2E6R(GpQdGd6j7ki=xUGx6iS=z)R?qpbdOSBVYad%5 zS-~hg5cfGM!(sAt?>`fO5=m;I>yDw)>$20Hn9`}y&3&fO_i$vw_Y!e6GfJL0k1tqB-eLyMgo3#oMtOX@`*rgd0vs9R?Vp1gHt^>9O5RsRy{Lae|hi6DV zarXmVtEvU&Brm1;lx!l`fmY*t@n#=7O`%%lsD0bF8*CRs_g`&`r@q2#Dm1k2hN*KhX~l2h1GQx(Nq^4*8)tbTUkF0S>Y8Rc~F{cr-YDvo@d|mr<2Pv@9VL-g|jE{pJC#r$$TcsDExTHbLvWz`c zx(R4g+;1!L>(4;c;y=O1B| zeC&X&00()ui1^2~i=SnvCT$6Bv&)+|xe0eD62gjBLdBTfxgGzbqxj?`ShO+tm&t-X%S^v9(kJu!;XzBg#%H=Y7!dp@*@%R}ZEtuf zHir3o;kQxF1kR-aiOniwj!jp^#O0+Lgf7z1Qad3@f5oJ4pV!YNLx0T&$}ca*xUOJ% z6l{3?EGFZ$Gq%EFm?M;8YRUp*XPNlrMmTQo#!ynVa^086GcxA}VZqwTXUa4P3_V2! zMo3=$U=Z=?b(QadZnU$$T$vRuFBcM1Wk9p9qtWDqqFisDnTKhnp9a0cV46;*N)yqg zhe#!rY43_rw8i%o`kLBI-_sNleJjMd$CNSIabfB4SBXvh`5-PHdC_x_Vuh?!gxlr= zO5x=UkAVsvW6J~&!PbEnK4mvfwXm#DX|3n440<1YjgJle_TrZw;`U+KThn za~G?;s+O;l;2D44x<+hru|b0wSzHWtntsi=9s~0~UzF!Tj$*kRP)8y3X9;a(H`mX) zniob@z4JMn4`;mTy<;96p4mI?>RL?&T6`0oiq*z#uPjr!)TUIT>LrpG)1jOJ}L6UR2w_!1POX~#Th$O@Lin~t#J#QV`$zWcLEJC#gz}zVBbqz z;kta@G0_4>WEn`_D~vH}W}sNoKi_jGaXJ=Xm&O zCD+1p93$;imPuxoN*z!hqT*q_To6A`YP?rr;d4Iws8nds|GYBofoS_IE#XuvPzQF$ zJga2nm!X~}d1(*46PE3&@%~{bwG^P>FS7I#I48TW5UA?O-!lGmjn(Af!1w}Vo3Nxm zLjqVz%qBM?7QKc>U$~?p{Fe=RD0@UNf{DS6?k4fFUqq;AMe%E)bdKD)fq?~vC)E*# z^7e!qd@~02`?HeRo(I*>#kbX)+o(tro@H35z7L`9cFsxLh7pOr1G6Vy$YnKZzG1zc zuB6Nui!wQ6EfsFn4GN6HqxZ%rIjteG+-G#Bo_;j-m z$qM%pUBt9AFZtcegi6?ZFGM0Nrp%>wjs@TkeobyV%=qh6JldbUfX(SDTDHklM$9TU zPPZb>m9`#$`o8=7?PaG1z84T}Z7CD{hQ+OUMQak9g6A0q2ttXB zeGixPQ>h~Wt-3R3C?=;v9`lQx%TQ^*b?V5D3MTIXb0KO5BaWPBCana?*uXhbZ!5S& zeSJv1qxi0epnBf?;D>>}Xi-Q^@-Vq*jC1?aK&5n5lO0?P?7TNiw!{b)TB4pmPFQc(|m~hH0 z<6>q5Xi044I&2J`sv#Y65-)0i%G*m=Q_nFTxI3(8gaGVAD|@Sgn?FKO#^3@+Hn8)}aYt zMxHg0Ss{A3T;gvHG6P0=Tr67w#ss2WWX`D_$=81VO2n_<0?2{sP(+^f6Mx7KR0jWC z>9O9MZJaWZn_vsPIofQ_@rJl@f$QKlC`o9cQtSs+)aRU4XSRa}s(y`yDU}zXx#JeH zR9_2#&pLx;^r~}vpAW{)=t+4z?EvTHh4a~VZD9sQ(NBeGSDv9}WBqXFGx$YK>tkm8 zytOW0Vz3gOBco|r-6v<hwvDRrnXR{E-+ zBm9qLbf!NoWk;7SC(QLopBEhWoMo86yXLZVc0mWU6xBHIx0R6PjZ_Of1?cVHq>WBR zf~0oG;k&_&H(TwUWlPiAiTkIx!!1Q-XI*vq;^o~AZtZ88gJ;0eS?|N=Zn)J57ZC$h zrW;O8WEc#9J#jE*64_~x%^o?$Ng5~z#^_?Un?(Qm+Cl`HSo4-#kizirVHHG+IO_+MZ zKq%f|N;euy&S-@@PG<3wF!oB94DMps{HDoDGmc<~aNd-I&5sgM9St22%MZKnWuc*! z>DC9UZP%yE=yjGzL!$*-Od0*28rbPxGc+g!FyJoba*tJc?jvrkXsutKbj+a({ogtQ3Q*xqxWo$W8z7+ca@by*ea zZ@la$ha-AA6ya3xQVzFuDW5>kGO(d~{mhuU%ixAXnuUJ+R4svK7yUhVJvg$&doCS0 zG`Dd5_1bJtD`>!U<#Y*{iQ8}@+;L><-To-eM6_CG%BMLkt~-0Jq#QWO&Jc1sVk25@ zieN-!1!Yl;%+Z!lh)8#&BxwKI2x&4;%@NC4ee#-LPh6uQuj_L90m4j@If7Uj(2bH}WfJf4<(FIxPOl;7bplbAg+vzpqEhZ7NKVFIjvic%cHRt59i2VyRB^sgmX;&XP)J zfw`jg;~>rFhN8XPc}hs1hBsEH0?rD;j2aB$SFnX7a~f7mbW2Izj3WJNtAZqcrSfj}H40hsPzMcxtmH0_;@D z+0Mjzb2U*zQ!DCh1GXe_uwYHlD>=WaY6JPvfNJV`xn5x_+CQhHsBd}`x1`?-evG7> zv!HHlW-$=Q+^(f$2;n8m@MI0L6Ck4TZTqxb!_JKK&t4(!An6X!p41GNtzL1z+s(C( z07dg!dhJF(_@PstkjSo{O%~16-q+{MCcV{0scGLOYA_WsnlKmCLG?^pTx`@iadqqb zY>~OvJJo+yYrb`uk`Z0zvKM(UE9q2w!DP-Xcs|{Xb2sf6Ja01Hy0vzge88p8Y&u@Z z{rB;`s_XB*j*Ejh5gf{P_hH1fKh#wS;3|0D;VvsTnPLd?Xa<}Cv-egsRSt+cO>z&* z;SbK&TaJ>bC9P;neMDj6lgAcgKAqGI){V0U8Lm51hbxOn4V+w=T)6}fUnDEtwOCyx zv`r$lS6pF~6;PC*oXo9U90{0u{>go3NK`d^z=J@#yGeW_-@w}0%0qF>-+G%2z19lkKn^sUp=9e>5u zv60m-Pf<3}igoWv;qFLXSJ9y(D!jo97!j1PHbr3&0)%wP^(J!7x!dK|(~FJ&3_7$< zk=(etU-vRv8TdJwDQ076J_a78cKdEwDxRg|cK$sd1nK4Yr`e|p2jEuI)}7U5sY6|d z!?d|@s&wvCJ}gHLU+WxTTD-@UST&OZ5{H|mR|N5wuV6K^)8y?L&Fkvs3Ui(3*FDnxH9^)MkJP{AxdTA}1KIVS!60( zdIz&VQ1Vr29@qKN$p2&NDuANyn=l~4(cLMnbax2St@Fr(%oIsAkq!e zDa}#e3F!OHFgJs8_y5K2v%Am6ZI8)cx)4Nu5S`nibX+ORUI1!vgR$TSqc^WZ-A@z2 zSKa~OLitMFOaX5?rANAFiy6d|7G|>7H#Rrm;A~$9X@PJb7bh~xRP}*>Wk~@kL~gCS z5UMrBmyJ8Q_L)0Fxc18QpV9puT-lcTOLoS5qOg2vIOtEKkvnDE`q-$mc^6||1+k~z zPYwfy@Q8(7`TG+TM#8lekm2C?@zg4|{r$eC<8jL67KN2KLcHAOdc!&^dzkSopbWH$ zRf}|k0mZg!UYcqh_nDgbLZ??u>#0RK4$E~3QhK^!B*@#O&cuivQf;AM|4|0=;7PG% z{6;iaM(7Az*S1NShA7=W4V}KA9Y|=YDhhb;_+udo_ozc3;x6!_#$f0X{O` zQ@}oh|gkW z!u!XbrZNPCE<4U|)G^y{G^MlOL@Le(#H))vHu&IULo<>kEluM9lZvR>&Lhv3=jIS7i>K80oD3;j@*^GZkr{0vZ0;Jp7T8-#}{G& zXkyQ^_a36B#pi9z0zwG-Ha5v#jthMUP{r*RB8-phPgs(OW=Mo`znWqqr| zyk;6bXU@Q$`Il!z2en|e6^u#eVkT~zSC-YikEfh>>0)~%O3Pj%7+rgm-{T!H8ssE7 zG-)u=Uoe%&L!*82F?=2nq#QJ_+P#5Cx7H^OD?4}W znPdsvBVW~%EVA5UV8X3M7|z;GD}mv+bieDM(1pjnv*5i_Mp3BtNCiTag2fd^{2hn% z+fRrN<=34|lCDRC6OW8&n>toTp(Q*>IF)J6Gmd597cgR)Io&3XJa)F@yIL40iqqe= zi=NMrzS8&1*rD4-))b2x>LI@Xk!vdN(;vB_AX#7bdZ1D9=76+5xO!0qmDpsCpQmL= zZ`|gPWnsf4{O#k;A+P?l=)KDCHQDmMVDC)qd`Y7eaQ$WRm~_x{ZQY$XC>s8{il@y}_i-l*gVEPY|qV**<4e@^)5u;S9WbdG!n{Cdm@Q5fo2cV%e z6Fwn;B#iebhmC`VMD6sRB9^y|O!hQEh-&d9-7CbVo4mDBk(8)s8h-^P8shCMCP`N| z3*b!@#;VI^_a3u-8^0w70t-xpZWnYD8d2ki-sUc%#TZ(z{WLTk#8MFK-%F4QVnc1@ z>n7GwXPeLzbon}}l%(rGiPh~l!zF0G*P3ZLxi9|Ov*8^P92rj=BfQRxKxqp<^ek^T z-S0)_3t0ZC1V7bh7lUsy&1#0^W;g`b57yrOYnBr6LC`aI?0!GgWyH#LUf609a6Ocef*s&b@-2G#kr){Ne z1z#W6V-&JyEYjy>A3P56uQ%cO^QW9*(rhP9H?QD~Z6>FMgs1P|Zv%7fFWL+Kb*Sl) z!gphYL`@#S$^o8Q^^>%)ki(qizSS&wb5>tJ zvlVf5t4SzGKFrqGjvzNv42`&tpr`6Os-Hqey=M9xURKJp;e-T%Y;&-qbcnZo>l>pO zucuCYwJq?A_T&(HBMiOiz%Ky5#NW&egu$d!#Fk%0_0Xu=Y?13eh70m~{&O*iyv)+s zK%{&v3%m^>!~gJmBCjbF%Y@ zvC0S>+gio=H%tauOw_Jfae3Mj`oz)~LXy1k_YK568`{cMhyu}4bhtNny?_2@@6dQ{ z2&LL}w}q8#5S>tOJ?<>6$|XA=rSz}CRSzH5V#4D60O>s|Z*FHrQ2PgKDwDYF8mSh5|gSSMY zGxonzgd{QE(&b3T$Uz`?kgP?%jXTRR#e1&+Qdymva_LOhi2JyuN@icIbn9C)(gzaN|tb@=?cFb?muM z)9)xV-4J`V&wcd&nG{@*+x2Bm86$7U3zXa^NX>W#eOVT+q5qvcJ$^l1ov2Z)f^ND0 zw*;su>-Znu`BSlQauUcZSi8s*3t0^=D|Qq7GBeV8Qr93U-;vKIVFWth2F3-Tf_-HW zs$*yv+rM{EZSdlDwtRe9k%!dd=9_|1y{yAp34?i%|1wRayFXvF~NG;ZZ)EKOO=X4)kRO&|>?S z0TAfl9J#xsylEP(jYz??+{XA{atD&m9hB=e$4nHRxa%uXix#a`CG%$fnFR<-XiL}j znEL2ZR-Wv$R^My8hx*Nhf<+YO!>ffFq;SqrV8p)9QRwd+(G(i%3(A?+){RjNhT*qQ z30{cdq5(B%r{SnzR&r<*D0X!>#7UsVw9Gyk6iXOKKi2`N%NPQ*L4fK$2URo%Jq$`b59TZMupRIm%m zUcWJeICU*6_t>^IToKmT$@_C5FpqB1AD6)hrh1z63y!4n0@GN7TCg!nVoTEFIpTZ3 z3`5sMFq*itVj-vFm2M2{YxTceCEtGYe;Gkcm`ege_6{tpb68n++bRxss`%I8Pg!$% zXr@r-$|h&@@FpUq4P1|rI%T#JLzUJiVT7nc8>xPnv3`5P8f5a@WWiYSdcOtnqa=w@ zjHYbJFZAdx6H>etO`Phv6ck)$pxb(6_hgNaEQ>&+@&XFdo>|c)uERmsS8em!N9zviG z%Lr-lJN;W=QApDklc5zaZt4-pN<_@lDe&HMqKEq5*^Rou1iHUaz~p~nr8wwk#~6OV zZ$R)kc5V6;)^A1|+~jTUxQwg?D6-^Lb|3E?gZjJmH4G{FTva-S9A!-@yn*0%kgmEW z%N)`t&r=EpXvsc>tHYe<|J!E+n%iRg)*iX0OaV!0y#FI$IJA*M^hQ^vtWc+$A9f{km+$z@@Gs$ub0WSKL5O~OT=~*&F7ZYipL+w z-ghrDo_zoB!4NOhjxhwWvfHu$PP$}PxEE4TBH&Q{`2S@EfVM>WO6sviNTZMRoc$oo z9GmW*Dae}ogDG(tjwHCUvB2gz3WRC<(`J}@D=(=hy zy^8qVtc9*p2N&z|LJ?yclhn0AR_A>A#<$In2MKZWkz?B43lJpcMkjt%XlU&Ro4Y5R zPQ*Qe2@Uyjv*zKsyU$c(lMT~!ZCcGcd4gEm#<45f1xOl?t|eQZ{?~~;u=g8 zHMc_1pLKu5jtVxbPPKG47=g&43p-Rgr7x5EjS=XH*+$dX;OJtP&i1H{6nEQc2iNmj8q#pbcZpIXb2L!eLxlB9N&^-Z`! z4nyCi5(?7&cxse~Fa_$8HLNJ}!w5ZZxAQ7Pu}y-s%f=*bvqLqO*_Z6ZMihXqnJZH1 zR}r=Z(|__Ce||vWqU1H#{+87Sn#Cjv`uaiZy7E*8>FBUR% zL+h9C^SUlyalKZ0(pK`iKj+&t-F~cJ_FAfmuq?3k0%3W!U*AP8XnE$?av4iK8PrJ# z;odP?s#>@`c3xH#4qiKT@1fIvcszs;69x??SDWfxwFO*!(uxx|oJ?Tvbo{u2VOteD z22@YKnp)Z~#F9H&JReFTph15sqNAjanl5gKM4Beq+eR-mz71fIZm%n?Jz}?^7!)c? z%2JSN=*yK!fmB^?VPvr__%L*29e6O^wbh_iHxIQM^?7E zd_DLsH33kGD*SbY&hR-0-!dl zrp7ZpwuNWGw+@P<*|F{*T9U`RY(f93VyWC5mlHD{Q^1?DRaVrZ6#KcH5{h;wjZ)>^ zw>*2lV8=6D`hxmRVE0e(QL=x@QWTTssGM-AuAcK?G%qvPNgywPG`ic@y9i4G2%RR3Z!q7{TrYQpuY< zcuoaTW)kWyJ(E%=>l9kY{y!@ZTWExbwJ-crq8xO^5QehN9pX>Ek0V=lGo=88~sY& zSHhl6$`P>ZrS<3Z2LoKEO3r7Ty5^sEIZq;7nx_PA6I=Bm8T48w&fmeMKI7khH4qZm zQF~jp$+4sqRgUm=rg)uG#+?D!LzV}~$l?%?GoY+j374xUOuwml_;kKlH#NLFT8S&H z=;h1z2bi4%PR{h0Vowb&(Wi3*+kO+MqJv&zE;|I&j&zTWN$&sD*YFQuoFj_&O-)h8 z$AI>cYX=ifooSJ^o|#>&fs6BR!?Wg6plyZ``GXUfDlWXWUAE~OZ##(epr+=Xfkw@B z4QSTsc!Q9dPyA=I@k2~kr;ut80Ro%Lxb)XT*G20JM8=a?WHr|9SF^3H*K*e@osz25 zwP`KLns^b&FeVUsszr9_YBP;}i$=|wY)Y??zr8SM;`N^~bYI(dAt_e__)ljzt!t@= zPU%An&gXa+XgZh5&(o*SZYF{!O+U<1l)*q>-z>Wi9cb`*QkAUKrk@one#m5132l?0 zR+2Ml6jrb7$gUF_4?Md^%-rP;q2HX_>pdgVKD?f;Xb!)HE%mCU)%%Uk-~$=1&JbF2 z&+CI9C^a1n*u22FD3>hca#|yihqs%M@xpBSeSTIe$h~Vy!5ZTz1}T+YKr(gtol970 zkWk*mfR$>%kT?v_;~d|z>!pCIJ6!(8@o+JQ$Y8X2&!5bqs@imf=^123)-hHJa?7;C z29~wK49kwXqF92oxFF1Wnr%Ev_O0dK59_eqeV;qrkmS}{b`v_tz~s3_gOba=P3^lc z&1hVT)#uD!o7eMo=d+&P8ZW_nrt>!TY*#|ugniUya=3=j>}5Pl5hr~$jGJGlZNp1F zZj*^3XpGv0N9av|gr7YlyD6(gD8bWgS;164#~EzG?{^F#qijaAj%gt{6Ts zA~BffkH7DvC0s+c&P>~D2k)_u02#^$ud8P;kI<&Cp{-YELGK#xI#6LsIInRl5a%xa zr>dA3FOqs@dNBuw^ksJ}bAs|3fuGOE$LqyD$GXt2wM1wh*sE@7 zKMvgIZrwgpAYH%2K)l$#+Du&&(*3@6@(DPZ7zw;sxVic4>GA~+)PgC66zEE!ut&4P z!=(D7fq125HMZRDMVZ4Z$o%PveW4Y*?cW<)rdFx``{R8L@Y%byHUWYJTT^Gd1;0_U zzuZRouaBL3JC|6i{=$>a&ZaAKO5mz_Q4?C4B4%|$q|e#OLYnvsZgFEDGT3PLOG)z< z!!PD#mYcRWf1d`z92D5 z6+%8yWgF0_d;}xnIgG(6((M2|54;;M4-v48sd|_LW;QTgC^}cv)kTuXM42aH zH^t7xd-OeRf(4nRvmk381%UoiTk!32-3y`!ytDljfoVVXk7Uf~ZMzXxa#gXWUiD6I zFqRo8n;_La_7`yj)73Arb-!1#I!9s2i>rfvubYg0D1ls_%Yo&Vd0`F`~_<)FoTzGy&Uqtv)4AZ#7 zJy$$q2{Pe~^6ZD7wCM&-m1Nx#(AZW0FumkASU!hn@(n*yGPt)X9+*LcRL<+nRUWBm z;ff*{DKk}S>L~c~{2F}r^Ak$;uMe8Ln;m0LpIz*&?{84`e^UC(5b>K5D6mI+2Te~z z9-(+RN#cMfxZ-)n``Y4t?u|XvI^9-Z3pjGI5J}U%4a4o(MgA-TQVoKl zfM#3PeaDSh37f(l23iYXJd$h`4aQuh6Z2tt7b(`N6iKE|K5}rjxdPR$g)Rex`fy%Ziyct_V}cLZK_2fa9O<0&Xaq1Tq3-mLDb79pzBSx8ux{DgNm zIq(5*lzEY|a6jhPn+!Y{X#oKX-L4uM_3u-m5@14CDmhr-{5WN zRL`Yr`pgG!spog#e5)zWcM5a*51+go*ogFH@V$smpn{=>0WC&ruv>dDb?foNb~jju zX z6y5!j3j+KB!AO-c0HDx`2T-|Z+*9}HW>Y=?*s?@-sdktdhJ^A?-B)OQ1`e(2wdvx^ z=~|y*6Kq!0SvbS*?W8(%XxGRyEQ(tC$ca(R#JaG2a#N-rwdHd03X20eU;~F-ZMcXQ zdsVXeD0sZn=apLtDyU*S$pDE|utYGy`H|tX6p0*+@7{=L-gwa~> z)aY=_P&}AJK_19Z_6;vTj#+WxqlPB6x1$xauvJ)Br4yR2ly_|Yp&Ur`i3#wUV@ey}Om>RGS9tUxtIW(NUt%v@qkRI$aDMkT|Z z4YOSEJD4zXM7h+szI9qO_qXBq8a4^y;^*bf%*N@zpbr;X3r5rto?XYEVIJ)FA1jU< zI-6Shb#8nTjQW9S*Z|TK7WP{&k{M=tIT&t_=>D+X;WPhs(E6xlZ5X!?3Z&(dPk6&q z(A&2i-|bNU=H9b=Q|mzRcm)lvYHWzhwKDzW9Q(u@ev!Q@d8Cp!(iEoiwP4<-eL7r_ zDhy7{B#mKZm03g@J=dLRZ9m<=zK2m!-(cNLbOpPu@gL1jm92y7yh4)GpR{NjNMBW} zlj&@P31(|~yY?X5S|)p#Ugf3_Q%S8>8Nv=jYA7_EVCb9dG&oc8@B|KdhY1GwNiq>? zAU%`YGc(pqvXab2oyTUdgPsO*Kwp+TPvC%CTF$fNzR%&Ps1XDRud-bO4Jq>N^yd2Ea9qU;?L*-1l3 zUvG2p`SBXx#6gTi+pXUwG^NPKtQA^0eVOgbpzS3kYW%l%HiE3B)ICyZW})dLP1eKU z@x+lSdS)1Za-|vxq_gfSB_?sCP%OxtN%Sb=$8Iz|cFZ<4lil^zQF?Cnz4=AG3?8OX z*-YiVU3NxVJX2$)ll#hxn(}C)O|PYbZzTsUE(i0e+7|JY(Xu5{q3)dZ5%FBFTR*}v z5JUyOInJMk_6ro|fw^h7UyfG?ViI0qw~5?PGsD3oNQF_sVSa+Mg60zb7-k&=U6Am_ zS~^ZH@mI*NmZ-)`b{Cr^?}Bdv_YOO!#d98}8!e7%YG=2pi3i{KoOV(+Z@!r}+@A?- zrZ6_&b{%^3dx2#mbq}52<=u7#r)g?UfL}1azydzW{$GUGvES**YR6$?v4}?(BYt1k0>o*d(#_Z0V*}fx=3KJ>a81$@{ZhGCSgSnY;b(F$abrH4QN@gzzL;>YV)&xIQ~7G{eH<)E9t(dG zB?ms(I7$8pU`xnzCI$tA?%P&^{#CnqY)xx-IgdDEWo+lSg}0!Q>n@A;dGFHtB(LfP z8wq%3>AqwD+s9z0t}7H#;x#sN2&pPbdac!4hKoAu6m==l-VxxNBBW;;T(s@HeEA5YUN9nyRuJ9JO4ssLJ9H-7!^DR_}Y~fp>H(x!_o`f#TVV zTI=&&d>O`er_YwEyLEfzU`*@i;vwhc82y5)D?S zl&@dC$a9KTxe$*gZTVi3$5^o~ZDmL{5o8sU`uQw-_IBjnUfovXOmbv@hqEGIqqgqj zwgqo>=7{}G*iL1({c3GV4w!<-tEcM?`?t_5x0gY0WUDCsMkwDb(g3DmHP+2I?2UOZ z270K{!9Vj?)xb2f*$M!Whl7j2Fr!<(M6uBD_A8o5b3d~*wMx!8Z?+sszu#E8v@Fck z6uuisze>91zrU!}vc6c4Y@WMq7QS9lo%^6>h*>NXiTSyl?zE*=mQ zO>;6o@mKp7*U+q83hQn*OgTIpqThtow>jP%`;7m~ zdN~rsirprzIq+WU6a}n*c@EP z)N)pGmn(d?I2m~4bDO`|dgiS=;Twu5dYjSuJrX=&e|%|vmAKV?gT%!;74yS_WHYu^ zDsf`B#D2(vM2)vasuAyHc1^ltE0gBP8rUwDFU@GmZD0E|DRkCh%zks`xK1Dtxa&{^ zUN@g~bq#c27Mr$iy0CbwfeAZHqx8#ICC6ArJ`X{(&Kg_=5B=vBZfVJ#EE`;2dNp@c zmv^4`dIYKAl;SWHPibpNTn3u<9N;zK->K4Hh<0dMM-S7IE83pkye#4jx=zzg`T%f@ z^bLX!7(Mebkc~)XvZI#8K_u<B zhx&dDNnF~ooO!y+1NJWXexKb(kHrNIF58hU5hp<6aFH=j^5M!x;h=|z7qC0a<(Wfp z=&cRZHlCz~`=a9KMg`~)jDdnJ5!G{ND@N3kbX7(! z?4o%2!Npee}(Jynsp1zM^vxPN_DB-ULJy;$|IbsIV2>js{}7TRD!q!O}( z3?x|GHD$Iz+gyJJ+4E3V(iNt8Y^z6^J;3^?Kf3sq*?u>}lnjYv-5pu`YE&tifOEQ`CKD537K*iunI939He_j{GLgN`{A1 zDN!23*guYZq0B{c=0i_1z*z7-tYn2-$CzZuj69bir$f zc0Rl5p5qXkRH{8)!oLRcxIz;&onqrZ4a`)2JPJ)3mfCZBm#97C7?2iufL4#9!{Z8w zV4F~Fcznf5EsTqv2}khQh}{vC+Sg?`93KC=gW!ffbBORsY0IY2eRb`ET8q=Kmb;Cg z3;Y_c9@L(?t|q^9JP$$FpU?!?z0WUNLlMgPTxeMV52v35`$Iel+h1P=m3E?itm{QU zvg35{A6172eE8@aD6W=-1Fiy2TN_Qk6t1kQIn!IE+Afj2tfJLdBwdZaA8ov~JR|OX zye-fo2L6VPx{%z7^v)vJS|UTCiwnB{i$C|HR|wk#=4`k0!P(xU%oxhZ?F!eNR&YfF zYBPP@aJ4TK%&>cc&TvYlS$zFXiGyi(A;LoyzzWd?Mn>nu1AvS$%D*iv8z%WZZf%-P zfT^Wis|m~GKJVgbJoiJ85FR!}KFS4hytj5tYfqYqhGwjQk^KUQ=FlkSg^zCrfR5E-0$(=Mf8wh`)B5>jtmHr zy7h7y=V6lqo|X^ro7&YZ{e*+NAjQY{dyW`n6fBM16P~pv`bQcee^llMb44y|eHJuW zFStp{6Q?*UV6XY82dR|kf=y%49}1U&kN~O~yIBW1*=4$^$EiMb?RD^j8bQI3&@P*X zb8#Qt-E}cq4V(1^;jp< zv8i4JesHK$9p2PYqJBmgaJt;O6%sv(!ZYWjdmYG9<3hfnDJLUYHU`978 zIv`CCWl8oXbSaOd?qvcLNC)yS3uQuOE?4e_o%b((^N?=y?0Jxt-?d6xnPEN&2NY-$ z;a6uSJ==-jkm$Hv+yt00qn!yoidJ1(l;=)v-%ooQBCd{MZEwHBH9AgXx0~MIk1D6W z;}6EM&pK{UxSyL=?&bT)`y}wmVi`PX@BLpV3FuW6B|AX+POe~w?>-8)BG*G85rqb5 zvKN4$QEGT59BlF_LY9W}a;r&Uj$UT*Jv|Qirk}KB1;b|40Pjg~2|-vV0sEVIe(>4f zfRbF=xc?T7gc+4pY#KO;qr49;-1S%L+Fen~Ie(VSQ$s-SCB67`cj#vEZKFx_$4z`f zX>|f4X9-FF&^a67dv_sKU?FSA7`v6E^Q$!LgYH3Bh4m`uAK9iUs<%{++6M*8C7nTM z<@xI_Eji5yup;l5XY(ld&tc>t-@JB06lf!WRdc3X?7dbm(#DqkYVkSMDfH9&#b9PU z4_d>=_i~ITw@4R7Ax+m17er_R?pIcUp#pfV6CwRpCSvD2kw z!Q&!w!DX@T@D!N-XU)qr==d9n9tVkY2g56i@>>V9*I%6iHf@**2J@t4%uZ*o-oAJc zu{|mf{v`36_;e0g_u2!?gg5lgO~b`!i4oYCB)a9;bGsO>w?mX~j?U2SIbq31*+{v2ls{(8q3b!U5vX$=T-h-wRAK+Knj9fyJHOyEi%7E;Ci>lP}N|#0l~=JqEjNs zhJ#AoWWmZqJH4s#cq?tqHB4g>y6H>zPH})OAp6`fWQaLMQ%BvsV2Xp!uqpgxCyWsv z=8suogwenyYpkNW z+T>qktZ*WR(`bi_aPmkmIPTzzD;xW#uy&|*ephK!fGQm-Sz3|2U`8ovmc&~gM4?8f zDtc2Yf43KCee-o|P=l2?;`CmMj`cSx7fR8;0Qxm~lt|p`RAEyo>oMe{(~An*QAQ>*n%|t#uXs@1pauU=#x+pFMjBtCj;V`&fTZ@=xC4le*wkLz?Qe1;c`AG zwvTWE4XAoeZp*<&c!)u`u-wk{2%^ixFdNXQGA?ck6zXp7(z9@o3Iu)TmUJDHLcpAO zk$lUW@2HP|nV|v`7%0wfI$)%bG5}AIIad55pY=g~w_bwC%?({0vFirRwoOX+ES=rF z6K#2=)fLPWyPw_-1yhVMy1Z;IXnC4!yU#rt4TJ2mL9)%nhbz0u zg{Q%9Nk1p{DF-~{+xdxVmxV2N63> z^>ukRm3m}Q8&_TPndZDf{q5A@G#BFPIxjyC;#n%}`2%qP1?w)Ur-b@LZY>}(l_)$N z@)3&*uaO_k!9Lbk!|YtAY9fwO5?370Bm&R2Gah}7Vv3w<^g5UOX|K)j>j>kcNxv8w zCMmrH(}Q|bn@0ZN8uXWt%ih8P8GVVXyvj;J%j~?nfC$w+pJ2STR>LAC9WrwUazl_a|L|g?9E1>$m#wrr{K{P zJ4cC}g5m7w`{q9SmfW^i&(*57(FCRrC95#2Phzv2lX84GW+en+Sb0WxIM}1{1GjEzP|gsGESSKIQR+2 zUm?I)V}7@C%@oa+h6vO>;ES<_@pjBW7BRjRwy%Ol)ULPJ; ze2}#|E)bnxvuW-5fds8>3O+p-1tW1keCFO6P@oU@uOv(&AfFf%_{8%UYrXb=@_EuQ zzZx)9%`lhRx^6cs)D)Jtha{dauJ#nD2QWV35X5K0P%?A;ys2V=WxVb`2*>pK-)W#j zGef?;)4izF`X&uwVHrb}+_Bg_*MC>@)~S3iP%{ht??>!XMKM`LwdUFj$ZgtU5JH~x z^ZA3maR-XLZ=KZrw7??4^IeDeqmxjNoFom3K5^yrU*H%;1)ZML^=-UHR)h>!6X@6n z=Homn7y(S4Jq{tGE^xFZJdKkL8+TuJJN2KJ#D%~>6T>FEDV?-o%*P9fMCY1_s!$%D zDoCYg!0ql~8NTaOen!>5yk2fh_kI?yw!%BQnDiV!=E2-R!FbV@sbfn+q`se z^P{o&^U?h9ONuO|55V`gxae0D#YQAap~}()dNOBN-Zs6B7JE1r2p)6EWk`)1>5;Cq zTP?SS!xPy=?mTU&Q91*++O)bD_IM^`%SpCK>BD_yT*Kmqiq|KY+(|oocNC2+ zv>K`d9!`sd9H=_a)Qd1T1?hDT#xxyx-f5__-rwJm3z6?p(x z5zXQy7{bRe=MLkeeXaRb!Rdqs$(54Xey@2J4qEDart12a)d|t^=@Ui1UVqoENue}d zG-mu+#aLCP+cg5+<`e(WBL|0yF}gQ`*@)Suf6OqK)H5+SI)p8jDch&_$&fiJnfh;( zE0Tc%v+Zi6+ePD#H@r^Ekp2_SVfJB-pi~Mydo>F6VV&LhshS^k<&k#1^hVNa@7z2a z@Q^A4pX@&5{hz`y6e^0ET6wCN<#&)74#TrS`VcjC21xy6>Movd zUOXcTD8eos?)}x7T3lB1Life!3PEMWyMd|8WdZpG7NRqEP{yr@m!W1kq6Qi$#{~h3{>}pE zGc3(DL|82o;QbqESYzQQpr_S|^Of{F3NgKEiJohD_QboT(x7+7H`ltD7i@TAR8vqO~}f92~Gp!G)a z-GiKr!ow&pmwZ!2__cMRBHXd18z{O<-oG~58HF>6GU=@mr-Pl2GnL73_*bf|(nNT_ ze;afC1y{+D$gD2udeUY77@oLGh%7EFL!)*~4QTHA!=yGF)}Ev8epS#xfwwD~@QdXT znzps}EYp>&dsQs5apL+E#fxNU!*uGW$t&jB_}q`yON*O1HeQ;eJZN2mBKb$XnQg(k zJk#dZ+C_;gBEgP!f+Ea@;o-^Wevv%C7nfBa?*$uXUD+G z;PxTZKvyDogT6*BY4&nisqFf8_fuf*iclichs>2J0i&%x?M}Hr!5hYR_)kRZ&#qDD zy-P#8DPFz}9nt(U!6IxASlM5~VtCZ9Mf9kz;aT(y;n?zMSXL7h>WP>pIBsZK+kBJ{zAaj(n9>P?vHJHJ$V2N z8K3}z&Xew&20wzAi?Gr!Z-Ru?ITxFj$e7MC{NtCa{oapxR*B1-If=h6xgG4@oc7KX zBztQ?6mjFhqcptzMhnyWj5-tfaEc;>OjYLDo1gIxJe*o)tTA{+@Eq7&_m<(ivpj5v zViKo{#3L_SrV0a&c>hCe%_e922Xep>=5zk14+%vtvvmr;tQ*WllsCVG+_@l`hmP3z!c)p zy%EVA^T>Xs1wmUjqDWw*4Qbv3#H-GazC6E0KEzc-MAYROXSrdnKDv1FY;l+u3iB7mu(3b}5{x2?~& zIn>@@>xUc(x35S8T{NgZfVNxtY;fG=2(aYqp@8?WjpbR`UlW3{E#V6pZpC-wmF4Ap zy>H4~(0BJ!0}b?RENPAwY9r9wElp;FcdTgCJ)n*=(DDo@ArQ$1vS%&~@qCMd7aF3G ztrhgd43Db8$UoPj*P3&EZI$mh8LI81$nV}QyIM0`gHrGuMtocCyICf6(iS0z!I){f zWC3drB!UOP9{*NxPZmA1?97%vLVuUP)uG)E_aFvaD9~iT8J=7D7@j)3yKskQ_-&bp zf-;|cw;z&u=sjhf&!X{Th(fQ`&dcm{Xos^IVg#8)^&BmQWvxk8I<1m^xuvm4TvGg` zdqTCZ2wmvrpY#qfymOXg1%%}JIwalt4aYqQDf@ZG?4-2CvV=c$!ru;{4*Rvph1)Hl72Qj_RZtwl)j4D z*5_4^9!N7aIX5sYxMVHO@X}#=QdA9ogX!Gu4s(5u9`}F|3i&^-*FgD8AVksei7%Ng zdjJG#crWPj6Lc0RcR&+8868j!0y12p z`O;@jkG*6GK&=!AtTO$^PJvY8xx z2S|8yFVVNCK^-RJvg6`z(Hq|Vr~yD`TS|!s@f5j+&9T`v3Yk>=lH0lNy^j%L?D!2e z`@CU#z&Ho^46X4=^(O&Tq2j!{Iem30`B!}btR2Ol|LQgh3}!8ge9>)&i)Cb)yT-1z z?%?4RUWWhFIl566B zueT4kQU`)1T-s4avm`p-C2lRR4Kka&Tp2I#;EtM0YAiZ4h&2iQ5zBeb$^F{tVQoMZ z7;r-hbBE8UfBShlELw1VvK-CC%F4b`i{4d^<-8`-gD(Y2mL>Nrzb-9Rb9J*;cT;WzRmM=V}@`oS0Ggi$o}U)jcu=h!4Wx94%sD;h7LQPsJE*VE=X%W3g}U zZ){HqOStCmbxUKPU4xP}O*42LqBg6R#e=x!>P)Gs{PJ%^q)4t5XI!0-FMS1E?Hwl% zNQVj=f4X}IgrA7&m};d!vyNKa0e!6zDw6Ks^*Emq9(@bnwmgJEtFR;TkwT7zfnx#F zs~q`f`475>KCKMX-Zuw`jl;G9=pq;hYs7KsHvvyc59u%(9s@4)Ee4PllgoI_waHS~ z+(*f}%38$EN8oLQ_1ikL(VIh&%=gwWjff=^Y#&&ieeq8}xj?}-2Nk!?MyyTm)@iW> zI{r(=Xp`$@)#BD~o=YUDqppB+BICGFn%E*w>*J&Uts0ClU!jqWL_{m_;md?)3nYKA zD=8QLu;;RC*rsoSDh&gulG~O9=7a(ranvKgeQce$|9FgZz@T+l8Gm`{X3ijK9el*- z*7@}KBeAy!1;RgIz+uQQgFP^}AWgiVYV<2MQUTv?%#2(9&ESaWjl&+hldQy8DMj?I zg*XLp%cp=nUN7e`EZ`lsuD5uzl~38xTDR~MH%5{z+A)(7JO2<0^MeH4=-t+PrRive zxLt@|C2DAK;A)C9gwh0R|IZztiL@S+$X6s8_7{c%+chbKtoLMAMDMWvkzcHUSy!9T zsMrejP?%%NS2LwOU|;f@@H$w$m>+OScX5HcIoUtH?WkFRaEb`1w_(s@vKS1_TDy9> zS&OB zB4)d-z=yi+EK%5tTa)vyyS^rSTjC*Y<=u(GL=y30Yn906UkIr6?zL(>03s5aDT^Zu z6MLM$8ej@QKGE8?;*z&ns*$c7PFaCi+pspg!=+v8NY1qS!|i=@5Y)l7{9fj5uK5p- znC^9k_)V9@9MAnrIoQsSQ5B49EC>1%bZ$#^)&HYC(eaVtwi&d(TzgzctjB1+R-n|T z$*`;SlGjfCxyvS?xUqpr^M~r$h<8Fr$7q%fJ|q~(-a1Rvq2+d{S`rX)cnSZghY+KY zAYyI_h%5?U>nopQHsNP!19rB3C56BWF$f!PW@Gv7i6O#wde1YXG#wwWTWFz1gbA*l zDRcQEr)I8F8^#9+`r{w#!CFmjneRVKjtmVMH50<&PHID1yInlLKTsN}0;e8_-TQ&P z;IAzqLx~#{^%Y`EEcgV!T@X%O6MM+YBXd_=BcTmE-H#U)&~gdKO@lG$+zbqD7;x>1 zRPGiItAl@7Twdc`2!>$yK35%R@*wOT7Ch0{gjX+)@L@1>f<0yoWj-9d$8MMfdui(& zer0rvl)cXG(u0ZwaX*RhF04Y{c)xrqkr8~KYg4df-5I}#e<}qztD9+*OMhM{K4r45 z08f+Dm_mG?+;d?M%jF*4v=xP=uOzGrS&kf13zhH?C)+U<^39tEv#JwjhFbe+1rw-M zUD3n2XNh$S7&(s59^jLFlnADFoTG2A+EwYjEuL*f1kmt^eMxnQV*Nc)2vE0iJv@9R_4PJtF-8nNa!meO8fiVUAfMXq~}vVRGe#qL}F zQ(oCPV%*ut_e)O@6Pzq8v#k(m`e4aqZ|HrJA5jw16{JOktzivpXx#ajZD{*HWr6W7 zLlLk=QD)X)FEjbzb7176;1-5RH|mVv65{4VtnhMB8(v_gT8nnF&FXuZ)pw0X^>}ds z-gipXQGM6DJTZ?c>V|6c34269*!jhz;@H zcKL2j(`nMYYln$KD@>$mMh>U>cY+Ccn-#_49U%{7N~ki*!&-^+Pt+c|RCCy$;_OJ! zG@;Zyz}8fNb$y+DePvCQJn#k4!|wPGpho^l7+pO&Y^=jK?$-rvAVb$s)x-ZhRkMzJpJ|&@|TGS0T@zO9hA#`OH{=M~mBJv-6B5jfQ$cNOS*2UimEXYP7dsif_ z52DHj0o%VQ>i&lYnP_;ZQwl|N+}}%*qhhZGxrR5SlCtZQil>7 z)CnF4v{|Z@)gQeje!N_WIudhgdl$#@U67M0WQ6#czB!%8LrrG_iI^o&K6MBN5%jLx zy-#<#_8Sqrzhf%c-dx-G`LjNqziq4=Ii`e!rY0>%ZGGB z2CB51c{41GpK9{`OdqwJL38-Ir^I#jxnDU}Bq4tF3(OTjPnCEv75>U^YP8UVCmoOB z#Z{cVR5jgSME3$30}6wYJN}gz4?S%iH^A2j)JUDDL*UVhtmSXtd?lE?u)(i#hwW`j zPav-EdLFkbNHnD+ZljCs)iYKQThH)9CR|G6<43tL0$?rhM|mE(|3I#sVJo|$q4!9e zP9j18-@{fBVgOip*+gd;Mxf)FI=+>_Xvx>f!o2?s=BHJF3CkN?sxhWBrLRo1drIHl zXu6#yyXGBCp>X}}G3YD<*6fs5nfd9BMT|lY-CdX4OdpUK#}Kdg>EAL@OW);sO7Rn) zmMC{iB^TlM_q?rr=5zBH=Xhjw_9SC*27>)e6Hq1jS`r&|2_6bbO)88|Bo>Fl7cY!L z1dzC6LPQa*Nx7L$yqY9bYgpzydw|yl zdWFj}YVJ;4j%0#$%UXO~JHLPgPrX6!gal^kfV-D$f$D~r2J7xdTs(=IH8FpBzBn9` zTB2F6@|WN#JVrZX7`8H_n9j$a)Th<{ri49Iya zHEU1rZxijlF96%~z$Ye!ZuhC;=)Y9aQTNqBn*H8fS4$s?aZe99Rsz%&9|}EcBMC)d z<{gXR-!Woxn;-Iz(_O#D8Pd9O<^P#Lw>C1{svgqy5cOCAIef2ZN=qb-vU`%dRC{%e z_ZUg4vAhe3XZP!9&+0-Yo-;(%?n_Xdh4`azYMO*78oZz1Ul-X)?qz^>g!@vRLL52U z3NAiDDFFhVGTFfp{i%Z=Vq#g`jzWJ|LJB*)NU^xp`Zs$U5UiE_O-6W@`k?(1T4O$g z%{bz`){s@1^%TBppYsqI5}S#+FO9dSc?o>JAExJ2zI=2;Z;H36wzst?!>`39;HZ_P zUSIdE^R1_qY_6o+W@_}FdK~%3S;?Osq9#~H-qlb9Jj=|2h{uJXN%IyH|Xl_OB^^vqQMZanYfI4w@|sNz5r! z^dvamQkeez^L85bttxO|ZTM_nA8EocxxhMgi>G300hdSmai!RMH}w*|Io%gIEfPX> zS}f3M9Y+-ZIQL>j-TXEOwFma%YqUaF7vqASo#vU+%4b#Q+8GAw_9;UNm4xKXM$YxPRa}%%;eun#$$WmD{AB(J7n8&!ei;)fwo(p~zn7ZEt zgEZdtC3z+GEb)Dr5=ra9m{!;VmJVV6pG0={n~O*g)mqF<$$Bc8th#MY)~h&XtJ{7$75 zuX4=T+>u|_!F7C|Vui3QYgKw}zWtVCB?H;HusdmuXMfc`*j)t8#Y zqKGWGN7=S9)Y3b&{XBiM7fCc7(>}D$<@#pAmLdN9=>FQf1P}b@AOrlSNfcFQ(65gc zhCc0J7$P1L=>N7vJ~G|_?H~f)}MN*rgOH%n>`%T%18j{p8O$w zTh(~e9D}=7B`~T?`OiDXWaZ4hy6k-H8OMZpz3<#}gp;)iEI;mu`U2I7hp zycT$$u5R!sHx;1(V$_s)n{SEgTi#)+CprCxKvrDWq9!T>&xND|2O8H^p;vB6Zeo$Q zXQkTqVx8E~aI))^%Z)IP4U%=1gu~Us8};KImVPEu?z*GhiCKnuk5=#)4gL%2;#>8` zzstoEmgot{IH^w@M6i^oiRddw7Qs{_;$conDp(sUdi`hs5Kx6 zB0eeU)v>I8xoqcqkgu-K;$yh&FwEI_TI1&I{>2J6ycGl`b#_}itoAJoKL^p+dmcMA zESjIO3SM`{umevy8`eCoIX#?Q@<{mEoG<2qBiEy{bv^_F!hTO+EF3C4atLYgk=c#T zRv@?(=jF^Zhex566$5U^6MPBen@H` zkwTsXq8Mn^GJ2vs-mi7C89hA+4R(gI#qNky?MfcTn1z~>Q zV+BEQp}nf@P@Se%`wiS}Dt`YoxGeErKn9Vg3~qQcr5Z>@S8aA-rVfF;J|;e#RLg*0 zP6K0+ZxoQZUVoAypv(*AVf{JX?N%-FvTpDDPS!p#pZupT?3_VeYF_}u2bHAhZ|ZJZ zY@#p68KD7T*HxD-u{Y)DtJm>@=eC}f&-WF%HFGD#7=NBG5K<_mjvP@*)pesyWgKi7 z@69-pmDOo;Hvfj$UkwKdUbR)YCo{idRKCnWKqhlttT*N>$0|F5(3h!60F~wqV&v+YUUKwz z^b*cOP*eEt!@?vSyw-ja{VbO#myg)Qb?IBJ|G=p%rdG?{ZXuQ6+avd<^MP`N46{lR zS@Nk>l2~oF+DR(AQheQ!(~Qt+7WZ~H#`KWf#rnhP2`$f_>lIpU*EFG!(>yC};I;I= zh~lLrmS4%{#$ter)VvCE`{dk!>Yw8G1ryPvV}-Eo!P`@07_h(=jQ^upQ4k6YrBGR=in-?nU>1*P!x~P>QcCl)nEG*OqZyb#_2D|an#K`F z=_|(_Ub3lm(52)3sTc|uZQH67F_@ZzC>lCtpfDWLfg2&G)-H?ZzbmMcJU3509oJ4ewXRa_I%zpCsf+1l^L@?)uV)I+ z{r@XwD$l=C=LkK|5;#YYKG}C6mHW`+b~P;KIjOQb$C}r{F3P2ixl^KzPO$V1vAnwb zI(U)zE-#(L@m?InT}|WZ&FTV+Vf!3paw)LfmmND8aQjCg6qR$+M)8)KiUkp|wXQ+! zgsU|ae)Xxm2Q=0NT76}%d3I!_gC+qi^;(yEAR5NT<)=o+JiE7;*tK%M+K~#QZij=& zAWJGq{pbw`*B&$mE@BgjpFMw0otvTvDs9+qET6LqcR~hMb<%F?P7++wqesW>2If?m zm+hg|Ss_vfAGdYi;}quu2nm+eRx; zv$D;wbf=mN1p!VhZMg`mBUR&xtDgAS1nt0jEq8nFLQ-e5J8#S~{|oT9HOVdURehG$ z{A-CAhslyF#jLCf$<$YKV2)p+EdL)+&A6p{1$`kVOZ0-rE%#yFB3@T zqaoW9sLRWZo3GKFE>r6e@|R>ur;dd<%XeJ>Se5=kv;<-%~7^`;05XePX@F<;|UhT}z+AB#})<%xRD>p-W1 zrQ1=b)!U=OD?6wak#L?wHI)~;w-Rv=@zc_pWAvNF^{e3FBZ|(GTlY;)cf@MIsSD|b zO6VP&1~WR+S)wlL#(>1Ceh(jN`HDG@v}HfEsvLubm`wHKO3`*t(E{)h+O~csj-ES3 zO~J>{_}H-J@2(+?J0?dM1&+7LNn-h6c_*A~MsjRMe)yst2{6UUO-NJ&Dm1cXtMtZp zs+a0XotSA9)1WKdQvYHPvj2!R93I}^2$?N1P~;=))Z~0>$Jco$f(wBGCH6_g;9Jvb z{&;DD(`?yIhM#|{vL+Ekagp&Q4m@j*@FZ2K$!>Z!o*@EVuvy*#%S}il9t(IHVxU$v zm1a?X?f#>teh6>5q;N_-Bvz5f+GxdGslL2t6-jBbWO(@kx5w0PL(CUe$*hl2IfMAqu$Q8k$>HR5D_11eD+aldV7+1de)C!~7 z!4F`U$W~hhu&o_tt+?smwTY`>hE0}gtZU94b(H%fF)AQA$#Ll!{w0i|G-xNm{f@G_ zc$d=qY|P|GRrU3Yp9ZcU{^s983rm2H3z9367!w6LEH2yE8T1v%^{+$ED|WkMt;`_k z2)i!E{%fd4sH;JqEp!j6&^GOBdOYNy0>Ad(YQdI24=z9{qK|oQDE9Z|Z{}HrX!RUg zavcdwYMxOoJ43UJZ{HRc0S+@Gr$4Db)*4M5NWJ;Cpx1BX4M$cse)FPdRd)GQJXYGV z8J*(?7L!n_B)ddv09-( z8so>#0UbPN+1?wPZYJ{n_~5i0M1qGk#-nz#Bovv4`HX{YXswV%?|T(O1BlMn*1JcR zaipy&`Z4J76;GsNs9)5%3dDfd#?#uy_g;i1>5Too$@bo`?gt7HWnE?E`Wnp2)WY;v z=|}O#ShGm07sMa&&nwcq`!{~QGC~Q3%nhq>X!ZP~bRmdTC`8Bl;U6oq zbMykms`yXJMit?K7|qg-@2VP?JZ|{OY?eRkqhBTl4p+O;qM$VI%<<%2(*&KaV@~#9 zJ8_Y!d_QtAW{FewNAQ2sc*?G%eE@NtB64CQ4B)t#>-9L@-?O=uS*Yh)BGyxj}_{+2-1!h5vGqsRH);ghx z3Z;sQ;zq5Ngc;NiTO-|3|Dhd=bjtJl7}3moIy;{ISo($sp~LBK7zrHP zHAJGZz0x7!_!vSkOuU6MsWE0?T^#8cc5x>0dn1;P6rk)183`Uto>JJdO`}+>A@jRn zCm4~#mpBHeB%-2Fa7fpEwxSxQ7CxM(J(%JnBJwLP?8MVs65j+EO`NN5Gq1fjeOt`%v**dIMnt#itcDeR6<`blF^{||9 zRqr8C!YsGqDGAgZ?77nYYAc(ED}b;AT<$MZp%}2f&ICBg{pw(IZkiOekyVC7Yf=20 zr8+NDRoI;3{2zc zvNH;?iWls22=;1QNql!p;~w63Cz1!Rt@iyNIk0DBIj{%o$A6@#^3a`kjvExh~Ch!oQt7dT9sL*A%oU@02xx?-3TK|VVny9^is_?{0 z&m7_MlPPajeg~pdaOB^%u1T^GH(lB2aLlEVC#^ zVQcH-FyTPnCo7j?>IGP_(gZ;SbQb)|SFYANGpp=BY*8MUAl{aK%O&yFQ%m(9Ju*$5 zqMBZM&ZoLVQnj33Dd}TVdu5v63cxX|Ls{$~5e+uQm_&lN#bQLg(!6lG?mwbCDRsnj zqb(9tG~NL`<$-$uJ2vpWa~Mau4coiwFIR0?j7b(fW(D#dXc|lG?@}~fBMhe7V?`5H zHzu2?TKzu^Md}cy{3WfyuG5e5!HfpHA-6cXwK50L-VdXpn(T?|!`7RC4KbQ$)U^b`c{%-QHAvcl||~u(f#_hX+?C7 z25;DL#q?`7?Bu}=fD)&MZ>_mZ0bgQk89}t)z`BPr9f;P?*>N8l z8CDqI<(2Bgqb!Lhx;ZSA`V*f?TyDFIJ7{XL|FaXAgf;2e%7;Sy6x9qi^P7doF|E+~ zneNw!&@IvjObv$Vi%&!@KFg}}vUd2%q~@{{DL(u}e=%kzY;jA}*3AIB5sOdEc>3y+ z0sm4jYNVf%Gi$!K^*YJ;2$*8K=CC^BU(yW&8na(5wm0~S$c85J+Q3?Pw|IjT50x2~ zcV@CO468_!Yyi#S6N?-&JN#_8KfmrE%9JwL*)Wm~p10d`zN3KlhWh@ZZphvnYy7Nw zXP*I=BQ)Mjd}_5Ef*CB|1*;gK=)Ct!av>9wu9uRpT&9sbG1?`GRrD+q_}|7uMX2E~ zgwqsJ_HMl6=O=R}hwTxGgbVqG-l?w>Z@!xU4NFy2u%kO{<_}4~7452?)%@VU^~fxq zf>-0PNpP4q^ID)vE(B>lr;OE@#S};9(VPlvCLq$Wxo%|^5Hr<1gJEtWkD_AAIv`C7 zYR?ct^r5Jtd?_UBI@MQnTZP3}?B70`ME36Wv57ERO{2>hic?Lm{DN(Qb06d`#L1DT zs`4*CkujfI3m?$4slAd(!R;AUF8K$?Q^Tx?e7y*pE6z(DLG@;X^0jP_+TDgAT(y&V zDv^`0vwc*Rv2jR2p2hQcnY@KSpFKfz*E`!etccz~@;)+9>sym>xrDqs+C`YxJ^z(7 z!`b^F;^t$2r%*|o_+XiDRxYP<@|LZ})R@V`a;yb|be6AE;Qo=q{+E2rI8?jXc;(6J zfZB3S85nTwm*jWn@Bz2Wn&0mcnD&pFy6uo3YANQq>#&6nL0Fu5>*Qj>`|rU_)1<6M&X`d7 z7lD#Ks)$wX5(&9Id{r5S#wYw&(MWi^?exq4G$%5dKx%H`)1SFrSzv=4Bi>^|1xd zAq3NNMahYt=lIhq#NwDL;=*#J@joLEE*%&|rS=~Ksap0NAgmDjR9z|2H0zs8#j@IK z&Vlpo|LM`}@OT8fBhB9W;~V3@|9uxOV1~|q+mbJj+U7^=mRX$YbTUV5QQOgGHHpwW z{Kpu~PjS!`BWsob;z0jr*jRW2SklqnU*adZBr5z((s-H*oR_@1=q%wE#EZ{V~!pUtA6Nh_1rr$vI$^!Me)%6)Qa~d7Y zx&I3O3t%E*0`m1gG`PW=A_3D96$%x7AK=fE%)C^szY+J&;OF$ME)TCOg}%ei=RjZA z_Q(i>Zm)Lh^mdjMvwn8>reDix4Ai(ZbM3hpv3`?hr%JFqXqjG&245>Kgf(dnE*h(y zX%HA2(cK(GSuk|0Z+-SRext^)j6(&+NI2`YOe7KXk$#n^ki{K%<{ME>(8N2rTnogVkZ-P z*Sie0;~pWUdvDY0H+*p!5-@-TaS^pO^TG=Icc@1`_?bXQjpTB?Thd$-9^wM&TjcJ8;DEj}qh>?vyL>iWVOH`_nB!9s_uQ-xq605Cn7LZY+xzNw$;Otuq4C^mtX4iG9icNId z>R4$%FuCPwnxnFh4SN>D3n!);{nCB9>fb>=iRSI?;uDmXw}PqELW0e8;Guv-T(>f_ zkbQHi#W8c!fa@*=|mrsMJo*NciiHvmxtU00M6&zi1R5RS>=J3KSDK*c06}-IB&vk7}E_X zR56pL#(CL`@B}{G z>wU;>`PCbu<2yqKXO!0sr;1z|DwZu)o(lcdyzc%fHC8=xV$89M?&`%rMorgj8F5f z$(>rq{onh4nZqXjT!P;h0<}+(`3FPV(YeyE&r$J7DuE#_7~ur=GO_faa%EcVAdQ1y?pXz z<(p#M5$z{Y3-quXv6>7G=c|=skkToM|GGILNWX&Es)05PBxpz>R>=ZP_t36T7?Sw8 z=&89HC-MT1l=o1UvEt`p6%YnaKD7@~^9cW%*XF~a?0thNKAfg8sn^oaZ|{;sokuy- z==Qz+;e>)2d5+2}t_fSTkj!H?$iu!NqV3P|x%i}mRSeDF)!~kqKIC5HHmyh>dl((W zf=WL6ZMti~raGYB@(tb#V;EIzaM+FIh@m{tvOu~Z^Wr@0z<}{5Cdo?`0tSE4DHycl zCv2W+V^vI-n-f=(qRTL93V28?e7t-taB2yk5Z7c#*VpbCGnNO(Ry=>79_##fTtbd>|IEB(LPu#}L^*xshPU+8Faq07mTNeKWEpBjBFvgf| zobPtJKjd~y-lH7|_##S7f$3&u^M7Fdt=;@KoBPj961@V{BsBJ?%7KOc=9G0C<=1py zg}E8bX@}L|SUR6qTAiH|@zq6ZH)5GR79$n`UQoo^-uLPFW31<-sYB{D=xh%=2T1wJ z%~7Aro|RcGO}WtUh=TjiieZCh99#5p$?Jcal0|}$k?=QMLLh8_Q|FXK!2fM7fAhjG zhS0p*ftKfo0ntIaLotPK9frvLPWM=5P)Sc75;F2ZO897)=DDKEp8IU|b>AT(bYo7J z{(fs&L<=$L)k{_3mD2=%`xC8;8V;U3)l=!rdRjS+Lio3s`v5;B)WgNa87Cd-{#uu0 z5p?!4W#E2Y*pR?yQK(E;mbCJ$2ak`bwd&UEn&&d7lmI1$FOSpgGwOE=wV%>65*f}G zH<*ghft=b<-`30T)9p*m7d^O)VNMD?IjRg;OJkZyagRP*?gX$}r9}v_YA*&F;hAtdxVolXOz&&cW~z(Br|&Mf+-A1|(E466GNcDPo6TCC@F9OL#ua$W02PCMz9jO$hEka}_23-a_snJvgl!6`*zC z8Un_sQTmjmfGhd&Il{h8U7DMwGFj$vOW)esP5t}-K`l_BW9`&fjR%?lNd3Cxb*7ns z?B2lInEm08u96E^%3`AXAE*!(n)}3JHdgncpsaAB_T7r>fK9&tH!($82N^vTdN7AzWn#eIivz-fM-7S*J0x}R&%jB)@Ua!3KqA$S_~~L1pV;@R z?L0qLkdoqbH2q<`25*kt7x{%3T2EUa#|Zceu@n4iWg8)1WJ^{ytife?tjWj+rQqeu z<(sj}C21@zX;=JyINBr;Gm{TD;7kk;YwRGDkM zO-Xoegt%xq|NNoB;4OgpBds(xTRVU^V1cKzVliw#M9|cY-q^EF1#&sNnfr*7_``6L zzu5qo=0}EG*Mg1CHllGaVf`-X-Q_H~jeN{r5On^FwqX3^b`_CmzKZStfI1ECR+z_j zkOwYXTWW5^RFCV-{ZuRYfOa<@ue%#!xRnuQ?+WT-3Ab;bN-fl@q#3;DOXzp19x~r? zVI3Y2{*=u^L74poFYdF;>E zx}h}M7>8x+^8g&Zyk4ohxatSq=vV@CWc?^k-Gpg7w=0Shr+Jz!X)mvb93#t|q~TfB zsV>Gi=jx1@?%SIwM1Z4au0D(JMRsm`-tlb)s*p&*W^RhZa&~%KzvWIJ__Ev*d2Sx>yNvVSCao8! z^-UK>+FTte-{u!WDFrXyITbao-!UB%BqXvkwT=6x&{X`n<4}$}@w;}S;c}e!NMAHh z>@?@5;v%oY12#mjx}4i7*?F_Gznp*Cd1x0#j8x5EIL&L|dBPAGgKe2(1$(4lt-OcF zPIK#L<(zY0v@bg<>rXH8evl7p!rLk1rjM!uHdrfRC~U1;dQl!Kyf$~uJOd_iyf};v zyo_|3!!32Kjz;uYUNkbw+oi?`p5yZFn(4@$ZcH{tKavVsETXY_{pPzKxbUgNkM>ht z;q43aUe>(zf$6YPDeJoQFjJwg_Cyl!?z)!i-_C3nwv@#A=x3+NtUn;$4i{drYTw@J z_)=pmLj;zWg9vlWzD0aFSjdv=NQ0irnKS zs`i2#uhLnY^Q8}U%h*kGK0j1J@NihQmFsI0HDYhxjt6&k&J-JW(hU8?u^^cGc?un% z=EGeJ+@b5I)KuDGFHqK6795|Kwg0oovmU@E0GTsboGbU7Diq4rs-5()#Awg8TE)Nt zCJ;fka@}c{o)2&D4y~FoAaA$E$QRSRtTR2P=885dh4`iZVRcRVuhzl5ZgbDII9EVw zu#L{)kKNx{090-sYqWxU=o72uz}?f*qGzFX&pzl~)* zHpU2*yW~vqc(osye6|r$Y*A$vn0inM8wgnqh3(V&GwZFofvm~;qx^kWY^v`L)=Dng zV*&-WE&z+KdGhG^VKm2VeFT*5#{zIC1n?vjDK>I0>*BD|q3Kl6sXV8Apzs#)vh@dk zJ>DC}=>bN|40kREFbRKF{aY3H{`fxQr?M9p;P58omX$USw#H%{4J^*?+v?;SeJvqz z#J0osY9v|d1?od+AkwP<^y@*T^SBdX0h()_+s@?cr4lPm!NQ*HnhIfeYCnNXZj|-> z_KclF;2ZB3yQVQi=ekMfH`!su!5;!4(W7FCk%ONC8JBEJ1+<&yl)%B~x#0P0QN-H@ z!{tnB$=hbZD@E-UbM4#l7mir^gvun5Td^cVF>x&F_JV1Z3oAp@et$Hm}Q{ez7lmRS7BM$N6M-0~-E>FqJ={ZY_9#iIqcp1RKu%XN_>pb`zCa zM~Wt+vlD`na)aDxp)rZtE?VgneP;)g8Nj*b+H>+x?@ZilujZ4otXp&JV1U45h*||V z&86Jn)yborjt~(Y5E+L+^fq`!*+H`2qVQy(cZxtMHU z^5T#g6Ss4;<6_xCdA8ep{A2Nrk=9IX)3B5TM4YdkP0-k)6p-0sFKEK5Y)-QkH`*w6 zDi{->9zdP}JJ_Z&78EqAT@s?(QdMII$|{Xi>`y*PPHqZp;1-VfXui3|#I77NKa(@3 zbUkvokw#e!g_mq$*UGwl)l4N_RYi_fyzx`Lm()uAK&1*#&323=0bIk1m%KUySr2WGytMPj5qIx#_neg}cK?)0Nt z=rnpq6KJxxjUJ=*0jpE*7iyF7@Z3bkG)LsE2IdH>Dzh^5>ui$uGz2Z9|LeD${l)8+-A7QL^ONcYcFwp zdIqJ3@fEFB`gTQhou4-SnPYwxGlW(ZHffWQ)_eSF=;n^n6Kq-K4%K=W9sQs4=wzQt zY?~TEA;J4F{hOMKi)OO=(PEiZe)?BzDoL^-`<9SmRV@lRU}WXn274`dNyfC;Vwb*U zh(52{d)iDoo25e+Fach^9TsddKP^S1P?Wgq*}=&>A-jm8wT7*@K6a?NxU@I%v3+6M zr%)GZTY~DG8AEwSmO@k3O_le~r_CZ3Vuqm0K6B9Jex?5t!bVauv=95GABqaBA+@H$ zkzoSp`y7Rrh6<$(otg}Ag>GXXT?aAw&%0rkgEDD!dcEO#CCxyM!E5bn_bs>{5g(Vl zFeca-i3KW6s&D6Mgm|V7d>~fy6Oj}-BPW<8Y%X@cVPJf9cR;NLtC?jU=wWOX*ml5r z)UP=qT*>-jLtGotq|O|tLRxc^x=7DU`qbC9IZM78#oW+*ZEI;Xc9wqcPwto~QHaEU zH!n~~6uAocjIoGaH^r(x1iud^i`F~KeJ_7Xsfmr#RXT<<8dd|LILA6%cR?a^$p27e z5eAuImwV~`O4f<>)r_K+%2dwL5D|WhNpkfMp`g<)(SSux%PS)VWD)B!nphs$0}ICP`LYG}o< z**w7!S*LX2oj+x|Iu>ydqBXR!>lOt(6ua_gbXQy~!g_MC*pQE7?5ZT5yCX-iXGTVK zHl~dv9X&*#njez)tK^Ljm+P={q4uu&$;Ne(uXtw()?7lJMB#CS#rHI6bPOtuWd_$P zgXA_@1)cWSdgbZGU48aCr46E>WrrH2-3?tKoV7ml@nW*4*;QSXg}*Fuj^6BC@>ojX z&{P9Y@`IL2Zeu@c+3z!Y`;ss!Scx3iDUz_FGTGkUp z_*rUlTXkMfbF%GhC}$EPHeN?)b!mp_@R=k7Xzat%s zOH-B+9H!2riaTAtVILut`zZds!+hCcVye61_Vo5@hd1XFSlXKaMLbGUT>Qg^+OC)_ zanB!KBK{&Q|D!b#7JVE_dZJck>H{|2Sejm*LTP@!@A`7=;6j@1Ks~iIh=z5MEyObJ zOcga-@sD+xta@TtY6+HWxY)__%fKD!UGdL7M1?oG`&%Hs0jyRm#aQVhz6;w1BY&ge z@n0Wvce^VJzvZ{Ye4mK{TN3P%eiv{}9knACQ> zBOxTg`9en~ieep`VPp3R%Ij<J(I^?Df1tf9i23KeSY4)sdmb4pf z7(n#SZ<%KDRx^5z-fcld)q{JqytBzhCBs0zN``E9_9rFTS0V)p)fK}cy8)|8mm_5g zEe=+Noo@nGS>&}D-Qx2txLlnrNawDpom@)wH_BrW)Np@pmr;+OQauYFTXxpUobM~K z&DTS+3o-TlT=PA@L?Qe9g~w+gsJroZ;>8YssIkG#FSpWck5AUONLOLEJ-4Sr7G<}u zHLEraHZq^H?cDNbJj_sl@l{#~oWxDd0DkoX)^zZg_1&oZBRq>xX*7S+?f1@6))Pd; zm!y^W=Wl>o@yADciQq}C(WIcLNR^u3IyK@z<;BCE#-o8)-MS+iGd^hJMTqBqZp3R1 z+-9C)8Fgm02}2dlsBh!-R(>;_!rupSmnkZ=PCSy7Z)=X2&DJ9=W&y_zr{S&_@5nWO zNxUIYTD6fUA(mDV$R?{qWw<9PQq%#Aj5Wh~gIP+xv!Z^9N32rjxnJ>Q5~;A-z_MzR zW?V%XzG{RFd~DV>HLC$76|y8Ku;VSuV+p-R`?^K>T4iVe%s~^dV8rFrJD-u?(u(^f z|JT8S(eGpC)5r!P9dm$%)_2|W*L}3vZs6c1%DQsicMl`*VZAx6(S+4^;0tE9lCQ!l zuF5TyNrA$`fvtP0sdarfVZ97>bdr^u)QMCzW3c(*_%Bn6n{5MfxfCj6a?C1vU463R7w}-JyP5m3p%(pB)kGmsdY=Q1{b!c<7!GU{>4&U>icE8A z%hrO-mbZuINlS4rCJ51vChF28oB*k9mks&zK)zQTG=9`yp`GzAEl<2}W-S=!@Vu)& z4^>Rhi`LqT=^I}CEPy)v0Y`z9^n-8mpUb!TQzDp{=(SJ zhd#<3G26zm1w`er+58iF%{BDlpJrK8b9QS+O03?eO@zc;JTz750T$0rEd*pcmUY!W z`-?b{N^57ZYCK95lh5FgW`ayQ)pRb>AVw(omaWsB74h+(qK%ys^;8_Xu=8r}{UtCk zoEd}e$^e(LQYA_;NtOpEee5aE-6Z%sf}{!q4%>Ndn<%lt)_1`#NJWp^)rb1K!=#)h z-907yyaK7L0L1oYoC(SN!-0d`7ykQ(eI9JM9teadpvn8=O^dmYl;T4hUI7t+%c#j< zyWRPWvvyAw9579}BfI$;dD&Sg4QCV?hjzf@e;EMTfn`xW8z z^Gy zY;&Z0eA-@3HApy}k!G*OBN5OE&P%N-Mj!0_oIYM{`7LSDW!&ij%ig%+BYDiqQ!Da( zo{*-$5_#Fjg*GFPnE~mi=%R{?p#+pOZ#@(4<#TT>?C%1aAUK}A9KpWpwc_kmuJr&>$b~lrf#^h3eT$#+NU95Gg}+Fe-eC+r@Q^{0G4`+;YAdE_cM?6W?>LqB%k5ERNwRg(H@y| zjHbqY_ajNF^u?CD_KDi3Z7_M@2=&fmoWR(CS!FQ`f+F)~tlrj$LOT;5+}AqtfUhXd z6Z{uyi)I-M!r_e4KjY20u0J9_iGF0sf_;Q6Q4o{Y6l2!G<5PJ<&OTzpHgONO0%6KQ z>2K81#C$D_l!Vy=LlAA5#Uda1Et&d#YEm_aqQ`j(uXW*BIh`0{*~rLXwPpHtPf& zsUYg7T|^O7x)!t$ZDaS#D;+B=`iIvKJ)s<|$VeWTt}{!_6|m-e@2rFB!!1TW$Y*!c z*|@K9eS+xQC=w1P?TV8z0{0_FL2jb}uR2>+prLlu-8aYb*5^RFE8MCCAo}tvbQ7c#+cy;%woBq( zOvc)+e;K*LJW-xY*q6hQ(d3v6kTHs{Rf#E>9I=3^&XpaH15_s1qh8BsEopA_Yg*X4 z^z%17X@z@S9NO@Psw<~?r*@48iuH#l!&|X}8K@ymJ-2V%We-4cU2gdWGnDgGUj>1x zwbHwoi2UWNIY)aV_|fKP{fo2To#0gnTEl=Jutg8-d`iuH9K}w}VT4_mxkOontRU{{=lrRPgqhp95 zjg&|$5;AhgXqcolNHbDWVsuHpU)}KczR%0QJl{R{o_p^(pHrVh4Ybr?Yy{@TQr%}U zeVVV&$tf|TvId0pcc|1-AHGvvQ#%JP{lPd*%L1xmyL>f|rh(>~f-e4CX8;1j3It-X zEcCjKS-^UEB8A;rB6?TFHRYM_!6lc+g=HK?gZ4!BDpwy)Q`d^^y~cL)IA*$X!^DD| z`>Ukyuyoxu;0@6U0W);HIa6U{A!z%x+@{Tdf?iJU=b&jeR~(u{CHl)u0CedXqdJ0?IXJC)6Q=@#nlZ<^!X5m#2z-j z`2?POO}FI!y}(ev3&hZ;$u_&$X{NyQC6}4I7^8sNw@C;bN9Pu0tzY_a=}zm6C3c-` zZ&Im(zbrK7)2TnN&Zk-X^&Mnd$=^JTCN?^`i}-zNRfZ64y-KK#&(B>TvY zZu>zS*Pmkt2Nlo4))|d1F|S3UM+)!g*Sh*1OzL+b4|)qH^szN_-~_Uh^+&(rZ=KNY z5Ez5p9?fGLO6uda>m}Sh=T&#rW=)nSXaORI8-pgNeFwq>IE)EsdLX!93_S|HUTKz_ zy9ty}Fu1o};emTiBPmYdTWKfl8@PfXZOa(O6NL#?nOGg$AH@2R`*Hqq87&gYYhQlm zycTj6S^1{;sUCM?a84SV_WHEc1aLYqa}0JxY5)5rrH%6(e@LWGhwtR`+qd%{z=3)o zTbYtdfJF)dN(IUhB`?7F+@7^Q8VOA8{t)qOZ;_EfzUEqH0EE4nW=-WK(4zGRf%qvv z3F*ZR<5LGQ`I@mV4k=2W0w4T2M4drPFYM*NCEaoc7XzG=lGJdm^$QTs{h@2AF6KNw z++N%P4LbVYc4-RbqJPoii-6qFgx3+CR?8%5sZvA395*h^%T6W1b8*HUL%FD2U`$qGM5%(#pQu0buevN5yy7ER>t5UB06bz?Eo++aqX*f~{z%ry&0!c9I zgR9FVdlMj99BIo8Zx8=yy35>ZDbqb)XtuMC*V|&J`Y+8@uW8Z$+AHKpo`+VC>$!mA zl2)EqbY9^cBX()SbzZ1aKe#+muARpJM0e0&`uxH=*PVy_xT8S#kUkk0?8NY-buyf^ zEJND!dhbGStl+FX0acW`1evirFuQl?yi_XhDKy)!w6dr($?{o%Zn*cmyjSA5Uje$} zIHJI1i&?<35^p1{ka=ykw9)azDYqD9V|s>~Q?e>NYx ziKl01SRJ%wSdzqP=j!;LD2f56vCY~DxdLN~0AgEtPc;eU<-2UNMM*a=FX8#D7-a}t z!X2z`rD2o}OQH*UUqeMN;_9!bDM>(*37iat5EQvemV1VZ!T3jMMV3ZK4f+Cg+h>$% zXX4GD-lB< zQ|IU-P~Q=P-PVv=qp~onTGNSH+<#*@fq4M#o|(=N@=Ak4N0h4r!P0fsXz=KGSf8;J z?BBBQrWYjT0f&rP69ejnNi@K5(0P*Tw34pNgcGhtqk>K8ta7M`X+nS{FU%b z^*h!Ph9GzD>00hoU)Ht`SU=w6as7My5?Baitb=Dv_&o1RGW1L3f*7h&|+c$o~@Q}65I*k_fC2c?udL0#4D5C=7(tml2! ztJY{-NeghQvQ#zzZz77{3+y&2C=lSNJ;skK@!(NbD3MoRQQK{9EwP6(?G1>%*3ngI~gdr$xG$f1fHFyBFFS>hGa5R2)joc0_09_&`G*q2{Y2WmCT<@z9T@8AI)`H~$q-#iLXQp}9_^NN zkDC_g@4gay@GPz4J(igva(t*;_<}9_eZ?tr%BWc}TMX&=XFr$g&_d<4Qoaafi>E70 z<5E2B9*ldWrMO4;k*a9V+jO2+{7LyvWa2ezWZuV8%H3_PDP+Oen%Cy}?Bl31ZIsSVe*H z!0yu5y_BrMy*5>9^y;@azN%uLp)Z+aweH{Vfe_9)x zrU0h*DSlf1GRazZe1D@V2Ag(;TO$EomS!A*f-!Z=?5_UGQal$~L#1NlYd5<6($bE1 z?1j3L#A*humhq>VMg!yKlp)Eon#(bPwLlBtzlI}es)TOqCaW5!Y~E}K!xWBy$zUFa z$W*`P@dy{@rOzhNhF8WnoO%HI)zxvToQXE>>a~`*pdr-aVz|kqFvo?}>`PSQvU;wX zGIRf=!bzC}iO>5a*;+6b*WLv|<#7%xy!-RwK=31%&U05twv`l2rjwwByqCKsa=bG5 zP#w}~nDZl74C#3Jo&4Unl}>czeyW`mvZ&^>6>i(yqZkylBYuEXLMNz-un$JEs`la|5!-Dll zo*;4)b;XI5FiSyUdEMt|w%tL)j#Qn{_h>eQe~Q8->JPN60DCU-y!H62Sj`N5#t`o!--3Sv0?_L)%J%GHZ$OM}gp#zOqB!D9*a`|?z$?nk8}Vf#g* z)g+n#Cyf|?ik~_ho@a>2gR>|{c3wSGK6hcCeN7B<}IHk_0iIIhS zUF&vT;@ekeA7NAcD(|NWdQn-2Yxzujio}EP$KS`1expvYKap(E1U%YOg4MZRp`Ky) z)!;6ph*#8GnzQc#7&d?ygd%z3nw}d56XF+xzC>a}zc@@)36|pzHYX2P=i?W5hXY#2 z(CU-n#`GvNtrGRwFJNO8Qbmwn@2t0Sx076wfI$&j8_`#AP%h0+b(G7essVfZiR{~{ znsa{!6TI@A{YjO2GOlVO5rs{CM zRV7cz-M=AWy5Ds48r@_flNQ@dR074>5Y>X@2!_Uco~48X}-$I*G;)7Q`mFE49#6XGjDvn%ZQOvjXykMy3ZWk^dRZ`b99eVKF?0)$m9E?6rM|k*a5C`U8%f!&8+Jk4gV-YB5|P@xbt! zq+3AU!*w+_Q>c_(q4u3K(vx&;knUXWwQdvfxbEEMTldSg_hWHf=1m9sJ3Ie_9WLm|DzXC5<@!pEpW>QQt$MtSreB(EU{vz)@ zw06hEH{wuhaj6j)?@0chZ_MZM&yW4YxGv0dAc_D5V+qK!cHX!-LpKAU4HJG_W&mee zr8y{@FA&Eu-&zjHhZ#xnKbX|ox~^#Ovh|vd>x)>&#%5le(9@wnh$CUw*q~VdqfLP0 zq>zF;PG*lm)8w;Vu$UScQ*r~3^Ruu)1{CL)pXp(mjAc$w9I0Cm?}X8Utnk5%`>N^1 zS2DJ$9fl4BWs<4tGwkn&;ijyekUkiPC2c!MjkCJ4O~*Fxe&e)1Ob>ni^gh|z^fZpn z^-pjhuK<(VRbmOAE7=LTQD5^eo8zzi6D|-`z+*`C!dE0OGh=1y$(FYr9?(Zrk@tN2 z)PP6ziz(<_2jrgce3M5FWPIcUF!;`s<{`)54TdG6yXd^~gScO1^sf>^heujc{|pIO zF0Rku@!R;j)pPLPKPJzi)aW2IbSp2HIg*min8rf%@AoWeez65IXq1b|L^(#j_}w?^ zPJX`1@JOf>JszjAU4ujB60PRNboF#~^Ei(v*9ewy?s6G7hc5G24Qh=R`|aINL7A1= z^OyUq4HF>0kZx!42PSnM@@Qkiz{e-(NMY^*t5N6(vkj*lh zZ;G^-;)0sNu8ih?OE0GS4jEiLu%Fg*j}b$-s1Gd`mvZdlaN-8ZN;t*k`w8DQN5w-d zwg_B}(@Wp0NdA7Kv$CO){T%mb(RX=zQ2B)j89UPgCMN|F`PnLXCC&?5C3XHo<}bg| z9{}ZzpQ&ADNom|zRmY9u{3E&vIC`*|xq$ART(kLIhTZ>PAz2NPK-=5#U2icvo|^}FrvOa=oMj^**^E&9K=Hr^bc3s{9jz@sk}bSycM`xczsRI+njtf(tygu6*_paS9%0PwW#bU zdFvFqHy5!7k(`LExq37D3|IjUl9iFlFl4Nf4>R}j7gfFMxj4aQ^(joZu!>!E^Q}m4 z&q`ZL^fPE9cz80Ar1t4RS@}!G_n$}7W5m92zE;L64lNwNO;3me@h6v`xxL$}3T)Fw z#`!EjWJNU$f^HjIJ5(jD z#r9K}{68mFIbDccUfz?I;`bx_h{O*h%h-Iry|d zy;fUp_$@8HDqAXoMZ4{WKt0zB$mA~*cmHQOa;v47c1k_NblJ!JwP{9xr# z?YIMS>(zoAd5R6EPJR*Je6dUDHd{o1(c>h@+bVubebg1E`<&(Dnd zx|at}#U3HHZeNh>pQZbV;Mx^=;{jIr($_qbD=~<7pLvwh1>3#A{j0xPzw~XYl1vBR z791#NB?xY9$+U`M9^y%=1D=L(#-tg<{Q7=_N+!5#UuXM*ObmJSf9UZ(4>^VMTGzB^ z&wbVHKy-S{-d*QvUmr()UYrU97?^Is2L~zjeA^HMancZ!yLf>g(SaxzmjRu*Y6fHn z0fK6m-rV?b6_Uv8Uq#!gK#$_d;QP9zzXTRcI0B1;u}uqgbO~@HTevtfndyq;3cD*a zXcK;N`D+rj2t?RQSmK{J8y{RHyTJCv1wyJreL8tC@v)D&g)fp!6{p53tp?<}QQgd^x2v9q zIkNZgke%rWk+n)87->WQtcKTMrUhZii~EM2#{$+DJ*Wo*H=e=?~Sz60r;spZX^(}IUx9aphl?9MC@+QYp#^1C7@1d*Is|E;c>gF zaFE%5DX?I_W)cS7xHt?12Ac=Q3ZgG1 zmrjEsWstgwrrRvpBYd893QoB`r#kUnpnCi{L}$S*fc-&(j^CI-@VkAxHDt|c>M>43^4-2 z6X!MUd(8(IqxiZwych3YzO#-`wfZSg5N=j>dFg;vH;K}KK@Joh{J6fsEM*QGvtV zh;U68vBi{K&};rM`d*n~)%&;q2890R>bafYok$~ZI^-ob&g<5ObI`s}iV`GWI9YPk z&)4GOg|7QBEJb0Z=CIV4@qQRE(-&lNAW* z|LS;QuXM*fpaH3V7%^*0@KGFp*xzV!wq$gM77x6p5tV>YzLhavz@aQOF!b33G3xx4 z7w)=?9c1;6DnF9*&Ad06TB z%1RZ~QbftvSWGnHLj7&@N5ZsYJ@H>%0=%{wDg$AL4?OKg3z*%n#SuSh;xrWTg1JFM zB0MEQKFWBViY4+>)o?_^7gtD63+%_Q*&EM*d7*z%GMbT;R@`p8+E(LK?&UyqE3$bw za2N-YRX8c*?2`!vLMFT+p0aY1ObIR^$&%NDh}YXbOBuTU{&>?(5%DJ$S=yTT(k{ko zL{Cl<^aR(6$>Asf@^GlV_FRasZCb)I=j#U38e~P(yJ&(i7`IVB1rfs0PwV$4tV)nw zp*z>_lI;2am*FY6SJeDFF!cxhbEZAV(9xm#pR)#1;W0KN3*RJX8rmh#LK0JKq)+0u zZoRLwDbqA>T0h>FMe^AF-ChC@kX49C)Vp=BMQGJkYsSIoS59cY&e!01<3wAFk9v4X z5zyq=(*@-nnBC~!`eeUBLQ(!j6!#_q)j7gxw0ta9_vp1puS_I@y8cl6yNFsF}b6Kkr@v~w02=Es?lEJcpr-mg7}o>oui(Udv43i)SnplE+jR`~b% zFbU=m;qCxX8{!3?btt(JR3!9b|LDrIfR;XI16;blfrI0~4r4blPHVPde$J`PAev|a zR)DA!XqfZDJ4qZp>;&@diHK(9^|)6h6jp-sJ?tK8xR<*@GfY$E*(MJ2(z>Z{>zw>U z3Vc^mE7yhfrVn*LKB6Vc1Jcy7UMRUK(ru{Xrm-5Bk9!6rAk~%H7a9x4Vg%JmqUz%x zt2XL?*)154A>QwKoj4m;`R*;e$F_*PC@a8tiX7X?*E!dnl#=gFM1N7mvWgSoZYKlv zu-?7prREB;c3$tRT-Wd#Lq5i@!i_sTMrMN4n8+DBc|4MdF>XuyuvNnyMRKxmx^ru< zrX3=3&4BIzYrXt1tIZ03S6E)7Vc?2SImjIkjDyv^-x0qVvmWx`1vyK&`=rPjx=G$* z^g&QO($Pw`h%1oJl*`4d@x^J-n%uJHxix*ARBQK-XL0xzVBXpr*-{3FisS`rt8*py z*)!<)aM33sU`goO^i`Q!X!Z9Ws%$M0y>cCF$IZ^N z7kqxLxY6j@{t(2+uhBP1Vj;_+M_d>Oi7V~AtQkaS`_V#whOCp+VF~1bqNU)u#q)X+ zzZPZWU~|4R`V+1#>tu)y)6-GUmIApsoRfN4o*2r$+pa!rJ*<+$_T~ z9uC_i9}AvG)a+rDwOutd=tN075{zei{c%R!!N=uxX#s*G^~i;f8gZTYPy&z!_bUD# zlG|30x1Q^>6gecn#8{dQ%#!_c57E*z4^pT2>@%Ts0QL3ZONn69HM$q9pNTh*O9+2W z9^0{3-y*$Zy ze6w7if*#T3;lGt31nuVeuvvwp-q0*n?sT@^Yysj5MyXObi!)9&Y-`A>dvx(CyjS@0l5A(HT9ZSQ0$(zw(`v+wso^)7a$ z<7$AX{kag_>kp>fSGreK==aRnHO7WW@#qbM7U9JKydW-yqPN~7d`}rBk0&UW^K2wA z*TWv?E;TQRzn*J1{}3XESFLcG2L)yyY)AE(B&7WI0t)Jdq@08Gycln>=v=CXCE%bX zWdb2QYeVF8#rJq^QpjsL6uE63sZ~;G5*XwpCw=F%Mzud$4X>|$a}^c3OZPI*IWk<` zNLndAe>i_9<;oNm?B{r)IYk_8!(LoC6-1tq!2xtIyx%>iFoQ^1#} zfITF{zxrfC*fsHBpzhoCo1Q@MM9R7@()q{goU+z3StJce5AV`6-<|49lRKVgKiTj- z)r((P^{TbeZZjP3F!I%_9un5p@|J67*g0fBZj)fhUOPs~rWZErhzb79w*$2#%4QPG z@lRGu+jLzQ3Qo6NBy9MnqVi}uKWJ4t%YIM?T;)IB0X#?z%@gEv(7^7!i}Br0tKI69 z+1rs3S?)wl=(+dSKCQ?qNIUpB2SoPUM%%<{k19;}N9)|(cMe=lj%JB{>qZ<-cJC6Y z)Zi_%#8t{>B3CB;>jpt63&;JiA=j&@k^@N#|CIDvRnpIA1ZqYrd{rPga@kQ*rIg%{Ya+3@@RnLeEXnvQ|sny_EevPpK19f za)*}jn z?|)zsnfjNDa^-#~(V30OJy~hmLdYL>rJWqGS67e9KyRAPO$-U|>D~bbKe-1aY4*+D z8xi)#JZW!Ei?^0L%s%}&d9riOPMfUn8)Rl-_tM^2yp-T8jL{J7hi>HPQF}$-#XjNo z644*!ok($(GL&n$Cdk5Pq4~0Nic4{q5r&CeM2sW%t?q5b)y|x!3*`F_LrKIB%dC9VFh>0TKng3UG&mO0&n&YD;Eor;K*(JlS6^KH zNyxK5|QxTXs#TQ^rloV$3E;0e^-LbToCMCe!Rj^j_mWgHnpT&5jmvd zPLCMtGxE~k2K8oT)TNm}SK~<_`4)F&`yE~!CI}-h!(d}~4Ow5YhQgObq;&%y_Fs6o z8jXb;OM{c`b(l&99ETH4K?0YN+4*_2C1WSqGJ-e9lwPUx9L`vGfc3HhA0-KS3rgX~dh=!aIHJw?7&ePAF9n}36%6#J-CJ1RiTYFA?K>ec6B@eJ}} z^$A$9V!Y6he#sp6HWC|&?)>q^iyY;N-Up9H*?z}hp)<5g^z8z%khg1cPqZMru&jWG zBiTpiCt|zW-a}v&A*7aVJmcz>;%rH2>T|>N4(EMN&xiKNH7k$7_TtQ+9Anw{MMGu1g5kwNhN9ux2E1 z&-bu?M2`r?a6RdQK(*I$q7B>i5vxlAH=V1>%A!Gad%Pej0VZIJOz8={4c(_8hCF~|Rc_ba#VKM^sXuhUl zZd9uWH;axlceyM^3IqFZYeOx6^PtJzUw;Rox7O9M$`^Y(r)N-YGWo>TyqEQ}2Xp;8 z7BlbuY(yYs$qc^xn5E;19fsWWO9+EU0a4a8zg~Mzwa}{66$hz?bD3ec-<>;0Frlif z_#{+6r;MzW!S-&p!HDH_7E;i30P|yn-h@lYZlg@7-_%yZ z+u)C!ky(Xe*u@8VCRZuwpak^%I@`QzbSRnEK~0<2SHH|de4G()Ln8JR%Inl_364qY zDRk(#lY6rHWHNbwF?R|dNiQR|d)97dHMuYh4ZhC2d=-($V*GyOXc=h?DfAp3HQ4jr z&r%#`w@g~HrZ>{Fs_X$zNB1c1CpdqF7FK&>KHoggP#nz)K};%FEj#P~YO$w`Z5AeZ z`Vx+8&r|SLw+!yoASb)@?0s;kZap&2Qm;r56_2c$<9_*joWz}w&Ps2I8lhkZVVYSD zStq9or>L_=*1#Y%wfB*;(*=*g!)sL=Z|O>wU1(g&-tOEeMs|AnoE`wTJ#EtW5Zt(x zwoo_maHWDa?c?t3)B!Y7HTATTce^Xs*Fy*?yLP&JZ}PnN=}=Ps@o?y?9y%2H+E193 zqDP_7PfTSEVG=S5bt~?ZKCCLJL*MQfGiObo@&=f22P7yhd g0}sgi>is^Y$Vy+&LJ~pd&jEj`_q3D?l+6792NvNIs{jB1 literal 0 HcmV?d00001 diff --git a/x-pack/plugins/security_solution_serverless/public/get_started/images/enable_prebuilt_rules.png b/x-pack/plugins/security_solution_serverless/public/get_started/images/enable_prebuilt_rules.png new file mode 100644 index 0000000000000000000000000000000000000000..a4f7720a6297717412194ffbbf3da55c9c59adf7 GIT binary patch literal 57083 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 literal 0 HcmV?d00001 diff --git a/x-pack/plugins/security_solution_serverless/public/get_started/images/learn_about_elastic_agent.png b/x-pack/plugins/security_solution_serverless/public/get_started/images/learn_about_elastic_agent.png new file mode 100644 index 0000000000000000000000000000000000000000..36baf5264379fa6068d6ea46aa70a3a30cedc140 GIT binary patch literal 47791 zcmZ^L2|SeT`mp4cqNGH~mZ+>{-&G1(E3z-iItF9km%N3thU{CiXU4wHV2Ti9$u_c# zeH)X(FveiUH@)Zl&nca6{QTygXYS`(?(4d*?Y^FQ^GH|y>>2hmR8&-FA8OoxLPd45 zjf#r;B^@p0%3xZ}H_980!(E-bR8&>*^oQ1eQ9kq7XgtxOq6!e8qI&U)ifW&7>BTA) zmG>8SoXae?Y2Wpsk_M|Fao>L)bH zh)VMW$A898PTctS9BL}6NB|Yhzvq}z-haN{QvQG5^RM@l?@#;};(O}KKpZ_NwKDo9@fo1|QF!nOm(U!LXxrkcZf}Y!n`nkCM zyo*ZFPo6S#vGcO#@pEx@^_2Hhy86!ydCK_bWwEO~|4i`$DqS_!dBmd%^04EP7QH2U z>#Fh@9v&V=4_kZrC->FUV6 zSI>X5MPX3v=Qm=vMQ@4y2R7wa#h+K@^*jJ}6wE*2E8kZ9XXbC${*6ab>?iVHi1`<% z|6HZ8s(eOK>_5w_|bAYtKg~sM(A`yJvIkx^1_|AITa5003Y1ctN-c4Z9^+TbKmBE?qDfHnwvo;!x_~zb@95JBC4=t;63ckrF0wz^ zvEiX6qte3$O#&*)KN4D22!<+3#WSVlSkr)jgPip88l@Gvm7o~{vun(0%-*fn^hwYX!T$B^J4HP(P z70Xn+Q>3jXykzuMiMw_M8xtc<0zV8HR>oxD>&OWE;P`>>=|RH-+qD;l_+)a|>s^jQ zy*6j>&g2*p`!1-%mnWH1T$ZH}ujcaWjHBw{-s#P8_JIEazh?IO$R#I+iInSTvb z2GLs_<$H7A1mqFHtk|)81Fz5tDn}-ulUHqIk4BvUMmk zV-w#D8V`Ka0@@@FtQ;i--W#CLJ=(?c&U}{~j#E_6>z()4c|**_Lx%Pa#|ZuTaMu16 z<)aov`Ii9V;Y^K#UPgmN=FHbjrQ~F-M3i+}9Wtf9s{`Wq1IA{wJR1>(JnH`8QW8S?D zx*VvwSJqKf>A4X!@RY!<6(LXar~UG^h9T)RVt)dwyZ`^el#j)z5H`etwC%{all)%KurJ|68PIkc&4iMOTE(TngP^nfNv?JzK5( zpjc@Y{8Bqo`pVvMES0)+SElQUuOeIaN8#J5*_9uZ$H~UG)i&juzIdJdZS5%-?opea zi{;##Z4ExS3Zm+gPwC;VVt&YTu8>akcR5k!BI&~>fG8|A-Z;W}CGGDs#J*f7lH-%9vH88G2@Ak(rH zPu#<|`zO)sGpAso@_x5O%2WFX{{a2sPR^aRp@UdgPQi7!%MhpURD2@pRJ|O-oFf1H zA8X=DSMbmS=lNq6k>OPi>CukE6(TaFJ6Zp?OKU>F$T?|b+;yu76P%m zlkk=DpqZ!GVii~*imHh350LwG@1ot^?I-Ie$fQ&B7cZ8#g8AAAa)5?|FI~!uKB=wC zQ!OB0EKCMABH{mR$(HcR%Kug1TAfjokn+w0-*B1N|3hV$cpl}xi8`s886DX$^2F%C z`lv|ls5p}JF>p!9a#<;HkR|4`0a%=-7v5r-iTxbpGDmggx zJ-1tTlw8297sD;sxOWHg=)1*h-N4y&_JZ|pz}mKgXh>}4{x-&f1oMUMePL=q$LG#| z7?iQ41(_{{c*)9dmth~mi9^m%FEbNy-rv;%Y)xH^^?w`q<6_RTU~*V}%Vj+6mdeat zax2FdA&aB%KxtTm@|?16r<;N=VUEprbPT(mdG~Olp%s%FbrD}$>S3zGsDnJym0P(z z~kbM|j_m41u8)oAmo#=SG6QQT4~gMx%%?xXi&N|xw-tL;@3Rw{mcNwA|sZ!0-3 zXbznj4Cf=na_j9(9c>Q;_Z}oZ$+Jw0VJ}S7VgY@=`qY(+&0WEvN3_Y;ImdR+R;3wo z^P86YL4{BJZYE&v|IFmSjR9Dlno(urF*eI8(67rvzlr{6azS1+RjhId5C753iIrni zP@VxlSP%TA)|KK#~aHSvbOa~0!@U!WBkSXZt%^Kq0;F&a& z9WBOQ!tHaNbH>=fnfC-lt94=5tOnmr-@TJT=7BHZt@dN#ZpXHOJn!Z+IM*KB?`6H2 z?`}JnvW)yxY+Q1=6(-E?n-3;uyYgaIkpW?TUN(;Q)G70PcOGSQ!IP0BUa&=;-4*iA zt88p>=q|I&VNNmZ^9=k`GIw29;YH5NZEKIK8shNO{8qbVM>`!qz82q7I>Yzsm|h4c zyil_V^o|cc9L|z%TI+;(ky3euNZ{uJwM_%Iu8sN(PuXjXR z?YqZOH%GmPsV~^=^4RM-IZihGX%!LkD+ZA<*2$mm{_fyzQJd}GVt0n>PE`&6t+i_e zC5Ob&nmOprjH5=}l0nx-YX>!+G;}xVWD0K0ANZI-XFN;`M8L0Xh?0tl3R+hCp;(`p;H`_OOB*mJ z-3Fg`$Q$cPFB6`}o`Vl@H2!0`7lk(m%_jz$?;b|TGz$#hY=26N@g(&FH3wj0Eps}$ zz*j05^^o?*i_KFY_^jOc>gLhP(s7q!%JjW8pTHTfv#~5PDcooqT8L2zRwr}@nAc254l6uJY+5Q(OypuOAV@MGbD;_|!X1^r567QDy&D2r$6jkcYQh=cu-`< zFLo1REcnHYR(;;FXqH|7;^Q&>d?|k7#$g6(Q0clYFkI#Eb<_cF(E>Yk)M)cLVoF|l z&2o=>#>XmnvuWJ168YB(ioRcNI=H1nz*zi=9e6pLVbaaOSUkG$xhOpY5PN0fUtf7*)lY%#eY63QU zEt5BhFqf_iQ@L(cp>tgd6cVSW16`<}>GD>RGVOdH(-(O-%RS|y$L7rbS;hQ2T|LX8 zTfk7T>%0S&5AGjISd^%TLQbkXZ_$SUzO*dfb)DXSmONZip2aYEXqCd$oK+j>TfaLN zGs}Z1d9U_Ts$-us6o+l#b{O<MVy%+O1Uelc19|o$WVI?A24zG zqcmLzFm_wB(+wCMvA*$Lf+Px^Kx2hnJ0+$FXFHA5%3`ac+Q5Ij6#c5 z-!vrCL&L}mbrN+*9?T5^xjJ>2HqeXhm;~<7d>kIea+i~81BZr9xk*q1%_ENmqZC1T zJ=a1^D$`*RFmz2cbf2_bS2q0hsm$~+AR&K|eoMQyRQ3Yrl``mR?Wr6#EWh`=%_kSU zroM?C%_>mj(aP-ZyE)Yb1-6p3$|qzMuOES}TDz5Y+foN6*#bm8!>QTl&ZkgEovv@)h!x$Lz_aqVkBf{%fKSkM;c zXeAww_PUx;s*@Z)qd1IbpLzfo>ea1K**Q;?NR@aEoAJDReS zmp{{6s)_%$X~NFY1>vD$K6bs+IMC75)25(dLnzrd)V~5_Z$L=0I`SV-t2Aa#yaqAI z;$Ua*{kGF_9w|9D10Og!g`7`_t-#HSkQXodG~E= zl7QJS)O?QSCI)071dCpP#nuXWH%XV)89t>sR`D1mLn7&ABM(HEJBu#*Zb_+lY_yhd z^W~eOMH${jKh3?Z4^}%_r#6vVI`~n8LtP1*3}48>p+K_h45%K9*)dwHCYOeTDXUOlK75)SP6?yz(} z58JUj5Ku&=pkJX%JmIuhKx<(1%-#Kc)l|ADlW2TA5u}qPR&OLC^)}S3-qqPb?&!~{ZGck zPA569W^m)nntLVNvCEP4pwt&($PslcQ=kwiq&?fi7_`M(=pn8o zrzDlGJyJ%&I!AvG|HqOx(+IW~w(a;Sv0ag$9u*vYy^xfWDl>5$=Ci`ny|PA|z*ofr zp>y;15ja5RZ%rwPYvfU3*tqv)Ic zOqN8gd-Q(@RPOXwYM%s8Rr1Wvoh)&w069QD$8lvf%(~N^JoUvkQCE*!GmFFba+^@d zL&sxFOVR%8Vd#PkS6rqY|3f)0_x8(eh|?UX|3O$!$bG+O@6FTV91_v<%w5+Zhx~be z{V{Kf#>riYO@n>wPVg-eAG7hi!G{gLM-o3QnFS3(`=XhmSBWNAw3(unJO1|WN9=TcvE4cT0!v>WP+ba*pP z&PIX7EVWnEdN#aKdjSrAzajLEY>0a+h51G z@p)rWYI)^S`Hv>4`ee|QcMEXGL+X6XF-=2W42$(K)r41A6c-QIehlp#o%;6e**je$ z)N2l(7`lcJ_t}3pHet%=zrQXn+&M9+cquzeSEAzC`I~!v)%G6(E_7ukP28~w&gQ$a zlf-lEu1nV|AM0tMW&9Mf?FV+l$_-c(@0se94bB!lv3BnDR=L_d(a(g9q76T`M}_&q zVuL93Rf#TnWrVNAET|P&o~HH!)+OP3Wou@UQ`W5xu`e1ek|QOZloo1yRe z5>KaKC8&Nl$7 z5wP(|6Ni?8_#D}DAc;l;d&nbX%TF=h_^i;g++jJu2ALwfY9h9U%NgS~~?rC9SA zhv#41>7uy+*J!jXd0>NAg9h3*9x%p>d-OZvO_?B31 zJa}M*s8%o!%-Rgo3#4AW_e+BRKAy%t3s~?_UUqT4Kf&88ZquaQY+nuCef`G|lQFev zPS=~Trq9JB5$Q)a>wfNqOc`%qjeU8wdt<){Ie`DsF6M8JLa&|;_Vs}a*bt{3Ck6FA zK1Ri1fI*{CL!GflYHom9g;SPKou=6sY-7NZCt*{g_NpgMhqvSgo%kzsJe6LTPEE`2D7_x#6NHo+6zoFTJ zF*uDoCLl`uQg?6mBV#D~N6Dirdc}-7oo2LUEd%_PLQ2KQrO8vtdwNeNpG4)BD6phy zx^CyR6H%aEd`xNXJnLh6E$IG1t@xo5*H+hcV*9J(6$%Pgyw>|P=6R=4P|DI#w>4eG z3{Yp_mqq_)_~~LvS8Tz&41&EZzPRu?@AKGO4S)T&O%h)lO>w$&9Lg z7FMqE$FdwM>IZNW!zwQI%$_ALw`T(OPLc$g{{iVN=rn5tEg$FvYtin&HA;+zLFlaf zK~@EQ90z&tni0Df-xg1%ox9dA;m|+BPx}Jr4*-MZYchT8zycfBsY@HE&`;b&??}Fn znVSq&7!GJi(T8xN?v{N(BC%%4KKxp4@{W7~BFl?wa9w`|XOOB%46T{(+t1`*X;YSn zdp;x0Nh*+*4rVPCsX7AI8+-5ZB^LH!qAe07s{=A8b^;1?OoD4jDazeuAmNaL9DAY6 zx?U&5{)ltZM9N;MlU9v$Qofh8_a3hGUS8}{nShl8vRF8)(AMSakd%!QFmp)9sK#68 zTn^4TQ{M_C;Zkn_rLJ)SrpOMh@NNANBzlBv>m@}GW$*&TcYRP9K^fi}Phv7XI?GL@ zafDPAa6o-#EB&JcdB}!gs^ngPSN6pj&_MS@>5e@-(~dbc z2}~3KdJuQCzrl^!l4?Axq1_qhhI1k zWr-2MniM5u#Q+XYvEOHIP~1*tkuT%hNe0P-&n?*5>Ew3bw5VP-gLW?sOWZwrZl~Sf z6OI-D$}dKGut;s}1aIAngQN-SD5@4&Hw8iG zmznEhASvueb#VcQkQ-%{L+zL%Npxj(l-Q!SYu;fH zwC-+e7GC6Cjbu`lq7VlX01&Y8=d~#ucW}Q^>}G5^cZ(|pQ7q)DYh5;wCT38d%q0Yp zZ*ScBY9g2PIAfG;`KFHOyQFi`Vg&Ojh|xykNIqZ@tt-M@^#i7ttKdOBvB%B44#rf^W@IW`eMFIVz=S_jPEE zo>O~*%r~O{^A9HL&qW2c$B83gu_53Rb4upeif~7R1%5wtO`Y7wcX3N>?&YAfO;T~8 zL-ynL79o}v<%I&E=t@(B%a+XaW0$J>hf_O(I-$F6XtI8etG#EG8FZ*E0OyX-XAAEW zDN^+?1bt6=n~Lto)XBedT{mp<>Gyglz|a6}@X7=S$t4*nI{T(MxZI8q^8@qdI<_0Gr5@RCq176{{k78bV*jvJKTXY8y z4^8^vrw*3LwYOPW9W@%87myC!d9Fgml1XQWnd`lTatX;|tSL3())t1M6~ngM0ouAt z1zq!o@rw{Jg|x~>-1gEJ3qX-sR$n+;6ZllGM9-SEgpoi&yl&{&{UAS)9YC!0VV;`E z6`H};bDWp2kes04thFTIm@B&814&Ea!}ju8b-nQsL^N7Uy28i~d=60qy@xuJSra7W zfPaOyPFsN!h1q}$g_sNCtX43?6xZJEkeuKWE$cEw&p5sksuOA%-(6~6RwNFFScoSC%&S>d z5d$@``}*~n0iT48=WbC-R?HpPo2TyIPowKj-I+U79gM-m_RP>YZ3@#QWg4l0;*>wH z(b-*dC|~t9&KAgTBr}7Gh*hKGM`ei-6XoDx`jUmr1kSlbL<(n?)o(=RkZ5f5)!$eYS_r-dYe3MXx~ zBRiJLbSU;TTa)qN2F1d=t(FC?UgJn<*fn7TzMN+{=lxUgliSY;PyLR@gWI>cL*QqW zkCb=v#OT1L&?Do1k)U&J>t~}>!}=4GDif#LDgXrdoE1jR<5CxhMlCgC5<0-?pouH$Ha6te%bb}#0as4|?~_kdt1Sm7 z4HSzp542AAA#LpX22!hbZ=hOP>eX_@#+6<1>7li?PF3vj{e8v4V0FgqR*faCE1X6y zCXgCu+=Y*-{jNDCX#eND75;2BOlVo$CKsx!qbE`xGO#RG2=30v`5acnYqw>27(`+j z7%SZ|B-D4ObJz20)3+O{-{6Sg7jp2(16e0A;!P)>1eK{)7wLyw?_WEIXn6i^4B*}H zQ7o4g$*UA)mO=Ck{eu%tz|H6c5VV(ZyUi_)JA!}sVQ^l*;asz5bi>D*(H0kv0v$DZD2`+gPANPdqwVMhT~r zO0>4Td~Tb9Prg)aWLz+7%x=rjyB^x0(|=eQcT0r9j5E*qatb)BJG?bqM|lJY(At8W z>(0<6X3Lf-2+u@4wk#e+eQXV~G>+W4;R;w@!J7pND{(h?5sTUnef$M%LT+%Z^-#oW zrJ*O}pOh@-@B<85UO_A`>FC{Pcw~}v8nK9fXiss~>aA#Tm0tRG>yXPS+Sl>n@@C=N zP~qv1x@8Bd+y})qYM5?6_xHD3wj1Z1ZcD`3*I}3vFT{Qk-IYZ@QG>p>{5E;0qv~p? zmmtkCAR+4>S0#a)FH3fOZ7uEysR1HQ5#hM%U`f2)+GS6vV>VCSdeUqd%*1 zE!Vro+cv;qlI?E>Os3HMNgdi6?~lrbb``tgMyfR`DT)~G(gA|eQF9#lRb3ZCs_Q|< z6$m$O32gDPwrRQ1B-d*RU-ISgz60j5WyYAC&_+wIiG>Nu(lEHeXYU2O&4=^~Mf7N6 z3-=_j=%%YTE#7YZ4Bo$~QaM~lK>uA}IxteNq4F?@?I5|^R=c935V@v=YriWYGQ!#; z5#E4JN!a;NlJA;ITtN_bkaG?n)#nrugrCn2kv@E34-&3Z<;`-C0c$+mn zGP-OSVu|b#9+6%`gu8r=)Nv5v>>KJc5_0$vTi2b&)v*n23rWjDCk3TdG&VJBD=Rsx zT2|EQ+kurJL*R2lV#G(f?w&>0tpv0iDtlhZL$uRe0eRdhRRNIPo|;PZV-ul@pzyv1 zN{H1%UOb^*k7I0V^<)WAIj0>rQLd;8q7=%>BfOafSnYg7k>BaV$yHigOi-5)RbcHBfn65_Jfh{q`IAP}i z17weomGw5H8O^XQ+-KV>V-aO$+?w21d@v42zt9ubk(W`Dz4YLszLbjI{?`X}QOnGJ zcCFz<5-ZENH+1b-GfMcdx#NqN{?yD9nHuafm8dZerkx^&L2JwQZhqhW}t zC_N~RCBke;j9=tkRV6Vmgg(-rMH-$QQ&S|4$RTh@t zPtix>QtIDUi1D&7CD3D}IQ>I;l~P=BECUA+TxudqkMZ}zAkL_t_-7Wk-L)EUxOH}8 zOPIJ;f{CU-`t%acddYWKG}$alKbWH7Wq!(H?*`5sq*kId=@+cOFZNm80OffJT~`rH zijS| zavq6tr`{h;gRD109}9D>)w;Fn;;n)! zy|(#hzzrtiBLH*?OQ+7vJ-i8&XdSGH=o0B$Tq>Kk&(2UA>OGAx;b@Z-0s;DPeItDP z+JfK(jqi&YAxW9Zj)h}d!e0%SaCX|D!XVq4%;pfG>lCkKO=xHoJl9@t%*w zFXNXNhG52~%2w`8KBS)1?lXI-x0EOrg1bR{Su7=YjMrZ-=ZL5xY5R!9AJ7GzR4l8u zAnMv`BZG#4t%V3sGRv}|TP2h#B z1cYX-+IDV%4}+$9(%{A+mXV7~eq?`gs>g<{4C1O-QP-i*{2a-_<9`zuOFld(9c1JL zU0dKofAOkDH=-S#pdpKymJzR6>4a6n!g>ZHHgRK`zn^%0QoFYKIo^`+Ekov2Qi;3? z*Oa0SLQm!@{r(>ZO&l*i*#--m2^k1?K87GQZoiWG^q@HUSp7*_JS?p7!YHPW(rmBD z$)5El{>m;iq4b;Y@xq{S1C70tlu@a{l-Eu7llaffs(vU-CwbcAMdhov9+lpY>=a0R zQp!S7%!s=6s!8m40q2>;#ge9sNlD4e$-|np00q7_%>MIXx#K9^%HJ|SF?yYUa^X~x zEqLy`a5Rki*K>xStRR)b2GawoJ-6S4jIFW*UyYGQi(Ve*Q86ro!_8YSZ!UuNREqW3 zD)%8wC}=O%!djPm6Cvt9Xa*D1;ysT2#T_B)SlPIqC7rE;GUy)93SGnVs z`dnO8?6vHSEDxJjs~_wwaiXFYVaHB?!tzhw$IGVgM7WijKSaE2cTVw^y!zyib!lO` zd|87Y@MJ(b#{Rxvi-pDh$>Zz0O?RzB(q-h#!%|CK^&s7&vvU>%0*7Ubi)A5EV`|CX z)L#jxq^ztwhi%>#C47s_X+py89ULnWf&-|Bha(gH5FVG?PG*|#zc|J1NhK~=(X=dq z?T58)bar*2Ha9C3Hl`wBGkdXJSGMbg3-8r!u?+;3gD|fGyC%iFSF#DO3z=1Ek4r@U z+M|lG{My+MVPO#WQsdVFTukI%B^7s-%$y9Mn$1j$>pZlgw?o8j<^VOIwBavS>1aiQ zHE$jC%pA4%mM~nJ@f+^LX23}?fg8C;0Q<|4{$;$1;);oN{ww9#CZ4#Y{F=j#n{vbl)dj12kDi6|KEdP`sVAqj+^HFezZ{eS$$#m-6l) zR)*^UW3rd$kd5x_63D`RxS`c!>3jy?;7anbckXd?l?pe_@6E+U>_8f(GhzjD*VG-3 z4(M|?Vt;U^bLq6VQkrCU{WGT&4p%7$O(b$z&8$QY`JFSgrn|IR%}?rHFt#avGlHl; z#X(*jk~3lJG%_c`wPOP}E*&A(ao#O+_=@zTgV-)*d)JQ*40b}HIb#Hd3dTPww(1ve z2zA35klAH>sA^<5uQ1<}h`Chq97312(nXn{Pkci%+*GYx4ssK@TE$>1ApmOL%0+RI zyE1jY91v{z5aK~9^Xl$)3}sm{0ErkKV}OTv&yuz-ZBxuMIkt|EV(*?F@B?*S3^Miw zuA79r^lfMRN@I+sg{+7$-0{9wo^OeFx?|(?uJJt-fiOqr|6nLg@c`b~g2OlcO@K90 z^`Vk1T`H(Y+Pc3a6 z@7SB97Pi1OT=V8@XAz*_$?Slhn_avQ*7S!c} zU1jSUAueXhl+*COKA7J|7jKM;-&U{!PSj46C<8_&W9ExhvTqJ{GW^~$`qP9_dI$~+ z99JToOnhd}&JEpUbbPuoG*s_um0?a_>P!M#sR~`^d#qN)V8xb|i^KR!;a~&tJv}#3 zG4sN_ehF0oT}))3oql=Ci3tcoFAsY^KIXYZ2pkXD=#@ZncUNg;zrWA&n+^E>f@VHU zHluWOcx~|=Y+y?vP(}IXz^z@rOg=sTzc~(m%&gQ*bPhwVLl++pI13F6>gU&5?MGs& z!A31OyYbf$HV8W#a^H$H&g^(PB2zb9UQYpUpt2T-F@G|A!!?dhYb@J$I(ccFeNpbS z&G~OTj%<4k`zjna4OIefSH|D1DLv*TK7HhQq#NySP+o9~kxMtwl27r8Fz09~1b*KZ z$xEZCoH>itNh3zWQTg^fadlU^Im+FW3(|w4L9^n*$Y+^lnwU~8(&_OOc!C8&?9BODozEfDq zp7|j2H&-9#tugzOy9Jx~a9l?_jw_>ifaKG^V>h;X>MY1T*Y9hnPsJVq)R=2nY{)$M zGGT?7?Z;sxb6W>Kx+Spha8$<=>oX<=kn<8t}cQ zMM8|LEZoE(RQ=Vqmz6(UNf)Mx@hhz0mVY}SaE=m#QB&KHWAAWutxwl^UaE}{_%$4O ze?;@MpQiewR2$xLxM(3|?7ZQ&46D}o>Mda8LFnzl?;K$;0@gE-H1k{+Q%(3G=Y6}X z9B21x+I_{s({4cS0Nk`$MOShp7D(jR70w}ni<`8_vzNL)n6CZWjP>a@|J!Q-d4nr4 zo%2qnT#mv6BdazOe1b3Uq|zww<;6Dv;hXW%DItds;MnQI&M^_evDg4ZwQVi z)jrOBlWG^csp*@z&r20n$RvAosNRU;o=9hF7xUkuPcbZs9kJW+haW79G}vF*-+D%P zpxxm5GFte*!V0sw&!fXWy%#&|B@j2|m+Kp=tQP#9oo*-l(_hm(ibo0Yj-^I?nV3<) z1YzayMs1N}e2m+*v4EET9s2)Re`hah2};vXwTg17Vb&XI7tXlLOw+5rG^7E#ET4%| z>=vt%&tvvbl1y%YjM{1CgLFN_Vg+el1*(AE3-JLbGpvOpiB1JO`y8%53kw%5m$iNC zkIcS4G#pM@+RgHbg3TU!)+87vrz)T-Opx!^!zqo=l@>7Hja~-Qp@AKQiF`1Qo)eF% z(>2EKSD@bEA6nNv4Sq5q10Q$RZw=AeGMsFa8j}fHUv@4SpAfU~u%2X|S&FBvk!SAu zWo_@gpP}hlO3VbT?iF~L64Y;4(-AUn?IWea%1H92F2elR7uF%5z%g@kfKi|-u`ndc zJtU(F$rt+RC>^#-fAkiTm+VaOs>XJUwwu%bD};Q{gB*U7Xx@N9mok-e$$Y|{t(G{qNod30iP4FS}p>U#21%XoF-2N z=ftf0!nYwY+71PNzhoJ!LX_6Zp++Vc?+WeOOTd)T(v6p&Xs`0*_s7gvPKrNr$p#PE zJ&I7P9I{n(+S#clH0ur4>#7y?lxfQbn=IMAjuZtsI?>1q^C^ihE4W*2t`Bg07OZ&u zEcPwpY`n94506oc2`Qw&M0DV8LnpXr97)@-2rjSe&Gla}8%|1H8wpJ|%2Xk~ zVeD1V>`{vq^IL2(v6!oMkxNi^-Mfa1!+%wEickHYY_yhH9&3}X7s!oF27Wd>ybHWIM~S)3 zmUto6(`-=O2fimG-h4AgR1W-jwvxP}cvP6~F1lb!8r)wr47Tw2i|*H!9ZLUe2760W z^Ud8Z?wZ>?+J-Fzu3w- zUH&avEoFvc+5*~-7CeDvQV%AJe8p-9zn_sxb^0X%r8JaPd*(0TZOzPIpW~A6Eg!_7 zCx%i-)p=CfO7Zp96Q~2MN$sHT9%ufx=oNsps+?p9VIPn1XDte^_HSB>!MqkEb?=Rq z)D~&X%=><=_x^6W0Osbur-m5k^7^Hh*_nYF->p_%dR`qr;b@x9WgolQ+4y6}qma%K z>Ma`p)PD(4lA+}9rs6AEHJfam zMfpZ5aNg9on4w&0M*YlOQg87A)BIQydFh%In%{Wyxh~4D zLj3Eu01#r`$Zt-;;I*f;mAI#B`U#f|**wMj>zc+q8t0yoDjBAk zLcxhK(@KH5_+S!l3Thuq4PSgPK`X0Bq}^=?Af(AFDRZ$S& zYy=!V@(;cLB1RPEXp56sJSHT2;+~41G_02Xc!j-#9{tFI9c`!t^Xa!LYkrg-Qq%w}tJA@w zBmXYkDb96KW&LkR^QrUdziM}1n%;DyRgJ0v#fiTq3!%2YBRjr>I-|5Os zt+&}Fg?`Q7WLfkC#B8~9@js595@4;R!kybUzYI&@uL-KfqR453?_qh1k`uT6{b01~eixy1hJ8MYQP++s#DR&gpHv?R=^|-b^pe4!_#*Wk{c#sTL4~zzv3U2;RpWyXJWip8Yc`Q%a zm;6@xxsY^5Jxc2}bv?I5K-;zG5lxt7`HYj}|0Gc(=~|rqnTL6|l49cHeJKsN3wwR# zsgFDAUV`Bwmn7D&v<#I`Vj4^*;6sNczgHfN6=-_O7i&$Bi?%g=7NC?uz86>+Mz(8p zc1X09;p=D3n>O|Aae8Yz`;huwu~_*hzfny^lcf~}SUZ$9>X_G-lzXZhkTD}{<21G_ z;%1RgBaOo!V6y|qR-a<@YC?&%7Np0oe(Tf)pP+VEiee85U)w7H{Ho&V|B7miDIF-~Dc)|jwz3N35{y(EhT~$(FP+-| zBmiOfdpsYz9#Xa$zDiA=l1=JS%Fy)8`&C?$Qm45LW|AJX}pXcF_mzVw3hk}KBpFXSgjI7pq;T?tkyQ%)QdA+osb@s`s z@LXvsz3DsuOs?}h_A>8Ze{3ufrW>$oA!gc|*lNo2Hy0S@{y)Gzai=fF>j)O&1LW`u z>NRSOHh(k!n&tdN8YcCC=cYhuS)9EK*LDS^;9Vrj9UFeU;H`W53tlz@@NTHUQj5}x z&7`0I|FbKXIjRs3zL2&1$~2w zdr_2l{Mpnyv)`H09JLEyx_(P8qJKOV;dbRgS9u2pEP&LnsG-;N{cUB#Ms?o*n7UIq zKPkI(ZiJoE=5EyEEQ?xCMi!a;FCr+vJWy2j)JW85Xnpb&Oy-sE75MmV!71W{ixi6y z`^V<7QGFHw&EWKultWLw<`DLxJPE5#h4LM9j~nbOw2)={^fLKLXAI?epiYLH$3#iu zdE~?20C2n|$g;5dcIN-F_SR8Vbzj)1A}XLr2?(e(C@FbpQ0eYY0V!z?odPN?EsfFw zhwc;*q*IQ>p}YG42RPrxSKpuDd+)g88}}avL$_(UjnLI%_m0U0wxR+&h<2-VhGkX4*%W3va6mpl*n(t}2x=pBVMhRK1oWorM} zJDZfTH$0bK4s^;-qD#wi;y%tl%IR0ge?va*)b!{w2K%Upq$)GCgp|I&1I;zNi`l}T zkE5%?pT>f{^j>HN9s-=DN%AC-9DIdWb%%ot&@z5X7mb><@^qpQMY?L|fLk|AR&o&2 zUp^<~Wt{Q093#&P!G%+@6N+~8Gq_jxou4;W@Hd7WoR$qPmOQ9)CJQB23LtrqpY@z~ zW+P0_Tn*g?TYVjMkA{^+#c5wO5T|yOnPC0bR{)Mq#DiYZW?C?{)5w$;h>MO|!ewiU z%!|o`_4~Qlzi)X!s^gAvuavb_m@>JKQI5Ww)Z=v#7#p-_f`}=6zlC|5eFg`#2Aq=% zzIU`5;Vt@_14ElZ7&7NIy_co+?=>1f^ikQ#^A<4qPM-*HC^;qE81>>fYyTLBX?W#r z#cR=eFK3(9^$`JV8aV&$$piOwL~eb}ov8g&u!on=ega?3igW~jnv{zGVGTL$>Y&6| z(vR%(H%>$QXMxyr@5v67_NvEJ`;mRilh@Ei>P)qNpu|T6{afgJ1@gr(RSo5{J_kdE zxP7|RoT<+Bsj=ij53l^F;RYNATu&)_>n%doN5Jr7gS(VpY^gu1=0cR^238!%c{n3a z2`%uCu+_;?wvW%qE&a0<8UG2u0Du=hp=GD#FpG!47YW za=Cv>zv@X&VC%`y>O2JdA_Msuk)x^3QJxDTqP4nTS{lO9MDN0w{nt6Q(5t{zLNnW% z_f$yy-Eo|a6&0-^O)h=gBmd~oi5>{I~*>Hj*ZDyQ0Lu|$mxgDi6j8@T* z@(q@X>gj27pVIl7uA87tEAq;WliY79teVVbOs;J>5hu?|R&_P*>ZC|)m>JGtd7HS2eVIl~E{`C^xOka{svKpLt^}vKYW{Z?;usrCPE6JD1IuQ} zl30>WZUS)FOV#O`8LSxRQOk)y zGNACJ>MEuEQX_n<&=Osc`Lct-(0F=$L#Nhu%G~;qElaNeAehatcRS}-y+)p8Z`E|eej~Wc_}G}Tw7+=KzmohI{S@6A_Wc>M5hwFevbJ&txR2y^U(?RJR%TgjkKzhkJ9^Qykw ztcldKtCI&G))1?E(#_N*S^{OvMdkMU?y4So^D#T_Ov7U@6yM!?ZX0#yRY(Ov#U3X` zEg&#H*Du4pmv?u(MH$9HoP)Fw(9bQ)Fa0ga`pi>fAAKzMQ8eh6+-S(30S;KYHiuvk zo?dBc*NU0Meq)W$>Z@-UJ`oB%;|$bV*{ymMR&0+qtF%l2`XC(=Rij5)YbpY)eSEyW z_;s1H*zN&b&r_YRuvD|(;cQPxNUt#HIxAxH;F?u#>?E4(jV*C% zM=YMAnU1fJ3Ia`5y2Em@vi|x8$7A>MtVMg1lW%qgPvXTzXD!dZ=$)lF5?JB@2c(Hm zx-q)~J@HDSb5b;a!?U^@s!?8&9g5z=nAMIi75p0Y4dsi2Ocgvz7DGBw9ajX@1rwQ& za=h!B&mUf9$wK;Z=uvMlY>VWB#`{up59~s>SS#@UI){A4=L~yGDeWzAbW)LD;%%KM zaD?+Fz2*fvbRG$!aX;8{sF_9$ykHD9xAo2G&)wtc|3ggw2ga8Gor}Kebqeu=Hn#R} z-=0u5dCUY7U#1bjokk~*Y!vPAV{cbFcZKi*$J{dr17H4LFaQ<&2?Ro3Xi&G4b+K0la8%`k)18yl8*wD0MFC_n!CxB(h zc4|bSCK08{>;o%xgLNTj&{a&QUS>e)RdtfE@7}I{1GQNEC-|OqeSYy#P32Gh?4L}C z8dp5>S#8dfd-x!gPm&{FbvB6^DG%EacPewtF)5t`wrDdy6R{OFU-npI5&6_js}k5J ztowY4(z4N!|I5x_o@eJge@!Tq(P#EXdCPOp5F6;5LQ&AqeBAE8BG!K8LvA&&Qhl|i z$CLF@>`=;rn^63#!%9wo8v1)<{QPWJP^&5AnPRm+Vw;Gry@U3Zk!wFLnRZZ9Ya|@_ zZ~6>y0?WHnW;x^HUIP61U`w=3F3%D}<;vY4nwO*8m+x=6g3|Uzh!0x?FH(ZXL!V}( z${skcY4G5x!=z3dOLbMtD$OrFj5(pD}sgJCblIen*W-zjU*5iXbSM%mGN&v} z5Uw=JDAykh7ApIJt-l=n#}X$X!-k%2d@c5yZ*8psPEhCgs9oM}-i<4?@^D~Pu1fGM zB#iEJH{~`YlwQ18=6u~vVNP;|5@R-K#5hq>dIqw~|M8k%KLRED?(gG5+Tx#HtYnF^ zQPd_EaCltKZ?4LnYXk9jONjanJ+0U&o5l%9Vj4SjJ=+yLyoO7X7nq#qC_^Q!W4F4s z>esER=2hVlgbk@l>SMJ<+qUrZtdp3U6_3~|K+&~iUL}Ngh6LZPh^E9tfngs`y%kv4 zn5gNkI|?aS&2$zsZmq73t|Tbn2=Nh>EGj~6=g*xe>Ptsb0w!Q`HDQqnoOc(6XU zIC0uj!KfPSj#f%l7_;$wqCiu(i6in*26?)%0^BfKGaFhn&V=NS@ai4huRFFDScf!B zFXYL&9VE^$9r>zlJ+O?{H4tRuF^@`0_$+f|!46zuAz6Ue&2s~FZ{c78RL|*VSh8}E zI6Q&IQPnrO+F-OAxM7sab?ZQX)GAECeqGTU_aw%H{~=pbVaC=!{-E%2}zki>Q;Zl@|i}= zSs#(!-=8JDg95`WUN&PTC2AAA8)iMeoVBt(ato+vuO6Y~t_#eanxDcvW8Em>xYk$35br14WZ~Cn zTzhN2dA(dlj4__oOd)p!7e)~SQhLRMUQUR;W8WexS7kf@*Fl-u&C$2!{dCfx-ToPr zr&Km&UU)TK$Q4>chYDm9QX83>g~eUfc~UA+*Pi5c*6cC*qZY(Rgbs94)r`YW?#8$2 z?S1ItLd&vwoX6}$M<4e@PDycoPipq2;0cRUGbYH`?$}>}XWmGDZM3R+ea}mZh`$G8 z8^wnjw~s#yaqxPVG@J-xzygD7qUggnv`+YQNPXvwuF!i{r{HEbOzy+0f=Q}KiuHyj zH!;^9ObB_1AFNjGyg4OA>u&6Og+>I~*_G{uWqUmwq9Gb!Ro99xQJ93)I2jeQ{xCM` zTqf#q*L#~;wtS@MxwJMCnOsr3ucJZqJ;z~H?2+6d+Eq6_<-o(bg)(cq>N_(`p03Q@ zyfDy_n;2Zwd2>m#Zhw6<-fc44Dx~&DYfY;vwEOg_ zLGhFc(y6h;W2eJ{`>;}{s|X5Ww|XT~;tD)i<}u$b1^UOew)6s)3p zF)FM7MS^ag+m5Ut+n2;)vD0PVNgjCZ?XX}Yi_Eq9;jWtrbzA&MLj`-zuNt~%cR@QG zL`~fa#)BsH$%H^NL~#Auij-)5Vse0-=gGAZLfmMN1GbbHel_Bdp#pe(`Ae{0@8|D^ zo(IOGo0K_c?WY+~Gd51?8x3Y##5e0mSB^W();FbePfn^V@<}&z4+5nYGO;z|`k-N+ znx9@k+a~NwR@VxWMBhYbxwWpKcj8S{qVCljS#gZNt<@X(u1;DHG07!0{mz?!lTnx{ zy!!TqN6L^%H{Qu&Xb1s4X+<^K&}vBf6ovvjTV$|ISc#}JSm&XpeIB~04&*jeRki^& zz68`<=gF?N^AeR_Pt=UdJl!ng<6taE#w4awE@PNokPV}W)s?NgW=)3MR7oI(3)Pi8 z6;XIZ50{CH=RXsO*`{w6R?=v8(?zLv>Rvu;SOd;Rm=5Y=ZhY_iaJ$+5IsqDACrK%> zu|kc}P&u2QQOhd#V8NlC0fIo@OS$;i_27ALmuGFncE+)$%sT()sT)##W#w>T+hHs$ zJ2yCtZSy7%oB6KN$LHGBx`2)RCq8m(V4Y}YJyFg(D5CmhuyapDYmnAY%w~=xqaU+sEOlf%5Thn!``4U+~vSe6nyhmgTqP84d8B#W|5DW^rB?e zLrlZ(RrO|e^>%hBWi^@e^swd^lRW$HG#t+F20Wiq$LV`pA*#vI{B(oe+TA=|O{rGX zgS@ZKLXe_eeE4?YR$H29sTO!uPLHY7B5U-AxgleQ#oX452BoagPtJ$4$~EP44NIo2 zZ&soNv?9D&_)?~Tt0BG4-r_`l+Z`elZJ(HlA6$~@aj(mINqPDOi#EooKIK!v^45r} zfmeh7jgs~$Ywcgr%mWrQD)%hK{)qJTzGnuJ!U0Ssh2vm?O3y1E{R4AF{ZbxmB0V7H zx>!%x?X0(V9>}@@=PGdjWxAg{L~Ym6UJ>V2u8+OZDN;A3b?n;Vsq@UuKW)3MEFWHf zxQc4!Hakc%LwFLqVY8Q0^;q5>wR=K%|4mLmjz>-jNNnCL(%&jnN3o6zZ7;|hmgPdJ zM0(&@U}2d*>}H-Nov}PoxAbY@RiM~$xRNDGmf3eZR^fTa-UX9z0%q32T|uh252NWg zDWKD^g;EV7bKOXoW zql3^*QFR2>f5bjJeg9(G|DMiXrC#rWaG{%+((SK0t2+)!8A_|=W8F8@#X-v?k&Tk$ zZ;#;g;lLS@TD|;kggkVen%UK}eA6dWaCKKCg>p1kD8)r%+$+ZPt?B6_!%gt`pX3v#U${aZmSFz%aBEq;nZ4F*Hq$+Stp?mN@f~Wy20ksZ z7sedXp9euwWpb1%74EC5J=5$cn#LQVOkyOW!HP_+}9IDHoN-scW*}b1kr`64!dq<0RLZy|wn7M9!iTJDyOn z)pg^_~sq?ItePvDdU#>&A9%6p?w3R?6Hc(?Nu^Mx8mz>QkSyHl7Aqi;pcO zDf#fSNgY{(ZIbZr%f?aA(Ab;zhJnnn*xXp^t<}w$+_7yFnnW4*zdaCbY4MqRym@E@zeF!yI+9pt2cQt1hwShyWmD<%t_y4JX z#;2_4t#w0mJZow*4j4~_bj*q7$od$4ptTzzBjSZGsZ8hgEj%e1lalW7z#?JevFjbB zgK^BzjjE2$h1t_3v1~)iw_`db{*|S4X(Kn|t9xiPZYfaKJ@8S5EAzU{m(dNjd;IuZ z`#q<&Z`%`pK>c*u5h|6h$KbUOw=pbzvTfl46cfW@BKM3cs(_mqW*^zN30qM=C72~I4!{<3qcQ6Bziw; zB-y3fye;uh?LE3CV(5=5D4=TOaiHv1hTjE6D}si`8zDe>Ysi*JiJt$fQ@)P(_o4Hu zbTx75^*>t<&hM-GnvM-MS%KUm{FKiAyFswzChSKr2B_ZZrpiu{T5tE z>h;H)SDoPLZ+*c|Pi{-dnH-9|zB(&JR4mlah1>LWt65^=Z6u>6t8?F%E98k!cWf#s z9JK8!d7t-eoGiz0tbESv=t2`yma~RS!yUjTPR1sVo{@>`D_tGIdY%+K^l22VC|6Oj zvs1iTK8DQ7BTW3h%9yDh6HOl{5#x}1UqL}5``;fn>OzR8VJ9=mI0v`zr*&?g1zq}g ziR&0T*|sc28ra#7Zr{b9mWuCBB)BkycOyhdAB8?byi}($g^yCYO6Usk`v3h=xrY*$ zdn0JBswfRdCym*|(f;+H7I+J-UY`+vEkutD-U@8y8suxrZ$nKjLeb*YFf^pK`D3I} zn!@3*9*2&SxEf^dwLvG2DVst_Hd;zRWD?H*UU&Y}3KMqqa->7zY7tJrAnlt#8<>6Y zVGM=Muys@n?%kUre;DYKfp)kY+3H`^Z?vZQCQi)x@wfYTFW4`XDvM%Om}eyO3dOE~1q$ z8%9Q#c{UQcy>a8!*Qr)4Z z`N|wPdQHmC$;Y@a>9YL(bZ!|wT2o^g8e+P5+=~~sqmvd{>0oGQY5N(Y3oHKXrSBjg z;@wlWvp@Cdw(=qa{xpJn?uLStV_?qgU!E}k#f?IwDrk2b~*XqdS#FTDyYD%~AUV2$PL#lm7 zpsf*U7-?rmU>`?ydz{4Dr3DdmJ-CQdB5Em*J`HD(mXTog!KDX62+(-w5<8UBp^@oI z>X~xp4vx5d7wv7NxXK$zA%Tkn<)|JD;P5qO#5Lpv9_hpNF-UG#+dLIN(?4`RD+tZ< zFfo?#oNev>#;n(%(6;ps{ny7>p~DVBtx_$Ap5Gj$63Om_hfzW%pD#p<{#oYz5Vp{i zx=+ory61GwBmuGny)$1{t{%MjU|Ue*_l$i+Q1lQ<))R5kyX&%(vLzHB`YCF~gV$qK z^%v@|Ro8Gw+rG?r;!f&d##T*3%ei!8r`46pR=t;2Fv!gtUPvA)0s zWR2a->8dJq9&-1j=QY|WRH;wbvec4Wsa!#>PwCu=1fKCYHN_K>OR8yY)Wo1zmYj} zk^XCav~&N!u$?rwrZQ{tuj%(h3BfNQl)Pqtwnjk^)Dr&L20Nd1lc(nsI-`-iCgbwWv>a>NBAPzjG zy$w7aL<|aY_s(jt8qDpvGw(lO!eZ9451((Tz$j5BFQmw*5k*LD-NZ`%*1|6&OMPe* zSH>3C(_QHW}DsSAC+co1scvlOUXJam^|!qc^GQ=fU*(1 zdoPjN>hmhtFd)l)?PJ5)5%Ya+#S^mN1xhi}nv$^}|NC;w&>MtyDNCC&r{DS+I&mKD zJlh{Kf4>-@1D1$_pdp53V(d`r>A8VPwtS4JC;%Jv8N53V>JD&B->?=^#bdPAkuvA@ zh$xWev=z`L-7U~==ns9S>{~Kdtzk(sbXu*D-|A_8wmBh}P!2s_rEjcP>vXE$v!|^N zEz7^J6nfCvW2XC6fvmz>H~O=tiO2QI$&mSj1hqJUWp*NP2mG^k4QIOsIe)k%Q9yjU z)x$X4PAoz9N3AiVWy0pM*0H@4wT?%!D|bzXB(lAeUk6oC6gpfLTo;dAz&!vpPgd{t z1X#JphKl_TWb$r41*aRJ&B~j~PF*%U<)@G6VHAli`>PXbZl@+!kDr#PpHl=L^uxgU zu!$p)qvOTRZ%NU|j-5MS&R^Q3r&Q1Ts8Mk9@cN@B)#Uaz~Xm%~$lpKOv*+9mI% zr;R(fkwj1r0tnyB_9)c^c6 z&p>FoLrDE0A34eeA6)UF#t_DB@A>hA{Q+@!xIB(71?OAQi_l-`>@y^7If)r#ES;xj z>>s%G)dU^q5(#2ZB6DPHN|L>w?)q}Trb%C;vt{AOC4k(={^nrCli8P4+sW3n{|)!k zMW&0bo-9Peir)^~laMQJVm05}N#|z0IAtM5REo#r+D)gQ=s)ugD*IW4KSuSr=-fhv ztNCTcoP#BW^1KPppi9P2?X@q>*cI&_$lQS<;6s0UrE9c_-)cC$@a0k1ed2hFH;MDX zAn`$Og|t|jZl6o8H7B3Sl8d*h>Mu5$ISct9R!LCx4ExfIrSLvT(A4Rw9igh8`)wed z`^jGuLIJ4{OV5k0azuhLZghSYfncLvdLmDNXP@M4dC_^A_7827B`YhTz{pye zeLI>h5nn^|f&le1{u0&GGV}-_1-MUd1A5TO><%BB@!~Y7`o7#=u~AETM*AC0p(3Y}}Y0TY@~52LyR zmZ5MJ2&Pea?J?(u58rfO?qo$fdgLYmiiMLvyXQw9g6FFBK%s$Ef#9=Eq*?=#|7gQh z%3Us|pw?B#6H#KFau`%p9&Om6P^HM-iBW~@mme@2euro&^Av;VY1zYx*g5MM+M0D! zO9F~~V74GbmR+=l+kyMBT8&<4^>ACdF{QzGL1XhhA&!Z#-vq_nscF*LrhtX<%gybR z?k#}eZB5bXGAnqmF5ueg*)8$tfpl?q2GkG@2u=F}o*#Wn=exZI!R#of9Ge{b{9$efpXZ8eu(+3zvo z`rSjDABnfLcYa%V|j0XgJyA(sNK)cNo^`tW(&=A7eycPK5$(NKK zEgwDUUbR3E`t45{`9E2a5nsdUm*%XHoGYZkwNFGh1n)i6{<`XmvO$n%<8>RRt7a7K z;)gY`RV{+j9A(|983iljQJKVVunOAL{W0VpXanYM1DEiu5-NS317h-P8+m!m?pW4b zqyWiSoK;_V1g^D;;tt#Wu~^yQB4|4NDdU_*m1aAvS#MJHpD|;)&EM>P!L3QwFA0ti zo*DmPb~oGgj-IQ-TAs+%II5M7M0)$=K@th-&CkkY4*WP1>RA--$x98MvuuklT%q7# z;2Rj)#8l=0-+(%Kr|9k3@nVC`ocOlyllZXv9&0^ThFYC0^QH>z&Yp-YJredEf&R&{ z#BdFlN-<%-m7J&_4uATVe1X|T6*{wbg89w-(|o?g zhSoP?*_1i@NSVYiXxj-r)Ov^_Yz!L}SOWG{8_*DQjsvA#FSzGuY2C1%-qnLT&HCMp z6yAPtp5^(3^&Dk)=|WMeJa#{`XMn$}c_U!zRt+xE%aNh&rXbVOeP82w+ZPo&P*V;G z7#}MGnleKlz#~+pW$l2iK9%*rY(Tr|?B$`B(*$>a$Yv33kLa&BVd~!~cxD3Zb55n% zrj2w7WONk4w5ky=Z2%C@?=w%)#|XME63(xtG*CLJu8ie(RGgd)=l3R6?k^seyrlmX zB1=Wc*nN^^Vfq>yUYRfz$koQ=`oNb+r0KVsY}oSlB2?MX_&mDpK;9}j6s-co*YxXcY45r8E-+yq zM5|O+qEq}&s5T2ag z58#J+vYy{%Q$(*$QoLg8?~hj<8>6@#0~VEcJZD^gybG8Tm6EYExqt21F$Vs0wF%+& zMNtMVQKk`u<}^iPQpgB;1Ll0`}%*Fgd;KOL)?;V`X!yF3ae z4w|(7*KW!aqf)aj$1mCanC+k@;fv1a@@*Vu070RUDupyQz_Y%THJ7L-`!ll0&^e}o zXRff&mk*~!jfkIKdLjz{QK_o!IMmR|`&FciUnfs7=>&^*gqu=QKXpTo)HjI9|+NZYY zp~U@Rd($^G%CE5q;_CttKz3wI%UjHrLUU7S%K0ji z{BWWz=apP{mG*e3Tu46JyW6z>^!7@&X$R2ISrV*`@AcG&kJ!D~PQJSd@|okU#*j6F z?a{Mu-O*TFZGGJrTRwt>d2NTC*_<7|DL_Tc!^E%_R!_=Bq)2{3Kn_miI1uHe7IVt2>8%r{S7qFfQF7|Me?dQ2 zf_B_qFI$N+kl2R;%`xW2=u=JGyA)+9CUiToaIE_O=#3MHUOa6$yC`XS=(YA4l<^=<}Agmg{c z=kG(iSMv0vb3y@@VF<7cCsGf9a?0814nsJq}e80BH(skLfp!7`Ks8Wp#_|}GH@&-s-=C0-F778(cqHzDB z(KkAG6Lt)4IXe0xYPdVw)8T4pXstP=4Ps_$`+w6I5_jnZO$j=`qO}NUz*8WIq7~6j zU_h25q0fX2Hmi~pohRj+ujRt#Ea-mbA!# z>#P{Iqr&+2pn^z$O0hsvzkc_*B||4ik}*wy8wE+W?v4qbj_N;#2b@g|hTZSBQ$PuS z72+tJ9G2%L`XO*jWd7Q+Znn^UIv0ed*o_Bo3LE-@O(kZ|ZWwX&?+llv#|+XQbr|6- z&hE1yJN8K!ABzxr#RDo)w=b|6K7aoq*NucB%mxoMy*#e}fSVun#CmQBLw|DMe$Nr^ z?p!X6xr6RpJKg+>dX(|aRy#y@u5^k+d@$D{e6(-rtd=^DUPD*?{{r`+o{I@i81%e6 z9W*=Ddp*n@P(d%Tjl7|Xu^8*4qkOFtUfb2)ZIf=*-`pX{ zd&5-4uT{1cuL>8!=Ao#?n!I}+F=Z*HYKRA6hg6ESH-80^cp7Xic%x9_kM8cQ7=r1{ z`G?z=;$os?W94$>!OM4{kSFTHIa|(bm%`#MYH7lAE_cq42Z4D{JQR0}-@m(rC$g09 z<8xp{a<8}s&8aBqnzFvk*8K?rK*HXQx3najZ@ITGOjBI^EXZcp?(b0;pCri`b7(7I zJ?x`!H|KM_lpmYM2+_n*0Yt|Zv&kXEO7#GT@uH=TX4feKj56&a7yY|;mW_Q{|riDX^U6|?RsW4*K5KJ#S&>3(k<>u1kCLg1%U6Lleg?v$ii^>Td zzn3SERw@B<`BN9M>`U{dMt%LHv}%~HBZP4$E>olum7?YkR6HM%U92&_NyW3Qj18W+ z^-duzA<|wr@Dg}R>MvxzW!H%hmRK9iD5Z{};F#u@nyH@}`qWkDImjLLZF(+)7a zF(z|OKaxl=>Sd!u8!L|@sciGV&OcPDBzFYIXXm=ljj{{HA&9xgLz|1u?#7Zw% zeFY^8e+y{ho2l=aZPIP12a=Og?^@DJmKvZGeFHFmnn6CHISatz!ZpgvLWUB?+-%d{ zwfr4-qqHa&Ke_g{u}fbQSp9Fll=ytAi7@V>94|eg)V<)2D?UmXl|ID_X`+bbNL4j8 zD!%!%+6U)`Oci6y$$dTBOL@n4>IHkwzM=OZcEXEd=Xeqqyly?j!t>%+9myvi!vQy+ z6=b^i<8-s^3qGJdWD<#}0}~d?KpDhpIcrxF&LmZhU(3NGK?Z!oI@2m5J(K%%HeO@J z+L(|ffXe$@%0r+!(5m)JFPAaMr=2H%2l!WeoaOXmw5t9oO4#gLl#mrl`#c4`2MtpO zG@FEFF|ZZkwpj^NA5OVcVbq)s7Q8!dst|74_tpAc1K^+O12Kfpa z?MsMFiTX0?f-^#7hWp0mX^ew_$E@&j#krg+tITkx&MXGs4w?2beJ~H_e=LCQ_4CE1 zK%J|Rniegi0f@3*eT}<8wqwq< zZADw>ngY}YjZ(ErNy7}eS92a z@D~>_GX$y=l+6EDC%lC|meGxqHaj!m`mX{hP~)3eM%;Uu?pnj2)*#<=jvdtr5LP#&5m$tQ(GsWp*J0%&@~(&(FczRAKqYWPRDJ zsIvJ|gzWAc(fX6Z5F?TIH|cJRgwU3vG3zDXHGe#{FaR;uMg<>TKdIPZKx01_Q@+j< zLqj|eHkOviSVG++)oBr_e+QhHvzyWK2lD23<9tm3d*Nexbyw!DPFk4bi*;(kB@tym zW)}kJ!QKrR@txs@gB0kng@L{YC<*tsi&(=obwQ!Q4oCEA0>}d?ysDKO-I}GPRlsT? zhz>nnPof${W*8Klq-rpT-CEMl6~-0xiuhKJhCiK_r0&*!{g)V^v$IxJnnn1N6F>_o zYR^(QhP8ov7CAT%GOzc5cVF1$l|w^1xR(Ktk zJ*C{lJFUwn<&K{>y*hiNV@J!CA0E6F?M*P97N_nua(za=eGJOOy7Z*w#JG2rCo!er zs)kHyEtoN9eotbz!)T!K$l0R{dM5gyxDubm2A0Q}u<8lRRy7pl5EL2EI}to%94g!8R;{XfM`i+oeH9s+tk14MRRAm%FVYhFg z;NNn$busF$8jd9`HWvHfPC!$h`}aLaGym4o0gYw{4J zCv9?6j#1Js>ICR}OT;DwAJ4PQXml#;cgJ!_L4}l4J?)f_#DY$%$tJ4SC-6`8Ta0vH zqVezG{u7Xud660ZXwX(NjQ$u0U+v(0T_ckfpS%ntJQ5_Mj= z5erJ{+7rX^HU3U*`0m=pD6H>-5*OcGkE=zD>#-?dPG$SXaYHDgxUQdH;NTjYVUK&6g$nWm@ z7achoh_M3gAq4aMSr-AaRIzbCSk?C4(l;Yjs#KB6=nU`3i}Hvjm40xUR>=dy2ywv? z1_qrpt*E0!x(i&UPt+%_tAzuNK2Ca06EqAsRUL!NNb`QDH|y8jt0=x}GjIWng@S-0P@Z(ff=TWA8A|3Vls6dmFqw2f`R7lp_-Fhyz@0eyZzFLqS!~9SNDWz)y15o>4 zqfD(da&}_y-$F6|lvRpWLA%PWbYVuRNhtMC)tyixbDId{Sm~P98EzzUTy*|JA6@3Y zk(TVfKuJix1+ZReH-8QSbQd(;bE&POtl8uc|eItZWTsQ*g?zREmSwOyfta{l50YPPwHd0?4rR8j`E z-9SWLn;l{y7k9}u{$Vh@xOM?3qRI~cDxwZf;~fE)qSO@c4!T8T;f*-2GJnf&*ny_A zIU6Ho+G@?UfW-8H(!J1;IYE;RFZR30>uVyvyA+7^4j)E}Wlh`-a(FFl#2P`X0kwnM zm_K!_yp3}9e5)=@X(T!R7SN(_<9W}t14^^RbjP^z%PMYID1NP5B?rVqYD?kv8O>Lx z`QMEJHr~(uS3J5WUbih3p4=f?t=7vyW8f+ z^a*#3a&%N;{*+YE4vx9MkposQsJAE`rc08g4#jiZr^BBo#GGVSg@6|g)n&UiwaZj2A6%pr}bS`DGVZ+s`=|MW2^ zMK&OV7#R3F7iqNQg8~wvLKPu&d3Fjsck8{6^X1g>pA!*em5ML2-Nc|r7TW!4YL5>Anc3AOeXLRVw^kL9v+(@ zS0q4x+#TR3Gr{BYBPd6Q3&`p&{np{E4YG~(5#rO?bwsZYOlP$8PX*5*1!mAZ|Ei>mMgKc5N_}^^@We@KyAWC zV1W1?AIa+ryE_wJ;~&hTPGmarNl3=Ylr<&AZ~qfL7BEf*z0R!bKge{Mme-XGx-s^w zK*b8G%7sJElRQ;GB>><*{&oe;j%g(&_<_Wz*Yk-@>SC6qDl3cI_WeIl#HRiUzRKr) zT_?^{Fxii4#v(wUOyX6lbLD$TqtS^Yv&J^b{@st?sb6p-mz>N@rhL3OG~^!ti=n0e zNbBzVgvt&%@I-&(r{t5lCel#6F!vz*lAI8Q{p4d&yC#JOmr8+Sbqu7R8hhmW1&kF+ zKT#Ep0cauHiu3qF0QMH*zM3Ds;yA0n<}^u=jKkFSP4@zvTtSh+`L@$! znw0Z2d29)z7Y#%``R=b=*SkzKthn(Wo`u@u1)}MQ(6#e0{6`kvhwZ}^NL8WKzFSmg zHDr3D(_Fk2hvvc~=av}e$?yc+<%CMmmP@B7_k`E|j`P1}MNBbuvoj*6l3==tRbBNt zYsiyJ45{PRA;EM`F1i?mqDx<6{=vv)OP`_uZC{HW)eq%fJclmbFuwosl2a3P8=XR! zFbpdy#Lfl#8=X9Lt}mb-BPk4b*V+o~qZm)^qEx;Bd{=x1&kY%20M)pK z`VmYIk`&*(G+AF%fEx{SqM2CTG5E^YgxSIK>>|a&engqdE9s9r;!tUp9FKpalg{^> zz@I(^Ea}GSgIMnkbyL3LE%KblU~KAc=cc$k3^mXMiGIuC77<~Z!WXutjJqShTl{`6 zNEVcj=%wpK(Fr~ev(;J59Sn;@g)TW(61|0jcQ#->D?HARr57#snGx-!884u92{)zY zI(Eg>Ru3|8T=t`yB`(O3l|(o3VXq6yaty?vUQ4vjYJ z$nFnm=R!H3PYk2{J<2eUlaUE)0#eJ-)i`ugg2Dyd7x_iApljn_QN$7-xSGrjV&M=| zv*@SNnB8y5cry_Mc-}_7ai1Wf22L7;)K~;s0_`@_vUav3!^f+O$ZhWpacjSL{)5q3}1x~AHF{Pz!yS|Ypau{ z!orrDTY%<-)uvyxymLVosHx@dPi7IS3HCd&5;*`dm?pE=BWt z)*Qr%ep{)Y(L%`+x~%QeX2@vD|2vwv07`+~C3^mZ5^>&uwc`y^?FlOYzXWsjZ+0-C@-bV-0Nng`GX z0!sqHr*bf7Ggi;OybF>;FTr_{pdZBteXR>~n3YJ*=su9LZS~9M)yM zC0IDQZrlCpxkg?Qv{@fxlm5(EUTiqt3 zLwb=%N0NG1bsP3Ij+zQilkj9xhROk#jxzIRxy%ddSxwf`$(ZTvtp3x3_#s%; zYG?`gWI(uk;FU=HN4X&0X;6m+r=46rr_o(^0ue^S7821QQ3W>i#X6CcLJ#;S8|c#p z`VD(Pn|D)id{3)1cZ~6zA1xVtSxWAf*N@^F|BLg?&7{I+SX?VS59PJ92MN zyMiNm!|at0<*#EGbOcXYH5DY2UkPxWmgNHJ^H(AvJ0NfiC0%z{Gpr_oa=(4|TMh1^ z*pf8Sxe3Tx1kVmG1#Z*VLJ)h9;)e2xu!Y7%*&e;cGYAglB^WXD;R>a4=Cthk%nOvt z2cp*AT>@TIKt|N^3lEuT5|E??5_LSgkb9S7`>mx=MP5V0L0UHZ(_;WdGN?x`7rKd1 z*uwk3AsfIJKblrb#<3EG;80((MZ@PA;qI4WKqKaT0KnCM)t{fRJ+^~#Xu9&dXm+vh z{-{-OdUc1q0J@hacD2uB5^e- z_lT`&7giw_Osq2y4!g`GsNUBor0tIXuq0#y?07VbhJTScP3@s*TBzK$DrBh0gH$sO zWC@~PrU7Jq_kE;UmzNr|`+x`j8}g#OJIab^65;PA96i#OiFE?QlP*~jPch{xN-rTy zv*A^50qoAqx%;-4I7!sqZ|V0)#@4~c@i%}^C?V?j3$1>eY#Jy;V+0W<;~MdQX-W^N1{=eXbbgq6g+i7byb2M<>6(Z-(mTi z)ukseah|+1Kh@VzcsTYb@d-fnc79SlpNv~~TffbAKL8Z!1!PRJegGzX?q~iouWXBST$sg7&a9B97{OYMql>TO#@D`;$1hSY+wo> zPC^frDGiuxw9DY`1BQUPJ%w9%YzyRP** z?Ab2p@p)R)Z^WDqj`?Bo;4F!VwU_vqG4pH+X>%^0lxoUR!w3%P}NKuQ1k{rY-1P;~^0c;g+Q zSYfb`VOL`Ne6Cj4`PLr3ltD06?P5F92{xS6{XeZ-c|4SD+b&6#%1%fLAxo4rwgyij zWh>d&EFnu|&oZef*|Nn@RMwuF5z*L39!s)}tXam+5N6U~EVFz!)${7E_xF8&eEuHS zc3;_4fEK-VIqm=JZ#n7oU;S7&YsR~6}N zuBytf^k~pjS(}RDfDVH8wsSywmMe2KrDg>#fnTV;P+^!K#?#zmDB zX@EXm_GshW2*(0I1DMBcIwY}6f|m|in&)Z;Dt$ayx5F1WL|g+4^fXh#t?>j$wS<^~8!GM>Dnpvu8=C z2zizE!ii^}T@GKXsv;eRT;o3qO9IX~17vT?V-Ak*vGZ9u9c>Om#mMSMhj977@I7h+ z?=6hC@$rZ{2t-wv*S8DJ!tlKce4cufpS-lcC?}TC8mmSwIy!XtV0#Y`ii&o})qc;T z1!h8W;ch$jiw^i31-i$iL0{U#5;r@!F0-W(DC;#p=k+7L8D0=ds&6~`1lM>i8xVV6 z@Kqfeo5^eKXUJf581|Z6^~{9w?ak zSn)!$>=Io24JcCQ^FGKqVDNgWLO7dUrY?VvBP%E$QLPI6esC@Ng!!fn$RgcRCZ9*4%Cei(`UJka&~TQ;Y-TT zHCM0Ps^a^Z9lvwM&%Ei(ZPEY-0!nK|$HYu4*3*iI10<5Kb)~P9D-kwAT{JMk!uX`; zPTi{F{jHha1J+!PaZb{wnP>R1e;f+^)lrLk6fbi;`ss1&Y=hjU4A7N}AE=)oLe3~M z@9KFDOouG;+jN*GE93yc9Xnp{Pc$ROd_A@^Xw$#9Nk9B7V-xAuHB1|HUZ{Nz`KVgg z)&dp&wfMoN2>3dEN{uH?c;VK5|7gjFcDgPF%KqEHR#WN|^dPB;P<5Q-c zARUL07hSljY-?HCX9OZa;LNQEp!{#wXbHN-@Jq8rhT|Ko72cK)4^xkEk1^nmJ_oh* zL|sV1D1%i*s^U$d`(CbWt*jlfsO>WX26W0)Xzy9KU^xHGz98jv;8PF17QG34>d}zh z%np-_({X?@jR?a9FAnc?XIagMg~Y&_i9E zD6sf|84>UU{@)0I0}dXE5}(XXwM2mGiP+j-2Y7|#S`b6nCm$8xUOoT`JjgQJLw z=%u(BDXEPc%G1VMsXwjGt5uAq>ElXj&n0kVnQtdXoUo9slZ2Tl+@c!-|V%Qh3fWkFj$T zPa(m`AF$5dmCk)v7ryjA ze(jH22XMc&uK2zWf5iQZ1lUFr^Vj#MLR;S4IJ&(Itroail0b?IdmRs06){ zUK`3+zo`lA;2aa~)*-3_*Otut_T>&<*v|n*f_*u}#0C`e_M(DV>Xsz1MEyAncUfy2 zDn?Jagz+!}(9X+lq5XATXFd3SSLL`HKrDW{Q4hmiTDe-fQ~VH{I$LH z*L5jbJ+WIGZK#@Mg)TRrF-acc-Xk^dBMrb19$iy1*EK zEK~cVEYO!$2s4kn&b=}R?8nqNY~Ky{Eor7SKc;%@7sL-}4pdDk&t8#%rkpHaxH_VT)yf5vkxpz|-IQ>%?Xpm5{fkX$`O_7xI2%F3iJq9VHVhXOl7=Blfi%ill%tEt^ZEx@bhk z#WGu8O+V-KhhFkGViwn#yh?G)zW<a0S}~>7k{GoCu|G6+%~9aDkHh`Lm`K?)bb9@%5%p1qmh_iH zF4fnH_21i>w|zMM0<>rnQfz6p(?NN@BlLi21Sk!eB!ZWP{|LyJ$lkB@=;u}G$EC?> zcZ?f55Bvg`c(0fgz=81m)(WuKVoEP{_nqY7+e>G0FC)R@9B5U%c*48eA4)v=JO1$X zY|Kp|Fl(p&jET;h>x<%{vg4g~OFDWVQO9^p^1+@Cbuk-`|Iu-VMTC|I26$%hJ6% z<|F|aCdTS4Mt;BNa39o#u1b|It2$`m+mpS{zu>7@HZRQXxjMZp(MzT#eyQ(^`4ime zLA%S)LcP-S6JSk7u~f>4Fu6XL@@S3&4Sye-Tw^Ii<(Gw}>)Ez^ZYE$?}VDO+@1-?I9qKXUu+i!g+r&-RIhrCl8dr*dxFBY(beKaZtbG4lG z|FK~`J)R91t-8QQt5J8lsKGNm&lk0yyDjxg_X~hP*)-im$jQPT_n(`Xn{)_U5y`@; zprOh$uOdGMWxfPJ%mNTLXOr3)KjJ|vyUdg31Q*p2c6H223XtI*18jkxekg^0L=eU& zm!2hwUN5V5cp+gF-+k^9J5)phY#Qsf{Kbfc4De(Z1Z`9JCIjkCWK`qx;D2ikSft^a zNS&iV zufsgwu1azxsWQr{x>)$?f$nifgAABoG@9qZuP*jd-XBga_`_jUK&W2BvHb7rMrjKw zNwY((gVsxz#b{r+Xqp=d(CyOzRP{Y~jm-|I05zw<2t-RHb^9wvyw%BV=!$ySr?8y( z?K5j*H!MHxV9FjhUXMf~lM8`&D>Sy=tyt5Pb#6v0|KUG4W_;c4^q@EP9>)sLTRhJ2 z>s5I8Za>B->nQCD8!Was$#8p$d^SxdR&u(9j&rKW+OOy_l2P2-jA(?o5g69-GTNp+ z5$5-R_JVT$7ZH5A_@lhDZ)LK-Z9RT8DUEp8CZdw{pc;NyY5hfN@tSGss_a1g()Q&C zlodgluT(!=$(P@}1O59PgrN=vm+#G`kG%Fbhc#86t!xQ*Iv1OkUMrJ)b0}y zj7->Px{K6BQDJ#ls2lp_%ewjg_cgo{>QrkXsLpoutnNe?AuuD+E~3yJtBQrg<&E!2 zMW^5UwMlw5iDPUVlp$D!CtX&3>|^5!H{a$Zu=8L?_`}`8{rn4Qs)zgK&xlxgcW((* zw&QU1V><=-v8*K-yUI3=Hx_@sXkJ0a&T+|f4#uWE^fI~`r?`D}0QTzw(@dO+rpvse zYJ$|*IFobCdh7sHLhIh5 z-rBy8`74Wx^)<^bhyGv*fq8uItH4SqBPs?_ggyVN?Z{mxa za5rge)(^LzB1UPwXA%$NuLUjIorF^p4060m$4WELABdDB8 z5WCXIpPSt3){5NMPZ^=rRDM>?!k|Taji2AembH6CT#}q%glyQJIhNC)izD0R+o{BDE#Pn)(=et6wY%GLIldVm)S#?8bp@Ejf_=TKy+Ay&FX`b-bmhwx}Ao{2b=+eG{O zT$Dg@{7HXrd}gXzzVjL+9=m6Xb7}v3^5?Y>+pO;4@%Xm^HF0$f#dA1JUH$~7VWUjm zH=*62d-V!y#coVz8esy{By-3<%#(T>PaDX+G2~5dUUO*c3YZHR5gA{dR(iW9S%onx zQ?1=*eRwdqHGW}uAwW*dN6qR;CVIsg?S>~U&V?vb$<{S(UCVQnIfKrutZZ3J>cM}U zy~}G?zBOkh%XSREUzmg~zicCAp`9Uu=;0frXws01fo)?|b-X)-)ye|Dj~YN&c;SaV z=}#I`ke9@iN~I!WDzd18RNc_wbyI2}^l|xfl{i{k*IE|T16L3d7N`azm!C~5Tfh^R z&2Lki#7|U&sznVp%*GSq7f_fHT<;n$k%G0Mu0q{;X=DsGc!T(DcC|rcZFO}cz$NZ6 z8fF_fL|fay5k_n|DSq|@pI%$pRWgn^lDZ2@BjMqzWD*HNWoW=&F0YKjZXBX@r6yI6 zP$-F*rk@LlcOwm_I!<2ah>a0Ld}G~La4~2=g0wQ?8w)Qy7Zvk4eafh?%cU{ z(XU0vyhm6j%T+R?2L=1yuCAsGHZ{%j!j4n(EsZ4v=Z!g@B&p$ThAO$CS?^vsw|a!E zL&IoJcVTA?ZrD7qo(>8~?G@J#Isy4QyQ)ZLC4DM_2~&6ANAWE?PT*&#rs!2-z{`1t zips*lAV@VfK(%F8>OOnyu~o7!ZlY@?YCaF`wm=L+{XNm%-~>OLZksdRus^gmK? z=I;1sHFR@*8z;wG2FL^<-=MLJlS7{o0YN#;yePHCstUf=maq7cEbont7;kd|b1F@& zC4VZGM15!Vf_TAmIyQ6aE-D>&KbSDQGL$NaB6?<)p)~@+pewIGU=QCRdgsq#+^C0e ziZsjRscCq%TAW%=7fGfNQdDg7Hn%*CaH}R@VU(DKfkA0&WE^z_dwcB`2Z=@; zJWo3e8z~Pc`~oA9=7as>)~ZVj1={B1YT{17^0j>-b^|?@ET&CN&iEC@r`NioBAG%R>`0Dn4~`sa{;+1>dcItumR literal 0 HcmV?d00001 diff --git a/x-pack/plugins/security_solution_serverless/public/get_started/images/view_alerts.png b/x-pack/plugins/security_solution_serverless/public/get_started/images/view_alerts.png new file mode 100644 index 0000000000000000000000000000000000000000..f3a112d52f3720ba424ca0b31288fe603fa8d4fd GIT binary patch literal 52021 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 literal 0 HcmV?d00001 diff --git a/x-pack/plugins/security_solution_serverless/public/get_started/reducer.tsx b/x-pack/plugins/security_solution_serverless/public/get_started/reducer.tsx index a18f798e582c0..d17807e58fba0 100644 --- a/x-pack/plugins/security_solution_serverless/public/get_started/reducer.tsx +++ b/x-pack/plugins/security_solution_serverless/public/get_started/reducer.tsx @@ -7,7 +7,7 @@ import type { ProductLine } from '../../common/product'; import { setupActiveSections, updateActiveSections } from './helpers'; -import type { ReducerActions } from './types'; +import type { ExpandedCardSteps, ReducerActions } from './types'; import { type CardId, type StepId, type TogglePanelReducer, GetStartedPageActions } from './types'; export const reducer = (state: TogglePanelReducer, action: ReducerActions): TogglePanelReducer => { @@ -42,9 +42,7 @@ export const reducer = (state: TogglePanelReducer, action: ReducerActions): Togg : new Set(), }; - if (action.type === GetStartedPageActions.AddFinishedStep) { - finishedSteps[action.payload.cardId].add(action.payload.stepId); - } + finishedSteps[action.payload.cardId].add(action.payload.stepId); const { activeSections, totalStepsLeft, totalActiveSteps } = updateActiveSections({ activeProducts: state.activeProducts, @@ -71,9 +69,7 @@ export const reducer = (state: TogglePanelReducer, action: ReducerActions): Togg : new Set(), }; - if (action.type === GetStartedPageActions.RemoveFinishedStep) { - finishedSteps[action.payload.cardId].delete(action.payload.stepId); - } + finishedSteps[action.payload.cardId].delete(action.payload.stepId); const { activeSections, totalStepsLeft, totalActiveSteps } = updateActiveSections({ activeProducts: state.activeProducts, @@ -112,26 +108,44 @@ export const reducer = (state: TogglePanelReducer, action: ReducerActions): Togg action.type === GetStartedPageActions.ToggleExpandedCardStep && action.payload.isStepExpanded != null ) { - const expandedSteps = new Set( - [...state.expandedCardSteps[action.payload.cardId]?.expandedSteps] ?? [] - ); - if (action.payload.isStepExpanded === true && action.payload.stepId) { - expandedSteps.add(action.payload.stepId); + // It allows Only One step open at a time + const expandedSteps = new Set(); + if (action.payload.isStepExpanded === true && action.payload.stepId != null) { + return { + ...state, + expandedCardSteps: Object.entries(state.expandedCardSteps).reduce((acc, [cardId, card]) => { + if (action.payload.stepId != null && cardId === action.payload.cardId) { + expandedSteps.add(action.payload.stepId); + + acc[action.payload.cardId] = { + expandedSteps: [...expandedSteps], + isExpanded: state.expandedCardSteps[action.payload.cardId]?.isExpanded, + }; + } else { + // Remove all other expanded steps in other cards + acc[cardId as CardId] = { + expandedSteps: [], + isExpanded: card.isExpanded, + }; + } + return acc; + }, {} as ExpandedCardSteps), + }; } if (action.payload.isStepExpanded === false && action.payload.stepId) { expandedSteps.delete(action.payload.stepId); - } - return { - ...state, - expandedCardSteps: { - ...state.expandedCardSteps, - [action.payload.cardId]: { - expandedSteps: [...expandedSteps], - isExpanded: state.expandedCardSteps[action.payload.cardId]?.isExpanded, + return { + ...state, + expandedCardSteps: { + ...state.expandedCardSteps, + [action.payload.cardId]: { + expandedSteps: [...expandedSteps], + isExpanded: state.expandedCardSteps[action.payload.cardId]?.isExpanded, + }, }, - }, - }; + }; + } } return state; diff --git a/x-pack/plugins/security_solution_serverless/public/get_started/sections.tsx b/x-pack/plugins/security_solution_serverless/public/get_started/sections.tsx index c056e463dfb88..67f7d224e3165 100644 --- a/x-pack/plugins/security_solution_serverless/public/get_started/sections.tsx +++ b/x-pack/plugins/security_solution_serverless/public/get_started/sections.tsx @@ -18,12 +18,17 @@ import * as i18n from './translations'; import explore from './images/explore.svg'; import { ProductLine } from '../../common/product'; import { FleetOverviewLink } from './step_links/fleet_overview_link'; -import { EndpointManagementLink } from './step_links/endpoint_management_link'; -import { IntegrationsLink } from './step_links/integrations_link'; -import { RulesManagementLink } from './step_links/rules_management_link'; -import { OverviewLink } from './step_links/overview_link'; -import { AlertsLink } from './step_links/alerts_link'; -import { ExploreLink } from './step_links/explore_link'; +import { InstallAgentButton } from './step_links/install_agent_button'; +import { AddIntegrationButton } from './step_links/add_integration_button'; +import { AlertsButton } from './step_links/alerts_link'; +import connectToDataSources from './images/connect_to_existing_sources.png'; +import endalbePrebuiltRules from './images/enable_prebuilt_rules.png'; +import deployElasticAgent from './images/deploy_elastic_agent_to_protect_your_endpoint.png'; +import learnAboutElasticAgent from './images/learn_about_elastic_agent.png'; +import viewAlerts from './images/view_alerts.png'; +import analyzeDataUsingDashboards from './images/analyze_data_using_dashboards.png'; +import { AddElasticRulesButton } from './step_links/add_elastic_rules_button'; +import { DashboardButton } from './step_links/dashboard_button'; export const introductionSteps = [ { @@ -36,12 +41,12 @@ export const introductionSteps = [ className="vidyard_iframe" frameBorder="0" height="100%" + width="100%" referrerPolicy="no-referrer" sandbox="allow-scripts allow-same-origin" scrolling="no" src="//play.vidyard.com/K6kKDBbP9SpXife9s2tHNP.html?" title={i18n.WATCH_OVERVIEW_VIDEO_HEADER} - width="100%" /> ), timeInMinutes: 3, @@ -52,23 +57,39 @@ const configureSteps = [ { id: ConfigureSteps.learnAbout, title: i18n.CONFIGURE_STEP1, - description: [], + description: [ + i18n.CONFIGURE_STEP1_DESCRIPTION1, + i18n.CONFIGURE_STEP1_DESCRIPTION2, + , + ], + splitPanel: ( + {i18n.CONFIGURE_STEP1} + ), }, { id: ConfigureSteps.deployElasticAgent, title: i18n.CONFIGURE_STEP2, - description: [i18n.CONFIGURE_STEP2_DESCRIPTION1, ], + description: [i18n.CONFIGURE_STEP2_DESCRIPTION1, ], + splitPanel: ( + {i18n.CONFIGURE_STEP2} + ), }, { id: ConfigureSteps.connectToDataSources, title: i18n.CONFIGURE_STEP3, - description: [i18n.CONFIGURE_STEP3_DESCRIPTION1, ], + description: [i18n.CONFIGURE_STEP3_DESCRIPTION1, ], productLineRequired: [ProductLine.security], + splitPanel: ( + {i18n.CONFIGURE_STEP3} + ), }, { id: ConfigureSteps.enablePrebuiltRules, title: i18n.CONFIGURE_STEP4, - description: [i18n.CONFIGURE_STEP4_DESCRIPTION1, ], + description: [i18n.CONFIGURE_STEP4_DESCRIPTION1, ], + splitPanel: ( + {i18n.CONFIGURE_STEP4} + ), }, ]; @@ -76,12 +97,16 @@ const exploreSteps = [ { id: ExploreSteps.viewAlerts, title: i18n.EXPLORE_STEP1, - description: [i18n.EXPLORE_STEP1_DESCRIPTION1, ], + description: [i18n.EXPLORE_STEP1_DESCRIPTION1, ], + splitPanel: {i18n.EXPLORE_STEP1}, }, { id: ExploreSteps.analyzeData, title: i18n.EXPLORE_STEP2, - description: [, ], + description: [i18n.EXPLORE_STEP2_DESCRIPTION1, ], + splitPanel: ( + {i18n.EXPLORE_STEP2} + ), }, ]; diff --git a/x-pack/plugins/security_solution_serverless/public/get_started/step_links/add_elastic_rules_button.tsx b/x-pack/plugins/security_solution_serverless/public/get_started/step_links/add_elastic_rules_button.tsx new file mode 100644 index 0000000000000..01b86c4f1c073 --- /dev/null +++ b/x-pack/plugins/security_solution_serverless/public/get_started/step_links/add_elastic_rules_button.tsx @@ -0,0 +1,22 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { FormattedMessage } from '@kbn/i18n-react'; +import React from 'react'; +import { LinkButton } from '@kbn/security-solution-navigation/links'; +import { SecurityPageName } from '@kbn/security-solution-navigation'; + +const AddElasticRulesButtonComponent = () => ( + + + +); + +export const AddElasticRulesButton = React.memo(AddElasticRulesButtonComponent); diff --git a/x-pack/plugins/security_solution_serverless/public/get_started/step_links/add_integration_button.tsx b/x-pack/plugins/security_solution_serverless/public/get_started/step_links/add_integration_button.tsx new file mode 100644 index 0000000000000..1c69e318ca093 --- /dev/null +++ b/x-pack/plugins/security_solution_serverless/public/get_started/step_links/add_integration_button.tsx @@ -0,0 +1,22 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { FormattedMessage } from '@kbn/i18n-react'; +import React from 'react'; +import { LinkButton } from '@kbn/security-solution-navigation/links'; +import { ExternalPageName } from '../../navigation/links/constants'; + +const AddIntegrationButtonComponent = () => ( + + + +); + +export const AddIntegrationButton = React.memo(AddIntegrationButtonComponent); diff --git a/x-pack/plugins/security_solution_serverless/public/get_started/step_links/alerts_link.tsx b/x-pack/plugins/security_solution_serverless/public/get_started/step_links/alerts_link.tsx index 00b6b02c9a800..6d814ca14ed78 100644 --- a/x-pack/plugins/security_solution_serverless/public/get_started/step_links/alerts_link.tsx +++ b/x-pack/plugins/security_solution_serverless/public/get_started/step_links/alerts_link.tsx @@ -6,36 +6,18 @@ */ import { FormattedMessage } from '@kbn/i18n-react'; -import { LinkAnchor, useGetLinkProps } from '@kbn/security-solution-navigation/links'; +import { LinkButton } from '@kbn/security-solution-navigation/links'; import { SecurityPageName } from '@kbn/security-solution-navigation'; -import React, { useCallback } from 'react'; +import React from 'react'; -const AlertsLinkComponent = () => { - const getLinkProps = useGetLinkProps(); - const onClick = useCallback((e) => { - // TODO: telemetry https://github.com/elastic/kibana/issues/163247 - }, []); - const { onClick: onLinkClicked } = getLinkProps({ - id: SecurityPageName.alerts, - onClick, - }); - return ( +const AlertsButtonComponent = () => ( + - - - ), - }} + id="xpack.securitySolutionServerless.getStarted.togglePanel.explore.step1.description2.button" + defaultMessage="View alerts" /> - ); -}; + +); -export const AlertsLink = React.memo(AlertsLinkComponent); +export const AlertsButton = React.memo(AlertsButtonComponent); diff --git a/x-pack/plugins/security_solution_serverless/public/get_started/step_links/dashboard_button.tsx b/x-pack/plugins/security_solution_serverless/public/get_started/step_links/dashboard_button.tsx new file mode 100644 index 0000000000000..3ded0074bfd50 --- /dev/null +++ b/x-pack/plugins/security_solution_serverless/public/get_started/step_links/dashboard_button.tsx @@ -0,0 +1,22 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { FormattedMessage } from '@kbn/i18n-react'; +import React from 'react'; +import { LinkButton } from '@kbn/security-solution-navigation/links'; +import { SecurityPageName } from '@kbn/security-solution-navigation'; + +const DashboardButtonComponent = () => ( + + + +); + +export const DashboardButton = React.memo(DashboardButtonComponent); diff --git a/x-pack/plugins/security_solution_serverless/public/get_started/step_links/endpoint_management_link.tsx b/x-pack/plugins/security_solution_serverless/public/get_started/step_links/endpoint_management_link.tsx deleted file mode 100644 index 51f762b4d0a82..0000000000000 --- a/x-pack/plugins/security_solution_serverless/public/get_started/step_links/endpoint_management_link.tsx +++ /dev/null @@ -1,46 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ -/* - * 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 React, { useCallback } from 'react'; -import { FormattedMessage } from '@kbn/i18n-react'; -import { LinkAnchor, useGetLinkProps } from '@kbn/security-solution-navigation/links'; -import { SecurityPageName } from '@kbn/security-solution-navigation'; - -const EndpointManagementLinkComponent = () => { - const getLinkProps = useGetLinkProps(); - const onClick = useCallback((e) => { - // TODO: telemetry https://github.com/elastic/kibana/issues/163247 - }, []); - const { onClick: onLinkClicked } = getLinkProps({ - id: SecurityPageName.endpoints, - onClick, - }); - return ( - - - - ), - }} - /> - ); -}; - -export const EndpointManagementLink = React.memo(EndpointManagementLinkComponent); diff --git a/x-pack/plugins/security_solution_serverless/public/get_started/step_links/explore_link.tsx b/x-pack/plugins/security_solution_serverless/public/get_started/step_links/explore_link.tsx deleted file mode 100644 index 3fc6fde33b275..0000000000000 --- a/x-pack/plugins/security_solution_serverless/public/get_started/step_links/explore_link.tsx +++ /dev/null @@ -1,41 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import { FormattedMessage } from '@kbn/i18n-react'; -import React, { useCallback } from 'react'; -import { LinkAnchor, useGetLinkProps } from '@kbn/security-solution-navigation/links'; -import { SecurityPageName } from '@kbn/security-solution-navigation'; - -const ExploreLinkComponent = () => { - const getLinkProps = useGetLinkProps(); - const onClick = useCallback((e) => { - // TODO: telemetry https://github.com/elastic/kibana/issues/163247 - }, []); - const { onClick: onLinkClicked } = getLinkProps({ - id: SecurityPageName.exploreLanding, - onClick, - }); - - return ( - - - - ), - }} - /> - ); -}; - -export const ExploreLink = React.memo(ExploreLinkComponent); diff --git a/x-pack/plugins/security_solution_serverless/public/get_started/step_links/fleet_overview_link.tsx b/x-pack/plugins/security_solution_serverless/public/get_started/step_links/fleet_overview_link.tsx index 7c354ed9701d6..1629a798f253a 100644 --- a/x-pack/plugins/security_solution_serverless/public/get_started/step_links/fleet_overview_link.tsx +++ b/x-pack/plugins/security_solution_serverless/public/get_started/step_links/fleet_overview_link.tsx @@ -7,30 +7,19 @@ import React from 'react'; import { FormattedMessage } from '@kbn/i18n-react'; -import { EuiLink } from '@elastic/eui'; -import { CONFIGURE_STEP1_DESCRIPTION1 } from '../translations'; +import { EuiButton } from '@elastic/eui'; const FleetOverviewLinkComponent = () => ( - <> - <>{CONFIGURE_STEP1_DESCRIPTION1} + - - - ), - }} + defaultMessage="Go here to learn more!" /> - + ); export const FleetOverviewLink = React.memo(FleetOverviewLinkComponent); diff --git a/x-pack/plugins/security_solution_serverless/public/get_started/step_links/install_agent_button.tsx b/x-pack/plugins/security_solution_serverless/public/get_started/step_links/install_agent_button.tsx new file mode 100644 index 0000000000000..cf233a84ccf52 --- /dev/null +++ b/x-pack/plugins/security_solution_serverless/public/get_started/step_links/install_agent_button.tsx @@ -0,0 +1,28 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React from 'react'; +import { FormattedMessage } from '@kbn/i18n-react'; +import { LinkButton } from '@kbn/security-solution-navigation/links'; +import { ExternalPageName } from '../../navigation/links/constants'; + +const InstallAgentButtonComponent = () => ( + + + +); + +export const InstallAgentButton = React.memo(InstallAgentButtonComponent); diff --git a/x-pack/plugins/security_solution_serverless/public/get_started/step_links/integrations_link.tsx b/x-pack/plugins/security_solution_serverless/public/get_started/step_links/integrations_link.tsx deleted file mode 100644 index ecc0dbab0ae31..0000000000000 --- a/x-pack/plugins/security_solution_serverless/public/get_started/step_links/integrations_link.tsx +++ /dev/null @@ -1,44 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import { FormattedMessage } from '@kbn/i18n-react'; -import React, { useCallback } from 'react'; -import { EuiLink } from '@elastic/eui'; -import { useNavigation } from '@kbn/security-solution-navigation'; - -const IntegrationsLinkComponent = () => { - const { getAppUrl, navigateTo } = useNavigation(); - - const integrationsUrl = getAppUrl({ appId: 'integrations', path: '/browse/security' }); - const onClick = useCallback( - (e) => { - e.preventDefault(); - // TODO: telemetry https://github.com/elastic/kibana/issues/163247 - navigateTo({ url: integrationsUrl }); - }, - [navigateTo, integrationsUrl] - ); - return ( - - - - ), - }} - /> - ); -}; - -export const IntegrationsLink = React.memo(IntegrationsLinkComponent); diff --git a/x-pack/plugins/security_solution_serverless/public/get_started/step_links/overview_link.tsx b/x-pack/plugins/security_solution_serverless/public/get_started/step_links/overview_link.tsx deleted file mode 100644 index 94783e7ce35d3..0000000000000 --- a/x-pack/plugins/security_solution_serverless/public/get_started/step_links/overview_link.tsx +++ /dev/null @@ -1,44 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import { FormattedMessage } from '@kbn/i18n-react'; -import React, { useCallback } from 'react'; -import { LinkAnchor, useGetLinkProps } from '@kbn/security-solution-navigation/links'; -import { SecurityPageName } from '@kbn/security-solution-navigation'; -import { EXPLORE_STEP2_DESCRIPTION1 } from '../translations'; - -const OverviewLinkComponent = () => { - const getLinkProps = useGetLinkProps(); - const onClick = useCallback((e) => { - // TODO: telemetry https://github.com/elastic/kibana/issues/163247 - }, []); - const { onClick: onLinkClicked } = getLinkProps({ - id: SecurityPageName.overview, - onClick, - }); - return ( - <> - {EXPLORE_STEP2_DESCRIPTION1} - - - - ), - }} - /> - - ); -}; - -export const OverviewLink = React.memo(OverviewLinkComponent); diff --git a/x-pack/plugins/security_solution_serverless/public/get_started/step_links/rules_management_link.tsx b/x-pack/plugins/security_solution_serverless/public/get_started/step_links/rules_management_link.tsx deleted file mode 100644 index 4d64dfd88824e..0000000000000 --- a/x-pack/plugins/security_solution_serverless/public/get_started/step_links/rules_management_link.tsx +++ /dev/null @@ -1,40 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import { FormattedMessage } from '@kbn/i18n-react'; -import React, { useCallback } from 'react'; -import { LinkAnchor, useGetLinkProps } from '@kbn/security-solution-navigation/links'; -import { SecurityPageName } from '@kbn/security-solution-navigation'; - -const RulesManagementLinkComponent = () => { - const getLinkProps = useGetLinkProps(); - const onClick = useCallback((e) => { - // TODO: telemetry https://github.com/elastic/kibana/issues/163247 - }, []); - const { onClick: onLinkClicked } = getLinkProps({ - id: SecurityPageName.rules, - onClick, - }); - return ( - - - - ), - }} - /> - ); -}; - -export const RulesManagementLink = React.memo(RulesManagementLinkComponent); diff --git a/x-pack/plugins/security_solution_serverless/public/get_started/storage.test.ts b/x-pack/plugins/security_solution_serverless/public/get_started/storage.test.ts index ec90cc6710461..5df60b91897df 100644 --- a/x-pack/plugins/security_solution_serverless/public/get_started/storage.test.ts +++ b/x-pack/plugins/security_solution_serverless/public/get_started/storage.test.ts @@ -5,8 +5,8 @@ * 2.0. */ -import { getStartedStorage } from './storage'; -import { GetSetUpCardId, IntroductionSteps, type StepId } from './types'; +import { defaultExpandedCards, getStartedStorage } from './storage'; +import { ConfigureSteps, GetSetUpCardId, IntroductionSteps, type StepId } from './types'; import { storage } from '../common/lib/storage'; import type { MockStorage } from '../common/lib/__mocks__/storage'; import { ProductLine } from '../../common/product'; @@ -139,4 +139,102 @@ describe('useStorage', () => { [GetSetUpCardId.introduction]: [], }); }); + + it('should get all expanded card steps from storage', () => { + (mockStorage.get as jest.Mock).mockReturnValueOnce({ + [GetSetUpCardId.introduction]: { + isExpanded: true, + expandedSteps: [IntroductionSteps.getToKnowElasticSecurity], + }, + }); + const result = getStartedStorage.getAllExpandedCardStepsFromStorage(); + expect(mockStorage.get).toHaveBeenCalledWith('EXPANDED_CARDS'); + expect(result).toEqual({ + [GetSetUpCardId.introduction]: { + isExpanded: true, + expandedSteps: [IntroductionSteps.getToKnowElasticSecurity], + }, + }); + }); + + it('should get default expanded card steps from storage', () => { + (mockStorage.get as jest.Mock).mockReturnValueOnce(null); + const result = getStartedStorage.getAllExpandedCardStepsFromStorage(); + expect(mockStorage.get).toHaveBeenCalledWith('EXPANDED_CARDS'); + expect(result).toEqual(defaultExpandedCards); + }); + + it('should reset card steps in storage', () => { + (mockStorage.get as jest.Mock).mockReturnValueOnce({ + [GetSetUpCardId.introduction]: { + isExpanded: true, + expandedSteps: [IntroductionSteps.getToKnowElasticSecurity], + }, + }); + getStartedStorage.resetAllExpandedCardStepsToStorage(); + expect(mockStorage.set).toHaveBeenCalledWith('EXPANDED_CARDS', { + [GetSetUpCardId.introduction]: { + isExpanded: true, + expandedSteps: [], + }, + }); + }); + + it('should add a step to expanded card steps in storage', () => { + (mockStorage.get as jest.Mock).mockReturnValueOnce({ + [GetSetUpCardId.introduction]: { + isExpanded: true, + expandedSteps: [IntroductionSteps.getToKnowElasticSecurity], + }, + }); + getStartedStorage.addExpandedCardStepToStorage( + GetSetUpCardId.configure, + ConfigureSteps.learnAbout + ); + expect(mockStorage.set).toHaveBeenCalledWith('EXPANDED_CARDS', { + [GetSetUpCardId.introduction]: { + isExpanded: true, + expandedSteps: [IntroductionSteps.getToKnowElasticSecurity], + }, + [GetSetUpCardId.configure]: { + isExpanded: true, + expandedSteps: [ConfigureSteps.learnAbout], + }, + }); + }); + + it('should remove a step from expanded card steps in storage', () => { + (mockStorage.get as jest.Mock).mockReturnValueOnce({ + [GetSetUpCardId.introduction]: { + isExpanded: true, + expandedSteps: [IntroductionSteps.getToKnowElasticSecurity], + }, + }); + getStartedStorage.removeExpandedCardStepFromStorage( + GetSetUpCardId.introduction, + IntroductionSteps.getToKnowElasticSecurity + ); + expect(mockStorage.set).toHaveBeenCalledWith('EXPANDED_CARDS', { + [GetSetUpCardId.introduction]: { + isExpanded: true, + expandedSteps: [], + }, + }); + }); + + it('should update a card from expanded card steps in storage', () => { + (mockStorage.get as jest.Mock).mockReturnValueOnce({ + [GetSetUpCardId.introduction]: { + isExpanded: true, + expandedSteps: [IntroductionSteps.getToKnowElasticSecurity], + }, + }); + getStartedStorage.removeExpandedCardStepFromStorage(GetSetUpCardId.introduction); + expect(mockStorage.set).toHaveBeenCalledWith('EXPANDED_CARDS', { + [GetSetUpCardId.introduction]: { + isExpanded: false, + expandedSteps: [IntroductionSteps.getToKnowElasticSecurity], + }, + }); + }); }); diff --git a/x-pack/plugins/security_solution_serverless/public/get_started/storage.ts b/x-pack/plugins/security_solution_serverless/public/get_started/storage.ts index 56ba6acdb8e04..233096eef71ae 100644 --- a/x-pack/plugins/security_solution_serverless/public/get_started/storage.ts +++ b/x-pack/plugins/security_solution_serverless/public/get_started/storage.ts @@ -7,12 +7,19 @@ import type { ProductLine } from '../../common/product'; import type { CardId, StepId } from './types'; +import { GetSetUpCardId } from './types'; import { storage } from '../common/lib/storage'; export const ACTIVE_PRODUCTS_STORAGE_KEY = 'ACTIVE_PRODUCTS'; export const FINISHED_STEPS_STORAGE_KEY = 'FINISHED_STEPS'; export const EXPANDED_CARDS_STORAGE_KEY = 'EXPANDED_CARDS'; +export const defaultExpandedCards = { + [GetSetUpCardId.configure]: { isExpanded: true, expandedSteps: [] }, + [GetSetUpCardId.introduction]: { isExpanded: true, expandedSteps: [] }, + [GetSetUpCardId.explore]: { isExpanded: true, expandedSteps: [] }, +}; + export const getStartedStorage = { getActiveProductsFromStorage: () => { const activeProducts: ProductLine[] = storage.get(ACTIVE_PRODUCTS_STORAGE_KEY); @@ -39,6 +46,7 @@ export const getStartedStorage = { storage.get(FINISHED_STEPS_STORAGE_KEY) ?? {}; return allFinishedSteps; }, + addFinishedStepToStorage: (cardId: CardId, stepId: StepId) => { const finishedSteps: Record = storage.get(FINISHED_STEPS_STORAGE_KEY) ?? {}; const card: StepId[] = finishedSteps[cardId] ?? []; @@ -56,10 +64,28 @@ export const getStartedStorage = { } storage.set(FINISHED_STEPS_STORAGE_KEY, { ...finishedSteps, [cardId]: steps }); }, - getAllExpandedCardStepsFromStorage: () => storage.get(EXPANDED_CARDS_STORAGE_KEY) ?? {}, + getAllExpandedCardStepsFromStorage: () => { + const storageData = storage.get(EXPANDED_CARDS_STORAGE_KEY); + + return !storageData || Object.keys(storageData).length === 0 + ? defaultExpandedCards + : storageData; + }, + resetAllExpandedCardStepsToStorage: () => { + const activeCards: Record = + getStartedStorage.getAllExpandedCardStepsFromStorage(); + + storage.set( + EXPANDED_CARDS_STORAGE_KEY, + Object.entries(activeCards).reduce((acc, [cardId, card]) => { + acc[cardId as CardId] = { ...card, expandedSteps: [] }; + return acc; + }, {} as Record) + ); + }, addExpandedCardStepToStorage: (cardId: CardId, stepId?: StepId) => { const activeCards: Record = - storage.get(EXPANDED_CARDS_STORAGE_KEY) ?? {}; + getStartedStorage.getAllExpandedCardStepsFromStorage(); const card = activeCards[cardId] ? { ...activeCards[cardId], isExpanded: true } : { diff --git a/x-pack/plugins/security_solution_serverless/public/get_started/translations.ts b/x-pack/plugins/security_solution_serverless/public/get_started/translations.ts index 6b141c2b455b4..d0df5f323cf7d 100644 --- a/x-pack/plugins/security_solution_serverless/public/get_started/translations.ts +++ b/x-pack/plugins/security_solution_serverless/public/get_started/translations.ts @@ -10,7 +10,7 @@ import { i18n } from '@kbn/i18n'; export const GET_STARTED_PAGE_TITLE = i18n.translate( 'xpack.securitySolutionServerless.getStarted.title', { - defaultMessage: `Welcome`, + defaultMessage: `Welcome!`, } ); @@ -28,47 +28,6 @@ export const GET_STARTED_PAGE_DESCRIPTION = i18n.translate( } ); -export const WELCOME_PANEL_PROJECT_CREATED_TITLE = i18n.translate( - 'xpack.securitySolutionServerless.getStarted.welcomePanel.projectCreated.title', - { - defaultMessage: `Project created`, - } -); - -export const WELCOME_PANEL_PROJECT_CREATED_DESCRIPTION = i18n.translate( - 'xpack.securitySolutionServerless.getStarted.welcomePanel.projectCreated.description', - { - defaultMessage: `View all projects here.`, - } -); - -export const WELCOME_PANEL_INVITE_YOUR_TEAM_TITLE = i18n.translate( - 'xpack.securitySolutionServerless.getStarted.welcomePanel.inviteYourTeam.title', - { - defaultMessage: 'Invite your team', - } -); - -export const WELCOME_PANEL_INVITE_YOUR_TEAM_DESCRIPTION = i18n.translate( - 'xpack.securitySolutionServerless.getStarted.welcomePanel.inviteYourTeam.description', - { - defaultMessage: `Boost security through collaboration`, - } -); - -export const WELCOME_PANEL_PROGRESS_TRACKER_TITLE = i18n.translate( - 'xpack.securitySolutionServerless.getStarted.welcomePanel.progressTracker.title', - { - defaultMessage: 'Progress tracker', - } -); - -export const WELCOME_PANEL_PROGRESS_TRACKER_DESCRIPTION = (tasks: number) => - i18n.translate('xpack.securitySolutionServerless.getStarted.welcomePanel.progressTracker.note', { - defaultMessage: `{tasks, plural, =1 {task} other {tasks}} completed`, - values: { tasks }, - }); - export const STEP_TIME_MIN = (min: number) => i18n.translate( 'xpack.securitySolutionServerless.getStarted.togglePanel.progressTracker.stepTimeMin', @@ -161,7 +120,7 @@ export const CONFIGURE_TITLE = i18n.translate( export const CONFIGURE_STEP1 = i18n.translate( 'xpack.securitySolutionServerless.getStarted.togglePanel.configure.step1', { - defaultMessage: 'Learn about Elastic Agent and Fleet', + defaultMessage: 'Learn about Elastic Agent', } ); @@ -169,22 +128,28 @@ export const CONFIGURE_STEP1_DESCRIPTION1 = i18n.translate( 'xpack.securitySolutionServerless.getStarted.togglePanel.configure.step1.description1', { defaultMessage: - 'Elastic Agent is a single, unified way to add monitoring for logs, metrics, and other types of data to a host. It can also protect hosts from security threats, query data from operating systems, forward data from remote services or hardware, and more.', + 'Deploy the Elastic Agent to each endpoint you want to protect. This allows it to monitor and protect them by collecting data and enforcing your security policies. It sends that data to the Elastic Stack for analysis and storage.', + } +); + +export const CONFIGURE_STEP1_DESCRIPTION2 = i18n.translate( + 'xpack.securitySolutionServerless.getStarted.togglePanel.configure.step1.description2', + { + defaultMessage: 'In the next step, you will deploy the Elastic Agent to your endpoints.', } ); export const CONFIGURE_STEP2 = i18n.translate( 'xpack.securitySolutionServerless.getStarted.togglePanel.configure.step2', { - defaultMessage: 'Deploy Elastic Defend to protect your endpoints', + defaultMessage: 'Deploy Elastic Agent to protect your endpoints', } ); export const CONFIGURE_STEP2_DESCRIPTION1 = i18n.translate( 'xpack.securitySolutionServerless.getStarted.togglePanel.configure.step2.description1', { - defaultMessage: - 'Elastic Defend provides organizations with prevention, detection, and response capabilities with deep visibility for EPP, EDR, SIEM, and Security Analytics use cases across Windows, macOS, and Linux operating systems running on both traditional endpoints and public cloud environments.', + defaultMessage: 'Deploy the Elastic Agent to each endpoint you want to monitor or protect.', } ); @@ -199,7 +164,7 @@ export const CONFIGURE_STEP3_DESCRIPTION1 = i18n.translate( 'xpack.securitySolutionServerless.getStarted.togglePanel.configure.step3.description1', { defaultMessage: - 'Elastic integrations provide an easy way to connect Elastic to external services and systems, and quickly get insights or take action. They can collect new sources of data, and they often ship with out-of-the-box assets like dashboards, visualizations, and pipelines to extract structured fields out of logs and events.', + 'Use third-party integrations to import data from common sources and help you gather relevant information in one place. To find integrations for your use case, search for tools and data providers on the Add integrations page.', } ); @@ -213,7 +178,7 @@ export const CONFIGURE_STEP3_BUTTON = i18n.translate( export const CONFIGURE_STEP4 = i18n.translate( 'xpack.securitySolutionServerless.getStarted.togglePanel.configure.step4', { - defaultMessage: 'Enable prebuilt rules or create your own', + defaultMessage: 'Enable prebuilt rules', } ); @@ -221,7 +186,7 @@ export const CONFIGURE_STEP4_DESCRIPTION1 = i18n.translate( 'xpack.securitySolutionServerless.getStarted.togglePanel.configure.step4.description1', { defaultMessage: - 'Rules run periodically and search for suspicious events, sequences, machine learning anomalies, and more! When a rule’s criteria are met, a detection alert is created.', + 'Elastic Security comes with prebuilt detection rules that run in the background and create alerts when their conditions are met.', } ); @@ -250,14 +215,14 @@ export const EXPLORE_STEP1_DESCRIPTION1 = i18n.translate( 'xpack.securitySolutionServerless.getStarted.togglePanel.explore.step1.description1', { defaultMessage: - 'The Alerts page displays all detection alerts following rule configuration from above. From the Alerts page, you can prioritize, triage, investigate alerts, and escalate alerts to a Case. Rules must be enabled for any alerts to be created.', + 'Visualize, sort, filter, and investigate alerts from across your infrastructure. Examine individual alerts of interest, and discover general patterns in alert volume and severity.', } ); export const EXPLORE_STEP2 = i18n.translate( 'xpack.securitySolutionServerless.getStarted.togglePanel.explore.step2', { - defaultMessage: 'Analyze data dashboards', + defaultMessage: 'Analyze data using dashboards', } ); @@ -265,7 +230,7 @@ export const EXPLORE_STEP2_DESCRIPTION1 = i18n.translate( 'xpack.securitySolutionServerless.getStarted.togglePanel.explore.step2.description1', { defaultMessage: - 'The Overview dashboard provides a high-level snapshot of alerts and events. It helps you assess overall system health and find anomalies that may require further investigation.', + 'Use dashboards to visualize data and stay up-to-date with key information. Create your own, or use Elastic’s default dashboards — including alerts, user authentication events, known vulnerabilities, and more.', } ); diff --git a/x-pack/plugins/security_solution_serverless/public/get_started/types.ts b/x-pack/plugins/security_solution_serverless/public/get_started/types.ts index e425c6fe6370a..45fac68dca11e 100644 --- a/x-pack/plugins/security_solution_serverless/public/get_started/types.ts +++ b/x-pack/plugins/security_solution_serverless/public/get_started/types.ts @@ -10,15 +10,6 @@ import type React from 'react'; import type { ProductLine } from '../../common/product'; -export interface HeaderSection { - description?: (params: { - totalActiveSteps: number | null; - totalStepsLeft: number | null; - }) => React.ReactNode | null; - icon: EuiIconProps; - id: string; - title: string; -} export interface Section { cards?: Card[]; icon?: EuiIconProps; @@ -92,8 +83,11 @@ export interface ActiveCard { stepsLeft: number; activeStepIds: StepId[] | undefined; } - -export type ExpandedCardSteps = Record; +export interface ExpandedCardStep { + isExpanded: boolean; + expandedSteps: StepId[]; +} +export type ExpandedCardSteps = Record; export interface TogglePanelReducer { activeProducts: Set; activeSections: ActiveSections | null; diff --git a/x-pack/plugins/security_solution_serverless/public/get_started/use_setup_cards.tsx b/x-pack/plugins/security_solution_serverless/public/get_started/use_setup_cards.tsx index 3c0a94a6ab6e2..294589b4f017d 100644 --- a/x-pack/plugins/security_solution_serverless/public/get_started/use_setup_cards.tsx +++ b/x-pack/plugins/security_solution_serverless/public/get_started/use_setup_cards.tsx @@ -118,6 +118,7 @@ export const useSetUpSections = ({ borderRadius="none" css={css` margin: ${euiTheme.size.l} 0; + padding-top: 4px; `} key={currentSection.id} data-test-subj={`section-${currentSection.id}`} diff --git a/x-pack/plugins/security_solution_serverless/public/get_started/use_toggle_panel.test.tsx b/x-pack/plugins/security_solution_serverless/public/get_started/use_toggle_panel.test.tsx index 3061dcfdd0acb..0828d1d141dda 100644 --- a/x-pack/plugins/security_solution_serverless/public/get_started/use_toggle_panel.test.tsx +++ b/x-pack/plugins/security_solution_serverless/public/get_started/use_toggle_panel.test.tsx @@ -167,7 +167,7 @@ describe('useTogglePanel', () => { ); }); - test('should call addFinishedStepToStorage when onStepClicked is executed', () => { + test('should reset all the card steps in storage when a step is expanded. (As it allows only one step open at a time)', () => { const { result } = renderHook(() => useTogglePanel({ productTypes })); const { onStepClicked } = result.current; @@ -181,14 +181,31 @@ describe('useTogglePanel', () => { }); }); - expect(getStartedStorage.addFinishedStepToStorage).toHaveBeenCalledTimes(1); - expect(getStartedStorage.addFinishedStepToStorage).toHaveBeenCalledWith( + expect(getStartedStorage.resetAllExpandedCardStepsToStorage).toHaveBeenCalledTimes(1); + }); + + test('should add the current step to storage when it is expanded', () => { + const { result } = renderHook(() => useTogglePanel({ productTypes })); + + const { onStepClicked } = result.current; + + act(() => { + onStepClicked({ + stepId: IntroductionSteps.getToKnowElasticSecurity, + cardId: GetSetUpCardId.introduction, + sectionId: SectionId.getSetUp, + isExpanded: true, + }); + }); + + expect(getStartedStorage.addExpandedCardStepToStorage).toHaveBeenCalledTimes(1); + expect(getStartedStorage.addExpandedCardStepToStorage).toHaveBeenCalledWith( GetSetUpCardId.introduction, IntroductionSteps.getToKnowElasticSecurity ); }); - test('should not call addFinishedStepToStorage when the step is going to be collapsed', () => { + test('should remove the current step from storage when it is collapsed', () => { const { result } = renderHook(() => useTogglePanel({ productTypes })); const { onStepClicked } = result.current; @@ -202,7 +219,11 @@ describe('useTogglePanel', () => { }); }); - expect(getStartedStorage.addFinishedStepToStorage).not.toHaveBeenCalledTimes(1); + expect(getStartedStorage.removeExpandedCardStepFromStorage).toHaveBeenCalledTimes(1); + expect(getStartedStorage.removeExpandedCardStepFromStorage).toHaveBeenCalledWith( + GetSetUpCardId.introduction, + IntroductionSteps.getToKnowElasticSecurity + ); }); test('should call addFinishedStepToStorage when onStepButtonClicked is executed', () => { diff --git a/x-pack/plugins/security_solution_serverless/public/get_started/use_toggle_panel.tsx b/x-pack/plugins/security_solution_serverless/public/get_started/use_toggle_panel.tsx index b51c3d09d942d..361e56e9d90e6 100644 --- a/x-pack/plugins/security_solution_serverless/public/get_started/use_toggle_panel.tsx +++ b/x-pack/plugins/security_solution_serverless/public/get_started/use_toggle_panel.tsx @@ -23,6 +23,7 @@ export const useTogglePanel = ({ productTypes }: { productTypes: SecurityProduct getAllFinishedStepsFromStorage, getActiveProductsFromStorage, toggleActiveProductsInStorage, + resetAllExpandedCardStepsToStorage, addFinishedStepToStorage, removeFinishedStepFromStorage, addExpandedCardStepToStorage, @@ -79,17 +80,18 @@ export const useTogglePanel = ({ productTypes }: { productTypes: SecurityProduct payload: { stepId, cardId, isStepExpanded: isExpanded }, }); if (isExpanded) { - dispatch({ - type: GetStartedPageActions.AddFinishedStep, - payload: { stepId, cardId, sectionId }, - }); - addFinishedStepToStorage(cardId, stepId); + // It allows Only One step open at a time + resetAllExpandedCardStepsToStorage(); addExpandedCardStepToStorage(cardId, stepId); } else { removeExpandedCardStepFromStorage(cardId, stepId); } }, - [addExpandedCardStepToStorage, addFinishedStepToStorage, removeExpandedCardStepFromStorage] + [ + addExpandedCardStepToStorage, + removeExpandedCardStepFromStorage, + resetAllExpandedCardStepsToStorage, + ] ); const onCardClicked: OnCardClicked = useCallback( diff --git a/x-pack/plugins/security_solution_serverless/public/get_started/__mocks__/welcome_panel.tsx b/x-pack/plugins/security_solution_serverless/public/get_started/welcome_panel/__mocks__/index.tsx similarity index 100% rename from x-pack/plugins/security_solution_serverless/public/get_started/__mocks__/welcome_panel.tsx rename to x-pack/plugins/security_solution_serverless/public/get_started/welcome_panel/__mocks__/index.tsx diff --git a/x-pack/plugins/security_solution_serverless/public/get_started/welcome_panel/change_plan_link.test.tsx b/x-pack/plugins/security_solution_serverless/public/get_started/welcome_panel/change_plan_link.test.tsx new file mode 100644 index 0000000000000..7b1f82d368f5a --- /dev/null +++ b/x-pack/plugins/security_solution_serverless/public/get_started/welcome_panel/change_plan_link.test.tsx @@ -0,0 +1,45 @@ +/* + * 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 React from 'react'; +import { render } from '@testing-library/react'; +import '@testing-library/jest-dom/extend-expect'; // For DOM matchers like toBeInTheDocument +import { ChangePlanLink } from './change_plan_link'; // Replace with your import path +import { ProductTier } from '../../../common/product'; + +jest.mock('../../common/services', () => ({ + useKibana: jest.fn().mockReturnValue({ + services: { + cloud: { + projectsUrl: 'https://cloud.elastic.co/projects', + }, + }, + }), +})); + +describe('ChangePlanLink', () => { + it('renders nothing when productTier is undefined', () => { + const { container } = render(); + expect(container.firstChild).toBeNull(); + }); + + it('renders the link and badge when productTier is defined', () => { + const { getByText, getByTestId } = render( + + ); + const badge = getByTestId('product-tier-badge'); + const link = getByText('Change plan'); + expect(badge).toBeInTheDocument(); + expect(link).toBeInTheDocument(); + }); + + it('does not render badge when productTier is defined', () => { + const { queryByTestId } = render(); + const badge = queryByTestId('product-tier-badge'); + expect(badge).not.toBeInTheDocument(); + }); +}); diff --git a/x-pack/plugins/security_solution_serverless/public/get_started/welcome_panel/change_plan_link.tsx b/x-pack/plugins/security_solution_serverless/public/get_started/welcome_panel/change_plan_link.tsx new file mode 100644 index 0000000000000..19d6afd4a5843 --- /dev/null +++ b/x-pack/plugins/security_solution_serverless/public/get_started/welcome_panel/change_plan_link.tsx @@ -0,0 +1,65 @@ +/* + * 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 React from 'react'; +import { SecurityPageName } from '@kbn/security-solution-plugin/common'; +import { + EuiFlexGroup, + EuiFlexItem, + EuiIcon, + useEuiTheme, + useEuiBackgroundColorCSS, + EuiLink, +} from '@elastic/eui'; +import { css } from '@emotion/react'; +import type { ProductTier } from '../../../common/product'; +import { ProductTierBadge } from './product_tier_badge'; +import { WELCOME_PANEL_PROJECT_CREATED_CHANGE_PLAN_TITLE } from './translations'; +import { getCloudUrl } from '../../navigation/links/util'; +import { useKibana } from '../../common/services'; + +const ChangePlanLinkComponent = ({ productTier }: { productTier: ProductTier | undefined }) => { + const { euiTheme } = useEuiTheme(); + const { cloud } = useKibana().services; + const backgroundColorStyles = useEuiBackgroundColorCSS(); + return productTier ? ( + <> + {/* +
+

config_properties_pagerduty - Connector request properties for a PagerDuty connector Up

+
Defines properties for connectors when type is .pagerduty.
+
+
apiUrl (optional)
String The PagerDuty event URL.
+
+

config_properties_resilient - Connector request properties for a IBM Resilient connector Up

Defines properties for connectors when type is .resilient.
@@ -1574,7 +1584,7 @@ Any modifications made to this file will be overwritten.

connector_response_properties_pagerduty - Connector response properties for a PagerDuty connector Up

-
config
map[String, oas_any_type_not_mapped] Defines properties for connectors when type is .pagerduty.
+
config
connector_type_id
String The type of connector.
Enum:
.pagerduty
@@ -1856,12 +1866,12 @@ Any modifications made to this file will be overwritten.

create_connector_request_pagerduty - Create PagerDuty connector request Up

The PagerDuty connector uses the v2 Events API to trigger, acknowledge, and resolve PagerDuty alerts.
-
config
map[String, oas_any_type_not_mapped] Defines properties for connectors when type is .pagerduty.
+
config
connector_type_id
String The type of connector.
Enum:
.pagerduty
name
String The display name for the connector.
-
secrets
map[String, oas_any_type_not_mapped] Defines secrets for connectors when type is .pagerduty.
+
secrets
@@ -2376,6 +2386,13 @@ Any modifications made to this file will be overwritten.
apiKey
String The Opsgenie API authentication key for HTTP Basic authentication.
+
+

secrets_properties_pagerduty - Connector secrets properties for a PagerDuty connector Up

+
Defines secrets for connectors when type is .pagerduty.
+
+
routingKey
String A 32 character PagerDuty Integration Key for an integration on a service.
+
+

secrets_properties_resilient - Connector secrets properties for IBM Resilient connector Up

Defines secrets for connectors when type is .resilient.
@@ -2471,6 +2488,15 @@ Any modifications made to this file will be overwritten.
secrets
+

update_connector_request_resilient - Update IBM Resilient connector request Up

diff --git a/docs/management/connectors/action-types/pagerduty.asciidoc b/docs/management/connectors/action-types/pagerduty.asciidoc index a82a9639beee6..e9db3eb00360d 100644 --- a/docs/management/connectors/action-types/pagerduty.asciidoc +++ b/docs/management/connectors/action-types/pagerduty.asciidoc @@ -3,6 +3,10 @@ ++++ PagerDuty ++++ +:frontmatter-description: Add a connector that can manage PagerDuty alerts. +:frontmatter-tags-products: [kibana] +:frontmatter-tags-content-type: [how-to] +:frontmatter-tags-user-goals: [configure] The PagerDuty connector uses the https://v2.developer.pagerduty.com/docs/events-api-v2[v2 Events API] to trigger, acknowledge, and resolve PagerDuty alerts. @@ -27,34 +31,6 @@ Name:: The name of the connector. The name is used to identify a connector API URL:: An optional PagerDuty event URL. Defaults to `https://events.pagerduty.com/v2/enqueue`. If you are using the <> setting, make sure the hostname is added to the allowed hosts. Integration Key:: A 32 character PagerDuty Integration Key for an integration on a service, also referred to as the routing key. -[float] -[[preconfigured-pagerduty-configuration]] -=== Create preconfigured connectors - -If you are running {kib} on-prem, you can define connectors by -adding `xpack.actions.preconfigured` settings to your `kibana.yml` file. -For example: - -[source,text] --- -xpack.actions.preconfigured: - my-pagerduty: - name: preconfigured-pagerduty-connector-type - actionTypeId: .pagerduty - config: - apiUrl: https://test.host - secrets: - routingKey: testroutingkey --- - -Config defines information for the connector type. - -`apiURL`:: A URL string that corresponds to *API URL*. - -Secrets defines sensitive information for the connector type. - -`routingKey`:: A string that corresponds to *Integration Key*. - [float] [[pagerduty-action-configuration]] === Test connectors diff --git a/docs/management/connectors/pre-configured-connectors.asciidoc b/docs/management/connectors/pre-configured-connectors.asciidoc index 443fda6cba218..c2c63ae913384 100644 --- a/docs/management/connectors/pre-configured-connectors.asciidoc +++ b/docs/management/connectors/pre-configured-connectors.asciidoc @@ -108,6 +108,7 @@ Index names must start with `kibana-alert-history-` to take advantage of the pre * <> * <> +* <> * <> * <> @@ -151,6 +152,26 @@ xpack.actions.preconfigured: <1> The {opsgenie} URL. <2> The {opsgenie} API authentication key for HTTP basic authentication. +[float] +[[preconfigured-pagerduty-configuration]] +==== PagerDuty connectors + +The following example creates a <>: + +[source,text] +-- +xpack.actions.preconfigured: + my-pagerduty: + name: preconfigured-pagerduty-connector-type + actionTypeId: .pagerduty + config: + apiUrl: https://test.host <1> + secrets: + routingKey: testroutingkey <2> +-- +<1> The PagerDuty event URL. +<2> A 32 character PagerDuty Integration Key for an integration on a service, also referred to as the routing key. + [float] [[preconfigured-server-log-configuration]] ==== Server log connectors diff --git a/docs/settings/alert-action-settings.asciidoc b/docs/settings/alert-action-settings.asciidoc index 37d391404bcb8..c863c5d5e837f 100644 --- a/docs/settings/alert-action-settings.asciidoc +++ b/docs/settings/alert-action-settings.asciidoc @@ -260,6 +260,7 @@ A configuration URL that varies by connector: + -- * For an <>, specifies the {opsgenie} URL. For example, `https://api.opsgenie.com` or `https://api.eu.opsgenie.com`. +* For a <>, specifies the PagerDuty event URL. Defaults to `https://events.pagerduty.com/v2/enqueue`. NOTE: If you are using the `xpack.actions.allowedHosts` setting, make sure the hostname in the URL is added to the allowed hosts. -- @@ -285,6 +286,8 @@ An API key secret that varies by connector: * For an <>, specifies the {opsgenie} API authentication key for HTTP basic authentication. -- +`xpack.actions.preconfigured..secrets.routingKey`:: +For a <>, specifies the 32 character PagerDuty Integration Key for an integration on a service, also referred to as the routing key. [float] [[alert-settings]] diff --git a/x-pack/plugins/actions/docs/openapi/bundled.json b/x-pack/plugins/actions/docs/openapi/bundled.json index ebd18fad973a3..d6ca91579738d 100644 --- a/x-pack/plugins/actions/docs/openapi/bundled.json +++ b/x-pack/plugins/actions/docs/openapi/bundled.json @@ -454,6 +454,9 @@ { "$ref": "#/components/schemas/update_connector_request_opsgenie" }, + { + "$ref": "#/components/schemas/update_connector_request_pagerduty" + }, { "$ref": "#/components/schemas/update_connector_request_resilient" }, @@ -1837,13 +1840,28 @@ "title": "Connector request properties for a PagerDuty connector", "description": "Defines properties for connectors when type is `.pagerduty`.", "type": "object", - "additionalProperties": true + "properties": { + "apiUrl": { + "description": "The PagerDuty event URL.", + "type": "string", + "nullable": true, + "example": "https://events.pagerduty.com/v2/enqueue" + } + } }, "secrets_properties_pagerduty": { "title": "Connector secrets properties for a PagerDuty connector", "description": "Defines secrets for connectors when type is `.pagerduty`.", "type": "object", - "additionalProperties": true + "required": [ + "routingKey" + ], + "properties": { + "routingKey": { + "description": "A 32 character PagerDuty Integration Key for an integration on a service.\n", + "type": "string" + } + } }, "create_connector_request_pagerduty": { "title": "Create PagerDuty connector request", @@ -3712,6 +3730,27 @@ } } }, + "update_connector_request_pagerduty": { + "title": "Update PagerDuty connector request", + "type": "object", + "required": [ + "config", + "name", + "secrets" + ], + "properties": { + "config": { + "$ref": "#/components/schemas/config_properties_pagerduty" + }, + "name": { + "type": "string", + "description": "The display name for the connector." + }, + "secrets": { + "$ref": "#/components/schemas/secrets_properties_pagerduty" + } + } + }, "update_connector_request_resilient": { "title": "Update IBM Resilient connector request", "type": "object", diff --git a/x-pack/plugins/actions/docs/openapi/bundled.yaml b/x-pack/plugins/actions/docs/openapi/bundled.yaml index 39a6bea27385f..611ec6c72309a 100644 --- a/x-pack/plugins/actions/docs/openapi/bundled.yaml +++ b/x-pack/plugins/actions/docs/openapi/bundled.yaml @@ -242,6 +242,7 @@ paths: - $ref: '#/components/schemas/update_connector_request_index' - $ref: '#/components/schemas/update_connector_request_jira' - $ref: '#/components/schemas/update_connector_request_opsgenie' + - $ref: '#/components/schemas/update_connector_request_pagerduty' - $ref: '#/components/schemas/update_connector_request_resilient' - $ref: '#/components/schemas/update_connector_request_serverlog' - $ref: '#/components/schemas/update_connector_request_servicenow' @@ -1162,12 +1163,23 @@ components: title: Connector request properties for a PagerDuty connector description: Defines properties for connectors when type is `.pagerduty`. type: object - additionalProperties: true + properties: + apiUrl: + description: The PagerDuty event URL. + type: string + nullable: true + example: https://events.pagerduty.com/v2/enqueue secrets_properties_pagerduty: title: Connector secrets properties for a PagerDuty connector description: Defines secrets for connectors when type is `.pagerduty`. type: object - additionalProperties: true + required: + - routingKey + properties: + routingKey: + description: | + A 32 character PagerDuty Integration Key for an integration on a service. + type: string create_connector_request_pagerduty: title: Create PagerDuty connector request description: | @@ -2553,6 +2565,21 @@ components: description: The display name for the connector. secrets: $ref: '#/components/schemas/secrets_properties_opsgenie' + update_connector_request_pagerduty: + title: Update PagerDuty connector request + type: object + required: + - config + - name + - secrets + properties: + config: + $ref: '#/components/schemas/config_properties_pagerduty' + name: + type: string + description: The display name for the connector. + secrets: + $ref: '#/components/schemas/secrets_properties_pagerduty' update_connector_request_resilient: title: Update IBM Resilient connector request type: object diff --git a/x-pack/plugins/actions/docs/openapi/components/schemas/config_properties_pagerduty.yaml b/x-pack/plugins/actions/docs/openapi/components/schemas/config_properties_pagerduty.yaml index c9a98a9619d85..562557f548ece 100644 --- a/x-pack/plugins/actions/docs/openapi/components/schemas/config_properties_pagerduty.yaml +++ b/x-pack/plugins/actions/docs/openapi/components/schemas/config_properties_pagerduty.yaml @@ -1,5 +1,9 @@ title: Connector request properties for a PagerDuty connector description: Defines properties for connectors when type is `.pagerduty`. type: object -additionalProperties: true -# TO-DO: Add the properties for this connector. \ No newline at end of file +properties: + apiUrl: + description: The PagerDuty event URL. + type: string + nullable: true + example: https://events.pagerduty.com/v2/enqueue \ No newline at end of file diff --git a/x-pack/plugins/actions/docs/openapi/components/schemas/secrets_properties_pagerduty.yaml b/x-pack/plugins/actions/docs/openapi/components/schemas/secrets_properties_pagerduty.yaml index 14d0c6fbefd69..d4259fe45a0f4 100644 --- a/x-pack/plugins/actions/docs/openapi/components/schemas/secrets_properties_pagerduty.yaml +++ b/x-pack/plugins/actions/docs/openapi/components/schemas/secrets_properties_pagerduty.yaml @@ -1,5 +1,10 @@ title: Connector secrets properties for a PagerDuty connector description: Defines secrets for connectors when type is `.pagerduty`. type: object -additionalProperties: true -# TO-DO: Add the properties for this connector. \ No newline at end of file +required: + - routingKey +properties: + routingKey: + description: > + A 32 character PagerDuty Integration Key for an integration on a service. + type: string \ No newline at end of file diff --git a/x-pack/plugins/actions/docs/openapi/paths/s@{spaceid}@api@actions@connector@{connectorid}.yaml b/x-pack/plugins/actions/docs/openapi/paths/s@{spaceid}@api@actions@connector@{connectorid}.yaml index 9b6279bcb18a7..f0158d9c2a5cd 100644 --- a/x-pack/plugins/actions/docs/openapi/paths/s@{spaceid}@api@actions@connector@{connectorid}.yaml +++ b/x-pack/plugins/actions/docs/openapi/paths/s@{spaceid}@api@actions@connector@{connectorid}.yaml @@ -164,7 +164,7 @@ put: - $ref: '../components/schemas/update_connector_request_index.yaml' - $ref: '../components/schemas/update_connector_request_jira.yaml' - $ref: '../components/schemas/update_connector_request_opsgenie.yaml' -# - $ref: '../components/schemas/update_connector_request_pagerduty.yaml' + - $ref: '../components/schemas/update_connector_request_pagerduty.yaml' - $ref: '../components/schemas/update_connector_request_resilient.yaml' - $ref: '../components/schemas/update_connector_request_serverlog.yaml' - $ref: '../components/schemas/update_connector_request_servicenow.yaml' From c974e5c2260a449b9fed7146e1bfab2211ad18e9 Mon Sep 17 00:00:00 2001 From: Tiago Costa Date: Thu, 7 Sep 2023 04:13:38 +0100 Subject: [PATCH 89/97] skip flaky suite (#165885) --- .../functional/test_suites/observability/landing_page.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/x-pack/test_serverless/functional/test_suites/observability/landing_page.ts b/x-pack/test_serverless/functional/test_suites/observability/landing_page.ts index b8e645a93f307..08b3879d5f6d3 100644 --- a/x-pack/test_serverless/functional/test_suites/observability/landing_page.ts +++ b/x-pack/test_serverless/functional/test_suites/observability/landing_page.ts @@ -12,7 +12,8 @@ export default function ({ getPageObject, getService }: FtrProviderContext) { const svlObltNavigation = getService('svlObltNavigation'); const SvlObltOnboardingStreamLogFilePage = getPageObject('SvlObltOnboardingStreamLogFilePage'); - describe('landing page', function () { + // FLAKY: https://github.com/elastic/kibana/issues/165885 + describe.skip('landing page', function () { it('has quickstart badge', async () => { await svlObltNavigation.navigateToLandingPage(); await svlObltOnboardingPage.assertQuickstartBadgeExists(); From 43a70d3939c79650f2da742bdaf781ab78fa8abd Mon Sep 17 00:00:00 2001 From: Tiago Costa Date: Thu, 7 Sep 2023 04:15:14 +0100 Subject: [PATCH 90/97] skip flaky suite (#165882) --- .../common/examples/unified_field_list_examples/field_stats.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/x-pack/test_serverless/functional/test_suites/common/examples/unified_field_list_examples/field_stats.ts b/x-pack/test_serverless/functional/test_suites/common/examples/unified_field_list_examples/field_stats.ts index 492f6951fb3b5..aacd1352280bb 100644 --- a/x-pack/test_serverless/functional/test_suites/common/examples/unified_field_list_examples/field_stats.ts +++ b/x-pack/test_serverless/functional/test_suites/common/examples/unified_field_list_examples/field_stats.ts @@ -21,7 +21,8 @@ export default ({ getService, getPageObjects }: FtrProviderContext) => { const filterBar = getService('filterBar'); const dataViewTitle = 'logstash-2015.09.22'; - describe('Field stats', () => { + // FLAKY: https://github.com/elastic/kibana/issues/165882 + describe.skip('Field stats', () => { before(async () => { await kibanaServer.savedObjects.cleanStandardList(); await esArchiver.loadIfNeeded('x-pack/test/functional/es_archives/logstash_functional'); From 962a027040df8b2dea90d6aeefe002fb9c3fed61 Mon Sep 17 00:00:00 2001 From: Candace Park <56409205+parkiino@users.noreply.github.com> Date: Thu, 7 Sep 2023 00:46:01 -0400 Subject: [PATCH 91/97] [Fleet][Agent List][Encryption Key] Missing encryption key callout in agent list (#165409) ## Summary - [x] Callout for missing encryption key in the agent list - [x] Dismissing the callout will prevent it from appearing again # Screenshots ![optimized](https://github.com/elastic/kibana/assets/56409205/06e71f58-0ff5-41ed-8f29-da35685f8fb8) --- .../agents/agent_list_page/hooks/index.tsx | 1 + .../use_missing_encryption_key_callout.ts | 40 +++++++++++++ .../agents/agent_list_page/index.test.tsx | 6 ++ .../sections/agents/agent_list_page/index.tsx | 13 ++++- ..._server_missing_encryption_key_callout.tsx | 58 +++++++++++++++++++ .../fleet_server_callouts/index.tsx | 1 + 6 files changed, 118 insertions(+), 1 deletion(-) create mode 100644 x-pack/plugins/fleet/public/applications/fleet/sections/agents/agent_list_page/hooks/use_missing_encryption_key_callout.ts create mode 100644 x-pack/plugins/fleet/public/applications/fleet/sections/agents/components/fleet_server_callouts/fleet_server_missing_encryption_key_callout.tsx diff --git a/x-pack/plugins/fleet/public/applications/fleet/sections/agents/agent_list_page/hooks/index.tsx b/x-pack/plugins/fleet/public/applications/fleet/sections/agents/agent_list_page/hooks/index.tsx index a270aadcd72e4..29d4b24443031 100644 --- a/x-pack/plugins/fleet/public/applications/fleet/sections/agents/agent_list_page/hooks/index.tsx +++ b/x-pack/plugins/fleet/public/applications/fleet/sections/agents/agent_list_page/hooks/index.tsx @@ -10,3 +10,4 @@ export { useActionStatus } from './use_action_status'; export { useLastSeenInactiveAgentsCount } from './use_last_seen_inactive_agents_count'; export { useInactiveAgentsCalloutHasBeenDismissed } from './use_inactive_agents_callout_has_been_dismissed'; export { useAgentSoftLimit } from './use_agent_soft_limit'; +export { useMissingEncryptionKeyCallout } from './use_missing_encryption_key_callout'; diff --git a/x-pack/plugins/fleet/public/applications/fleet/sections/agents/agent_list_page/hooks/use_missing_encryption_key_callout.ts b/x-pack/plugins/fleet/public/applications/fleet/sections/agents/agent_list_page/hooks/use_missing_encryption_key_callout.ts new file mode 100644 index 0000000000000..7438eae299285 --- /dev/null +++ b/x-pack/plugins/fleet/public/applications/fleet/sections/agents/agent_list_page/hooks/use_missing_encryption_key_callout.ts @@ -0,0 +1,40 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { useMemo, useCallback, useState, useEffect } from 'react'; + +import { useFleetStatus, useStartServices } from '../../../../hooks'; + +const LOCAL_STORAGE_KEY = 'fleet.missingEncryptionKeyCalloutHasBeenDismissed'; + +export const useMissingEncryptionKeyCallout = (): [boolean, () => void] => { + const { missingOptionalFeatures } = useFleetStatus(); + const { storage } = useStartServices(); + + const [isCalloutDismissed, setIsCalloutDismissed] = useState(false); + + useEffect(() => { + const storageValue = storage.get(LOCAL_STORAGE_KEY); + if (storageValue) { + setIsCalloutDismissed(Boolean(storageValue)); + } + }, [storage]); + const canShowMissingEncryptionKeyCallout = useMemo(() => { + if (isCalloutDismissed || !missingOptionalFeatures) { + return false; + } + + return missingOptionalFeatures.includes('encrypted_saved_object_encryption_key_required'); + }, [missingOptionalFeatures, isCalloutDismissed]); + + const dismissEncryptionKeyCallout = useCallback(() => { + storage.set(LOCAL_STORAGE_KEY, 'true'); + setIsCalloutDismissed(true); + }, [storage]); + + return [canShowMissingEncryptionKeyCallout, dismissEncryptionKeyCallout]; +}; diff --git a/x-pack/plugins/fleet/public/applications/fleet/sections/agents/agent_list_page/index.test.tsx b/x-pack/plugins/fleet/public/applications/fleet/sections/agents/agent_list_page/index.test.tsx index 84394f1ab5c0d..030dc857f9d4b 100644 --- a/x-pack/plugins/fleet/public/applications/fleet/sections/agents/agent_list_page/index.test.tsx +++ b/x-pack/plugins/fleet/public/applications/fleet/sections/agents/agent_list_page/index.test.tsx @@ -21,6 +21,11 @@ import { AgentListPage } from '.'; jest.mock('../../../../integrations/hooks/use_confirm_force_install', () => ({ useConfirmForceInstall: () => <>confirmForceInstall, })); + +jest.mock('./hooks/use_missing_encryption_key_callout', () => ({ + useMissingEncryptionKeyCallout: jest.fn().mockReturnValue([true, jest.fn()]), +})); + jest.mock('../../../hooks', () => ({ ...jest.requireActual('../../../hooks'), UIExtensionsContext: { @@ -54,6 +59,7 @@ jest.mock('../../../hooks', () => ({ }, cloud: {}, data: { dataViews: { getFieldsForWildcard: jest.fn() } }, + docLinks: { links: { kibana: { secureSavedObject: 'my-link' } } }, }), useBreadcrumbs: jest.fn(), useLink: jest.fn().mockReturnValue({ getHref: jest.fn() }), diff --git a/x-pack/plugins/fleet/public/applications/fleet/sections/agents/agent_list_page/index.tsx b/x-pack/plugins/fleet/public/applications/fleet/sections/agents/agent_list_page/index.tsx index 123fdfad5543e..72a50d11d4ee7 100644 --- a/x-pack/plugins/fleet/public/applications/fleet/sections/agents/agent_list_page/index.tsx +++ b/x-pack/plugins/fleet/public/applications/fleet/sections/agents/agent_list_page/index.tsx @@ -37,6 +37,7 @@ import { AgentUnenrollAgentModal, AgentUpgradeAgentModal, FleetServerCloudUnhealthyCallout, + FleetServerMissingEncryptionKeyCallout, FleetServerOnPremUnhealthyCallout, } from '../components'; import { useFleetServerUnhealthy } from '../hooks/use_fleet_server_unhealthy'; @@ -51,7 +52,7 @@ import { AgentActivityFlyout, AgentSoftLimitCallout } from './components'; import { TableRowActions } from './components/table_row_actions'; import { AgentListTable } from './components/agent_list_table'; import { getKuery } from './utils/get_kuery'; -import { useAgentSoftLimit } from './hooks'; +import { useAgentSoftLimit, useMissingEncryptionKeyCallout } from './hooks'; const REFRESH_INTERVAL_MS = 30000; @@ -392,6 +393,10 @@ export const AgentListPage: React.FunctionComponent<{}> = () => { return policyHasFleetServer(agentPolicy); }, [agentToUnenroll, agentPoliciesIndexedById]); + // Missing Encryption key + const [canShowMissingEncryptionKeyCallout, dismissEncryptionKeyCallout] = + useMissingEncryptionKeyCallout(); + // Fleet server unhealthy status const { isUnhealthy: isFleetServerUnhealthy } = useFleetServerUnhealthy(); const { isFleetServerStandalone } = useFleetServerStandalone(); @@ -523,6 +528,12 @@ export const AgentListPage: React.FunctionComponent<{}> = () => { )} + {canShowMissingEncryptionKeyCallout && ( + <> + + + + )} {shouldDisplayAgentSoftLimit && ( <> diff --git a/x-pack/plugins/fleet/public/applications/fleet/sections/agents/components/fleet_server_callouts/fleet_server_missing_encryption_key_callout.tsx b/x-pack/plugins/fleet/public/applications/fleet/sections/agents/components/fleet_server_callouts/fleet_server_missing_encryption_key_callout.tsx new file mode 100644 index 0000000000000..ce75286a2c316 --- /dev/null +++ b/x-pack/plugins/fleet/public/applications/fleet/sections/agents/components/fleet_server_callouts/fleet_server_missing_encryption_key_callout.tsx @@ -0,0 +1,58 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React from 'react'; +import { EuiButtonEmpty, EuiCallOut, EuiLink } from '@elastic/eui'; +import { FormattedMessage } from '@kbn/i18n-react'; + +import { useStartServices } from '../../../../hooks'; + +export interface FleetServerMissingEncryptionKeyCalloutProps { + onClickHandler: () => void; +} + +export const FleetServerMissingEncryptionKeyCallout: React.FunctionComponent< + FleetServerMissingEncryptionKeyCalloutProps +> = ({ onClickHandler }) => { + const { docLinks } = useStartServices(); + return ( + + } + > +

+ + + + ), + }} + /> +

+ + + +
+ ); +}; diff --git a/x-pack/plugins/fleet/public/applications/fleet/sections/agents/components/fleet_server_callouts/index.tsx b/x-pack/plugins/fleet/public/applications/fleet/sections/agents/components/fleet_server_callouts/index.tsx index 04f4c32437069..857a25e0c6e5c 100644 --- a/x-pack/plugins/fleet/public/applications/fleet/sections/agents/components/fleet_server_callouts/index.tsx +++ b/x-pack/plugins/fleet/public/applications/fleet/sections/agents/components/fleet_server_callouts/index.tsx @@ -9,3 +9,4 @@ export * from './fleet_server_cloud_unhealthy_callout'; export * from './fleet_server_on_prem_unhealthy_callout'; export * from './fleet_server_on_prem_required_callout'; export * from './fleet_server_missing_privileges'; +export * from './fleet_server_missing_encryption_key_callout'; From b46b356a90f806e6e4e7258fd4df34cd2b08deba Mon Sep 17 00:00:00 2001 From: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> Date: Thu, 7 Sep 2023 00:59:36 -0400 Subject: [PATCH 92/97] [api-docs] 2023-09-07 Daily api_docs build (#165925) Generated by https://buildkite.com/elastic/kibana-api-docs-daily/builds/453 --- api_docs/actions.mdx | 2 +- api_docs/advanced_settings.mdx | 2 +- api_docs/aiops.mdx | 2 +- api_docs/alerting.devdocs.json | 56 +- 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_chat.mdx | 2 +- api_docs/cloud_chat_provider.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.devdocs.json | 66 +- api_docs/data.mdx | 2 +- api_docs/data_query.mdx | 2 +- api_docs/data_search.mdx | 2 +- 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.devdocs.json | 135 +- api_docs/data_views.mdx | 4 +- api_docs/data_visualizer.mdx | 2 +- api_docs/deprecations_by_api.mdx | 2 +- api_docs/deprecations_by_plugin.mdx | 12 +- api_docs/deprecations_by_team.mdx | 2 +- api_docs/dev_tools.mdx | 2 +- api_docs/discover.devdocs.json | 274 + api_docs/discover.mdx | 4 +- 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.devdocs.json | 83 +- api_docs/enterprise_search.mdx | 7 +- api_docs/es_ui_shared.mdx | 2 +- api_docs/event_annotation.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.devdocs.json | 42 - api_docs/file_upload.mdx | 4 +- api_docs/files.mdx | 2 +- api_docs/files_management.mdx | 2 +- api_docs/fleet.devdocs.json | 122 + api_docs/fleet.mdx | 4 +- 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 | 54 + api_docs/index_management.mdx | 4 +- 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.mdx | 2 +- 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 | 192 +- 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 +- ...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_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 +- api_docs/kbn_default_nav_analytics.mdx | 2 +- api_docs/kbn_default_nav_devtools.mdx | 2 +- api_docs/kbn_default_nav_management.mdx | 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.devdocs.json | 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.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_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 +- ...n_management_settings_section_registry.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 +- .../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 +- 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_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_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.devdocs.json | 24537 ++++++++++++++++ api_docs/kbn_search_connectors.mdx | 42 + 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_project_switcher.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 +- 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_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.mdx | 2 +- 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_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/lists.mdx | 2 +- api_docs/log_explorer.devdocs.json | 64 +- api_docs/log_explorer.mdx | 7 +- api_docs/logs_shared.mdx | 2 +- api_docs/management.mdx | 2 +- api_docs/maps.mdx | 2 +- api_docs/maps_ems.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.devdocs.json | 2 +- api_docs/observability.mdx | 2 +- api_docs/observability_a_i_assistant.mdx | 2 +- .../observability_onboarding.devdocs.json | 18 +- api_docs/observability_onboarding.mdx | 7 +- api_docs/observability_shared.mdx | 2 +- api_docs/osquery.mdx | 2 +- api_docs/plugin_directory.mdx | 25 +- 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.devdocs.json | 4 +- 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 +- 587 files changed, 25940 insertions(+), 955 deletions(-) create mode 100644 api_docs/kbn_search_connectors.devdocs.json create mode 100644 api_docs/kbn_search_connectors.mdx diff --git a/api_docs/actions.mdx b/api_docs/actions.mdx index 0985f86300e69..0e911e1388269 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-09-06 +date: 2023-09-07 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 4db3eb7532c53..950786cd3b4f0 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-09-06 +date: 2023-09-07 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 85d9b71699e77..eec6749c64c74 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-09-06 +date: 2023-09-07 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 b6e47ef82750d..4f8b13c4cf84c 100644 --- a/api_docs/alerting.devdocs.json +++ b/api_docs/alerting.devdocs.json @@ -3348,10 +3348,6 @@ "plugin": "stackAlerts", "path": "x-pack/plugins/stack_alerts/server/rule_types/index_threshold/rule_type.ts" }, - { - "plugin": "stackAlerts", - "path": "x-pack/plugins/stack_alerts/server/rule_types/index_threshold/rule_type.ts" - }, { "plugin": "stackAlerts", "path": "x-pack/plugins/stack_alerts/server/rule_types/geo_containment/lib/get_entities_and_generate_alerts.ts" @@ -4354,7 +4350,7 @@ "label": "AlertingRulesConfig", "description": [], "signature": [ - "Pick; run: Readonly<{ timeout?: string | undefined; ruleTypeOverrides?: Readonly<{ timeout?: string | undefined; } & { id: string; }>[] | undefined; } & { actions: Readonly<{ connectorTypeOverrides?: Readonly<{ max?: number | undefined; } & { id: string; }>[] | undefined; } & { max: number; }>; alerts: Readonly<{} & { max: number; }>; }>; }>, \"minimumScheduleInterval\"> & { isUsingSecurity: boolean; }" + "Pick; maxScheduledPerMinute: number; run: Readonly<{ timeout?: string | undefined; ruleTypeOverrides?: Readonly<{ timeout?: string | undefined; } & { id: string; }>[] | undefined; } & { actions: Readonly<{ connectorTypeOverrides?: Readonly<{ max?: number | undefined; } & { id: string; }>[] | undefined; } & { max: number; }>; alerts: Readonly<{} & { max: number; }>; }>; }>, \"minimumScheduleInterval\" | \"maxScheduledPerMinute\"> & { isUsingSecurity: boolean; }" ], "path": "x-pack/plugins/alerting/server/config.ts", "deprecated": false, @@ -4891,7 +4887,7 @@ }, " | undefined; getTags: (params: Readonly<{ search?: string | undefined; perPage?: number | undefined; } & { page: number; }>) => Promise<", "GetTagsResult", - ">; getAlertFromRaw: (params: ", + ">; getScheduleFrequency: () => Promise>; getAlertFromRaw: (params: ", "GetAlertFromRawParams", ") => ", { @@ -5107,6 +5103,54 @@ "returnComment": [], "initialIsOpen": false }, + { + "parentPluginId": "alerting", + "id": "def-common.convertDurationToFrequency", + "type": "Function", + "tags": [], + "label": "convertDurationToFrequency", + "description": [], + "signature": [ + "(duration: string, denomination: number) => number" + ], + "path": "x-pack/plugins/alerting/common/parse_duration.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "alerting", + "id": "def-common.convertDurationToFrequency.$1", + "type": "string", + "tags": [], + "label": "duration", + "description": [], + "signature": [ + "string" + ], + "path": "x-pack/plugins/alerting/common/parse_duration.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + }, + { + "parentPluginId": "alerting", + "id": "def-common.convertDurationToFrequency.$2", + "type": "number", + "tags": [], + "label": "denomination", + "description": [], + "signature": [ + "number" + ], + "path": "x-pack/plugins/alerting/common/parse_duration.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + } + ], + "returnComment": [], + "initialIsOpen": false + }, { "parentPluginId": "alerting", "id": "def-common.formatDefaultAggregationResult", diff --git a/api_docs/alerting.mdx b/api_docs/alerting.mdx index 319891bcf513d..d9179b60a4569 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-09-06 +date: 2023-09-07 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 | |-------------------|-----------|------------------------|-----------------| -| 790 | 1 | 759 | 49 | +| 793 | 1 | 762 | 49 | ## Client diff --git a/api_docs/apm.mdx b/api_docs/apm.mdx index a895f490187fb..70247d54ed182 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-09-06 +date: 2023-09-07 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 2373d1d20cfac..fd59d9c3ea435 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-09-06 +date: 2023-09-07 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 5a2e02e21714f..7246565be88f0 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-09-06 +date: 2023-09-07 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 71690f87c1a92..d5c3222b55598 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-09-06 +date: 2023-09-07 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 cc1fe5f9fa748..ffc745e80bce4 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-09-06 +date: 2023-09-07 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 f8d7b2a27d369..6666facbefa25 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-09-06 +date: 2023-09-07 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 1af3539ef5ac9..5fee0ae6cc0db 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-09-06 +date: 2023-09-07 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 d3d61657ed676..fd9d2db8180c1 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-09-06 +date: 2023-09-07 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 01f2089596b6a..c1dc9279cd53c 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-09-06 +date: 2023-09-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'cloud'] --- import cloudObj from './cloud.devdocs.json'; diff --git a/api_docs/cloud_chat.mdx b/api_docs/cloud_chat.mdx index be0fb6438525b..4376a5d930938 100644 --- a/api_docs/cloud_chat.mdx +++ b/api_docs/cloud_chat.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/cloudChat title: "cloudChat" image: https://source.unsplash.com/400x175/?github description: API docs for the cloudChat plugin -date: 2023-09-06 +date: 2023-09-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'cloudChat'] --- import cloudChatObj from './cloud_chat.devdocs.json'; diff --git a/api_docs/cloud_chat_provider.mdx b/api_docs/cloud_chat_provider.mdx index 88d1e38aa0e5a..2bd7a50cded91 100644 --- a/api_docs/cloud_chat_provider.mdx +++ b/api_docs/cloud_chat_provider.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/cloudChatProvider title: "cloudChatProvider" image: https://source.unsplash.com/400x175/?github description: API docs for the cloudChatProvider plugin -date: 2023-09-06 +date: 2023-09-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'cloudChatProvider'] --- import cloudChatProviderObj from './cloud_chat_provider.devdocs.json'; diff --git a/api_docs/cloud_data_migration.mdx b/api_docs/cloud_data_migration.mdx index b6124e08cd350..621475c234897 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-09-06 +date: 2023-09-07 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 4e21c123a96e8..b4bc426ec27f3 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-09-06 +date: 2023-09-07 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 8efe7de4747d1..f63c1e23364b7 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-09-06 +date: 2023-09-07 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 4c8df64fa2cfc..52c0e2cb60a26 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-09-06 +date: 2023-09-07 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 4940ef352585c..f2c725ae8eb92 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-09-06 +date: 2023-09-07 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 3237478bf66c9..987b34a2c2fc1 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-09-06 +date: 2023-09-07 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 2cb7a44d97fd0..0ca1d3881a938 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-09-06 +date: 2023-09-07 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 d13956de9f217..5b53bb97d7dab 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-09-06 +date: 2023-09-07 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 12a480db48c7d..8b9ba774d9a7d 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-09-06 +date: 2023-09-07 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 74994c4829bec..44a1aa4710043 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-09-06 +date: 2023-09-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'dashboardEnhanced'] --- import dashboardEnhancedObj from './dashboard_enhanced.devdocs.json'; diff --git a/api_docs/data.devdocs.json b/api_docs/data.devdocs.json index 31a0b4ae7ada9..84b3aa93242c4 100644 --- a/api_docs/data.devdocs.json +++ b/api_docs/data.devdocs.json @@ -12801,23 +12801,23 @@ "references": [ { "plugin": "stackAlerts", - "path": "x-pack/plugins/stack_alerts/public/rule_types/geo_containment/query_builder/expressions/boundary_index_expression.tsx" + "path": "x-pack/plugins/stack_alerts/public/rule_types/geo_containment/rule_form/data_view_select.tsx" }, { "plugin": "stackAlerts", - "path": "x-pack/plugins/stack_alerts/public/rule_types/geo_containment/query_builder/expressions/entity_index_expression.tsx" + "path": "x-pack/plugins/stack_alerts/public/rule_types/geo_containment/rule_form/boundary_form.tsx" }, { "plugin": "stackAlerts", - "path": "x-pack/plugins/stack_alerts/public/rule_types/geo_containment/query_builder/index.tsx" + "path": "x-pack/plugins/stack_alerts/public/rule_types/geo_containment/rule_form/boundary_form.tsx" }, { "plugin": "stackAlerts", - "path": "x-pack/plugins/stack_alerts/public/rule_types/geo_containment/query_builder/index.tsx" + "path": "x-pack/plugins/stack_alerts/public/rule_types/geo_containment/rule_form/entity_form.tsx" }, { "plugin": "stackAlerts", - "path": "x-pack/plugins/stack_alerts/public/rule_types/geo_containment/query_builder/index.tsx" + "path": "x-pack/plugins/stack_alerts/public/rule_types/geo_containment/rule_form/entity_form.tsx" }, { "plugin": "infra", @@ -13841,35 +13841,11 @@ }, { "plugin": "stackAlerts", - "path": "x-pack/plugins/stack_alerts/public/rule_types/geo_containment/query_builder/expressions/boundary_index_expression.tsx" + "path": "x-pack/plugins/stack_alerts/public/rule_types/geo_containment/rule_form/boundary_form.tsx" }, { "plugin": "stackAlerts", - "path": "x-pack/plugins/stack_alerts/public/rule_types/geo_containment/query_builder/expressions/entity_index_expression.tsx" - }, - { - "plugin": "stackAlerts", - "path": "x-pack/plugins/stack_alerts/public/rule_types/geo_containment/query_builder/index.tsx" - }, - { - "plugin": "stackAlerts", - "path": "x-pack/plugins/stack_alerts/public/rule_types/geo_containment/query_builder/index.tsx" - }, - { - "plugin": "stackAlerts", - "path": "x-pack/plugins/stack_alerts/public/rule_types/geo_containment/query_builder/index.tsx" - }, - { - "plugin": "stackAlerts", - "path": "x-pack/plugins/stack_alerts/public/rule_types/geo_containment/query_builder/index.tsx" - }, - { - "plugin": "stackAlerts", - "path": "x-pack/plugins/stack_alerts/public/rule_types/geo_containment/query_builder/index.tsx" - }, - { - "plugin": "stackAlerts", - "path": "x-pack/plugins/stack_alerts/public/rule_types/geo_containment/query_builder/index.tsx" + "path": "x-pack/plugins/stack_alerts/public/rule_types/geo_containment/rule_form/entity_form.tsx" }, { "plugin": "stackAlerts", @@ -21606,35 +21582,11 @@ }, { "plugin": "stackAlerts", - "path": "x-pack/plugins/stack_alerts/public/rule_types/geo_containment/query_builder/expressions/boundary_index_expression.tsx" - }, - { - "plugin": "stackAlerts", - "path": "x-pack/plugins/stack_alerts/public/rule_types/geo_containment/query_builder/expressions/entity_index_expression.tsx" - }, - { - "plugin": "stackAlerts", - "path": "x-pack/plugins/stack_alerts/public/rule_types/geo_containment/query_builder/index.tsx" - }, - { - "plugin": "stackAlerts", - "path": "x-pack/plugins/stack_alerts/public/rule_types/geo_containment/query_builder/index.tsx" - }, - { - "plugin": "stackAlerts", - "path": "x-pack/plugins/stack_alerts/public/rule_types/geo_containment/query_builder/index.tsx" - }, - { - "plugin": "stackAlerts", - "path": "x-pack/plugins/stack_alerts/public/rule_types/geo_containment/query_builder/index.tsx" - }, - { - "plugin": "stackAlerts", - "path": "x-pack/plugins/stack_alerts/public/rule_types/geo_containment/query_builder/index.tsx" + "path": "x-pack/plugins/stack_alerts/public/rule_types/geo_containment/rule_form/boundary_form.tsx" }, { "plugin": "stackAlerts", - "path": "x-pack/plugins/stack_alerts/public/rule_types/geo_containment/query_builder/index.tsx" + "path": "x-pack/plugins/stack_alerts/public/rule_types/geo_containment/rule_form/entity_form.tsx" }, { "plugin": "stackAlerts", diff --git a/api_docs/data.mdx b/api_docs/data.mdx index 46531c9a02904..1d0ec20339e5a 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-09-06 +date: 2023-09-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'data'] --- import dataObj from './data.devdocs.json'; diff --git a/api_docs/data_query.mdx b/api_docs/data_query.mdx index 310e48213af7a..5557fd59c7bbe 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-09-06 +date: 2023-09-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'data.query'] --- import dataQueryObj from './data_query.devdocs.json'; diff --git a/api_docs/data_search.mdx b/api_docs/data_search.mdx index 08230c72660ac..1823366e7947b 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-09-06 +date: 2023-09-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'data.search'] --- import dataSearchObj from './data_search.devdocs.json'; diff --git a/api_docs/data_view_editor.mdx b/api_docs/data_view_editor.mdx index a29d62bd9c5ae..99fb909a07f79 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-09-06 +date: 2023-09-07 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 187c9712e4b69..21a077f7e9b9e 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-09-06 +date: 2023-09-07 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 07264a9d936a1..fdf6650d5838a 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-09-06 +date: 2023-09-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'dataViewManagement'] --- import dataViewManagementObj from './data_view_management.devdocs.json'; diff --git a/api_docs/data_views.devdocs.json b/api_docs/data_views.devdocs.json index 347f1f24fed09..70cff55c9937b 100644 --- a/api_docs/data_views.devdocs.json +++ b/api_docs/data_views.devdocs.json @@ -529,35 +529,11 @@ }, { "plugin": "stackAlerts", - "path": "x-pack/plugins/stack_alerts/public/rule_types/geo_containment/query_builder/expressions/boundary_index_expression.tsx" + "path": "x-pack/plugins/stack_alerts/public/rule_types/geo_containment/rule_form/boundary_form.tsx" }, { "plugin": "stackAlerts", - "path": "x-pack/plugins/stack_alerts/public/rule_types/geo_containment/query_builder/expressions/entity_index_expression.tsx" - }, - { - "plugin": "stackAlerts", - "path": "x-pack/plugins/stack_alerts/public/rule_types/geo_containment/query_builder/index.tsx" - }, - { - "plugin": "stackAlerts", - "path": "x-pack/plugins/stack_alerts/public/rule_types/geo_containment/query_builder/index.tsx" - }, - { - "plugin": "stackAlerts", - "path": "x-pack/plugins/stack_alerts/public/rule_types/geo_containment/query_builder/index.tsx" - }, - { - "plugin": "stackAlerts", - "path": "x-pack/plugins/stack_alerts/public/rule_types/geo_containment/query_builder/index.tsx" - }, - { - "plugin": "stackAlerts", - "path": "x-pack/plugins/stack_alerts/public/rule_types/geo_containment/query_builder/index.tsx" - }, - { - "plugin": "stackAlerts", - "path": "x-pack/plugins/stack_alerts/public/rule_types/geo_containment/query_builder/index.tsx" + "path": "x-pack/plugins/stack_alerts/public/rule_types/geo_containment/rule_form/entity_form.tsx" }, { "plugin": "stackAlerts", @@ -5576,6 +5552,22 @@ } ], "returnComment": [] + }, + { + "parentPluginId": "dataViews", + "id": "def-public.DataViewsServicePublic.getRollupsEnabled", + "type": "Function", + "tags": [], + "label": "getRollupsEnabled", + "description": [], + "signature": [ + "() => boolean" + ], + "path": "src/plugins/data_views/public/data_views_service_public.ts", + "deprecated": false, + "trackAdoption": false, + "children": [], + "returnComment": [] } ], "initialIsOpen": false @@ -6550,6 +6542,22 @@ ], "returnComment": [] }, + { + "parentPluginId": "dataViews", + "id": "def-public.DataViewsServicePublicDeps.getRollupsEnabled", + "type": "Function", + "tags": [], + "label": "getRollupsEnabled", + "description": [], + "signature": [ + "() => boolean" + ], + "path": "src/plugins/data_views/public/data_views_service_public.ts", + "deprecated": false, + "trackAdoption": false, + "children": [], + "returnComment": [] + }, { "parentPluginId": "dataViews", "id": "def-public.DataViewsServicePublicDeps.scriptedFieldsEnabled", @@ -7937,7 +7945,24 @@ "path": "src/plugins/data_views/public/types.ts", "deprecated": false, "trackAdoption": false, - "children": [], + "children": [ + { + "parentPluginId": "dataViews", + "id": "def-public.DataViewsPublicPluginSetup.enableRollups", + "type": "Function", + "tags": [], + "label": "enableRollups", + "description": [], + "signature": [ + "() => void" + ], + "path": "src/plugins/data_views/public/types.ts", + "deprecated": false, + "trackAdoption": false, + "children": [], + "returnComment": [] + } + ], "lifecycle": "setup", "initialIsOpen": true }, @@ -8493,35 +8518,11 @@ }, { "plugin": "stackAlerts", - "path": "x-pack/plugins/stack_alerts/public/rule_types/geo_containment/query_builder/expressions/boundary_index_expression.tsx" - }, - { - "plugin": "stackAlerts", - "path": "x-pack/plugins/stack_alerts/public/rule_types/geo_containment/query_builder/expressions/entity_index_expression.tsx" - }, - { - "plugin": "stackAlerts", - "path": "x-pack/plugins/stack_alerts/public/rule_types/geo_containment/query_builder/index.tsx" - }, - { - "plugin": "stackAlerts", - "path": "x-pack/plugins/stack_alerts/public/rule_types/geo_containment/query_builder/index.tsx" - }, - { - "plugin": "stackAlerts", - "path": "x-pack/plugins/stack_alerts/public/rule_types/geo_containment/query_builder/index.tsx" + "path": "x-pack/plugins/stack_alerts/public/rule_types/geo_containment/rule_form/boundary_form.tsx" }, { "plugin": "stackAlerts", - "path": "x-pack/plugins/stack_alerts/public/rule_types/geo_containment/query_builder/index.tsx" - }, - { - "plugin": "stackAlerts", - "path": "x-pack/plugins/stack_alerts/public/rule_types/geo_containment/query_builder/index.tsx" - }, - { - "plugin": "stackAlerts", - "path": "x-pack/plugins/stack_alerts/public/rule_types/geo_containment/query_builder/index.tsx" + "path": "x-pack/plugins/stack_alerts/public/rule_types/geo_containment/rule_form/entity_form.tsx" }, { "plugin": "stackAlerts", @@ -15567,35 +15568,11 @@ }, { "plugin": "stackAlerts", - "path": "x-pack/plugins/stack_alerts/public/rule_types/geo_containment/query_builder/expressions/boundary_index_expression.tsx" - }, - { - "plugin": "stackAlerts", - "path": "x-pack/plugins/stack_alerts/public/rule_types/geo_containment/query_builder/expressions/entity_index_expression.tsx" - }, - { - "plugin": "stackAlerts", - "path": "x-pack/plugins/stack_alerts/public/rule_types/geo_containment/query_builder/index.tsx" - }, - { - "plugin": "stackAlerts", - "path": "x-pack/plugins/stack_alerts/public/rule_types/geo_containment/query_builder/index.tsx" - }, - { - "plugin": "stackAlerts", - "path": "x-pack/plugins/stack_alerts/public/rule_types/geo_containment/query_builder/index.tsx" - }, - { - "plugin": "stackAlerts", - "path": "x-pack/plugins/stack_alerts/public/rule_types/geo_containment/query_builder/index.tsx" - }, - { - "plugin": "stackAlerts", - "path": "x-pack/plugins/stack_alerts/public/rule_types/geo_containment/query_builder/index.tsx" + "path": "x-pack/plugins/stack_alerts/public/rule_types/geo_containment/rule_form/boundary_form.tsx" }, { "plugin": "stackAlerts", - "path": "x-pack/plugins/stack_alerts/public/rule_types/geo_containment/query_builder/index.tsx" + "path": "x-pack/plugins/stack_alerts/public/rule_types/geo_containment/rule_form/entity_form.tsx" }, { "plugin": "stackAlerts", diff --git a/api_docs/data_views.mdx b/api_docs/data_views.mdx index 9e13e90657c1c..d711770385472 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-09-06 +date: 2023-09-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'dataViews'] --- import dataViewsObj from './data_views.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 | |-------------------|-----------|------------------------|-----------------| -| 1034 | 0 | 254 | 2 | +| 1037 | 0 | 257 | 2 | ## Client diff --git a/api_docs/data_visualizer.mdx b/api_docs/data_visualizer.mdx index 4fa0316ec8e5a..72d35ccf434d7 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-09-06 +date: 2023-09-07 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 10632b2d4896b..dac134691fe57 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-09-06 +date: 2023-09-07 tags: ['contributor', 'dev', 'apidocs', 'kibana'] --- diff --git a/api_docs/deprecations_by_plugin.mdx b/api_docs/deprecations_by_plugin.mdx index 195314fc734f8..10b4958afbe02 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-09-06 +date: 2023-09-07 tags: ['contributor', 'dev', 'apidocs', 'kibana'] --- @@ -1539,14 +1539,14 @@ migrates to using the Kibana Privilege model: https://github.com/elastic/kibana/ | Deprecated API | Reference location(s) | Remove By | | ---------------|-----------|-----------| | | [index.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/stack_alerts/public/rule_types/es_query/index.ts#:~:text=registerNavigation) | - | -| | [rule_type.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/stack_alerts/server/rule_types/index_threshold/rule_type.ts#:~:text=alertFactory), [rule_type.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/stack_alerts/server/rule_types/index_threshold/rule_type.ts#:~:text=alertFactory), [get_entities_and_generate_alerts.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/stack_alerts/server/rule_types/geo_containment/lib/get_entities_and_generate_alerts.ts#:~:text=alertFactory), [executor.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/stack_alerts/server/rule_types/geo_containment/executor.ts#:~:text=alertFactory), [executor.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/stack_alerts/server/rule_types/geo_containment/executor.ts#:~:text=alertFactory) | - | +| | [rule_type.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/stack_alerts/server/rule_types/index_threshold/rule_type.ts#:~:text=alertFactory), [get_entities_and_generate_alerts.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/stack_alerts/server/rule_types/geo_containment/lib/get_entities_and_generate_alerts.ts#:~:text=alertFactory), [executor.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/stack_alerts/server/rule_types/geo_containment/executor.ts#:~:text=alertFactory), [executor.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/stack_alerts/server/rule_types/geo_containment/executor.ts#:~:text=alertFactory) | - | | | [fetch_search_source_query.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/stack_alerts/server/rule_types/es_query/lib/fetch_search_source_query.ts#:~:text=fetch), [rule_type.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/stack_alerts/server/rule_types/es_query/rule_type.test.ts#:~:text=fetch), [rule_type.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/stack_alerts/server/rule_types/es_query/rule_type.test.ts#:~:text=fetch) | - | -| | [boundary_index_expression.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/stack_alerts/public/rule_types/geo_containment/query_builder/expressions/boundary_index_expression.tsx#:~:text=indexPatterns), [entity_index_expression.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/stack_alerts/public/rule_types/geo_containment/query_builder/expressions/entity_index_expression.tsx#:~:text=indexPatterns), [index.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/stack_alerts/public/rule_types/geo_containment/query_builder/index.tsx#:~:text=indexPatterns), [index.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/stack_alerts/public/rule_types/geo_containment/query_builder/index.tsx#:~:text=indexPatterns), [index.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/stack_alerts/public/rule_types/geo_containment/query_builder/index.tsx#:~:text=indexPatterns) | - | +| | [data_view_select.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/stack_alerts/public/rule_types/geo_containment/rule_form/data_view_select.tsx#:~:text=indexPatterns), [boundary_form.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/stack_alerts/public/rule_types/geo_containment/rule_form/boundary_form.tsx#:~:text=indexPatterns), [boundary_form.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/stack_alerts/public/rule_types/geo_containment/rule_form/boundary_form.tsx#:~:text=indexPatterns), [entity_form.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/stack_alerts/public/rule_types/geo_containment/rule_form/entity_form.tsx#:~:text=indexPatterns), [entity_form.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/stack_alerts/public/rule_types/geo_containment/rule_form/entity_form.tsx#:~:text=indexPatterns) | - | | | [expression.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/stack_alerts/public/rule_types/threshold/expression.tsx#:~:text=fieldFormats) | - | -| | [boundary_index_expression.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/stack_alerts/public/rule_types/geo_containment/query_builder/expressions/boundary_index_expression.tsx#:~:text=title), [entity_index_expression.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/stack_alerts/public/rule_types/geo_containment/query_builder/expressions/entity_index_expression.tsx#:~:text=title), [index.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/stack_alerts/public/rule_types/geo_containment/query_builder/index.tsx#:~:text=title), [index.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/stack_alerts/public/rule_types/geo_containment/query_builder/index.tsx#:~:text=title), [index.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/stack_alerts/public/rule_types/geo_containment/query_builder/index.tsx#:~:text=title), [index.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/stack_alerts/public/rule_types/geo_containment/query_builder/index.tsx#:~:text=title), [index.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/stack_alerts/public/rule_types/geo_containment/query_builder/index.tsx#:~:text=title), [index.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/stack_alerts/public/rule_types/geo_containment/query_builder/index.tsx#:~:text=title), [data_view_select_popover.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/stack_alerts/public/rule_types/components/data_view_select_popover.tsx#:~:text=title), [boundary_index_expression.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/stack_alerts/public/rule_types/geo_containment/query_builder/expressions/boundary_index_expression.tsx#:~:text=title)+ 8 more | - | +| | [boundary_form.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/stack_alerts/public/rule_types/geo_containment/rule_form/boundary_form.tsx#:~:text=title), [entity_form.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/stack_alerts/public/rule_types/geo_containment/rule_form/entity_form.tsx#:~:text=title), [data_view_select_popover.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/stack_alerts/public/rule_types/components/data_view_select_popover.tsx#:~:text=title), [boundary_form.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/stack_alerts/public/rule_types/geo_containment/rule_form/boundary_form.tsx#:~:text=title), [entity_form.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/stack_alerts/public/rule_types/geo_containment/rule_form/entity_form.tsx#:~:text=title), [data_view_select_popover.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/stack_alerts/public/rule_types/components/data_view_select_popover.tsx#:~:text=title) | - | | | [fetch_search_source_query.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/stack_alerts/server/rule_types/es_query/lib/fetch_search_source_query.ts#:~:text=fetch), [rule_type.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/stack_alerts/server/rule_types/es_query/rule_type.test.ts#:~:text=fetch), [rule_type.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/stack_alerts/server/rule_types/es_query/rule_type.test.ts#:~:text=fetch) | - | -| | [boundary_index_expression.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/stack_alerts/public/rule_types/geo_containment/query_builder/expressions/boundary_index_expression.tsx#:~:text=title), [entity_index_expression.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/stack_alerts/public/rule_types/geo_containment/query_builder/expressions/entity_index_expression.tsx#:~:text=title), [index.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/stack_alerts/public/rule_types/geo_containment/query_builder/index.tsx#:~:text=title), [index.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/stack_alerts/public/rule_types/geo_containment/query_builder/index.tsx#:~:text=title), [index.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/stack_alerts/public/rule_types/geo_containment/query_builder/index.tsx#:~:text=title), [index.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/stack_alerts/public/rule_types/geo_containment/query_builder/index.tsx#:~:text=title), [index.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/stack_alerts/public/rule_types/geo_containment/query_builder/index.tsx#:~:text=title), [index.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/stack_alerts/public/rule_types/geo_containment/query_builder/index.tsx#:~:text=title), [data_view_select_popover.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/stack_alerts/public/rule_types/components/data_view_select_popover.tsx#:~:text=title), [boundary_index_expression.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/stack_alerts/public/rule_types/geo_containment/query_builder/expressions/boundary_index_expression.tsx#:~:text=title)+ 8 more | - | -| | [boundary_index_expression.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/stack_alerts/public/rule_types/geo_containment/query_builder/expressions/boundary_index_expression.tsx#:~:text=title), [entity_index_expression.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/stack_alerts/public/rule_types/geo_containment/query_builder/expressions/entity_index_expression.tsx#:~:text=title), [index.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/stack_alerts/public/rule_types/geo_containment/query_builder/index.tsx#:~:text=title), [index.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/stack_alerts/public/rule_types/geo_containment/query_builder/index.tsx#:~:text=title), [index.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/stack_alerts/public/rule_types/geo_containment/query_builder/index.tsx#:~:text=title), [index.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/stack_alerts/public/rule_types/geo_containment/query_builder/index.tsx#:~:text=title), [index.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/stack_alerts/public/rule_types/geo_containment/query_builder/index.tsx#:~:text=title), [index.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/stack_alerts/public/rule_types/geo_containment/query_builder/index.tsx#:~:text=title), [data_view_select_popover.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/stack_alerts/public/rule_types/components/data_view_select_popover.tsx#:~:text=title) | - | +| | [boundary_form.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/stack_alerts/public/rule_types/geo_containment/rule_form/boundary_form.tsx#:~:text=title), [entity_form.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/stack_alerts/public/rule_types/geo_containment/rule_form/entity_form.tsx#:~:text=title), [data_view_select_popover.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/stack_alerts/public/rule_types/components/data_view_select_popover.tsx#:~:text=title), [boundary_form.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/stack_alerts/public/rule_types/geo_containment/rule_form/boundary_form.tsx#:~:text=title), [entity_form.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/stack_alerts/public/rule_types/geo_containment/rule_form/entity_form.tsx#:~:text=title), [data_view_select_popover.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/stack_alerts/public/rule_types/components/data_view_select_popover.tsx#:~:text=title) | - | +| | [boundary_form.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/stack_alerts/public/rule_types/geo_containment/rule_form/boundary_form.tsx#:~:text=title), [entity_form.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/stack_alerts/public/rule_types/geo_containment/rule_form/entity_form.tsx#:~:text=title), [data_view_select_popover.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/stack_alerts/public/rule_types/components/data_view_select_popover.tsx#:~:text=title) | - | diff --git a/api_docs/deprecations_by_team.mdx b/api_docs/deprecations_by_team.mdx index a325fd6f43f55..4900f1cfbc6f5 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-09-06 +date: 2023-09-07 tags: ['contributor', 'dev', 'apidocs', 'kibana'] --- diff --git a/api_docs/dev_tools.mdx b/api_docs/dev_tools.mdx index de965350e87ad..a4fbd9e05ac5d 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-09-06 +date: 2023-09-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'devTools'] --- import devToolsObj from './dev_tools.devdocs.json'; diff --git a/api_docs/discover.devdocs.json b/api_docs/discover.devdocs.json index 13f444604cc4f..9d55f29fd0d67 100644 --- a/api_docs/discover.devdocs.json +++ b/api_docs/discover.devdocs.json @@ -24,6 +24,280 @@ } ], "interfaces": [ + { + "parentPluginId": "discover", + "id": "def-public.DiscoverAppState", + "type": "Interface", + "tags": [], + "label": "DiscoverAppState", + "description": [], + "path": "src/plugins/discover/public/application/main/services/discover_app_state_container.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "discover", + "id": "def-public.DiscoverAppState.columns", + "type": "Array", + "tags": [], + "label": "columns", + "description": [ + "\nColumns displayed in the table" + ], + "signature": [ + "string[] | undefined" + ], + "path": "src/plugins/discover/public/application/main/services/discover_app_state_container.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "discover", + "id": "def-public.DiscoverAppState.filters", + "type": "Array", + "tags": [], + "label": "filters", + "description": [ + "\nArray of applied filters" + ], + "signature": [ + { + "pluginId": "@kbn/es-query", + "scope": "common", + "docId": "kibKbnEsQueryPluginApi", + "section": "def-common.Filter", + "text": "Filter" + }, + "[] | undefined" + ], + "path": "src/plugins/discover/public/application/main/services/discover_app_state_container.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "discover", + "id": "def-public.DiscoverAppState.grid", + "type": "Object", + "tags": [], + "label": "grid", + "description": [ + "\nData Grid related state" + ], + "signature": [ + { + "pluginId": "@kbn/unified-data-table", + "scope": "common", + "docId": "kibKbnUnifiedDataTablePluginApi", + "section": "def-common.UnifiedDataTableSettings", + "text": "UnifiedDataTableSettings" + }, + " | undefined" + ], + "path": "src/plugins/discover/public/application/main/services/discover_app_state_container.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "discover", + "id": "def-public.DiscoverAppState.hideChart", + "type": "CompoundType", + "tags": [], + "label": "hideChart", + "description": [ + "\nHide chart" + ], + "signature": [ + "boolean | undefined" + ], + "path": "src/plugins/discover/public/application/main/services/discover_app_state_container.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "discover", + "id": "def-public.DiscoverAppState.index", + "type": "string", + "tags": [], + "label": "index", + "description": [ + "\nid of the used data view" + ], + "signature": [ + "string | undefined" + ], + "path": "src/plugins/discover/public/application/main/services/discover_app_state_container.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "discover", + "id": "def-public.DiscoverAppState.interval", + "type": "string", + "tags": [], + "label": "interval", + "description": [ + "\nUsed interval of the histogram" + ], + "signature": [ + "string | undefined" + ], + "path": "src/plugins/discover/public/application/main/services/discover_app_state_container.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "discover", + "id": "def-public.DiscoverAppState.query", + "type": "CompoundType", + "tags": [], + "label": "query", + "description": [ + "\nLucence or KQL query" + ], + "signature": [ + { + "pluginId": "@kbn/es-query", + "scope": "common", + "docId": "kibKbnEsQueryPluginApi", + "section": "def-common.Query", + "text": "Query" + }, + " | ", + { + "pluginId": "@kbn/es-query", + "scope": "common", + "docId": "kibKbnEsQueryPluginApi", + "section": "def-common.AggregateQuery", + "text": "AggregateQuery" + }, + " | undefined" + ], + "path": "src/plugins/discover/public/application/main/services/discover_app_state_container.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "discover", + "id": "def-public.DiscoverAppState.sort", + "type": "Array", + "tags": [], + "label": "sort", + "description": [ + "\nArray of the used sorting [[field,direction],...]" + ], + "signature": [ + "string[][] | undefined" + ], + "path": "src/plugins/discover/public/application/main/services/discover_app_state_container.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "discover", + "id": "def-public.DiscoverAppState.savedQuery", + "type": "string", + "tags": [], + "label": "savedQuery", + "description": [ + "\nid of the used saved query" + ], + "signature": [ + "string | undefined" + ], + "path": "src/plugins/discover/public/application/main/services/discover_app_state_container.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "discover", + "id": "def-public.DiscoverAppState.viewMode", + "type": "CompoundType", + "tags": [], + "label": "viewMode", + "description": [ + "\nTable view: Documents vs Field Statistics" + ], + "signature": [ + { + "pluginId": "savedSearch", + "scope": "common", + "docId": "kibSavedSearchPluginApi", + "section": "def-common.VIEW_MODE", + "text": "VIEW_MODE" + }, + " | undefined" + ], + "path": "src/plugins/discover/public/application/main/services/discover_app_state_container.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "discover", + "id": "def-public.DiscoverAppState.hideAggregatedPreview", + "type": "CompoundType", + "tags": [], + "label": "hideAggregatedPreview", + "description": [ + "\nHide mini distribution/preview charts when in Field Statistics mode" + ], + "signature": [ + "boolean | undefined" + ], + "path": "src/plugins/discover/public/application/main/services/discover_app_state_container.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "discover", + "id": "def-public.DiscoverAppState.rowHeight", + "type": "number", + "tags": [], + "label": "rowHeight", + "description": [ + "\nDocument explorer row height option" + ], + "signature": [ + "number | undefined" + ], + "path": "src/plugins/discover/public/application/main/services/discover_app_state_container.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "discover", + "id": "def-public.DiscoverAppState.rowsPerPage", + "type": "number", + "tags": [], + "label": "rowsPerPage", + "description": [ + "\nNumber of rows in the grid per page" + ], + "signature": [ + "number | undefined" + ], + "path": "src/plugins/discover/public/application/main/services/discover_app_state_container.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "discover", + "id": "def-public.DiscoverAppState.breakdownField", + "type": "string", + "tags": [], + "label": "breakdownField", + "description": [ + "\nBreakdown field of chart" + ], + "signature": [ + "string | undefined" + ], + "path": "src/plugins/discover/public/application/main/services/discover_app_state_container.ts", + "deprecated": false, + "trackAdoption": false + } + ], + "initialIsOpen": false + }, { "parentPluginId": "discover", "id": "def-public.DiscoverCustomizationService", diff --git a/api_docs/discover.mdx b/api_docs/discover.mdx index c74856cd3ff5e..2bc37b574845d 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-09-06 +date: 2023-09-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'discover'] --- import discoverObj from './discover.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 | |-------------------|-----------|------------------------|-----------------| -| 98 | 0 | 71 | 15 | +| 113 | 0 | 72 | 15 | ## Client diff --git a/api_docs/discover_enhanced.mdx b/api_docs/discover_enhanced.mdx index 9f6ff44667e3a..af34f5f5d592c 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-09-06 +date: 2023-09-07 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 97310dfc057fe..b3df60c604ffd 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-09-06 +date: 2023-09-07 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 ec0bdf9631439..4dc9076452bd2 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-09-06 +date: 2023-09-07 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 06a56b891b64e..9efe6bbde92d5 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-09-06 +date: 2023-09-07 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 ec718fa5655d2..29581b5840241 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-09-06 +date: 2023-09-07 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 4f83486d558e2..43a8b841a437d 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-09-06 +date: 2023-09-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'encryptedSavedObjects'] --- import encryptedSavedObjectsObj from './encrypted_saved_objects.devdocs.json'; diff --git a/api_docs/enterprise_search.devdocs.json b/api_docs/enterprise_search.devdocs.json index 7842d688a354d..318a97a2de824 100644 --- a/api_docs/enterprise_search.devdocs.json +++ b/api_docs/enterprise_search.devdocs.json @@ -45,51 +45,6 @@ "trackAdoption": false, "initialIsOpen": false }, - { - "parentPluginId": "enterpriseSearch", - "id": "def-server.CONNECTORS_INDEX", - "type": "string", - "tags": [], - "label": "CONNECTORS_INDEX", - "description": [], - "signature": [ - "\".elastic-connectors\"" - ], - "path": "x-pack/plugins/enterprise_search/server/index.ts", - "deprecated": false, - "trackAdoption": false, - "initialIsOpen": false - }, - { - "parentPluginId": "enterpriseSearch", - "id": "def-server.CONNECTORS_JOBS_INDEX", - "type": "string", - "tags": [], - "label": "CONNECTORS_JOBS_INDEX", - "description": [], - "signature": [ - "\".elastic-connectors-sync-jobs\"" - ], - "path": "x-pack/plugins/enterprise_search/server/index.ts", - "deprecated": false, - "trackAdoption": false, - "initialIsOpen": false - }, - { - "parentPluginId": "enterpriseSearch", - "id": "def-server.CONNECTORS_VERSION", - "type": "number", - "tags": [], - "label": "CONNECTORS_VERSION", - "description": [], - "signature": [ - "1" - ], - "path": "x-pack/plugins/enterprise_search/server/index.ts", - "deprecated": false, - "trackAdoption": false, - "initialIsOpen": false - }, { "parentPluginId": "enterpriseSearch", "id": "def-server.CRAWLERS_INDEX", @@ -107,28 +62,13 @@ }, { "parentPluginId": "enterpriseSearch", - "id": "def-server.CURRENT_CONNECTORS_INDEX", - "type": "string", - "tags": [], - "label": "CURRENT_CONNECTORS_INDEX", - "description": [], - "signature": [ - "\".elastic-connectors-v1\"" - ], - "path": "x-pack/plugins/enterprise_search/server/index.ts", - "deprecated": false, - "trackAdoption": false, - "initialIsOpen": false - }, - { - "parentPluginId": "enterpriseSearch", - "id": "def-server.CURRENT_CONNECTORS_JOB_INDEX", - "type": "string", + "id": "def-server.EnterpriseSearchPluginStart", + "type": "Type", "tags": [], - "label": "CURRENT_CONNECTORS_JOB_INDEX", + "label": "EnterpriseSearchPluginStart", "description": [], "signature": [ - "\".elastic-connectors-sync-jobs-v1\"" + "PluginStart" ], "path": "x-pack/plugins/enterprise_search/server/index.ts", "deprecated": false, @@ -303,20 +243,7 @@ "trackAdoption": false, "initialIsOpen": false } - ], - "start": { - "parentPluginId": "enterpriseSearch", - "id": "def-server.EnterpriseSearchPluginStart", - "type": "Type", - "tags": [], - "label": "EnterpriseSearchPluginStart", - "description": [], - "path": "x-pack/plugins/enterprise_search/server/index.ts", - "deprecated": false, - "trackAdoption": false, - "lifecycle": "start", - "initialIsOpen": true - } + ] }, "common": { "classes": [], diff --git a/api_docs/enterprise_search.mdx b/api_docs/enterprise_search.mdx index 5499ef93aa543..c32daf9c7593b 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-09-06 +date: 2023-09-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'enterpriseSearch'] --- import enterpriseSearchObj from './enterprise_search.devdocs.json'; @@ -21,7 +21,7 @@ Contact [@elastic/enterprise-search-frontend](https://github.com/orgs/elastic/te | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 11 | 0 | 11 | 0 | +| 6 | 0 | 6 | 0 | ## Client @@ -30,9 +30,6 @@ Contact [@elastic/enterprise-search-frontend](https://github.com/orgs/elastic/te ## Server -### Start - - ### Objects diff --git a/api_docs/es_ui_shared.mdx b/api_docs/es_ui_shared.mdx index 0f19677a6dad2..c219fe71fa102 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-09-06 +date: 2023-09-07 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 2d036d98c176a..70155bbdc4316 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-09-06 +date: 2023-09-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'eventAnnotation'] --- import eventAnnotationObj from './event_annotation.devdocs.json'; diff --git a/api_docs/event_log.mdx b/api_docs/event_log.mdx index 28d0b86a754bf..dc30b3cbe84e6 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-09-06 +date: 2023-09-07 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 872e71e7d9514..e90935caffef1 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-09-06 +date: 2023-09-07 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 2ebc1a0477ab0..5660e6626be0e 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-09-06 +date: 2023-09-07 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 dbcfa79c17407..fcd4815db7c23 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-09-06 +date: 2023-09-07 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 92cc5b1de1d4f..eb6bccba953d6 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-09-06 +date: 2023-09-07 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 3088aaeb30bfe..850488dff1403 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-09-06 +date: 2023-09-07 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 6069e11e72648..3a1d3f08cf583 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-09-06 +date: 2023-09-07 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 a99de7d753807..3ad066d09a41d 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-09-06 +date: 2023-09-07 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 db6de17efd135..50f8eb0cc0415 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-09-06 +date: 2023-09-07 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 8e515e738c6df..231a4e040b801 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-09-06 +date: 2023-09-07 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 773380b5de18f..da3dfe67bdc69 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-09-06 +date: 2023-09-07 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 0d0470eb67888..51dcf3903022d 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-09-06 +date: 2023-09-07 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 105172011496c..d336e9dd9b1fa 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-09-06 +date: 2023-09-07 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 1101379011fb9..86a5ba026e305 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-09-06 +date: 2023-09-07 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 054d4560a99b0..5b380facf2a6a 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-09-06 +date: 2023-09-07 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 74a4cd4d131bf..30f6121fa16b5 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-09-06 +date: 2023-09-07 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 fbfd9a1d0855f..402b2d208d32f 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-09-06 +date: 2023-09-07 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 176f7897ba0aa..14a92e780c05b 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-09-06 +date: 2023-09-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'fieldFormats'] --- import fieldFormatsObj from './field_formats.devdocs.json'; diff --git a/api_docs/file_upload.devdocs.json b/api_docs/file_upload.devdocs.json index f25468cc2ce79..5f45445c8f0f1 100644 --- a/api_docs/file_upload.devdocs.json +++ b/api_docs/file_upload.devdocs.json @@ -1124,48 +1124,6 @@ } ], "initialIsOpen": false - }, - { - "parentPluginId": "fileUpload", - "id": "def-common.Mappings", - "type": "Interface", - "tags": [], - "label": "Mappings", - "description": [], - "path": "x-pack/plugins/file_upload/common/types.ts", - "deprecated": false, - "trackAdoption": false, - "children": [ - { - "parentPluginId": "fileUpload", - "id": "def-common.Mappings._meta", - "type": "Object", - "tags": [], - "label": "_meta", - "description": [], - "signature": [ - "{ created_by: string; } | undefined" - ], - "path": "x-pack/plugins/file_upload/common/types.ts", - "deprecated": false, - "trackAdoption": false - }, - { - "parentPluginId": "fileUpload", - "id": "def-common.Mappings.properties", - "type": "Object", - "tags": [], - "label": "properties", - "description": [], - "signature": [ - "{ [key: string]: any; }" - ], - "path": "x-pack/plugins/file_upload/common/types.ts", - "deprecated": false, - "trackAdoption": false - } - ], - "initialIsOpen": false } ], "enums": [], diff --git a/api_docs/file_upload.mdx b/api_docs/file_upload.mdx index d9b7d3b411174..68046facc540c 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-09-06 +date: 2023-09-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'fileUpload'] --- import fileUploadObj from './file_upload.devdocs.json'; @@ -21,7 +21,7 @@ Contact [@elastic/kibana-gis](https://github.com/orgs/elastic/teams/kibana-gis) | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 62 | 0 | 62 | 2 | +| 59 | 0 | 59 | 2 | ## Client diff --git a/api_docs/files.mdx b/api_docs/files.mdx index 3eb1600270481..6a5c909638041 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-09-06 +date: 2023-09-07 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 dd194c513358c..847115d939449 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-09-06 +date: 2023-09-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'filesManagement'] --- import filesManagementObj from './files_management.devdocs.json'; diff --git a/api_docs/fleet.devdocs.json b/api_docs/fleet.devdocs.json index 81bd886607d5f..efa04820ce936 100644 --- a/api_docs/fleet.devdocs.json +++ b/api_docs/fleet.devdocs.json @@ -26707,6 +26707,128 @@ ], "initialIsOpen": false }, + { + "parentPluginId": "fleet", + "id": "def-common.API_VERSIONS", + "type": "Object", + "tags": [], + "label": "API_VERSIONS", + "description": [], + "path": "x-pack/plugins/fleet/common/constants/routes.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "fleet", + "id": "def-common.API_VERSIONS.public", + "type": "Object", + "tags": [], + "label": "public", + "description": [], + "path": "x-pack/plugins/fleet/common/constants/routes.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "fleet", + "id": "def-common.API_VERSIONS.public.v1", + "type": "string", + "tags": [], + "label": "v1", + "description": [], + "path": "x-pack/plugins/fleet/common/constants/routes.ts", + "deprecated": false, + "trackAdoption": false + } + ] + }, + { + "parentPluginId": "fleet", + "id": "def-common.API_VERSIONS.internal", + "type": "Object", + "tags": [], + "label": "internal", + "description": [], + "path": "x-pack/plugins/fleet/common/constants/routes.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "fleet", + "id": "def-common.API_VERSIONS.internal.v1", + "type": "string", + "tags": [], + "label": "v1", + "description": [], + "path": "x-pack/plugins/fleet/common/constants/routes.ts", + "deprecated": false, + "trackAdoption": false + } + ] + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "fleet", + "id": "def-common.APP_API_ROUTES", + "type": "Object", + "tags": [], + "label": "APP_API_ROUTES", + "description": [], + "path": "x-pack/plugins/fleet/common/constants/routes.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "fleet", + "id": "def-common.APP_API_ROUTES.HEALTH_CHECK_PATTERN", + "type": "string", + "tags": [], + "label": "HEALTH_CHECK_PATTERN", + "description": [], + "path": "x-pack/plugins/fleet/common/constants/routes.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "fleet", + "id": "def-common.APP_API_ROUTES.CHECK_PERMISSIONS_PATTERN", + "type": "string", + "tags": [], + "label": "CHECK_PERMISSIONS_PATTERN", + "description": [], + "path": "x-pack/plugins/fleet/common/constants/routes.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "fleet", + "id": "def-common.APP_API_ROUTES.GENERATE_SERVICE_TOKEN_PATTERN", + "type": "string", + "tags": [], + "label": "GENERATE_SERVICE_TOKEN_PATTERN", + "description": [], + "path": "x-pack/plugins/fleet/common/constants/routes.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "fleet", + "id": "def-common.APP_API_ROUTES.GENERATE_SERVICE_TOKEN_PATTERN_DEPRECATED", + "type": "string", + "tags": [], + "label": "GENERATE_SERVICE_TOKEN_PATTERN_DEPRECATED", + "description": [ + "// deprecated since 8.0" + ], + "path": "x-pack/plugins/fleet/common/constants/routes.ts", + "deprecated": false, + "trackAdoption": false + } + ], + "initialIsOpen": false + }, { "parentPluginId": "fleet", "id": "def-common.appRoutesService", diff --git a/api_docs/fleet.mdx b/api_docs/fleet.mdx index 02687c281e11c..46152edb131c2 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-09-06 +date: 2023-09-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'fleet'] --- import fleetObj from './fleet.devdocs.json'; @@ -21,7 +21,7 @@ Contact [@elastic/fleet](https://github.com/orgs/elastic/teams/fleet) for questi | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 1189 | 3 | 1073 | 41 | +| 1199 | 3 | 1082 | 41 | ## Client diff --git a/api_docs/global_search.mdx b/api_docs/global_search.mdx index eb73dfcd24143..a1154dbe07233 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-09-06 +date: 2023-09-07 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 ea77ddbecac91..a43178389241f 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-09-06 +date: 2023-09-07 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 689e76b0b9cad..83a0998492eb4 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-09-06 +date: 2023-09-07 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 99620afbd13a1..3e34787b32238 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-09-06 +date: 2023-09-07 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 942abb35cb86f..6cea83e831c4d 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-09-06 +date: 2023-09-07 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 6d3b01d5245cf..a5b4b8abf9b56 100644 --- a/api_docs/index_management.devdocs.json +++ b/api_docs/index_management.devdocs.json @@ -2013,6 +2013,60 @@ ], "initialIsOpen": false }, + { + "parentPluginId": "indexManagement", + "id": "def-common.IndexSettingsResponse", + "type": "Interface", + "tags": [], + "label": "IndexSettingsResponse", + "description": [], + "path": "x-pack/plugins/index_management/common/types/indices.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "indexManagement", + "id": "def-common.IndexSettingsResponse.settings", + "type": "Object", + "tags": [], + "label": "settings", + "description": [], + "signature": [ + { + "pluginId": "indexManagement", + "scope": "common", + "docId": "kibIndexManagementPluginApi", + "section": "def-common.IndexSettings", + "text": "IndexSettings" + } + ], + "path": "x-pack/plugins/index_management/common/types/indices.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "indexManagement", + "id": "def-common.IndexSettingsResponse.defaults", + "type": "Object", + "tags": [], + "label": "defaults", + "description": [], + "signature": [ + { + "pluginId": "indexManagement", + "scope": "common", + "docId": "kibIndexManagementPluginApi", + "section": "def-common.IndexSettings", + "text": "IndexSettings" + } + ], + "path": "x-pack/plugins/index_management/common/types/indices.ts", + "deprecated": false, + "trackAdoption": false + } + ], + "initialIsOpen": false + }, { "parentPluginId": "indexManagement", "id": "def-common.LegacyTemplateSerialized", diff --git a/api_docs/index_management.mdx b/api_docs/index_management.mdx index d9904dab581e3..c0bdc91ad1068 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-09-06 +date: 2023-09-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'indexManagement'] --- import indexManagementObj from './index_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 | |-------------------|-----------|------------------------|-----------------| -| 191 | 0 | 186 | 4 | +| 194 | 0 | 189 | 4 | ## Client diff --git a/api_docs/infra.mdx b/api_docs/infra.mdx index 90c41da824f8e..6438d7bef3b05 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-09-06 +date: 2023-09-07 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 b889647d6b02a..ef20ede6f25e4 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-09-06 +date: 2023-09-07 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 33964bc6de443..8a718916b9793 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-09-06 +date: 2023-09-07 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 874707881804d..330942e72dbbe 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-09-06 +date: 2023-09-07 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 05a81b1a8feef..ff493b78f7abc 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-09-06 +date: 2023-09-07 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 677382c6e0405..4c8485413c734 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-09-06 +date: 2023-09-07 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 8a6ccbef94e04..d5c0a3a720eb4 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-09-06 +date: 2023-09-07 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 c29ef9f2d3687..30a20b5b7e674 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-09-06 +date: 2023-09-07 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 20c1b38ed8419..b0e9a7e77c16a 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-09-06 +date: 2023-09-07 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 2e4bcf1093c08..7917182607af9 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-09-06 +date: 2023-09-07 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 5f117aad37f87..48a2b6903a621 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-09-06 +date: 2023-09-07 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 7bbdd9182c6a8..684cfafdde062 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-09-06 +date: 2023-09-07 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 91b41b353c85e..28fd548682a72 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-09-06 +date: 2023-09-07 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 b5f1c3fde5c2e..1d5d26531a4e0 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-09-06 +date: 2023-09-07 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 df1585a9557ba..cd9270c4e0016 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-09-06 +date: 2023-09-07 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 fdd2bd041f9fc..adc60b1779a76 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-09-06 +date: 2023-09-07 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 9025efdcccbee..b71ef0ac554c1 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-09-06 +date: 2023-09-07 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 22ba77889cc08..b36c6907e4d3e 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-09-06 +date: 2023-09-07 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 2145de70fd218..bec9988648d7f 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-09-06 +date: 2023-09-07 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 19469c8e8373b..beecec6ab6ebd 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-09-06 +date: 2023-09-07 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 e064ff507b39b..57a2672d2cf02 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-09-06 +date: 2023-09-07 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 c817f89501300..c0a39d2139031 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-09-06 +date: 2023-09-07 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 cc6c2e7c69890..e093e347f078a 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-09-06 +date: 2023-09-07 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 71e1f390d6646..a913d3ec82625 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-09-06 +date: 2023-09-07 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 6dcb11df62f92..5e5c4c3a30eb6 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-09-06 +date: 2023-09-07 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 6cd8345f78503..d398222734368 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-09-06 +date: 2023-09-07 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 723bb8a4741b9..9d33c066ecc5c 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-09-06 +date: 2023-09-07 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 c24fd85553e1a..ed7fac9ec7961 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-09-06 +date: 2023-09-07 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 f92216a33e2c4..8eb5e9a68cdda 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-09-06 +date: 2023-09-07 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 aa3b7bac022d5..3c993497d1643 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-09-06 +date: 2023-09-07 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 83331cb9c1a73..bbca62b4dc64f 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-09-06 +date: 2023-09-07 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 5f1dc03899307..0ec207be992e1 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-09-06 +date: 2023-09-07 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 27a106cc7a8e8..316b933b75372 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-09-06 +date: 2023-09-07 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 bc12eabd449a3..8018cf8547bc4 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-09-06 +date: 2023-09-07 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 8b9f1735d0551..fdf8e07447514 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-09-06 +date: 2023-09-07 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 f0e644b3f6a72..f4abb9b1124a9 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-09-06 +date: 2023-09-07 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 ca6e85734b249..13f8fff01aa8d 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-09-06 +date: 2023-09-07 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 a2e394b5ea713..42a0718e80b27 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-09-06 +date: 2023-09-07 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 c0f56347084ff..12dcf021cdfdb 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-09-06 +date: 2023-09-07 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 2ddb0a46a82c6..c9e141aa12e45 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-09-06 +date: 2023-09-07 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 71e1743ff2a9f..e6b86ef2d6bd1 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-09-06 +date: 2023-09-07 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 b8a5f7f52d98c..0429261727cd4 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-09-06 +date: 2023-09-07 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 97a38610e99ef..38f2eb50e7147 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-09-06 +date: 2023-09-07 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 55f676eea5f44..9eb7c9801d22c 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-09-06 +date: 2023-09-07 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 09a7677e1b56a..40fb19fef46f9 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-09-06 +date: 2023-09-07 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 54e73f3583b24..02ebfef81b1de 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-09-06 +date: 2023-09-07 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 f852dd94d67a4..8a7f32b239d75 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-09-06 +date: 2023-09-07 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 fda9e4147f3d7..4fb66ea9346e0 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-09-06 +date: 2023-09-07 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 7b7bd2ff59c42..78d35d01e2395 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-09-06 +date: 2023-09-07 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 253bd423024a6..31a1869989a47 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-09-06 +date: 2023-09-07 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 dc7cb08859ada..0c2b8e773acba 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-09-06 +date: 2023-09-07 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 b43365fa7cf9d..cd52a5c8d21ed 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-09-06 +date: 2023-09-07 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 2989abbfb45b1..2a2e1e5a29eac 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-09-06 +date: 2023-09-07 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 4bbc9f2727889..f43f1970440d5 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-09-06 +date: 2023-09-07 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 3057b026516fb..41b448e561e41 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-09-06 +date: 2023-09-07 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 a41a066e3116d..0f0a96d976497 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-09-06 +date: 2023-09-07 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 b1c4d5c02c3fe..be9c3b18d768c 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-09-06 +date: 2023-09-07 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 2cec1dd239207..0eb07761075eb 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-09-06 +date: 2023-09-07 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 c0047306b8f83..f8c10e870ff89 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-09-06 +date: 2023-09-07 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 5cfa7b3df9daf..bc782cdacaed5 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-09-06 +date: 2023-09-07 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 ddc641e1eee49..5c16e81530ba9 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-09-06 +date: 2023-09-07 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 199ea676a211b..a670c917659d4 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-09-06 +date: 2023-09-07 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.mdx b/api_docs/kbn_core_chrome_browser.mdx index 87cc2be55db43..758c4ae94685c 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-09-06 +date: 2023-09-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-chrome-browser'] --- import kbnCoreChromeBrowserObj from './kbn_core_chrome_browser.devdocs.json'; diff --git a/api_docs/kbn_core_chrome_browser_mocks.mdx b/api_docs/kbn_core_chrome_browser_mocks.mdx index faed4a14018dc..f0b481abda1ff 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-09-06 +date: 2023-09-07 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 60d510d551c91..c5e4edec4e07d 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-09-06 +date: 2023-09-07 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 b878d1a7ab151..8941858b808d5 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-09-06 +date: 2023-09-07 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 5e2fc1372babd..23d9af62b888b 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-09-06 +date: 2023-09-07 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 8947bc93d11a1..abb14e4955fda 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-09-06 +date: 2023-09-07 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 b9b47c43d59eb..63ce4abadc293 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-09-06 +date: 2023-09-07 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 fbd85c0ed6b47..c6ff4d0234f56 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-09-06 +date: 2023-09-07 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 f02e9dcb86806..feebc541b30fe 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-09-06 +date: 2023-09-07 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 d42cc7ed4822e..1e6c81e2ad47e 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-09-06 +date: 2023-09-07 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 e72aa5b4728de..f399c7d405c53 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-09-06 +date: 2023-09-07 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 89bc353e5baf8..32b96990596da 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-09-06 +date: 2023-09-07 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 00d1054a0a915..320315150ed60 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-09-06 +date: 2023-09-07 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 0a266520ad02f..43a9e3b142ce3 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-09-06 +date: 2023-09-07 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 5befa6f5952ca..0bdef9ceb70ae 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-09-06 +date: 2023-09-07 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 f0b40dbdb50ad..eeba0ee03fef3 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-09-06 +date: 2023-09-07 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 8fd99fbc6eee7..65472f635696e 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-09-06 +date: 2023-09-07 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 0c10b629b805f..880bc113f6547 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-09-06 +date: 2023-09-07 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 d9111ff5f70fe..1592f733c594b 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-09-06 +date: 2023-09-07 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 84ffe2a552c1e..b95faa4ae2615 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-09-06 +date: 2023-09-07 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 2c3f8173e7951..6eb4ce8354698 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-09-06 +date: 2023-09-07 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 d00a1502a7330..6b789d924c02e 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-09-06 +date: 2023-09-07 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 ac9c6838058a5..5e9ce72774d21 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-09-06 +date: 2023-09-07 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 cd0f5dfbc331c..31fc850565dd7 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-09-06 +date: 2023-09-07 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 5c9ba89d1d3cc..61bed730f2d6b 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-09-06 +date: 2023-09-07 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 8ddec293e6234..82641eba39397 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-09-06 +date: 2023-09-07 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 e41cd33e69f2e..d7d929fa71b47 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-09-06 +date: 2023-09-07 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 d2b49ab6107b0..401a1d5494916 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-09-06 +date: 2023-09-07 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 f91003ff0eb4e..85e5436096ae8 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-09-06 +date: 2023-09-07 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 a6e016cf61aeb..120badd2fefbd 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-09-06 +date: 2023-09-07 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 b37e85685210c..c00f808ca5b00 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-09-06 +date: 2023-09-07 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 6c2ff683c7bae..9dd22e864625e 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-09-06 +date: 2023-09-07 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 b64ba2f04dd64..64c41920f3978 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-09-06 +date: 2023-09-07 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 a8828523b867c..03bd3040e43bf 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-09-06 +date: 2023-09-07 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 8493514402cb1..77119ac2c6989 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-09-06 +date: 2023-09-07 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 5c69f0bf3be8c..28936ae4fc3d1 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-09-06 +date: 2023-09-07 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 797af39591fed..9426823039155 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-09-06 +date: 2023-09-07 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 676aa7b03ec77..53ec6ce4d6f09 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-09-06 +date: 2023-09-07 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 afc3e7d2c0f20..c5de9d0c961b2 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-09-06 +date: 2023-09-07 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 1dc638f47b08e..4b663f774b0a0 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-09-06 +date: 2023-09-07 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 e1fc914d02688..5dc2bd7736ae1 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-09-06 +date: 2023-09-07 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 af32e68b59eb9..4ac9685e087e0 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-09-06 +date: 2023-09-07 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 b2d9f76b852a1..3b96ef5c515cc 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-09-06 +date: 2023-09-07 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 d36a9beb010a9..c889eb7eb6a41 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-09-06 +date: 2023-09-07 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 623ad50e66332..efcb6da5001ca 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-09-06 +date: 2023-09-07 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 22c60891dfd63..659798f138434 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-09-06 +date: 2023-09-07 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 8cd5969d03905..0eef46e759984 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-09-06 +date: 2023-09-07 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 1972bc47648ab..836015fccff64 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-09-06 +date: 2023-09-07 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 cdf7045703aef..0bf60b56126fb 100644 --- a/api_docs/kbn_core_http_server.devdocs.json +++ b/api_docs/kbn_core_http_server.devdocs.json @@ -3591,6 +3591,10 @@ "plugin": "alerting", "path": "x-pack/plugins/alerting/server/routes/get_rule_tags.ts" }, + { + "plugin": "alerting", + "path": "x-pack/plugins/alerting/server/routes/rule/apis/get_schedule_frequency/get_schedule_frequency_route.ts" + }, { "plugin": "alerting", "path": "x-pack/plugins/alerting/server/routes/maintenance_window/get_maintenance_window.ts" @@ -3655,26 +3659,6 @@ "plugin": "guidedOnboarding", "path": "src/plugins/guided_onboarding/server/routes/config_routes.ts" }, - { - "plugin": "securitySolution", - "path": "x-pack/plugins/security_solution/server/lib/detection_engine/fleet_integrations/api/get_installed_integrations/route.ts" - }, - { - "plugin": "securitySolution", - "path": "x-pack/plugins/security_solution/server/lib/detection_engine/rule_exceptions/api/find_exception_references/route.ts" - }, - { - "plugin": "securitySolution", - "path": "x-pack/plugins/security_solution/server/lib/detection_engine/routes/index/read_index_route.ts" - }, - { - "plugin": "securitySolution", - "path": "x-pack/plugins/security_solution/server/lib/detection_engine/routes/signals/get_signals_migration_status_route.ts" - }, - { - "plugin": "securitySolution", - "path": "x-pack/plugins/security_solution/server/lib/detection_engine/routes/privileges/read_privileges_route.ts" - }, { "plugin": "securitySolution", "path": "x-pack/plugins/security_solution/server/lib/timeline/routes/timelines/get_timeline/index.ts" @@ -3691,14 +3675,6 @@ "plugin": "securitySolution", "path": "x-pack/plugins/security_solution/server/lib/timeline/routes/draft_timelines/get_draft_timelines/index.ts" }, - { - "plugin": "securitySolution", - "path": "x-pack/plugins/security_solution/server/lib/detection_engine/routes/telemetry/telemetry_detection_rules_preview_route.ts" - }, - { - "plugin": "securitySolution", - "path": "x-pack/plugins/security_solution/server/lib/detection_engine/routes/index/read_alerts_index_exists_route.ts" - }, { "plugin": "securitySolution", "path": "x-pack/plugins/security_solution/server/endpoint/routes/resolver.ts" @@ -3711,10 +3687,6 @@ "plugin": "securitySolution", "path": "x-pack/plugins/security_solution/server/lib/risk_score/index_status/index.ts" }, - { - "plugin": "securitySolution", - "path": "x-pack/plugins/security_solution/server/lib/tags/routes/get_tags_by_name.ts" - }, { "plugin": "securitySolution", "path": "x-pack/plugins/security_solution/server/lib/risk_engine/routes/risk_engine_status_route.ts" @@ -5399,6 +5371,10 @@ "plugin": "spaces", "path": "x-pack/plugins/spaces/server/routes/api/internal/get_active_space.test.ts" }, + { + "plugin": "alerting", + "path": "x-pack/plugins/alerting/server/routes/rule/apis/get_schedule_frequency/get_schedule_frequency_route.test.ts" + }, { "plugin": "monitoringCollection", "path": "x-pack/plugins/monitoring_collection/server/routes/api/v1/dynamic_route/get_metrics_by_type.test.ts" @@ -6225,38 +6201,6 @@ "plugin": "ml", "path": "x-pack/plugins/ml/server/routes/job_service.ts" }, - { - "plugin": "securitySolution", - "path": "x-pack/plugins/security_solution/server/lib/detection_engine/rule_actions_legacy/api/create_legacy_notification/route.ts" - }, - { - "plugin": "securitySolution", - "path": "x-pack/plugins/security_solution/server/lib/detection_engine/routes/index/create_index_route.ts" - }, - { - "plugin": "securitySolution", - "path": "x-pack/plugins/security_solution/server/lib/detection_engine/rule_exceptions/api/create_rule_exceptions/route.ts" - }, - { - "plugin": "securitySolution", - "path": "x-pack/plugins/security_solution/server/lib/detection_engine/rule_preview/api/preview_rules/route.ts" - }, - { - "plugin": "securitySolution", - "path": "x-pack/plugins/security_solution/server/lib/detection_engine/routes/signals/create_signals_migration_route.ts" - }, - { - "plugin": "securitySolution", - "path": "x-pack/plugins/security_solution/server/lib/detection_engine/routes/signals/finalize_signals_migration_route.ts" - }, - { - "plugin": "securitySolution", - "path": "x-pack/plugins/security_solution/server/lib/detection_engine/routes/signals/query_signals_route.ts" - }, - { - "plugin": "securitySolution", - "path": "x-pack/plugins/security_solution/server/lib/detection_engine/routes/signals/open_close_signals_route.ts" - }, { "plugin": "securitySolution", "path": "x-pack/plugins/security_solution/server/lib/timeline/routes/timelines/export_timelines/index.ts" @@ -6289,18 +6233,6 @@ "plugin": "securitySolution", "path": "x-pack/plugins/security_solution/server/lib/risk_score/onboarding/routes/install_risk_scores.ts" }, - { - "plugin": "securitySolution", - "path": "x-pack/plugins/security_solution/server/lib/exceptions/api/manage_exceptions/route.ts" - }, - { - "plugin": "securitySolution", - "path": "x-pack/plugins/security_solution/server/lib/dashboards/routes/get_dashboards_by_tags.ts" - }, - { - "plugin": "securitySolution", - "path": "x-pack/plugins/security_solution/server/lib/detection_engine/routes/signals/set_alert_tags_route.ts" - }, { "plugin": "securitySolution", "path": "x-pack/plugins/security_solution/server/lib/risk_engine/routes/risk_score_preview_route.ts" @@ -8039,10 +7971,6 @@ "plugin": "securitySolution", "path": "x-pack/plugins/security_solution/server/lib/risk_score/stored_scripts/create_script_route.ts" }, - { - "plugin": "securitySolution", - "path": "x-pack/plugins/security_solution/server/lib/tags/routes/create_tag.ts" - }, { "plugin": "infra", "path": "x-pack/plugins/infra/server/lib/adapters/framework/kibana_framework_adapter.ts" @@ -9051,14 +8979,6 @@ "plugin": "savedObjectsTagging", "path": "x-pack/plugins/saved_objects_tagging/server/routes/tags/delete_tag.ts" }, - { - "plugin": "securitySolution", - "path": "x-pack/plugins/security_solution/server/lib/detection_engine/routes/signals/delete_signals_migration_route.ts" - }, - { - "plugin": "securitySolution", - "path": "x-pack/plugins/security_solution/server/lib/detection_engine/routes/index/delete_index_route.ts" - }, { "plugin": "securitySolution", "path": "x-pack/plugins/security_solution/server/lib/timeline/routes/timelines/delete_timelines/index.ts" @@ -13445,6 +13365,38 @@ "plugin": "securitySolution", "path": "x-pack/plugins/security_solution/server/lib/detection_engine/rule_management/api/tags/read_tags/route.ts" }, + { + "plugin": "securitySolution", + "path": "x-pack/plugins/security_solution/server/lib/detection_engine/fleet_integrations/api/get_installed_integrations/route.ts" + }, + { + "plugin": "securitySolution", + "path": "x-pack/plugins/security_solution/server/lib/detection_engine/rule_exceptions/api/find_exception_references/route.ts" + }, + { + "plugin": "securitySolution", + "path": "x-pack/plugins/security_solution/server/lib/detection_engine/routes/index/read_index_route.ts" + }, + { + "plugin": "securitySolution", + "path": "x-pack/plugins/security_solution/server/lib/detection_engine/routes/signals/get_signals_migration_status_route.ts" + }, + { + "plugin": "securitySolution", + "path": "x-pack/plugins/security_solution/server/lib/detection_engine/routes/privileges/read_privileges_route.ts" + }, + { + "plugin": "securitySolution", + "path": "x-pack/plugins/security_solution/server/lib/detection_engine/routes/telemetry/telemetry_detection_rules_preview_route.ts" + }, + { + "plugin": "securitySolution", + "path": "x-pack/plugins/security_solution/server/lib/detection_engine/routes/index/read_alerts_index_exists_route.ts" + }, + { + "plugin": "securitySolution", + "path": "x-pack/plugins/security_solution/server/lib/tags/routes/get_tags_by_name.ts" + }, { "plugin": "securitySolution", "path": "x-pack/plugins/security_solution/server/endpoint/routes/metadata/index.ts" @@ -13493,6 +13445,10 @@ "plugin": "securitySolution", "path": "x-pack/plugins/security_solution/server/endpoint/routes/actions/list.ts" }, + { + "plugin": "securitySolution", + "path": "x-pack/plugins/security_solution/server/endpoint/routes/protection_updates_note/index.ts" + }, { "plugin": "@kbn/core-http-router-server-mocks", "path": "packages/core/http/core-http-router-server-mocks/src/versioned_router.mock.ts" @@ -13965,6 +13921,10 @@ "plugin": "securitySolution", "path": "x-pack/plugins/security_solution/server/lib/detection_engine/rule_management/api/rules/update_rule/route.ts" }, + { + "plugin": "securitySolution", + "path": "x-pack/plugins/security_solution/server/lib/tags/routes/create_tag.ts" + }, { "plugin": "@kbn/core-http-router-server-mocks", "path": "packages/core/http/core-http-router-server-mocks/src/versioned_router.mock.ts" @@ -14585,6 +14545,10 @@ "plugin": "securitySolution", "path": "x-pack/plugins/security_solution/server/lib/detection_engine/rule_monitoring/api/detection_engine_health/setup/setup_health_route.ts" }, + { + "plugin": "securitySolution", + "path": "x-pack/plugins/security_solution/server/lib/detection_engine/rule_actions_legacy/api/create_legacy_notification/route.ts" + }, { "plugin": "securitySolution", "path": "x-pack/plugins/security_solution/server/lib/detection_engine/rule_management/api/rules/bulk_actions/route.ts" @@ -14613,6 +14577,46 @@ "plugin": "securitySolution", "path": "x-pack/plugins/security_solution/server/lib/detection_engine/rule_management/api/rules/coverage_overview/route.ts" }, + { + "plugin": "securitySolution", + "path": "x-pack/plugins/security_solution/server/lib/detection_engine/routes/index/create_index_route.ts" + }, + { + "plugin": "securitySolution", + "path": "x-pack/plugins/security_solution/server/lib/detection_engine/rule_exceptions/api/create_rule_exceptions/route.ts" + }, + { + "plugin": "securitySolution", + "path": "x-pack/plugins/security_solution/server/lib/detection_engine/rule_preview/api/preview_rules/route.ts" + }, + { + "plugin": "securitySolution", + "path": "x-pack/plugins/security_solution/server/lib/detection_engine/routes/signals/create_signals_migration_route.ts" + }, + { + "plugin": "securitySolution", + "path": "x-pack/plugins/security_solution/server/lib/detection_engine/routes/signals/finalize_signals_migration_route.ts" + }, + { + "plugin": "securitySolution", + "path": "x-pack/plugins/security_solution/server/lib/detection_engine/routes/signals/query_signals_route.ts" + }, + { + "plugin": "securitySolution", + "path": "x-pack/plugins/security_solution/server/lib/detection_engine/routes/signals/open_close_signals_route.ts" + }, + { + "plugin": "securitySolution", + "path": "x-pack/plugins/security_solution/server/lib/exceptions/api/manage_exceptions/route.ts" + }, + { + "plugin": "securitySolution", + "path": "x-pack/plugins/security_solution/server/lib/dashboards/routes/get_dashboards_by_tags.ts" + }, + { + "plugin": "securitySolution", + "path": "x-pack/plugins/security_solution/server/lib/detection_engine/routes/signals/set_alert_tags_route.ts" + }, { "plugin": "securitySolution", "path": "x-pack/plugins/security_solution/server/endpoint/routes/actions/file_upload_handler.ts" @@ -14657,6 +14661,10 @@ "plugin": "securitySolution", "path": "x-pack/plugins/security_solution/server/endpoint/routes/suggestions/index.ts" }, + { + "plugin": "securitySolution", + "path": "x-pack/plugins/security_solution/server/endpoint/routes/protection_updates_note/index.ts" + }, { "plugin": "@kbn/core-http-router-server-mocks", "path": "packages/core/http/core-http-router-server-mocks/src/versioned_router.mock.ts" @@ -15085,6 +15093,14 @@ "plugin": "securitySolution", "path": "x-pack/plugins/security_solution/server/lib/detection_engine/rule_management/api/rules/delete_rule/route.ts" }, + { + "plugin": "securitySolution", + "path": "x-pack/plugins/security_solution/server/lib/detection_engine/routes/signals/delete_signals_migration_route.ts" + }, + { + "plugin": "securitySolution", + "path": "x-pack/plugins/security_solution/server/lib/detection_engine/routes/index/delete_index_route.ts" + }, { "plugin": "@kbn/core-http-router-server-mocks", "path": "packages/core/http/core-http-router-server-mocks/src/versioned_router.mock.ts" diff --git a/api_docs/kbn_core_http_server.mdx b/api_docs/kbn_core_http_server.mdx index 9c3496ef068f3..524c28f9f58db 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-09-06 +date: 2023-09-07 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 9ea6c1275a4b1..643cd4bd6ba18 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-09-06 +date: 2023-09-07 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 064a29285937d..764aa8b3aae47 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-09-06 +date: 2023-09-07 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 528a58fcd9afa..022d4442cbf8d 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-09-06 +date: 2023-09-07 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 fdb0954f4e478..0a12f1a1df1c3 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-09-06 +date: 2023-09-07 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 4528e9b4a1544..bd2e72eaf3fc4 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-09-06 +date: 2023-09-07 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 776c8c619f977..f523db576ed07 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-09-06 +date: 2023-09-07 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 6a06e4503c60c..5ec1a09ca8999 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-09-06 +date: 2023-09-07 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 ce6c84a1bd946..c1b9bafa28aa7 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-09-06 +date: 2023-09-07 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 adca2cad222a8..71ccb29fe9ddf 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-09-06 +date: 2023-09-07 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 e1023f069e005..e8be0a4b4f1ec 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-09-06 +date: 2023-09-07 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 58676fb7f6427..dcebdea23053a 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-09-06 +date: 2023-09-07 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 b1d24176b8cb8..59a45f8aece4e 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-09-06 +date: 2023-09-07 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 559e1fa99ab74..74edb3f049c24 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-09-06 +date: 2023-09-07 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 58cfd92adec97..342e73b5af697 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-09-06 +date: 2023-09-07 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 a534b7d888b56..01540c6511f01 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-09-06 +date: 2023-09-07 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 026bf2a562778..72d2fe78fbd64 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-09-06 +date: 2023-09-07 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 c1d0e4b35eb36..b3cd0d6261ea3 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-09-06 +date: 2023-09-07 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 e837d8eb13ab7..9bc280825799d 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-09-06 +date: 2023-09-07 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 4e6036af67658..976128777a55b 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-09-06 +date: 2023-09-07 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 c5886d6d47910..15bd1e3daa32c 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-09-06 +date: 2023-09-07 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 95a75ad4c18ce..608c2393e1428 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-09-06 +date: 2023-09-07 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 380282b4554c9..e752441ae1949 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-09-06 +date: 2023-09-07 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 f78d7428e9be1..0dbdea30ffa12 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-09-06 +date: 2023-09-07 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 30ff706492b45..9d8a3145f4cd2 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-09-06 +date: 2023-09-07 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 d974a7a67c19f..22806f2d511e9 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-09-06 +date: 2023-09-07 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 9e2e896b4df6c..ce5d28c7ca846 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-09-06 +date: 2023-09-07 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 c665b4838b3fe..ad9cf10185784 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-09-06 +date: 2023-09-07 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 61ccc1bb4249c..4d633bda18089 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-09-06 +date: 2023-09-07 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 c26140dc1a4f2..7dae166ea1775 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-09-06 +date: 2023-09-07 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 4abe76f9aa06d..eefc0c018241b 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-09-06 +date: 2023-09-07 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 8ee27b4b6d659..f0d3b67178a31 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-09-06 +date: 2023-09-07 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 d39dbc30f0e99..f111285b6a271 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-09-06 +date: 2023-09-07 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 79796c21f1a30..1a7651add3a71 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-09-06 +date: 2023-09-07 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 287e9f8b1253a..858fb06982f28 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-09-06 +date: 2023-09-07 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 d2084acdedc68..a670a25a01a9c 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-09-06 +date: 2023-09-07 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 a04f2da24f043..05c61d3a982f3 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-09-06 +date: 2023-09-07 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 7a0c4e4360ba8..b15fd6bb9f401 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-09-06 +date: 2023-09-07 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 f6950ead9c384..b197b27c39ec7 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-09-06 +date: 2023-09-07 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 63c27b4dd965f..26404256ee68f 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-09-06 +date: 2023-09-07 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 a4b85da878aa8..50931621f7ac0 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-09-06 +date: 2023-09-07 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 cabbdecb8810e..29b2d4a33647b 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-09-06 +date: 2023-09-07 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 fede8551955b7..e195fdc670ad9 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-09-06 +date: 2023-09-07 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 d5a3a3a0cadd7..da6e8eef6b50a 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-09-06 +date: 2023-09-07 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 f8899741c8460..b1db124ded172 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-09-06 +date: 2023-09-07 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 1a90b731a4887..4b838dfd9956f 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-09-06 +date: 2023-09-07 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 64389307dc138..550a24059762f 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-09-06 +date: 2023-09-07 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 0f8a33bebb2e9..dd345d20efba0 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-09-06 +date: 2023-09-07 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 dd9f7170f150b..708b1c7623188 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-09-06 +date: 2023-09-07 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 90e9ac5bd716d..69a379f3ebe61 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-09-06 +date: 2023-09-07 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 a1817a6a07a17..f87d40af80278 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-09-06 +date: 2023-09-07 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 39c4cf7af65a6..2e0b7b5c57183 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-09-06 +date: 2023-09-07 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 e54de71bfcbc2..dbd89a867c992 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-09-06 +date: 2023-09-07 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 3ff296d3868fc..5275566b81395 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-09-06 +date: 2023-09-07 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 f6960165a3be9..d47385b09c267 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-09-06 +date: 2023-09-07 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 f19151f739d6f..99efb28372a8d 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-09-06 +date: 2023-09-07 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 25f1f95e6a02e..f3df3c2f82637 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-09-06 +date: 2023-09-07 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 c937a174fb823..c131798c141f0 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-09-06 +date: 2023-09-07 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 6e626b240d86f..133135909fef4 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-09-06 +date: 2023-09-07 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 4fd533bb4bd96..bec256f258a92 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-09-06 +date: 2023-09-07 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 9f52c18dfbf58..eba8b28059383 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-09-06 +date: 2023-09-07 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 9d8cb3332c731..9784f060a9ac5 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-09-06 +date: 2023-09-07 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 94fd11c66372d..2750648ba37d1 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-09-06 +date: 2023-09-07 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 dda2c0825eaa3..d938b4cfb657f 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-09-06 +date: 2023-09-07 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 a19249d60f01d..106a3c65d98e2 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-09-06 +date: 2023-09-07 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 c966bb6c9d67a..4d589c377d835 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-09-06 +date: 2023-09-07 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 b587cc553b72a..1f0fd8ddeb002 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-09-06 +date: 2023-09-07 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 1e629acc9f8dc..3f9359f240fb8 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-09-06 +date: 2023-09-07 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 3bb3db62ea820..ec2fd963cbfb0 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-09-06 +date: 2023-09-07 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 4555f0c0cd81e..c0cd3d14155f5 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-09-06 +date: 2023-09-07 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_so_type_serializer.mdx b/api_docs/kbn_core_test_helpers_so_type_serializer.mdx index c165846077470..13cd5bbf4bdf7 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-09-06 +date: 2023-09-07 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 a91080213c357..75600d210cfe4 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-09-06 +date: 2023-09-07 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 9867d7595e2d6..5d53b7eabe9a4 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-09-06 +date: 2023-09-07 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 49a95f55c685f..9c278f78e3ecc 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-09-06 +date: 2023-09-07 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 4f4a82e3edb6b..0377abd92bf9b 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-09-06 +date: 2023-09-07 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 9cc0c2c5ccd1b..d0f610aaba4f3 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-09-06 +date: 2023-09-07 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 c8480d7b9aebd..9a76328adc2b0 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-09-06 +date: 2023-09-07 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 c3b16d9766a8d..829ac001c8c36 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-09-06 +date: 2023-09-07 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 6c6d03f53fba5..36de04565782f 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-09-06 +date: 2023-09-07 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 75dc24f2e5847..cb3b507d6007a 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-09-06 +date: 2023-09-07 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 86303d6f9925b..19c4d4684d15f 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-09-06 +date: 2023-09-07 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 7585ebcdc8491..bf229537141e0 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-09-06 +date: 2023-09-07 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 0ea42f83373ff..cab49d88fd4a0 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-09-06 +date: 2023-09-07 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 fe1bd0e1c356e..53f3d8adffca7 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-09-06 +date: 2023-09-07 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 c29d4fa88fcb8..13c85d56c8ce8 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-09-06 +date: 2023-09-07 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 c0f46d66768c2..1b1f1254d9472 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-09-06 +date: 2023-09-07 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 69d4bc3d102b6..6237aaea079c3 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-09-06 +date: 2023-09-07 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 50e5bd19b4768..55295735c937c 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-09-06 +date: 2023-09-07 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 3c831c1d0ee89..472d1a158845c 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-09-06 +date: 2023-09-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/crypto-browser'] --- import kbnCryptoBrowserObj from './kbn_crypto_browser.devdocs.json'; diff --git a/api_docs/kbn_cypress_config.mdx b/api_docs/kbn_cypress_config.mdx index 78a73de5d1867..7be7302f554d7 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-09-06 +date: 2023-09-07 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 a6105789f0523..a8bd4c0efa24d 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-09-06 +date: 2023-09-07 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 766b8051ca37a..acd983c51f130 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-09-06 +date: 2023-09-07 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 cb1ffb4254106..3360915b691ce 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-09-06 +date: 2023-09-07 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 b047cb06b1511..a1c579d5f0c5f 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-09-06 +date: 2023-09-07 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 9219e6753b699..03d5d36dc8437 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-09-06 +date: 2023-09-07 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 44e124a7514ad..4e6e47f32a38a 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-09-06 +date: 2023-09-07 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 f75e59835c071..6ccdebf8a10e2 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-09-06 +date: 2023-09-07 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 0180e463d2d72..d3563db00e449 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-09-06 +date: 2023-09-07 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.mdx b/api_docs/kbn_default_nav_analytics.mdx index 840bef3ce72ef..c1a3ccf8b5b8b 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-09-06 +date: 2023-09-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/default-nav-analytics'] --- import kbnDefaultNavAnalyticsObj from './kbn_default_nav_analytics.devdocs.json'; diff --git a/api_docs/kbn_default_nav_devtools.mdx b/api_docs/kbn_default_nav_devtools.mdx index 176cd083cf18e..c6b884aedd57a 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-09-06 +date: 2023-09-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/default-nav-devtools'] --- import kbnDefaultNavDevtoolsObj from './kbn_default_nav_devtools.devdocs.json'; diff --git a/api_docs/kbn_default_nav_management.mdx b/api_docs/kbn_default_nav_management.mdx index 0ac9edfdd54fc..fe5c9fe3d51d7 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-09-06 +date: 2023-09-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/default-nav-management'] --- import kbnDefaultNavManagementObj from './kbn_default_nav_management.devdocs.json'; diff --git a/api_docs/kbn_default_nav_ml.mdx b/api_docs/kbn_default_nav_ml.mdx index b20c3bdd080da..01de67e7ea159 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-09-06 +date: 2023-09-07 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 113cd6a82a2b5..5c02782eca67b 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-09-06 +date: 2023-09-07 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 d6bc349a21507..42dac5b37d1ff 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-09-06 +date: 2023-09-07 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 56d8fec5c0828..35d5ec3f2fabc 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-09-06 +date: 2023-09-07 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 b9d6443d12d88..959e3967a1d9e 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-09-06 +date: 2023-09-07 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 53a748f72b7e0..bb59a0538e702 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-09-06 +date: 2023-09-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/discover-utils'] --- import kbnDiscoverUtilsObj from './kbn_discover_utils.devdocs.json'; diff --git a/api_docs/kbn_doc_links.devdocs.json b/api_docs/kbn_doc_links.devdocs.json index 724a581015e7e..c506705aeb8ca 100644 --- a/api_docs/kbn_doc_links.devdocs.json +++ b/api_docs/kbn_doc_links.devdocs.json @@ -840,7 +840,7 @@ "label": "fleet", "description": [], "signature": [ - "{ readonly beatsAgentComparison: string; readonly guide: string; readonly fleetServer: string; readonly fleetServerAddFleetServer: string; readonly settings: string; readonly logstashSettings: string; readonly kafkaSettings: string; readonly settingsFleetServerHostSettings: string; readonly settingsFleetServerProxySettings: string; readonly troubleshooting: string; readonly elasticAgent: string; readonly datastreams: string; readonly datastreamsILM: string; readonly datastreamsNamingScheme: string; readonly datastreamsManualRollover: string; readonly datastreamsTSDS: string; readonly datastreamsTSDSMetrics: string; readonly installElasticAgent: string; readonly installElasticAgentStandalone: string; readonly packageSignatures: string; readonly upgradeElasticAgent: string; readonly learnMoreBlog: string; readonly apiKeysLearnMore: string; readonly onPremRegistry: string; readonly secureLogstash: string; readonly agentPolicy: string; readonly api: string; readonly uninstallAgent: string; }" + "{ readonly beatsAgentComparison: string; readonly guide: string; readonly fleetServer: string; readonly fleetServerAddFleetServer: string; readonly esSettings: string; readonly settings: string; readonly logstashSettings: string; readonly kafkaSettings: string; readonly settingsFleetServerHostSettings: string; readonly settingsFleetServerProxySettings: string; readonly troubleshooting: string; readonly elasticAgent: string; readonly datastreams: string; readonly datastreamsILM: string; readonly datastreamsNamingScheme: string; readonly datastreamsManualRollover: string; readonly datastreamsTSDS: string; readonly datastreamsTSDSMetrics: string; readonly installElasticAgent: string; readonly installElasticAgentStandalone: string; readonly packageSignatures: string; readonly upgradeElasticAgent: string; readonly learnMoreBlog: string; readonly apiKeysLearnMore: string; readonly onPremRegistry: string; readonly secureLogstash: string; readonly agentPolicy: string; readonly api: string; readonly uninstallAgent: string; }" ], "path": "packages/kbn-doc-links/src/types.ts", "deprecated": false, diff --git a/api_docs/kbn_doc_links.mdx b/api_docs/kbn_doc_links.mdx index e10d05ddd78de..0d071bbd36d9c 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-09-06 +date: 2023-09-07 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 a670edb9d3018..75ae029e5b556 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-09-06 +date: 2023-09-07 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 23edb0ca7fe72..2fa013599dba5 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-09-06 +date: 2023-09-07 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 c95007904924d..ae63079191e03 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-09-06 +date: 2023-09-07 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 58903a3c81abd..f0bb3426b3934 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-09-06 +date: 2023-09-07 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 10bad964f02e3..1e2cfe20365be 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-09-06 +date: 2023-09-07 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.mdx b/api_docs/kbn_elastic_assistant.mdx index bebee29d1038a..c36a4e823a86d 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-09-06 +date: 2023-09-07 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 5d064f79a07bd..8f52eccfd3bda 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-09-06 +date: 2023-09-07 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 a9952ec8ee4af..23e79b7fa49c4 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-09-06 +date: 2023-09-07 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 0e57d7bc1d6bd..bb6eb0d9fae16 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-09-06 +date: 2023-09-07 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 eec6a2e640015..a12e1afbbb1e9 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-09-06 +date: 2023-09-07 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 7196f80f9f763..fe7bba02a3494 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-09-06 +date: 2023-09-07 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 46a0a1ea92a11..6db39ea36d3c5 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-09-06 +date: 2023-09-07 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 4269e7ed98e83..108c25f1cfdd7 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-09-06 +date: 2023-09-07 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 e0b8669cdc1dd..8bd67769c582a 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-09-06 +date: 2023-09-07 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 9bc0c96297a67..ca81e58bb1af5 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-09-06 +date: 2023-09-07 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 e9b8161b5dc7d..3af6f0754e79d 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-09-06 +date: 2023-09-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/field-types'] --- import kbnFieldTypesObj from './kbn_field_types.devdocs.json'; diff --git a/api_docs/kbn_find_used_node_modules.mdx b/api_docs/kbn_find_used_node_modules.mdx index bbd8695bcee88..f23051fd60553 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-09-06 +date: 2023-09-07 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 568548ff4aa6f..a8bc1c6985402 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-09-06 +date: 2023-09-07 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 fa5768753b039..82e7a6429a3f3 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-09-06 +date: 2023-09-07 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 419f938af074e..1162fca64a5b8 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-09-06 +date: 2023-09-07 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 c1bfcd5bb2818..120da3937dfd1 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-09-06 +date: 2023-09-07 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 6c563f87fe9c4..aece1358b05c0 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-09-06 +date: 2023-09-07 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 9d8254b6d4c5f..d42da1ac9b6be 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-09-06 +date: 2023-09-07 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 ccc8ed8e145b8..ff591293ccc7c 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-09-06 +date: 2023-09-07 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 cd799193dec7a..4782db52d2da2 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-09-06 +date: 2023-09-07 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 80c18b02ac5d9..3d628696e8151 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-09-06 +date: 2023-09-07 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 fccf61bb0964f..9889c9e387127 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-09-06 +date: 2023-09-07 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 b7f726363dba7..a2a44b51da906 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-09-06 +date: 2023-09-07 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 4eee0d1ff683e..792ea12361c81 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-09-06 +date: 2023-09-07 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 4884deac439ee..8c154e5a65996 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-09-06 +date: 2023-09-07 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 d77d54b054703..680add585f26f 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-09-06 +date: 2023-09-07 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 89ce0ace7f38c..5b3971882ab29 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-09-06 +date: 2023-09-07 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 94444ebdea104..7b396ff913a2b 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-09-06 +date: 2023-09-07 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 bdd68dda0749d..7202252e9393a 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-09-06 +date: 2023-09-07 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 b1b983d226fc9..36ef37997795c 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-09-06 +date: 2023-09-07 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 4f0bc0218e945..339c80744f619 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-09-06 +date: 2023-09-07 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 5dd173d676d19..5fa3bd4e5e506 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-09-06 +date: 2023-09-07 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 b37f26feca8fb..0f6e3aec16de0 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-09-06 +date: 2023-09-07 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 f5ee3dc45859c..6116165a21bd9 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-09-06 +date: 2023-09-07 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 80ec92818f67d..1d59503d9f393 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-09-06 +date: 2023-09-07 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 4d9107defc8a9..ac511da994117 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-09-06 +date: 2023-09-07 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 dabeeff20ae91..e76082e81b202 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-09-06 +date: 2023-09-07 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 cb57687c88b52..97d0708ae2a7a 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-09-06 +date: 2023-09-07 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 e26a3332382d8..d6907d2e9fc8c 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-09-06 +date: 2023-09-07 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_section_registry.mdx b/api_docs/kbn_management_settings_section_registry.mdx index 10cb7f1612594..8b23313328ee4 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-09-06 +date: 2023-09-07 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_storybook_config.mdx b/api_docs/kbn_management_storybook_config.mdx index 4d78f021e9b8e..72b228342e885 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-09-06 +date: 2023-09-07 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 25b8eddaed820..dbc5be6ef424c 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-09-06 +date: 2023-09-07 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 a486f91c6ce80..c2574bad2e432 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-09-06 +date: 2023-09-07 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 1f573f178aa48..c8b57cc3f3bfb 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-09-06 +date: 2023-09-07 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 9aae44e563071..ce984d4b3120d 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-09-06 +date: 2023-09-07 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 b61bae7f686c0..8146777b310b2 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-09-06 +date: 2023-09-07 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_data_frame_analytics_utils.mdx b/api_docs/kbn_ml_data_frame_analytics_utils.mdx index d028bcdd292c2..604927e8dbd9c 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-09-06 +date: 2023-09-07 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 46160457cfb40..03caad0f02ba5 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-09-06 +date: 2023-09-07 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 b49d37521dfc5..73bd16f3701cf 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-09-06 +date: 2023-09-07 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 f36efa6260bed..a0b567255525e 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-09-06 +date: 2023-09-07 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 e67965622abf2..6f4b7bd3cb5b5 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-09-06 +date: 2023-09-07 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 2293abb378091..930d7663cb1cc 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-09-06 +date: 2023-09-07 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 76d18ea443e22..e1825452ebb7f 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-09-06 +date: 2023-09-07 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 b63ebb802ae4b..229f03a58354c 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-09-06 +date: 2023-09-07 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 0e95c8df6db6c..d12c0806de6fa 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-09-06 +date: 2023-09-07 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 09f3f34afa52f..714909028c707 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-09-06 +date: 2023-09-07 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 c2686005a1b47..8fe3474c520a6 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-09-06 +date: 2023-09-07 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 e364f70c184f4..576c11e40ad1f 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-09-06 +date: 2023-09-07 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 e7fe7ad9957c3..f0b94d49a4b2e 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-09-06 +date: 2023-09-07 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 096a5f9b29ae8..392deee9de3f4 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-09-06 +date: 2023-09-07 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 7208fd4f27840..5a30d92ce4d9b 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-09-06 +date: 2023-09-07 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 cb41d872a670c..fe3ff65084fc1 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-09-06 +date: 2023-09-07 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 93bb955960964..a81620195387e 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-09-06 +date: 2023-09-07 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 4c283c282c8db..0bbd1cd4a77d2 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-09-06 +date: 2023-09-07 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 a9c038be9f5c2..94922e02f7ef0 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-09-06 +date: 2023-09-07 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 463ab406fd55f..794637307304a 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-09-06 +date: 2023-09-07 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 bda7e1b72a441..5c6edcf7172a7 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-09-06 +date: 2023-09-07 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 b8f82ea078ebd..1149b68db08dc 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-09-06 +date: 2023-09-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/observability-alert-details'] --- import kbnObservabilityAlertDetailsObj from './kbn_observability_alert_details.devdocs.json'; diff --git a/api_docs/kbn_optimizer.mdx b/api_docs/kbn_optimizer.mdx index bb6ff9ee4a617..9e39f61cf08d2 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-09-06 +date: 2023-09-07 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 c84308de8a868..d23c1201e1dab 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-09-06 +date: 2023-09-07 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 066a71a3ae5cc..c3b10b12bd441 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-09-06 +date: 2023-09-07 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 5f2f2e6c06ab9..297ee6b1be457 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-09-06 +date: 2023-09-07 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 26eda92de104d..0366d99d9d01a 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-09-06 +date: 2023-09-07 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 d4bc0aa7aeb60..db50c36d6229d 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-09-06 +date: 2023-09-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/plugin-helpers'] --- import kbnPluginHelpersObj from './kbn_plugin_helpers.devdocs.json'; diff --git a/api_docs/kbn_random_sampling.mdx b/api_docs/kbn_random_sampling.mdx index d960522fa72fd..28307f12d2b28 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-09-06 +date: 2023-09-07 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 da88dd664e8ff..33929a9dcb507 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-09-06 +date: 2023-09-07 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 eecec8d83ceec..12d7b57a58a47 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-09-06 +date: 2023-09-07 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 c82f905d9cae0..6ae5aba2b9198 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-09-06 +date: 2023-09-07 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 987e08f19e998..86b945b8a405b 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-09-06 +date: 2023-09-07 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 56a9cf9e42403..5b581a974e3a0 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-09-06 +date: 2023-09-07 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 6c1db92f4085f..0c30be0bfbc4c 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-09-06 +date: 2023-09-07 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 a16b44419d80c..2be6f38cd0b97 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-09-06 +date: 2023-09-07 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 3fb309c33bca7..3a37cab5f1feb 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-09-06 +date: 2023-09-07 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 9b7f9cae664f2..70f8d20ec93ae 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-09-06 +date: 2023-09-07 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 425b657af6cfc..06fe9b2a0f09e 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-09-06 +date: 2023-09-07 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 8215af139a97c..eaadfa9c72e24 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-09-06 +date: 2023-09-07 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 d56d17b99edbb..bdd17b320a8e1 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-09-06 +date: 2023-09-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/reporting-common'] --- import kbnReportingCommonObj from './kbn_reporting_common.devdocs.json'; diff --git a/api_docs/kbn_rison.mdx b/api_docs/kbn_rison.mdx index ba5d06f60e55a..ecd2224a41e23 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-09-06 +date: 2023-09-07 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 0ce562174ec43..05bf37913bfb8 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-09-06 +date: 2023-09-07 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 a3b3283db157c..59eac05339b19 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-09-06 +date: 2023-09-07 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 65c3223d3705c..4089b880106f6 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-09-06 +date: 2023-09-07 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 f928c35ff17e3..fef62ef1d6f2f 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-09-06 +date: 2023-09-07 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.devdocs.json b/api_docs/kbn_search_connectors.devdocs.json new file mode 100644 index 0000000000000..d008846114104 --- /dev/null +++ b/api_docs/kbn_search_connectors.devdocs.json @@ -0,0 +1,24537 @@ +{ + "id": "@kbn/search-connectors", + "client": { + "classes": [], + "functions": [], + "interfaces": [], + "enums": [], + "misc": [], + "objects": [] + }, + "server": { + "classes": [], + "functions": [], + "interfaces": [], + "enums": [], + "misc": [], + "objects": [] + }, + "common": { + "classes": [], + "functions": [ + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.cancelSyncs", + "type": "Function", + "tags": [], + "label": "cancelSyncs", + "description": [], + "signature": [ + "(client: ", + { + "pluginId": "@kbn/core-elasticsearch-server", + "scope": "common", + "docId": "kibKbnCoreElasticsearchServerPluginApi", + "section": "def-common.ElasticsearchClient", + "text": "ElasticsearchClient" + }, + ", connectorId: string) => Promise" + ], + "path": "packages/kbn-search-connectors/lib/cancel_syncs.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.cancelSyncs.$1", + "type": "Object", + "tags": [], + "label": "client", + "description": [], + "signature": [ + { + "pluginId": "@kbn/core-elasticsearch-server", + "scope": "common", + "docId": "kibKbnCoreElasticsearchServerPluginApi", + "section": "def-common.ElasticsearchClient", + "text": "ElasticsearchClient" + } + ], + "path": "packages/kbn-search-connectors/lib/cancel_syncs.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.cancelSyncs.$2", + "type": "string", + "tags": [], + "label": "connectorId", + "description": [], + "signature": [ + "string" + ], + "path": "packages/kbn-search-connectors/lib/cancel_syncs.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + } + ], + "returnComment": [], + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.createConnector", + "type": "Function", + "tags": [], + "label": "createConnector", + "description": [], + "signature": [ + "(client: ", + { + "pluginId": "@kbn/core-elasticsearch-server", + "scope": "common", + "docId": "kibKbnCoreElasticsearchServerPluginApi", + "section": "def-common.ElasticsearchClient", + "text": "ElasticsearchClient" + }, + ", input: { configuration?: ", + { + "pluginId": "@kbn/search-connectors", + "scope": "common", + "docId": "kibKbnSearchConnectorsPluginApi", + "section": "def-common.ConnectorConfiguration", + "text": "ConnectorConfiguration" + }, + " | undefined; features?: ", + { + "pluginId": "@kbn/search-connectors", + "scope": "common", + "docId": "kibKbnSearchConnectorsPluginApi", + "section": "def-common.ConnectorFeatures", + "text": "ConnectorFeatures" + }, + " | undefined; indexName: string | null; isNative: boolean; language: string | null; name?: string | undefined; pipeline: ", + { + "pluginId": "@kbn/search-connectors", + "scope": "common", + "docId": "kibKbnSearchConnectorsPluginApi", + "section": "def-common.IngestPipelineParams", + "text": "IngestPipelineParams" + }, + "; serviceType?: string | null | undefined; }) => Promise<", + { + "pluginId": "@kbn/search-connectors", + "scope": "common", + "docId": "kibKbnSearchConnectorsPluginApi", + "section": "def-common.Connector", + "text": "Connector" + }, + ">" + ], + "path": "packages/kbn-search-connectors/lib/create_connector.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.createConnector.$1", + "type": "Object", + "tags": [], + "label": "client", + "description": [], + "signature": [ + { + "pluginId": "@kbn/core-elasticsearch-server", + "scope": "common", + "docId": "kibKbnCoreElasticsearchServerPluginApi", + "section": "def-common.ElasticsearchClient", + "text": "ElasticsearchClient" + } + ], + "path": "packages/kbn-search-connectors/lib/create_connector.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.createConnector.$2", + "type": "Object", + "tags": [], + "label": "input", + "description": [], + "path": "packages/kbn-search-connectors/lib/create_connector.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.createConnector.$2.configuration", + "type": "CompoundType", + "tags": [], + "label": "configuration", + "description": [], + "signature": [ + { + "pluginId": "@kbn/search-connectors", + "scope": "common", + "docId": "kibKbnSearchConnectorsPluginApi", + "section": "def-common.ConnectorConfiguration", + "text": "ConnectorConfiguration" + }, + " | undefined" + ], + "path": "packages/kbn-search-connectors/lib/create_connector.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.createConnector.$2.features", + "type": "CompoundType", + "tags": [], + "label": "features", + "description": [], + "signature": [ + { + "pluginId": "@kbn/search-connectors", + "scope": "common", + "docId": "kibKbnSearchConnectorsPluginApi", + "section": "def-common.ConnectorFeatures", + "text": "ConnectorFeatures" + }, + " | undefined" + ], + "path": "packages/kbn-search-connectors/lib/create_connector.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.createConnector.$2.indexName", + "type": "CompoundType", + "tags": [], + "label": "indexName", + "description": [], + "signature": [ + "string | null" + ], + "path": "packages/kbn-search-connectors/lib/create_connector.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.createConnector.$2.isNative", + "type": "boolean", + "tags": [], + "label": "isNative", + "description": [], + "path": "packages/kbn-search-connectors/lib/create_connector.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.createConnector.$2.language", + "type": "CompoundType", + "tags": [], + "label": "language", + "description": [], + "signature": [ + "string | null" + ], + "path": "packages/kbn-search-connectors/lib/create_connector.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.createConnector.$2.name", + "type": "string", + "tags": [], + "label": "name", + "description": [], + "signature": [ + "string | undefined" + ], + "path": "packages/kbn-search-connectors/lib/create_connector.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.createConnector.$2.pipeline", + "type": "Object", + "tags": [], + "label": "pipeline", + "description": [], + "signature": [ + { + "pluginId": "@kbn/search-connectors", + "scope": "common", + "docId": "kibKbnSearchConnectorsPluginApi", + "section": "def-common.IngestPipelineParams", + "text": "IngestPipelineParams" + } + ], + "path": "packages/kbn-search-connectors/lib/create_connector.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.createConnector.$2.serviceType", + "type": "CompoundType", + "tags": [], + "label": "serviceType", + "description": [], + "signature": [ + "string | null | undefined" + ], + "path": "packages/kbn-search-connectors/lib/create_connector.ts", + "deprecated": false, + "trackAdoption": false + } + ] + } + ], + "returnComment": [], + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.createConnectorDocument", + "type": "Function", + "tags": [], + "label": "createConnectorDocument", + "description": [], + "signature": [ + "({\n configuration,\n features,\n indexName,\n isNative,\n name,\n pipeline,\n serviceType,\n language,\n}: { configuration?: ", + { + "pluginId": "@kbn/search-connectors", + "scope": "common", + "docId": "kibKbnSearchConnectorsPluginApi", + "section": "def-common.ConnectorConfiguration", + "text": "ConnectorConfiguration" + }, + " | undefined; features?: ", + { + "pluginId": "@kbn/search-connectors", + "scope": "common", + "docId": "kibKbnSearchConnectorsPluginApi", + "section": "def-common.ConnectorFeatures", + "text": "ConnectorFeatures" + }, + " | undefined; indexName: string | null; isNative: boolean; language: string | null; name?: string | undefined; pipeline?: ", + { + "pluginId": "@kbn/search-connectors", + "scope": "common", + "docId": "kibKbnSearchConnectorsPluginApi", + "section": "def-common.IngestPipelineParams", + "text": "IngestPipelineParams" + }, + " | null | undefined; serviceType: string | null; }) => ", + { + "pluginId": "@kbn/search-connectors", + "scope": "common", + "docId": "kibKbnSearchConnectorsPluginApi", + "section": "def-common.ConnectorDocument", + "text": "ConnectorDocument" + } + ], + "path": "packages/kbn-search-connectors/lib/create_connector_document.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.createConnectorDocument.$1", + "type": "Object", + "tags": [], + "label": "{\n configuration,\n features,\n indexName,\n isNative,\n name,\n pipeline,\n serviceType,\n language,\n}", + "description": [], + "path": "packages/kbn-search-connectors/lib/create_connector_document.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.createConnectorDocument.$1.configuration", + "type": "CompoundType", + "tags": [], + "label": "configuration", + "description": [], + "signature": [ + { + "pluginId": "@kbn/search-connectors", + "scope": "common", + "docId": "kibKbnSearchConnectorsPluginApi", + "section": "def-common.ConnectorConfiguration", + "text": "ConnectorConfiguration" + }, + " | undefined" + ], + "path": "packages/kbn-search-connectors/lib/create_connector_document.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.createConnectorDocument.$1.features", + "type": "CompoundType", + "tags": [], + "label": "features", + "description": [], + "signature": [ + { + "pluginId": "@kbn/search-connectors", + "scope": "common", + "docId": "kibKbnSearchConnectorsPluginApi", + "section": "def-common.ConnectorFeatures", + "text": "ConnectorFeatures" + }, + " | undefined" + ], + "path": "packages/kbn-search-connectors/lib/create_connector_document.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.createConnectorDocument.$1.indexName", + "type": "CompoundType", + "tags": [], + "label": "indexName", + "description": [], + "signature": [ + "string | null" + ], + "path": "packages/kbn-search-connectors/lib/create_connector_document.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.createConnectorDocument.$1.isNative", + "type": "boolean", + "tags": [], + "label": "isNative", + "description": [], + "path": "packages/kbn-search-connectors/lib/create_connector_document.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.createConnectorDocument.$1.language", + "type": "CompoundType", + "tags": [], + "label": "language", + "description": [], + "signature": [ + "string | null" + ], + "path": "packages/kbn-search-connectors/lib/create_connector_document.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.createConnectorDocument.$1.name", + "type": "string", + "tags": [], + "label": "name", + "description": [], + "signature": [ + "string | undefined" + ], + "path": "packages/kbn-search-connectors/lib/create_connector_document.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.createConnectorDocument.$1.pipeline", + "type": "CompoundType", + "tags": [], + "label": "pipeline", + "description": [], + "signature": [ + { + "pluginId": "@kbn/search-connectors", + "scope": "common", + "docId": "kibKbnSearchConnectorsPluginApi", + "section": "def-common.IngestPipelineParams", + "text": "IngestPipelineParams" + }, + " | null | undefined" + ], + "path": "packages/kbn-search-connectors/lib/create_connector_document.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.createConnectorDocument.$1.serviceType", + "type": "CompoundType", + "tags": [], + "label": "serviceType", + "description": [], + "signature": [ + "string | null" + ], + "path": "packages/kbn-search-connectors/lib/create_connector_document.ts", + "deprecated": false, + "trackAdoption": false + } + ] + } + ], + "returnComment": [], + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.deleteConnectorById", + "type": "Function", + "tags": [], + "label": "deleteConnectorById", + "description": [], + "signature": [ + "(client: ", + { + "pluginId": "@kbn/core-elasticsearch-server", + "scope": "common", + "docId": "kibKbnCoreElasticsearchServerPluginApi", + "section": "def-common.ElasticsearchClient", + "text": "ElasticsearchClient" + }, + ", id: string) => Promise<", + "WriteResponseBase", + ">" + ], + "path": "packages/kbn-search-connectors/lib/delete_connector.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.deleteConnectorById.$1", + "type": "Object", + "tags": [], + "label": "client", + "description": [], + "signature": [ + { + "pluginId": "@kbn/core-elasticsearch-server", + "scope": "common", + "docId": "kibKbnCoreElasticsearchServerPluginApi", + "section": "def-common.ElasticsearchClient", + "text": "ElasticsearchClient" + } + ], + "path": "packages/kbn-search-connectors/lib/delete_connector.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.deleteConnectorById.$2", + "type": "string", + "tags": [], + "label": "id", + "description": [], + "signature": [ + "string" + ], + "path": "packages/kbn-search-connectors/lib/delete_connector.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + } + ], + "returnComment": [], + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.fetchConnectorById", + "type": "Function", + "tags": [], + "label": "fetchConnectorById", + "description": [], + "signature": [ + "(client: ", + { + "pluginId": "@kbn/core-elasticsearch-server", + "scope": "common", + "docId": "kibKbnCoreElasticsearchServerPluginApi", + "section": "def-common.ElasticsearchClient", + "text": "ElasticsearchClient" + }, + ", connectorId: string) => Promise<", + { + "pluginId": "@kbn/search-connectors", + "scope": "common", + "docId": "kibKbnSearchConnectorsPluginApi", + "section": "def-common.OptimisticConcurrency", + "text": "OptimisticConcurrency" + }, + "<", + { + "pluginId": "@kbn/search-connectors", + "scope": "common", + "docId": "kibKbnSearchConnectorsPluginApi", + "section": "def-common.Connector", + "text": "Connector" + }, + "> | undefined>" + ], + "path": "packages/kbn-search-connectors/lib/fetch_connectors.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.fetchConnectorById.$1", + "type": "Object", + "tags": [], + "label": "client", + "description": [], + "signature": [ + { + "pluginId": "@kbn/core-elasticsearch-server", + "scope": "common", + "docId": "kibKbnCoreElasticsearchServerPluginApi", + "section": "def-common.ElasticsearchClient", + "text": "ElasticsearchClient" + } + ], + "path": "packages/kbn-search-connectors/lib/fetch_connectors.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.fetchConnectorById.$2", + "type": "string", + "tags": [], + "label": "connectorId", + "description": [], + "signature": [ + "string" + ], + "path": "packages/kbn-search-connectors/lib/fetch_connectors.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + } + ], + "returnComment": [], + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.fetchConnectorByIndexName", + "type": "Function", + "tags": [], + "label": "fetchConnectorByIndexName", + "description": [], + "signature": [ + "(client: ", + { + "pluginId": "@kbn/core-elasticsearch-server", + "scope": "common", + "docId": "kibKbnCoreElasticsearchServerPluginApi", + "section": "def-common.ElasticsearchClient", + "text": "ElasticsearchClient" + }, + ", indexName: string) => Promise<", + { + "pluginId": "@kbn/search-connectors", + "scope": "common", + "docId": "kibKbnSearchConnectorsPluginApi", + "section": "def-common.Connector", + "text": "Connector" + }, + " | undefined>" + ], + "path": "packages/kbn-search-connectors/lib/fetch_connectors.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.fetchConnectorByIndexName.$1", + "type": "Object", + "tags": [], + "label": "client", + "description": [], + "signature": [ + { + "pluginId": "@kbn/core-elasticsearch-server", + "scope": "common", + "docId": "kibKbnCoreElasticsearchServerPluginApi", + "section": "def-common.ElasticsearchClient", + "text": "ElasticsearchClient" + } + ], + "path": "packages/kbn-search-connectors/lib/fetch_connectors.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.fetchConnectorByIndexName.$2", + "type": "string", + "tags": [], + "label": "indexName", + "description": [], + "signature": [ + "string" + ], + "path": "packages/kbn-search-connectors/lib/fetch_connectors.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + } + ], + "returnComment": [], + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.fetchConnectors", + "type": "Function", + "tags": [], + "label": "fetchConnectors", + "description": [], + "signature": [ + "(client: ", + { + "pluginId": "@kbn/core-elasticsearch-server", + "scope": "common", + "docId": "kibKbnCoreElasticsearchServerPluginApi", + "section": "def-common.ElasticsearchClient", + "text": "ElasticsearchClient" + }, + ", indexNames?: string[] | undefined) => Promise<", + { + "pluginId": "@kbn/search-connectors", + "scope": "common", + "docId": "kibKbnSearchConnectorsPluginApi", + "section": "def-common.Connector", + "text": "Connector" + }, + "[]>" + ], + "path": "packages/kbn-search-connectors/lib/fetch_connectors.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.fetchConnectors.$1", + "type": "Object", + "tags": [], + "label": "client", + "description": [], + "signature": [ + { + "pluginId": "@kbn/core-elasticsearch-server", + "scope": "common", + "docId": "kibKbnCoreElasticsearchServerPluginApi", + "section": "def-common.ElasticsearchClient", + "text": "ElasticsearchClient" + } + ], + "path": "packages/kbn-search-connectors/lib/fetch_connectors.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.fetchConnectors.$2", + "type": "Array", + "tags": [], + "label": "indexNames", + "description": [], + "signature": [ + "string[] | undefined" + ], + "path": "packages/kbn-search-connectors/lib/fetch_connectors.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": false + } + ], + "returnComment": [], + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.fetchSyncJobsByConnectorId", + "type": "Function", + "tags": [], + "label": "fetchSyncJobsByConnectorId", + "description": [], + "signature": [ + "(client: ", + { + "pluginId": "@kbn/core-elasticsearch-server", + "scope": "common", + "docId": "kibKbnCoreElasticsearchServerPluginApi", + "section": "def-common.ElasticsearchClient", + "text": "ElasticsearchClient" + }, + ", connectorId: string, from: number, size: number, syncJobType?: \"all\" | \"content\" | \"access_control\") => Promise<", + { + "pluginId": "@kbn/search-connectors", + "scope": "common", + "docId": "kibKbnSearchConnectorsPluginApi", + "section": "def-common.Paginate", + "text": "Paginate" + }, + "<", + { + "pluginId": "@kbn/search-connectors", + "scope": "common", + "docId": "kibKbnSearchConnectorsPluginApi", + "section": "def-common.ConnectorSyncJob", + "text": "ConnectorSyncJob" + }, + ">>" + ], + "path": "packages/kbn-search-connectors/lib/fetch_sync_jobs.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.fetchSyncJobsByConnectorId.$1", + "type": "Object", + "tags": [], + "label": "client", + "description": [], + "signature": [ + { + "pluginId": "@kbn/core-elasticsearch-server", + "scope": "common", + "docId": "kibKbnCoreElasticsearchServerPluginApi", + "section": "def-common.ElasticsearchClient", + "text": "ElasticsearchClient" + } + ], + "path": "packages/kbn-search-connectors/lib/fetch_sync_jobs.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.fetchSyncJobsByConnectorId.$2", + "type": "string", + "tags": [], + "label": "connectorId", + "description": [], + "signature": [ + "string" + ], + "path": "packages/kbn-search-connectors/lib/fetch_sync_jobs.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.fetchSyncJobsByConnectorId.$3", + "type": "number", + "tags": [], + "label": "from", + "description": [], + "signature": [ + "number" + ], + "path": "packages/kbn-search-connectors/lib/fetch_sync_jobs.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.fetchSyncJobsByConnectorId.$4", + "type": "number", + "tags": [], + "label": "size", + "description": [], + "signature": [ + "number" + ], + "path": "packages/kbn-search-connectors/lib/fetch_sync_jobs.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.fetchSyncJobsByConnectorId.$5", + "type": "CompoundType", + "tags": [], + "label": "syncJobType", + "description": [], + "signature": [ + "\"all\" | \"content\" | \"access_control\"" + ], + "path": "packages/kbn-search-connectors/lib/fetch_sync_jobs.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + } + ], + "returnComment": [], + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.isCategoryEntry", + "type": "Function", + "tags": [], + "label": "isCategoryEntry", + "description": [], + "signature": [ + "(input: ", + { + "pluginId": "@kbn/search-connectors", + "scope": "common", + "docId": "kibKbnSearchConnectorsPluginApi", + "section": "def-common.ConnectorConfigProperties", + "text": "ConnectorConfigProperties" + }, + " | ", + { + "pluginId": "@kbn/search-connectors", + "scope": "common", + "docId": "kibKbnSearchConnectorsPluginApi", + "section": "def-common.ConnectorConfigCategoryProperties", + "text": "ConnectorConfigCategoryProperties" + }, + " | { label: string; value: boolean; } | null) => boolean" + ], + "path": "packages/kbn-search-connectors/utils/is_category_entry.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.isCategoryEntry.$1", + "type": "CompoundType", + "tags": [], + "label": "input", + "description": [], + "signature": [ + { + "pluginId": "@kbn/search-connectors", + "scope": "common", + "docId": "kibKbnSearchConnectorsPluginApi", + "section": "def-common.ConnectorConfigProperties", + "text": "ConnectorConfigProperties" + }, + " | ", + { + "pluginId": "@kbn/search-connectors", + "scope": "common", + "docId": "kibKbnSearchConnectorsPluginApi", + "section": "def-common.ConnectorConfigCategoryProperties", + "text": "ConnectorConfigCategoryProperties" + }, + " | { label: string; value: boolean; } | null" + ], + "path": "packages/kbn-search-connectors/utils/is_category_entry.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": false + } + ], + "returnComment": [], + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.isConfigEntry", + "type": "Function", + "tags": [], + "label": "isConfigEntry", + "description": [], + "signature": [ + "(input: ", + { + "pluginId": "@kbn/search-connectors", + "scope": "common", + "docId": "kibKbnSearchConnectorsPluginApi", + "section": "def-common.ConnectorConfigProperties", + "text": "ConnectorConfigProperties" + }, + " | ", + { + "pluginId": "@kbn/search-connectors", + "scope": "common", + "docId": "kibKbnSearchConnectorsPluginApi", + "section": "def-common.ConnectorConfigCategoryProperties", + "text": "ConnectorConfigCategoryProperties" + }, + " | { label: string; value: boolean; } | null) => boolean" + ], + "path": "packages/kbn-search-connectors/utils/is_category_entry.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.isConfigEntry.$1", + "type": "CompoundType", + "tags": [], + "label": "input", + "description": [], + "signature": [ + { + "pluginId": "@kbn/search-connectors", + "scope": "common", + "docId": "kibKbnSearchConnectorsPluginApi", + "section": "def-common.ConnectorConfigProperties", + "text": "ConnectorConfigProperties" + }, + " | ", + { + "pluginId": "@kbn/search-connectors", + "scope": "common", + "docId": "kibKbnSearchConnectorsPluginApi", + "section": "def-common.ConnectorConfigCategoryProperties", + "text": "ConnectorConfigCategoryProperties" + }, + " | { label: string; value: boolean; } | null" + ], + "path": "packages/kbn-search-connectors/utils/is_category_entry.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": false + } + ], + "returnComment": [], + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.putUpdateNative", + "type": "Function", + "tags": [], + "label": "putUpdateNative", + "description": [], + "signature": [ + "(client: ", + { + "pluginId": "@kbn/core-elasticsearch-server", + "scope": "common", + "docId": "kibKbnCoreElasticsearchServerPluginApi", + "section": "def-common.ElasticsearchClient", + "text": "ElasticsearchClient" + }, + ", connectorId: string, isNative: boolean) => Promise<", + "UpdateResponse", + ">" + ], + "path": "packages/kbn-search-connectors/lib/update_native.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.putUpdateNative.$1", + "type": "Object", + "tags": [], + "label": "client", + "description": [], + "signature": [ + { + "pluginId": "@kbn/core-elasticsearch-server", + "scope": "common", + "docId": "kibKbnCoreElasticsearchServerPluginApi", + "section": "def-common.ElasticsearchClient", + "text": "ElasticsearchClient" + } + ], + "path": "packages/kbn-search-connectors/lib/update_native.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.putUpdateNative.$2", + "type": "string", + "tags": [], + "label": "connectorId", + "description": [], + "signature": [ + "string" + ], + "path": "packages/kbn-search-connectors/lib/update_native.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.putUpdateNative.$3", + "type": "boolean", + "tags": [], + "label": "isNative", + "description": [], + "signature": [ + "boolean" + ], + "path": "packages/kbn-search-connectors/lib/update_native.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + } + ], + "returnComment": [], + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.startConnectorSync", + "type": "Function", + "tags": [], + "label": "startConnectorSync", + "description": [], + "signature": [ + "(client: ", + { + "pluginId": "@kbn/core-elasticsearch-server", + "scope": "common", + "docId": "kibKbnCoreElasticsearchServerPluginApi", + "section": "def-common.ElasticsearchClient", + "text": "ElasticsearchClient" + }, + ", { connectorId, jobType, targetIndexName, }: { connectorId: string; jobType?: ", + { + "pluginId": "@kbn/search-connectors", + "scope": "common", + "docId": "kibKbnSearchConnectorsPluginApi", + "section": "def-common.SyncJobType", + "text": "SyncJobType" + }, + " | undefined; targetIndexName?: string | undefined; }) => Promise<", + "WriteResponseBase", + ">" + ], + "path": "packages/kbn-search-connectors/lib/start_sync.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.startConnectorSync.$1", + "type": "Object", + "tags": [], + "label": "client", + "description": [], + "signature": [ + { + "pluginId": "@kbn/core-elasticsearch-server", + "scope": "common", + "docId": "kibKbnCoreElasticsearchServerPluginApi", + "section": "def-common.ElasticsearchClient", + "text": "ElasticsearchClient" + } + ], + "path": "packages/kbn-search-connectors/lib/start_sync.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.startConnectorSync.$2", + "type": "Object", + "tags": [], + "label": "{\n connectorId,\n jobType,\n targetIndexName,\n }", + "description": [], + "path": "packages/kbn-search-connectors/lib/start_sync.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.startConnectorSync.$2.connectorId", + "type": "string", + "tags": [], + "label": "connectorId", + "description": [], + "path": "packages/kbn-search-connectors/lib/start_sync.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.startConnectorSync.$2.jobType", + "type": "CompoundType", + "tags": [], + "label": "jobType", + "description": [], + "signature": [ + { + "pluginId": "@kbn/search-connectors", + "scope": "common", + "docId": "kibKbnSearchConnectorsPluginApi", + "section": "def-common.SyncJobType", + "text": "SyncJobType" + }, + " | undefined" + ], + "path": "packages/kbn-search-connectors/lib/start_sync.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.startConnectorSync.$2.targetIndexName", + "type": "string", + "tags": [], + "label": "targetIndexName", + "description": [], + "signature": [ + "string | undefined" + ], + "path": "packages/kbn-search-connectors/lib/start_sync.ts", + "deprecated": false, + "trackAdoption": false + } + ] + } + ], + "returnComment": [], + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.updateConnectorConfiguration", + "type": "Function", + "tags": [], + "label": "updateConnectorConfiguration", + "description": [], + "signature": [ + "(client: ", + { + "pluginId": "@kbn/core-elasticsearch-server", + "scope": "common", + "docId": "kibKbnCoreElasticsearchServerPluginApi", + "section": "def-common.ElasticsearchClient", + "text": "ElasticsearchClient" + }, + ", connectorId: string, configuration: Record) => Promise<{ [x: string]: ", + { + "pluginId": "@kbn/search-connectors", + "scope": "common", + "docId": "kibKbnSearchConnectorsPluginApi", + "section": "def-common.ConnectorConfigProperties", + "text": "ConnectorConfigProperties" + }, + " | ", + { + "pluginId": "@kbn/search-connectors", + "scope": "common", + "docId": "kibKbnSearchConnectorsPluginApi", + "section": "def-common.ConnectorConfigCategoryProperties", + "text": "ConnectorConfigCategoryProperties" + }, + " | { value: string | number | boolean; category?: string | undefined; default_value: string | number | boolean | null; depends_on: ", + { + "pluginId": "@kbn/search-connectors", + "scope": "common", + "docId": "kibKbnSearchConnectorsPluginApi", + "section": "def-common.Dependency", + "text": "Dependency" + }, + "[]; display: ", + { + "pluginId": "@kbn/search-connectors", + "scope": "common", + "docId": "kibKbnSearchConnectorsPluginApi", + "section": "def-common.DisplayType", + "text": "DisplayType" + }, + "; label: string; options: ", + { + "pluginId": "@kbn/search-connectors", + "scope": "common", + "docId": "kibKbnSearchConnectorsPluginApi", + "section": "def-common.SelectOption", + "text": "SelectOption" + }, + "[]; order?: number | null | undefined; placeholder?: string | undefined; required: boolean; sensitive: boolean; tooltip: string | null; type: ", + { + "pluginId": "@kbn/search-connectors", + "scope": "common", + "docId": "kibKbnSearchConnectorsPluginApi", + "section": "def-common.FieldType", + "text": "FieldType" + }, + "; ui_restrictions: string[]; validations: ", + { + "pluginId": "@kbn/search-connectors", + "scope": "common", + "docId": "kibKbnSearchConnectorsPluginApi", + "section": "def-common.Validation", + "text": "Validation" + }, + "[]; } | null; extract_full_html?: { label: string; value: boolean; } | undefined; use_document_level_security?: ", + { + "pluginId": "@kbn/search-connectors", + "scope": "common", + "docId": "kibKbnSearchConnectorsPluginApi", + "section": "def-common.ConnectorConfigProperties", + "text": "ConnectorConfigProperties" + }, + " | undefined; use_text_extraction_service?: ", + { + "pluginId": "@kbn/search-connectors", + "scope": "common", + "docId": "kibKbnSearchConnectorsPluginApi", + "section": "def-common.ConnectorConfigProperties", + "text": "ConnectorConfigProperties" + }, + " | undefined; }>" + ], + "path": "packages/kbn-search-connectors/lib/update_connector_configuration.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.updateConnectorConfiguration.$1", + "type": "Object", + "tags": [], + "label": "client", + "description": [], + "signature": [ + { + "pluginId": "@kbn/core-elasticsearch-server", + "scope": "common", + "docId": "kibKbnCoreElasticsearchServerPluginApi", + "section": "def-common.ElasticsearchClient", + "text": "ElasticsearchClient" + } + ], + "path": "packages/kbn-search-connectors/lib/update_connector_configuration.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.updateConnectorConfiguration.$2", + "type": "string", + "tags": [], + "label": "connectorId", + "description": [], + "signature": [ + "string" + ], + "path": "packages/kbn-search-connectors/lib/update_connector_configuration.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.updateConnectorConfiguration.$3", + "type": "Object", + "tags": [], + "label": "configuration", + "description": [], + "signature": [ + "Record" + ], + "path": "packages/kbn-search-connectors/lib/update_connector_configuration.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + } + ], + "returnComment": [], + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.updateConnectorNameAndDescription", + "type": "Function", + "tags": [], + "label": "updateConnectorNameAndDescription", + "description": [], + "signature": [ + "(client: ", + { + "pluginId": "@kbn/core-elasticsearch-server", + "scope": "common", + "docId": "kibKbnCoreElasticsearchServerPluginApi", + "section": "def-common.ElasticsearchClient", + "text": "ElasticsearchClient" + }, + ", connectorId: string, connectorUpdates: Partial>) => Promise<", + "WriteResponseBase", + ">" + ], + "path": "packages/kbn-search-connectors/lib/update_connector_name_and_description.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.updateConnectorNameAndDescription.$1", + "type": "Object", + "tags": [], + "label": "client", + "description": [], + "signature": [ + { + "pluginId": "@kbn/core-elasticsearch-server", + "scope": "common", + "docId": "kibKbnCoreElasticsearchServerPluginApi", + "section": "def-common.ElasticsearchClient", + "text": "ElasticsearchClient" + } + ], + "path": "packages/kbn-search-connectors/lib/update_connector_name_and_description.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.updateConnectorNameAndDescription.$2", + "type": "string", + "tags": [], + "label": "connectorId", + "description": [], + "signature": [ + "string" + ], + "path": "packages/kbn-search-connectors/lib/update_connector_name_and_description.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.updateConnectorNameAndDescription.$3", + "type": "Object", + "tags": [], + "label": "connectorUpdates", + "description": [], + "signature": [ + "Partial>" + ], + "path": "packages/kbn-search-connectors/lib/update_connector_name_and_description.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + } + ], + "returnComment": [], + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.updateConnectorScheduling", + "type": "Function", + "tags": [], + "label": "updateConnectorScheduling", + "description": [], + "signature": [ + "(client: ", + { + "pluginId": "@kbn/core-elasticsearch-server", + "scope": "common", + "docId": "kibKbnCoreElasticsearchServerPluginApi", + "section": "def-common.ElasticsearchClient", + "text": "ElasticsearchClient" + }, + ", connectorId: string, scheduling: ", + { + "pluginId": "@kbn/search-connectors", + "scope": "common", + "docId": "kibKbnSearchConnectorsPluginApi", + "section": "def-common.SchedulingConfiguraton", + "text": "SchedulingConfiguraton" + }, + ") => Promise<", + "WriteResponseBase", + ">" + ], + "path": "packages/kbn-search-connectors/lib/update_connector_scheduling.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.updateConnectorScheduling.$1", + "type": "Object", + "tags": [], + "label": "client", + "description": [], + "signature": [ + { + "pluginId": "@kbn/core-elasticsearch-server", + "scope": "common", + "docId": "kibKbnCoreElasticsearchServerPluginApi", + "section": "def-common.ElasticsearchClient", + "text": "ElasticsearchClient" + } + ], + "path": "packages/kbn-search-connectors/lib/update_connector_scheduling.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.updateConnectorScheduling.$2", + "type": "string", + "tags": [], + "label": "connectorId", + "description": [], + "signature": [ + "string" + ], + "path": "packages/kbn-search-connectors/lib/update_connector_scheduling.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.updateConnectorScheduling.$3", + "type": "Object", + "tags": [], + "label": "scheduling", + "description": [], + "signature": [ + { + "pluginId": "@kbn/search-connectors", + "scope": "common", + "docId": "kibKbnSearchConnectorsPluginApi", + "section": "def-common.SchedulingConfiguraton", + "text": "SchedulingConfiguraton" + } + ], + "path": "packages/kbn-search-connectors/lib/update_connector_scheduling.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + } + ], + "returnComment": [], + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.updateConnectorServiceType", + "type": "Function", + "tags": [], + "label": "updateConnectorServiceType", + "description": [], + "signature": [ + "(client: ", + { + "pluginId": "@kbn/core-elasticsearch-server", + "scope": "common", + "docId": "kibKbnCoreElasticsearchServerPluginApi", + "section": "def-common.ElasticsearchClient", + "text": "ElasticsearchClient" + }, + ", connectorId: string, serviceType: string) => Promise<", + "WriteResponseBase", + ">" + ], + "path": "packages/kbn-search-connectors/lib/update_connector_service_type.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.updateConnectorServiceType.$1", + "type": "Object", + "tags": [], + "label": "client", + "description": [], + "signature": [ + { + "pluginId": "@kbn/core-elasticsearch-server", + "scope": "common", + "docId": "kibKbnCoreElasticsearchServerPluginApi", + "section": "def-common.ElasticsearchClient", + "text": "ElasticsearchClient" + } + ], + "path": "packages/kbn-search-connectors/lib/update_connector_service_type.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.updateConnectorServiceType.$2", + "type": "string", + "tags": [], + "label": "connectorId", + "description": [], + "signature": [ + "string" + ], + "path": "packages/kbn-search-connectors/lib/update_connector_service_type.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.updateConnectorServiceType.$3", + "type": "string", + "tags": [], + "label": "serviceType", + "description": [], + "signature": [ + "string" + ], + "path": "packages/kbn-search-connectors/lib/update_connector_service_type.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + } + ], + "returnComment": [], + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.updateConnectorStatus", + "type": "Function", + "tags": [], + "label": "updateConnectorStatus", + "description": [], + "signature": [ + "(client: ", + { + "pluginId": "@kbn/core-elasticsearch-server", + "scope": "common", + "docId": "kibKbnCoreElasticsearchServerPluginApi", + "section": "def-common.ElasticsearchClient", + "text": "ElasticsearchClient" + }, + ", connectorId: string, status: ", + { + "pluginId": "@kbn/search-connectors", + "scope": "common", + "docId": "kibKbnSearchConnectorsPluginApi", + "section": "def-common.ConnectorStatus", + "text": "ConnectorStatus" + }, + ") => Promise<", + "WriteResponseBase", + ">" + ], + "path": "packages/kbn-search-connectors/lib/update_connector_status.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.updateConnectorStatus.$1", + "type": "Object", + "tags": [], + "label": "client", + "description": [], + "signature": [ + { + "pluginId": "@kbn/core-elasticsearch-server", + "scope": "common", + "docId": "kibKbnCoreElasticsearchServerPluginApi", + "section": "def-common.ElasticsearchClient", + "text": "ElasticsearchClient" + } + ], + "path": "packages/kbn-search-connectors/lib/update_connector_status.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.updateConnectorStatus.$2", + "type": "string", + "tags": [], + "label": "connectorId", + "description": [], + "signature": [ + "string" + ], + "path": "packages/kbn-search-connectors/lib/update_connector_status.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.updateConnectorStatus.$3", + "type": "Enum", + "tags": [], + "label": "status", + "description": [], + "signature": [ + { + "pluginId": "@kbn/search-connectors", + "scope": "common", + "docId": "kibKbnSearchConnectorsPluginApi", + "section": "def-common.ConnectorStatus", + "text": "ConnectorStatus" + } + ], + "path": "packages/kbn-search-connectors/lib/update_connector_status.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + } + ], + "returnComment": [], + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.updateFiltering", + "type": "Function", + "tags": [], + "label": "updateFiltering", + "description": [], + "signature": [ + "(client: ", + { + "pluginId": "@kbn/core-elasticsearch-server", + "scope": "common", + "docId": "kibKbnCoreElasticsearchServerPluginApi", + "section": "def-common.ElasticsearchClient", + "text": "ElasticsearchClient" + }, + ", connectorId: string, { advancedSnippet, filteringRules, }: { advancedSnippet: string; filteringRules: ", + { + "pluginId": "@kbn/search-connectors", + "scope": "common", + "docId": "kibKbnSearchConnectorsPluginApi", + "section": "def-common.FilteringRule", + "text": "FilteringRule" + }, + "[]; }) => Promise<", + { + "pluginId": "@kbn/search-connectors", + "scope": "common", + "docId": "kibKbnSearchConnectorsPluginApi", + "section": "def-common.FilteringRules", + "text": "FilteringRules" + }, + " | undefined>" + ], + "path": "packages/kbn-search-connectors/lib/update_filtering.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.updateFiltering.$1", + "type": "Object", + "tags": [], + "label": "client", + "description": [], + "signature": [ + { + "pluginId": "@kbn/core-elasticsearch-server", + "scope": "common", + "docId": "kibKbnCoreElasticsearchServerPluginApi", + "section": "def-common.ElasticsearchClient", + "text": "ElasticsearchClient" + } + ], + "path": "packages/kbn-search-connectors/lib/update_filtering.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.updateFiltering.$2", + "type": "string", + "tags": [], + "label": "connectorId", + "description": [], + "signature": [ + "string" + ], + "path": "packages/kbn-search-connectors/lib/update_filtering.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.updateFiltering.$3", + "type": "Object", + "tags": [], + "label": "{\n advancedSnippet,\n filteringRules,\n }", + "description": [], + "path": "packages/kbn-search-connectors/lib/update_filtering.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.updateFiltering.$3.advancedSnippet", + "type": "string", + "tags": [], + "label": "advancedSnippet", + "description": [], + "path": "packages/kbn-search-connectors/lib/update_filtering.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.updateFiltering.$3.filteringRules", + "type": "Array", + "tags": [], + "label": "filteringRules", + "description": [], + "signature": [ + { + "pluginId": "@kbn/search-connectors", + "scope": "common", + "docId": "kibKbnSearchConnectorsPluginApi", + "section": "def-common.FilteringRule", + "text": "FilteringRule" + }, + "[]" + ], + "path": "packages/kbn-search-connectors/lib/update_filtering.ts", + "deprecated": false, + "trackAdoption": false + } + ] + } + ], + "returnComment": [], + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.updateFilteringDraft", + "type": "Function", + "tags": [], + "label": "updateFilteringDraft", + "description": [], + "signature": [ + "(client: ", + { + "pluginId": "@kbn/core-elasticsearch-server", + "scope": "common", + "docId": "kibKbnCoreElasticsearchServerPluginApi", + "section": "def-common.ElasticsearchClient", + "text": "ElasticsearchClient" + }, + ", connectorId: string, { advancedSnippet, filteringRules, }: { advancedSnippet: string; filteringRules: ", + { + "pluginId": "@kbn/search-connectors", + "scope": "common", + "docId": "kibKbnSearchConnectorsPluginApi", + "section": "def-common.FilteringRule", + "text": "FilteringRule" + }, + "[]; }) => Promise<", + { + "pluginId": "@kbn/search-connectors", + "scope": "common", + "docId": "kibKbnSearchConnectorsPluginApi", + "section": "def-common.FilteringRules", + "text": "FilteringRules" + }, + " | undefined>" + ], + "path": "packages/kbn-search-connectors/lib/update_filtering_draft.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.updateFilteringDraft.$1", + "type": "Object", + "tags": [], + "label": "client", + "description": [], + "signature": [ + { + "pluginId": "@kbn/core-elasticsearch-server", + "scope": "common", + "docId": "kibKbnCoreElasticsearchServerPluginApi", + "section": "def-common.ElasticsearchClient", + "text": "ElasticsearchClient" + } + ], + "path": "packages/kbn-search-connectors/lib/update_filtering_draft.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.updateFilteringDraft.$2", + "type": "string", + "tags": [], + "label": "connectorId", + "description": [], + "signature": [ + "string" + ], + "path": "packages/kbn-search-connectors/lib/update_filtering_draft.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.updateFilteringDraft.$3", + "type": "Object", + "tags": [], + "label": "{\n advancedSnippet,\n filteringRules,\n }", + "description": [], + "path": "packages/kbn-search-connectors/lib/update_filtering_draft.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.updateFilteringDraft.$3.advancedSnippet", + "type": "string", + "tags": [], + "label": "advancedSnippet", + "description": [], + "path": "packages/kbn-search-connectors/lib/update_filtering_draft.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.updateFilteringDraft.$3.filteringRules", + "type": "Array", + "tags": [], + "label": "filteringRules", + "description": [], + "signature": [ + { + "pluginId": "@kbn/search-connectors", + "scope": "common", + "docId": "kibKbnSearchConnectorsPluginApi", + "section": "def-common.FilteringRule", + "text": "FilteringRule" + }, + "[]" + ], + "path": "packages/kbn-search-connectors/lib/update_filtering_draft.ts", + "deprecated": false, + "trackAdoption": false + } + ] + } + ], + "returnComment": [], + "initialIsOpen": false + } + ], + "interfaces": [ + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.Connector", + "type": "Interface", + "tags": [], + "label": "Connector", + "description": [], + "path": "packages/kbn-search-connectors/types/connectors.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.Connector.api_key_id", + "type": "CompoundType", + "tags": [], + "label": "api_key_id", + "description": [], + "signature": [ + "string | null" + ], + "path": "packages/kbn-search-connectors/types/connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.Connector.configuration", + "type": "CompoundType", + "tags": [], + "label": "configuration", + "description": [], + "signature": [ + "Record & { extract_full_html?: { label: string; value: boolean; } | undefined; use_document_level_security?: ", + { + "pluginId": "@kbn/search-connectors", + "scope": "common", + "docId": "kibKbnSearchConnectorsPluginApi", + "section": "def-common.ConnectorConfigProperties", + "text": "ConnectorConfigProperties" + }, + " | undefined; use_text_extraction_service?: ", + { + "pluginId": "@kbn/search-connectors", + "scope": "common", + "docId": "kibKbnSearchConnectorsPluginApi", + "section": "def-common.ConnectorConfigProperties", + "text": "ConnectorConfigProperties" + }, + " | undefined; }" + ], + "path": "packages/kbn-search-connectors/types/connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.Connector.custom_scheduling", + "type": "Object", + "tags": [], + "label": "custom_scheduling", + "description": [], + "signature": [ + "{ [x: string]: ", + { + "pluginId": "@kbn/search-connectors", + "scope": "common", + "docId": "kibKbnSearchConnectorsPluginApi", + "section": "def-common.CustomScheduling", + "text": "CustomScheduling" + }, + " | null; }" + ], + "path": "packages/kbn-search-connectors/types/connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.Connector.description", + "type": "CompoundType", + "tags": [], + "label": "description", + "description": [], + "signature": [ + "string | null" + ], + "path": "packages/kbn-search-connectors/types/connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.Connector.error", + "type": "CompoundType", + "tags": [], + "label": "error", + "description": [], + "signature": [ + "string | null" + ], + "path": "packages/kbn-search-connectors/types/connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.Connector.features", + "type": "CompoundType", + "tags": [], + "label": "features", + "description": [], + "signature": [ + "Partial<{ document_level_security: { enabled: boolean; }; filtering_advanced_config: boolean; filtering_rules: boolean; incremental_sync: { enabled: boolean; }; sync_rules: { advanced?: { enabled: boolean; } | undefined; basic?: { enabled: boolean; } | undefined; }; }> | null" + ], + "path": "packages/kbn-search-connectors/types/connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.Connector.filtering", + "type": "Array", + "tags": [], + "label": "filtering", + "description": [], + "signature": [ + { + "pluginId": "@kbn/search-connectors", + "scope": "common", + "docId": "kibKbnSearchConnectorsPluginApi", + "section": "def-common.FilteringConfig", + "text": "FilteringConfig" + }, + "[]" + ], + "path": "packages/kbn-search-connectors/types/connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.Connector.id", + "type": "string", + "tags": [], + "label": "id", + "description": [], + "path": "packages/kbn-search-connectors/types/connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.Connector.index_name", + "type": "CompoundType", + "tags": [], + "label": "index_name", + "description": [], + "signature": [ + "string | null" + ], + "path": "packages/kbn-search-connectors/types/connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.Connector.is_native", + "type": "boolean", + "tags": [], + "label": "is_native", + "description": [], + "path": "packages/kbn-search-connectors/types/connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.Connector.language", + "type": "CompoundType", + "tags": [], + "label": "language", + "description": [], + "signature": [ + "string | null" + ], + "path": "packages/kbn-search-connectors/types/connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.Connector.last_access_control_sync_error", + "type": "CompoundType", + "tags": [], + "label": "last_access_control_sync_error", + "description": [], + "signature": [ + "string | null" + ], + "path": "packages/kbn-search-connectors/types/connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.Connector.last_access_control_sync_scheduled_at", + "type": "CompoundType", + "tags": [], + "label": "last_access_control_sync_scheduled_at", + "description": [], + "signature": [ + "string | null" + ], + "path": "packages/kbn-search-connectors/types/connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.Connector.last_access_control_sync_status", + "type": "CompoundType", + "tags": [], + "label": "last_access_control_sync_status", + "description": [], + "signature": [ + { + "pluginId": "@kbn/search-connectors", + "scope": "common", + "docId": "kibKbnSearchConnectorsPluginApi", + "section": "def-common.SyncStatus", + "text": "SyncStatus" + }, + " | null" + ], + "path": "packages/kbn-search-connectors/types/connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.Connector.last_incremental_sync_scheduled_at", + "type": "CompoundType", + "tags": [], + "label": "last_incremental_sync_scheduled_at", + "description": [], + "signature": [ + "string | null" + ], + "path": "packages/kbn-search-connectors/types/connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.Connector.last_seen", + "type": "CompoundType", + "tags": [], + "label": "last_seen", + "description": [], + "signature": [ + "string | null" + ], + "path": "packages/kbn-search-connectors/types/connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.Connector.last_sync_error", + "type": "CompoundType", + "tags": [], + "label": "last_sync_error", + "description": [], + "signature": [ + "string | null" + ], + "path": "packages/kbn-search-connectors/types/connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.Connector.last_sync_scheduled_at", + "type": "CompoundType", + "tags": [], + "label": "last_sync_scheduled_at", + "description": [], + "signature": [ + "string | null" + ], + "path": "packages/kbn-search-connectors/types/connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.Connector.last_sync_status", + "type": "CompoundType", + "tags": [], + "label": "last_sync_status", + "description": [], + "signature": [ + { + "pluginId": "@kbn/search-connectors", + "scope": "common", + "docId": "kibKbnSearchConnectorsPluginApi", + "section": "def-common.SyncStatus", + "text": "SyncStatus" + }, + " | null" + ], + "path": "packages/kbn-search-connectors/types/connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.Connector.last_synced", + "type": "CompoundType", + "tags": [], + "label": "last_synced", + "description": [], + "signature": [ + "string | null" + ], + "path": "packages/kbn-search-connectors/types/connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.Connector.name", + "type": "string", + "tags": [], + "label": "name", + "description": [], + "path": "packages/kbn-search-connectors/types/connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.Connector.pipeline", + "type": "CompoundType", + "tags": [], + "label": "pipeline", + "description": [], + "signature": [ + { + "pluginId": "@kbn/search-connectors", + "scope": "common", + "docId": "kibKbnSearchConnectorsPluginApi", + "section": "def-common.IngestPipelineParams", + "text": "IngestPipelineParams" + }, + " | null | undefined" + ], + "path": "packages/kbn-search-connectors/types/connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.Connector.scheduling", + "type": "Object", + "tags": [], + "label": "scheduling", + "description": [], + "signature": [ + { + "pluginId": "@kbn/search-connectors", + "scope": "common", + "docId": "kibKbnSearchConnectorsPluginApi", + "section": "def-common.SchedulingConfiguraton", + "text": "SchedulingConfiguraton" + } + ], + "path": "packages/kbn-search-connectors/types/connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.Connector.service_type", + "type": "CompoundType", + "tags": [], + "label": "service_type", + "description": [], + "signature": [ + "string | null" + ], + "path": "packages/kbn-search-connectors/types/connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.Connector.status", + "type": "Enum", + "tags": [], + "label": "status", + "description": [], + "signature": [ + { + "pluginId": "@kbn/search-connectors", + "scope": "common", + "docId": "kibKbnSearchConnectorsPluginApi", + "section": "def-common.ConnectorStatus", + "text": "ConnectorStatus" + } + ], + "path": "packages/kbn-search-connectors/types/connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.Connector.sync_now", + "type": "boolean", + "tags": [], + "label": "sync_now", + "description": [], + "path": "packages/kbn-search-connectors/types/connectors.ts", + "deprecated": false, + "trackAdoption": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.ConnectorConfigCategoryProperties", + "type": "Interface", + "tags": [], + "label": "ConnectorConfigCategoryProperties", + "description": [], + "path": "packages/kbn-search-connectors/types/connectors.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.ConnectorConfigCategoryProperties.label", + "type": "string", + "tags": [], + "label": "label", + "description": [], + "path": "packages/kbn-search-connectors/types/connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.ConnectorConfigCategoryProperties.order", + "type": "number", + "tags": [], + "label": "order", + "description": [], + "path": "packages/kbn-search-connectors/types/connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.ConnectorConfigCategoryProperties.type", + "type": "string", + "tags": [], + "label": "type", + "description": [], + "signature": [ + "\"category\"" + ], + "path": "packages/kbn-search-connectors/types/connectors.ts", + "deprecated": false, + "trackAdoption": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.ConnectorConfigProperties", + "type": "Interface", + "tags": [], + "label": "ConnectorConfigProperties", + "description": [], + "path": "packages/kbn-search-connectors/types/connectors.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.ConnectorConfigProperties.category", + "type": "string", + "tags": [], + "label": "category", + "description": [], + "signature": [ + "string | undefined" + ], + "path": "packages/kbn-search-connectors/types/connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.ConnectorConfigProperties.default_value", + "type": "CompoundType", + "tags": [], + "label": "default_value", + "description": [], + "signature": [ + "string | number | boolean | null" + ], + "path": "packages/kbn-search-connectors/types/connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.ConnectorConfigProperties.depends_on", + "type": "Array", + "tags": [], + "label": "depends_on", + "description": [], + "signature": [ + { + "pluginId": "@kbn/search-connectors", + "scope": "common", + "docId": "kibKbnSearchConnectorsPluginApi", + "section": "def-common.Dependency", + "text": "Dependency" + }, + "[]" + ], + "path": "packages/kbn-search-connectors/types/connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.ConnectorConfigProperties.display", + "type": "Enum", + "tags": [], + "label": "display", + "description": [], + "signature": [ + { + "pluginId": "@kbn/search-connectors", + "scope": "common", + "docId": "kibKbnSearchConnectorsPluginApi", + "section": "def-common.DisplayType", + "text": "DisplayType" + } + ], + "path": "packages/kbn-search-connectors/types/connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.ConnectorConfigProperties.label", + "type": "string", + "tags": [], + "label": "label", + "description": [], + "path": "packages/kbn-search-connectors/types/connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.ConnectorConfigProperties.options", + "type": "Array", + "tags": [], + "label": "options", + "description": [], + "signature": [ + { + "pluginId": "@kbn/search-connectors", + "scope": "common", + "docId": "kibKbnSearchConnectorsPluginApi", + "section": "def-common.SelectOption", + "text": "SelectOption" + }, + "[]" + ], + "path": "packages/kbn-search-connectors/types/connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.ConnectorConfigProperties.order", + "type": "CompoundType", + "tags": [], + "label": "order", + "description": [], + "signature": [ + "number | null | undefined" + ], + "path": "packages/kbn-search-connectors/types/connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.ConnectorConfigProperties.placeholder", + "type": "string", + "tags": [], + "label": "placeholder", + "description": [], + "signature": [ + "string | undefined" + ], + "path": "packages/kbn-search-connectors/types/connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.ConnectorConfigProperties.required", + "type": "boolean", + "tags": [], + "label": "required", + "description": [], + "path": "packages/kbn-search-connectors/types/connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.ConnectorConfigProperties.sensitive", + "type": "boolean", + "tags": [], + "label": "sensitive", + "description": [], + "path": "packages/kbn-search-connectors/types/connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.ConnectorConfigProperties.tooltip", + "type": "CompoundType", + "tags": [], + "label": "tooltip", + "description": [], + "signature": [ + "string | null" + ], + "path": "packages/kbn-search-connectors/types/connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.ConnectorConfigProperties.type", + "type": "Enum", + "tags": [], + "label": "type", + "description": [], + "signature": [ + { + "pluginId": "@kbn/search-connectors", + "scope": "common", + "docId": "kibKbnSearchConnectorsPluginApi", + "section": "def-common.FieldType", + "text": "FieldType" + } + ], + "path": "packages/kbn-search-connectors/types/connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.ConnectorConfigProperties.ui_restrictions", + "type": "Array", + "tags": [], + "label": "ui_restrictions", + "description": [], + "signature": [ + "string[]" + ], + "path": "packages/kbn-search-connectors/types/connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.ConnectorConfigProperties.validations", + "type": "Array", + "tags": [], + "label": "validations", + "description": [], + "signature": [ + { + "pluginId": "@kbn/search-connectors", + "scope": "common", + "docId": "kibKbnSearchConnectorsPluginApi", + "section": "def-common.Validation", + "text": "Validation" + }, + "[]" + ], + "path": "packages/kbn-search-connectors/types/connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.ConnectorConfigProperties.value", + "type": "CompoundType", + "tags": [], + "label": "value", + "description": [], + "signature": [ + "string | number | boolean | null" + ], + "path": "packages/kbn-search-connectors/types/connectors.ts", + "deprecated": false, + "trackAdoption": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.ConnectorScheduling", + "type": "Interface", + "tags": [], + "label": "ConnectorScheduling", + "description": [], + "path": "packages/kbn-search-connectors/types/connectors.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.ConnectorScheduling.enabled", + "type": "boolean", + "tags": [], + "label": "enabled", + "description": [], + "path": "packages/kbn-search-connectors/types/connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.ConnectorScheduling.interval", + "type": "string", + "tags": [], + "label": "interval", + "description": [], + "path": "packages/kbn-search-connectors/types/connectors.ts", + "deprecated": false, + "trackAdoption": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.ConnectorServerSideDefinition", + "type": "Interface", + "tags": [], + "label": "ConnectorServerSideDefinition", + "description": [], + "path": "packages/kbn-search-connectors/connectors.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.ConnectorServerSideDefinition.iconPath", + "type": "string", + "tags": [], + "label": "iconPath", + "description": [], + "path": "packages/kbn-search-connectors/connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.ConnectorServerSideDefinition.isBeta", + "type": "boolean", + "tags": [], + "label": "isBeta", + "description": [], + "path": "packages/kbn-search-connectors/connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.ConnectorServerSideDefinition.isNative", + "type": "boolean", + "tags": [], + "label": "isNative", + "description": [], + "path": "packages/kbn-search-connectors/connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.ConnectorServerSideDefinition.isTechPreview", + "type": "CompoundType", + "tags": [], + "label": "isTechPreview", + "description": [], + "signature": [ + "boolean | undefined" + ], + "path": "packages/kbn-search-connectors/connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.ConnectorServerSideDefinition.keywords", + "type": "Array", + "tags": [], + "label": "keywords", + "description": [], + "signature": [ + "string[]" + ], + "path": "packages/kbn-search-connectors/connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.ConnectorServerSideDefinition.name", + "type": "string", + "tags": [], + "label": "name", + "description": [], + "path": "packages/kbn-search-connectors/connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.ConnectorServerSideDefinition.serviceType", + "type": "string", + "tags": [], + "label": "serviceType", + "description": [], + "path": "packages/kbn-search-connectors/connectors.ts", + "deprecated": false, + "trackAdoption": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.ConnectorSyncJob", + "type": "Interface", + "tags": [], + "label": "ConnectorSyncJob", + "description": [], + "path": "packages/kbn-search-connectors/types/connectors.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.ConnectorSyncJob.cancelation_requested_at", + "type": "CompoundType", + "tags": [], + "label": "cancelation_requested_at", + "description": [], + "signature": [ + "string | null" + ], + "path": "packages/kbn-search-connectors/types/connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.ConnectorSyncJob.canceled_at", + "type": "CompoundType", + "tags": [], + "label": "canceled_at", + "description": [], + "signature": [ + "string | null" + ], + "path": "packages/kbn-search-connectors/types/connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.ConnectorSyncJob.completed_at", + "type": "CompoundType", + "tags": [], + "label": "completed_at", + "description": [], + "signature": [ + "string | null" + ], + "path": "packages/kbn-search-connectors/types/connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.ConnectorSyncJob.connector", + "type": "Object", + "tags": [], + "label": "connector", + "description": [], + "signature": [ + "{ configuration: ", + { + "pluginId": "@kbn/search-connectors", + "scope": "common", + "docId": "kibKbnSearchConnectorsPluginApi", + "section": "def-common.ConnectorConfiguration", + "text": "ConnectorConfiguration" + }, + "; filtering: ", + { + "pluginId": "@kbn/search-connectors", + "scope": "common", + "docId": "kibKbnSearchConnectorsPluginApi", + "section": "def-common.FilteringRules", + "text": "FilteringRules" + }, + " | ", + { + "pluginId": "@kbn/search-connectors", + "scope": "common", + "docId": "kibKbnSearchConnectorsPluginApi", + "section": "def-common.FilteringRules", + "text": "FilteringRules" + }, + "[] | null; id: string; index_name: string; language: string | null; pipeline: ", + { + "pluginId": "@kbn/search-connectors", + "scope": "common", + "docId": "kibKbnSearchConnectorsPluginApi", + "section": "def-common.IngestPipelineParams", + "text": "IngestPipelineParams" + }, + " | null; service_type: string | null; }" + ], + "path": "packages/kbn-search-connectors/types/connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.ConnectorSyncJob.created_at", + "type": "string", + "tags": [], + "label": "created_at", + "description": [], + "path": "packages/kbn-search-connectors/types/connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.ConnectorSyncJob.deleted_document_count", + "type": "number", + "tags": [], + "label": "deleted_document_count", + "description": [], + "path": "packages/kbn-search-connectors/types/connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.ConnectorSyncJob.error", + "type": "CompoundType", + "tags": [], + "label": "error", + "description": [], + "signature": [ + "string | null" + ], + "path": "packages/kbn-search-connectors/types/connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.ConnectorSyncJob.id", + "type": "string", + "tags": [], + "label": "id", + "description": [], + "path": "packages/kbn-search-connectors/types/connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.ConnectorSyncJob.indexed_document_count", + "type": "number", + "tags": [], + "label": "indexed_document_count", + "description": [], + "path": "packages/kbn-search-connectors/types/connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.ConnectorSyncJob.indexed_document_volume", + "type": "number", + "tags": [], + "label": "indexed_document_volume", + "description": [], + "path": "packages/kbn-search-connectors/types/connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.ConnectorSyncJob.job_type", + "type": "Enum", + "tags": [], + "label": "job_type", + "description": [], + "signature": [ + { + "pluginId": "@kbn/search-connectors", + "scope": "common", + "docId": "kibKbnSearchConnectorsPluginApi", + "section": "def-common.SyncJobType", + "text": "SyncJobType" + } + ], + "path": "packages/kbn-search-connectors/types/connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.ConnectorSyncJob.last_seen", + "type": "CompoundType", + "tags": [], + "label": "last_seen", + "description": [], + "signature": [ + "string | null" + ], + "path": "packages/kbn-search-connectors/types/connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.ConnectorSyncJob.metadata", + "type": "Object", + "tags": [], + "label": "metadata", + "description": [], + "signature": [ + "{ [x: string]: unknown; }" + ], + "path": "packages/kbn-search-connectors/types/connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.ConnectorSyncJob.started_at", + "type": "CompoundType", + "tags": [], + "label": "started_at", + "description": [], + "signature": [ + "string | null" + ], + "path": "packages/kbn-search-connectors/types/connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.ConnectorSyncJob.status", + "type": "Enum", + "tags": [], + "label": "status", + "description": [], + "signature": [ + { + "pluginId": "@kbn/search-connectors", + "scope": "common", + "docId": "kibKbnSearchConnectorsPluginApi", + "section": "def-common.SyncStatus", + "text": "SyncStatus" + } + ], + "path": "packages/kbn-search-connectors/types/connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.ConnectorSyncJob.total_document_count", + "type": "CompoundType", + "tags": [], + "label": "total_document_count", + "description": [], + "signature": [ + "number | null" + ], + "path": "packages/kbn-search-connectors/types/connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.ConnectorSyncJob.trigger_method", + "type": "Enum", + "tags": [], + "label": "trigger_method", + "description": [], + "signature": [ + { + "pluginId": "@kbn/search-connectors", + "scope": "common", + "docId": "kibKbnSearchConnectorsPluginApi", + "section": "def-common.TriggerMethod", + "text": "TriggerMethod" + } + ], + "path": "packages/kbn-search-connectors/types/connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.ConnectorSyncJob.worker_hostname", + "type": "CompoundType", + "tags": [], + "label": "worker_hostname", + "description": [], + "signature": [ + "string | null" + ], + "path": "packages/kbn-search-connectors/types/connectors.ts", + "deprecated": false, + "trackAdoption": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.CustomScheduling", + "type": "Interface", + "tags": [], + "label": "CustomScheduling", + "description": [], + "path": "packages/kbn-search-connectors/types/connectors.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.CustomScheduling.configuration_overrides", + "type": "Object", + "tags": [], + "label": "configuration_overrides", + "description": [], + "signature": [ + "{ [x: string]: unknown; }" + ], + "path": "packages/kbn-search-connectors/types/connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.CustomScheduling.enabled", + "type": "boolean", + "tags": [], + "label": "enabled", + "description": [], + "path": "packages/kbn-search-connectors/types/connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.CustomScheduling.interval", + "type": "string", + "tags": [], + "label": "interval", + "description": [], + "path": "packages/kbn-search-connectors/types/connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.CustomScheduling.last_synced", + "type": "CompoundType", + "tags": [], + "label": "last_synced", + "description": [], + "signature": [ + "string | null" + ], + "path": "packages/kbn-search-connectors/types/connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.CustomScheduling.name", + "type": "string", + "tags": [], + "label": "name", + "description": [], + "path": "packages/kbn-search-connectors/types/connectors.ts", + "deprecated": false, + "trackAdoption": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.Dependency", + "type": "Interface", + "tags": [], + "label": "Dependency", + "description": [], + "path": "packages/kbn-search-connectors/types/connectors.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.Dependency.field", + "type": "string", + "tags": [], + "label": "field", + "description": [], + "path": "packages/kbn-search-connectors/types/connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.Dependency.value", + "type": "CompoundType", + "tags": [], + "label": "value", + "description": [], + "signature": [ + "string | number | boolean | null" + ], + "path": "packages/kbn-search-connectors/types/connectors.ts", + "deprecated": false, + "trackAdoption": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.FilteringConfig", + "type": "Interface", + "tags": [], + "label": "FilteringConfig", + "description": [], + "path": "packages/kbn-search-connectors/types/connectors.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.FilteringConfig.active", + "type": "Object", + "tags": [], + "label": "active", + "description": [], + "signature": [ + { + "pluginId": "@kbn/search-connectors", + "scope": "common", + "docId": "kibKbnSearchConnectorsPluginApi", + "section": "def-common.FilteringRules", + "text": "FilteringRules" + } + ], + "path": "packages/kbn-search-connectors/types/connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.FilteringConfig.domain", + "type": "string", + "tags": [], + "label": "domain", + "description": [], + "path": "packages/kbn-search-connectors/types/connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.FilteringConfig.draft", + "type": "Object", + "tags": [], + "label": "draft", + "description": [], + "signature": [ + { + "pluginId": "@kbn/search-connectors", + "scope": "common", + "docId": "kibKbnSearchConnectorsPluginApi", + "section": "def-common.FilteringRules", + "text": "FilteringRules" + } + ], + "path": "packages/kbn-search-connectors/types/connectors.ts", + "deprecated": false, + "trackAdoption": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.FilteringRule", + "type": "Interface", + "tags": [], + "label": "FilteringRule", + "description": [], + "path": "packages/kbn-search-connectors/types/connectors.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.FilteringRule.created_at", + "type": "string", + "tags": [], + "label": "created_at", + "description": [], + "path": "packages/kbn-search-connectors/types/connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.FilteringRule.field", + "type": "string", + "tags": [], + "label": "field", + "description": [], + "path": "packages/kbn-search-connectors/types/connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.FilteringRule.id", + "type": "string", + "tags": [], + "label": "id", + "description": [], + "path": "packages/kbn-search-connectors/types/connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.FilteringRule.order", + "type": "number", + "tags": [], + "label": "order", + "description": [], + "path": "packages/kbn-search-connectors/types/connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.FilteringRule.policy", + "type": "Enum", + "tags": [], + "label": "policy", + "description": [], + "signature": [ + { + "pluginId": "@kbn/search-connectors", + "scope": "common", + "docId": "kibKbnSearchConnectorsPluginApi", + "section": "def-common.FilteringPolicy", + "text": "FilteringPolicy" + } + ], + "path": "packages/kbn-search-connectors/types/connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.FilteringRule.rule", + "type": "Enum", + "tags": [], + "label": "rule", + "description": [], + "signature": [ + { + "pluginId": "@kbn/search-connectors", + "scope": "common", + "docId": "kibKbnSearchConnectorsPluginApi", + "section": "def-common.FilteringRuleRule", + "text": "FilteringRuleRule" + } + ], + "path": "packages/kbn-search-connectors/types/connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.FilteringRule.updated_at", + "type": "string", + "tags": [], + "label": "updated_at", + "description": [], + "path": "packages/kbn-search-connectors/types/connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.FilteringRule.value", + "type": "string", + "tags": [], + "label": "value", + "description": [], + "path": "packages/kbn-search-connectors/types/connectors.ts", + "deprecated": false, + "trackAdoption": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.FilteringRules", + "type": "Interface", + "tags": [], + "label": "FilteringRules", + "description": [], + "path": "packages/kbn-search-connectors/types/connectors.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.FilteringRules.advanced_snippet", + "type": "Object", + "tags": [], + "label": "advanced_snippet", + "description": [], + "signature": [ + "{ created_at: string; updated_at: string; value: Record; }" + ], + "path": "packages/kbn-search-connectors/types/connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.FilteringRules.rules", + "type": "Array", + "tags": [], + "label": "rules", + "description": [], + "signature": [ + { + "pluginId": "@kbn/search-connectors", + "scope": "common", + "docId": "kibKbnSearchConnectorsPluginApi", + "section": "def-common.FilteringRule", + "text": "FilteringRule" + }, + "[]" + ], + "path": "packages/kbn-search-connectors/types/connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.FilteringRules.validation", + "type": "Object", + "tags": [], + "label": "validation", + "description": [], + "signature": [ + "{ errors: ", + { + "pluginId": "@kbn/search-connectors", + "scope": "common", + "docId": "kibKbnSearchConnectorsPluginApi", + "section": "def-common.FilteringValidation", + "text": "FilteringValidation" + }, + "[]; state: ", + { + "pluginId": "@kbn/search-connectors", + "scope": "common", + "docId": "kibKbnSearchConnectorsPluginApi", + "section": "def-common.FilteringValidationState", + "text": "FilteringValidationState" + }, + "; }" + ], + "path": "packages/kbn-search-connectors/types/connectors.ts", + "deprecated": false, + "trackAdoption": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.FilteringValidation", + "type": "Interface", + "tags": [], + "label": "FilteringValidation", + "description": [], + "path": "packages/kbn-search-connectors/types/connectors.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.FilteringValidation.ids", + "type": "Array", + "tags": [], + "label": "ids", + "description": [], + "signature": [ + "string[]" + ], + "path": "packages/kbn-search-connectors/types/connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.FilteringValidation.messages", + "type": "Array", + "tags": [], + "label": "messages", + "description": [], + "signature": [ + "string[]" + ], + "path": "packages/kbn-search-connectors/types/connectors.ts", + "deprecated": false, + "trackAdoption": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.IngestPipelineParams", + "type": "Interface", + "tags": [], + "label": "IngestPipelineParams", + "description": [], + "path": "packages/kbn-search-connectors/types/connectors.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.IngestPipelineParams.extract_binary_content", + "type": "boolean", + "tags": [], + "label": "extract_binary_content", + "description": [], + "path": "packages/kbn-search-connectors/types/connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.IngestPipelineParams.name", + "type": "string", + "tags": [], + "label": "name", + "description": [], + "path": "packages/kbn-search-connectors/types/connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.IngestPipelineParams.reduce_whitespace", + "type": "boolean", + "tags": [], + "label": "reduce_whitespace", + "description": [], + "path": "packages/kbn-search-connectors/types/connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.IngestPipelineParams.run_ml_inference", + "type": "boolean", + "tags": [], + "label": "run_ml_inference", + "description": [], + "path": "packages/kbn-search-connectors/types/connectors.ts", + "deprecated": false, + "trackAdoption": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.Meta", + "type": "Interface", + "tags": [], + "label": "Meta", + "description": [], + "path": "packages/kbn-search-connectors/types/pagination.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.Meta.page", + "type": "Object", + "tags": [], + "label": "page", + "description": [], + "signature": [ + { + "pluginId": "@kbn/search-connectors", + "scope": "common", + "docId": "kibKbnSearchConnectorsPluginApi", + "section": "def-common.Page", + "text": "Page" + } + ], + "path": "packages/kbn-search-connectors/types/pagination.ts", + "deprecated": false, + "trackAdoption": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NativeConnector", + "type": "Interface", + "tags": [], + "label": "NativeConnector", + "description": [], + "path": "packages/kbn-search-connectors/types/connectors.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NativeConnector.configuration", + "type": "CompoundType", + "tags": [], + "label": "configuration", + "description": [], + "signature": [ + "Record & { extract_full_html?: { label: string; value: boolean; } | undefined; use_document_level_security?: ", + { + "pluginId": "@kbn/search-connectors", + "scope": "common", + "docId": "kibKbnSearchConnectorsPluginApi", + "section": "def-common.ConnectorConfigProperties", + "text": "ConnectorConfigProperties" + }, + " | undefined; use_text_extraction_service?: ", + { + "pluginId": "@kbn/search-connectors", + "scope": "common", + "docId": "kibKbnSearchConnectorsPluginApi", + "section": "def-common.ConnectorConfigProperties", + "text": "ConnectorConfigProperties" + }, + " | undefined; }" + ], + "path": "packages/kbn-search-connectors/types/connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NativeConnector.features", + "type": "CompoundType", + "tags": [], + "label": "features", + "description": [], + "signature": [ + "Partial<{ document_level_security: { enabled: boolean; }; filtering_advanced_config: boolean; filtering_rules: boolean; incremental_sync: { enabled: boolean; }; sync_rules: { advanced?: { enabled: boolean; } | undefined; basic?: { enabled: boolean; } | undefined; }; }> | null" + ], + "path": "packages/kbn-search-connectors/types/connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NativeConnector.name", + "type": "string", + "tags": [], + "label": "name", + "description": [], + "path": "packages/kbn-search-connectors/types/connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NativeConnector.serviceType", + "type": "string", + "tags": [], + "label": "serviceType", + "description": [], + "path": "packages/kbn-search-connectors/types/connectors.ts", + "deprecated": false, + "trackAdoption": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.OptimisticConcurrency", + "type": "Interface", + "tags": [], + "label": "OptimisticConcurrency", + "description": [], + "signature": [ + { + "pluginId": "@kbn/search-connectors", + "scope": "common", + "docId": "kibKbnSearchConnectorsPluginApi", + "section": "def-common.OptimisticConcurrency", + "text": "OptimisticConcurrency" + }, + "" + ], + "path": "packages/kbn-search-connectors/types/optimistic_concurrency.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.OptimisticConcurrency.primaryTerm", + "type": "number", + "tags": [], + "label": "primaryTerm", + "description": [], + "signature": [ + "number | undefined" + ], + "path": "packages/kbn-search-connectors/types/optimistic_concurrency.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.OptimisticConcurrency.seqNo", + "type": "number", + "tags": [], + "label": "seqNo", + "description": [], + "signature": [ + "number | undefined" + ], + "path": "packages/kbn-search-connectors/types/optimistic_concurrency.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.OptimisticConcurrency.value", + "type": "Uncategorized", + "tags": [], + "label": "value", + "description": [], + "signature": [ + "T" + ], + "path": "packages/kbn-search-connectors/types/optimistic_concurrency.ts", + "deprecated": false, + "trackAdoption": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.Page", + "type": "Interface", + "tags": [], + "label": "Page", + "description": [], + "path": "packages/kbn-search-connectors/types/pagination.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.Page.from", + "type": "number", + "tags": [], + "label": "from", + "description": [], + "path": "packages/kbn-search-connectors/types/pagination.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.Page.has_more_hits_than_total", + "type": "CompoundType", + "tags": [], + "label": "has_more_hits_than_total", + "description": [], + "signature": [ + "boolean | undefined" + ], + "path": "packages/kbn-search-connectors/types/pagination.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.Page.size", + "type": "number", + "tags": [], + "label": "size", + "description": [], + "path": "packages/kbn-search-connectors/types/pagination.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.Page.total", + "type": "number", + "tags": [], + "label": "total", + "description": [], + "path": "packages/kbn-search-connectors/types/pagination.ts", + "deprecated": false, + "trackAdoption": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.Paginate", + "type": "Interface", + "tags": [], + "label": "Paginate", + "description": [], + "signature": [ + { + "pluginId": "@kbn/search-connectors", + "scope": "common", + "docId": "kibKbnSearchConnectorsPluginApi", + "section": "def-common.Paginate", + "text": "Paginate" + }, + "" + ], + "path": "packages/kbn-search-connectors/types/pagination.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.Paginate._meta", + "type": "Object", + "tags": [], + "label": "_meta", + "description": [], + "signature": [ + { + "pluginId": "@kbn/search-connectors", + "scope": "common", + "docId": "kibKbnSearchConnectorsPluginApi", + "section": "def-common.Meta", + "text": "Meta" + } + ], + "path": "packages/kbn-search-connectors/types/pagination.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.Paginate.data", + "type": "Array", + "tags": [], + "label": "data", + "description": [], + "signature": [ + "T[]" + ], + "path": "packages/kbn-search-connectors/types/pagination.ts", + "deprecated": false, + "trackAdoption": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.SchedulingConfiguraton", + "type": "Interface", + "tags": [], + "label": "SchedulingConfiguraton", + "description": [], + "path": "packages/kbn-search-connectors/types/connectors.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.SchedulingConfiguraton.access_control", + "type": "Object", + "tags": [], + "label": "access_control", + "description": [], + "signature": [ + { + "pluginId": "@kbn/search-connectors", + "scope": "common", + "docId": "kibKbnSearchConnectorsPluginApi", + "section": "def-common.ConnectorScheduling", + "text": "ConnectorScheduling" + } + ], + "path": "packages/kbn-search-connectors/types/connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.SchedulingConfiguraton.full", + "type": "Object", + "tags": [], + "label": "full", + "description": [], + "signature": [ + { + "pluginId": "@kbn/search-connectors", + "scope": "common", + "docId": "kibKbnSearchConnectorsPluginApi", + "section": "def-common.ConnectorScheduling", + "text": "ConnectorScheduling" + } + ], + "path": "packages/kbn-search-connectors/types/connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.SchedulingConfiguraton.incremental", + "type": "Object", + "tags": [], + "label": "incremental", + "description": [], + "signature": [ + { + "pluginId": "@kbn/search-connectors", + "scope": "common", + "docId": "kibKbnSearchConnectorsPluginApi", + "section": "def-common.ConnectorScheduling", + "text": "ConnectorScheduling" + } + ], + "path": "packages/kbn-search-connectors/types/connectors.ts", + "deprecated": false, + "trackAdoption": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.SelectOption", + "type": "Interface", + "tags": [], + "label": "SelectOption", + "description": [], + "path": "packages/kbn-search-connectors/types/connectors.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.SelectOption.label", + "type": "string", + "tags": [], + "label": "label", + "description": [], + "path": "packages/kbn-search-connectors/types/connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.SelectOption.value", + "type": "string", + "tags": [], + "label": "value", + "description": [], + "path": "packages/kbn-search-connectors/types/connectors.ts", + "deprecated": false, + "trackAdoption": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.Validation", + "type": "Interface", + "tags": [], + "label": "Validation", + "description": [], + "path": "packages/kbn-search-connectors/types/connectors.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.Validation.constraint", + "type": "CompoundType", + "tags": [], + "label": "constraint", + "description": [], + "signature": [ + "string | number" + ], + "path": "packages/kbn-search-connectors/types/connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.Validation.type", + "type": "string", + "tags": [], + "label": "type", + "description": [], + "path": "packages/kbn-search-connectors/types/connectors.ts", + "deprecated": false, + "trackAdoption": false + } + ], + "initialIsOpen": false + } + ], + "enums": [ + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.ConnectorStatus", + "type": "Enum", + "tags": [], + "label": "ConnectorStatus", + "description": [], + "path": "packages/kbn-search-connectors/types/connectors.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.DisplayType", + "type": "Enum", + "tags": [], + "label": "DisplayType", + "description": [], + "path": "packages/kbn-search-connectors/types/connectors.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.FeatureName", + "type": "Enum", + "tags": [], + "label": "FeatureName", + "description": [], + "path": "packages/kbn-search-connectors/types/connectors.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.FieldType", + "type": "Enum", + "tags": [], + "label": "FieldType", + "description": [], + "path": "packages/kbn-search-connectors/types/connectors.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.FilteringPolicy", + "type": "Enum", + "tags": [], + "label": "FilteringPolicy", + "description": [], + "path": "packages/kbn-search-connectors/types/connectors.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.FilteringRuleRule", + "type": "Enum", + "tags": [], + "label": "FilteringRuleRule", + "description": [], + "path": "packages/kbn-search-connectors/types/connectors.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.FilteringValidationState", + "type": "Enum", + "tags": [], + "label": "FilteringValidationState", + "description": [], + "path": "packages/kbn-search-connectors/types/connectors.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.SyncJobType", + "type": "Enum", + "tags": [], + "label": "SyncJobType", + "description": [], + "path": "packages/kbn-search-connectors/types/connectors.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.SyncStatus", + "type": "Enum", + "tags": [], + "label": "SyncStatus", + "description": [], + "path": "packages/kbn-search-connectors/types/connectors.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.TriggerMethod", + "type": "Enum", + "tags": [], + "label": "TriggerMethod", + "description": [], + "path": "packages/kbn-search-connectors/types/connectors.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + } + ], + "misc": [ + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.CONNECTOR_DEFINITIONS", + "type": "Array", + "tags": [], + "label": "CONNECTOR_DEFINITIONS", + "description": [], + "signature": [ + { + "pluginId": "@kbn/search-connectors", + "scope": "common", + "docId": "kibKbnSearchConnectorsPluginApi", + "section": "def-common.ConnectorServerSideDefinition", + "text": "ConnectorServerSideDefinition" + }, + "[]" + ], + "path": "packages/kbn-search-connectors/connectors.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.ConnectorConfiguration", + "type": "Type", + "tags": [], + "label": "ConnectorConfiguration", + "description": [], + "signature": [ + "Record & { extract_full_html?: { label: string; value: boolean; } | undefined; use_document_level_security?: ", + { + "pluginId": "@kbn/search-connectors", + "scope": "common", + "docId": "kibKbnSearchConnectorsPluginApi", + "section": "def-common.ConnectorConfigProperties", + "text": "ConnectorConfigProperties" + }, + " | undefined; use_text_extraction_service?: ", + { + "pluginId": "@kbn/search-connectors", + "scope": "common", + "docId": "kibKbnSearchConnectorsPluginApi", + "section": "def-common.ConnectorConfigProperties", + "text": "ConnectorConfigProperties" + }, + " | undefined; }" + ], + "path": "packages/kbn-search-connectors/types/connectors.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.ConnectorCustomScheduling", + "type": "Type", + "tags": [], + "label": "ConnectorCustomScheduling", + "description": [], + "signature": [ + "{ [x: string]: ", + { + "pluginId": "@kbn/search-connectors", + "scope": "common", + "docId": "kibKbnSearchConnectorsPluginApi", + "section": "def-common.CustomScheduling", + "text": "CustomScheduling" + }, + " | null; }" + ], + "path": "packages/kbn-search-connectors/types/connectors.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.ConnectorDocument", + "type": "Type", + "tags": [], + "label": "ConnectorDocument", + "description": [], + "signature": [ + "{ error: string | null; name: string; features: ", + { + "pluginId": "@kbn/search-connectors", + "scope": "common", + "docId": "kibKbnSearchConnectorsPluginApi", + "section": "def-common.ConnectorFeatures", + "text": "ConnectorFeatures" + }, + "; description: string | null; status: ", + { + "pluginId": "@kbn/search-connectors", + "scope": "common", + "docId": "kibKbnSearchConnectorsPluginApi", + "section": "def-common.ConnectorStatus", + "text": "ConnectorStatus" + }, + "; language: string | null; index_name: string | null; configuration: ", + { + "pluginId": "@kbn/search-connectors", + "scope": "common", + "docId": "kibKbnSearchConnectorsPluginApi", + "section": "def-common.ConnectorConfiguration", + "text": "ConnectorConfiguration" + }, + "; last_seen: string | null; pipeline?: ", + { + "pluginId": "@kbn/search-connectors", + "scope": "common", + "docId": "kibKbnSearchConnectorsPluginApi", + "section": "def-common.IngestPipelineParams", + "text": "IngestPipelineParams" + }, + " | null | undefined; api_key_id: string | null; custom_scheduling: ", + { + "pluginId": "@kbn/search-connectors", + "scope": "common", + "docId": "kibKbnSearchConnectorsPluginApi", + "section": "def-common.ConnectorCustomScheduling", + "text": "ConnectorCustomScheduling" + }, + "; filtering: ", + { + "pluginId": "@kbn/search-connectors", + "scope": "common", + "docId": "kibKbnSearchConnectorsPluginApi", + "section": "def-common.FilteringConfig", + "text": "FilteringConfig" + }, + "[]; is_native: boolean; last_access_control_sync_error: string | null; last_access_control_sync_scheduled_at: string | null; last_access_control_sync_status: ", + { + "pluginId": "@kbn/search-connectors", + "scope": "common", + "docId": "kibKbnSearchConnectorsPluginApi", + "section": "def-common.SyncStatus", + "text": "SyncStatus" + }, + " | null; last_incremental_sync_scheduled_at: string | null; last_sync_error: string | null; last_sync_scheduled_at: string | null; last_sync_status: ", + { + "pluginId": "@kbn/search-connectors", + "scope": "common", + "docId": "kibKbnSearchConnectorsPluginApi", + "section": "def-common.SyncStatus", + "text": "SyncStatus" + }, + " | null; last_synced: string | null; scheduling: ", + { + "pluginId": "@kbn/search-connectors", + "scope": "common", + "docId": "kibKbnSearchConnectorsPluginApi", + "section": "def-common.SchedulingConfiguraton", + "text": "SchedulingConfiguraton" + }, + "; service_type: string | null; sync_now: boolean; }" + ], + "path": "packages/kbn-search-connectors/types/connectors.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.ConnectorFeatures", + "type": "Type", + "tags": [], + "label": "ConnectorFeatures", + "description": [], + "signature": [ + "Partial<{ document_level_security: { enabled: boolean; }; filtering_advanced_config: boolean; filtering_rules: boolean; incremental_sync: { enabled: boolean; }; sync_rules: { advanced?: { enabled: boolean; } | undefined; basic?: { enabled: boolean; } | undefined; }; }> | null" + ], + "path": "packages/kbn-search-connectors/types/connectors.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.CONNECTORS_ACCESS_CONTROL_INDEX_PREFIX", + "type": "string", + "tags": [], + "label": "CONNECTORS_ACCESS_CONTROL_INDEX_PREFIX", + "description": [], + "signature": [ + "\".search-acl-filter-\"" + ], + "path": "packages/kbn-search-connectors/index.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.CONNECTORS_INDEX", + "type": "string", + "tags": [], + "label": "CONNECTORS_INDEX", + "description": [], + "signature": [ + "\".elastic-connectors\"" + ], + "path": "packages/kbn-search-connectors/index.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.CONNECTORS_JOBS_INDEX", + "type": "string", + "tags": [], + "label": "CONNECTORS_JOBS_INDEX", + "description": [], + "signature": [ + "\".elastic-connectors-sync-jobs\"" + ], + "path": "packages/kbn-search-connectors/index.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.CONNECTORS_VERSION", + "type": "number", + "tags": [], + "label": "CONNECTORS_VERSION", + "description": [], + "signature": [ + "1" + ], + "path": "packages/kbn-search-connectors/index.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.ConnectorSyncJobDocument", + "type": "Type", + "tags": [], + "label": "ConnectorSyncJobDocument", + "description": [], + "signature": [ + "{ error: string | null; connector: { configuration: ", + { + "pluginId": "@kbn/search-connectors", + "scope": "common", + "docId": "kibKbnSearchConnectorsPluginApi", + "section": "def-common.ConnectorConfiguration", + "text": "ConnectorConfiguration" + }, + "; filtering: ", + { + "pluginId": "@kbn/search-connectors", + "scope": "common", + "docId": "kibKbnSearchConnectorsPluginApi", + "section": "def-common.FilteringRules", + "text": "FilteringRules" + }, + " | ", + { + "pluginId": "@kbn/search-connectors", + "scope": "common", + "docId": "kibKbnSearchConnectorsPluginApi", + "section": "def-common.FilteringRules", + "text": "FilteringRules" + }, + "[] | null; id: string; index_name: string; language: string | null; pipeline: ", + { + "pluginId": "@kbn/search-connectors", + "scope": "common", + "docId": "kibKbnSearchConnectorsPluginApi", + "section": "def-common.IngestPipelineParams", + "text": "IngestPipelineParams" + }, + " | null; service_type: string | null; }; status: ", + { + "pluginId": "@kbn/search-connectors", + "scope": "common", + "docId": "kibKbnSearchConnectorsPluginApi", + "section": "def-common.SyncStatus", + "text": "SyncStatus" + }, + "; created_at: string; metadata: Record; job_type: ", + { + "pluginId": "@kbn/search-connectors", + "scope": "common", + "docId": "kibKbnSearchConnectorsPluginApi", + "section": "def-common.SyncJobType", + "text": "SyncJobType" + }, + "; last_seen: string | null; cancelation_requested_at: string | null; canceled_at: string | null; completed_at: string | null; deleted_document_count: number; indexed_document_count: number; indexed_document_volume: number; started_at: string | null; total_document_count: number | null; trigger_method: ", + { + "pluginId": "@kbn/search-connectors", + "scope": "common", + "docId": "kibKbnSearchConnectorsPluginApi", + "section": "def-common.TriggerMethod", + "text": "TriggerMethod" + }, + "; worker_hostname: string | null; }" + ], + "path": "packages/kbn-search-connectors/types/connectors.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.CURRENT_CONNECTORS_INDEX", + "type": "string", + "tags": [], + "label": "CURRENT_CONNECTORS_INDEX", + "description": [], + "signature": [ + "\".elastic-connectors-v1\"" + ], + "path": "packages/kbn-search-connectors/index.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.CURRENT_CONNECTORS_JOB_INDEX", + "type": "string", + "tags": [], + "label": "CURRENT_CONNECTORS_JOB_INDEX", + "description": [], + "signature": [ + "\".elastic-connectors-sync-jobs-v1\"" + ], + "path": "packages/kbn-search-connectors/index.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.DependencyLookup", + "type": "Type", + "tags": [], + "label": "DependencyLookup", + "description": [], + "signature": [ + "{ [x: string]: string | number | boolean | null; }" + ], + "path": "packages/kbn-search-connectors/types/connectors.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + } + ], + "objects": [ + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS", + "type": "Object", + "tags": [], + "label": "NATIVE_CONNECTOR_DEFINITIONS", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.azure_blob_storage", + "type": "Object", + "tags": [], + "label": "azure_blob_storage", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.azure_blob_storage.configuration", + "type": "Object", + "tags": [], + "label": "configuration", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.azure_blob_storage.configuration.account_name", + "type": "Object", + "tags": [], + "label": "account_name", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.azure_blob_storage.configuration.account_name.default_value", + "type": "Uncategorized", + "tags": [], + "label": "default_value", + "description": [], + "signature": [ + "null" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.azure_blob_storage.configuration.account_name.depends_on", + "type": "Array", + "tags": [], + "label": "depends_on", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.azure_blob_storage.configuration.account_name.display", + "type": "string", + "tags": [], + "label": "display", + "description": [], + "signature": [ + { + "pluginId": "@kbn/search-connectors", + "scope": "common", + "docId": "kibKbnSearchConnectorsPluginApi", + "section": "def-common.DisplayType", + "text": "DisplayType" + }, + ".TEXTBOX" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.azure_blob_storage.configuration.account_name.label", + "type": "string", + "tags": [], + "label": "label", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.azure_blob_storage.configuration.account_name.options", + "type": "Array", + "tags": [], + "label": "options", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.azure_blob_storage.configuration.account_name.order", + "type": "number", + "tags": [], + "label": "order", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.azure_blob_storage.configuration.account_name.required", + "type": "boolean", + "tags": [], + "label": "required", + "description": [], + "signature": [ + "true" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.azure_blob_storage.configuration.account_name.sensitive", + "type": "boolean", + "tags": [], + "label": "sensitive", + "description": [], + "signature": [ + "false" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.azure_blob_storage.configuration.account_name.tooltip", + "type": "Uncategorized", + "tags": [], + "label": "tooltip", + "description": [], + "signature": [ + "null" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.azure_blob_storage.configuration.account_name.type", + "type": "string", + "tags": [], + "label": "type", + "description": [], + "signature": [ + { + "pluginId": "@kbn/search-connectors", + "scope": "common", + "docId": "kibKbnSearchConnectorsPluginApi", + "section": "def-common.FieldType", + "text": "FieldType" + }, + ".STRING" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.azure_blob_storage.configuration.account_name.ui_restrictions", + "type": "Array", + "tags": [], + "label": "ui_restrictions", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.azure_blob_storage.configuration.account_name.validations", + "type": "Array", + "tags": [], + "label": "validations", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.azure_blob_storage.configuration.account_name.value", + "type": "string", + "tags": [], + "label": "value", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + } + ] + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.azure_blob_storage.configuration.account_key", + "type": "Object", + "tags": [], + "label": "account_key", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.azure_blob_storage.configuration.account_key.default_value", + "type": "Uncategorized", + "tags": [], + "label": "default_value", + "description": [], + "signature": [ + "null" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.azure_blob_storage.configuration.account_key.depends_on", + "type": "Array", + "tags": [], + "label": "depends_on", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.azure_blob_storage.configuration.account_key.display", + "type": "string", + "tags": [], + "label": "display", + "description": [], + "signature": [ + { + "pluginId": "@kbn/search-connectors", + "scope": "common", + "docId": "kibKbnSearchConnectorsPluginApi", + "section": "def-common.DisplayType", + "text": "DisplayType" + }, + ".TEXTBOX" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.azure_blob_storage.configuration.account_key.label", + "type": "string", + "tags": [], + "label": "label", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.azure_blob_storage.configuration.account_key.options", + "type": "Array", + "tags": [], + "label": "options", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.azure_blob_storage.configuration.account_key.order", + "type": "number", + "tags": [], + "label": "order", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.azure_blob_storage.configuration.account_key.required", + "type": "boolean", + "tags": [], + "label": "required", + "description": [], + "signature": [ + "true" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.azure_blob_storage.configuration.account_key.sensitive", + "type": "boolean", + "tags": [], + "label": "sensitive", + "description": [], + "signature": [ + "false" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.azure_blob_storage.configuration.account_key.tooltip", + "type": "Uncategorized", + "tags": [], + "label": "tooltip", + "description": [], + "signature": [ + "null" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.azure_blob_storage.configuration.account_key.type", + "type": "string", + "tags": [], + "label": "type", + "description": [], + "signature": [ + { + "pluginId": "@kbn/search-connectors", + "scope": "common", + "docId": "kibKbnSearchConnectorsPluginApi", + "section": "def-common.FieldType", + "text": "FieldType" + }, + ".STRING" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.azure_blob_storage.configuration.account_key.ui_restrictions", + "type": "Array", + "tags": [], + "label": "ui_restrictions", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.azure_blob_storage.configuration.account_key.validations", + "type": "Array", + "tags": [], + "label": "validations", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.azure_blob_storage.configuration.account_key.value", + "type": "string", + "tags": [], + "label": "value", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + } + ] + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.azure_blob_storage.configuration.blob_endpoint", + "type": "Object", + "tags": [], + "label": "blob_endpoint", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.azure_blob_storage.configuration.blob_endpoint.default_value", + "type": "Uncategorized", + "tags": [], + "label": "default_value", + "description": [], + "signature": [ + "null" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.azure_blob_storage.configuration.blob_endpoint.depends_on", + "type": "Array", + "tags": [], + "label": "depends_on", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.azure_blob_storage.configuration.blob_endpoint.display", + "type": "string", + "tags": [], + "label": "display", + "description": [], + "signature": [ + { + "pluginId": "@kbn/search-connectors", + "scope": "common", + "docId": "kibKbnSearchConnectorsPluginApi", + "section": "def-common.DisplayType", + "text": "DisplayType" + }, + ".TEXTBOX" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.azure_blob_storage.configuration.blob_endpoint.label", + "type": "string", + "tags": [], + "label": "label", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.azure_blob_storage.configuration.blob_endpoint.options", + "type": "Array", + "tags": [], + "label": "options", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.azure_blob_storage.configuration.blob_endpoint.order", + "type": "number", + "tags": [], + "label": "order", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.azure_blob_storage.configuration.blob_endpoint.placeholder", + "type": "string", + "tags": [], + "label": "placeholder", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.azure_blob_storage.configuration.blob_endpoint.required", + "type": "boolean", + "tags": [], + "label": "required", + "description": [], + "signature": [ + "true" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.azure_blob_storage.configuration.blob_endpoint.sensitive", + "type": "boolean", + "tags": [], + "label": "sensitive", + "description": [], + "signature": [ + "false" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.azure_blob_storage.configuration.blob_endpoint.tooltip", + "type": "Uncategorized", + "tags": [], + "label": "tooltip", + "description": [], + "signature": [ + "null" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.azure_blob_storage.configuration.blob_endpoint.type", + "type": "string", + "tags": [], + "label": "type", + "description": [], + "signature": [ + { + "pluginId": "@kbn/search-connectors", + "scope": "common", + "docId": "kibKbnSearchConnectorsPluginApi", + "section": "def-common.FieldType", + "text": "FieldType" + }, + ".STRING" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.azure_blob_storage.configuration.blob_endpoint.ui_restrictions", + "type": "Array", + "tags": [], + "label": "ui_restrictions", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.azure_blob_storage.configuration.blob_endpoint.validations", + "type": "Array", + "tags": [], + "label": "validations", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.azure_blob_storage.configuration.blob_endpoint.value", + "type": "string", + "tags": [], + "label": "value", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + } + ] + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.azure_blob_storage.configuration.retry_count", + "type": "Object", + "tags": [], + "label": "retry_count", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.azure_blob_storage.configuration.retry_count.default_value", + "type": "number", + "tags": [], + "label": "default_value", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.azure_blob_storage.configuration.retry_count.depends_on", + "type": "Array", + "tags": [], + "label": "depends_on", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.azure_blob_storage.configuration.retry_count.display", + "type": "string", + "tags": [], + "label": "display", + "description": [], + "signature": [ + { + "pluginId": "@kbn/search-connectors", + "scope": "common", + "docId": "kibKbnSearchConnectorsPluginApi", + "section": "def-common.DisplayType", + "text": "DisplayType" + }, + ".NUMERIC" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.azure_blob_storage.configuration.retry_count.label", + "type": "string", + "tags": [], + "label": "label", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.azure_blob_storage.configuration.retry_count.options", + "type": "Array", + "tags": [], + "label": "options", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.azure_blob_storage.configuration.retry_count.order", + "type": "number", + "tags": [], + "label": "order", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.azure_blob_storage.configuration.retry_count.required", + "type": "boolean", + "tags": [], + "label": "required", + "description": [], + "signature": [ + "false" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.azure_blob_storage.configuration.retry_count.sensitive", + "type": "boolean", + "tags": [], + "label": "sensitive", + "description": [], + "signature": [ + "false" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.azure_blob_storage.configuration.retry_count.tooltip", + "type": "Uncategorized", + "tags": [], + "label": "tooltip", + "description": [], + "signature": [ + "null" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.azure_blob_storage.configuration.retry_count.type", + "type": "string", + "tags": [], + "label": "type", + "description": [], + "signature": [ + { + "pluginId": "@kbn/search-connectors", + "scope": "common", + "docId": "kibKbnSearchConnectorsPluginApi", + "section": "def-common.FieldType", + "text": "FieldType" + }, + ".INTEGER" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.azure_blob_storage.configuration.retry_count.ui_restrictions", + "type": "Array", + "tags": [], + "label": "ui_restrictions", + "description": [], + "signature": [ + "string[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.azure_blob_storage.configuration.retry_count.validations", + "type": "Array", + "tags": [], + "label": "validations", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.azure_blob_storage.configuration.retry_count.value", + "type": "number", + "tags": [], + "label": "value", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + } + ] + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.azure_blob_storage.configuration.concurrent_downloads", + "type": "Object", + "tags": [], + "label": "concurrent_downloads", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.azure_blob_storage.configuration.concurrent_downloads.default_value", + "type": "number", + "tags": [], + "label": "default_value", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.azure_blob_storage.configuration.concurrent_downloads.depends_on", + "type": "Array", + "tags": [], + "label": "depends_on", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.azure_blob_storage.configuration.concurrent_downloads.display", + "type": "string", + "tags": [], + "label": "display", + "description": [], + "signature": [ + { + "pluginId": "@kbn/search-connectors", + "scope": "common", + "docId": "kibKbnSearchConnectorsPluginApi", + "section": "def-common.DisplayType", + "text": "DisplayType" + }, + ".NUMERIC" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.azure_blob_storage.configuration.concurrent_downloads.label", + "type": "string", + "tags": [], + "label": "label", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.azure_blob_storage.configuration.concurrent_downloads.options", + "type": "Array", + "tags": [], + "label": "options", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.azure_blob_storage.configuration.concurrent_downloads.order", + "type": "number", + "tags": [], + "label": "order", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.azure_blob_storage.configuration.concurrent_downloads.required", + "type": "boolean", + "tags": [], + "label": "required", + "description": [], + "signature": [ + "false" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.azure_blob_storage.configuration.concurrent_downloads.sensitive", + "type": "boolean", + "tags": [], + "label": "sensitive", + "description": [], + "signature": [ + "false" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.azure_blob_storage.configuration.concurrent_downloads.tooltip", + "type": "Uncategorized", + "tags": [], + "label": "tooltip", + "description": [], + "signature": [ + "null" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.azure_blob_storage.configuration.concurrent_downloads.type", + "type": "string", + "tags": [], + "label": "type", + "description": [], + "signature": [ + { + "pluginId": "@kbn/search-connectors", + "scope": "common", + "docId": "kibKbnSearchConnectorsPluginApi", + "section": "def-common.FieldType", + "text": "FieldType" + }, + ".INTEGER" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.azure_blob_storage.configuration.concurrent_downloads.ui_restrictions", + "type": "Array", + "tags": [], + "label": "ui_restrictions", + "description": [], + "signature": [ + "string[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.azure_blob_storage.configuration.concurrent_downloads.validations", + "type": "Array", + "tags": [], + "label": "validations", + "description": [], + "signature": [ + "{ type: string; constraint: number; }[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.azure_blob_storage.configuration.concurrent_downloads.value", + "type": "number", + "tags": [], + "label": "value", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + } + ] + } + ] + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.azure_blob_storage.features", + "type": "Object", + "tags": [], + "label": "features", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.azure_blob_storage.features.FeatureName.SYNC_RULES", + "type": "Object", + "tags": [], + "label": "[FeatureName.SYNC_RULES]", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.azure_blob_storage.features.FeatureName.SYNC_RULES.advanced", + "type": "Object", + "tags": [], + "label": "advanced", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.azure_blob_storage.features.FeatureName.SYNC_RULES.advanced.enabled", + "type": "boolean", + "tags": [], + "label": "enabled", + "description": [], + "signature": [ + "false" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + } + ] + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.azure_blob_storage.features.FeatureName.SYNC_RULES.basic", + "type": "Object", + "tags": [], + "label": "basic", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.azure_blob_storage.features.FeatureName.SYNC_RULES.basic.enabled", + "type": "boolean", + "tags": [], + "label": "enabled", + "description": [], + "signature": [ + "true" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + } + ] + } + ] + } + ] + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.azure_blob_storage.name", + "type": "string", + "tags": [], + "label": "name", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.azure_blob_storage.serviceType", + "type": "string", + "tags": [], + "label": "serviceType", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + } + ] + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.confluence", + "type": "Object", + "tags": [], + "label": "confluence", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.confluence.configuration", + "type": "Object", + "tags": [], + "label": "configuration", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.confluence.configuration.data_source", + "type": "Object", + "tags": [], + "label": "data_source", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.confluence.configuration.data_source.default_value", + "type": "Uncategorized", + "tags": [], + "label": "default_value", + "description": [], + "signature": [ + "null" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.confluence.configuration.data_source.depends_on", + "type": "Array", + "tags": [], + "label": "depends_on", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.confluence.configuration.data_source.display", + "type": "string", + "tags": [], + "label": "display", + "description": [], + "signature": [ + { + "pluginId": "@kbn/search-connectors", + "scope": "common", + "docId": "kibKbnSearchConnectorsPluginApi", + "section": "def-common.DisplayType", + "text": "DisplayType" + }, + ".DROPDOWN" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.confluence.configuration.data_source.label", + "type": "string", + "tags": [], + "label": "label", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.confluence.configuration.data_source.options", + "type": "Array", + "tags": [], + "label": "options", + "description": [], + "signature": [ + "{ label: string; value: string; }[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.confluence.configuration.data_source.order", + "type": "number", + "tags": [], + "label": "order", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.confluence.configuration.data_source.required", + "type": "boolean", + "tags": [], + "label": "required", + "description": [], + "signature": [ + "true" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.confluence.configuration.data_source.sensitive", + "type": "boolean", + "tags": [], + "label": "sensitive", + "description": [], + "signature": [ + "false" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.confluence.configuration.data_source.tooltip", + "type": "Uncategorized", + "tags": [], + "label": "tooltip", + "description": [], + "signature": [ + "null" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.confluence.configuration.data_source.type", + "type": "string", + "tags": [], + "label": "type", + "description": [], + "signature": [ + { + "pluginId": "@kbn/search-connectors", + "scope": "common", + "docId": "kibKbnSearchConnectorsPluginApi", + "section": "def-common.FieldType", + "text": "FieldType" + }, + ".STRING" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.confluence.configuration.data_source.ui_restrictions", + "type": "Array", + "tags": [], + "label": "ui_restrictions", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.confluence.configuration.data_source.validations", + "type": "Array", + "tags": [], + "label": "validations", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.confluence.configuration.data_source.value", + "type": "string", + "tags": [], + "label": "value", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + } + ] + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.confluence.configuration.username", + "type": "Object", + "tags": [], + "label": "username", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.confluence.configuration.username.default_value", + "type": "Uncategorized", + "tags": [], + "label": "default_value", + "description": [], + "signature": [ + "null" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.confluence.configuration.username.depends_on", + "type": "Array", + "tags": [], + "label": "depends_on", + "description": [], + "signature": [ + "{ field: string; value: string; }[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.confluence.configuration.username.display", + "type": "string", + "tags": [], + "label": "display", + "description": [], + "signature": [ + { + "pluginId": "@kbn/search-connectors", + "scope": "common", + "docId": "kibKbnSearchConnectorsPluginApi", + "section": "def-common.DisplayType", + "text": "DisplayType" + }, + ".TEXTBOX" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.confluence.configuration.username.label", + "type": "string", + "tags": [], + "label": "label", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.confluence.configuration.username.options", + "type": "Array", + "tags": [], + "label": "options", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.confluence.configuration.username.order", + "type": "number", + "tags": [], + "label": "order", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.confluence.configuration.username.required", + "type": "boolean", + "tags": [], + "label": "required", + "description": [], + "signature": [ + "true" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.confluence.configuration.username.sensitive", + "type": "boolean", + "tags": [], + "label": "sensitive", + "description": [], + "signature": [ + "false" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.confluence.configuration.username.tooltip", + "type": "Uncategorized", + "tags": [], + "label": "tooltip", + "description": [], + "signature": [ + "null" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.confluence.configuration.username.type", + "type": "string", + "tags": [], + "label": "type", + "description": [], + "signature": [ + { + "pluginId": "@kbn/search-connectors", + "scope": "common", + "docId": "kibKbnSearchConnectorsPluginApi", + "section": "def-common.FieldType", + "text": "FieldType" + }, + ".STRING" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.confluence.configuration.username.ui_restrictions", + "type": "Array", + "tags": [], + "label": "ui_restrictions", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.confluence.configuration.username.validations", + "type": "Array", + "tags": [], + "label": "validations", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.confluence.configuration.username.value", + "type": "string", + "tags": [], + "label": "value", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + } + ] + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.confluence.configuration.password", + "type": "Object", + "tags": [], + "label": "password", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.confluence.configuration.password.default_value", + "type": "Uncategorized", + "tags": [], + "label": "default_value", + "description": [], + "signature": [ + "null" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.confluence.configuration.password.depends_on", + "type": "Array", + "tags": [], + "label": "depends_on", + "description": [], + "signature": [ + "{ field: string; value: string; }[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.confluence.configuration.password.display", + "type": "string", + "tags": [], + "label": "display", + "description": [], + "signature": [ + { + "pluginId": "@kbn/search-connectors", + "scope": "common", + "docId": "kibKbnSearchConnectorsPluginApi", + "section": "def-common.DisplayType", + "text": "DisplayType" + }, + ".TEXTBOX" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.confluence.configuration.password.label", + "type": "string", + "tags": [], + "label": "label", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.confluence.configuration.password.options", + "type": "Array", + "tags": [], + "label": "options", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.confluence.configuration.password.order", + "type": "number", + "tags": [], + "label": "order", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.confluence.configuration.password.required", + "type": "boolean", + "tags": [], + "label": "required", + "description": [], + "signature": [ + "true" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.confluence.configuration.password.sensitive", + "type": "boolean", + "tags": [], + "label": "sensitive", + "description": [], + "signature": [ + "true" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.confluence.configuration.password.tooltip", + "type": "Uncategorized", + "tags": [], + "label": "tooltip", + "description": [], + "signature": [ + "null" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.confluence.configuration.password.type", + "type": "string", + "tags": [], + "label": "type", + "description": [], + "signature": [ + { + "pluginId": "@kbn/search-connectors", + "scope": "common", + "docId": "kibKbnSearchConnectorsPluginApi", + "section": "def-common.FieldType", + "text": "FieldType" + }, + ".STRING" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.confluence.configuration.password.ui_restrictions", + "type": "Array", + "tags": [], + "label": "ui_restrictions", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.confluence.configuration.password.validations", + "type": "Array", + "tags": [], + "label": "validations", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.confluence.configuration.password.value", + "type": "string", + "tags": [], + "label": "value", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + } + ] + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.confluence.configuration.account_email", + "type": "Object", + "tags": [], + "label": "account_email", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.confluence.configuration.account_email.default_value", + "type": "Uncategorized", + "tags": [], + "label": "default_value", + "description": [], + "signature": [ + "null" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.confluence.configuration.account_email.depends_on", + "type": "Array", + "tags": [], + "label": "depends_on", + "description": [], + "signature": [ + "{ field: string; value: string; }[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.confluence.configuration.account_email.display", + "type": "string", + "tags": [], + "label": "display", + "description": [], + "signature": [ + { + "pluginId": "@kbn/search-connectors", + "scope": "common", + "docId": "kibKbnSearchConnectorsPluginApi", + "section": "def-common.DisplayType", + "text": "DisplayType" + }, + ".TEXTBOX" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.confluence.configuration.account_email.label", + "type": "string", + "tags": [], + "label": "label", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.confluence.configuration.account_email.options", + "type": "Array", + "tags": [], + "label": "options", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.confluence.configuration.account_email.order", + "type": "number", + "tags": [], + "label": "order", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.confluence.configuration.account_email.placeholder", + "type": "string", + "tags": [], + "label": "placeholder", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.confluence.configuration.account_email.required", + "type": "boolean", + "tags": [], + "label": "required", + "description": [], + "signature": [ + "true" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.confluence.configuration.account_email.sensitive", + "type": "boolean", + "tags": [], + "label": "sensitive", + "description": [], + "signature": [ + "false" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.confluence.configuration.account_email.tooltip", + "type": "Uncategorized", + "tags": [], + "label": "tooltip", + "description": [], + "signature": [ + "null" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.confluence.configuration.account_email.type", + "type": "string", + "tags": [], + "label": "type", + "description": [], + "signature": [ + { + "pluginId": "@kbn/search-connectors", + "scope": "common", + "docId": "kibKbnSearchConnectorsPluginApi", + "section": "def-common.FieldType", + "text": "FieldType" + }, + ".STRING" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.confluence.configuration.account_email.ui_restrictions", + "type": "Array", + "tags": [], + "label": "ui_restrictions", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.confluence.configuration.account_email.validations", + "type": "Array", + "tags": [], + "label": "validations", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.confluence.configuration.account_email.value", + "type": "string", + "tags": [], + "label": "value", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + } + ] + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.confluence.configuration.api_token", + "type": "Object", + "tags": [], + "label": "api_token", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.confluence.configuration.api_token.default_value", + "type": "Uncategorized", + "tags": [], + "label": "default_value", + "description": [], + "signature": [ + "null" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.confluence.configuration.api_token.depends_on", + "type": "Array", + "tags": [], + "label": "depends_on", + "description": [], + "signature": [ + "{ field: string; value: string; }[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.confluence.configuration.api_token.display", + "type": "string", + "tags": [], + "label": "display", + "description": [], + "signature": [ + { + "pluginId": "@kbn/search-connectors", + "scope": "common", + "docId": "kibKbnSearchConnectorsPluginApi", + "section": "def-common.DisplayType", + "text": "DisplayType" + }, + ".TEXTBOX" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.confluence.configuration.api_token.label", + "type": "string", + "tags": [], + "label": "label", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.confluence.configuration.api_token.options", + "type": "Array", + "tags": [], + "label": "options", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.confluence.configuration.api_token.order", + "type": "number", + "tags": [], + "label": "order", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.confluence.configuration.api_token.required", + "type": "boolean", + "tags": [], + "label": "required", + "description": [], + "signature": [ + "true" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.confluence.configuration.api_token.sensitive", + "type": "boolean", + "tags": [], + "label": "sensitive", + "description": [], + "signature": [ + "true" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.confluence.configuration.api_token.tooltip", + "type": "Uncategorized", + "tags": [], + "label": "tooltip", + "description": [], + "signature": [ + "null" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.confluence.configuration.api_token.type", + "type": "string", + "tags": [], + "label": "type", + "description": [], + "signature": [ + { + "pluginId": "@kbn/search-connectors", + "scope": "common", + "docId": "kibKbnSearchConnectorsPluginApi", + "section": "def-common.FieldType", + "text": "FieldType" + }, + ".STRING" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.confluence.configuration.api_token.ui_restrictions", + "type": "Array", + "tags": [], + "label": "ui_restrictions", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.confluence.configuration.api_token.validations", + "type": "Array", + "tags": [], + "label": "validations", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.confluence.configuration.api_token.value", + "type": "string", + "tags": [], + "label": "value", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + } + ] + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.confluence.configuration.confluence_url", + "type": "Object", + "tags": [], + "label": "confluence_url", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.confluence.configuration.confluence_url.default_value", + "type": "Uncategorized", + "tags": [], + "label": "default_value", + "description": [], + "signature": [ + "null" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.confluence.configuration.confluence_url.depends_on", + "type": "Array", + "tags": [], + "label": "depends_on", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.confluence.configuration.confluence_url.display", + "type": "string", + "tags": [], + "label": "display", + "description": [], + "signature": [ + { + "pluginId": "@kbn/search-connectors", + "scope": "common", + "docId": "kibKbnSearchConnectorsPluginApi", + "section": "def-common.DisplayType", + "text": "DisplayType" + }, + ".TEXTBOX" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.confluence.configuration.confluence_url.label", + "type": "string", + "tags": [], + "label": "label", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.confluence.configuration.confluence_url.options", + "type": "Array", + "tags": [], + "label": "options", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.confluence.configuration.confluence_url.order", + "type": "number", + "tags": [], + "label": "order", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.confluence.configuration.confluence_url.placeholder", + "type": "string", + "tags": [], + "label": "placeholder", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.confluence.configuration.confluence_url.required", + "type": "boolean", + "tags": [], + "label": "required", + "description": [], + "signature": [ + "true" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.confluence.configuration.confluence_url.sensitive", + "type": "boolean", + "tags": [], + "label": "sensitive", + "description": [], + "signature": [ + "false" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.confluence.configuration.confluence_url.tooltip", + "type": "Uncategorized", + "tags": [], + "label": "tooltip", + "description": [], + "signature": [ + "null" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.confluence.configuration.confluence_url.type", + "type": "string", + "tags": [], + "label": "type", + "description": [], + "signature": [ + { + "pluginId": "@kbn/search-connectors", + "scope": "common", + "docId": "kibKbnSearchConnectorsPluginApi", + "section": "def-common.FieldType", + "text": "FieldType" + }, + ".STRING" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.confluence.configuration.confluence_url.ui_restrictions", + "type": "Array", + "tags": [], + "label": "ui_restrictions", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.confluence.configuration.confluence_url.validations", + "type": "Array", + "tags": [], + "label": "validations", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.confluence.configuration.confluence_url.value", + "type": "string", + "tags": [], + "label": "value", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + } + ] + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.confluence.configuration.spaces", + "type": "Object", + "tags": [], + "label": "spaces", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.confluence.configuration.spaces.default_value", + "type": "Uncategorized", + "tags": [], + "label": "default_value", + "description": [], + "signature": [ + "null" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.confluence.configuration.spaces.depends_on", + "type": "Array", + "tags": [], + "label": "depends_on", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.confluence.configuration.spaces.display", + "type": "string", + "tags": [], + "label": "display", + "description": [], + "signature": [ + { + "pluginId": "@kbn/search-connectors", + "scope": "common", + "docId": "kibKbnSearchConnectorsPluginApi", + "section": "def-common.DisplayType", + "text": "DisplayType" + }, + ".TEXTAREA" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.confluence.configuration.spaces.label", + "type": "string", + "tags": [], + "label": "label", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.confluence.configuration.spaces.options", + "type": "Array", + "tags": [], + "label": "options", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.confluence.configuration.spaces.order", + "type": "number", + "tags": [], + "label": "order", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.confluence.configuration.spaces.required", + "type": "boolean", + "tags": [], + "label": "required", + "description": [], + "signature": [ + "true" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.confluence.configuration.spaces.sensitive", + "type": "boolean", + "tags": [], + "label": "sensitive", + "description": [], + "signature": [ + "false" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.confluence.configuration.spaces.tooltip", + "type": "string", + "tags": [], + "label": "tooltip", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.confluence.configuration.spaces.type", + "type": "string", + "tags": [], + "label": "type", + "description": [], + "signature": [ + { + "pluginId": "@kbn/search-connectors", + "scope": "common", + "docId": "kibKbnSearchConnectorsPluginApi", + "section": "def-common.FieldType", + "text": "FieldType" + }, + ".LIST" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.confluence.configuration.spaces.ui_restrictions", + "type": "Array", + "tags": [], + "label": "ui_restrictions", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.confluence.configuration.spaces.validations", + "type": "Array", + "tags": [], + "label": "validations", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.confluence.configuration.spaces.value", + "type": "string", + "tags": [], + "label": "value", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + } + ] + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.confluence.configuration.ssl_enabled", + "type": "Object", + "tags": [], + "label": "ssl_enabled", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.confluence.configuration.ssl_enabled.default_value", + "type": "Uncategorized", + "tags": [], + "label": "default_value", + "description": [], + "signature": [ + "null" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.confluence.configuration.ssl_enabled.depends_on", + "type": "Array", + "tags": [], + "label": "depends_on", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.confluence.configuration.ssl_enabled.display", + "type": "string", + "tags": [], + "label": "display", + "description": [], + "signature": [ + { + "pluginId": "@kbn/search-connectors", + "scope": "common", + "docId": "kibKbnSearchConnectorsPluginApi", + "section": "def-common.DisplayType", + "text": "DisplayType" + }, + ".TOGGLE" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.confluence.configuration.ssl_enabled.label", + "type": "string", + "tags": [], + "label": "label", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.confluence.configuration.ssl_enabled.options", + "type": "Array", + "tags": [], + "label": "options", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.confluence.configuration.ssl_enabled.order", + "type": "number", + "tags": [], + "label": "order", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.confluence.configuration.ssl_enabled.required", + "type": "boolean", + "tags": [], + "label": "required", + "description": [], + "signature": [ + "true" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.confluence.configuration.ssl_enabled.sensitive", + "type": "boolean", + "tags": [], + "label": "sensitive", + "description": [], + "signature": [ + "false" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.confluence.configuration.ssl_enabled.tooltip", + "type": "Uncategorized", + "tags": [], + "label": "tooltip", + "description": [], + "signature": [ + "null" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.confluence.configuration.ssl_enabled.type", + "type": "string", + "tags": [], + "label": "type", + "description": [], + "signature": [ + { + "pluginId": "@kbn/search-connectors", + "scope": "common", + "docId": "kibKbnSearchConnectorsPluginApi", + "section": "def-common.FieldType", + "text": "FieldType" + }, + ".BOOLEAN" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.confluence.configuration.ssl_enabled.ui_restrictions", + "type": "Array", + "tags": [], + "label": "ui_restrictions", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.confluence.configuration.ssl_enabled.validations", + "type": "Array", + "tags": [], + "label": "validations", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.confluence.configuration.ssl_enabled.value", + "type": "boolean", + "tags": [], + "label": "value", + "description": [], + "signature": [ + "false" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + } + ] + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.confluence.configuration.ssl_ca", + "type": "Object", + "tags": [], + "label": "ssl_ca", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.confluence.configuration.ssl_ca.default_value", + "type": "Uncategorized", + "tags": [], + "label": "default_value", + "description": [], + "signature": [ + "null" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.confluence.configuration.ssl_ca.depends_on", + "type": "Array", + "tags": [], + "label": "depends_on", + "description": [], + "signature": [ + "{ field: string; value: true; }[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.confluence.configuration.ssl_ca.display", + "type": "string", + "tags": [], + "label": "display", + "description": [], + "signature": [ + { + "pluginId": "@kbn/search-connectors", + "scope": "common", + "docId": "kibKbnSearchConnectorsPluginApi", + "section": "def-common.DisplayType", + "text": "DisplayType" + }, + ".TEXTBOX" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.confluence.configuration.ssl_ca.label", + "type": "string", + "tags": [], + "label": "label", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.confluence.configuration.ssl_ca.options", + "type": "Array", + "tags": [], + "label": "options", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.confluence.configuration.ssl_ca.order", + "type": "number", + "tags": [], + "label": "order", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.confluence.configuration.ssl_ca.required", + "type": "boolean", + "tags": [], + "label": "required", + "description": [], + "signature": [ + "true" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.confluence.configuration.ssl_ca.sensitive", + "type": "boolean", + "tags": [], + "label": "sensitive", + "description": [], + "signature": [ + "false" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.confluence.configuration.ssl_ca.tooltip", + "type": "Uncategorized", + "tags": [], + "label": "tooltip", + "description": [], + "signature": [ + "null" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.confluence.configuration.ssl_ca.type", + "type": "string", + "tags": [], + "label": "type", + "description": [], + "signature": [ + { + "pluginId": "@kbn/search-connectors", + "scope": "common", + "docId": "kibKbnSearchConnectorsPluginApi", + "section": "def-common.FieldType", + "text": "FieldType" + }, + ".STRING" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.confluence.configuration.ssl_ca.ui_restrictions", + "type": "Array", + "tags": [], + "label": "ui_restrictions", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.confluence.configuration.ssl_ca.validations", + "type": "Array", + "tags": [], + "label": "validations", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.confluence.configuration.ssl_ca.value", + "type": "string", + "tags": [], + "label": "value", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + } + ] + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.confluence.configuration.retry_count", + "type": "Object", + "tags": [], + "label": "retry_count", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.confluence.configuration.retry_count.default_value", + "type": "number", + "tags": [], + "label": "default_value", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.confluence.configuration.retry_count.depends_on", + "type": "Array", + "tags": [], + "label": "depends_on", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.confluence.configuration.retry_count.display", + "type": "string", + "tags": [], + "label": "display", + "description": [], + "signature": [ + { + "pluginId": "@kbn/search-connectors", + "scope": "common", + "docId": "kibKbnSearchConnectorsPluginApi", + "section": "def-common.DisplayType", + "text": "DisplayType" + }, + ".NUMERIC" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.confluence.configuration.retry_count.label", + "type": "string", + "tags": [], + "label": "label", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.confluence.configuration.retry_count.options", + "type": "Array", + "tags": [], + "label": "options", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.confluence.configuration.retry_count.order", + "type": "number", + "tags": [], + "label": "order", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.confluence.configuration.retry_count.required", + "type": "boolean", + "tags": [], + "label": "required", + "description": [], + "signature": [ + "false" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.confluence.configuration.retry_count.sensitive", + "type": "boolean", + "tags": [], + "label": "sensitive", + "description": [], + "signature": [ + "false" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.confluence.configuration.retry_count.tooltip", + "type": "Uncategorized", + "tags": [], + "label": "tooltip", + "description": [], + "signature": [ + "null" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.confluence.configuration.retry_count.type", + "type": "string", + "tags": [], + "label": "type", + "description": [], + "signature": [ + { + "pluginId": "@kbn/search-connectors", + "scope": "common", + "docId": "kibKbnSearchConnectorsPluginApi", + "section": "def-common.FieldType", + "text": "FieldType" + }, + ".STRING" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.confluence.configuration.retry_count.ui_restrictions", + "type": "Array", + "tags": [], + "label": "ui_restrictions", + "description": [], + "signature": [ + "string[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.confluence.configuration.retry_count.validations", + "type": "Array", + "tags": [], + "label": "validations", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.confluence.configuration.retry_count.value", + "type": "number", + "tags": [], + "label": "value", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + } + ] + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.confluence.configuration.concurrent_downloads", + "type": "Object", + "tags": [], + "label": "concurrent_downloads", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.confluence.configuration.concurrent_downloads.default_value", + "type": "number", + "tags": [], + "label": "default_value", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.confluence.configuration.concurrent_downloads.depends_on", + "type": "Array", + "tags": [], + "label": "depends_on", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.confluence.configuration.concurrent_downloads.display", + "type": "string", + "tags": [], + "label": "display", + "description": [], + "signature": [ + { + "pluginId": "@kbn/search-connectors", + "scope": "common", + "docId": "kibKbnSearchConnectorsPluginApi", + "section": "def-common.DisplayType", + "text": "DisplayType" + }, + ".NUMERIC" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.confluence.configuration.concurrent_downloads.label", + "type": "string", + "tags": [], + "label": "label", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.confluence.configuration.concurrent_downloads.options", + "type": "Array", + "tags": [], + "label": "options", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.confluence.configuration.concurrent_downloads.order", + "type": "number", + "tags": [], + "label": "order", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.confluence.configuration.concurrent_downloads.required", + "type": "boolean", + "tags": [], + "label": "required", + "description": [], + "signature": [ + "false" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.confluence.configuration.concurrent_downloads.sensitive", + "type": "boolean", + "tags": [], + "label": "sensitive", + "description": [], + "signature": [ + "false" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.confluence.configuration.concurrent_downloads.tooltip", + "type": "Uncategorized", + "tags": [], + "label": "tooltip", + "description": [], + "signature": [ + "null" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.confluence.configuration.concurrent_downloads.type", + "type": "string", + "tags": [], + "label": "type", + "description": [], + "signature": [ + { + "pluginId": "@kbn/search-connectors", + "scope": "common", + "docId": "kibKbnSearchConnectorsPluginApi", + "section": "def-common.FieldType", + "text": "FieldType" + }, + ".INTEGER" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.confluence.configuration.concurrent_downloads.ui_restrictions", + "type": "Array", + "tags": [], + "label": "ui_restrictions", + "description": [], + "signature": [ + "string[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.confluence.configuration.concurrent_downloads.validations", + "type": "Array", + "tags": [], + "label": "validations", + "description": [], + "signature": [ + "{ constraint: number; type: string; }[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.confluence.configuration.concurrent_downloads.value", + "type": "number", + "tags": [], + "label": "value", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + } + ] + } + ] + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.confluence.features", + "type": "Object", + "tags": [], + "label": "features", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.confluence.features.FeatureName.SYNC_RULES", + "type": "Object", + "tags": [], + "label": "[FeatureName.SYNC_RULES]", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.confluence.features.FeatureName.SYNC_RULES.advanced", + "type": "Object", + "tags": [], + "label": "advanced", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.confluence.features.FeatureName.SYNC_RULES.advanced.enabled", + "type": "boolean", + "tags": [], + "label": "enabled", + "description": [], + "signature": [ + "true" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + } + ] + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.confluence.features.FeatureName.SYNC_RULES.basic", + "type": "Object", + "tags": [], + "label": "basic", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.confluence.features.FeatureName.SYNC_RULES.basic.enabled", + "type": "boolean", + "tags": [], + "label": "enabled", + "description": [], + "signature": [ + "true" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + } + ] + } + ] + } + ] + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.confluence.name", + "type": "string", + "tags": [], + "label": "name", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.confluence.serviceType", + "type": "string", + "tags": [], + "label": "serviceType", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + } + ] + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.dropbox", + "type": "Object", + "tags": [], + "label": "dropbox", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.dropbox.configuration", + "type": "Object", + "tags": [], + "label": "configuration", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.dropbox.configuration.path", + "type": "Object", + "tags": [], + "label": "path", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.dropbox.configuration.path.default_value", + "type": "Uncategorized", + "tags": [], + "label": "default_value", + "description": [], + "signature": [ + "null" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.dropbox.configuration.path.depends_on", + "type": "Array", + "tags": [], + "label": "depends_on", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.dropbox.configuration.path.display", + "type": "string", + "tags": [], + "label": "display", + "description": [], + "signature": [ + { + "pluginId": "@kbn/search-connectors", + "scope": "common", + "docId": "kibKbnSearchConnectorsPluginApi", + "section": "def-common.DisplayType", + "text": "DisplayType" + }, + ".TEXTBOX" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.dropbox.configuration.path.label", + "type": "string", + "tags": [], + "label": "label", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.dropbox.configuration.path.options", + "type": "Array", + "tags": [], + "label": "options", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.dropbox.configuration.path.order", + "type": "number", + "tags": [], + "label": "order", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.dropbox.configuration.path.required", + "type": "boolean", + "tags": [], + "label": "required", + "description": [], + "signature": [ + "false" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.dropbox.configuration.path.sensitive", + "type": "boolean", + "tags": [], + "label": "sensitive", + "description": [], + "signature": [ + "false" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.dropbox.configuration.path.tooltip", + "type": "string", + "tags": [], + "label": "tooltip", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.dropbox.configuration.path.type", + "type": "string", + "tags": [], + "label": "type", + "description": [], + "signature": [ + { + "pluginId": "@kbn/search-connectors", + "scope": "common", + "docId": "kibKbnSearchConnectorsPluginApi", + "section": "def-common.FieldType", + "text": "FieldType" + }, + ".STRING" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.dropbox.configuration.path.ui_restrictions", + "type": "Array", + "tags": [], + "label": "ui_restrictions", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.dropbox.configuration.path.validations", + "type": "Array", + "tags": [], + "label": "validations", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.dropbox.configuration.path.value", + "type": "string", + "tags": [], + "label": "value", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + } + ] + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.dropbox.configuration.app_key", + "type": "Object", + "tags": [], + "label": "app_key", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.dropbox.configuration.app_key.default_value", + "type": "Uncategorized", + "tags": [], + "label": "default_value", + "description": [], + "signature": [ + "null" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.dropbox.configuration.app_key.depends_on", + "type": "Array", + "tags": [], + "label": "depends_on", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.dropbox.configuration.app_key.display", + "type": "string", + "tags": [], + "label": "display", + "description": [], + "signature": [ + { + "pluginId": "@kbn/search-connectors", + "scope": "common", + "docId": "kibKbnSearchConnectorsPluginApi", + "section": "def-common.DisplayType", + "text": "DisplayType" + }, + ".TEXTBOX" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.dropbox.configuration.app_key.label", + "type": "string", + "tags": [], + "label": "label", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.dropbox.configuration.app_key.options", + "type": "Array", + "tags": [], + "label": "options", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.dropbox.configuration.app_key.order", + "type": "number", + "tags": [], + "label": "order", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.dropbox.configuration.app_key.placeholder", + "type": "string", + "tags": [], + "label": "placeholder", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.dropbox.configuration.app_key.required", + "type": "boolean", + "tags": [], + "label": "required", + "description": [], + "signature": [ + "true" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.dropbox.configuration.app_key.sensitive", + "type": "boolean", + "tags": [], + "label": "sensitive", + "description": [], + "signature": [ + "true" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.dropbox.configuration.app_key.tooltip", + "type": "Uncategorized", + "tags": [], + "label": "tooltip", + "description": [], + "signature": [ + "null" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.dropbox.configuration.app_key.type", + "type": "string", + "tags": [], + "label": "type", + "description": [], + "signature": [ + { + "pluginId": "@kbn/search-connectors", + "scope": "common", + "docId": "kibKbnSearchConnectorsPluginApi", + "section": "def-common.FieldType", + "text": "FieldType" + }, + ".STRING" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.dropbox.configuration.app_key.ui_restrictions", + "type": "Array", + "tags": [], + "label": "ui_restrictions", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.dropbox.configuration.app_key.validations", + "type": "Array", + "tags": [], + "label": "validations", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.dropbox.configuration.app_key.value", + "type": "string", + "tags": [], + "label": "value", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + } + ] + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.dropbox.configuration.app_secret", + "type": "Object", + "tags": [], + "label": "app_secret", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.dropbox.configuration.app_secret.default_value", + "type": "Uncategorized", + "tags": [], + "label": "default_value", + "description": [], + "signature": [ + "null" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.dropbox.configuration.app_secret.depends_on", + "type": "Array", + "tags": [], + "label": "depends_on", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.dropbox.configuration.app_secret.display", + "type": "string", + "tags": [], + "label": "display", + "description": [], + "signature": [ + { + "pluginId": "@kbn/search-connectors", + "scope": "common", + "docId": "kibKbnSearchConnectorsPluginApi", + "section": "def-common.DisplayType", + "text": "DisplayType" + }, + ".TEXTBOX" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.dropbox.configuration.app_secret.label", + "type": "string", + "tags": [], + "label": "label", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.dropbox.configuration.app_secret.options", + "type": "Array", + "tags": [], + "label": "options", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.dropbox.configuration.app_secret.order", + "type": "number", + "tags": [], + "label": "order", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.dropbox.configuration.app_secret.required", + "type": "boolean", + "tags": [], + "label": "required", + "description": [], + "signature": [ + "true" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.dropbox.configuration.app_secret.sensitive", + "type": "boolean", + "tags": [], + "label": "sensitive", + "description": [], + "signature": [ + "true" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.dropbox.configuration.app_secret.tooltip", + "type": "Uncategorized", + "tags": [], + "label": "tooltip", + "description": [], + "signature": [ + "null" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.dropbox.configuration.app_secret.type", + "type": "string", + "tags": [], + "label": "type", + "description": [], + "signature": [ + { + "pluginId": "@kbn/search-connectors", + "scope": "common", + "docId": "kibKbnSearchConnectorsPluginApi", + "section": "def-common.FieldType", + "text": "FieldType" + }, + ".STRING" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.dropbox.configuration.app_secret.ui_restrictions", + "type": "Array", + "tags": [], + "label": "ui_restrictions", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.dropbox.configuration.app_secret.validations", + "type": "Array", + "tags": [], + "label": "validations", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.dropbox.configuration.app_secret.value", + "type": "string", + "tags": [], + "label": "value", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + } + ] + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.dropbox.configuration.refresh_token", + "type": "Object", + "tags": [], + "label": "refresh_token", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.dropbox.configuration.refresh_token.default_value", + "type": "Uncategorized", + "tags": [], + "label": "default_value", + "description": [], + "signature": [ + "null" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.dropbox.configuration.refresh_token.depends_on", + "type": "Array", + "tags": [], + "label": "depends_on", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.dropbox.configuration.refresh_token.display", + "type": "string", + "tags": [], + "label": "display", + "description": [], + "signature": [ + { + "pluginId": "@kbn/search-connectors", + "scope": "common", + "docId": "kibKbnSearchConnectorsPluginApi", + "section": "def-common.DisplayType", + "text": "DisplayType" + }, + ".TEXTBOX" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.dropbox.configuration.refresh_token.label", + "type": "string", + "tags": [], + "label": "label", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.dropbox.configuration.refresh_token.options", + "type": "Array", + "tags": [], + "label": "options", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.dropbox.configuration.refresh_token.order", + "type": "number", + "tags": [], + "label": "order", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.dropbox.configuration.refresh_token.required", + "type": "boolean", + "tags": [], + "label": "required", + "description": [], + "signature": [ + "true" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.dropbox.configuration.refresh_token.sensitive", + "type": "boolean", + "tags": [], + "label": "sensitive", + "description": [], + "signature": [ + "true" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.dropbox.configuration.refresh_token.tooltip", + "type": "Uncategorized", + "tags": [], + "label": "tooltip", + "description": [], + "signature": [ + "null" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.dropbox.configuration.refresh_token.type", + "type": "string", + "tags": [], + "label": "type", + "description": [], + "signature": [ + { + "pluginId": "@kbn/search-connectors", + "scope": "common", + "docId": "kibKbnSearchConnectorsPluginApi", + "section": "def-common.FieldType", + "text": "FieldType" + }, + ".STRING" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.dropbox.configuration.refresh_token.ui_restrictions", + "type": "Array", + "tags": [], + "label": "ui_restrictions", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.dropbox.configuration.refresh_token.validations", + "type": "Array", + "tags": [], + "label": "validations", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.dropbox.configuration.refresh_token.value", + "type": "string", + "tags": [], + "label": "value", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + } + ] + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.dropbox.configuration.retry_count", + "type": "Object", + "tags": [], + "label": "retry_count", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.dropbox.configuration.retry_count.default_value", + "type": "number", + "tags": [], + "label": "default_value", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.dropbox.configuration.retry_count.depends_on", + "type": "Array", + "tags": [], + "label": "depends_on", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.dropbox.configuration.retry_count.display", + "type": "string", + "tags": [], + "label": "display", + "description": [], + "signature": [ + { + "pluginId": "@kbn/search-connectors", + "scope": "common", + "docId": "kibKbnSearchConnectorsPluginApi", + "section": "def-common.DisplayType", + "text": "DisplayType" + }, + ".NUMERIC" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.dropbox.configuration.retry_count.label", + "type": "string", + "tags": [], + "label": "label", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.dropbox.configuration.retry_count.options", + "type": "Array", + "tags": [], + "label": "options", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.dropbox.configuration.retry_count.order", + "type": "number", + "tags": [], + "label": "order", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.dropbox.configuration.retry_count.required", + "type": "boolean", + "tags": [], + "label": "required", + "description": [], + "signature": [ + "false" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.dropbox.configuration.retry_count.sensitive", + "type": "boolean", + "tags": [], + "label": "sensitive", + "description": [], + "signature": [ + "false" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.dropbox.configuration.retry_count.tooltip", + "type": "Uncategorized", + "tags": [], + "label": "tooltip", + "description": [], + "signature": [ + "null" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.dropbox.configuration.retry_count.type", + "type": "string", + "tags": [], + "label": "type", + "description": [], + "signature": [ + { + "pluginId": "@kbn/search-connectors", + "scope": "common", + "docId": "kibKbnSearchConnectorsPluginApi", + "section": "def-common.FieldType", + "text": "FieldType" + }, + ".INTEGER" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.dropbox.configuration.retry_count.ui_restrictions", + "type": "Array", + "tags": [], + "label": "ui_restrictions", + "description": [], + "signature": [ + "string[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.dropbox.configuration.retry_count.validations", + "type": "Array", + "tags": [], + "label": "validations", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.dropbox.configuration.retry_count.value", + "type": "number", + "tags": [], + "label": "value", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + } + ] + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.dropbox.configuration.concurrent_downloads", + "type": "Object", + "tags": [], + "label": "concurrent_downloads", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.dropbox.configuration.concurrent_downloads.default_value", + "type": "number", + "tags": [], + "label": "default_value", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.dropbox.configuration.concurrent_downloads.depends_on", + "type": "Array", + "tags": [], + "label": "depends_on", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.dropbox.configuration.concurrent_downloads.display", + "type": "string", + "tags": [], + "label": "display", + "description": [], + "signature": [ + { + "pluginId": "@kbn/search-connectors", + "scope": "common", + "docId": "kibKbnSearchConnectorsPluginApi", + "section": "def-common.DisplayType", + "text": "DisplayType" + }, + ".NUMERIC" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.dropbox.configuration.concurrent_downloads.label", + "type": "string", + "tags": [], + "label": "label", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.dropbox.configuration.concurrent_downloads.options", + "type": "Array", + "tags": [], + "label": "options", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.dropbox.configuration.concurrent_downloads.order", + "type": "number", + "tags": [], + "label": "order", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.dropbox.configuration.concurrent_downloads.required", + "type": "boolean", + "tags": [], + "label": "required", + "description": [], + "signature": [ + "false" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.dropbox.configuration.concurrent_downloads.sensitive", + "type": "boolean", + "tags": [], + "label": "sensitive", + "description": [], + "signature": [ + "false" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.dropbox.configuration.concurrent_downloads.tooltip", + "type": "Uncategorized", + "tags": [], + "label": "tooltip", + "description": [], + "signature": [ + "null" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.dropbox.configuration.concurrent_downloads.type", + "type": "string", + "tags": [], + "label": "type", + "description": [], + "signature": [ + { + "pluginId": "@kbn/search-connectors", + "scope": "common", + "docId": "kibKbnSearchConnectorsPluginApi", + "section": "def-common.FieldType", + "text": "FieldType" + }, + ".INTEGER" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.dropbox.configuration.concurrent_downloads.ui_restrictions", + "type": "Array", + "tags": [], + "label": "ui_restrictions", + "description": [], + "signature": [ + "string[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.dropbox.configuration.concurrent_downloads.validations", + "type": "Array", + "tags": [], + "label": "validations", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.dropbox.configuration.concurrent_downloads.value", + "type": "number", + "tags": [], + "label": "value", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + } + ] + } + ] + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.dropbox.features", + "type": "Object", + "tags": [], + "label": "features", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.dropbox.features.FeatureName.SYNC_RULES", + "type": "Object", + "tags": [], + "label": "[FeatureName.SYNC_RULES]", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.dropbox.features.FeatureName.SYNC_RULES.advanced", + "type": "Object", + "tags": [], + "label": "advanced", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.dropbox.features.FeatureName.SYNC_RULES.advanced.enabled", + "type": "boolean", + "tags": [], + "label": "enabled", + "description": [], + "signature": [ + "true" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + } + ] + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.dropbox.features.FeatureName.SYNC_RULES.basic", + "type": "Object", + "tags": [], + "label": "basic", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.dropbox.features.FeatureName.SYNC_RULES.basic.enabled", + "type": "boolean", + "tags": [], + "label": "enabled", + "description": [], + "signature": [ + "true" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + } + ] + } + ] + } + ] + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.dropbox.name", + "type": "string", + "tags": [], + "label": "name", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.dropbox.serviceType", + "type": "string", + "tags": [], + "label": "serviceType", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + } + ] + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira", + "type": "Object", + "tags": [], + "label": "jira", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration", + "type": "Object", + "tags": [], + "label": "configuration", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.data_source", + "type": "Object", + "tags": [], + "label": "data_source", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.data_source.default_value", + "type": "Uncategorized", + "tags": [], + "label": "default_value", + "description": [], + "signature": [ + "null" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.data_source.depends_on", + "type": "Array", + "tags": [], + "label": "depends_on", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.data_source.display", + "type": "string", + "tags": [], + "label": "display", + "description": [], + "signature": [ + { + "pluginId": "@kbn/search-connectors", + "scope": "common", + "docId": "kibKbnSearchConnectorsPluginApi", + "section": "def-common.DisplayType", + "text": "DisplayType" + }, + ".DROPDOWN" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.data_source.label", + "type": "string", + "tags": [], + "label": "label", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.data_source.options", + "type": "Array", + "tags": [], + "label": "options", + "description": [], + "signature": [ + "{ label: string; value: string; }[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.data_source.order", + "type": "number", + "tags": [], + "label": "order", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.data_source.required", + "type": "boolean", + "tags": [], + "label": "required", + "description": [], + "signature": [ + "true" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.data_source.sensitive", + "type": "boolean", + "tags": [], + "label": "sensitive", + "description": [], + "signature": [ + "false" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.data_source.tooltip", + "type": "Uncategorized", + "tags": [], + "label": "tooltip", + "description": [], + "signature": [ + "null" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.data_source.type", + "type": "string", + "tags": [], + "label": "type", + "description": [], + "signature": [ + { + "pluginId": "@kbn/search-connectors", + "scope": "common", + "docId": "kibKbnSearchConnectorsPluginApi", + "section": "def-common.FieldType", + "text": "FieldType" + }, + ".STRING" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.data_source.ui_restrictions", + "type": "Array", + "tags": [], + "label": "ui_restrictions", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.data_source.validations", + "type": "Array", + "tags": [], + "label": "validations", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.data_source.value", + "type": "string", + "tags": [], + "label": "value", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + } + ] + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.username", + "type": "Object", + "tags": [], + "label": "username", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.username.default_value", + "type": "Uncategorized", + "tags": [], + "label": "default_value", + "description": [], + "signature": [ + "null" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.username.depends_on", + "type": "Array", + "tags": [], + "label": "depends_on", + "description": [], + "signature": [ + "{ field: string; value: string; }[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.username.display", + "type": "string", + "tags": [], + "label": "display", + "description": [], + "signature": [ + { + "pluginId": "@kbn/search-connectors", + "scope": "common", + "docId": "kibKbnSearchConnectorsPluginApi", + "section": "def-common.DisplayType", + "text": "DisplayType" + }, + ".TEXTBOX" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.username.label", + "type": "string", + "tags": [], + "label": "label", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.username.options", + "type": "Array", + "tags": [], + "label": "options", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.username.order", + "type": "number", + "tags": [], + "label": "order", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.username.required", + "type": "boolean", + "tags": [], + "label": "required", + "description": [], + "signature": [ + "true" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.username.sensitive", + "type": "boolean", + "tags": [], + "label": "sensitive", + "description": [], + "signature": [ + "false" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.username.tooltip", + "type": "Uncategorized", + "tags": [], + "label": "tooltip", + "description": [], + "signature": [ + "null" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.username.type", + "type": "string", + "tags": [], + "label": "type", + "description": [], + "signature": [ + { + "pluginId": "@kbn/search-connectors", + "scope": "common", + "docId": "kibKbnSearchConnectorsPluginApi", + "section": "def-common.FieldType", + "text": "FieldType" + }, + ".STRING" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.username.ui_restrictions", + "type": "Array", + "tags": [], + "label": "ui_restrictions", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.username.validations", + "type": "Array", + "tags": [], + "label": "validations", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.username.value", + "type": "string", + "tags": [], + "label": "value", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + } + ] + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.password", + "type": "Object", + "tags": [], + "label": "password", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.password.default_value", + "type": "Uncategorized", + "tags": [], + "label": "default_value", + "description": [], + "signature": [ + "null" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.password.depends_on", + "type": "Array", + "tags": [], + "label": "depends_on", + "description": [], + "signature": [ + "{ field: string; value: string; }[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.password.display", + "type": "string", + "tags": [], + "label": "display", + "description": [], + "signature": [ + { + "pluginId": "@kbn/search-connectors", + "scope": "common", + "docId": "kibKbnSearchConnectorsPluginApi", + "section": "def-common.DisplayType", + "text": "DisplayType" + }, + ".TEXTBOX" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.password.label", + "type": "string", + "tags": [], + "label": "label", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.password.options", + "type": "Array", + "tags": [], + "label": "options", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.password.order", + "type": "number", + "tags": [], + "label": "order", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.password.required", + "type": "boolean", + "tags": [], + "label": "required", + "description": [], + "signature": [ + "true" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.password.sensitive", + "type": "boolean", + "tags": [], + "label": "sensitive", + "description": [], + "signature": [ + "true" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.password.tooltip", + "type": "Uncategorized", + "tags": [], + "label": "tooltip", + "description": [], + "signature": [ + "null" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.password.type", + "type": "string", + "tags": [], + "label": "type", + "description": [], + "signature": [ + { + "pluginId": "@kbn/search-connectors", + "scope": "common", + "docId": "kibKbnSearchConnectorsPluginApi", + "section": "def-common.FieldType", + "text": "FieldType" + }, + ".STRING" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.password.ui_restrictions", + "type": "Array", + "tags": [], + "label": "ui_restrictions", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.password.validations", + "type": "Array", + "tags": [], + "label": "validations", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.password.value", + "type": "string", + "tags": [], + "label": "value", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + } + ] + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.account_email", + "type": "Object", + "tags": [], + "label": "account_email", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.account_email.default_value", + "type": "Uncategorized", + "tags": [], + "label": "default_value", + "description": [], + "signature": [ + "null" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.account_email.depends_on", + "type": "Array", + "tags": [], + "label": "depends_on", + "description": [], + "signature": [ + "{ field: string; value: string; }[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.account_email.display", + "type": "string", + "tags": [], + "label": "display", + "description": [], + "signature": [ + { + "pluginId": "@kbn/search-connectors", + "scope": "common", + "docId": "kibKbnSearchConnectorsPluginApi", + "section": "def-common.DisplayType", + "text": "DisplayType" + }, + ".TEXTBOX" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.account_email.label", + "type": "string", + "tags": [], + "label": "label", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.account_email.options", + "type": "Array", + "tags": [], + "label": "options", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.account_email.order", + "type": "number", + "tags": [], + "label": "order", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.account_email.placeholder", + "type": "string", + "tags": [], + "label": "placeholder", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.account_email.required", + "type": "boolean", + "tags": [], + "label": "required", + "description": [], + "signature": [ + "true" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.account_email.sensitive", + "type": "boolean", + "tags": [], + "label": "sensitive", + "description": [], + "signature": [ + "false" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.account_email.tooltip", + "type": "Uncategorized", + "tags": [], + "label": "tooltip", + "description": [], + "signature": [ + "null" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.account_email.type", + "type": "string", + "tags": [], + "label": "type", + "description": [], + "signature": [ + { + "pluginId": "@kbn/search-connectors", + "scope": "common", + "docId": "kibKbnSearchConnectorsPluginApi", + "section": "def-common.FieldType", + "text": "FieldType" + }, + ".STRING" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.account_email.ui_restrictions", + "type": "Array", + "tags": [], + "label": "ui_restrictions", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.account_email.validations", + "type": "Array", + "tags": [], + "label": "validations", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.account_email.value", + "type": "string", + "tags": [], + "label": "value", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + } + ] + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.api_token", + "type": "Object", + "tags": [], + "label": "api_token", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.api_token.default_value", + "type": "Uncategorized", + "tags": [], + "label": "default_value", + "description": [], + "signature": [ + "null" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.api_token.depends_on", + "type": "Array", + "tags": [], + "label": "depends_on", + "description": [], + "signature": [ + "{ field: string; value: string; }[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.api_token.display", + "type": "string", + "tags": [], + "label": "display", + "description": [], + "signature": [ + { + "pluginId": "@kbn/search-connectors", + "scope": "common", + "docId": "kibKbnSearchConnectorsPluginApi", + "section": "def-common.DisplayType", + "text": "DisplayType" + }, + ".TEXTBOX" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.api_token.label", + "type": "string", + "tags": [], + "label": "label", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.api_token.options", + "type": "Array", + "tags": [], + "label": "options", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.api_token.order", + "type": "number", + "tags": [], + "label": "order", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.api_token.required", + "type": "boolean", + "tags": [], + "label": "required", + "description": [], + "signature": [ + "true" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.api_token.sensitive", + "type": "boolean", + "tags": [], + "label": "sensitive", + "description": [], + "signature": [ + "true" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.api_token.tooltip", + "type": "Uncategorized", + "tags": [], + "label": "tooltip", + "description": [], + "signature": [ + "null" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.api_token.type", + "type": "string", + "tags": [], + "label": "type", + "description": [], + "signature": [ + { + "pluginId": "@kbn/search-connectors", + "scope": "common", + "docId": "kibKbnSearchConnectorsPluginApi", + "section": "def-common.FieldType", + "text": "FieldType" + }, + ".STRING" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.api_token.ui_restrictions", + "type": "Array", + "tags": [], + "label": "ui_restrictions", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.api_token.validations", + "type": "Array", + "tags": [], + "label": "validations", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.api_token.value", + "type": "string", + "tags": [], + "label": "value", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + } + ] + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.jira_url", + "type": "Object", + "tags": [], + "label": "jira_url", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.jira_url.default_value", + "type": "Uncategorized", + "tags": [], + "label": "default_value", + "description": [], + "signature": [ + "null" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.jira_url.depends_on", + "type": "Array", + "tags": [], + "label": "depends_on", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.jira_url.display", + "type": "string", + "tags": [], + "label": "display", + "description": [], + "signature": [ + { + "pluginId": "@kbn/search-connectors", + "scope": "common", + "docId": "kibKbnSearchConnectorsPluginApi", + "section": "def-common.DisplayType", + "text": "DisplayType" + }, + ".TEXTBOX" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.jira_url.label", + "type": "string", + "tags": [], + "label": "label", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.jira_url.options", + "type": "Array", + "tags": [], + "label": "options", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.jira_url.order", + "type": "number", + "tags": [], + "label": "order", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.jira_url.placeholder", + "type": "string", + "tags": [], + "label": "placeholder", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.jira_url.required", + "type": "boolean", + "tags": [], + "label": "required", + "description": [], + "signature": [ + "true" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.jira_url.sensitive", + "type": "boolean", + "tags": [], + "label": "sensitive", + "description": [], + "signature": [ + "false" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.jira_url.tooltip", + "type": "Uncategorized", + "tags": [], + "label": "tooltip", + "description": [], + "signature": [ + "null" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.jira_url.type", + "type": "string", + "tags": [], + "label": "type", + "description": [], + "signature": [ + { + "pluginId": "@kbn/search-connectors", + "scope": "common", + "docId": "kibKbnSearchConnectorsPluginApi", + "section": "def-common.FieldType", + "text": "FieldType" + }, + ".STRING" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.jira_url.ui_restrictions", + "type": "Array", + "tags": [], + "label": "ui_restrictions", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.jira_url.validations", + "type": "Array", + "tags": [], + "label": "validations", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.jira_url.value", + "type": "string", + "tags": [], + "label": "value", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + } + ] + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.projects", + "type": "Object", + "tags": [], + "label": "projects", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.projects.default_value", + "type": "Uncategorized", + "tags": [], + "label": "default_value", + "description": [], + "signature": [ + "null" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.projects.depends_on", + "type": "Array", + "tags": [], + "label": "depends_on", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.projects.display", + "type": "string", + "tags": [], + "label": "display", + "description": [], + "signature": [ + { + "pluginId": "@kbn/search-connectors", + "scope": "common", + "docId": "kibKbnSearchConnectorsPluginApi", + "section": "def-common.DisplayType", + "text": "DisplayType" + }, + ".TEXTAREA" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.projects.label", + "type": "string", + "tags": [], + "label": "label", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.projects.options", + "type": "Array", + "tags": [], + "label": "options", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.projects.order", + "type": "number", + "tags": [], + "label": "order", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.projects.required", + "type": "boolean", + "tags": [], + "label": "required", + "description": [], + "signature": [ + "true" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.projects.sensitive", + "type": "boolean", + "tags": [], + "label": "sensitive", + "description": [], + "signature": [ + "false" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.projects.tooltip", + "type": "string", + "tags": [], + "label": "tooltip", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.projects.type", + "type": "string", + "tags": [], + "label": "type", + "description": [], + "signature": [ + { + "pluginId": "@kbn/search-connectors", + "scope": "common", + "docId": "kibKbnSearchConnectorsPluginApi", + "section": "def-common.FieldType", + "text": "FieldType" + }, + ".LIST" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.projects.ui_restrictions", + "type": "Array", + "tags": [], + "label": "ui_restrictions", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.projects.validations", + "type": "Array", + "tags": [], + "label": "validations", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.projects.value", + "type": "string", + "tags": [], + "label": "value", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + } + ] + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.ssl_enabled", + "type": "Object", + "tags": [], + "label": "ssl_enabled", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.ssl_enabled.default_value", + "type": "Uncategorized", + "tags": [], + "label": "default_value", + "description": [], + "signature": [ + "null" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.ssl_enabled.depends_on", + "type": "Array", + "tags": [], + "label": "depends_on", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.ssl_enabled.display", + "type": "string", + "tags": [], + "label": "display", + "description": [], + "signature": [ + { + "pluginId": "@kbn/search-connectors", + "scope": "common", + "docId": "kibKbnSearchConnectorsPluginApi", + "section": "def-common.DisplayType", + "text": "DisplayType" + }, + ".TOGGLE" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.ssl_enabled.label", + "type": "string", + "tags": [], + "label": "label", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.ssl_enabled.options", + "type": "Array", + "tags": [], + "label": "options", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.ssl_enabled.order", + "type": "number", + "tags": [], + "label": "order", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.ssl_enabled.required", + "type": "boolean", + "tags": [], + "label": "required", + "description": [], + "signature": [ + "true" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.ssl_enabled.sensitive", + "type": "boolean", + "tags": [], + "label": "sensitive", + "description": [], + "signature": [ + "false" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.ssl_enabled.tooltip", + "type": "Uncategorized", + "tags": [], + "label": "tooltip", + "description": [], + "signature": [ + "null" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.ssl_enabled.type", + "type": "string", + "tags": [], + "label": "type", + "description": [], + "signature": [ + { + "pluginId": "@kbn/search-connectors", + "scope": "common", + "docId": "kibKbnSearchConnectorsPluginApi", + "section": "def-common.FieldType", + "text": "FieldType" + }, + ".BOOLEAN" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.ssl_enabled.ui_restrictions", + "type": "Array", + "tags": [], + "label": "ui_restrictions", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.ssl_enabled.validations", + "type": "Array", + "tags": [], + "label": "validations", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.ssl_enabled.value", + "type": "boolean", + "tags": [], + "label": "value", + "description": [], + "signature": [ + "false" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + } + ] + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.ssl_ca", + "type": "Object", + "tags": [], + "label": "ssl_ca", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.ssl_ca.default_value", + "type": "Uncategorized", + "tags": [], + "label": "default_value", + "description": [], + "signature": [ + "null" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.ssl_ca.depends_on", + "type": "Array", + "tags": [], + "label": "depends_on", + "description": [], + "signature": [ + "{ field: string; value: true; }[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.ssl_ca.display", + "type": "string", + "tags": [], + "label": "display", + "description": [], + "signature": [ + { + "pluginId": "@kbn/search-connectors", + "scope": "common", + "docId": "kibKbnSearchConnectorsPluginApi", + "section": "def-common.DisplayType", + "text": "DisplayType" + }, + ".TEXTBOX" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.ssl_ca.label", + "type": "string", + "tags": [], + "label": "label", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.ssl_ca.options", + "type": "Array", + "tags": [], + "label": "options", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.ssl_ca.order", + "type": "number", + "tags": [], + "label": "order", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.ssl_ca.required", + "type": "boolean", + "tags": [], + "label": "required", + "description": [], + "signature": [ + "true" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.ssl_ca.sensitive", + "type": "boolean", + "tags": [], + "label": "sensitive", + "description": [], + "signature": [ + "false" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.ssl_ca.tooltip", + "type": "Uncategorized", + "tags": [], + "label": "tooltip", + "description": [], + "signature": [ + "null" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.ssl_ca.type", + "type": "string", + "tags": [], + "label": "type", + "description": [], + "signature": [ + { + "pluginId": "@kbn/search-connectors", + "scope": "common", + "docId": "kibKbnSearchConnectorsPluginApi", + "section": "def-common.FieldType", + "text": "FieldType" + }, + ".STRING" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.ssl_ca.ui_restrictions", + "type": "Array", + "tags": [], + "label": "ui_restrictions", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.ssl_ca.validations", + "type": "Array", + "tags": [], + "label": "validations", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.ssl_ca.value", + "type": "string", + "tags": [], + "label": "value", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + } + ] + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.retry_count", + "type": "Object", + "tags": [], + "label": "retry_count", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.retry_count.default_value", + "type": "number", + "tags": [], + "label": "default_value", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.retry_count.depends_on", + "type": "Array", + "tags": [], + "label": "depends_on", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.retry_count.display", + "type": "string", + "tags": [], + "label": "display", + "description": [], + "signature": [ + { + "pluginId": "@kbn/search-connectors", + "scope": "common", + "docId": "kibKbnSearchConnectorsPluginApi", + "section": "def-common.DisplayType", + "text": "DisplayType" + }, + ".NUMERIC" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.retry_count.label", + "type": "string", + "tags": [], + "label": "label", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.retry_count.options", + "type": "Array", + "tags": [], + "label": "options", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.retry_count.order", + "type": "number", + "tags": [], + "label": "order", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.retry_count.required", + "type": "boolean", + "tags": [], + "label": "required", + "description": [], + "signature": [ + "false" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.retry_count.sensitive", + "type": "boolean", + "tags": [], + "label": "sensitive", + "description": [], + "signature": [ + "false" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.retry_count.tooltip", + "type": "Uncategorized", + "tags": [], + "label": "tooltip", + "description": [], + "signature": [ + "null" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.retry_count.type", + "type": "string", + "tags": [], + "label": "type", + "description": [], + "signature": [ + { + "pluginId": "@kbn/search-connectors", + "scope": "common", + "docId": "kibKbnSearchConnectorsPluginApi", + "section": "def-common.FieldType", + "text": "FieldType" + }, + ".INTEGER" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.retry_count.ui_restrictions", + "type": "Array", + "tags": [], + "label": "ui_restrictions", + "description": [], + "signature": [ + "string[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.retry_count.validations", + "type": "Array", + "tags": [], + "label": "validations", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.retry_count.value", + "type": "number", + "tags": [], + "label": "value", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + } + ] + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.concurrent_downloads", + "type": "Object", + "tags": [], + "label": "concurrent_downloads", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.concurrent_downloads.default_value", + "type": "number", + "tags": [], + "label": "default_value", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.concurrent_downloads.depends_on", + "type": "Array", + "tags": [], + "label": "depends_on", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.concurrent_downloads.display", + "type": "string", + "tags": [], + "label": "display", + "description": [], + "signature": [ + { + "pluginId": "@kbn/search-connectors", + "scope": "common", + "docId": "kibKbnSearchConnectorsPluginApi", + "section": "def-common.DisplayType", + "text": "DisplayType" + }, + ".NUMERIC" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.concurrent_downloads.label", + "type": "string", + "tags": [], + "label": "label", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.concurrent_downloads.options", + "type": "Array", + "tags": [], + "label": "options", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.concurrent_downloads.order", + "type": "number", + "tags": [], + "label": "order", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.concurrent_downloads.required", + "type": "boolean", + "tags": [], + "label": "required", + "description": [], + "signature": [ + "false" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.concurrent_downloads.sensitive", + "type": "boolean", + "tags": [], + "label": "sensitive", + "description": [], + "signature": [ + "false" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.concurrent_downloads.tooltip", + "type": "Uncategorized", + "tags": [], + "label": "tooltip", + "description": [], + "signature": [ + "null" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.concurrent_downloads.type", + "type": "string", + "tags": [], + "label": "type", + "description": [], + "signature": [ + { + "pluginId": "@kbn/search-connectors", + "scope": "common", + "docId": "kibKbnSearchConnectorsPluginApi", + "section": "def-common.FieldType", + "text": "FieldType" + }, + ".INTEGER" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.concurrent_downloads.ui_restrictions", + "type": "Array", + "tags": [], + "label": "ui_restrictions", + "description": [], + "signature": [ + "string[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.concurrent_downloads.validations", + "type": "Array", + "tags": [], + "label": "validations", + "description": [], + "signature": [ + "{ type: string; constraint: number; }[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.configuration.concurrent_downloads.value", + "type": "number", + "tags": [], + "label": "value", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + } + ] + } + ] + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.features", + "type": "Object", + "tags": [], + "label": "features", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.features.FeatureName.SYNC_RULES", + "type": "Object", + "tags": [], + "label": "[FeatureName.SYNC_RULES]", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.features.FeatureName.SYNC_RULES.advanced", + "type": "Object", + "tags": [], + "label": "advanced", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.features.FeatureName.SYNC_RULES.advanced.enabled", + "type": "boolean", + "tags": [], + "label": "enabled", + "description": [], + "signature": [ + "true" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + } + ] + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.features.FeatureName.SYNC_RULES.basic", + "type": "Object", + "tags": [], + "label": "basic", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.features.FeatureName.SYNC_RULES.basic.enabled", + "type": "boolean", + "tags": [], + "label": "enabled", + "description": [], + "signature": [ + "true" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + } + ] + } + ] + } + ] + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.name", + "type": "string", + "tags": [], + "label": "name", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.jira.serviceType", + "type": "string", + "tags": [], + "label": "serviceType", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + } + ] + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mongodb", + "type": "Object", + "tags": [], + "label": "mongodb", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mongodb.configuration", + "type": "Object", + "tags": [], + "label": "configuration", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mongodb.configuration.host", + "type": "Object", + "tags": [], + "label": "host", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mongodb.configuration.host.default_value", + "type": "string", + "tags": [], + "label": "default_value", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mongodb.configuration.host.depends_on", + "type": "Array", + "tags": [], + "label": "depends_on", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mongodb.configuration.host.display", + "type": "string", + "tags": [], + "label": "display", + "description": [], + "signature": [ + { + "pluginId": "@kbn/search-connectors", + "scope": "common", + "docId": "kibKbnSearchConnectorsPluginApi", + "section": "def-common.DisplayType", + "text": "DisplayType" + }, + ".TEXTBOX" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mongodb.configuration.host.label", + "type": "string", + "tags": [], + "label": "label", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mongodb.configuration.host.options", + "type": "Array", + "tags": [], + "label": "options", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mongodb.configuration.host.order", + "type": "number", + "tags": [], + "label": "order", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mongodb.configuration.host.required", + "type": "boolean", + "tags": [], + "label": "required", + "description": [], + "signature": [ + "true" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mongodb.configuration.host.sensitive", + "type": "boolean", + "tags": [], + "label": "sensitive", + "description": [], + "signature": [ + "false" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mongodb.configuration.host.tooltip", + "type": "string", + "tags": [], + "label": "tooltip", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mongodb.configuration.host.type", + "type": "string", + "tags": [], + "label": "type", + "description": [], + "signature": [ + { + "pluginId": "@kbn/search-connectors", + "scope": "common", + "docId": "kibKbnSearchConnectorsPluginApi", + "section": "def-common.FieldType", + "text": "FieldType" + }, + ".STRING" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mongodb.configuration.host.ui_restrictions", + "type": "Array", + "tags": [], + "label": "ui_restrictions", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mongodb.configuration.host.validations", + "type": "Array", + "tags": [], + "label": "validations", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mongodb.configuration.host.value", + "type": "string", + "tags": [], + "label": "value", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + } + ] + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mongodb.configuration.user", + "type": "Object", + "tags": [], + "label": "user", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mongodb.configuration.user.default_value", + "type": "string", + "tags": [], + "label": "default_value", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mongodb.configuration.user.depends_on", + "type": "Array", + "tags": [], + "label": "depends_on", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mongodb.configuration.user.display", + "type": "string", + "tags": [], + "label": "display", + "description": [], + "signature": [ + { + "pluginId": "@kbn/search-connectors", + "scope": "common", + "docId": "kibKbnSearchConnectorsPluginApi", + "section": "def-common.DisplayType", + "text": "DisplayType" + }, + ".TEXTBOX" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mongodb.configuration.user.label", + "type": "string", + "tags": [], + "label": "label", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mongodb.configuration.user.options", + "type": "Array", + "tags": [], + "label": "options", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mongodb.configuration.user.order", + "type": "number", + "tags": [], + "label": "order", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mongodb.configuration.user.required", + "type": "boolean", + "tags": [], + "label": "required", + "description": [], + "signature": [ + "false" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mongodb.configuration.user.sensitive", + "type": "boolean", + "tags": [], + "label": "sensitive", + "description": [], + "signature": [ + "false" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mongodb.configuration.user.tooltip", + "type": "string", + "tags": [], + "label": "tooltip", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mongodb.configuration.user.type", + "type": "string", + "tags": [], + "label": "type", + "description": [], + "signature": [ + { + "pluginId": "@kbn/search-connectors", + "scope": "common", + "docId": "kibKbnSearchConnectorsPluginApi", + "section": "def-common.FieldType", + "text": "FieldType" + }, + ".STRING" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mongodb.configuration.user.ui_restrictions", + "type": "Array", + "tags": [], + "label": "ui_restrictions", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mongodb.configuration.user.validations", + "type": "Array", + "tags": [], + "label": "validations", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mongodb.configuration.user.value", + "type": "string", + "tags": [], + "label": "value", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + } + ] + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mongodb.configuration.password", + "type": "Object", + "tags": [], + "label": "password", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mongodb.configuration.password.default_value", + "type": "string", + "tags": [], + "label": "default_value", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mongodb.configuration.password.depends_on", + "type": "Array", + "tags": [], + "label": "depends_on", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mongodb.configuration.password.display", + "type": "string", + "tags": [], + "label": "display", + "description": [], + "signature": [ + { + "pluginId": "@kbn/search-connectors", + "scope": "common", + "docId": "kibKbnSearchConnectorsPluginApi", + "section": "def-common.DisplayType", + "text": "DisplayType" + }, + ".TEXTBOX" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mongodb.configuration.password.label", + "type": "string", + "tags": [], + "label": "label", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mongodb.configuration.password.options", + "type": "Array", + "tags": [], + "label": "options", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mongodb.configuration.password.order", + "type": "number", + "tags": [], + "label": "order", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mongodb.configuration.password.required", + "type": "boolean", + "tags": [], + "label": "required", + "description": [], + "signature": [ + "false" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mongodb.configuration.password.sensitive", + "type": "boolean", + "tags": [], + "label": "sensitive", + "description": [], + "signature": [ + "true" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mongodb.configuration.password.tooltip", + "type": "string", + "tags": [], + "label": "tooltip", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mongodb.configuration.password.type", + "type": "string", + "tags": [], + "label": "type", + "description": [], + "signature": [ + { + "pluginId": "@kbn/search-connectors", + "scope": "common", + "docId": "kibKbnSearchConnectorsPluginApi", + "section": "def-common.FieldType", + "text": "FieldType" + }, + ".STRING" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mongodb.configuration.password.ui_restrictions", + "type": "Array", + "tags": [], + "label": "ui_restrictions", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mongodb.configuration.password.validations", + "type": "Array", + "tags": [], + "label": "validations", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mongodb.configuration.password.value", + "type": "string", + "tags": [], + "label": "value", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + } + ] + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mongodb.configuration.database", + "type": "Object", + "tags": [], + "label": "database", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mongodb.configuration.database.default_value", + "type": "string", + "tags": [], + "label": "default_value", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mongodb.configuration.database.depends_on", + "type": "Array", + "tags": [], + "label": "depends_on", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mongodb.configuration.database.display", + "type": "string", + "tags": [], + "label": "display", + "description": [], + "signature": [ + { + "pluginId": "@kbn/search-connectors", + "scope": "common", + "docId": "kibKbnSearchConnectorsPluginApi", + "section": "def-common.DisplayType", + "text": "DisplayType" + }, + ".TEXTBOX" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mongodb.configuration.database.label", + "type": "string", + "tags": [], + "label": "label", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mongodb.configuration.database.options", + "type": "Array", + "tags": [], + "label": "options", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mongodb.configuration.database.order", + "type": "number", + "tags": [], + "label": "order", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mongodb.configuration.database.required", + "type": "boolean", + "tags": [], + "label": "required", + "description": [], + "signature": [ + "true" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mongodb.configuration.database.sensitive", + "type": "boolean", + "tags": [], + "label": "sensitive", + "description": [], + "signature": [ + "false" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mongodb.configuration.database.tooltip", + "type": "string", + "tags": [], + "label": "tooltip", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mongodb.configuration.database.type", + "type": "string", + "tags": [], + "label": "type", + "description": [], + "signature": [ + { + "pluginId": "@kbn/search-connectors", + "scope": "common", + "docId": "kibKbnSearchConnectorsPluginApi", + "section": "def-common.FieldType", + "text": "FieldType" + }, + ".STRING" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mongodb.configuration.database.ui_restrictions", + "type": "Array", + "tags": [], + "label": "ui_restrictions", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mongodb.configuration.database.validations", + "type": "Array", + "tags": [], + "label": "validations", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mongodb.configuration.database.value", + "type": "string", + "tags": [], + "label": "value", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + } + ] + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mongodb.configuration.collection", + "type": "Object", + "tags": [], + "label": "collection", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mongodb.configuration.collection.default_value", + "type": "string", + "tags": [], + "label": "default_value", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mongodb.configuration.collection.depends_on", + "type": "Array", + "tags": [], + "label": "depends_on", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mongodb.configuration.collection.display", + "type": "string", + "tags": [], + "label": "display", + "description": [], + "signature": [ + { + "pluginId": "@kbn/search-connectors", + "scope": "common", + "docId": "kibKbnSearchConnectorsPluginApi", + "section": "def-common.DisplayType", + "text": "DisplayType" + }, + ".TEXTBOX" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mongodb.configuration.collection.label", + "type": "string", + "tags": [], + "label": "label", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mongodb.configuration.collection.options", + "type": "Array", + "tags": [], + "label": "options", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mongodb.configuration.collection.order", + "type": "number", + "tags": [], + "label": "order", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mongodb.configuration.collection.required", + "type": "boolean", + "tags": [], + "label": "required", + "description": [], + "signature": [ + "true" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mongodb.configuration.collection.sensitive", + "type": "boolean", + "tags": [], + "label": "sensitive", + "description": [], + "signature": [ + "false" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mongodb.configuration.collection.tooltip", + "type": "string", + "tags": [], + "label": "tooltip", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mongodb.configuration.collection.type", + "type": "string", + "tags": [], + "label": "type", + "description": [], + "signature": [ + { + "pluginId": "@kbn/search-connectors", + "scope": "common", + "docId": "kibKbnSearchConnectorsPluginApi", + "section": "def-common.FieldType", + "text": "FieldType" + }, + ".STRING" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mongodb.configuration.collection.ui_restrictions", + "type": "Array", + "tags": [], + "label": "ui_restrictions", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mongodb.configuration.collection.validations", + "type": "Array", + "tags": [], + "label": "validations", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mongodb.configuration.collection.value", + "type": "string", + "tags": [], + "label": "value", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + } + ] + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mongodb.configuration.direct_connection", + "type": "Object", + "tags": [], + "label": "direct_connection", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mongodb.configuration.direct_connection.default_value", + "type": "boolean", + "tags": [], + "label": "default_value", + "description": [], + "signature": [ + "false" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mongodb.configuration.direct_connection.depends_on", + "type": "Array", + "tags": [], + "label": "depends_on", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mongodb.configuration.direct_connection.display", + "type": "string", + "tags": [], + "label": "display", + "description": [], + "signature": [ + { + "pluginId": "@kbn/search-connectors", + "scope": "common", + "docId": "kibKbnSearchConnectorsPluginApi", + "section": "def-common.DisplayType", + "text": "DisplayType" + }, + ".TOGGLE" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mongodb.configuration.direct_connection.label", + "type": "string", + "tags": [], + "label": "label", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mongodb.configuration.direct_connection.options", + "type": "Array", + "tags": [], + "label": "options", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mongodb.configuration.direct_connection.order", + "type": "number", + "tags": [], + "label": "order", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mongodb.configuration.direct_connection.required", + "type": "boolean", + "tags": [], + "label": "required", + "description": [], + "signature": [ + "true" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mongodb.configuration.direct_connection.sensitive", + "type": "boolean", + "tags": [], + "label": "sensitive", + "description": [], + "signature": [ + "false" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mongodb.configuration.direct_connection.tooltip", + "type": "string", + "tags": [], + "label": "tooltip", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mongodb.configuration.direct_connection.type", + "type": "string", + "tags": [], + "label": "type", + "description": [], + "signature": [ + { + "pluginId": "@kbn/search-connectors", + "scope": "common", + "docId": "kibKbnSearchConnectorsPluginApi", + "section": "def-common.FieldType", + "text": "FieldType" + }, + ".BOOLEAN" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mongodb.configuration.direct_connection.ui_restrictions", + "type": "Array", + "tags": [], + "label": "ui_restrictions", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mongodb.configuration.direct_connection.validations", + "type": "Array", + "tags": [], + "label": "validations", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mongodb.configuration.direct_connection.value", + "type": "boolean", + "tags": [], + "label": "value", + "description": [], + "signature": [ + "false" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + } + ] + } + ] + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mongodb.features", + "type": "Object", + "tags": [], + "label": "features", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mongodb.features.FeatureName.FILTERING_ADVANCED_CONFIG", + "type": "boolean", + "tags": [], + "label": "[FeatureName.FILTERING_ADVANCED_CONFIG]", + "description": [], + "signature": [ + "true" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mongodb.features.FeatureName.FILTERING_RULES", + "type": "boolean", + "tags": [], + "label": "[FeatureName.FILTERING_RULES]", + "description": [], + "signature": [ + "true" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mongodb.features.FeatureName.SYNC_RULES", + "type": "Object", + "tags": [], + "label": "[FeatureName.SYNC_RULES]", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mongodb.features.FeatureName.SYNC_RULES.advanced", + "type": "Object", + "tags": [], + "label": "advanced", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mongodb.features.FeatureName.SYNC_RULES.advanced.enabled", + "type": "boolean", + "tags": [], + "label": "enabled", + "description": [], + "signature": [ + "true" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + } + ] + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mongodb.features.FeatureName.SYNC_RULES.basic", + "type": "Object", + "tags": [], + "label": "basic", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mongodb.features.FeatureName.SYNC_RULES.basic.enabled", + "type": "boolean", + "tags": [], + "label": "enabled", + "description": [], + "signature": [ + "true" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + } + ] + } + ] + } + ] + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mongodb.name", + "type": "string", + "tags": [], + "label": "name", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mongodb.serviceType", + "type": "string", + "tags": [], + "label": "serviceType", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + } + ] + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql", + "type": "Object", + "tags": [], + "label": "mssql", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration", + "type": "Object", + "tags": [], + "label": "configuration", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.host", + "type": "Object", + "tags": [], + "label": "host", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.host.default_value", + "type": "string", + "tags": [], + "label": "default_value", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.host.depends_on", + "type": "Array", + "tags": [], + "label": "depends_on", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.host.display", + "type": "string", + "tags": [], + "label": "display", + "description": [], + "signature": [ + { + "pluginId": "@kbn/search-connectors", + "scope": "common", + "docId": "kibKbnSearchConnectorsPluginApi", + "section": "def-common.DisplayType", + "text": "DisplayType" + }, + ".TEXTBOX" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.host.label", + "type": "string", + "tags": [], + "label": "label", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.host.options", + "type": "Array", + "tags": [], + "label": "options", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.host.order", + "type": "number", + "tags": [], + "label": "order", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.host.required", + "type": "boolean", + "tags": [], + "label": "required", + "description": [], + "signature": [ + "true" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.host.sensitive", + "type": "boolean", + "tags": [], + "label": "sensitive", + "description": [], + "signature": [ + "false" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.host.tooltip", + "type": "string", + "tags": [], + "label": "tooltip", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.host.type", + "type": "string", + "tags": [], + "label": "type", + "description": [], + "signature": [ + { + "pluginId": "@kbn/search-connectors", + "scope": "common", + "docId": "kibKbnSearchConnectorsPluginApi", + "section": "def-common.FieldType", + "text": "FieldType" + }, + ".STRING" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.host.ui_restrictions", + "type": "Array", + "tags": [], + "label": "ui_restrictions", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.host.validations", + "type": "Array", + "tags": [], + "label": "validations", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.host.value", + "type": "string", + "tags": [], + "label": "value", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + } + ] + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.port", + "type": "Object", + "tags": [], + "label": "port", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.port.default_value", + "type": "Uncategorized", + "tags": [], + "label": "default_value", + "description": [], + "signature": [ + "null" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.port.depends_on", + "type": "Array", + "tags": [], + "label": "depends_on", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.port.display", + "type": "string", + "tags": [], + "label": "display", + "description": [], + "signature": [ + { + "pluginId": "@kbn/search-connectors", + "scope": "common", + "docId": "kibKbnSearchConnectorsPluginApi", + "section": "def-common.DisplayType", + "text": "DisplayType" + }, + ".NUMERIC" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.port.label", + "type": "string", + "tags": [], + "label": "label", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.port.options", + "type": "Array", + "tags": [], + "label": "options", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.port.order", + "type": "number", + "tags": [], + "label": "order", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.port.required", + "type": "boolean", + "tags": [], + "label": "required", + "description": [], + "signature": [ + "true" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.port.sensitive", + "type": "boolean", + "tags": [], + "label": "sensitive", + "description": [], + "signature": [ + "false" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.port.tooltip", + "type": "string", + "tags": [], + "label": "tooltip", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.port.type", + "type": "string", + "tags": [], + "label": "type", + "description": [], + "signature": [ + { + "pluginId": "@kbn/search-connectors", + "scope": "common", + "docId": "kibKbnSearchConnectorsPluginApi", + "section": "def-common.FieldType", + "text": "FieldType" + }, + ".INTEGER" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.port.ui_restrictions", + "type": "Array", + "tags": [], + "label": "ui_restrictions", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.port.validations", + "type": "Array", + "tags": [], + "label": "validations", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.port.value", + "type": "number", + "tags": [], + "label": "value", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + } + ] + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.username", + "type": "Object", + "tags": [], + "label": "username", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.username.default_value", + "type": "string", + "tags": [], + "label": "default_value", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.username.depends_on", + "type": "Array", + "tags": [], + "label": "depends_on", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.username.display", + "type": "string", + "tags": [], + "label": "display", + "description": [], + "signature": [ + { + "pluginId": "@kbn/search-connectors", + "scope": "common", + "docId": "kibKbnSearchConnectorsPluginApi", + "section": "def-common.DisplayType", + "text": "DisplayType" + }, + ".TEXTBOX" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.username.label", + "type": "string", + "tags": [], + "label": "label", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.username.options", + "type": "Array", + "tags": [], + "label": "options", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.username.order", + "type": "number", + "tags": [], + "label": "order", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.username.required", + "type": "boolean", + "tags": [], + "label": "required", + "description": [], + "signature": [ + "true" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.username.sensitive", + "type": "boolean", + "tags": [], + "label": "sensitive", + "description": [], + "signature": [ + "false" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.username.tooltip", + "type": "string", + "tags": [], + "label": "tooltip", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.username.type", + "type": "string", + "tags": [], + "label": "type", + "description": [], + "signature": [ + { + "pluginId": "@kbn/search-connectors", + "scope": "common", + "docId": "kibKbnSearchConnectorsPluginApi", + "section": "def-common.FieldType", + "text": "FieldType" + }, + ".STRING" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.username.ui_restrictions", + "type": "Array", + "tags": [], + "label": "ui_restrictions", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.username.validations", + "type": "Array", + "tags": [], + "label": "validations", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.username.value", + "type": "string", + "tags": [], + "label": "value", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + } + ] + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.password", + "type": "Object", + "tags": [], + "label": "password", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.password.default_value", + "type": "string", + "tags": [], + "label": "default_value", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.password.depends_on", + "type": "Array", + "tags": [], + "label": "depends_on", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.password.display", + "type": "string", + "tags": [], + "label": "display", + "description": [], + "signature": [ + { + "pluginId": "@kbn/search-connectors", + "scope": "common", + "docId": "kibKbnSearchConnectorsPluginApi", + "section": "def-common.DisplayType", + "text": "DisplayType" + }, + ".TEXTBOX" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.password.label", + "type": "string", + "tags": [], + "label": "label", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.password.options", + "type": "Array", + "tags": [], + "label": "options", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.password.order", + "type": "number", + "tags": [], + "label": "order", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.password.required", + "type": "boolean", + "tags": [], + "label": "required", + "description": [], + "signature": [ + "true" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.password.sensitive", + "type": "boolean", + "tags": [], + "label": "sensitive", + "description": [], + "signature": [ + "true" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.password.tooltip", + "type": "string", + "tags": [], + "label": "tooltip", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.password.type", + "type": "string", + "tags": [], + "label": "type", + "description": [], + "signature": [ + { + "pluginId": "@kbn/search-connectors", + "scope": "common", + "docId": "kibKbnSearchConnectorsPluginApi", + "section": "def-common.FieldType", + "text": "FieldType" + }, + ".STRING" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.password.ui_restrictions", + "type": "Array", + "tags": [], + "label": "ui_restrictions", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.password.validations", + "type": "Array", + "tags": [], + "label": "validations", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.password.value", + "type": "string", + "tags": [], + "label": "value", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + } + ] + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.database", + "type": "Object", + "tags": [], + "label": "database", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.database.default_value", + "type": "string", + "tags": [], + "label": "default_value", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.database.depends_on", + "type": "Array", + "tags": [], + "label": "depends_on", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.database.display", + "type": "string", + "tags": [], + "label": "display", + "description": [], + "signature": [ + { + "pluginId": "@kbn/search-connectors", + "scope": "common", + "docId": "kibKbnSearchConnectorsPluginApi", + "section": "def-common.DisplayType", + "text": "DisplayType" + }, + ".TEXTBOX" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.database.label", + "type": "string", + "tags": [], + "label": "label", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.database.options", + "type": "Array", + "tags": [], + "label": "options", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.database.order", + "type": "number", + "tags": [], + "label": "order", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.database.required", + "type": "boolean", + "tags": [], + "label": "required", + "description": [], + "signature": [ + "true" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.database.sensitive", + "type": "boolean", + "tags": [], + "label": "sensitive", + "description": [], + "signature": [ + "false" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.database.tooltip", + "type": "string", + "tags": [], + "label": "tooltip", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.database.type", + "type": "string", + "tags": [], + "label": "type", + "description": [], + "signature": [ + { + "pluginId": "@kbn/search-connectors", + "scope": "common", + "docId": "kibKbnSearchConnectorsPluginApi", + "section": "def-common.FieldType", + "text": "FieldType" + }, + ".STRING" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.database.ui_restrictions", + "type": "Array", + "tags": [], + "label": "ui_restrictions", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.database.validations", + "type": "Array", + "tags": [], + "label": "validations", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.database.value", + "type": "string", + "tags": [], + "label": "value", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + } + ] + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.tables", + "type": "Object", + "tags": [], + "label": "tables", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.tables.default_value", + "type": "string", + "tags": [], + "label": "default_value", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.tables.depends_on", + "type": "Array", + "tags": [], + "label": "depends_on", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.tables.display", + "type": "string", + "tags": [], + "label": "display", + "description": [], + "signature": [ + { + "pluginId": "@kbn/search-connectors", + "scope": "common", + "docId": "kibKbnSearchConnectorsPluginApi", + "section": "def-common.DisplayType", + "text": "DisplayType" + }, + ".TEXTAREA" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.tables.label", + "type": "string", + "tags": [], + "label": "label", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.tables.options", + "type": "Array", + "tags": [], + "label": "options", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.tables.order", + "type": "number", + "tags": [], + "label": "order", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.tables.required", + "type": "boolean", + "tags": [], + "label": "required", + "description": [], + "signature": [ + "true" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.tables.sensitive", + "type": "boolean", + "tags": [], + "label": "sensitive", + "description": [], + "signature": [ + "false" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.tables.tooltip", + "type": "string", + "tags": [], + "label": "tooltip", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.tables.type", + "type": "string", + "tags": [], + "label": "type", + "description": [], + "signature": [ + { + "pluginId": "@kbn/search-connectors", + "scope": "common", + "docId": "kibKbnSearchConnectorsPluginApi", + "section": "def-common.FieldType", + "text": "FieldType" + }, + ".LIST" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.tables.ui_restrictions", + "type": "Array", + "tags": [], + "label": "ui_restrictions", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.tables.validations", + "type": "Array", + "tags": [], + "label": "validations", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.tables.value", + "type": "string", + "tags": [], + "label": "value", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + } + ] + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.ssl_enabled", + "type": "Object", + "tags": [], + "label": "ssl_enabled", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.ssl_enabled.default_value", + "type": "boolean", + "tags": [], + "label": "default_value", + "description": [], + "signature": [ + "false" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.ssl_enabled.depends_on", + "type": "Array", + "tags": [], + "label": "depends_on", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.ssl_enabled.display", + "type": "string", + "tags": [], + "label": "display", + "description": [], + "signature": [ + { + "pluginId": "@kbn/search-connectors", + "scope": "common", + "docId": "kibKbnSearchConnectorsPluginApi", + "section": "def-common.DisplayType", + "text": "DisplayType" + }, + ".TOGGLE" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.ssl_enabled.label", + "type": "string", + "tags": [], + "label": "label", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.ssl_enabled.options", + "type": "Array", + "tags": [], + "label": "options", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.ssl_enabled.order", + "type": "number", + "tags": [], + "label": "order", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.ssl_enabled.required", + "type": "boolean", + "tags": [], + "label": "required", + "description": [], + "signature": [ + "true" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.ssl_enabled.sensitive", + "type": "boolean", + "tags": [], + "label": "sensitive", + "description": [], + "signature": [ + "false" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.ssl_enabled.tooltip", + "type": "string", + "tags": [], + "label": "tooltip", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.ssl_enabled.type", + "type": "string", + "tags": [], + "label": "type", + "description": [], + "signature": [ + { + "pluginId": "@kbn/search-connectors", + "scope": "common", + "docId": "kibKbnSearchConnectorsPluginApi", + "section": "def-common.FieldType", + "text": "FieldType" + }, + ".BOOLEAN" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.ssl_enabled.ui_restrictions", + "type": "Array", + "tags": [], + "label": "ui_restrictions", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.ssl_enabled.validations", + "type": "Array", + "tags": [], + "label": "validations", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.ssl_enabled.value", + "type": "boolean", + "tags": [], + "label": "value", + "description": [], + "signature": [ + "false" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + } + ] + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.ssl_ca", + "type": "Object", + "tags": [], + "label": "ssl_ca", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.ssl_ca.default_value", + "type": "string", + "tags": [], + "label": "default_value", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.ssl_ca.depends_on", + "type": "Array", + "tags": [], + "label": "depends_on", + "description": [], + "signature": [ + "{ field: string; value: true; }[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.ssl_ca.display", + "type": "string", + "tags": [], + "label": "display", + "description": [], + "signature": [ + { + "pluginId": "@kbn/search-connectors", + "scope": "common", + "docId": "kibKbnSearchConnectorsPluginApi", + "section": "def-common.DisplayType", + "text": "DisplayType" + }, + ".TEXTBOX" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.ssl_ca.label", + "type": "string", + "tags": [], + "label": "label", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.ssl_ca.options", + "type": "Array", + "tags": [], + "label": "options", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.ssl_ca.order", + "type": "number", + "tags": [], + "label": "order", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.ssl_ca.required", + "type": "boolean", + "tags": [], + "label": "required", + "description": [], + "signature": [ + "true" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.ssl_ca.sensitive", + "type": "boolean", + "tags": [], + "label": "sensitive", + "description": [], + "signature": [ + "false" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.ssl_ca.tooltip", + "type": "string", + "tags": [], + "label": "tooltip", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.ssl_ca.type", + "type": "string", + "tags": [], + "label": "type", + "description": [], + "signature": [ + { + "pluginId": "@kbn/search-connectors", + "scope": "common", + "docId": "kibKbnSearchConnectorsPluginApi", + "section": "def-common.FieldType", + "text": "FieldType" + }, + ".STRING" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.ssl_ca.ui_restrictions", + "type": "Array", + "tags": [], + "label": "ui_restrictions", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.ssl_ca.validations", + "type": "Array", + "tags": [], + "label": "validations", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.ssl_ca.value", + "type": "string", + "tags": [], + "label": "value", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + } + ] + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.schema", + "type": "Object", + "tags": [], + "label": "schema", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.schema.default_value", + "type": "string", + "tags": [], + "label": "default_value", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.schema.depends_on", + "type": "Array", + "tags": [], + "label": "depends_on", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.schema.display", + "type": "string", + "tags": [], + "label": "display", + "description": [], + "signature": [ + { + "pluginId": "@kbn/search-connectors", + "scope": "common", + "docId": "kibKbnSearchConnectorsPluginApi", + "section": "def-common.DisplayType", + "text": "DisplayType" + }, + ".TEXTBOX" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.schema.label", + "type": "string", + "tags": [], + "label": "label", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.schema.options", + "type": "Array", + "tags": [], + "label": "options", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.schema.order", + "type": "number", + "tags": [], + "label": "order", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.schema.required", + "type": "boolean", + "tags": [], + "label": "required", + "description": [], + "signature": [ + "true" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.schema.sensitive", + "type": "boolean", + "tags": [], + "label": "sensitive", + "description": [], + "signature": [ + "false" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.schema.tooltip", + "type": "string", + "tags": [], + "label": "tooltip", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.schema.type", + "type": "string", + "tags": [], + "label": "type", + "description": [], + "signature": [ + { + "pluginId": "@kbn/search-connectors", + "scope": "common", + "docId": "kibKbnSearchConnectorsPluginApi", + "section": "def-common.FieldType", + "text": "FieldType" + }, + ".STRING" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.schema.ui_restrictions", + "type": "Array", + "tags": [], + "label": "ui_restrictions", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.schema.validations", + "type": "Array", + "tags": [], + "label": "validations", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.schema.value", + "type": "string", + "tags": [], + "label": "value", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + } + ] + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.fetch_size", + "type": "Object", + "tags": [], + "label": "fetch_size", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.fetch_size.default_value", + "type": "number", + "tags": [], + "label": "default_value", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.fetch_size.depends_on", + "type": "Array", + "tags": [], + "label": "depends_on", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.fetch_size.display", + "type": "string", + "tags": [], + "label": "display", + "description": [], + "signature": [ + { + "pluginId": "@kbn/search-connectors", + "scope": "common", + "docId": "kibKbnSearchConnectorsPluginApi", + "section": "def-common.DisplayType", + "text": "DisplayType" + }, + ".NUMERIC" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.fetch_size.label", + "type": "string", + "tags": [], + "label": "label", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.fetch_size.options", + "type": "Array", + "tags": [], + "label": "options", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.fetch_size.order", + "type": "number", + "tags": [], + "label": "order", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.fetch_size.required", + "type": "boolean", + "tags": [], + "label": "required", + "description": [], + "signature": [ + "false" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.fetch_size.sensitive", + "type": "boolean", + "tags": [], + "label": "sensitive", + "description": [], + "signature": [ + "false" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.fetch_size.tooltip", + "type": "string", + "tags": [], + "label": "tooltip", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.fetch_size.type", + "type": "string", + "tags": [], + "label": "type", + "description": [], + "signature": [ + { + "pluginId": "@kbn/search-connectors", + "scope": "common", + "docId": "kibKbnSearchConnectorsPluginApi", + "section": "def-common.FieldType", + "text": "FieldType" + }, + ".INTEGER" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.fetch_size.ui_restrictions", + "type": "Array", + "tags": [], + "label": "ui_restrictions", + "description": [], + "signature": [ + "string[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.fetch_size.validations", + "type": "Array", + "tags": [], + "label": "validations", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.fetch_size.value", + "type": "number", + "tags": [], + "label": "value", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + } + ] + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.retry_count", + "type": "Object", + "tags": [], + "label": "retry_count", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.retry_count.default_value", + "type": "number", + "tags": [], + "label": "default_value", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.retry_count.depends_on", + "type": "Array", + "tags": [], + "label": "depends_on", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.retry_count.display", + "type": "string", + "tags": [], + "label": "display", + "description": [], + "signature": [ + { + "pluginId": "@kbn/search-connectors", + "scope": "common", + "docId": "kibKbnSearchConnectorsPluginApi", + "section": "def-common.DisplayType", + "text": "DisplayType" + }, + ".NUMERIC" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.retry_count.label", + "type": "string", + "tags": [], + "label": "label", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.retry_count.options", + "type": "Array", + "tags": [], + "label": "options", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.retry_count.order", + "type": "number", + "tags": [], + "label": "order", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.retry_count.required", + "type": "boolean", + "tags": [], + "label": "required", + "description": [], + "signature": [ + "false" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.retry_count.sensitive", + "type": "boolean", + "tags": [], + "label": "sensitive", + "description": [], + "signature": [ + "false" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.retry_count.tooltip", + "type": "string", + "tags": [], + "label": "tooltip", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.retry_count.type", + "type": "string", + "tags": [], + "label": "type", + "description": [], + "signature": [ + { + "pluginId": "@kbn/search-connectors", + "scope": "common", + "docId": "kibKbnSearchConnectorsPluginApi", + "section": "def-common.FieldType", + "text": "FieldType" + }, + ".INTEGER" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.retry_count.ui_restrictions", + "type": "Array", + "tags": [], + "label": "ui_restrictions", + "description": [], + "signature": [ + "string[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.retry_count.validations", + "type": "Array", + "tags": [], + "label": "validations", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.retry_count.value", + "type": "number", + "tags": [], + "label": "value", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + } + ] + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.validate_host", + "type": "Object", + "tags": [], + "label": "validate_host", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.validate_host.default_value", + "type": "boolean", + "tags": [], + "label": "default_value", + "description": [], + "signature": [ + "false" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.validate_host.depends_on", + "type": "Array", + "tags": [], + "label": "depends_on", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.validate_host.display", + "type": "string", + "tags": [], + "label": "display", + "description": [], + "signature": [ + { + "pluginId": "@kbn/search-connectors", + "scope": "common", + "docId": "kibKbnSearchConnectorsPluginApi", + "section": "def-common.DisplayType", + "text": "DisplayType" + }, + ".TOGGLE" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.validate_host.label", + "type": "string", + "tags": [], + "label": "label", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.validate_host.options", + "type": "Array", + "tags": [], + "label": "options", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.validate_host.order", + "type": "number", + "tags": [], + "label": "order", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.validate_host.required", + "type": "boolean", + "tags": [], + "label": "required", + "description": [], + "signature": [ + "true" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.validate_host.sensitive", + "type": "boolean", + "tags": [], + "label": "sensitive", + "description": [], + "signature": [ + "false" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.validate_host.tooltip", + "type": "string", + "tags": [], + "label": "tooltip", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.validate_host.type", + "type": "string", + "tags": [], + "label": "type", + "description": [], + "signature": [ + { + "pluginId": "@kbn/search-connectors", + "scope": "common", + "docId": "kibKbnSearchConnectorsPluginApi", + "section": "def-common.FieldType", + "text": "FieldType" + }, + ".BOOLEAN" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.validate_host.ui_restrictions", + "type": "Array", + "tags": [], + "label": "ui_restrictions", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.validate_host.validations", + "type": "Array", + "tags": [], + "label": "validations", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.configuration.validate_host.value", + "type": "boolean", + "tags": [], + "label": "value", + "description": [], + "signature": [ + "false" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + } + ] + } + ] + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.features", + "type": "Object", + "tags": [], + "label": "features", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.features.FeatureName.SYNC_RULES", + "type": "Object", + "tags": [], + "label": "[FeatureName.SYNC_RULES]", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.features.FeatureName.SYNC_RULES.advanced", + "type": "Object", + "tags": [], + "label": "advanced", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.features.FeatureName.SYNC_RULES.advanced.enabled", + "type": "boolean", + "tags": [], + "label": "enabled", + "description": [], + "signature": [ + "false" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + } + ] + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.features.FeatureName.SYNC_RULES.basic", + "type": "Object", + "tags": [], + "label": "basic", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.features.FeatureName.SYNC_RULES.basic.enabled", + "type": "boolean", + "tags": [], + "label": "enabled", + "description": [], + "signature": [ + "true" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + } + ] + } + ] + } + ] + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.name", + "type": "string", + "tags": [], + "label": "name", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mssql.serviceType", + "type": "string", + "tags": [], + "label": "serviceType", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + } + ] + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql", + "type": "Object", + "tags": [], + "label": "mysql", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration", + "type": "Object", + "tags": [], + "label": "configuration", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.host", + "type": "Object", + "tags": [], + "label": "host", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.host.default_value", + "type": "string", + "tags": [], + "label": "default_value", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.host.depends_on", + "type": "Array", + "tags": [], + "label": "depends_on", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.host.display", + "type": "string", + "tags": [], + "label": "display", + "description": [], + "signature": [ + { + "pluginId": "@kbn/search-connectors", + "scope": "common", + "docId": "kibKbnSearchConnectorsPluginApi", + "section": "def-common.DisplayType", + "text": "DisplayType" + }, + ".TEXTBOX" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.host.label", + "type": "string", + "tags": [], + "label": "label", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.host.options", + "type": "Array", + "tags": [], + "label": "options", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.host.order", + "type": "number", + "tags": [], + "label": "order", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.host.required", + "type": "boolean", + "tags": [], + "label": "required", + "description": [], + "signature": [ + "true" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.host.sensitive", + "type": "boolean", + "tags": [], + "label": "sensitive", + "description": [], + "signature": [ + "false" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.host.tooltip", + "type": "string", + "tags": [], + "label": "tooltip", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.host.type", + "type": "string", + "tags": [], + "label": "type", + "description": [], + "signature": [ + { + "pluginId": "@kbn/search-connectors", + "scope": "common", + "docId": "kibKbnSearchConnectorsPluginApi", + "section": "def-common.FieldType", + "text": "FieldType" + }, + ".STRING" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.host.ui_restrictions", + "type": "Array", + "tags": [], + "label": "ui_restrictions", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.host.validations", + "type": "Array", + "tags": [], + "label": "validations", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.host.value", + "type": "string", + "tags": [], + "label": "value", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + } + ] + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.port", + "type": "Object", + "tags": [], + "label": "port", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.port.default_value", + "type": "Uncategorized", + "tags": [], + "label": "default_value", + "description": [], + "signature": [ + "null" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.port.depends_on", + "type": "Array", + "tags": [], + "label": "depends_on", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.port.display", + "type": "string", + "tags": [], + "label": "display", + "description": [], + "signature": [ + { + "pluginId": "@kbn/search-connectors", + "scope": "common", + "docId": "kibKbnSearchConnectorsPluginApi", + "section": "def-common.DisplayType", + "text": "DisplayType" + }, + ".NUMERIC" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.port.label", + "type": "string", + "tags": [], + "label": "label", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.port.options", + "type": "Array", + "tags": [], + "label": "options", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.port.order", + "type": "number", + "tags": [], + "label": "order", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.port.required", + "type": "boolean", + "tags": [], + "label": "required", + "description": [], + "signature": [ + "true" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.port.sensitive", + "type": "boolean", + "tags": [], + "label": "sensitive", + "description": [], + "signature": [ + "false" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.port.tooltip", + "type": "string", + "tags": [], + "label": "tooltip", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.port.type", + "type": "string", + "tags": [], + "label": "type", + "description": [], + "signature": [ + { + "pluginId": "@kbn/search-connectors", + "scope": "common", + "docId": "kibKbnSearchConnectorsPluginApi", + "section": "def-common.FieldType", + "text": "FieldType" + }, + ".INTEGER" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.port.ui_restrictions", + "type": "Array", + "tags": [], + "label": "ui_restrictions", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.port.validations", + "type": "Array", + "tags": [], + "label": "validations", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.port.value", + "type": "string", + "tags": [], + "label": "value", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + } + ] + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.user", + "type": "Object", + "tags": [], + "label": "user", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.user.default_value", + "type": "string", + "tags": [], + "label": "default_value", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.user.depends_on", + "type": "Array", + "tags": [], + "label": "depends_on", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.user.display", + "type": "string", + "tags": [], + "label": "display", + "description": [], + "signature": [ + { + "pluginId": "@kbn/search-connectors", + "scope": "common", + "docId": "kibKbnSearchConnectorsPluginApi", + "section": "def-common.DisplayType", + "text": "DisplayType" + }, + ".TEXTBOX" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.user.label", + "type": "string", + "tags": [], + "label": "label", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.user.options", + "type": "Array", + "tags": [], + "label": "options", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.user.order", + "type": "number", + "tags": [], + "label": "order", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.user.required", + "type": "boolean", + "tags": [], + "label": "required", + "description": [], + "signature": [ + "false" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.user.sensitive", + "type": "boolean", + "tags": [], + "label": "sensitive", + "description": [], + "signature": [ + "false" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.user.tooltip", + "type": "string", + "tags": [], + "label": "tooltip", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.user.type", + "type": "string", + "tags": [], + "label": "type", + "description": [], + "signature": [ + { + "pluginId": "@kbn/search-connectors", + "scope": "common", + "docId": "kibKbnSearchConnectorsPluginApi", + "section": "def-common.FieldType", + "text": "FieldType" + }, + ".STRING" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.user.ui_restrictions", + "type": "Array", + "tags": [], + "label": "ui_restrictions", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.user.validations", + "type": "Array", + "tags": [], + "label": "validations", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.user.value", + "type": "string", + "tags": [], + "label": "value", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + } + ] + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.password", + "type": "Object", + "tags": [], + "label": "password", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.password.default_value", + "type": "string", + "tags": [], + "label": "default_value", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.password.depends_on", + "type": "Array", + "tags": [], + "label": "depends_on", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.password.display", + "type": "string", + "tags": [], + "label": "display", + "description": [], + "signature": [ + { + "pluginId": "@kbn/search-connectors", + "scope": "common", + "docId": "kibKbnSearchConnectorsPluginApi", + "section": "def-common.DisplayType", + "text": "DisplayType" + }, + ".TEXTBOX" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.password.label", + "type": "string", + "tags": [], + "label": "label", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.password.options", + "type": "Array", + "tags": [], + "label": "options", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.password.order", + "type": "number", + "tags": [], + "label": "order", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.password.required", + "type": "boolean", + "tags": [], + "label": "required", + "description": [], + "signature": [ + "false" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.password.sensitive", + "type": "boolean", + "tags": [], + "label": "sensitive", + "description": [], + "signature": [ + "true" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.password.tooltip", + "type": "string", + "tags": [], + "label": "tooltip", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.password.type", + "type": "string", + "tags": [], + "label": "type", + "description": [], + "signature": [ + { + "pluginId": "@kbn/search-connectors", + "scope": "common", + "docId": "kibKbnSearchConnectorsPluginApi", + "section": "def-common.FieldType", + "text": "FieldType" + }, + ".STRING" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.password.ui_restrictions", + "type": "Array", + "tags": [], + "label": "ui_restrictions", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.password.validations", + "type": "Array", + "tags": [], + "label": "validations", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.password.value", + "type": "string", + "tags": [], + "label": "value", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + } + ] + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.database", + "type": "Object", + "tags": [], + "label": "database", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.database.default_value", + "type": "string", + "tags": [], + "label": "default_value", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.database.depends_on", + "type": "Array", + "tags": [], + "label": "depends_on", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.database.display", + "type": "string", + "tags": [], + "label": "display", + "description": [], + "signature": [ + { + "pluginId": "@kbn/search-connectors", + "scope": "common", + "docId": "kibKbnSearchConnectorsPluginApi", + "section": "def-common.DisplayType", + "text": "DisplayType" + }, + ".TEXTBOX" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.database.label", + "type": "string", + "tags": [], + "label": "label", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.database.options", + "type": "Array", + "tags": [], + "label": "options", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.database.order", + "type": "number", + "tags": [], + "label": "order", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.database.required", + "type": "boolean", + "tags": [], + "label": "required", + "description": [], + "signature": [ + "true" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.database.sensitive", + "type": "boolean", + "tags": [], + "label": "sensitive", + "description": [], + "signature": [ + "false" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.database.tooltip", + "type": "string", + "tags": [], + "label": "tooltip", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.database.type", + "type": "string", + "tags": [], + "label": "type", + "description": [], + "signature": [ + { + "pluginId": "@kbn/search-connectors", + "scope": "common", + "docId": "kibKbnSearchConnectorsPluginApi", + "section": "def-common.FieldType", + "text": "FieldType" + }, + ".STRING" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.database.ui_restrictions", + "type": "Array", + "tags": [], + "label": "ui_restrictions", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.database.validations", + "type": "Array", + "tags": [], + "label": "validations", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.database.value", + "type": "string", + "tags": [], + "label": "value", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + } + ] + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.tables", + "type": "Object", + "tags": [], + "label": "tables", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.tables.default_value", + "type": "string", + "tags": [], + "label": "default_value", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.tables.depends_on", + "type": "Array", + "tags": [], + "label": "depends_on", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.tables.display", + "type": "string", + "tags": [], + "label": "display", + "description": [], + "signature": [ + { + "pluginId": "@kbn/search-connectors", + "scope": "common", + "docId": "kibKbnSearchConnectorsPluginApi", + "section": "def-common.DisplayType", + "text": "DisplayType" + }, + ".TEXTAREA" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.tables.label", + "type": "string", + "tags": [], + "label": "label", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.tables.options", + "type": "Array", + "tags": [], + "label": "options", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.tables.order", + "type": "number", + "tags": [], + "label": "order", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.tables.required", + "type": "boolean", + "tags": [], + "label": "required", + "description": [], + "signature": [ + "true" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.tables.sensitive", + "type": "boolean", + "tags": [], + "label": "sensitive", + "description": [], + "signature": [ + "false" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.tables.tooltip", + "type": "string", + "tags": [], + "label": "tooltip", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.tables.type", + "type": "string", + "tags": [], + "label": "type", + "description": [], + "signature": [ + { + "pluginId": "@kbn/search-connectors", + "scope": "common", + "docId": "kibKbnSearchConnectorsPluginApi", + "section": "def-common.FieldType", + "text": "FieldType" + }, + ".LIST" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.tables.ui_restrictions", + "type": "Array", + "tags": [], + "label": "ui_restrictions", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.tables.validations", + "type": "Array", + "tags": [], + "label": "validations", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.tables.value", + "type": "string", + "tags": [], + "label": "value", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + } + ] + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.ssl_enabled", + "type": "Object", + "tags": [], + "label": "ssl_enabled", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.ssl_enabled.default_value", + "type": "boolean", + "tags": [], + "label": "default_value", + "description": [], + "signature": [ + "false" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.ssl_enabled.depends_on", + "type": "Array", + "tags": [], + "label": "depends_on", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.ssl_enabled.display", + "type": "string", + "tags": [], + "label": "display", + "description": [], + "signature": [ + { + "pluginId": "@kbn/search-connectors", + "scope": "common", + "docId": "kibKbnSearchConnectorsPluginApi", + "section": "def-common.DisplayType", + "text": "DisplayType" + }, + ".TOGGLE" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.ssl_enabled.label", + "type": "string", + "tags": [], + "label": "label", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.ssl_enabled.options", + "type": "Array", + "tags": [], + "label": "options", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.ssl_enabled.order", + "type": "number", + "tags": [], + "label": "order", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.ssl_enabled.required", + "type": "boolean", + "tags": [], + "label": "required", + "description": [], + "signature": [ + "true" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.ssl_enabled.sensitive", + "type": "boolean", + "tags": [], + "label": "sensitive", + "description": [], + "signature": [ + "false" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.ssl_enabled.tooltip", + "type": "string", + "tags": [], + "label": "tooltip", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.ssl_enabled.type", + "type": "string", + "tags": [], + "label": "type", + "description": [], + "signature": [ + { + "pluginId": "@kbn/search-connectors", + "scope": "common", + "docId": "kibKbnSearchConnectorsPluginApi", + "section": "def-common.FieldType", + "text": "FieldType" + }, + ".BOOLEAN" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.ssl_enabled.ui_restrictions", + "type": "Array", + "tags": [], + "label": "ui_restrictions", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.ssl_enabled.validations", + "type": "Array", + "tags": [], + "label": "validations", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.ssl_enabled.value", + "type": "boolean", + "tags": [], + "label": "value", + "description": [], + "signature": [ + "false" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + } + ] + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.ssl_ca", + "type": "Object", + "tags": [], + "label": "ssl_ca", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.ssl_ca.default_value", + "type": "string", + "tags": [], + "label": "default_value", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.ssl_ca.depends_on", + "type": "Array", + "tags": [], + "label": "depends_on", + "description": [], + "signature": [ + "{ field: string; value: true; }[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.ssl_ca.display", + "type": "string", + "tags": [], + "label": "display", + "description": [], + "signature": [ + { + "pluginId": "@kbn/search-connectors", + "scope": "common", + "docId": "kibKbnSearchConnectorsPluginApi", + "section": "def-common.DisplayType", + "text": "DisplayType" + }, + ".TEXTBOX" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.ssl_ca.label", + "type": "string", + "tags": [], + "label": "label", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.ssl_ca.options", + "type": "Array", + "tags": [], + "label": "options", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.ssl_ca.order", + "type": "number", + "tags": [], + "label": "order", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.ssl_ca.required", + "type": "boolean", + "tags": [], + "label": "required", + "description": [], + "signature": [ + "true" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.ssl_ca.sensitive", + "type": "boolean", + "tags": [], + "label": "sensitive", + "description": [], + "signature": [ + "false" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.ssl_ca.tooltip", + "type": "string", + "tags": [], + "label": "tooltip", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.ssl_ca.type", + "type": "string", + "tags": [], + "label": "type", + "description": [], + "signature": [ + { + "pluginId": "@kbn/search-connectors", + "scope": "common", + "docId": "kibKbnSearchConnectorsPluginApi", + "section": "def-common.FieldType", + "text": "FieldType" + }, + ".STRING" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.ssl_ca.ui_restrictions", + "type": "Array", + "tags": [], + "label": "ui_restrictions", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.ssl_ca.validations", + "type": "Array", + "tags": [], + "label": "validations", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.ssl_ca.value", + "type": "string", + "tags": [], + "label": "value", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + } + ] + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.fetch_size", + "type": "Object", + "tags": [], + "label": "fetch_size", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.fetch_size.default_value", + "type": "number", + "tags": [], + "label": "default_value", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.fetch_size.depends_on", + "type": "Array", + "tags": [], + "label": "depends_on", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.fetch_size.display", + "type": "string", + "tags": [], + "label": "display", + "description": [], + "signature": [ + { + "pluginId": "@kbn/search-connectors", + "scope": "common", + "docId": "kibKbnSearchConnectorsPluginApi", + "section": "def-common.DisplayType", + "text": "DisplayType" + }, + ".NUMERIC" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.fetch_size.label", + "type": "string", + "tags": [], + "label": "label", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.fetch_size.options", + "type": "Array", + "tags": [], + "label": "options", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.fetch_size.order", + "type": "number", + "tags": [], + "label": "order", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.fetch_size.required", + "type": "boolean", + "tags": [], + "label": "required", + "description": [], + "signature": [ + "false" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.fetch_size.sensitive", + "type": "boolean", + "tags": [], + "label": "sensitive", + "description": [], + "signature": [ + "false" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.fetch_size.tooltip", + "type": "string", + "tags": [], + "label": "tooltip", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.fetch_size.type", + "type": "string", + "tags": [], + "label": "type", + "description": [], + "signature": [ + { + "pluginId": "@kbn/search-connectors", + "scope": "common", + "docId": "kibKbnSearchConnectorsPluginApi", + "section": "def-common.FieldType", + "text": "FieldType" + }, + ".INTEGER" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.fetch_size.ui_restrictions", + "type": "Array", + "tags": [], + "label": "ui_restrictions", + "description": [], + "signature": [ + "string[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.fetch_size.validations", + "type": "Array", + "tags": [], + "label": "validations", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.fetch_size.value", + "type": "number", + "tags": [], + "label": "value", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + } + ] + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.retry_count", + "type": "Object", + "tags": [], + "label": "retry_count", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.retry_count.default_value", + "type": "number", + "tags": [], + "label": "default_value", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.retry_count.depends_on", + "type": "Array", + "tags": [], + "label": "depends_on", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.retry_count.display", + "type": "string", + "tags": [], + "label": "display", + "description": [], + "signature": [ + { + "pluginId": "@kbn/search-connectors", + "scope": "common", + "docId": "kibKbnSearchConnectorsPluginApi", + "section": "def-common.DisplayType", + "text": "DisplayType" + }, + ".NUMERIC" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.retry_count.label", + "type": "string", + "tags": [], + "label": "label", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.retry_count.options", + "type": "Array", + "tags": [], + "label": "options", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.retry_count.order", + "type": "number", + "tags": [], + "label": "order", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.retry_count.required", + "type": "boolean", + "tags": [], + "label": "required", + "description": [], + "signature": [ + "false" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.retry_count.sensitive", + "type": "boolean", + "tags": [], + "label": "sensitive", + "description": [], + "signature": [ + "false" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.retry_count.tooltip", + "type": "string", + "tags": [], + "label": "tooltip", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.retry_count.type", + "type": "string", + "tags": [], + "label": "type", + "description": [], + "signature": [ + { + "pluginId": "@kbn/search-connectors", + "scope": "common", + "docId": "kibKbnSearchConnectorsPluginApi", + "section": "def-common.FieldType", + "text": "FieldType" + }, + ".INTEGER" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.retry_count.ui_restrictions", + "type": "Array", + "tags": [], + "label": "ui_restrictions", + "description": [], + "signature": [ + "string[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.retry_count.validations", + "type": "Array", + "tags": [], + "label": "validations", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.configuration.retry_count.value", + "type": "number", + "tags": [], + "label": "value", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + } + ] + } + ] + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.features", + "type": "Object", + "tags": [], + "label": "features", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.features.FeatureName.SYNC_RULES", + "type": "Object", + "tags": [], + "label": "[FeatureName.SYNC_RULES]", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.features.FeatureName.SYNC_RULES.advanced", + "type": "Object", + "tags": [], + "label": "advanced", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.features.FeatureName.SYNC_RULES.advanced.enabled", + "type": "boolean", + "tags": [], + "label": "enabled", + "description": [], + "signature": [ + "true" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + } + ] + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.features.FeatureName.SYNC_RULES.basic", + "type": "Object", + "tags": [], + "label": "basic", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.features.FeatureName.SYNC_RULES.basic.enabled", + "type": "boolean", + "tags": [], + "label": "enabled", + "description": [], + "signature": [ + "true" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + } + ] + } + ] + } + ] + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.name", + "type": "string", + "tags": [], + "label": "name", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.mysql.serviceType", + "type": "string", + "tags": [], + "label": "serviceType", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + } + ] + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.network_drive", + "type": "Object", + "tags": [], + "label": "network_drive", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.network_drive.configuration", + "type": "Object", + "tags": [], + "label": "configuration", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.network_drive.configuration.username", + "type": "Object", + "tags": [], + "label": "username", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.network_drive.configuration.username.default_value", + "type": "Uncategorized", + "tags": [], + "label": "default_value", + "description": [], + "signature": [ + "null" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.network_drive.configuration.username.depends_on", + "type": "Array", + "tags": [], + "label": "depends_on", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.network_drive.configuration.username.display", + "type": "string", + "tags": [], + "label": "display", + "description": [], + "signature": [ + { + "pluginId": "@kbn/search-connectors", + "scope": "common", + "docId": "kibKbnSearchConnectorsPluginApi", + "section": "def-common.DisplayType", + "text": "DisplayType" + }, + ".TEXTBOX" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.network_drive.configuration.username.label", + "type": "string", + "tags": [], + "label": "label", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.network_drive.configuration.username.options", + "type": "Array", + "tags": [], + "label": "options", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.network_drive.configuration.username.order", + "type": "number", + "tags": [], + "label": "order", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.network_drive.configuration.username.required", + "type": "boolean", + "tags": [], + "label": "required", + "description": [], + "signature": [ + "true" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.network_drive.configuration.username.sensitive", + "type": "boolean", + "tags": [], + "label": "sensitive", + "description": [], + "signature": [ + "false" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.network_drive.configuration.username.tooltip", + "type": "string", + "tags": [], + "label": "tooltip", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.network_drive.configuration.username.type", + "type": "string", + "tags": [], + "label": "type", + "description": [], + "signature": [ + { + "pluginId": "@kbn/search-connectors", + "scope": "common", + "docId": "kibKbnSearchConnectorsPluginApi", + "section": "def-common.FieldType", + "text": "FieldType" + }, + ".STRING" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.network_drive.configuration.username.ui_restrictions", + "type": "Array", + "tags": [], + "label": "ui_restrictions", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.network_drive.configuration.username.validations", + "type": "Array", + "tags": [], + "label": "validations", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.network_drive.configuration.username.value", + "type": "string", + "tags": [], + "label": "value", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + } + ] + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.network_drive.configuration.password", + "type": "Object", + "tags": [], + "label": "password", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.network_drive.configuration.password.default_value", + "type": "Uncategorized", + "tags": [], + "label": "default_value", + "description": [], + "signature": [ + "null" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.network_drive.configuration.password.depends_on", + "type": "Array", + "tags": [], + "label": "depends_on", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.network_drive.configuration.password.display", + "type": "string", + "tags": [], + "label": "display", + "description": [], + "signature": [ + { + "pluginId": "@kbn/search-connectors", + "scope": "common", + "docId": "kibKbnSearchConnectorsPluginApi", + "section": "def-common.DisplayType", + "text": "DisplayType" + }, + ".TEXTBOX" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.network_drive.configuration.password.label", + "type": "string", + "tags": [], + "label": "label", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.network_drive.configuration.password.options", + "type": "Array", + "tags": [], + "label": "options", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.network_drive.configuration.password.order", + "type": "number", + "tags": [], + "label": "order", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.network_drive.configuration.password.required", + "type": "boolean", + "tags": [], + "label": "required", + "description": [], + "signature": [ + "true" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.network_drive.configuration.password.sensitive", + "type": "boolean", + "tags": [], + "label": "sensitive", + "description": [], + "signature": [ + "true" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.network_drive.configuration.password.tooltip", + "type": "string", + "tags": [], + "label": "tooltip", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.network_drive.configuration.password.type", + "type": "string", + "tags": [], + "label": "type", + "description": [], + "signature": [ + { + "pluginId": "@kbn/search-connectors", + "scope": "common", + "docId": "kibKbnSearchConnectorsPluginApi", + "section": "def-common.FieldType", + "text": "FieldType" + }, + ".STRING" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.network_drive.configuration.password.ui_restrictions", + "type": "Array", + "tags": [], + "label": "ui_restrictions", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.network_drive.configuration.password.validations", + "type": "Array", + "tags": [], + "label": "validations", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.network_drive.configuration.password.value", + "type": "string", + "tags": [], + "label": "value", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + } + ] + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.network_drive.configuration.server_ip", + "type": "Object", + "tags": [], + "label": "server_ip", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.network_drive.configuration.server_ip.default_value", + "type": "Uncategorized", + "tags": [], + "label": "default_value", + "description": [], + "signature": [ + "null" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.network_drive.configuration.server_ip.depends_on", + "type": "Array", + "tags": [], + "label": "depends_on", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.network_drive.configuration.server_ip.display", + "type": "string", + "tags": [], + "label": "display", + "description": [], + "signature": [ + { + "pluginId": "@kbn/search-connectors", + "scope": "common", + "docId": "kibKbnSearchConnectorsPluginApi", + "section": "def-common.DisplayType", + "text": "DisplayType" + }, + ".TEXTBOX" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.network_drive.configuration.server_ip.label", + "type": "string", + "tags": [], + "label": "label", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.network_drive.configuration.server_ip.options", + "type": "Array", + "tags": [], + "label": "options", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.network_drive.configuration.server_ip.order", + "type": "number", + "tags": [], + "label": "order", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.network_drive.configuration.server_ip.placeholder", + "type": "string", + "tags": [], + "label": "placeholder", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.network_drive.configuration.server_ip.required", + "type": "boolean", + "tags": [], + "label": "required", + "description": [], + "signature": [ + "true" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.network_drive.configuration.server_ip.sensitive", + "type": "boolean", + "tags": [], + "label": "sensitive", + "description": [], + "signature": [ + "false" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.network_drive.configuration.server_ip.tooltip", + "type": "string", + "tags": [], + "label": "tooltip", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.network_drive.configuration.server_ip.type", + "type": "string", + "tags": [], + "label": "type", + "description": [], + "signature": [ + { + "pluginId": "@kbn/search-connectors", + "scope": "common", + "docId": "kibKbnSearchConnectorsPluginApi", + "section": "def-common.FieldType", + "text": "FieldType" + }, + ".STRING" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.network_drive.configuration.server_ip.ui_restrictions", + "type": "Array", + "tags": [], + "label": "ui_restrictions", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.network_drive.configuration.server_ip.validations", + "type": "Array", + "tags": [], + "label": "validations", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.network_drive.configuration.server_ip.value", + "type": "string", + "tags": [], + "label": "value", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + } + ] + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.network_drive.configuration.server_port", + "type": "Object", + "tags": [], + "label": "server_port", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.network_drive.configuration.server_port.default_value", + "type": "Uncategorized", + "tags": [], + "label": "default_value", + "description": [], + "signature": [ + "null" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.network_drive.configuration.server_port.depends_on", + "type": "Array", + "tags": [], + "label": "depends_on", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.network_drive.configuration.server_port.display", + "type": "string", + "tags": [], + "label": "display", + "description": [], + "signature": [ + { + "pluginId": "@kbn/search-connectors", + "scope": "common", + "docId": "kibKbnSearchConnectorsPluginApi", + "section": "def-common.DisplayType", + "text": "DisplayType" + }, + ".NUMERIC" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.network_drive.configuration.server_port.label", + "type": "string", + "tags": [], + "label": "label", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.network_drive.configuration.server_port.options", + "type": "Array", + "tags": [], + "label": "options", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.network_drive.configuration.server_port.order", + "type": "number", + "tags": [], + "label": "order", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.network_drive.configuration.server_port.required", + "type": "boolean", + "tags": [], + "label": "required", + "description": [], + "signature": [ + "true" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.network_drive.configuration.server_port.sensitive", + "type": "boolean", + "tags": [], + "label": "sensitive", + "description": [], + "signature": [ + "false" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.network_drive.configuration.server_port.tooltip", + "type": "string", + "tags": [], + "label": "tooltip", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.network_drive.configuration.server_port.type", + "type": "string", + "tags": [], + "label": "type", + "description": [], + "signature": [ + { + "pluginId": "@kbn/search-connectors", + "scope": "common", + "docId": "kibKbnSearchConnectorsPluginApi", + "section": "def-common.FieldType", + "text": "FieldType" + }, + ".INTEGER" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.network_drive.configuration.server_port.ui_restrictions", + "type": "Array", + "tags": [], + "label": "ui_restrictions", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.network_drive.configuration.server_port.validations", + "type": "Array", + "tags": [], + "label": "validations", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.network_drive.configuration.server_port.value", + "type": "number", + "tags": [], + "label": "value", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + } + ] + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.network_drive.configuration.drive_path", + "type": "Object", + "tags": [], + "label": "drive_path", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.network_drive.configuration.drive_path.default_value", + "type": "Uncategorized", + "tags": [], + "label": "default_value", + "description": [], + "signature": [ + "null" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.network_drive.configuration.drive_path.depends_on", + "type": "Array", + "tags": [], + "label": "depends_on", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.network_drive.configuration.drive_path.display", + "type": "string", + "tags": [], + "label": "display", + "description": [], + "signature": [ + { + "pluginId": "@kbn/search-connectors", + "scope": "common", + "docId": "kibKbnSearchConnectorsPluginApi", + "section": "def-common.DisplayType", + "text": "DisplayType" + }, + ".TEXTBOX" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.network_drive.configuration.drive_path.label", + "type": "string", + "tags": [], + "label": "label", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.network_drive.configuration.drive_path.options", + "type": "Array", + "tags": [], + "label": "options", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.network_drive.configuration.drive_path.order", + "type": "number", + "tags": [], + "label": "order", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.network_drive.configuration.drive_path.placeholder", + "type": "string", + "tags": [], + "label": "placeholder", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.network_drive.configuration.drive_path.required", + "type": "boolean", + "tags": [], + "label": "required", + "description": [], + "signature": [ + "true" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.network_drive.configuration.drive_path.sensitive", + "type": "boolean", + "tags": [], + "label": "sensitive", + "description": [], + "signature": [ + "false" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.network_drive.configuration.drive_path.tooltip", + "type": "string", + "tags": [], + "label": "tooltip", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.network_drive.configuration.drive_path.type", + "type": "string", + "tags": [], + "label": "type", + "description": [], + "signature": [ + { + "pluginId": "@kbn/search-connectors", + "scope": "common", + "docId": "kibKbnSearchConnectorsPluginApi", + "section": "def-common.FieldType", + "text": "FieldType" + }, + ".STRING" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.network_drive.configuration.drive_path.ui_restrictions", + "type": "Array", + "tags": [], + "label": "ui_restrictions", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.network_drive.configuration.drive_path.validations", + "type": "Array", + "tags": [], + "label": "validations", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.network_drive.configuration.drive_path.value", + "type": "string", + "tags": [], + "label": "value", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + } + ] + } + ] + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.network_drive.features", + "type": "Object", + "tags": [], + "label": "features", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.network_drive.features.FeatureName.SYNC_RULES", + "type": "Object", + "tags": [], + "label": "[FeatureName.SYNC_RULES]", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.network_drive.features.FeatureName.SYNC_RULES.advanced", + "type": "Object", + "tags": [], + "label": "advanced", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.network_drive.features.FeatureName.SYNC_RULES.advanced.enabled", + "type": "boolean", + "tags": [], + "label": "enabled", + "description": [], + "signature": [ + "false" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + } + ] + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.network_drive.features.FeatureName.SYNC_RULES.basic", + "type": "Object", + "tags": [], + "label": "basic", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.network_drive.features.FeatureName.SYNC_RULES.basic.enabled", + "type": "boolean", + "tags": [], + "label": "enabled", + "description": [], + "signature": [ + "true" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + } + ] + } + ] + } + ] + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.network_drive.name", + "type": "string", + "tags": [], + "label": "name", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.network_drive.serviceType", + "type": "string", + "tags": [], + "label": "serviceType", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + } + ] + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql", + "type": "Object", + "tags": [], + "label": "postgresql", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration", + "type": "Object", + "tags": [], + "label": "configuration", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.host", + "type": "Object", + "tags": [], + "label": "host", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.host.default_value", + "type": "string", + "tags": [], + "label": "default_value", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.host.depends_on", + "type": "Array", + "tags": [], + "label": "depends_on", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.host.display", + "type": "string", + "tags": [], + "label": "display", + "description": [], + "signature": [ + { + "pluginId": "@kbn/search-connectors", + "scope": "common", + "docId": "kibKbnSearchConnectorsPluginApi", + "section": "def-common.DisplayType", + "text": "DisplayType" + }, + ".TEXTBOX" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.host.label", + "type": "string", + "tags": [], + "label": "label", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.host.options", + "type": "Array", + "tags": [], + "label": "options", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.host.order", + "type": "number", + "tags": [], + "label": "order", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.host.required", + "type": "boolean", + "tags": [], + "label": "required", + "description": [], + "signature": [ + "true" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.host.sensitive", + "type": "boolean", + "tags": [], + "label": "sensitive", + "description": [], + "signature": [ + "false" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.host.tooltip", + "type": "string", + "tags": [], + "label": "tooltip", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.host.type", + "type": "string", + "tags": [], + "label": "type", + "description": [], + "signature": [ + { + "pluginId": "@kbn/search-connectors", + "scope": "common", + "docId": "kibKbnSearchConnectorsPluginApi", + "section": "def-common.FieldType", + "text": "FieldType" + }, + ".STRING" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.host.ui_restrictions", + "type": "Array", + "tags": [], + "label": "ui_restrictions", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.host.validations", + "type": "Array", + "tags": [], + "label": "validations", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.host.value", + "type": "string", + "tags": [], + "label": "value", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + } + ] + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.port", + "type": "Object", + "tags": [], + "label": "port", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.port.default_value", + "type": "Uncategorized", + "tags": [], + "label": "default_value", + "description": [], + "signature": [ + "null" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.port.depends_on", + "type": "Array", + "tags": [], + "label": "depends_on", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.port.display", + "type": "string", + "tags": [], + "label": "display", + "description": [], + "signature": [ + { + "pluginId": "@kbn/search-connectors", + "scope": "common", + "docId": "kibKbnSearchConnectorsPluginApi", + "section": "def-common.DisplayType", + "text": "DisplayType" + }, + ".NUMERIC" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.port.label", + "type": "string", + "tags": [], + "label": "label", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.port.options", + "type": "Array", + "tags": [], + "label": "options", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.port.order", + "type": "number", + "tags": [], + "label": "order", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.port.required", + "type": "boolean", + "tags": [], + "label": "required", + "description": [], + "signature": [ + "true" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.port.sensitive", + "type": "boolean", + "tags": [], + "label": "sensitive", + "description": [], + "signature": [ + "false" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.port.tooltip", + "type": "string", + "tags": [], + "label": "tooltip", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.port.type", + "type": "string", + "tags": [], + "label": "type", + "description": [], + "signature": [ + { + "pluginId": "@kbn/search-connectors", + "scope": "common", + "docId": "kibKbnSearchConnectorsPluginApi", + "section": "def-common.FieldType", + "text": "FieldType" + }, + ".INTEGER" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.port.ui_restrictions", + "type": "Array", + "tags": [], + "label": "ui_restrictions", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.port.validations", + "type": "Array", + "tags": [], + "label": "validations", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.port.value", + "type": "number", + "tags": [], + "label": "value", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + } + ] + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.username", + "type": "Object", + "tags": [], + "label": "username", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.username.default_value", + "type": "string", + "tags": [], + "label": "default_value", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.username.depends_on", + "type": "Array", + "tags": [], + "label": "depends_on", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.username.display", + "type": "string", + "tags": [], + "label": "display", + "description": [], + "signature": [ + { + "pluginId": "@kbn/search-connectors", + "scope": "common", + "docId": "kibKbnSearchConnectorsPluginApi", + "section": "def-common.DisplayType", + "text": "DisplayType" + }, + ".TEXTBOX" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.username.label", + "type": "string", + "tags": [], + "label": "label", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.username.options", + "type": "Array", + "tags": [], + "label": "options", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.username.order", + "type": "number", + "tags": [], + "label": "order", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.username.required", + "type": "boolean", + "tags": [], + "label": "required", + "description": [], + "signature": [ + "true" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.username.sensitive", + "type": "boolean", + "tags": [], + "label": "sensitive", + "description": [], + "signature": [ + "false" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.username.tooltip", + "type": "string", + "tags": [], + "label": "tooltip", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.username.type", + "type": "string", + "tags": [], + "label": "type", + "description": [], + "signature": [ + { + "pluginId": "@kbn/search-connectors", + "scope": "common", + "docId": "kibKbnSearchConnectorsPluginApi", + "section": "def-common.FieldType", + "text": "FieldType" + }, + ".STRING" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.username.ui_restrictions", + "type": "Array", + "tags": [], + "label": "ui_restrictions", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.username.validations", + "type": "Array", + "tags": [], + "label": "validations", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.username.value", + "type": "string", + "tags": [], + "label": "value", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + } + ] + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.password", + "type": "Object", + "tags": [], + "label": "password", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.password.default_value", + "type": "string", + "tags": [], + "label": "default_value", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.password.depends_on", + "type": "Array", + "tags": [], + "label": "depends_on", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.password.display", + "type": "string", + "tags": [], + "label": "display", + "description": [], + "signature": [ + { + "pluginId": "@kbn/search-connectors", + "scope": "common", + "docId": "kibKbnSearchConnectorsPluginApi", + "section": "def-common.DisplayType", + "text": "DisplayType" + }, + ".TEXTBOX" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.password.label", + "type": "string", + "tags": [], + "label": "label", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.password.options", + "type": "Array", + "tags": [], + "label": "options", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.password.order", + "type": "number", + "tags": [], + "label": "order", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.password.required", + "type": "boolean", + "tags": [], + "label": "required", + "description": [], + "signature": [ + "true" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.password.sensitive", + "type": "boolean", + "tags": [], + "label": "sensitive", + "description": [], + "signature": [ + "true" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.password.tooltip", + "type": "string", + "tags": [], + "label": "tooltip", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.password.type", + "type": "string", + "tags": [], + "label": "type", + "description": [], + "signature": [ + { + "pluginId": "@kbn/search-connectors", + "scope": "common", + "docId": "kibKbnSearchConnectorsPluginApi", + "section": "def-common.FieldType", + "text": "FieldType" + }, + ".STRING" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.password.ui_restrictions", + "type": "Array", + "tags": [], + "label": "ui_restrictions", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.password.validations", + "type": "Array", + "tags": [], + "label": "validations", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.password.value", + "type": "string", + "tags": [], + "label": "value", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + } + ] + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.database", + "type": "Object", + "tags": [], + "label": "database", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.database.default_value", + "type": "string", + "tags": [], + "label": "default_value", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.database.depends_on", + "type": "Array", + "tags": [], + "label": "depends_on", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.database.display", + "type": "string", + "tags": [], + "label": "display", + "description": [], + "signature": [ + { + "pluginId": "@kbn/search-connectors", + "scope": "common", + "docId": "kibKbnSearchConnectorsPluginApi", + "section": "def-common.DisplayType", + "text": "DisplayType" + }, + ".TEXTBOX" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.database.label", + "type": "string", + "tags": [], + "label": "label", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.database.options", + "type": "Array", + "tags": [], + "label": "options", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.database.order", + "type": "number", + "tags": [], + "label": "order", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.database.required", + "type": "boolean", + "tags": [], + "label": "required", + "description": [], + "signature": [ + "true" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.database.sensitive", + "type": "boolean", + "tags": [], + "label": "sensitive", + "description": [], + "signature": [ + "false" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.database.tooltip", + "type": "string", + "tags": [], + "label": "tooltip", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.database.type", + "type": "string", + "tags": [], + "label": "type", + "description": [], + "signature": [ + { + "pluginId": "@kbn/search-connectors", + "scope": "common", + "docId": "kibKbnSearchConnectorsPluginApi", + "section": "def-common.FieldType", + "text": "FieldType" + }, + ".STRING" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.database.ui_restrictions", + "type": "Array", + "tags": [], + "label": "ui_restrictions", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.database.validations", + "type": "Array", + "tags": [], + "label": "validations", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.database.value", + "type": "string", + "tags": [], + "label": "value", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + } + ] + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.tables", + "type": "Object", + "tags": [], + "label": "tables", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.tables.default_value", + "type": "string", + "tags": [], + "label": "default_value", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.tables.depends_on", + "type": "Array", + "tags": [], + "label": "depends_on", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.tables.display", + "type": "string", + "tags": [], + "label": "display", + "description": [], + "signature": [ + { + "pluginId": "@kbn/search-connectors", + "scope": "common", + "docId": "kibKbnSearchConnectorsPluginApi", + "section": "def-common.DisplayType", + "text": "DisplayType" + }, + ".TEXTAREA" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.tables.label", + "type": "string", + "tags": [], + "label": "label", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.tables.options", + "type": "Array", + "tags": [], + "label": "options", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.tables.order", + "type": "number", + "tags": [], + "label": "order", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.tables.required", + "type": "boolean", + "tags": [], + "label": "required", + "description": [], + "signature": [ + "true" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.tables.sensitive", + "type": "boolean", + "tags": [], + "label": "sensitive", + "description": [], + "signature": [ + "false" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.tables.tooltip", + "type": "string", + "tags": [], + "label": "tooltip", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.tables.type", + "type": "string", + "tags": [], + "label": "type", + "description": [], + "signature": [ + { + "pluginId": "@kbn/search-connectors", + "scope": "common", + "docId": "kibKbnSearchConnectorsPluginApi", + "section": "def-common.FieldType", + "text": "FieldType" + }, + ".LIST" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.tables.ui_restrictions", + "type": "Array", + "tags": [], + "label": "ui_restrictions", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.tables.validations", + "type": "Array", + "tags": [], + "label": "validations", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.tables.value", + "type": "string", + "tags": [], + "label": "value", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + } + ] + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.ssl_enabled", + "type": "Object", + "tags": [], + "label": "ssl_enabled", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.ssl_enabled.default_value", + "type": "boolean", + "tags": [], + "label": "default_value", + "description": [], + "signature": [ + "false" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.ssl_enabled.depends_on", + "type": "Array", + "tags": [], + "label": "depends_on", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.ssl_enabled.display", + "type": "string", + "tags": [], + "label": "display", + "description": [], + "signature": [ + { + "pluginId": "@kbn/search-connectors", + "scope": "common", + "docId": "kibKbnSearchConnectorsPluginApi", + "section": "def-common.DisplayType", + "text": "DisplayType" + }, + ".TOGGLE" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.ssl_enabled.label", + "type": "string", + "tags": [], + "label": "label", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.ssl_enabled.options", + "type": "Array", + "tags": [], + "label": "options", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.ssl_enabled.order", + "type": "number", + "tags": [], + "label": "order", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.ssl_enabled.required", + "type": "boolean", + "tags": [], + "label": "required", + "description": [], + "signature": [ + "true" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.ssl_enabled.sensitive", + "type": "boolean", + "tags": [], + "label": "sensitive", + "description": [], + "signature": [ + "false" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.ssl_enabled.tooltip", + "type": "string", + "tags": [], + "label": "tooltip", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.ssl_enabled.type", + "type": "string", + "tags": [], + "label": "type", + "description": [], + "signature": [ + { + "pluginId": "@kbn/search-connectors", + "scope": "common", + "docId": "kibKbnSearchConnectorsPluginApi", + "section": "def-common.FieldType", + "text": "FieldType" + }, + ".BOOLEAN" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.ssl_enabled.ui_restrictions", + "type": "Array", + "tags": [], + "label": "ui_restrictions", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.ssl_enabled.validations", + "type": "Array", + "tags": [], + "label": "validations", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.ssl_enabled.value", + "type": "boolean", + "tags": [], + "label": "value", + "description": [], + "signature": [ + "false" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + } + ] + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.ssl_ca", + "type": "Object", + "tags": [], + "label": "ssl_ca", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.ssl_ca.default_value", + "type": "string", + "tags": [], + "label": "default_value", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.ssl_ca.depends_on", + "type": "Array", + "tags": [], + "label": "depends_on", + "description": [], + "signature": [ + "{ field: string; value: true; }[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.ssl_ca.display", + "type": "string", + "tags": [], + "label": "display", + "description": [], + "signature": [ + { + "pluginId": "@kbn/search-connectors", + "scope": "common", + "docId": "kibKbnSearchConnectorsPluginApi", + "section": "def-common.DisplayType", + "text": "DisplayType" + }, + ".TEXTBOX" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.ssl_ca.label", + "type": "string", + "tags": [], + "label": "label", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.ssl_ca.options", + "type": "Array", + "tags": [], + "label": "options", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.ssl_ca.order", + "type": "number", + "tags": [], + "label": "order", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.ssl_ca.required", + "type": "boolean", + "tags": [], + "label": "required", + "description": [], + "signature": [ + "true" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.ssl_ca.sensitive", + "type": "boolean", + "tags": [], + "label": "sensitive", + "description": [], + "signature": [ + "false" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.ssl_ca.tooltip", + "type": "string", + "tags": [], + "label": "tooltip", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.ssl_ca.type", + "type": "string", + "tags": [], + "label": "type", + "description": [], + "signature": [ + { + "pluginId": "@kbn/search-connectors", + "scope": "common", + "docId": "kibKbnSearchConnectorsPluginApi", + "section": "def-common.FieldType", + "text": "FieldType" + }, + ".STRING" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.ssl_ca.ui_restrictions", + "type": "Array", + "tags": [], + "label": "ui_restrictions", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.ssl_ca.validations", + "type": "Array", + "tags": [], + "label": "validations", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.ssl_ca.value", + "type": "string", + "tags": [], + "label": "value", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + } + ] + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.fetch_size", + "type": "Object", + "tags": [], + "label": "fetch_size", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.fetch_size.default_value", + "type": "number", + "tags": [], + "label": "default_value", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.fetch_size.depends_on", + "type": "Array", + "tags": [], + "label": "depends_on", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.fetch_size.display", + "type": "string", + "tags": [], + "label": "display", + "description": [], + "signature": [ + { + "pluginId": "@kbn/search-connectors", + "scope": "common", + "docId": "kibKbnSearchConnectorsPluginApi", + "section": "def-common.DisplayType", + "text": "DisplayType" + }, + ".NUMERIC" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.fetch_size.label", + "type": "string", + "tags": [], + "label": "label", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.fetch_size.options", + "type": "Array", + "tags": [], + "label": "options", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.fetch_size.order", + "type": "number", + "tags": [], + "label": "order", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.fetch_size.required", + "type": "boolean", + "tags": [], + "label": "required", + "description": [], + "signature": [ + "false" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.fetch_size.sensitive", + "type": "boolean", + "tags": [], + "label": "sensitive", + "description": [], + "signature": [ + "false" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.fetch_size.tooltip", + "type": "string", + "tags": [], + "label": "tooltip", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.fetch_size.type", + "type": "string", + "tags": [], + "label": "type", + "description": [], + "signature": [ + { + "pluginId": "@kbn/search-connectors", + "scope": "common", + "docId": "kibKbnSearchConnectorsPluginApi", + "section": "def-common.FieldType", + "text": "FieldType" + }, + ".INTEGER" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.fetch_size.ui_restrictions", + "type": "Array", + "tags": [], + "label": "ui_restrictions", + "description": [], + "signature": [ + "string[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.fetch_size.validations", + "type": "Array", + "tags": [], + "label": "validations", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.fetch_size.value", + "type": "number", + "tags": [], + "label": "value", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + } + ] + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.retry_count", + "type": "Object", + "tags": [], + "label": "retry_count", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.retry_count.default_value", + "type": "number", + "tags": [], + "label": "default_value", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.retry_count.depends_on", + "type": "Array", + "tags": [], + "label": "depends_on", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.retry_count.display", + "type": "string", + "tags": [], + "label": "display", + "description": [], + "signature": [ + { + "pluginId": "@kbn/search-connectors", + "scope": "common", + "docId": "kibKbnSearchConnectorsPluginApi", + "section": "def-common.DisplayType", + "text": "DisplayType" + }, + ".NUMERIC" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.retry_count.label", + "type": "string", + "tags": [], + "label": "label", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.retry_count.options", + "type": "Array", + "tags": [], + "label": "options", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.retry_count.order", + "type": "number", + "tags": [], + "label": "order", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.retry_count.required", + "type": "boolean", + "tags": [], + "label": "required", + "description": [], + "signature": [ + "false" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.retry_count.sensitive", + "type": "boolean", + "tags": [], + "label": "sensitive", + "description": [], + "signature": [ + "false" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.retry_count.tooltip", + "type": "string", + "tags": [], + "label": "tooltip", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.retry_count.type", + "type": "string", + "tags": [], + "label": "type", + "description": [], + "signature": [ + { + "pluginId": "@kbn/search-connectors", + "scope": "common", + "docId": "kibKbnSearchConnectorsPluginApi", + "section": "def-common.FieldType", + "text": "FieldType" + }, + ".INTEGER" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.retry_count.ui_restrictions", + "type": "Array", + "tags": [], + "label": "ui_restrictions", + "description": [], + "signature": [ + "string[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.retry_count.validations", + "type": "Array", + "tags": [], + "label": "validations", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.configuration.retry_count.value", + "type": "number", + "tags": [], + "label": "value", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + } + ] + } + ] + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.features", + "type": "Object", + "tags": [], + "label": "features", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.features.FeatureName.SYNC_RULES", + "type": "Object", + "tags": [], + "label": "[FeatureName.SYNC_RULES]", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.features.FeatureName.SYNC_RULES.advanced", + "type": "Object", + "tags": [], + "label": "advanced", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.features.FeatureName.SYNC_RULES.advanced.enabled", + "type": "boolean", + "tags": [], + "label": "enabled", + "description": [], + "signature": [ + "false" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + } + ] + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.features.FeatureName.SYNC_RULES.basic", + "type": "Object", + "tags": [], + "label": "basic", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.features.FeatureName.SYNC_RULES.basic.enabled", + "type": "boolean", + "tags": [], + "label": "enabled", + "description": [], + "signature": [ + "true" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + } + ] + } + ] + } + ] + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.name", + "type": "string", + "tags": [], + "label": "name", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.postgresql.serviceType", + "type": "string", + "tags": [], + "label": "serviceType", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + } + ] + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.servicenow", + "type": "Object", + "tags": [], + "label": "servicenow", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.servicenow.configuration", + "type": "Object", + "tags": [], + "label": "configuration", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.servicenow.configuration.url", + "type": "Object", + "tags": [], + "label": "url", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.servicenow.configuration.url.default_value", + "type": "Uncategorized", + "tags": [], + "label": "default_value", + "description": [], + "signature": [ + "null" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.servicenow.configuration.url.depends_on", + "type": "Array", + "tags": [], + "label": "depends_on", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.servicenow.configuration.url.display", + "type": "string", + "tags": [], + "label": "display", + "description": [], + "signature": [ + { + "pluginId": "@kbn/search-connectors", + "scope": "common", + "docId": "kibKbnSearchConnectorsPluginApi", + "section": "def-common.DisplayType", + "text": "DisplayType" + }, + ".TEXTBOX" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.servicenow.configuration.url.label", + "type": "string", + "tags": [], + "label": "label", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.servicenow.configuration.url.options", + "type": "Array", + "tags": [], + "label": "options", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.servicenow.configuration.url.order", + "type": "number", + "tags": [], + "label": "order", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.servicenow.configuration.url.required", + "type": "boolean", + "tags": [], + "label": "required", + "description": [], + "signature": [ + "true" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.servicenow.configuration.url.sensitive", + "type": "boolean", + "tags": [], + "label": "sensitive", + "description": [], + "signature": [ + "false" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.servicenow.configuration.url.tooltip", + "type": "Uncategorized", + "tags": [], + "label": "tooltip", + "description": [], + "signature": [ + "null" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.servicenow.configuration.url.type", + "type": "string", + "tags": [], + "label": "type", + "description": [], + "signature": [ + { + "pluginId": "@kbn/search-connectors", + "scope": "common", + "docId": "kibKbnSearchConnectorsPluginApi", + "section": "def-common.FieldType", + "text": "FieldType" + }, + ".STRING" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.servicenow.configuration.url.ui_restrictions", + "type": "Array", + "tags": [], + "label": "ui_restrictions", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.servicenow.configuration.url.validations", + "type": "Array", + "tags": [], + "label": "validations", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.servicenow.configuration.url.value", + "type": "string", + "tags": [], + "label": "value", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + } + ] + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.servicenow.configuration.username", + "type": "Object", + "tags": [], + "label": "username", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.servicenow.configuration.username.default_value", + "type": "Uncategorized", + "tags": [], + "label": "default_value", + "description": [], + "signature": [ + "null" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.servicenow.configuration.username.depends_on", + "type": "Array", + "tags": [], + "label": "depends_on", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.servicenow.configuration.username.display", + "type": "string", + "tags": [], + "label": "display", + "description": [], + "signature": [ + { + "pluginId": "@kbn/search-connectors", + "scope": "common", + "docId": "kibKbnSearchConnectorsPluginApi", + "section": "def-common.DisplayType", + "text": "DisplayType" + }, + ".TEXTAREA" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.servicenow.configuration.username.label", + "type": "string", + "tags": [], + "label": "label", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.servicenow.configuration.username.options", + "type": "Array", + "tags": [], + "label": "options", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.servicenow.configuration.username.order", + "type": "number", + "tags": [], + "label": "order", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.servicenow.configuration.username.required", + "type": "boolean", + "tags": [], + "label": "required", + "description": [], + "signature": [ + "true" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.servicenow.configuration.username.sensitive", + "type": "boolean", + "tags": [], + "label": "sensitive", + "description": [], + "signature": [ + "false" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.servicenow.configuration.username.tooltip", + "type": "Uncategorized", + "tags": [], + "label": "tooltip", + "description": [], + "signature": [ + "null" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.servicenow.configuration.username.type", + "type": "string", + "tags": [], + "label": "type", + "description": [], + "signature": [ + { + "pluginId": "@kbn/search-connectors", + "scope": "common", + "docId": "kibKbnSearchConnectorsPluginApi", + "section": "def-common.FieldType", + "text": "FieldType" + }, + ".STRING" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.servicenow.configuration.username.ui_restrictions", + "type": "Array", + "tags": [], + "label": "ui_restrictions", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.servicenow.configuration.username.validations", + "type": "Array", + "tags": [], + "label": "validations", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.servicenow.configuration.username.value", + "type": "string", + "tags": [], + "label": "value", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + } + ] + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.servicenow.configuration.password", + "type": "Object", + "tags": [], + "label": "password", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.servicenow.configuration.password.default_value", + "type": "Uncategorized", + "tags": [], + "label": "default_value", + "description": [], + "signature": [ + "null" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.servicenow.configuration.password.depends_on", + "type": "Array", + "tags": [], + "label": "depends_on", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.servicenow.configuration.password.display", + "type": "string", + "tags": [], + "label": "display", + "description": [], + "signature": [ + { + "pluginId": "@kbn/search-connectors", + "scope": "common", + "docId": "kibKbnSearchConnectorsPluginApi", + "section": "def-common.DisplayType", + "text": "DisplayType" + }, + ".TEXTBOX" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.servicenow.configuration.password.label", + "type": "string", + "tags": [], + "label": "label", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.servicenow.configuration.password.options", + "type": "Array", + "tags": [], + "label": "options", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.servicenow.configuration.password.order", + "type": "number", + "tags": [], + "label": "order", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.servicenow.configuration.password.required", + "type": "boolean", + "tags": [], + "label": "required", + "description": [], + "signature": [ + "true" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.servicenow.configuration.password.sensitive", + "type": "boolean", + "tags": [], + "label": "sensitive", + "description": [], + "signature": [ + "true" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.servicenow.configuration.password.tooltip", + "type": "Uncategorized", + "tags": [], + "label": "tooltip", + "description": [], + "signature": [ + "null" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.servicenow.configuration.password.type", + "type": "string", + "tags": [], + "label": "type", + "description": [], + "signature": [ + { + "pluginId": "@kbn/search-connectors", + "scope": "common", + "docId": "kibKbnSearchConnectorsPluginApi", + "section": "def-common.FieldType", + "text": "FieldType" + }, + ".STRING" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.servicenow.configuration.password.ui_restrictions", + "type": "Array", + "tags": [], + "label": "ui_restrictions", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.servicenow.configuration.password.validations", + "type": "Array", + "tags": [], + "label": "validations", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.servicenow.configuration.password.value", + "type": "string", + "tags": [], + "label": "value", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + } + ] + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.servicenow.configuration.services", + "type": "Object", + "tags": [], + "label": "services", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.servicenow.configuration.services.default_value", + "type": "Uncategorized", + "tags": [], + "label": "default_value", + "description": [], + "signature": [ + "null" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.servicenow.configuration.services.depends_on", + "type": "Array", + "tags": [], + "label": "depends_on", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.servicenow.configuration.services.display", + "type": "string", + "tags": [], + "label": "display", + "description": [], + "signature": [ + { + "pluginId": "@kbn/search-connectors", + "scope": "common", + "docId": "kibKbnSearchConnectorsPluginApi", + "section": "def-common.DisplayType", + "text": "DisplayType" + }, + ".TEXTAREA" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.servicenow.configuration.services.label", + "type": "string", + "tags": [], + "label": "label", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.servicenow.configuration.services.options", + "type": "Array", + "tags": [], + "label": "options", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.servicenow.configuration.services.order", + "type": "number", + "tags": [], + "label": "order", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.servicenow.configuration.services.required", + "type": "boolean", + "tags": [], + "label": "required", + "description": [], + "signature": [ + "true" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.servicenow.configuration.services.sensitive", + "type": "boolean", + "tags": [], + "label": "sensitive", + "description": [], + "signature": [ + "false" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.servicenow.configuration.services.tooltip", + "type": "string", + "tags": [], + "label": "tooltip", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.servicenow.configuration.services.type", + "type": "string", + "tags": [], + "label": "type", + "description": [], + "signature": [ + { + "pluginId": "@kbn/search-connectors", + "scope": "common", + "docId": "kibKbnSearchConnectorsPluginApi", + "section": "def-common.FieldType", + "text": "FieldType" + }, + ".LIST" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.servicenow.configuration.services.ui_restrictions", + "type": "Array", + "tags": [], + "label": "ui_restrictions", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.servicenow.configuration.services.validations", + "type": "Array", + "tags": [], + "label": "validations", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.servicenow.configuration.services.value", + "type": "string", + "tags": [], + "label": "value", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + } + ] + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.servicenow.configuration.retry_count", + "type": "Object", + "tags": [], + "label": "retry_count", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.servicenow.configuration.retry_count.default_value", + "type": "number", + "tags": [], + "label": "default_value", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.servicenow.configuration.retry_count.depends_on", + "type": "Array", + "tags": [], + "label": "depends_on", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.servicenow.configuration.retry_count.display", + "type": "string", + "tags": [], + "label": "display", + "description": [], + "signature": [ + { + "pluginId": "@kbn/search-connectors", + "scope": "common", + "docId": "kibKbnSearchConnectorsPluginApi", + "section": "def-common.DisplayType", + "text": "DisplayType" + }, + ".NUMERIC" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.servicenow.configuration.retry_count.label", + "type": "string", + "tags": [], + "label": "label", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.servicenow.configuration.retry_count.options", + "type": "Array", + "tags": [], + "label": "options", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.servicenow.configuration.retry_count.order", + "type": "number", + "tags": [], + "label": "order", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.servicenow.configuration.retry_count.required", + "type": "boolean", + "tags": [], + "label": "required", + "description": [], + "signature": [ + "false" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.servicenow.configuration.retry_count.sensitive", + "type": "boolean", + "tags": [], + "label": "sensitive", + "description": [], + "signature": [ + "false" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.servicenow.configuration.retry_count.tooltip", + "type": "Uncategorized", + "tags": [], + "label": "tooltip", + "description": [], + "signature": [ + "null" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.servicenow.configuration.retry_count.type", + "type": "string", + "tags": [], + "label": "type", + "description": [], + "signature": [ + { + "pluginId": "@kbn/search-connectors", + "scope": "common", + "docId": "kibKbnSearchConnectorsPluginApi", + "section": "def-common.FieldType", + "text": "FieldType" + }, + ".INTEGER" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.servicenow.configuration.retry_count.ui_restrictions", + "type": "Array", + "tags": [], + "label": "ui_restrictions", + "description": [], + "signature": [ + "string[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.servicenow.configuration.retry_count.validations", + "type": "Array", + "tags": [], + "label": "validations", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.servicenow.configuration.retry_count.value", + "type": "number", + "tags": [], + "label": "value", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + } + ] + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.servicenow.configuration.concurrent_downloads", + "type": "Object", + "tags": [], + "label": "concurrent_downloads", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.servicenow.configuration.concurrent_downloads.default_value", + "type": "number", + "tags": [], + "label": "default_value", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.servicenow.configuration.concurrent_downloads.depends_on", + "type": "Array", + "tags": [], + "label": "depends_on", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.servicenow.configuration.concurrent_downloads.display", + "type": "string", + "tags": [], + "label": "display", + "description": [], + "signature": [ + { + "pluginId": "@kbn/search-connectors", + "scope": "common", + "docId": "kibKbnSearchConnectorsPluginApi", + "section": "def-common.DisplayType", + "text": "DisplayType" + }, + ".NUMERIC" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.servicenow.configuration.concurrent_downloads.label", + "type": "string", + "tags": [], + "label": "label", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.servicenow.configuration.concurrent_downloads.options", + "type": "Array", + "tags": [], + "label": "options", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.servicenow.configuration.concurrent_downloads.order", + "type": "number", + "tags": [], + "label": "order", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.servicenow.configuration.concurrent_downloads.required", + "type": "boolean", + "tags": [], + "label": "required", + "description": [], + "signature": [ + "false" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.servicenow.configuration.concurrent_downloads.sensitive", + "type": "boolean", + "tags": [], + "label": "sensitive", + "description": [], + "signature": [ + "false" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.servicenow.configuration.concurrent_downloads.tooltip", + "type": "Uncategorized", + "tags": [], + "label": "tooltip", + "description": [], + "signature": [ + "null" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.servicenow.configuration.concurrent_downloads.type", + "type": "string", + "tags": [], + "label": "type", + "description": [], + "signature": [ + { + "pluginId": "@kbn/search-connectors", + "scope": "common", + "docId": "kibKbnSearchConnectorsPluginApi", + "section": "def-common.FieldType", + "text": "FieldType" + }, + ".INTEGER" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.servicenow.configuration.concurrent_downloads.ui_restrictions", + "type": "Array", + "tags": [], + "label": "ui_restrictions", + "description": [], + "signature": [ + "string[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.servicenow.configuration.concurrent_downloads.validations", + "type": "Array", + "tags": [], + "label": "validations", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.servicenow.configuration.concurrent_downloads.value", + "type": "number", + "tags": [], + "label": "value", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + } + ] + } + ] + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.servicenow.features", + "type": "Object", + "tags": [], + "label": "features", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.servicenow.features.FeatureName.SYNC_RULES", + "type": "Object", + "tags": [], + "label": "[FeatureName.SYNC_RULES]", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.servicenow.features.FeatureName.SYNC_RULES.advanced", + "type": "Object", + "tags": [], + "label": "advanced", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.servicenow.features.FeatureName.SYNC_RULES.advanced.enabled", + "type": "boolean", + "tags": [], + "label": "enabled", + "description": [], + "signature": [ + "true" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + } + ] + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.servicenow.features.FeatureName.SYNC_RULES.basic", + "type": "Object", + "tags": [], + "label": "basic", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.servicenow.features.FeatureName.SYNC_RULES.basic.enabled", + "type": "boolean", + "tags": [], + "label": "enabled", + "description": [], + "signature": [ + "true" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + } + ] + } + ] + } + ] + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.servicenow.name", + "type": "string", + "tags": [], + "label": "name", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.servicenow.serviceType", + "type": "string", + "tags": [], + "label": "serviceType", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + } + ] + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.sharepoint_online", + "type": "Object", + "tags": [], + "label": "sharepoint_online", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.sharepoint_online.configuration", + "type": "Object", + "tags": [], + "label": "configuration", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.sharepoint_online.configuration.tenant_id", + "type": "Object", + "tags": [], + "label": "tenant_id", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.sharepoint_online.configuration.tenant_id.default_value", + "type": "Uncategorized", + "tags": [], + "label": "default_value", + "description": [], + "signature": [ + "null" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.sharepoint_online.configuration.tenant_id.depends_on", + "type": "Array", + "tags": [], + "label": "depends_on", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.sharepoint_online.configuration.tenant_id.display", + "type": "string", + "tags": [], + "label": "display", + "description": [], + "signature": [ + { + "pluginId": "@kbn/search-connectors", + "scope": "common", + "docId": "kibKbnSearchConnectorsPluginApi", + "section": "def-common.DisplayType", + "text": "DisplayType" + }, + ".TEXTBOX" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.sharepoint_online.configuration.tenant_id.label", + "type": "string", + "tags": [], + "label": "label", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.sharepoint_online.configuration.tenant_id.options", + "type": "Array", + "tags": [], + "label": "options", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.sharepoint_online.configuration.tenant_id.order", + "type": "number", + "tags": [], + "label": "order", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.sharepoint_online.configuration.tenant_id.required", + "type": "boolean", + "tags": [], + "label": "required", + "description": [], + "signature": [ + "true" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.sharepoint_online.configuration.tenant_id.sensitive", + "type": "boolean", + "tags": [], + "label": "sensitive", + "description": [], + "signature": [ + "false" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.sharepoint_online.configuration.tenant_id.tooltip", + "type": "string", + "tags": [], + "label": "tooltip", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.sharepoint_online.configuration.tenant_id.type", + "type": "string", + "tags": [], + "label": "type", + "description": [], + "signature": [ + { + "pluginId": "@kbn/search-connectors", + "scope": "common", + "docId": "kibKbnSearchConnectorsPluginApi", + "section": "def-common.FieldType", + "text": "FieldType" + }, + ".STRING" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.sharepoint_online.configuration.tenant_id.ui_restrictions", + "type": "Array", + "tags": [], + "label": "ui_restrictions", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.sharepoint_online.configuration.tenant_id.validations", + "type": "Array", + "tags": [], + "label": "validations", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.sharepoint_online.configuration.tenant_id.value", + "type": "string", + "tags": [], + "label": "value", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + } + ] + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.sharepoint_online.configuration.tenant_name", + "type": "Object", + "tags": [], + "label": "tenant_name", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.sharepoint_online.configuration.tenant_name.default_value", + "type": "Uncategorized", + "tags": [], + "label": "default_value", + "description": [], + "signature": [ + "null" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.sharepoint_online.configuration.tenant_name.depends_on", + "type": "Array", + "tags": [], + "label": "depends_on", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.sharepoint_online.configuration.tenant_name.display", + "type": "string", + "tags": [], + "label": "display", + "description": [], + "signature": [ + { + "pluginId": "@kbn/search-connectors", + "scope": "common", + "docId": "kibKbnSearchConnectorsPluginApi", + "section": "def-common.DisplayType", + "text": "DisplayType" + }, + ".TEXTBOX" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.sharepoint_online.configuration.tenant_name.label", + "type": "string", + "tags": [], + "label": "label", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.sharepoint_online.configuration.tenant_name.options", + "type": "Array", + "tags": [], + "label": "options", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.sharepoint_online.configuration.tenant_name.order", + "type": "number", + "tags": [], + "label": "order", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.sharepoint_online.configuration.tenant_name.required", + "type": "boolean", + "tags": [], + "label": "required", + "description": [], + "signature": [ + "true" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.sharepoint_online.configuration.tenant_name.sensitive", + "type": "boolean", + "tags": [], + "label": "sensitive", + "description": [], + "signature": [ + "false" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.sharepoint_online.configuration.tenant_name.tooltip", + "type": "string", + "tags": [], + "label": "tooltip", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.sharepoint_online.configuration.tenant_name.type", + "type": "string", + "tags": [], + "label": "type", + "description": [], + "signature": [ + { + "pluginId": "@kbn/search-connectors", + "scope": "common", + "docId": "kibKbnSearchConnectorsPluginApi", + "section": "def-common.FieldType", + "text": "FieldType" + }, + ".STRING" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.sharepoint_online.configuration.tenant_name.ui_restrictions", + "type": "Array", + "tags": [], + "label": "ui_restrictions", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.sharepoint_online.configuration.tenant_name.validations", + "type": "Array", + "tags": [], + "label": "validations", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.sharepoint_online.configuration.tenant_name.value", + "type": "string", + "tags": [], + "label": "value", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + } + ] + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.sharepoint_online.configuration.client_id", + "type": "Object", + "tags": [], + "label": "client_id", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.sharepoint_online.configuration.client_id.default_value", + "type": "Uncategorized", + "tags": [], + "label": "default_value", + "description": [], + "signature": [ + "null" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.sharepoint_online.configuration.client_id.depends_on", + "type": "Array", + "tags": [], + "label": "depends_on", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.sharepoint_online.configuration.client_id.display", + "type": "string", + "tags": [], + "label": "display", + "description": [], + "signature": [ + { + "pluginId": "@kbn/search-connectors", + "scope": "common", + "docId": "kibKbnSearchConnectorsPluginApi", + "section": "def-common.DisplayType", + "text": "DisplayType" + }, + ".TEXTBOX" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.sharepoint_online.configuration.client_id.label", + "type": "string", + "tags": [], + "label": "label", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.sharepoint_online.configuration.client_id.options", + "type": "Array", + "tags": [], + "label": "options", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.sharepoint_online.configuration.client_id.order", + "type": "number", + "tags": [], + "label": "order", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.sharepoint_online.configuration.client_id.required", + "type": "boolean", + "tags": [], + "label": "required", + "description": [], + "signature": [ + "true" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.sharepoint_online.configuration.client_id.sensitive", + "type": "boolean", + "tags": [], + "label": "sensitive", + "description": [], + "signature": [ + "false" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.sharepoint_online.configuration.client_id.tooltip", + "type": "string", + "tags": [], + "label": "tooltip", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.sharepoint_online.configuration.client_id.type", + "type": "string", + "tags": [], + "label": "type", + "description": [], + "signature": [ + { + "pluginId": "@kbn/search-connectors", + "scope": "common", + "docId": "kibKbnSearchConnectorsPluginApi", + "section": "def-common.FieldType", + "text": "FieldType" + }, + ".STRING" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.sharepoint_online.configuration.client_id.ui_restrictions", + "type": "Array", + "tags": [], + "label": "ui_restrictions", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.sharepoint_online.configuration.client_id.validations", + "type": "Array", + "tags": [], + "label": "validations", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.sharepoint_online.configuration.client_id.value", + "type": "string", + "tags": [], + "label": "value", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + } + ] + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.sharepoint_online.configuration.secret_value", + "type": "Object", + "tags": [], + "label": "secret_value", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.sharepoint_online.configuration.secret_value.default_value", + "type": "Uncategorized", + "tags": [], + "label": "default_value", + "description": [], + "signature": [ + "null" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.sharepoint_online.configuration.secret_value.depends_on", + "type": "Array", + "tags": [], + "label": "depends_on", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.sharepoint_online.configuration.secret_value.display", + "type": "string", + "tags": [], + "label": "display", + "description": [], + "signature": [ + { + "pluginId": "@kbn/search-connectors", + "scope": "common", + "docId": "kibKbnSearchConnectorsPluginApi", + "section": "def-common.DisplayType", + "text": "DisplayType" + }, + ".TEXTBOX" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.sharepoint_online.configuration.secret_value.label", + "type": "string", + "tags": [], + "label": "label", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.sharepoint_online.configuration.secret_value.options", + "type": "Array", + "tags": [], + "label": "options", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.sharepoint_online.configuration.secret_value.order", + "type": "number", + "tags": [], + "label": "order", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.sharepoint_online.configuration.secret_value.required", + "type": "boolean", + "tags": [], + "label": "required", + "description": [], + "signature": [ + "true" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.sharepoint_online.configuration.secret_value.sensitive", + "type": "boolean", + "tags": [], + "label": "sensitive", + "description": [], + "signature": [ + "true" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.sharepoint_online.configuration.secret_value.tooltip", + "type": "string", + "tags": [], + "label": "tooltip", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.sharepoint_online.configuration.secret_value.type", + "type": "string", + "tags": [], + "label": "type", + "description": [], + "signature": [ + { + "pluginId": "@kbn/search-connectors", + "scope": "common", + "docId": "kibKbnSearchConnectorsPluginApi", + "section": "def-common.FieldType", + "text": "FieldType" + }, + ".STRING" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.sharepoint_online.configuration.secret_value.ui_restrictions", + "type": "Array", + "tags": [], + "label": "ui_restrictions", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.sharepoint_online.configuration.secret_value.validations", + "type": "Array", + "tags": [], + "label": "validations", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.sharepoint_online.configuration.secret_value.value", + "type": "string", + "tags": [], + "label": "value", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + } + ] + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.sharepoint_online.configuration.site_collections", + "type": "Object", + "tags": [], + "label": "site_collections", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.sharepoint_online.configuration.site_collections.default_value", + "type": "Uncategorized", + "tags": [], + "label": "default_value", + "description": [], + "signature": [ + "null" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.sharepoint_online.configuration.site_collections.depends_on", + "type": "Array", + "tags": [], + "label": "depends_on", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.sharepoint_online.configuration.site_collections.display", + "type": "string", + "tags": [], + "label": "display", + "description": [], + "signature": [ + { + "pluginId": "@kbn/search-connectors", + "scope": "common", + "docId": "kibKbnSearchConnectorsPluginApi", + "section": "def-common.DisplayType", + "text": "DisplayType" + }, + ".TEXTAREA" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.sharepoint_online.configuration.site_collections.label", + "type": "string", + "tags": [], + "label": "label", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.sharepoint_online.configuration.site_collections.options", + "type": "Array", + "tags": [], + "label": "options", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.sharepoint_online.configuration.site_collections.order", + "type": "number", + "tags": [], + "label": "order", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.sharepoint_online.configuration.site_collections.required", + "type": "boolean", + "tags": [], + "label": "required", + "description": [], + "signature": [ + "true" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.sharepoint_online.configuration.site_collections.sensitive", + "type": "boolean", + "tags": [], + "label": "sensitive", + "description": [], + "signature": [ + "false" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.sharepoint_online.configuration.site_collections.tooltip", + "type": "string", + "tags": [], + "label": "tooltip", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.sharepoint_online.configuration.site_collections.type", + "type": "string", + "tags": [], + "label": "type", + "description": [], + "signature": [ + { + "pluginId": "@kbn/search-connectors", + "scope": "common", + "docId": "kibKbnSearchConnectorsPluginApi", + "section": "def-common.FieldType", + "text": "FieldType" + }, + ".LIST" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.sharepoint_online.configuration.site_collections.ui_restrictions", + "type": "Array", + "tags": [], + "label": "ui_restrictions", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.sharepoint_online.configuration.site_collections.validations", + "type": "Array", + "tags": [], + "label": "validations", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.sharepoint_online.configuration.site_collections.value", + "type": "string", + "tags": [], + "label": "value", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + } + ] + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.sharepoint_online.configuration.use_text_extraction_service", + "type": "Object", + "tags": [], + "label": "use_text_extraction_service", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.sharepoint_online.configuration.use_text_extraction_service.default_value", + "type": "boolean", + "tags": [], + "label": "default_value", + "description": [], + "signature": [ + "false" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.sharepoint_online.configuration.use_text_extraction_service.depends_on", + "type": "Array", + "tags": [], + "label": "depends_on", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.sharepoint_online.configuration.use_text_extraction_service.display", + "type": "string", + "tags": [], + "label": "display", + "description": [], + "signature": [ + { + "pluginId": "@kbn/search-connectors", + "scope": "common", + "docId": "kibKbnSearchConnectorsPluginApi", + "section": "def-common.DisplayType", + "text": "DisplayType" + }, + ".TOGGLE" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.sharepoint_online.configuration.use_text_extraction_service.label", + "type": "string", + "tags": [], + "label": "label", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.sharepoint_online.configuration.use_text_extraction_service.options", + "type": "Array", + "tags": [], + "label": "options", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.sharepoint_online.configuration.use_text_extraction_service.order", + "type": "number", + "tags": [], + "label": "order", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.sharepoint_online.configuration.use_text_extraction_service.required", + "type": "boolean", + "tags": [], + "label": "required", + "description": [], + "signature": [ + "true" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.sharepoint_online.configuration.use_text_extraction_service.sensitive", + "type": "boolean", + "tags": [], + "label": "sensitive", + "description": [], + "signature": [ + "false" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.sharepoint_online.configuration.use_text_extraction_service.tooltip", + "type": "string", + "tags": [], + "label": "tooltip", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.sharepoint_online.configuration.use_text_extraction_service.type", + "type": "string", + "tags": [], + "label": "type", + "description": [], + "signature": [ + { + "pluginId": "@kbn/search-connectors", + "scope": "common", + "docId": "kibKbnSearchConnectorsPluginApi", + "section": "def-common.FieldType", + "text": "FieldType" + }, + ".BOOLEAN" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.sharepoint_online.configuration.use_text_extraction_service.ui_restrictions", + "type": "Array", + "tags": [], + "label": "ui_restrictions", + "description": [], + "signature": [ + "string[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.sharepoint_online.configuration.use_text_extraction_service.validations", + "type": "Array", + "tags": [], + "label": "validations", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.sharepoint_online.configuration.use_text_extraction_service.value", + "type": "boolean", + "tags": [], + "label": "value", + "description": [], + "signature": [ + "false" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + } + ] + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.sharepoint_online.configuration.use_document_level_security", + "type": "Object", + "tags": [], + "label": "use_document_level_security", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.sharepoint_online.configuration.use_document_level_security.default_value", + "type": "boolean", + "tags": [], + "label": "default_value", + "description": [], + "signature": [ + "false" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.sharepoint_online.configuration.use_document_level_security.depends_on", + "type": "Array", + "tags": [], + "label": "depends_on", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.sharepoint_online.configuration.use_document_level_security.display", + "type": "string", + "tags": [], + "label": "display", + "description": [], + "signature": [ + { + "pluginId": "@kbn/search-connectors", + "scope": "common", + "docId": "kibKbnSearchConnectorsPluginApi", + "section": "def-common.DisplayType", + "text": "DisplayType" + }, + ".TOGGLE" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.sharepoint_online.configuration.use_document_level_security.label", + "type": "string", + "tags": [], + "label": "label", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.sharepoint_online.configuration.use_document_level_security.options", + "type": "Array", + "tags": [], + "label": "options", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.sharepoint_online.configuration.use_document_level_security.order", + "type": "number", + "tags": [], + "label": "order", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.sharepoint_online.configuration.use_document_level_security.required", + "type": "boolean", + "tags": [], + "label": "required", + "description": [], + "signature": [ + "true" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.sharepoint_online.configuration.use_document_level_security.sensitive", + "type": "boolean", + "tags": [], + "label": "sensitive", + "description": [], + "signature": [ + "false" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.sharepoint_online.configuration.use_document_level_security.tooltip", + "type": "string", + "tags": [], + "label": "tooltip", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.sharepoint_online.configuration.use_document_level_security.type", + "type": "string", + "tags": [], + "label": "type", + "description": [], + "signature": [ + { + "pluginId": "@kbn/search-connectors", + "scope": "common", + "docId": "kibKbnSearchConnectorsPluginApi", + "section": "def-common.FieldType", + "text": "FieldType" + }, + ".BOOLEAN" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.sharepoint_online.configuration.use_document_level_security.ui_restrictions", + "type": "Array", + "tags": [], + "label": "ui_restrictions", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.sharepoint_online.configuration.use_document_level_security.validations", + "type": "Array", + "tags": [], + "label": "validations", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.sharepoint_online.configuration.use_document_level_security.value", + "type": "boolean", + "tags": [], + "label": "value", + "description": [], + "signature": [ + "false" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + } + ] + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.sharepoint_online.configuration.fetch_drive_item_permissions", + "type": "Object", + "tags": [], + "label": "fetch_drive_item_permissions", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.sharepoint_online.configuration.fetch_drive_item_permissions.default_value", + "type": "boolean", + "tags": [], + "label": "default_value", + "description": [], + "signature": [ + "true" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.sharepoint_online.configuration.fetch_drive_item_permissions.depends_on", + "type": "Array", + "tags": [], + "label": "depends_on", + "description": [], + "signature": [ + "{ field: string; value: true; }[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.sharepoint_online.configuration.fetch_drive_item_permissions.display", + "type": "string", + "tags": [], + "label": "display", + "description": [], + "signature": [ + { + "pluginId": "@kbn/search-connectors", + "scope": "common", + "docId": "kibKbnSearchConnectorsPluginApi", + "section": "def-common.DisplayType", + "text": "DisplayType" + }, + ".TOGGLE" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.sharepoint_online.configuration.fetch_drive_item_permissions.label", + "type": "string", + "tags": [], + "label": "label", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.sharepoint_online.configuration.fetch_drive_item_permissions.options", + "type": "Array", + "tags": [], + "label": "options", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.sharepoint_online.configuration.fetch_drive_item_permissions.order", + "type": "number", + "tags": [], + "label": "order", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.sharepoint_online.configuration.fetch_drive_item_permissions.required", + "type": "boolean", + "tags": [], + "label": "required", + "description": [], + "signature": [ + "true" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.sharepoint_online.configuration.fetch_drive_item_permissions.sensitive", + "type": "boolean", + "tags": [], + "label": "sensitive", + "description": [], + "signature": [ + "false" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.sharepoint_online.configuration.fetch_drive_item_permissions.tooltip", + "type": "string", + "tags": [], + "label": "tooltip", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.sharepoint_online.configuration.fetch_drive_item_permissions.type", + "type": "string", + "tags": [], + "label": "type", + "description": [], + "signature": [ + { + "pluginId": "@kbn/search-connectors", + "scope": "common", + "docId": "kibKbnSearchConnectorsPluginApi", + "section": "def-common.FieldType", + "text": "FieldType" + }, + ".BOOLEAN" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.sharepoint_online.configuration.fetch_drive_item_permissions.ui_restrictions", + "type": "Array", + "tags": [], + "label": "ui_restrictions", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.sharepoint_online.configuration.fetch_drive_item_permissions.validations", + "type": "Array", + "tags": [], + "label": "validations", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.sharepoint_online.configuration.fetch_drive_item_permissions.value", + "type": "boolean", + "tags": [], + "label": "value", + "description": [], + "signature": [ + "true" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + } + ] + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.sharepoint_online.configuration.fetch_unique_page_permissions", + "type": "Object", + "tags": [], + "label": "fetch_unique_page_permissions", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.sharepoint_online.configuration.fetch_unique_page_permissions.default_value", + "type": "boolean", + "tags": [], + "label": "default_value", + "description": [], + "signature": [ + "true" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.sharepoint_online.configuration.fetch_unique_page_permissions.depends_on", + "type": "Array", + "tags": [], + "label": "depends_on", + "description": [], + "signature": [ + "{ field: string; value: true; }[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.sharepoint_online.configuration.fetch_unique_page_permissions.display", + "type": "string", + "tags": [], + "label": "display", + "description": [], + "signature": [ + { + "pluginId": "@kbn/search-connectors", + "scope": "common", + "docId": "kibKbnSearchConnectorsPluginApi", + "section": "def-common.DisplayType", + "text": "DisplayType" + }, + ".TOGGLE" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.sharepoint_online.configuration.fetch_unique_page_permissions.label", + "type": "string", + "tags": [], + "label": "label", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.sharepoint_online.configuration.fetch_unique_page_permissions.options", + "type": "Array", + "tags": [], + "label": "options", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.sharepoint_online.configuration.fetch_unique_page_permissions.order", + "type": "number", + "tags": [], + "label": "order", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.sharepoint_online.configuration.fetch_unique_page_permissions.required", + "type": "boolean", + "tags": [], + "label": "required", + "description": [], + "signature": [ + "true" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.sharepoint_online.configuration.fetch_unique_page_permissions.sensitive", + "type": "boolean", + "tags": [], + "label": "sensitive", + "description": [], + "signature": [ + "false" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.sharepoint_online.configuration.fetch_unique_page_permissions.tooltip", + "type": "string", + "tags": [], + "label": "tooltip", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.sharepoint_online.configuration.fetch_unique_page_permissions.type", + "type": "string", + "tags": [], + "label": "type", + "description": [], + "signature": [ + { + "pluginId": "@kbn/search-connectors", + "scope": "common", + "docId": "kibKbnSearchConnectorsPluginApi", + "section": "def-common.FieldType", + "text": "FieldType" + }, + ".BOOLEAN" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.sharepoint_online.configuration.fetch_unique_page_permissions.ui_restrictions", + "type": "Array", + "tags": [], + "label": "ui_restrictions", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.sharepoint_online.configuration.fetch_unique_page_permissions.validations", + "type": "Array", + "tags": [], + "label": "validations", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.sharepoint_online.configuration.fetch_unique_page_permissions.value", + "type": "boolean", + "tags": [], + "label": "value", + "description": [], + "signature": [ + "true" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + } + ] + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.sharepoint_online.configuration.fetch_unique_list_permissions", + "type": "Object", + "tags": [], + "label": "fetch_unique_list_permissions", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.sharepoint_online.configuration.fetch_unique_list_permissions.default_value", + "type": "boolean", + "tags": [], + "label": "default_value", + "description": [], + "signature": [ + "true" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.sharepoint_online.configuration.fetch_unique_list_permissions.depends_on", + "type": "Array", + "tags": [], + "label": "depends_on", + "description": [], + "signature": [ + "{ field: string; value: true; }[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.sharepoint_online.configuration.fetch_unique_list_permissions.display", + "type": "string", + "tags": [], + "label": "display", + "description": [], + "signature": [ + { + "pluginId": "@kbn/search-connectors", + "scope": "common", + "docId": "kibKbnSearchConnectorsPluginApi", + "section": "def-common.DisplayType", + "text": "DisplayType" + }, + ".TOGGLE" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.sharepoint_online.configuration.fetch_unique_list_permissions.label", + "type": "string", + "tags": [], + "label": "label", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.sharepoint_online.configuration.fetch_unique_list_permissions.options", + "type": "Array", + "tags": [], + "label": "options", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.sharepoint_online.configuration.fetch_unique_list_permissions.order", + "type": "number", + "tags": [], + "label": "order", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.sharepoint_online.configuration.fetch_unique_list_permissions.required", + "type": "boolean", + "tags": [], + "label": "required", + "description": [], + "signature": [ + "true" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.sharepoint_online.configuration.fetch_unique_list_permissions.sensitive", + "type": "boolean", + "tags": [], + "label": "sensitive", + "description": [], + "signature": [ + "false" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.sharepoint_online.configuration.fetch_unique_list_permissions.tooltip", + "type": "string", + "tags": [], + "label": "tooltip", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.sharepoint_online.configuration.fetch_unique_list_permissions.type", + "type": "string", + "tags": [], + "label": "type", + "description": [], + "signature": [ + { + "pluginId": "@kbn/search-connectors", + "scope": "common", + "docId": "kibKbnSearchConnectorsPluginApi", + "section": "def-common.FieldType", + "text": "FieldType" + }, + ".BOOLEAN" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.sharepoint_online.configuration.fetch_unique_list_permissions.ui_restrictions", + "type": "Array", + "tags": [], + "label": "ui_restrictions", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.sharepoint_online.configuration.fetch_unique_list_permissions.validations", + "type": "Array", + "tags": [], + "label": "validations", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.sharepoint_online.configuration.fetch_unique_list_permissions.value", + "type": "boolean", + "tags": [], + "label": "value", + "description": [], + "signature": [ + "true" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + } + ] + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.sharepoint_online.configuration.fetch_unique_list_item_permissions", + "type": "Object", + "tags": [], + "label": "fetch_unique_list_item_permissions", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.sharepoint_online.configuration.fetch_unique_list_item_permissions.default_value", + "type": "boolean", + "tags": [], + "label": "default_value", + "description": [], + "signature": [ + "true" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.sharepoint_online.configuration.fetch_unique_list_item_permissions.depends_on", + "type": "Array", + "tags": [], + "label": "depends_on", + "description": [], + "signature": [ + "{ field: string; value: true; }[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.sharepoint_online.configuration.fetch_unique_list_item_permissions.display", + "type": "string", + "tags": [], + "label": "display", + "description": [], + "signature": [ + { + "pluginId": "@kbn/search-connectors", + "scope": "common", + "docId": "kibKbnSearchConnectorsPluginApi", + "section": "def-common.DisplayType", + "text": "DisplayType" + }, + ".TOGGLE" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.sharepoint_online.configuration.fetch_unique_list_item_permissions.label", + "type": "string", + "tags": [], + "label": "label", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.sharepoint_online.configuration.fetch_unique_list_item_permissions.options", + "type": "Array", + "tags": [], + "label": "options", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.sharepoint_online.configuration.fetch_unique_list_item_permissions.order", + "type": "number", + "tags": [], + "label": "order", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.sharepoint_online.configuration.fetch_unique_list_item_permissions.required", + "type": "boolean", + "tags": [], + "label": "required", + "description": [], + "signature": [ + "true" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.sharepoint_online.configuration.fetch_unique_list_item_permissions.sensitive", + "type": "boolean", + "tags": [], + "label": "sensitive", + "description": [], + "signature": [ + "false" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.sharepoint_online.configuration.fetch_unique_list_item_permissions.tooltip", + "type": "string", + "tags": [], + "label": "tooltip", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.sharepoint_online.configuration.fetch_unique_list_item_permissions.type", + "type": "string", + "tags": [], + "label": "type", + "description": [], + "signature": [ + { + "pluginId": "@kbn/search-connectors", + "scope": "common", + "docId": "kibKbnSearchConnectorsPluginApi", + "section": "def-common.FieldType", + "text": "FieldType" + }, + ".BOOLEAN" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.sharepoint_online.configuration.fetch_unique_list_item_permissions.ui_restrictions", + "type": "Array", + "tags": [], + "label": "ui_restrictions", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.sharepoint_online.configuration.fetch_unique_list_item_permissions.validations", + "type": "Array", + "tags": [], + "label": "validations", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.sharepoint_online.configuration.fetch_unique_list_item_permissions.value", + "type": "boolean", + "tags": [], + "label": "value", + "description": [], + "signature": [ + "true" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + } + ] + } + ] + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.sharepoint_online.features", + "type": "Object", + "tags": [], + "label": "features", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.sharepoint_online.features.FeatureName.SYNC_RULES", + "type": "Object", + "tags": [], + "label": "[FeatureName.SYNC_RULES]", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.sharepoint_online.features.FeatureName.SYNC_RULES.advanced", + "type": "Object", + "tags": [], + "label": "advanced", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.sharepoint_online.features.FeatureName.SYNC_RULES.advanced.enabled", + "type": "boolean", + "tags": [], + "label": "enabled", + "description": [], + "signature": [ + "true" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + } + ] + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.sharepoint_online.features.FeatureName.SYNC_RULES.basic", + "type": "Object", + "tags": [], + "label": "basic", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.sharepoint_online.features.FeatureName.SYNC_RULES.basic.enabled", + "type": "boolean", + "tags": [], + "label": "enabled", + "description": [], + "signature": [ + "true" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + } + ] + } + ] + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.sharepoint_online.features.FeatureName.DOCUMENT_LEVEL_SECURITY", + "type": "Object", + "tags": [], + "label": "[FeatureName.DOCUMENT_LEVEL_SECURITY]", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.sharepoint_online.features.FeatureName.DOCUMENT_LEVEL_SECURITY.enabled", + "type": "boolean", + "tags": [], + "label": "enabled", + "description": [], + "signature": [ + "true" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + } + ] + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.sharepoint_online.features.FeatureName.INCREMENTAL_SYNC", + "type": "Object", + "tags": [], + "label": "[FeatureName.INCREMENTAL_SYNC]", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.sharepoint_online.features.FeatureName.INCREMENTAL_SYNC.enabled", + "type": "boolean", + "tags": [], + "label": "enabled", + "description": [], + "signature": [ + "true" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + } + ] + } + ] + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.sharepoint_online.name", + "type": "string", + "tags": [], + "label": "name", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.sharepoint_online.serviceType", + "type": "string", + "tags": [], + "label": "serviceType", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + } + ] + } + ], + "initialIsOpen": false + } + ] + } +} \ No newline at end of file diff --git a/api_docs/kbn_search_connectors.mdx b/api_docs/kbn_search_connectors.mdx new file mode 100644 index 0000000000000..4890a772ccf2b --- /dev/null +++ b/api_docs/kbn_search_connectors.mdx @@ -0,0 +1,42 @@ +--- +#### +#### 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: kibKbnSearchConnectorsPluginApi +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-09-07 +tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/search-connectors'] +--- +import kbnSearchConnectorsObj from './kbn_search_connectors.devdocs.json'; + + + +Contact [@elastic/enterprise-search-frontend](https://github.com/orgs/elastic/teams/enterprise-search-frontend) for questions regarding this plugin. + +**Code health stats** + +| Public API count | Any count | Items lacking comments | Missing exports | +|-------------------|-----------|------------------------|-----------------| +| 1678 | 0 | 1678 | 0 | + +## Common + +### Objects + + +### Functions + + +### Interfaces + + +### Enums + + +### Consts, variables and types + + diff --git a/api_docs/kbn_search_response_warnings.mdx b/api_docs/kbn_search_response_warnings.mdx index b61b3acebc30b..2033ae03e8042 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-09-06 +date: 2023-09-07 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 52f9bf0331d66..2997ced54d756 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-09-06 +date: 2023-09-07 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 21a9a0d4229eb..58ae7b3192bb9 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-09-06 +date: 2023-09-07 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 8535e3c2ceb45..ac0456fb4605f 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-09-06 +date: 2023-09-07 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 0989d2c61bc6c..b9b2beb5b8922 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-09-06 +date: 2023-09-07 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 618fce3049404..8a680f4990f0b 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-09-06 +date: 2023-09-07 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 b59feab2155c5..a94d5b0a66478 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-09-06 +date: 2023-09-07 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 9b6e5f38500a4..df9860416e9e7 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-09-06 +date: 2023-09-07 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 de06ac2178b85..9bc2a09b2c584 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-09-06 +date: 2023-09-07 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 8dc2abd94a379..23eb702e4b133 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-09-06 +date: 2023-09-07 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 b0b4e63b53415..e899a50967092 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-09-06 +date: 2023-09-07 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 98e145e6c291a..2d80d442c224f 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-09-06 +date: 2023-09-07 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 be1b7c054f509..9ba791d98cb92 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-09-06 +date: 2023-09-07 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 f8c8e1d9bce9e..55b130a716ecb 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-09-06 +date: 2023-09-07 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 9fd2114f82497..7da2c80b5e2c8 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-09-06 +date: 2023-09-07 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 4674d7f39cc79..b4867b8d8038e 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-09-06 +date: 2023-09-07 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 812a2357c9c1c..ea1d190889a5a 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-09-06 +date: 2023-09-07 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 f23fad4563b05..179bde08dacab 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-09-06 +date: 2023-09-07 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 2684bdf0d61e2..8ecd26e5090f7 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-09-06 +date: 2023-09-07 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 4aa83b1b2a28a..34f16182953d9 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-09-06 +date: 2023-09-07 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 fb5c6248a7aa4..945ad028a13fc 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-09-06 +date: 2023-09-07 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 272b283e3809f..184454e347255 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-09-06 +date: 2023-09-07 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 6cfe959f3b6a8..b99d6c8625d05 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-09-06 +date: 2023-09-07 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 fc08e81a4f1d4..04248bbb3a89a 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-09-06 +date: 2023-09-07 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 e75c15121e929..19caf9de588ab 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-09-06 +date: 2023-09-07 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_project_switcher.mdx b/api_docs/kbn_serverless_project_switcher.mdx index a15223e4a5b18..67e1ba7f000b3 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-09-06 +date: 2023-09-07 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_storybook_config.mdx b/api_docs/kbn_serverless_storybook_config.mdx index 45f677c9b03a8..a6e103c9db23d 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-09-06 +date: 2023-09-07 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 d7e66c2dfcafb..d66c53efc2896 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-09-06 +date: 2023-09-07 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 2a7a12643f66c..607215f3a3795 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-09-06 +date: 2023-09-07 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 6d03355f6bb90..11a87e549e02f 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-09-06 +date: 2023-09-07 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 5000f6af0f8f1..2d8f7b57050fb 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-09-06 +date: 2023-09-07 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 78930ef11a46c..71afff3c16311 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-09-06 +date: 2023-09-07 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 2fb5ef4f4d1ab..11a327f867780 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-09-06 +date: 2023-09-07 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 c401fc4ae57cc..a131b00d7037c 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-09-06 +date: 2023-09-07 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 2f49e7214e438..e6d1d8d6cfebe 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-09-06 +date: 2023-09-07 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 932e071d8c4e3..2bddc8d071f2c 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-09-06 +date: 2023-09-07 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_file_context.mdx b/api_docs/kbn_shared_ux_file_context.mdx index 1e6a87987a4f2..1fe09d51dde94 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-09-06 +date: 2023-09-07 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 195ca50f84803..0aebbbeaf1483 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-09-06 +date: 2023-09-07 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 56aae935b33b6..37e9757141b66 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-09-06 +date: 2023-09-07 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 be3191df40254..226b7d9d5bf96 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-09-06 +date: 2023-09-07 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 cbafafdf15054..c71cde909ac68 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-09-06 +date: 2023-09-07 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 ca5b614f31f5e..98c7f15bb0994 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-09-06 +date: 2023-09-07 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 e93ae95420c38..78e2cf9c7f7b4 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-09-06 +date: 2023-09-07 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 e700985ce82b4..7a85f2d5486d1 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-09-06 +date: 2023-09-07 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 f04034c8db728..ec4c9b5816192 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-09-06 +date: 2023-09-07 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 221bc0e89d69b..df8b4f1f1aec0 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-09-06 +date: 2023-09-07 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 9304bde1efab8..bb88ada3f8567 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-09-06 +date: 2023-09-07 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 76c8f65bf9a38..db3ffa26ad7a9 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-09-06 +date: 2023-09-07 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 c51b4524362ff..7dcc6c375e929 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-09-06 +date: 2023-09-07 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 ead37eb00cd9d..160fb9bbe0c00 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-09-06 +date: 2023-09-07 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 5138e162e33f4..b70e59cc750b0 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-09-06 +date: 2023-09-07 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 7239a015c29f4..91c11e282894d 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-09-06 +date: 2023-09-07 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 fa8bd59e552a6..75fd7771c4089 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-09-06 +date: 2023-09-07 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 ff4e2959c6d3e..98ecc523d6e00 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-09-06 +date: 2023-09-07 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 4f737aa135efc..50fdd48412e87 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-09-06 +date: 2023-09-07 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 96f74da39a60e..ae54321f280b6 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-09-06 +date: 2023-09-07 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 88245cb24a015..3f885ae4a6ae5 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-09-06 +date: 2023-09-07 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 39f5d7cd276e7..eab5f66ef4f26 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-09-06 +date: 2023-09-07 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 96fc64390daf1..fb729f83c61f5 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-09-06 +date: 2023-09-07 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 beb8813a7170f..50702f90b9584 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-09-06 +date: 2023-09-07 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 6df2460db09a5..b329f8ffc200b 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-09-06 +date: 2023-09-07 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 7d9bdd1d9570d..35eae4c7b2385 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-09-06 +date: 2023-09-07 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 0f5fb94765341..3a19fb8452525 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-09-06 +date: 2023-09-07 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 6912120abed7c..cca3e5fac1d82 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-09-06 +date: 2023-09-07 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 68926ed3daf26..8cc1caef1c9ca 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-09-06 +date: 2023-09-07 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 7e9cb4fc44597..b0265f06902dc 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-09-06 +date: 2023-09-07 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 e3919b804ff70..741413373b3a1 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-09-06 +date: 2023-09-07 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 a3231fcbe7b8c..85e5b09ee7902 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-09-06 +date: 2023-09-07 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 625a1baf66680..14e14d8f992ac 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-09-06 +date: 2023-09-07 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 67f61e7309c88..9ce936ff20a1c 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-09-06 +date: 2023-09-07 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 9488d28e11bbe..91e4a31fa075d 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-09-06 +date: 2023-09-07 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 837b297215919..7dde4b582a377 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-09-06 +date: 2023-09-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/storybook'] --- import kbnStorybookObj from './kbn_storybook.devdocs.json'; diff --git a/api_docs/kbn_telemetry_tools.mdx b/api_docs/kbn_telemetry_tools.mdx index 163e9fad938f4..3680cf1302754 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-09-06 +date: 2023-09-07 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 9d077f5729f64..585243f0d11c1 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-09-06 +date: 2023-09-07 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 f7448b3c6e089..805a6732235fe 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-09-06 +date: 2023-09-07 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 e5765ce453870..8bf5969c3008f 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-09-06 +date: 2023-09-07 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 64e7ed9a883be..cc19ee9893681 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-09-06 +date: 2023-09-07 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 2e4e64028de10..4fe3ac6b07284 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-09-06 +date: 2023-09-07 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 e8f536396cd3c..e631bb711c2b4 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-09-06 +date: 2023-09-07 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 b32fffce5ce5f..e76a497196857 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-09-06 +date: 2023-09-07 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 6af725a802219..1e814fa3d4ccb 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-09-06 +date: 2023-09-07 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.mdx b/api_docs/kbn_ui_shared_deps_src.mdx index 175f75d1c9c72..7475de30bd9a4 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-09-06 +date: 2023-09-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ui-shared-deps-src'] --- import kbnUiSharedDepsSrcObj from './kbn_ui_shared_deps_src.devdocs.json'; diff --git a/api_docs/kbn_ui_theme.mdx b/api_docs/kbn_ui_theme.mdx index cf4823a41b994..a340d88f5ab70 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-09-06 +date: 2023-09-07 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 30d39fbab123b..9c5f77d82201a 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-09-06 +date: 2023-09-07 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 86f54f4a13e60..b5e82b583d0a5 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-09-06 +date: 2023-09-07 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 861b929e842e1..86a83b3189fa3 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-09-06 +date: 2023-09-07 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 931a77d995dd5..e9de9d3448bd9 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-09-06 +date: 2023-09-07 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 5fa41d11ace3c..911acbe78fe8e 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-09-06 +date: 2023-09-07 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 bd6a2a9fea7ae..d5860fd8ef363 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-09-06 +date: 2023-09-07 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 2266479569fb7..a6eb09c191601 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-09-06 +date: 2023-09-07 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 85666acc83ea4..92d19d7f82165 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-09-06 +date: 2023-09-07 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 d6cf87ff8567d..de435a2a3f42d 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-09-06 +date: 2023-09-07 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 5cc15cfbba8a8..ff4e0362e5c2f 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-09-06 +date: 2023-09-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/visualization-ui-components'] --- import kbnVisualizationUiComponentsObj from './kbn_visualization_ui_components.devdocs.json'; diff --git a/api_docs/kbn_yarn_lock_validator.mdx b/api_docs/kbn_yarn_lock_validator.mdx index 8958468bc9f2d..61f47c1340f8e 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-09-06 +date: 2023-09-07 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 148fbff039e18..f23c052887c30 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-09-06 +date: 2023-09-07 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 6bfcbb46328e6..a02e9c966bd3f 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-09-06 +date: 2023-09-07 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 5163dcb316e50..089c0f88b0487 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-09-06 +date: 2023-09-07 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 bb869216c84f1..cdded5acc1f4a 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-09-06 +date: 2023-09-07 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 b11450706ba43..3d4f2f53cdf82 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-09-06 +date: 2023-09-07 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 0b7294a36838d..1467a74be91f5 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-09-06 +date: 2023-09-07 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 c84037bdb1fdc..7a2a4066dc7f1 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-09-06 +date: 2023-09-07 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 e210d8a6bfe13..4f2041faab978 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-09-06 +date: 2023-09-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'licensing'] --- import licensingObj from './licensing.devdocs.json'; diff --git a/api_docs/lists.mdx b/api_docs/lists.mdx index 3271d5e1f245c..8c3bfdf453293 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-09-06 +date: 2023-09-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'lists'] --- import listsObj from './lists.devdocs.json'; diff --git a/api_docs/log_explorer.devdocs.json b/api_docs/log_explorer.devdocs.json index 742f9c0f72bfa..f69f3d76121fa 100644 --- a/api_docs/log_explorer.devdocs.json +++ b/api_docs/log_explorer.devdocs.json @@ -3,7 +3,69 @@ "client": { "classes": [], "functions": [], - "interfaces": [], + "interfaces": [ + { + "parentPluginId": "logExplorer", + "id": "def-public.LogExplorerStateContainer", + "type": "Interface", + "tags": [], + "label": "LogExplorerStateContainer", + "description": [], + "path": "x-pack/plugins/log_explorer/public/components/log_explorer/log_explorer.tsx", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "logExplorer", + "id": "def-public.LogExplorerStateContainer.appState", + "type": "Object", + "tags": [], + "label": "appState", + "description": [], + "signature": [ + { + "pluginId": "discover", + "scope": "public", + "docId": "kibDiscoverPluginApi", + "section": "def-public.DiscoverAppState", + "text": "DiscoverAppState" + }, + " | undefined" + ], + "path": "x-pack/plugins/log_explorer/public/components/log_explorer/log_explorer.tsx", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "logExplorer", + "id": "def-public.LogExplorerStateContainer.logExplorerState", + "type": "CompoundType", + "tags": [], + "label": "logExplorerState", + "description": [], + "signature": [ + "Partial<", + "WithDatasetSelection", + " | (", + "WithDatasetSelection", + " & ", + "WithControlPanels", + ") | (", + "WithDatasetSelection", + " & ", + "WithControlPanelGroupAPI", + " & ", + "WithControlPanels", + ")> | undefined" + ], + "path": "x-pack/plugins/log_explorer/public/components/log_explorer/log_explorer.tsx", + "deprecated": false, + "trackAdoption": false + } + ], + "initialIsOpen": false + } + ], "enums": [], "misc": [], "objects": [], diff --git a/api_docs/log_explorer.mdx b/api_docs/log_explorer.mdx index befcc70437a54..53fc15ca48c27 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-09-06 +date: 2023-09-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'logExplorer'] --- import logExplorerObj from './log_explorer.devdocs.json'; @@ -21,7 +21,7 @@ Contact [@elastic/infra-monitoring-ui](https://github.com/orgs/elastic/teams/inf | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 3 | 0 | 3 | 1 | +| 6 | 0 | 6 | 4 | ## Client @@ -31,3 +31,6 @@ Contact [@elastic/infra-monitoring-ui](https://github.com/orgs/elastic/teams/inf ### Start +### Interfaces + + diff --git a/api_docs/logs_shared.mdx b/api_docs/logs_shared.mdx index ffa98ecee1830..a779eee95cf76 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-09-06 +date: 2023-09-07 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 b98088ff6fca4..ff53cebb7446e 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-09-06 +date: 2023-09-07 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 7ccc3846ad0d1..74cb03b613496 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-09-06 +date: 2023-09-07 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 0f06b54ce9df8..08827ca30d2ca 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-09-06 +date: 2023-09-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'mapsEms'] --- import mapsEmsObj from './maps_ems.devdocs.json'; diff --git a/api_docs/ml.mdx b/api_docs/ml.mdx index 9550b03ca8ef3..26deedf1a2c27 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-09-06 +date: 2023-09-07 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 9f00d4a1b3112..5e4fe4811231e 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-09-06 +date: 2023-09-07 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 ff84af9508421..526a8a4d208f5 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-09-06 +date: 2023-09-07 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 f1420e4cfa2f3..c4885f84f8754 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-09-06 +date: 2023-09-07 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 ea0effc9fea3a..80aefab0158ae 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-09-06 +date: 2023-09-07 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 859779de519dc..f0890c2fb929c 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-09-06 +date: 2023-09-07 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 cdec51c565667..7fd3f2f04b970 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-09-06 +date: 2023-09-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'notifications'] --- import notificationsObj from './notifications.devdocs.json'; diff --git a/api_docs/observability.devdocs.json b/api_docs/observability.devdocs.json index 009e122a6a378..4fb36eb62dee5 100644 --- a/api_docs/observability.devdocs.json +++ b/api_docs/observability.devdocs.json @@ -7786,7 +7786,7 @@ "label": "options", "description": [], "signature": [ - "{ tags: string[]; }" + "{ tags: string[]; access?: \"public\" | \"internal\" | undefined; }" ], "path": "x-pack/plugins/observability/server/routes/types.ts", "deprecated": false, diff --git a/api_docs/observability.mdx b/api_docs/observability.mdx index d10fd512c30be..2e699cd41db69 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-09-06 +date: 2023-09-07 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 e3520b084ccac..1a6935b28c09d 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-09-06 +date: 2023-09-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'observabilityAIAssistant'] --- import observabilityAIAssistantObj from './observability_a_i_assistant.devdocs.json'; diff --git a/api_docs/observability_onboarding.devdocs.json b/api_docs/observability_onboarding.devdocs.json index 2058dd185fc76..8cc4b9736bf0f 100644 --- a/api_docs/observability_onboarding.devdocs.json +++ b/api_docs/observability_onboarding.devdocs.json @@ -122,7 +122,23 @@ } ], "enums": [], - "misc": [], + "misc": [ + { + "parentPluginId": "observabilityOnboarding", + "id": "def-public.OBSERVABILITY_ONBOARDING_LOCATOR", + "type": "string", + "tags": [], + "label": "OBSERVABILITY_ONBOARDING_LOCATOR", + "description": [], + "signature": [ + "\"OBSERVABILITY_ONBOARDING_LOCATOR\"" + ], + "path": "x-pack/plugins/observability_onboarding/public/locators/onboarding_locator/locator_definition.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + } + ], "objects": [], "start": { "parentPluginId": "observabilityOnboarding", diff --git a/api_docs/observability_onboarding.mdx b/api_docs/observability_onboarding.mdx index ccc3104347e34..1a972e940c327 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-09-06 +date: 2023-09-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'observabilityOnboarding'] --- import observabilityOnboardingObj from './observability_onboarding.devdocs.json'; @@ -21,7 +21,7 @@ Contact [@elastic/apm-ui](https://github.com/orgs/elastic/teams/apm-ui) for ques | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 14 | 0 | 14 | 0 | +| 15 | 0 | 15 | 0 | ## Client @@ -31,6 +31,9 @@ Contact [@elastic/apm-ui](https://github.com/orgs/elastic/teams/apm-ui) for ques ### Interfaces +### Consts, variables and types + + ## Server ### Setup diff --git a/api_docs/observability_shared.mdx b/api_docs/observability_shared.mdx index e544473677fd3..5b33b822640a7 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-09-06 +date: 2023-09-07 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 58b1aeeb72c30..bcc6a923564fc 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-09-06 +date: 2023-09-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'osquery'] --- import osqueryObj from './osquery.devdocs.json'; diff --git a/api_docs/plugin_directory.mdx b/api_docs/plugin_directory.mdx index f8a0a349a4ea1..601b0717c3f74 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-09-06 +date: 2023-09-07 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 | |--------------|----------|------------------------| -| 674 | 564 | 39 | +| 675 | 565 | 39 | ### Public API health stats | API Count | Any Count | Missing comments | Missing exports | |--------------|----------|-----------------|--------| -| 72529 | 223 | 61920 | 1511 | +| 74237 | 223 | 63613 | 1514 | ## 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 | 30 | | | [@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. | 61 | 1 | 3 | 0 | -| | [@elastic/response-ops](https://github.com/orgs/elastic/teams/response-ops) | - | 790 | 1 | 759 | 49 | +| | [@elastic/response-ops](https://github.com/orgs/elastic/teams/response-ops) | - | 793 | 1 | 762 | 49 | | | [@elastic/apm-ui](https://github.com/orgs/elastic/teams/apm-ui) | The user interface for Elastic APM | 29 | 0 | 29 | 119 | | | [@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) | 2 | 0 | 2 | 0 | @@ -61,17 +61,17 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [@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 | 16 | 0 | 7 | 0 | | | [@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 | -| | [@elastic/kibana-data-discovery](https://github.com/orgs/elastic/teams/kibana-data-discovery) | 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. | 1034 | 0 | 254 | 2 | +| | [@elastic/kibana-data-discovery](https://github.com/orgs/elastic/teams/kibana-data-discovery) | 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. | 1037 | 0 | 257 | 2 | | | [@elastic/ml-ui](https://github.com/orgs/elastic/teams/ml-ui) | The Data Visualizer tools help you understand your data, by analyzing the metrics and fields in a log file or an existing Elasticsearch index. | 31 | 3 | 25 | 1 | | | [@elastic/platform-deployment-management](https://github.com/orgs/elastic/teams/platform-deployment-management) | - | 12 | 0 | 10 | 3 | -| | [@elastic/kibana-data-discovery](https://github.com/orgs/elastic/teams/kibana-data-discovery) | This plugin contains the Discover application and the saved search embeddable. | 98 | 0 | 71 | 15 | +| | [@elastic/kibana-data-discovery](https://github.com/orgs/elastic/teams/kibana-data-discovery) | This plugin contains the Discover application and the saved search embeddable. | 113 | 0 | 72 | 15 | | | [@elastic/kibana-data-discovery](https://github.com/orgs/elastic/teams/kibana-data-discovery) | - | 37 | 0 | 35 | 2 | | | [@elastic/security-threat-hunting-investigations](https://github.com/orgs/elastic/teams/security-threat-hunting-investigations) | APIs used to assess the quality of data in Elasticsearch indexes | 2 | 0 | 0 | 0 | | | [@elastic/security-solution](https://github.com/orgs/elastic/teams/security-solution) | Server APIs for the Elastic AI Assistant | 4 | 0 | 2 | 0 | | | [@elastic/kibana-presentation](https://github.com/orgs/elastic/teams/kibana-presentation) | Adds embeddables service to Kibana | 542 | 1 | 442 | 7 | | | [@elastic/kibana-presentation](https://github.com/orgs/elastic/teams/kibana-presentation) | Extends embeddable plugin with more functionality | 14 | 0 | 14 | 0 | | | [@elastic/kibana-security](https://github.com/orgs/elastic/teams/kibana-security) | This plugin provides encryption and decryption utilities for saved objects containing sensitive information. | 51 | 0 | 44 | 0 | -| | [@elastic/enterprise-search-frontend](https://github.com/orgs/elastic/teams/enterprise-search-frontend) | Adds dashboards for discovering and managing Enterprise Search products. | 11 | 0 | 11 | 0 | +| | [@elastic/enterprise-search-frontend](https://github.com/orgs/elastic/teams/enterprise-search-frontend) | Adds dashboards for discovering and managing Enterprise Search products. | 6 | 0 | 6 | 0 | | | [@elastic/platform-deployment-management](https://github.com/orgs/elastic/teams/platform-deployment-management) | - | 115 | 3 | 111 | 3 | | | [@elastic/kibana-visualizations](https://github.com/orgs/elastic/teams/kibana-visualizations) | The Event Annotation service contains expressions for event annotations | 195 | 0 | 195 | 5 | | | [@elastic/response-ops](https://github.com/orgs/elastic/teams/response-ops) | - | 111 | 0 | 111 | 11 | @@ -92,10 +92,10 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [@elastic/kibana-visualizations](https://github.com/orgs/elastic/teams/kibana-visualizations) | Adds expression runtime to Kibana | 2208 | 17 | 1749 | 5 | | | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 235 | 0 | 99 | 2 | | | [@elastic/kibana-data-discovery](https://github.com/orgs/elastic/teams/kibana-data-discovery) | Index pattern fields and ambiguous values formatters | 292 | 5 | 253 | 3 | -| | [@elastic/kibana-gis](https://github.com/orgs/elastic/teams/kibana-gis) | The file upload plugin contains components and services for uploading a file, analyzing its data, and then importing the data into an Elasticsearch index. Supported file types include CSV, TSV, newline-delimited JSON and GeoJSON. | 62 | 0 | 62 | 2 | +| | [@elastic/kibana-gis](https://github.com/orgs/elastic/teams/kibana-gis) | The file upload plugin contains components and services for uploading a file, analyzing its data, and then importing the data into an Elasticsearch index. Supported file types include CSV, TSV, newline-delimited JSON and GeoJSON. | 59 | 0 | 59 | 2 | | | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | File upload, download, sharing, and serving over HTTP implementation in Kibana. | 239 | 0 | 24 | 9 | | | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | Simple UI for managing files in Kibana | 2 | 0 | 2 | 0 | -| | [@elastic/fleet](https://github.com/orgs/elastic/teams/fleet) | - | 1189 | 3 | 1073 | 41 | +| | [@elastic/fleet](https://github.com/orgs/elastic/teams/fleet) | - | 1199 | 3 | 1082 | 41 | | ftrApis | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 0 | 0 | 0 | 0 | | | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | - | 68 | 0 | 14 | 5 | | globalSearchBar | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | - | 0 | 0 | 0 | 0 | @@ -106,7 +106,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 147 | 0 | 108 | 0 | | | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | Image embeddable | 3 | 0 | 3 | 1 | | | [@elastic/platform-deployment-management](https://github.com/orgs/elastic/teams/platform-deployment-management) | - | 4 | 0 | 4 | 0 | -| | [@elastic/platform-deployment-management](https://github.com/orgs/elastic/teams/platform-deployment-management) | - | 191 | 0 | 186 | 4 | +| | [@elastic/platform-deployment-management](https://github.com/orgs/elastic/teams/platform-deployment-management) | - | 194 | 0 | 189 | 4 | | | [@elastic/infra-monitoring-ui](https://github.com/orgs/elastic/teams/infra-monitoring-ui) | This plugin visualizes data from Filebeat and Metricbeat, and integrates with other Observability solutions | 45 | 0 | 42 | 11 | | ingestPipelines | [@elastic/platform-deployment-management](https://github.com/orgs/elastic/teams/platform-deployment-management) | - | 0 | 0 | 0 | 0 | | inputControlVis | [@elastic/kibana-presentation](https://github.com/orgs/elastic/teams/kibana-presentation) | Adds Input Control visualization to Kibana | 0 | 0 | 0 | 0 | @@ -122,7 +122,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [@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/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. | 3 | 0 | 3 | 1 | +| | [@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. | 6 | 0 | 6 | 4 | | | [@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 | | logstash | [@elastic/logstash](https://github.com/orgs/elastic/teams/logstash) | - | 0 | 0 | 0 | 0 | | | [@elastic/platform-deployment-management](https://github.com/orgs/elastic/teams/platform-deployment-management) | - | 47 | 0 | 47 | 7 | @@ -138,7 +138,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [@elastic/actionable-observability](https://github.com/orgs/elastic/teams/actionable-observability) | - | 542 | 2 | 533 | 14 | | | [@elastic/obs-ai-assistant](https://github.com/orgs/elastic/teams/obs-ai-assistant) | - | 42 | 0 | 39 | 7 | | observabilityLogExplorer | [@elastic/infra-monitoring-ui](https://github.com/orgs/elastic/teams/infra-monitoring-ui) | This plugin exposes and registers observability log consumption features. | 0 | 0 | 0 | 0 | -| | [@elastic/apm-ui](https://github.com/orgs/elastic/teams/apm-ui) | - | 14 | 0 | 14 | 0 | +| | [@elastic/apm-ui](https://github.com/orgs/elastic/teams/apm-ui) | - | 15 | 0 | 15 | 0 | | | [@elastic/observability-ui](https://github.com/orgs/elastic/teams/observability-ui) | - | 277 | 1 | 276 | 11 | | | [@elastic/security-defend-workflows](https://github.com/orgs/elastic/teams/security-defend-workflows) | - | 24 | 0 | 24 | 7 | | painlessLab | [@elastic/platform-deployment-management](https://github.com/orgs/elastic/teams/platform-deployment-management) | - | 0 | 0 | 0 | 0 | @@ -527,6 +527,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [@elastic/security-detections-response](https://github.com/orgs/elastic/teams/security-detections-response) | - | 107 | 0 | 104 | 0 | | | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | - | 2 | 0 | 2 | 0 | | | [@elastic/enterprise-search-frontend](https://github.com/orgs/elastic/teams/enterprise-search-frontend) | - | 67 | 0 | 67 | 0 | +| | [@elastic/enterprise-search-frontend](https://github.com/orgs/elastic/teams/enterprise-search-frontend) | - | 1678 | 0 | 1678 | 0 | | | [@elastic/kibana-data-discovery](https://github.com/orgs/elastic/teams/kibana-data-discovery) | - | 16 | 0 | 8 | 0 | | | [@elastic/security-threat-hunting-explore](https://github.com/orgs/elastic/teams/security-threat-hunting-explore) | - | 14 | 0 | 14 | 6 | | | [@elastic/security-threat-hunting-explore](https://github.com/orgs/elastic/teams/security-threat-hunting-explore) | - | 50 | 0 | 47 | 0 | diff --git a/api_docs/presentation_util.mdx b/api_docs/presentation_util.mdx index 8baaad3c6c961..16a416fe95a0c 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-09-06 +date: 2023-09-07 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 bfbb359943027..4c09c95a11123 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-09-06 +date: 2023-09-07 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 be115e09b2ccf..1ccc2e1dc89b2 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-09-06 +date: 2023-09-07 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 cfbfdbe19c2d7..30d66270e0f25 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-09-06 +date: 2023-09-07 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 6ceb583f5e701..9d5429e4f0cc8 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-09-06 +date: 2023-09-07 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 19e06683b4eac..c2164a4c7b2a8 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-09-06 +date: 2023-09-07 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 912d13f8bbe28..3994c58af98d1 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-09-06 +date: 2023-09-07 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 e015e177cbba5..72cdac752a0ab 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-09-06 +date: 2023-09-07 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 92c55394f4209..7a1a25144c4ae 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-09-06 +date: 2023-09-07 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 142c9ae875e69..1f6f5d6d1e8c0 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-09-06 +date: 2023-09-07 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 f61d87c732506..cc94325ec9d17 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-09-06 +date: 2023-09-07 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 b517eca82a928..fb28755b08537 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-09-06 +date: 2023-09-07 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 abc9de3307deb..654ca0587b344 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-09-06 +date: 2023-09-07 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 61bc012db63a9..c1574b3c61484 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-09-06 +date: 2023-09-07 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 dbb975cc061ed..a13064c6d697b 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-09-06 +date: 2023-09-07 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 b4bd667da42a4..e7f92d35e12df 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-09-06 +date: 2023-09-07 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 bde9ff25f6e97..126b3540d26b1 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-09-06 +date: 2023-09-07 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 ed2dae2824bab..724950bb76780 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-09-06 +date: 2023-09-07 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 d07f98a7332b0..ae5ec268adc66 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-09-06 +date: 2023-09-07 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 d715d1010ba65..5890f292cc729 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-09-06 +date: 2023-09-07 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 d78f273a7755b..69edfddb92c9c 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-09-06 +date: 2023-09-07 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 93287788f8645..4a60d7a40d80b 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-09-06 +date: 2023-09-07 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 684d74bc88e77..52b0acbca2d7d 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-09-06 +date: 2023-09-07 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 e1b29a4b77478..15b76c5900c7f 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-09-06 +date: 2023-09-07 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 0117b9138ccee..fb2ebe3684514 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-09-06 +date: 2023-09-07 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 c93a024b3b41b..72e3abd02f71e 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-09-06 +date: 2023-09-07 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 9f61d5283f5e5..6291d81c088dc 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-09-06 +date: 2023-09-07 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 598ea05dd18d8..3bb6e595759fa 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-09-06 +date: 2023-09-07 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 cacc8c975df10..978518d32b6ab 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-09-06 +date: 2023-09-07 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 f3a1b5c7e0e57..b3099ef691554 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-09-06 +date: 2023-09-07 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 0d92ce6df2bc2..571324c507106 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-09-06 +date: 2023-09-07 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 4e74bf052b9cb..aac2fd84e008f 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-09-06 +date: 2023-09-07 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 5eff47d932a72..151314589e927 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-09-06 +date: 2023-09-07 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 384f4633571aa..4a8cb8faf0ddb 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-09-06 +date: 2023-09-07 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 30272f75bfcf6..22fa5b6d057fa 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-09-06 +date: 2023-09-07 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 1d77c0df3a97c..6792e6ec46689 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-09-06 +date: 2023-09-07 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 23ceb4fe61e6a..530e39980d924 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-09-06 +date: 2023-09-07 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 bab5d6c094c68..6a6ef352a13ec 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-09-06 +date: 2023-09-07 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 5f23ec23ba53d..741601a65849f 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-09-06 +date: 2023-09-07 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 891ed57dca705..ebf9028f06bd8 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-09-06 +date: 2023-09-07 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 fa0e10091834f..516841763eebc 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-09-06 +date: 2023-09-07 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 39bdf05d8be5e..5e1ea6412f623 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-09-06 +date: 2023-09-07 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 8ae211ab4a1fe..e29640f3d3fbe 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-09-06 +date: 2023-09-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'unifiedHistogram'] --- import unifiedHistogramObj from './unified_histogram.devdocs.json'; diff --git a/api_docs/unified_search.devdocs.json b/api_docs/unified_search.devdocs.json index db79545b07381..143aaf552bfb8 100644 --- a/api_docs/unified_search.devdocs.json +++ b/api_docs/unified_search.devdocs.json @@ -2262,9 +2262,9 @@ "Omit", ", \"options\" | \"selectedOptions\" | \"onChange\" | \"isLoading\" | \"onSearchChange\">, \"placeholder\"> & Required, \"options\" | \"selectedOptions\" | \"onChange\" | \"onSearchChange\">, \"placeholder\"> & Required, \"options\" | \"selectedOptions\" | \"onChange\" | \"isLoading\" | \"onSearchChange\">, \"placeholder\">> & { onChange: (indexPatternId?: string | undefined) => void; indexPatternId: string; onNoIndexPatterns?: (() => void) | undefined; }" + ", \"options\" | \"selectedOptions\" | \"onChange\" | \"onSearchChange\">, \"placeholder\">> & { onChange: (indexPatternId?: string | undefined) => void; indexPatternId: string; onNoIndexPatterns?: (() => void) | undefined; }" ], "path": "src/plugins/unified_search/public/index_pattern_select/index_pattern_select.tsx", "deprecated": false, diff --git a/api_docs/unified_search.mdx b/api_docs/unified_search.mdx index 3eea6ef3a5403..86dca02ec7532 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-09-06 +date: 2023-09-07 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 d66fa6a04e945..5288a252a44d8 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-09-06 +date: 2023-09-07 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 3987d3bcc9316..a4dc702fb6513 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-09-06 +date: 2023-09-07 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 5f956a0d5b10e..752db77b2d6d4 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-09-06 +date: 2023-09-07 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 aaf47c8abd982..d59abda8c04b5 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-09-06 +date: 2023-09-07 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 993e491bb3987..a3f548d5ae17b 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-09-06 +date: 2023-09-07 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 493ba55128160..7d9a359462643 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-09-06 +date: 2023-09-07 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 7ab3f9c575f7b..1ee895ade0085 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-09-06 +date: 2023-09-07 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 377532248eac0..68ce0ccb0961a 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-09-06 +date: 2023-09-07 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 e0318e12ac9df..f03a7f6090b78 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-09-06 +date: 2023-09-07 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 a2ad41cc88773..e505f494d03be 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-09-06 +date: 2023-09-07 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 c6cad2abd1b16..707e0447510b1 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-09-06 +date: 2023-09-07 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 2359fb1e3d51d..9252d5c19361f 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-09-06 +date: 2023-09-07 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 a73a33c6af0ce..ea2135ba522b0 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-09-06 +date: 2023-09-07 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 f5e16234f7811..4ce8acc6e097f 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-09-06 +date: 2023-09-07 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 91ba1aeb857f8..9a5133b7a1df2 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-09-06 +date: 2023-09-07 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 cb7ba41730b13..e6559f6bda4a3 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-09-06 +date: 2023-09-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'visualizations'] --- import visualizationsObj from './visualizations.devdocs.json'; From 6d79b6751dbb345c477e542dfd222e5ac222d6b5 Mon Sep 17 00:00:00 2001 From: Julia Rechkunova Date: Thu, 7 Sep 2023 07:57:32 +0200 Subject: [PATCH 93/97] [Discover] Unskip "search source fetch" flaky tests (#165586) Normal test: - Closes https://github.com/elastic/kibana/issues/139879 100x https://buildkite.com/elastic/kibana-flaky-test-suite-runner/builds/3056 100x https://buildkite.com/elastic/kibana-flaky-test-suite-runner/builds/3070 Similar Serverless tests: - https://github.com/elastic/kibana/issues/165660 - https://github.com/elastic/kibana/issues/165624 - https://github.com/elastic/kibana/issues/165623 - https://github.com/elastic/kibana/issues/165503 - https://github.com/elastic/kibana/issues/165502 - https://github.com/elastic/kibana/issues/165379 --------- Co-authored-by: kibanamachine <42973632+kibanamachine@users.noreply.github.com> --- test/examples/search/warnings.ts | 19 +++++++++++++------ .../common/examples/search/warnings.ts | 16 ++++++++++++---- x-pack/test_serverless/tsconfig.json | 2 +- 3 files changed, 26 insertions(+), 11 deletions(-) diff --git a/test/examples/search/warnings.ts b/test/examples/search/warnings.ts index 3f2166447f652..5ec4f59586a13 100644 --- a/test/examples/search/warnings.ts +++ b/test/examples/search/warnings.ts @@ -26,8 +26,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { const kibanaServer = getService('kibanaServer'); const esArchiver = getService('esArchiver'); - // Failing: See https://github.com/elastic/kibana/issues/139879 - describe.skip('handling warnings with search source fetch', function () { + describe('handling warnings with search source fetch', function () { const dataViewTitle = 'sample-01,sample-01-rollup'; const fromTime = 'Jun 17, 2022 @ 00:00:00.000'; const toTime = 'Jun 23, 2022 @ 00:00:00.000'; @@ -122,8 +121,12 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { // click "see full error" button in the toast const [openShardModalButton] = await testSubjects.findAll('openShardFailureModalBtn'); await openShardModalButton.click(); - const modalHeader = await testSubjects.find('shardFailureModalTitle'); - expect(await modalHeader.getVisibleText()).to.be('2 of 4 shards failed'); + + await retry.waitFor('modal title visible', async () => { + const modalHeader = await testSubjects.find('shardFailureModalTitle'); + return (await modalHeader.getVisibleText()) === '2 of 4 shards failed'; + }); + // request await testSubjects.click('shardFailuresModalRequestButton'); const requestBlock = await testSubjects.find('shardsFailedModalRequestBlock'); @@ -169,8 +172,12 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { const [openShardModalButton] = await testSubjects.findAll('openShardFailureModalBtn'); await openShardModalButton.click(); await testSubjects.exists('shardFailureModalTitle'); - const modalHeader = await testSubjects.find('shardFailureModalTitle'); - expect(await modalHeader.getVisibleText()).to.be('2 of 4 shards failed'); + + await retry.waitFor('modal title visible', async () => { + const modalHeader = await testSubjects.find('shardFailureModalTitle'); + return (await modalHeader.getVisibleText()) === '2 of 4 shards failed'; + }); + // request await testSubjects.click('shardFailuresModalRequestButton'); const requestBlock = await testSubjects.find('shardsFailedModalRequestBlock'); diff --git a/x-pack/test_serverless/functional/test_suites/common/examples/search/warnings.ts b/x-pack/test_serverless/functional/test_suites/common/examples/search/warnings.ts index 01808d0a3175b..a98cc05f0bfd3 100644 --- a/x-pack/test_serverless/functional/test_suites/common/examples/search/warnings.ts +++ b/x-pack/test_serverless/functional/test_suites/common/examples/search/warnings.ts @@ -125,8 +125,12 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { // click "see full error" button in the toast const [openShardModalButton] = await testSubjects.findAll('openShardFailureModalBtn'); await openShardModalButton.click(); - const modalHeader = await testSubjects.find('shardFailureModalTitle'); - expect(await modalHeader.getVisibleText()).to.be('2 of 4 shards failed'); + + await retry.waitFor('modal title visible', async () => { + const modalHeader = await testSubjects.find('shardFailureModalTitle'); + return (await modalHeader.getVisibleText()) === '2 of 4 shards failed'; + }); + // request await testSubjects.click('shardFailuresModalRequestButton'); const requestBlock = await testSubjects.find('shardsFailedModalRequestBlock'); @@ -171,8 +175,12 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { // click "see full error" button in the toast const [openShardModalButton] = await testSubjects.findAll('openShardFailureModalBtn'); await openShardModalButton.click(); - const modalHeader = await testSubjects.find('shardFailureModalTitle'); - expect(await modalHeader.getVisibleText()).to.be('2 of 4 shards failed'); + + await retry.waitFor('modal title visible', async () => { + const modalHeader = await testSubjects.find('shardFailureModalTitle'); + return (await modalHeader.getVisibleText()) === '2 of 4 shards failed'; + }); + // request await testSubjects.click('shardFailuresModalRequestButton'); const requestBlock = await testSubjects.find('shardsFailedModalRequestBlock'); diff --git a/x-pack/test_serverless/tsconfig.json b/x-pack/test_serverless/tsconfig.json index de711146da7ec..3950afef67928 100644 --- a/x-pack/test_serverless/tsconfig.json +++ b/x-pack/test_serverless/tsconfig.json @@ -45,7 +45,6 @@ "@kbn/cases-plugin", "@kbn/test-subj-selector", "@kbn/core-http-common", - "@kbn/std", "@kbn/data-views-plugin", "@kbn/core-saved-objects-server", "@kbn/security-api-integration-helpers", @@ -54,5 +53,6 @@ "@kbn/dev-utils", "@kbn/bfetch-plugin", "@kbn/rison", + "@kbn/std", ] } From a0404d67fb4017b7128b77d6a5da427fa1652e02 Mon Sep 17 00:00:00 2001 From: Stratoula Kalafateli Date: Thu, 7 Sep 2023 09:01:58 +0300 Subject: [PATCH 94/97] [ES|QL] Adds more tests in unified histogram component (#165568) ## Summary Closes https://github.com/elastic/kibana/issues/165431 Adds more unit tests in unified_histogram plugin, as a follow up from ES|QL ### 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 --------- Co-authored-by: kibanamachine <42973632+kibanamachine@users.noreply.github.com> --- .../use_test_based_query_language.test.tsx | 89 +++++++++ .../layout/hooks/use_lens_suggestions.test.ts | 178 ++++++++++++++++++ src/plugins/unified_histogram/tsconfig.json | 1 + 3 files changed, 268 insertions(+) create mode 100644 src/plugins/unified_histogram/public/layout/hooks/use_lens_suggestions.test.ts diff --git a/src/plugins/discover/public/application/main/hooks/use_test_based_query_language.test.tsx b/src/plugins/discover/public/application/main/hooks/use_test_based_query_language.test.tsx index edacd4ba3976e..a6dcafad11757 100644 --- a/src/plugins/discover/public/application/main/hooks/use_test_based_query_language.test.tsx +++ b/src/plugins/discover/public/application/main/hooks/use_test_based_query_language.test.tsx @@ -142,6 +142,7 @@ describe('useTextBasedQueryLanguage', () => { flattened: { field1: 1 }, } as unknown as DataTableRecord, ], + // transformational command query: { esql: 'from the-data-view-title | keep field1' }, }); await waitFor(() => expect(replaceUrlState).toHaveBeenCalledTimes(1)); @@ -153,6 +154,35 @@ describe('useTextBasedQueryLanguage', () => { }); }); }); + + test('changing a text based query with no transformational commands should only change dataview state when loading and finished', async () => { + const { replaceUrlState, stateContainer } = renderHookWithContext(false); + const documents$ = stateContainer.dataState.data$.documents$; + stateContainer.dataState.data$.documents$.next(msgComplete); + await waitFor(() => expect(replaceUrlState).toHaveBeenCalledTimes(1)); + replaceUrlState.mockReset(); + + documents$.next({ + recordRawType: RecordRawType.PLAIN, + fetchStatus: FetchStatus.PARTIAL, + result: [ + { + id: '1', + raw: { field1: 1 }, + flattened: { field1: 1 }, + } as unknown as DataTableRecord, + ], + // non transformational command + query: { esql: 'from the-data-view-title | where field1 > 0' }, + }); + await waitFor(() => expect(replaceUrlState).toHaveBeenCalledTimes(1)); + + await waitFor(() => { + expect(replaceUrlState).toHaveBeenCalledWith({ + index: 'the-data-view-id', + }); + }); + }); test('only changing a text based query with same result columns should not change columns', async () => { const { replaceUrlState, stateContainer } = renderHookWithContext(false); @@ -271,6 +301,65 @@ describe('useTextBasedQueryLanguage', () => { }); }); + test('it should not overwrite existing state columns on initial fetch and non transformational commands', async () => { + const { replaceUrlState, stateContainer } = renderHookWithContext(false, { + columns: ['field1'], + index: 'the-data-view-id', + }); + const documents$ = stateContainer.dataState.data$.documents$; + + documents$.next({ + recordRawType: RecordRawType.PLAIN, + fetchStatus: FetchStatus.PARTIAL, + result: [ + { + id: '1', + raw: { field1: 1, field2: 2 }, + flattened: { field1: 1 }, + } as unknown as DataTableRecord, + ], + query: { esql: 'from the-data-view-title | WHERE field2=1' }, + }); + expect(replaceUrlState).toHaveBeenCalledTimes(0); + }); + + test('it should overwrite existing state columns on transitioning from a query with non transformational commands to a query with transformational', async () => { + const { replaceUrlState, stateContainer } = renderHookWithContext(false, { + index: 'the-data-view-id', + }); + const documents$ = stateContainer.dataState.data$.documents$; + + documents$.next({ + recordRawType: RecordRawType.PLAIN, + fetchStatus: FetchStatus.PARTIAL, + result: [ + { + id: '1', + raw: { field1: 1, field2: 2 }, + flattened: { field1: 1 }, + } as unknown as DataTableRecord, + ], + query: { esql: 'from the-data-view-title | WHERE field2=1' }, + }); + expect(replaceUrlState).toHaveBeenCalledTimes(0); + documents$.next({ + recordRawType: RecordRawType.PLAIN, + fetchStatus: FetchStatus.PARTIAL, + result: [ + { + id: '1', + raw: { field1: 1 }, + flattened: { field1: 1 }, + } as unknown as DataTableRecord, + ], + query: { esql: 'from the-data-view-title | keep field1' }, + }); + await waitFor(() => expect(replaceUrlState).toHaveBeenCalledTimes(1)); + expect(replaceUrlState).toHaveBeenCalledWith({ + columns: ['field1'], + }); + }); + test('it should not overwrite state column when successfully fetching after an error fetch', async () => { const { replaceUrlState, stateContainer } = renderHookWithContext(false, { columns: [], diff --git a/src/plugins/unified_histogram/public/layout/hooks/use_lens_suggestions.test.ts b/src/plugins/unified_histogram/public/layout/hooks/use_lens_suggestions.test.ts new file mode 100644 index 0000000000000..d891c62df3514 --- /dev/null +++ b/src/plugins/unified_histogram/public/layout/hooks/use_lens_suggestions.test.ts @@ -0,0 +1,178 @@ +/* + * 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 { renderHook } from '@testing-library/react-hooks'; +import { dataPluginMock } from '@kbn/data-plugin/public/mocks'; +import { calculateBounds } from '@kbn/data-plugin/public'; +import { deepMockedFields, buildDataViewMock } from '@kbn/discover-utils/src/__mocks__'; +import { allSuggestionsMock } from '../../__mocks__/suggestions'; +import { useLensSuggestions } from './use_lens_suggestions'; + +describe('useLensSuggestions', () => { + const dataMock = dataPluginMock.createStartContract(); + dataMock.query.timefilter.timefilter.calculateBounds = (timeRange) => { + return calculateBounds(timeRange); + }; + const dataViewMock = buildDataViewMock({ + name: 'the-data-view', + fields: deepMockedFields, + timeFieldName: '@timestamp', + }); + + test('should return empty suggestions for non aggregate query', async () => { + const { result } = renderHook(() => { + return useLensSuggestions({ + dataView: dataViewMock, + query: undefined, + isPlainRecord: false, + data: dataMock, + lensSuggestionsApi: jest.fn(), + }); + }); + const current = result.current; + expect(current).toStrictEqual({ + allSuggestions: [], + currentSuggestion: undefined, + isOnHistogramMode: false, + suggestionUnsupported: false, + }); + }); + + test('should return suggestions for aggregate query', async () => { + const { result } = renderHook(() => { + return useLensSuggestions({ + dataView: dataViewMock, + query: { esql: 'from the-data-view | stats maxB = max(bytes)' }, + isPlainRecord: true, + columns: [ + { + id: 'var0', + name: 'var0', + meta: { + type: 'number', + }, + }, + ], + data: dataMock, + lensSuggestionsApi: jest.fn(() => allSuggestionsMock), + }); + }); + const current = result.current; + expect(current).toStrictEqual({ + allSuggestions: allSuggestionsMock, + currentSuggestion: allSuggestionsMock[0], + isOnHistogramMode: false, + suggestionUnsupported: false, + }); + }); + + test('should return suggestionUnsupported if no timerange is provided and no suggestions returned by the api', async () => { + const { result } = renderHook(() => { + return useLensSuggestions({ + dataView: dataViewMock, + query: { esql: 'from the-data-view | stats maxB = max(bytes)' }, + isPlainRecord: true, + columns: [ + { + id: 'var0', + name: 'var0', + meta: { + type: 'number', + }, + }, + ], + data: dataMock, + lensSuggestionsApi: jest.fn(), + }); + }); + const current = result.current; + expect(current).toStrictEqual({ + allSuggestions: [], + currentSuggestion: undefined, + isOnHistogramMode: false, + suggestionUnsupported: true, + }); + }); + + test('should return histogramSuggestion if no suggestions returned by the api', async () => { + const firstMockReturn = undefined; + const secondMockReturn = allSuggestionsMock; + const lensSuggestionsApi = jest + .fn() + .mockReturnValueOnce(firstMockReturn) // will return to firstMockReturn object firstly + .mockReturnValueOnce(secondMockReturn); // will return to secondMockReturn object secondly + + const { result } = renderHook(() => { + return useLensSuggestions({ + dataView: dataViewMock, + query: { esql: 'from the-data-view | limit 100' }, + isPlainRecord: true, + columns: [ + { + id: 'var0', + name: 'var0', + meta: { + type: 'number', + }, + }, + ], + data: dataMock, + lensSuggestionsApi, + timeRange: { + from: '2023-09-03T08:00:00.000Z', + to: '2023-09-04T08:56:28.274Z', + }, + }); + }); + const current = result.current; + expect(current).toStrictEqual({ + allSuggestions: [], + currentSuggestion: allSuggestionsMock[0], + isOnHistogramMode: true, + suggestionUnsupported: false, + }); + }); + + test('should not return histogramSuggestion if no suggestions returned by the api and transformational commands', async () => { + const firstMockReturn = undefined; + const secondMockReturn = allSuggestionsMock; + const lensSuggestionsApi = jest + .fn() + .mockReturnValueOnce(firstMockReturn) // will return to firstMockReturn object firstly + .mockReturnValueOnce(secondMockReturn); // will return to secondMockReturn object secondly + + const { result } = renderHook(() => { + return useLensSuggestions({ + dataView: dataViewMock, + query: { esql: 'from the-data-view | limit 100 | keep @timestamp' }, + isPlainRecord: true, + columns: [ + { + id: 'var0', + name: 'var0', + meta: { + type: 'number', + }, + }, + ], + data: dataMock, + lensSuggestionsApi, + timeRange: { + from: '2023-09-03T08:00:00.000Z', + to: '2023-09-04T08:56:28.274Z', + }, + }); + }); + const current = result.current; + expect(current).toStrictEqual({ + allSuggestions: [], + currentSuggestion: undefined, + isOnHistogramMode: false, + suggestionUnsupported: true, + }); + }); +}); diff --git a/src/plugins/unified_histogram/tsconfig.json b/src/plugins/unified_histogram/tsconfig.json index 58f314f46cd5a..0dc5b1fe9d52b 100644 --- a/src/plugins/unified_histogram/tsconfig.json +++ b/src/plugins/unified_histogram/tsconfig.json @@ -24,6 +24,7 @@ "@kbn/ui-actions-plugin", "@kbn/kibana-utils-plugin", "@kbn/visualizations-plugin", + "@kbn/discover-utils", ], "exclude": [ "target/**/*", From 2b78d6fbad0088e9f6bf71cdddc25a50791f1f20 Mon Sep 17 00:00:00 2001 From: Julia Rechkunova Date: Thu, 7 Sep 2023 09:02:12 +0200 Subject: [PATCH 95/97] [Discover] Unskip field popover flaky tests (#165641) - Closes https://github.com/elastic/kibana/issues/165608 150x https://buildkite.com/elastic/kibana-flaky-test-suite-runner/builds/3061 --- test/examples/unified_field_list_examples/field_stats.ts | 3 +-- test/functional/page_objects/unified_field_list.ts | 1 + 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/test/examples/unified_field_list_examples/field_stats.ts b/test/examples/unified_field_list_examples/field_stats.ts index 0c1ebca9f3a11..de662e737cb2d 100644 --- a/test/examples/unified_field_list_examples/field_stats.ts +++ b/test/examples/unified_field_list_examples/field_stats.ts @@ -52,8 +52,7 @@ export default ({ getService, getPageObjects }: FtrProviderContext) => { await PageObjects.unifiedFieldList.cleanSidebarLocalStorage(); }); - // FLAKY: https://github.com/elastic/kibana/issues/165608 - describe.skip('field distribution', () => { + describe('field distribution', () => { before(async () => { await PageObjects.unifiedFieldList.toggleSidebarSection('empty'); // it will allow to render more fields in Available fields section }); diff --git a/test/functional/page_objects/unified_field_list.ts b/test/functional/page_objects/unified_field_list.ts index ec62cc4e358d8..caa0c7f24dada 100644 --- a/test/functional/page_objects/unified_field_list.ts +++ b/test/functional/page_objects/unified_field_list.ts @@ -95,6 +95,7 @@ export class UnifiedFieldListPageObject extends FtrService { } public async clickFieldListItem(field: string) { + await this.testSubjects.moveMouseTo(`field-${field}`); await this.testSubjects.click(`field-${field}`); await this.waitUntilFieldPopoverIsOpen(); From b6d6f60b2c06df48f838d9f376bf9deab5f9d4e2 Mon Sep 17 00:00:00 2001 From: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> Date: Thu, 7 Sep 2023 03:35:16 -0400 Subject: [PATCH 96/97] skip failing test suite (#165868) --- .../test_suites/common/data_view_field_editor/field_preview.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/x-pack/test_serverless/api_integration/test_suites/common/data_view_field_editor/field_preview.ts b/x-pack/test_serverless/api_integration/test_suites/common/data_view_field_editor/field_preview.ts index d351c91faea7f..9580108506c0a 100644 --- a/x-pack/test_serverless/api_integration/test_suites/common/data_view_field_editor/field_preview.ts +++ b/x-pack/test_serverless/api_integration/test_suites/common/data_view_field_editor/field_preview.ts @@ -48,7 +48,8 @@ export default function ({ getService }: FtrProviderContext) { }); }; - describe('Field preview', function () { + // Failing: See https://github.com/elastic/kibana/issues/165868 + describe.skip('Field preview', function () { before(async () => await createIndex()); after(async () => await deleteIndex()); From 0c2d483d19528eb970ba73dca4462a2eb1865239 Mon Sep 17 00:00:00 2001 From: Maryam Saeidi Date: Thu, 7 Sep 2023 09:47:53 +0200 Subject: [PATCH 97/97] Rename customMetric to metrics in the custom threshold rule criteria (#165719) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Closes #163819 ## Summary This PR renames customMetric to metrics in the custom threshold rule criteria to have a cleaner API for this rule, considering that custom aggregation is now the default option. ### 🧪 How to test - Create a custom threshold rule and ensure the preview is working fine - Check the related saved object and ensure the data is saved as shown above - Make sure the related alerts are generated as expected --- .../common/threshold_rule/types.ts | 4 ++-- .../custom_equation_editor.stories.tsx | 2 +- .../custom_equation_editor.tsx | 14 ++++++------- .../custom_equation/metric_row_with_agg.tsx | 4 ++-- .../components/custom_equation/types.ts | 6 +++--- .../threshold/components/validation.tsx | 20 +++++++++---------- .../hooks/use_metrics_explorer_chart_data.ts | 11 +++++----- .../threshold/threshold_rule_expression.tsx | 2 +- .../public/components/threshold/types.ts | 4 ++-- .../lib/create_custom_metrics_aggregations.ts | 10 +++++----- .../lib/rules/threshold/lib/metric_query.ts | 2 +- .../threshold/register_threshold_rule_type.ts | 6 +++--- .../translations/translations/fr-FR.json | 3 --- .../translations/translations/ja-JP.json | 3 --- .../translations/translations/zh-CN.json | 3 --- .../threshold_rule/avg_pct_fired.ts | 4 ++-- .../threshold_rule/avg_pct_no_data.ts | 4 ++-- .../threshold_rule/avg_us_fired.ts | 4 ++-- .../custom_eq_avg_bytes_fired.ts | 4 ++-- .../threshold_rule/documents_count_fired.ts | 4 ++-- .../threshold_rule/group_by_fired.ts | 4 ++-- .../observability/threshold_rule_data_view.ts | 2 +- .../threshold_rule/avg_pct_fired.ts | 4 ++-- .../threshold_rule/avg_pct_no_data.ts | 4 ++-- .../custom_eq_avg_bytes_fired.ts | 4 ++-- .../threshold_rule/documents_count_fired.ts | 4 ++-- .../threshold_rule/group_by_fired.ts | 4 ++-- 27 files changed, 66 insertions(+), 74 deletions(-) diff --git a/x-pack/plugins/observability/common/threshold_rule/types.ts b/x-pack/plugins/observability/common/threshold_rule/types.ts index 6511a2cb280a5..66e058dfad8cf 100644 --- a/x-pack/plugins/observability/common/threshold_rule/types.ts +++ b/x-pack/plugins/observability/common/threshold_rule/types.ts @@ -234,7 +234,7 @@ export type CustomMetricAggTypes = Exclude< Aggregators.CUSTOM | Aggregators.RATE | Aggregators.P95 | Aggregators.P99 >; -export interface MetricExpressionCustomMetric { +export interface CustomThresholdExpressionMetric { name: string; aggType: CustomMetricAggTypes; field?: string; @@ -243,7 +243,7 @@ export interface MetricExpressionCustomMetric { export interface CustomMetricExpressionParams extends BaseMetricExpressionParams { aggType: Aggregators.CUSTOM; - customMetrics: MetricExpressionCustomMetric[]; + metrics: CustomThresholdExpressionMetric[]; equation?: string; label?: string; } diff --git a/x-pack/plugins/observability/public/components/threshold/components/custom_equation/custom_equation_editor.stories.tsx b/x-pack/plugins/observability/public/components/threshold/components/custom_equation/custom_equation_editor.stories.tsx index 7cea506155818..f7480aa1de513 100644 --- a/x-pack/plugins/observability/public/components/threshold/components/custom_equation/custom_equation_editor.stories.tsx +++ b/x-pack/plugins/observability/public/components/threshold/components/custom_equation/custom_equation_editor.stories.tsx @@ -115,7 +115,7 @@ CustomEquationEditorWithEquationErrors.args = { expression: { ...BASE_ARGS.expression, equation: 'Math.round(A / B)', - customMetrics: [ + metrics: [ { name: 'A', aggType: Aggregators.AVERAGE, field: 'system.cpu.user.pct' }, { name: 'B', aggType: Aggregators.MAX, field: 'system.cpu.cores' }, ], diff --git a/x-pack/plugins/observability/public/components/threshold/components/custom_equation/custom_equation_editor.tsx b/x-pack/plugins/observability/public/components/threshold/components/custom_equation/custom_equation_editor.tsx index 8dbb44eda71dd..ed3dc975b2d07 100644 --- a/x-pack/plugins/observability/public/components/threshold/components/custom_equation/custom_equation_editor.tsx +++ b/x-pack/plugins/observability/public/components/threshold/components/custom_equation/custom_equation_editor.tsx @@ -25,7 +25,7 @@ import { OMITTED_AGGREGATIONS_FOR_CUSTOM_METRICS } from '../../../../../common/t import { Aggregators, CustomMetricAggTypes, - MetricExpressionCustomMetric, + CustomThresholdExpressionMetric, } from '../../../../../common/threshold_rule/types'; import { MetricExpression } from '../../types'; @@ -58,7 +58,7 @@ export function CustomEquationEditor({ dataView, }: CustomEquationEditorProps) { const [customMetrics, setCustomMetrics] = useState( - expression?.customMetrics ?? [NEW_METRIC] + expression?.metrics ?? [NEW_METRIC] ); const [customEqPopoverOpen, setCustomEqPopoverOpen] = useState(false); const [equation, setEquation] = useState(expression?.equation || undefined); @@ -69,7 +69,7 @@ export function CustomEquationEditor({ const currentVars = previous?.map((m) => m.name) ?? []; const name = first(xor(VAR_NAMES, currentVars))!; const nextMetrics = [...(previous || []), { ...NEW_METRIC, name }]; - debouncedOnChange({ ...expression, customMetrics: nextMetrics, equation }); + debouncedOnChange({ ...expression, metrics: nextMetrics, equation }); return nextMetrics; }); }, [debouncedOnChange, equation, expression]); @@ -79,7 +79,7 @@ export function CustomEquationEditor({ setCustomMetrics((previous) => { const nextMetrics = previous?.filter((row) => row.name !== name) ?? [NEW_METRIC]; const finalMetrics = (nextMetrics.length && nextMetrics) || [NEW_METRIC]; - debouncedOnChange({ ...expression, customMetrics: finalMetrics, equation }); + debouncedOnChange({ ...expression, metrics: finalMetrics, equation }); return finalMetrics; }); }, @@ -87,10 +87,10 @@ export function CustomEquationEditor({ ); const handleChange = useCallback( - (metric: MetricExpressionCustomMetric) => { + (metric: CustomThresholdExpressionMetric) => { setCustomMetrics((previous) => { const nextMetrics = previous?.map((m) => (m.name === metric.name ? metric : m)); - debouncedOnChange({ ...expression, customMetrics: nextMetrics, equation }); + debouncedOnChange({ ...expression, metrics: nextMetrics, equation }); return nextMetrics; }); }, @@ -100,7 +100,7 @@ export function CustomEquationEditor({ const handleEquationChange = useCallback( (e: React.ChangeEvent) => { setEquation(e.target.value); - debouncedOnChange({ ...expression, customMetrics, equation: e.target.value }); + debouncedOnChange({ ...expression, metrics: customMetrics, equation: e.target.value }); }, [debouncedOnChange, expression, customMetrics] ); diff --git a/x-pack/plugins/observability/public/components/threshold/components/custom_equation/metric_row_with_agg.tsx b/x-pack/plugins/observability/public/components/threshold/components/custom_equation/metric_row_with_agg.tsx index 5b0925ea27dd3..7d8ab629e6e16 100644 --- a/x-pack/plugins/observability/public/components/threshold/components/custom_equation/metric_row_with_agg.tsx +++ b/x-pack/plugins/observability/public/components/threshold/components/custom_equation/metric_row_with_agg.tsx @@ -103,8 +103,8 @@ export function MetricRowWithAgg({ [name, aggType, onChange] ); - const isAggInvalid = get(errors, ['customMetrics', name, 'aggType']) != null; - const isFieldInvalid = get(errors, ['customMetrics', name, 'field']) != null || !field; + const isAggInvalid = get(errors, ['metrics', name, 'aggType']) != null; + const isFieldInvalid = get(errors, ['metrics', name, 'field']) != null || !field; return ( <> diff --git a/x-pack/plugins/observability/public/components/threshold/components/custom_equation/types.ts b/x-pack/plugins/observability/public/components/threshold/components/custom_equation/types.ts index abc63849ad1d1..d7c4096753763 100644 --- a/x-pack/plugins/observability/public/components/threshold/components/custom_equation/types.ts +++ b/x-pack/plugins/observability/public/components/threshold/components/custom_equation/types.ts @@ -5,10 +5,10 @@ * 2.0. */ import { AggregationType, IErrorObject } from '@kbn/triggers-actions-ui-plugin/public'; -import { MetricExpressionCustomMetric } from '../../../../../common/threshold_rule/types'; +import { CustomThresholdExpressionMetric } from '../../../../../common/threshold_rule/types'; import { MetricExpression } from '../../types'; -export type CustomMetrics = MetricExpression['customMetrics']; +export type CustomMetrics = MetricExpression['metrics']; export interface AggregationTypes { [x: string]: AggregationType; @@ -27,7 +27,7 @@ export interface MetricRowBaseProps { onDelete: (name: string) => void; disableDelete: boolean; disableAdd: boolean; - onChange: (metric: MetricExpressionCustomMetric) => void; + onChange: (metric: CustomThresholdExpressionMetric) => void; aggregationTypes: AggregationTypes; errors: IErrorObject; } diff --git a/x-pack/plugins/observability/public/components/threshold/components/validation.tsx b/x-pack/plugins/observability/public/components/threshold/components/validation.tsx index 2d72c1e090869..8917e8dac2f35 100644 --- a/x-pack/plugins/observability/public/components/threshold/components/validation.tsx +++ b/x-pack/plugins/observability/public/components/threshold/components/validation.tsx @@ -49,8 +49,8 @@ export function validateMetricThreshold({ threshold1: string[]; }; metric: string[]; - customMetricsError?: string; - customMetrics: Record; + metricsError?: string; + metrics: Record; equation?: string; }; } & { filterQuery?: string[]; searchConfiguration?: string[] } = {}; @@ -100,7 +100,7 @@ export function validateMetricThreshold({ threshold1: [], }, metric: [], - customMetrics: {}, + metrics: {}, }; if (!c.aggType) { errors[id].aggField.push( @@ -179,19 +179,19 @@ export function validateMetricThreshold({ } if (isCustomMetricExpressionParams(c)) { - if (!c.customMetrics || (c.customMetrics && c.customMetrics.length < 1)) { - errors[id].customMetricsError = i18n.translate( - 'xpack.observability.threshold.rule.alertFlyout.error.customMetricsError', + if (!c.metrics || (c.metrics && c.metrics.length < 1)) { + errors[id].metricsError = i18n.translate( + 'xpack.observability.threshold.rule.alertFlyout.error.metricsError', { defaultMessage: 'You must define at least 1 custom metric', } ); } else { - c.customMetrics.forEach((metric) => { + c.metrics.forEach((metric) => { const customMetricErrors: { aggType?: string; field?: string; filter?: string } = {}; if (!metric.aggType) { customMetricErrors.aggType = i18n.translate( - 'xpack.observability.threshold.rule.alertFlyout.error.customMetrics.aggTypeRequired', + 'xpack.observability.threshold.rule.alertFlyout.error.metrics.aggTypeRequired', { defaultMessage: 'Aggregation is required', } @@ -199,7 +199,7 @@ export function validateMetricThreshold({ } if (metric.aggType !== 'count' && !metric.field) { customMetricErrors.field = i18n.translate( - 'xpack.observability.threshold.rule.alertFlyout.error.customMetrics.fieldRequired', + 'xpack.observability.threshold.rule.alertFlyout.error.metrics.fieldRequired', { defaultMessage: 'Field is required', } @@ -213,7 +213,7 @@ export function validateMetricThreshold({ } } if (!isEmpty(customMetricErrors)) { - errors[id].customMetrics[metric.name] = customMetricErrors; + errors[id].metrics[metric.name] = customMetricErrors; } }); } diff --git a/x-pack/plugins/observability/public/components/threshold/hooks/use_metrics_explorer_chart_data.ts b/x-pack/plugins/observability/public/components/threshold/hooks/use_metrics_explorer_chart_data.ts index 75c1759e04287..26924ff0d3d8e 100644 --- a/x-pack/plugins/observability/public/components/threshold/hooks/use_metrics_explorer_chart_data.ts +++ b/x-pack/plugins/observability/public/components/threshold/hooks/use_metrics_explorer_chart_data.ts @@ -9,7 +9,7 @@ import DateMath from '@kbn/datemath'; import { DataViewBase } from '@kbn/es-query'; import { useMemo } from 'react'; import { MetricExplorerCustomMetricAggregations } from '../../../../common/threshold_rule/metrics_explorer'; -import { MetricExpressionCustomMetric } from '../../../../common/threshold_rule/types'; +import { CustomThresholdExpressionMetric } from '../../../../common/threshold_rule/types'; import { MetricExpression, TimeRange } from '../types'; import { useMetricsExplorerData } from './use_metrics_explorer_data'; @@ -43,8 +43,7 @@ export const useMetricsExplorerChartData = ( ? { aggregation: 'custom', custom_metrics: - expression?.customMetrics?.map(mapMetricThresholdMetricToMetricsExplorerMetric) ?? - [], + expression?.metrics?.map(mapMetricThresholdMetricToMetricsExplorerMetric) ?? [], equation: expression.equation, } : { field: expression.metric, aggregation: expression.aggType }, @@ -57,7 +56,7 @@ export const useMetricsExplorerChartData = ( expression.equation, expression.metric, // eslint-disable-next-line react-hooks/exhaustive-deps - JSON.stringify(expression.customMetrics), + JSON.stringify(expression.metrics), filterQuery, groupBy, ] @@ -78,7 +77,9 @@ export const useMetricsExplorerChartData = ( return useMetricsExplorerData(options, derivedIndexPattern, timestamps); }; -const mapMetricThresholdMetricToMetricsExplorerMetric = (metric: MetricExpressionCustomMetric) => { +const mapMetricThresholdMetricToMetricsExplorerMetric = ( + metric: CustomThresholdExpressionMetric +) => { if (metric.aggType === 'count') { return { name: metric.name, diff --git a/x-pack/plugins/observability/public/components/threshold/threshold_rule_expression.tsx b/x-pack/plugins/observability/public/components/threshold/threshold_rule_expression.tsx index 66382ddf1c673..a34f526860772 100644 --- a/x-pack/plugins/observability/public/components/threshold/threshold_rule_expression.tsx +++ b/x-pack/plugins/observability/public/components/threshold/threshold_rule_expression.tsx @@ -144,7 +144,7 @@ export default function Expressions(props: Props) { (newDataView: DataView) => { const ruleCriteria = (ruleParams.criteria ? ruleParams.criteria.slice() : []).map( (criterion) => { - criterion.customMetrics?.forEach((metric) => { + criterion.metrics?.forEach((metric) => { metric.field = undefined; }); return criterion; diff --git a/x-pack/plugins/observability/public/components/threshold/types.ts b/x-pack/plugins/observability/public/components/threshold/types.ts index 59741f40a1356..92d64ab2378bc 100644 --- a/x-pack/plugins/observability/public/components/threshold/types.ts +++ b/x-pack/plugins/observability/public/components/threshold/types.ts @@ -45,10 +45,10 @@ export interface AlertContextMeta { export type MetricExpression = Omit< MetricExpressionParams, - 'metric' | 'timeSize' | 'timeUnit' | 'metrics' | 'equation' | 'customMetrics' + 'metric' | 'timeSize' | 'timeUnit' | 'metrics' | 'equation' > & { metric?: NonCountMetricExpressionParams['metric']; - customMetrics?: CustomMetricExpressionParams['customMetrics']; + metrics?: CustomMetricExpressionParams['metrics']; label?: CustomMetricExpressionParams['label']; equation?: CustomMetricExpressionParams['equation']; timeSize?: MetricExpressionParams['timeSize']; diff --git a/x-pack/plugins/observability/server/lib/rules/threshold/lib/create_custom_metrics_aggregations.ts b/x-pack/plugins/observability/server/lib/rules/threshold/lib/create_custom_metrics_aggregations.ts index 21329d18a1074..a52ad0247475c 100644 --- a/x-pack/plugins/observability/server/lib/rules/threshold/lib/create_custom_metrics_aggregations.ts +++ b/x-pack/plugins/observability/server/lib/rules/threshold/lib/create_custom_metrics_aggregations.ts @@ -7,18 +7,18 @@ import { fromKueryExpression, toElasticsearchQuery } from '@kbn/es-query'; import { isEmpty } from 'lodash'; -import { MetricExpressionCustomMetric } from '../../../../../common/threshold_rule/types'; +import { CustomThresholdExpressionMetric } from '../../../../../common/threshold_rule/types'; import { MetricsExplorerCustomMetric } from './metrics_explorer'; const isMetricExpressionCustomMetric = ( - subject: MetricsExplorerCustomMetric | MetricExpressionCustomMetric -): subject is MetricExpressionCustomMetric => { - return (subject as MetricExpressionCustomMetric).aggType != null; + subject: MetricsExplorerCustomMetric | CustomThresholdExpressionMetric +): subject is CustomThresholdExpressionMetric => { + return 'aggType' in subject; }; export const createCustomMetricsAggregations = ( id: string, - customMetrics: Array, + customMetrics: Array, equation?: string ) => { const bucketsPath: { [id: string]: string } = {}; diff --git a/x-pack/plugins/observability/server/lib/rules/threshold/lib/metric_query.ts b/x-pack/plugins/observability/server/lib/rules/threshold/lib/metric_query.ts index 5f46a04522266..3eac288648093 100644 --- a/x-pack/plugins/observability/server/lib/rules/threshold/lib/metric_query.ts +++ b/x-pack/plugins/observability/server/lib/rules/threshold/lib/metric_query.ts @@ -104,7 +104,7 @@ export const getElasticsearchMetricQuery = ( : isCustom(metricParams) ? createCustomMetricsAggregations( 'aggregatedValue', - metricParams.customMetrics, + metricParams.metrics, metricParams.equation ) : { diff --git a/x-pack/plugins/observability/server/lib/rules/threshold/register_threshold_rule_type.ts b/x-pack/plugins/observability/server/lib/rules/threshold/register_threshold_rule_type.ts index fa75318530267..09336e03a24ea 100644 --- a/x-pack/plugins/observability/server/lib/rules/threshold/register_threshold_rule_type.ts +++ b/x-pack/plugins/observability/server/lib/rules/threshold/register_threshold_rule_type.ts @@ -75,7 +75,7 @@ export function thresholdRuleType( ...baseCriterion, metric: schema.string(), aggType: oneOfLiterals(METRIC_EXPLORER_AGGREGATIONS), - customMetrics: schema.never(), + metrics: schema.never(), equation: schema.never(), label: schema.never(), }); @@ -84,7 +84,7 @@ export function thresholdRuleType( ...baseCriterion, aggType: schema.literal('count'), metric: schema.never(), - customMetrics: schema.never(), + metrics: schema.never(), equation: schema.never(), label: schema.never(), }); @@ -93,7 +93,7 @@ export function thresholdRuleType( ...baseCriterion, aggType: schema.literal('custom'), metric: schema.never(), - customMetrics: schema.arrayOf( + metrics: schema.arrayOf( schema.oneOf([ schema.object({ name: schema.string(), diff --git a/x-pack/plugins/translations/translations/fr-FR.json b/x-pack/plugins/translations/translations/fr-FR.json index c3d6b1732732f..804e6f38ef412 100644 --- a/x-pack/plugins/translations/translations/fr-FR.json +++ b/x-pack/plugins/translations/translations/fr-FR.json @@ -27673,9 +27673,6 @@ "xpack.observability.threshold.rule.alertFlyout.customEquationEditor.labelLabel": "Étiquette (facultatif)", "xpack.observability.threshold.rule.alertFlyout.docCountNoDataDisabledHelpText": "[Ce paramètre n’est pas applicable à l’agrégateur du nombre de documents.]", "xpack.observability.threshold.rule.alertFlyout.error.aggregationRequired": "L'agrégation est requise.", - "xpack.observability.threshold.rule.alertFlyout.error.customMetrics.aggTypeRequired": "L'agrégation est requise", - "xpack.observability.threshold.rule.alertFlyout.error.customMetrics.fieldRequired": "Le champ est obligatoire", - "xpack.observability.threshold.rule.alertFlyout.error.customMetricsError": "Vous devez définir au moins 1 indicateur personnalisé", "xpack.observability.threshold.rule.alertFlyout.error.equation.invalidCharacters": "Le champ d'équation prend en charge uniquement les caractères suivants : A-Z, +, -, /, *, (, ), ?, !, &, :, |, >, <, =", "xpack.observability.threshold.rule.alertFlyout.error.invalidFilterQuery": "La requête de filtre n'est pas valide.", "xpack.observability.threshold.rule.alertFlyout.error.metricRequired": "L'indicateur est requis.", diff --git a/x-pack/plugins/translations/translations/ja-JP.json b/x-pack/plugins/translations/translations/ja-JP.json index 3936b78eb1a01..93352cb7778af 100644 --- a/x-pack/plugins/translations/translations/ja-JP.json +++ b/x-pack/plugins/translations/translations/ja-JP.json @@ -27673,9 +27673,6 @@ "xpack.observability.threshold.rule.alertFlyout.customEquationEditor.labelLabel": "ラベル(任意)", "xpack.observability.threshold.rule.alertFlyout.docCountNoDataDisabledHelpText": "[この設定は、ドキュメントカウントアグリゲーターには適用されません。]", "xpack.observability.threshold.rule.alertFlyout.error.aggregationRequired": "集約が必要です。", - "xpack.observability.threshold.rule.alertFlyout.error.customMetrics.aggTypeRequired": "集約が必要です", - "xpack.observability.threshold.rule.alertFlyout.error.customMetrics.fieldRequired": "フィールドが必要です", - "xpack.observability.threshold.rule.alertFlyout.error.customMetricsError": "1つ以上のカスタムメトリックを定義する必要があります", "xpack.observability.threshold.rule.alertFlyout.error.equation.invalidCharacters": "等式フィールドでは次の文字のみを使用できます:A-Z、+、-、/、*、(、)、?、!、&、:、|、>、<、=", "xpack.observability.threshold.rule.alertFlyout.error.invalidFilterQuery": "フィルタークエリは無効です。", "xpack.observability.threshold.rule.alertFlyout.error.metricRequired": "メトリックが必要です。", diff --git a/x-pack/plugins/translations/translations/zh-CN.json b/x-pack/plugins/translations/translations/zh-CN.json index a75699cf01fca..78e6f5b54c600 100644 --- a/x-pack/plugins/translations/translations/zh-CN.json +++ b/x-pack/plugins/translations/translations/zh-CN.json @@ -27671,9 +27671,6 @@ "xpack.observability.threshold.rule.alertFlyout.customEquationEditor.labelLabel": "标签(可选)", "xpack.observability.threshold.rule.alertFlyout.docCountNoDataDisabledHelpText": "[此设置不适用于文档计数聚合器。]", "xpack.observability.threshold.rule.alertFlyout.error.aggregationRequired": "“聚合”必填。", - "xpack.observability.threshold.rule.alertFlyout.error.customMetrics.aggTypeRequired": "“聚合”必填", - "xpack.observability.threshold.rule.alertFlyout.error.customMetrics.fieldRequired": "“字段”必填", - "xpack.observability.threshold.rule.alertFlyout.error.customMetricsError": "必须至少定义 1 个定制指标", "xpack.observability.threshold.rule.alertFlyout.error.equation.invalidCharacters": "方程字段仅支持以下字符:A-Z、+、-、/、*、(、)、?、!、&、:、|、>、<、=", "xpack.observability.threshold.rule.alertFlyout.error.invalidFilterQuery": "筛选查询无效。", "xpack.observability.threshold.rule.alertFlyout.error.metricRequired": "“指标”必填。", diff --git a/x-pack/test/alerting_api_integration/observability/threshold_rule/avg_pct_fired.ts b/x-pack/test/alerting_api_integration/observability/threshold_rule/avg_pct_fired.ts index 5c48eb3571ec2..7bb8874dafed9 100644 --- a/x-pack/test/alerting_api_integration/observability/threshold_rule/avg_pct_fired.ts +++ b/x-pack/test/alerting_api_integration/observability/threshold_rule/avg_pct_fired.ts @@ -81,7 +81,7 @@ export default function ({ getService }: FtrProviderContext) { threshold: [0.5], timeSize: 5, timeUnit: 'm', - customMetrics: [ + metrics: [ { name: 'A', field: 'system.cpu.user.pct', aggType: Aggregators.AVERAGE }, ], }, @@ -169,7 +169,7 @@ export default function ({ getService }: FtrProviderContext) { threshold: [0.5], timeSize: 5, timeUnit: 'm', - customMetrics: [{ name: 'A', field: 'system.cpu.user.pct', aggType: 'avg' }], + metrics: [{ name: 'A', field: 'system.cpu.user.pct', aggType: 'avg' }], }, ], alertOnNoData: true, diff --git a/x-pack/test/alerting_api_integration/observability/threshold_rule/avg_pct_no_data.ts b/x-pack/test/alerting_api_integration/observability/threshold_rule/avg_pct_no_data.ts index 400d5ad55e730..c0138d993e6bd 100644 --- a/x-pack/test/alerting_api_integration/observability/threshold_rule/avg_pct_no_data.ts +++ b/x-pack/test/alerting_api_integration/observability/threshold_rule/avg_pct_no_data.ts @@ -75,7 +75,7 @@ export default function ({ getService }: FtrProviderContext) { threshold: [0.5], timeSize: 5, timeUnit: 'm', - customMetrics: [ + metrics: [ { name: 'A', field: 'system.cpu.user.pct', aggType: Aggregators.AVERAGE }, ], }, @@ -163,7 +163,7 @@ export default function ({ getService }: FtrProviderContext) { threshold: [0.5], timeSize: 5, timeUnit: 'm', - customMetrics: [{ name: 'A', field: 'system.cpu.user.pct', aggType: 'avg' }], + metrics: [{ name: 'A', field: 'system.cpu.user.pct', aggType: 'avg' }], }, ], alertOnNoData: true, diff --git a/x-pack/test/alerting_api_integration/observability/threshold_rule/avg_us_fired.ts b/x-pack/test/alerting_api_integration/observability/threshold_rule/avg_us_fired.ts index 65db9101c04e8..1c35793e04337 100644 --- a/x-pack/test/alerting_api_integration/observability/threshold_rule/avg_us_fired.ts +++ b/x-pack/test/alerting_api_integration/observability/threshold_rule/avg_us_fired.ts @@ -96,7 +96,7 @@ export default function ({ getService }: FtrProviderContext) { threshold: [7500000], timeSize: 5, timeUnit: 'm', - customMetrics: [ + metrics: [ { name: 'A', field: 'span.self_time.sum.us', aggType: Aggregators.AVERAGE }, ], }, @@ -189,7 +189,7 @@ export default function ({ getService }: FtrProviderContext) { threshold: [7500000], timeSize: 5, timeUnit: 'm', - customMetrics: [{ name: 'A', field: 'span.self_time.sum.us', aggType: 'avg' }], + metrics: [{ name: 'A', field: 'span.self_time.sum.us', aggType: 'avg' }], }, ], alertOnNoData: true, diff --git a/x-pack/test/alerting_api_integration/observability/threshold_rule/custom_eq_avg_bytes_fired.ts b/x-pack/test/alerting_api_integration/observability/threshold_rule/custom_eq_avg_bytes_fired.ts index b05d60ca7f750..794902f19688f 100644 --- a/x-pack/test/alerting_api_integration/observability/threshold_rule/custom_eq_avg_bytes_fired.ts +++ b/x-pack/test/alerting_api_integration/observability/threshold_rule/custom_eq_avg_bytes_fired.ts @@ -87,7 +87,7 @@ export default function ({ getService }: FtrProviderContext) { threshold: [0.9], timeSize: 1, timeUnit: 'm', - customMetrics: [ + metrics: [ { name: 'A', field: 'system.network.in.bytes', aggType: Aggregators.AVERAGE }, { name: 'B', field: 'system.network.out.bytes', aggType: Aggregators.AVERAGE }, ], @@ -177,7 +177,7 @@ export default function ({ getService }: FtrProviderContext) { threshold: [0.9], timeSize: 1, timeUnit: 'm', - customMetrics: [ + metrics: [ { name: 'A', field: 'system.network.in.bytes', aggType: Aggregators.AVERAGE }, { name: 'B', field: 'system.network.out.bytes', aggType: Aggregators.AVERAGE }, ], diff --git a/x-pack/test/alerting_api_integration/observability/threshold_rule/documents_count_fired.ts b/x-pack/test/alerting_api_integration/observability/threshold_rule/documents_count_fired.ts index 0ccff07f20828..3361f4a04e185 100644 --- a/x-pack/test/alerting_api_integration/observability/threshold_rule/documents_count_fired.ts +++ b/x-pack/test/alerting_api_integration/observability/threshold_rule/documents_count_fired.ts @@ -81,7 +81,7 @@ export default function ({ getService }: FtrProviderContext) { threshold: [2], timeSize: 1, timeUnit: 'm', - customMetrics: [{ name: 'A', filter: '', aggType: Aggregators.COUNT }], + metrics: [{ name: 'A', filter: '', aggType: Aggregators.COUNT }], }, ], alertOnNoData: true, @@ -167,7 +167,7 @@ export default function ({ getService }: FtrProviderContext) { threshold: [2], timeSize: 1, timeUnit: 'm', - customMetrics: [{ name: 'A', filter: '', aggType: 'count' }], + metrics: [{ name: 'A', filter: '', aggType: 'count' }], }, ], alertOnNoData: true, diff --git a/x-pack/test/alerting_api_integration/observability/threshold_rule/group_by_fired.ts b/x-pack/test/alerting_api_integration/observability/threshold_rule/group_by_fired.ts index 8b2db8b13ca05..9d3e5e2bd17ad 100644 --- a/x-pack/test/alerting_api_integration/observability/threshold_rule/group_by_fired.ts +++ b/x-pack/test/alerting_api_integration/observability/threshold_rule/group_by_fired.ts @@ -94,7 +94,7 @@ export default function ({ getService }: FtrProviderContext) { threshold: [0.2], timeSize: 1, timeUnit: 'm', - customMetrics: [ + metrics: [ { name: 'A', field: 'system.cpu.total.norm.pct', aggType: Aggregators.AVERAGE }, ], }, @@ -197,7 +197,7 @@ export default function ({ getService }: FtrProviderContext) { threshold: [0.2], timeSize: 1, timeUnit: 'm', - customMetrics: [{ name: 'A', field: 'system.cpu.total.norm.pct', aggType: 'avg' }], + metrics: [{ name: 'A', field: 'system.cpu.total.norm.pct', aggType: 'avg' }], }, ], alertOnNoData: true, diff --git a/x-pack/test/alerting_api_integration/observability/threshold_rule_data_view.ts b/x-pack/test/alerting_api_integration/observability/threshold_rule_data_view.ts index ba846751ef7b4..f4d26f961c234 100644 --- a/x-pack/test/alerting_api_integration/observability/threshold_rule_data_view.ts +++ b/x-pack/test/alerting_api_integration/observability/threshold_rule_data_view.ts @@ -75,7 +75,7 @@ export default function ({ getService }: FtrProviderContext) { threshold: [7500000], timeSize: 5, timeUnit: 'm', - customMetrics: [ + metrics: [ { name: 'A', field: 'span.self_time.sum.us', aggType: Aggregators.AVERAGE }, ], }, diff --git a/x-pack/test_serverless/api_integration/test_suites/observability/threshold_rule/avg_pct_fired.ts b/x-pack/test_serverless/api_integration/test_suites/observability/threshold_rule/avg_pct_fired.ts index 48256d153b98a..77114463eb89f 100644 --- a/x-pack/test_serverless/api_integration/test_suites/observability/threshold_rule/avg_pct_fired.ts +++ b/x-pack/test_serverless/api_integration/test_suites/observability/threshold_rule/avg_pct_fired.ts @@ -83,7 +83,7 @@ export default function ({ getService }: FtrProviderContext) { threshold: [0.5], timeSize: 5, timeUnit: 'm', - customMetrics: [ + metrics: [ { name: 'A', field: 'system.cpu.user.pct', aggType: Aggregators.AVERAGE }, ], }, @@ -169,7 +169,7 @@ export default function ({ getService }: FtrProviderContext) { threshold: [0.5], timeSize: 5, timeUnit: 'm', - customMetrics: [{ name: 'A', field: 'system.cpu.user.pct', aggType: 'avg' }], + metrics: [{ name: 'A', field: 'system.cpu.user.pct', aggType: 'avg' }], }, ], alertOnNoData: true, diff --git a/x-pack/test_serverless/api_integration/test_suites/observability/threshold_rule/avg_pct_no_data.ts b/x-pack/test_serverless/api_integration/test_suites/observability/threshold_rule/avg_pct_no_data.ts index 3d97a7a094339..cbfdf251ba602 100644 --- a/x-pack/test_serverless/api_integration/test_suites/observability/threshold_rule/avg_pct_no_data.ts +++ b/x-pack/test_serverless/api_integration/test_suites/observability/threshold_rule/avg_pct_no_data.ts @@ -76,7 +76,7 @@ export default function ({ getService }: FtrProviderContext) { threshold: [0.5], timeSize: 5, timeUnit: 'm', - customMetrics: [ + metrics: [ { name: 'A', field: 'system.cpu.user.pct', aggType: Aggregators.AVERAGE }, ], }, @@ -162,7 +162,7 @@ export default function ({ getService }: FtrProviderContext) { threshold: [0.5], timeSize: 5, timeUnit: 'm', - customMetrics: [{ name: 'A', field: 'system.cpu.user.pct', aggType: 'avg' }], + metrics: [{ name: 'A', field: 'system.cpu.user.pct', aggType: 'avg' }], }, ], alertOnNoData: true, diff --git a/x-pack/test_serverless/api_integration/test_suites/observability/threshold_rule/custom_eq_avg_bytes_fired.ts b/x-pack/test_serverless/api_integration/test_suites/observability/threshold_rule/custom_eq_avg_bytes_fired.ts index 276ac212dac41..81b57e492f100 100644 --- a/x-pack/test_serverless/api_integration/test_suites/observability/threshold_rule/custom_eq_avg_bytes_fired.ts +++ b/x-pack/test_serverless/api_integration/test_suites/observability/threshold_rule/custom_eq_avg_bytes_fired.ts @@ -88,7 +88,7 @@ export default function ({ getService }: FtrProviderContext) { threshold: [0.9], timeSize: 1, timeUnit: 'm', - customMetrics: [ + metrics: [ { name: 'A', field: 'system.network.in.bytes', aggType: Aggregators.AVERAGE }, { name: 'B', field: 'system.network.out.bytes', aggType: Aggregators.AVERAGE }, ], @@ -176,7 +176,7 @@ export default function ({ getService }: FtrProviderContext) { threshold: [0.9], timeSize: 1, timeUnit: 'm', - customMetrics: [ + metrics: [ { name: 'A', field: 'system.network.in.bytes', aggType: Aggregators.AVERAGE }, { name: 'B', field: 'system.network.out.bytes', aggType: Aggregators.AVERAGE }, ], diff --git a/x-pack/test_serverless/api_integration/test_suites/observability/threshold_rule/documents_count_fired.ts b/x-pack/test_serverless/api_integration/test_suites/observability/threshold_rule/documents_count_fired.ts index 0a771d3363791..ad0624a91dfb1 100644 --- a/x-pack/test_serverless/api_integration/test_suites/observability/threshold_rule/documents_count_fired.ts +++ b/x-pack/test_serverless/api_integration/test_suites/observability/threshold_rule/documents_count_fired.ts @@ -82,7 +82,7 @@ export default function ({ getService }: FtrProviderContext) { threshold: [2], timeSize: 1, timeUnit: 'm', - customMetrics: [{ name: 'A', filter: '', aggType: Aggregators.COUNT }], + metrics: [{ name: 'A', filter: '', aggType: Aggregators.COUNT }], }, ], alertOnNoData: true, @@ -166,7 +166,7 @@ export default function ({ getService }: FtrProviderContext) { threshold: [2], timeSize: 1, timeUnit: 'm', - customMetrics: [{ name: 'A', filter: '', aggType: 'count' }], + metrics: [{ name: 'A', filter: '', aggType: 'count' }], }, ], alertOnNoData: true, diff --git a/x-pack/test_serverless/api_integration/test_suites/observability/threshold_rule/group_by_fired.ts b/x-pack/test_serverless/api_integration/test_suites/observability/threshold_rule/group_by_fired.ts index b288c4edf28a8..5cadfbc6b3d9d 100644 --- a/x-pack/test_serverless/api_integration/test_suites/observability/threshold_rule/group_by_fired.ts +++ b/x-pack/test_serverless/api_integration/test_suites/observability/threshold_rule/group_by_fired.ts @@ -92,7 +92,7 @@ export default function ({ getService }: FtrProviderContext) { threshold: [0.2], timeSize: 1, timeUnit: 'm', - customMetrics: [ + metrics: [ { name: 'A', field: 'system.cpu.total.norm.pct', aggType: Aggregators.AVERAGE }, ], }, @@ -193,7 +193,7 @@ export default function ({ getService }: FtrProviderContext) { threshold: [0.2], timeSize: 1, timeUnit: 'm', - customMetrics: [{ name: 'A', field: 'system.cpu.total.norm.pct', aggType: 'avg' }], + metrics: [{ name: 'A', field: 'system.cpu.total.norm.pct', aggType: 'avg' }], }, ], alertOnNoData: true,
cannot appear as a descendant of

, EuiSpacer is a div */} + + + + + + {WELCOME_PANEL_PROJECT_CREATED_CHANGE_PLAN_TITLE} + + + + + + + ) : null; +}; + +export const ChangePlanLink = React.memo(ChangePlanLinkComponent); diff --git a/x-pack/plugins/security_solution_serverless/public/get_started/welcome_panel.test.tsx b/x-pack/plugins/security_solution_serverless/public/get_started/welcome_panel/index.test.tsx similarity index 73% rename from x-pack/plugins/security_solution_serverless/public/get_started/welcome_panel.test.tsx rename to x-pack/plugins/security_solution_serverless/public/get_started/welcome_panel/index.test.tsx index 24655ac3bdeab..e63324d3454d6 100644 --- a/x-pack/plugins/security_solution_serverless/public/get_started/welcome_panel.test.tsx +++ b/x-pack/plugins/security_solution_serverless/public/get_started/welcome_panel/index.test.tsx @@ -7,26 +7,49 @@ import React from 'react'; import { render, type RenderResult } from '@testing-library/react'; -import { WelcomePanel } from './welcome_panel'; +import { I18nProvider } from '@kbn/i18n-react'; + +import { WelcomePanel } from '.'; +import { ProductTier } from '../../../common/product'; +jest.mock('@kbn/security-solution-navigation/src/context'); jest.mock('@elastic/eui', () => { const original = jest.requireActual('@elastic/eui'); return { ...original, useEuiTheme: jest.fn().mockReturnValue({ - euiTheme: { base: 16, size: { xs: '4px' }, colors: { mediumShade: '' } }, + euiTheme: { + base: 16, + size: { xs: '4px' }, + colors: { mediumShade: '' }, + border: { radius: { medium: '4px' } }, + }, }), }; }); +jest.mock('../../common/services', () => ({ + useKibana: jest.fn().mockReturnValue({ + services: { + cloud: { + projectsUrl: 'projectsUrl', + organizationUrl: 'organizationUrl', + }, + }, + }), +})); + describe('WelcomePanel', () => { let result: RenderResult; const props = { totalActiveSteps: 3, totalStepsLeft: 2, + productTier: ProductTier.complete, }; beforeEach(() => { - result = render(); + result = render(, { + wrapper: ({ children }) => {children}, + }); }); it('should render the welcome panel with project created header card', () => { diff --git a/x-pack/plugins/security_solution_serverless/public/get_started/welcome_panel.tsx b/x-pack/plugins/security_solution_serverless/public/get_started/welcome_panel/index.tsx similarity index 51% rename from x-pack/plugins/security_solution_serverless/public/get_started/welcome_panel.tsx rename to x-pack/plugins/security_solution_serverless/public/get_started/welcome_panel/index.tsx index 43eb336e227b2..5d271f20dcfcc 100644 --- a/x-pack/plugins/security_solution_serverless/public/get_started/welcome_panel.tsx +++ b/x-pack/plugins/security_solution_serverless/public/get_started/welcome_panel/index.tsx @@ -9,58 +9,31 @@ import { EuiCard, EuiFlexGroup, EuiFlexItem, EuiIcon, EuiTitle, useEuiTheme } fr import { css } from '@emotion/react'; import React from 'react'; -import progress from './images/progress.svg'; -import invite from './images/invite.svg'; -import type { HeaderSection } from './types'; -import { - WELCOME_PANEL_PROJECT_CREATED_TITLE, - WELCOME_PANEL_PROJECT_CREATED_DESCRIPTION, - WELCOME_PANEL_INVITE_YOUR_TEAM_TITLE, - WELCOME_PANEL_INVITE_YOUR_TEAM_DESCRIPTION, - WELCOME_PANEL_PROGRESS_TRACKER_TITLE, -} from './translations'; -import { ProgressTracker } from './progress_tracker'; -const headerCards: HeaderSection[] = [ - { - icon: { type: 'checkInCircleFilled', color: '#00BFB3' }, - title: WELCOME_PANEL_PROJECT_CREATED_TITLE, - description: () => WELCOME_PANEL_PROJECT_CREATED_DESCRIPTION, - id: 'projectCreated', - }, - { - icon: { type: invite }, - title: WELCOME_PANEL_INVITE_YOUR_TEAM_TITLE, - description: () => WELCOME_PANEL_INVITE_YOUR_TEAM_DESCRIPTION, - id: 'inviteYourTeam', - }, - { - icon: { type: progress }, - title: WELCOME_PANEL_PROGRESS_TRACKER_TITLE, - id: 'progressTracker', - description: ({ - totalActiveSteps, - totalStepsLeft, - }: { - totalActiveSteps?: number | null; - totalStepsLeft?: number | null; - }) => , - }, -]; +import type { ProductTier } from '../../../common/product'; +import { useWelcomePanel } from './use_welcome_panel'; const WelcomePanelComponent = ({ totalActiveSteps, totalStepsLeft, + productTier, }: { totalActiveSteps: number | null; totalStepsLeft: number | null; + productTier: ProductTier | undefined; }) => { const { euiTheme } = useEuiTheme(); + const headerCards = useWelcomePanel({ + productTier, + totalActiveSteps, + totalStepsLeft, + }); return ( {headerCards.map((item, index) => { @@ -84,13 +57,25 @@ const WelcomePanelComponent = ({ } description={ - - {item?.description?.({ totalActiveSteps, totalStepsLeft })} - + <> + + {item.description && item.description} + + {item.footer && ( + + {item.footer} + + )} + } hasBorder paddingSize="l" diff --git a/x-pack/plugins/security_solution_serverless/public/get_started/welcome_panel/product_tier_badge.test.tsx b/x-pack/plugins/security_solution_serverless/public/get_started/welcome_panel/product_tier_badge.test.tsx new file mode 100644 index 0000000000000..e739d2cb95ea5 --- /dev/null +++ b/x-pack/plugins/security_solution_serverless/public/get_started/welcome_panel/product_tier_badge.test.tsx @@ -0,0 +1,29 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ +import React from 'react'; +import { render } from '@testing-library/react'; +import { ProductTierBadge } from './product_tier_badge'; +import { ProductTier } from '../../../common/product'; + +describe('ProductTierBadge', () => { + it('renders nothing when productTier is undefined', () => { + const { container } = render(); + expect(container.firstChild).toBeNull(); + }); + + it('renders the badge with the correct text when productTier is essential', () => { + const { getByTestId } = render(); + const badge = getByTestId('product-tier-badge'); + expect(badge).toHaveTextContent('Essential'); + }); + + it('renders the badge with the correct text when productTier is complete', () => { + const { getByTestId } = render(); + const badge = getByTestId('product-tier-badge'); + expect(badge).toHaveTextContent('Complete'); + }); +}); diff --git a/x-pack/plugins/security_solution_serverless/public/get_started/welcome_panel/product_tier_badge.tsx b/x-pack/plugins/security_solution_serverless/public/get_started/welcome_panel/product_tier_badge.tsx new file mode 100644 index 0000000000000..559db32d83cf5 --- /dev/null +++ b/x-pack/plugins/security_solution_serverless/public/get_started/welcome_panel/product_tier_badge.tsx @@ -0,0 +1,34 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React from 'react'; +import { EuiBadge, useEuiTheme } from '@elastic/eui'; +import { css } from '@emotion/react'; +import { ProductTier } from '../../../common/product'; +import { PRODUCT_TIER_ESSENTIAL, PRODUCT_TIER_COMPLETE } from './translations'; + +const ProductTierBadgeComponent = ({ productTier }: { productTier: ProductTier | undefined }) => { + const { euiTheme } = useEuiTheme(); + return productTier ? ( + + + {productTier === ProductTier.essentials && PRODUCT_TIER_ESSENTIAL} + {productTier === ProductTier.complete && PRODUCT_TIER_COMPLETE} + + + ) : null; +}; + +export const ProductTierBadge = React.memo(ProductTierBadgeComponent); diff --git a/x-pack/plugins/security_solution_serverless/public/get_started/welcome_panel/progress_tracker.test.tsx b/x-pack/plugins/security_solution_serverless/public/get_started/welcome_panel/progress_tracker.test.tsx new file mode 100644 index 0000000000000..7cc7c5c9f59e7 --- /dev/null +++ b/x-pack/plugins/security_solution_serverless/public/get_started/welcome_panel/progress_tracker.test.tsx @@ -0,0 +1,32 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React from 'react'; +import { render } from '@testing-library/react'; +import { ProgressTracker } from './progress_tracker'; // Replace with your import path + +describe('ProgressTracker', () => { + it('renders nothing when totalActiveSteps and totalStepsLeft are null', () => { + const { container } = render(); + expect(container.firstChild).toBeNull(); + }); + + it('renders nothing when totalActiveSteps is null', () => { + const { container } = render(); + expect(container.firstChild).toBeNull(); + }); + + it('renders nothing when totalStepsLeft is null', () => { + const { container } = render(); + expect(container.firstChild).toBeNull(); + }); + + it('renders the progress description when both totalActiveSteps and totalStepsLeft are provided', () => { + const { getByText } = render(); + expect(getByText('5 of 10')).toBeInTheDocument(); + }); +}); diff --git a/x-pack/plugins/security_solution_serverless/public/get_started/progress_tracker.tsx b/x-pack/plugins/security_solution_serverless/public/get_started/welcome_panel/progress_tracker.tsx similarity index 100% rename from x-pack/plugins/security_solution_serverless/public/get_started/progress_tracker.tsx rename to x-pack/plugins/security_solution_serverless/public/get_started/welcome_panel/progress_tracker.tsx diff --git a/x-pack/plugins/security_solution_serverless/public/get_started/welcome_panel/translations.ts b/x-pack/plugins/security_solution_serverless/public/get_started/welcome_panel/translations.ts new file mode 100644 index 0000000000000..313bbe65b5a1c --- /dev/null +++ b/x-pack/plugins/security_solution_serverless/public/get_started/welcome_panel/translations.ts @@ -0,0 +1,62 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ +import { i18n } from '@kbn/i18n'; + +export const WELCOME_PANEL_PROJECT_CREATED_TITLE = i18n.translate( + 'xpack.securitySolutionServerless.getStarted.welcomePanel.projectCreated.title', + { + defaultMessage: `Project created`, + } +); + +export const WELCOME_PANEL_PROJECT_CREATED_CHANGE_PLAN_TITLE = i18n.translate( + 'xpack.securitySolutionServerless.getStarted.welcomePanel.projectCreated.changePlan.title', + { + defaultMessage: `Change plan`, + } +); + +export const PRODUCT_TIER_ESSENTIAL = i18n.translate( + 'xpack.securitySolutionServerless.getStarted.welcomePanel.productTier.essential', + { + defaultMessage: `Essential`, + } +); + +export const PRODUCT_TIER_COMPLETE = i18n.translate( + 'xpack.securitySolutionServerless.getStarted.welcomePanel.productTier.complete', + { + defaultMessage: `Complete`, + } +); + +export const WELCOME_PANEL_INVITE_YOUR_TEAM_TITLE = i18n.translate( + 'xpack.securitySolutionServerless.getStarted.welcomePanel.inviteYourTeam.title', + { + defaultMessage: 'Invite your team', + } +); + +export const WELCOME_PANEL_INVITE_YOUR_TEAM_DESCRIPTION = i18n.translate( + 'xpack.securitySolutionServerless.getStarted.welcomePanel.inviteYourTeam.description', + { + defaultMessage: `Boost security through collaboration`, + } +); + +export const WELCOME_PANEL_PROGRESS_TRACKER_TITLE = i18n.translate( + 'xpack.securitySolutionServerless.getStarted.welcomePanel.progressTracker.title', + { + defaultMessage: 'Progress tracker', + } +); + +export const WELCOME_PANEL_PROGRESS_TRACKER_DESCRIPTION = (tasks: number) => + i18n.translate('xpack.securitySolutionServerless.getStarted.welcomePanel.progressTracker.note', { + defaultMessage: `{tasks, plural, =1 {task} other {tasks}} completed`, + values: { tasks }, + }); diff --git a/x-pack/plugins/security_solution_serverless/public/get_started/welcome_panel/types.ts b/x-pack/plugins/security_solution_serverless/public/get_started/welcome_panel/types.ts new file mode 100644 index 0000000000000..cb38a8bfa0339 --- /dev/null +++ b/x-pack/plugins/security_solution_serverless/public/get_started/welcome_panel/types.ts @@ -0,0 +1,15 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ +import type { EuiIconProps } from '@elastic/eui'; + +export interface HeaderSection { + description?: React.ReactNode | null; + footer?: React.ReactNode | null; + icon: EuiIconProps; + id: string; + title: string; +} diff --git a/x-pack/plugins/security_solution_serverless/public/get_started/welcome_panel/use_welcome_panel.test.tsx b/x-pack/plugins/security_solution_serverless/public/get_started/welcome_panel/use_welcome_panel.test.tsx new file mode 100644 index 0000000000000..8eff5a580033d --- /dev/null +++ b/x-pack/plugins/security_solution_serverless/public/get_started/welcome_panel/use_welcome_panel.test.tsx @@ -0,0 +1,34 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { renderHook } from '@testing-library/react-hooks'; +import { useWelcomePanel } from './use_welcome_panel'; +import { ProductTier } from '../../../common/product'; + +jest.mock('../../common/services', () => ({ + useKibana: jest.fn(() => ({ + services: { + cloud: { projectsUrl: 'projectsUrl' }, + }, + })), +})); + +describe('useWelcomePanel', () => { + it('should return the correct welcome panel sections', () => { + const productTier = ProductTier.essentials; + const totalActiveSteps = 5; + const totalStepsLeft = 3; + + const { result } = renderHook(() => + useWelcomePanel({ productTier, totalActiveSteps, totalStepsLeft }) + ); + + expect(result.current[0].title).toBe('Project created'); + expect(result.current[1].title).toBe('Invite your team'); + expect(result.current[2].title).toBe('Progress tracker'); + }); +}); diff --git a/x-pack/plugins/security_solution_serverless/public/get_started/welcome_panel/use_welcome_panel.tsx b/x-pack/plugins/security_solution_serverless/public/get_started/welcome_panel/use_welcome_panel.tsx new file mode 100644 index 0000000000000..dfa3d61ae3e64 --- /dev/null +++ b/x-pack/plugins/security_solution_serverless/public/get_started/welcome_panel/use_welcome_panel.tsx @@ -0,0 +1,98 @@ +/* + * 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 { FormattedMessage } from '@kbn/i18n-react'; +import React, { useMemo } from 'react'; +import { EuiButton, EuiFlexGroup, EuiFlexItem, EuiLink } from '@elastic/eui'; +import progress from '../images/progress.svg'; +import invite from '../images/invite.svg'; +import type { HeaderSection } from './types'; +import { + WELCOME_PANEL_PROJECT_CREATED_TITLE, + WELCOME_PANEL_INVITE_YOUR_TEAM_TITLE, + WELCOME_PANEL_INVITE_YOUR_TEAM_DESCRIPTION, + WELCOME_PANEL_PROGRESS_TRACKER_TITLE, +} from './translations'; +import { ProgressTracker } from './progress_tracker'; +import { useKibana } from '../../common/services'; +import { getCloudUrl } from '../../navigation/links/util'; +import type { ProductTier } from '../../../common/product'; +import { ChangePlanLink } from './change_plan_link'; + +export const useWelcomePanel = ({ + productTier, + totalActiveSteps, + totalStepsLeft, +}: { + productTier: ProductTier | undefined; + totalActiveSteps: number | null; + totalStepsLeft: number | null; +}): HeaderSection[] => { + const { cloud } = useKibana().services; + + const welcomePanel: HeaderSection[] = useMemo( + () => [ + { + icon: { type: 'checkInCircleFilled', color: '#00BFB3' }, + title: WELCOME_PANEL_PROJECT_CREATED_TITLE, + description: ( + + + + ), + }} + /> + ), + id: 'projectCreated', + footer: , + }, + { + icon: { type: invite }, + title: WELCOME_PANEL_INVITE_YOUR_TEAM_TITLE, + description: <>{WELCOME_PANEL_INVITE_YOUR_TEAM_DESCRIPTION}, + id: 'inviteYourTeam', + footer: ( + <> + + + + + + + + + ), + }, + { + icon: { type: progress }, + title: WELCOME_PANEL_PROGRESS_TRACKER_TITLE, + id: 'progressTracker', + description: ( + + ), + }, + ], + [cloud, productTier, totalActiveSteps, totalStepsLeft] + ); + + return welcomePanel; +}; diff --git a/x-pack/plugins/security_solution_serverless/public/navigation/links/types.ts b/x-pack/plugins/security_solution_serverless/public/navigation/links/types.ts index 929724a0ddfad..8062fc3fc9a1d 100644 --- a/x-pack/plugins/security_solution_serverless/public/navigation/links/types.ts +++ b/x-pack/plugins/security_solution_serverless/public/navigation/links/types.ts @@ -11,6 +11,7 @@ import type { NavigationLink, LinkCategory, } from '@kbn/security-solution-navigation'; +import type { CloudStart } from '@kbn/cloud-plugin/public'; import type { ExternalPageName } from './constants'; export type ProjectPageName = SecurityPageName | ExternalPageName | 'root'; @@ -18,3 +19,4 @@ export type ProjectPageName = SecurityPageName | ExternalPageName | 'root'; export type ProjectNavigationLink = NavigationLink; export type ProjectLinkCategory = LinkCategory; export type ProjectNavLinks = Observable; +export type GetCloudUrl = (cloudUrlKey: string, cloud: CloudStart) => string | undefined; diff --git a/x-pack/plugins/security_solution_serverless/public/navigation/links/util.ts b/x-pack/plugins/security_solution_serverless/public/navigation/links/util.ts index 109f28ba04624..0572dcdedb2ea 100644 --- a/x-pack/plugins/security_solution_serverless/public/navigation/links/util.ts +++ b/x-pack/plugins/security_solution_serverless/public/navigation/links/util.ts @@ -6,8 +6,7 @@ */ import { APP_UI_ID } from '@kbn/security-solution-plugin/common'; -import type { CloudStart } from '@kbn/cloud-plugin/public'; -import type { ProjectPageName } from './types'; +import type { GetCloudUrl, ProjectPageName } from './types'; export const getNavLinkIdFromProjectPageName = (projectNavLinkId: ProjectPageName): string => { const cleanId = projectNavLinkId.replace(/\/(.*)$/, ''); // remove any trailing path @@ -23,7 +22,7 @@ export const getProjectPageNameFromNavLinkId = (navLinkId: string): ProjectPageN export const isCloudLink = (linkId: string): boolean => linkId.startsWith('cloud:'); export const getCloudLinkKey = (linkId: string): string => linkId.replace('cloud:', ''); -export const getCloudUrl = (cloudUrlKey: string, cloud: CloudStart): string | undefined => { +export const getCloudUrl: GetCloudUrl = (cloudUrlKey, cloud) => { switch (cloudUrlKey) { case 'billing': return cloud.billingUrl; @@ -37,6 +36,8 @@ export const getCloudUrl = (cloudUrlKey: string, cloud: CloudStart): string | un return cloud.profileUrl; case 'usersAndRoles': return cloud.usersAndRolesUrl; + case 'projects': + return cloud.projectsUrl; default: return undefined; } From 564a72f42e1867c688cd3a098fde5c93d4460111 Mon Sep 17 00:00:00 2001 From: Jeramy Soucy Date: Wed, 6 Sep 2023 12:17:27 -0400 Subject: [PATCH 53/97] Use default well-known CAs in serverless MKI (#165846) ## Summary Adds check in serverless supertest providers to determine if CA certs should be overridden or default. Locally, CA certs should be overridden to our self-singed certs, while on MKI we should default to the Mozilla well-known CAs. This was identified as an issue due to [failing tests on MKI](https://buildkite.com/elastic/appex-qa-kibana-serverless-ftr-tests/builds/121#018a69a7-52c9-443b-a25d-009d59220600). --- x-pack/test_serverless/shared/services/supertest.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/x-pack/test_serverless/shared/services/supertest.ts b/x-pack/test_serverless/shared/services/supertest.ts index 3855bbdf7137c..b7b32d9ff8319 100644 --- a/x-pack/test_serverless/shared/services/supertest.ts +++ b/x-pack/test_serverless/shared/services/supertest.ts @@ -14,7 +14,7 @@ export function SupertestProvider({ getService }: FtrProviderContext) { const kbnUrl = formatUrl(config.get('servers.kibana')); const cAuthorities = config.get('servers.kibana').certificateAuthorities; - return supertest.agent(kbnUrl, { ca: cAuthorities }); + return supertest.agent(kbnUrl, process.env.TEST_CLOUD ? {} : { ca: cAuthorities }); } export function SupertestWithoutAuthProvider({ getService }: FtrProviderContext) { @@ -25,5 +25,5 @@ export function SupertestWithoutAuthProvider({ getService }: FtrProviderContext) }); const cAuthorities = config.get('servers.kibana').certificateAuthorities; - return supertest.agent(kbnUrl, { ca: cAuthorities }); + return supertest.agent(kbnUrl, process.env.TEST_CLOUD ? {} : { ca: cAuthorities }); } From 43cc70e0fc0ad8b951f34913ffd77ce7091205a9 Mon Sep 17 00:00:00 2001 From: Tiago Costa Date: Wed, 6 Sep 2023 17:19:30 +0100 Subject: [PATCH 54/97] skip flaky suite (#165644) --- .../cypress/e2e/explore/dashboards/enable_risk_score.cy.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/x-pack/test/security_solution_cypress/cypress/e2e/explore/dashboards/enable_risk_score.cy.ts b/x-pack/test/security_solution_cypress/cypress/e2e/explore/dashboards/enable_risk_score.cy.ts index 47a9218981ba7..576533600b9dc 100644 --- a/x-pack/test/security_solution_cypress/cypress/e2e/explore/dashboards/enable_risk_score.cy.ts +++ b/x-pack/test/security_solution_cypress/cypress/e2e/explore/dashboards/enable_risk_score.cy.ts @@ -32,7 +32,8 @@ import { ENTITY_ANALYTICS_URL } from '../../../urls/navigation'; const spaceId = 'default'; -describe('Enable risk scores', { tags: ['@ess', '@serverless'] }, () => { +// FLAKY: https://github.com/elastic/kibana/issues/165644 +describe('Enable risk scores', { tags: ['@ess', '@serverless', '@brokenInServerless'] }, () => { before(() => { cleanKibana(); login(); From f8cd85535cc3cfec77841e2ae1f8061edb19ea8e Mon Sep 17 00:00:00 2001 From: James Rodewig Date: Wed, 6 Sep 2023 12:35:46 -0400 Subject: [PATCH 55/97] [main] [DOCS] Add `fr-FR` to supported Kibana locales (#165850) (#165875) # Backport This will backport the following commits from `8.9` to `main`: - [[DOCS] Add `fr-FR` to supported Kibana locales (#165850)](https://github.com/elastic/kibana/pull/165850) ### Questions ? Please refer to the [Backport tool documentation](https://github.com/sqren/backport) Co-authored-by: Najwa Harif <90753689+naj-h@users.noreply.github.com> --- docs/setup/settings.asciidoc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/setup/settings.asciidoc b/docs/setup/settings.asciidoc index 31bcc7ffb81fc..c41a1b1cdb260 100644 --- a/docs/setup/settings.asciidoc +++ b/docs/setup/settings.asciidoc @@ -615,7 +615,7 @@ Set this value to false to disable the Upgrade Assistant UI. *Default: true* `i18n.locale` {ess-icon}:: Set this value to change the {kib} interface language. -Valid locales are: `en`, `zh-CN`, `ja-JP`. *Default: `en`* +Valid locales are: `en`, `zh-CN`, `ja-JP`, `fr-FR`. *Default: `en`* include::{kib-repo-dir}/settings/alert-action-settings.asciidoc[leveloffset=+1] include::{kib-repo-dir}/settings/apm-settings.asciidoc[] From ff228267a0349fe3b4d7b5e94fa89e98037b8b9e Mon Sep 17 00:00:00 2001 From: Ersin Erdal <92688503+ersin-erdal@users.noreply.github.com> Date: Wed, 6 Sep 2023 18:39:27 +0200 Subject: [PATCH 56/97] Onboard Index Threshold Rule Type to use FAAD (#164987) Resolves: #164222 This PR replaces `AlertFactory` in ES Query rule type with `AlertsClient` so the alerts are persistent in an alert-as-data index. --------- Co-authored-by: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> --- .../server/rule_types/constants.ts | 20 ++++++++ .../server/rule_types/es_query/executor.ts | 2 +- .../server/rule_types/es_query/fields.ts | 14 ------ .../server/rule_types/es_query/rule_type.ts | 19 +------- .../index_threshold/rule_type.test.ts | 34 +++++++++++++- .../rule_types/index_threshold/rule_type.ts | 47 ++++++++++++++----- .../index_threshold/alert.ts | 21 ++++++++- 7 files changed, 110 insertions(+), 47 deletions(-) delete mode 100644 x-pack/plugins/stack_alerts/server/rule_types/es_query/fields.ts diff --git a/x-pack/plugins/stack_alerts/server/rule_types/constants.ts b/x-pack/plugins/stack_alerts/server/rule_types/constants.ts index 68ab6698f2d31..a5cfb6dc5364a 100644 --- a/x-pack/plugins/stack_alerts/server/rule_types/constants.ts +++ b/x-pack/plugins/stack_alerts/server/rule_types/constants.ts @@ -4,5 +4,25 @@ * 2.0; you may not use this file except in compliance with the Elastic License * 2.0. */ +import { IRuleTypeAlerts } from '@kbn/alerting-plugin/server'; +import { StackAlert } from '@kbn/alerts-as-data-utils'; +import { ALERT_EVALUATION_VALUE } from '@kbn/rule-data-utils'; +import { ALERT_NAMESPACE } from '@kbn/rule-data-utils'; export const STACK_AAD_INDEX_NAME = 'stack'; + +export const ALERT_TITLE = `${ALERT_NAMESPACE}.title` as const; +// kibana.alert.evaluation.conditions - human readable string that shows the conditions set by the user +export const ALERT_EVALUATION_CONDITIONS = `${ALERT_NAMESPACE}.evaluation.conditions` as const; + +export const STACK_ALERTS_AAD_CONFIG: IRuleTypeAlerts = { + context: STACK_AAD_INDEX_NAME, + mappings: { + fieldMap: { + [ALERT_TITLE]: { type: 'keyword', array: false, required: false }, + [ALERT_EVALUATION_CONDITIONS]: { type: 'keyword', array: false, required: false }, + [ALERT_EVALUATION_VALUE]: { type: 'keyword', array: false, required: false }, + }, + }, + shouldWrite: true, +}; diff --git a/x-pack/plugins/stack_alerts/server/rule_types/es_query/executor.ts b/x-pack/plugins/stack_alerts/server/rule_types/es_query/executor.ts index ac2f619228996..c048bfd36cefb 100644 --- a/x-pack/plugins/stack_alerts/server/rule_types/es_query/executor.ts +++ b/x-pack/plugins/stack_alerts/server/rule_types/es_query/executor.ts @@ -12,7 +12,6 @@ import { isGroupAggregation, UngroupedGroupId } from '@kbn/triggers-actions-ui-p import { ALERT_EVALUATION_VALUE, ALERT_REASON, ALERT_URL } from '@kbn/rule-data-utils'; import { expandFlattenedAlert } from '@kbn/alerting-plugin/server/alerts_client/lib'; -import { ALERT_TITLE, ALERT_EVALUATION_CONDITIONS } from './fields'; import { ComparatorFns } from '../../../common'; import { addMessages, @@ -31,6 +30,7 @@ import { EsQueryRuleParams } from './rule_type_params'; import { fetchSearchSourceQuery } from './lib/fetch_search_source_query'; import { isEsqlQueryRule, isSearchSourceRule } from './util'; import { fetchEsqlQuery } from './lib/fetch_esql_query'; +import { ALERT_EVALUATION_CONDITIONS, ALERT_TITLE } from '..'; export async function executor(core: CoreSetup, options: ExecutorOptions) { const searchSourceRule = isSearchSourceRule(options.params.searchType); diff --git a/x-pack/plugins/stack_alerts/server/rule_types/es_query/fields.ts b/x-pack/plugins/stack_alerts/server/rule_types/es_query/fields.ts deleted file mode 100644 index 894ca29e8f55e..0000000000000 --- a/x-pack/plugins/stack_alerts/server/rule_types/es_query/fields.ts +++ /dev/null @@ -1,14 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import { ALERT_NAMESPACE } from '@kbn/rule-data-utils'; - -const ALERT_TITLE = `${ALERT_NAMESPACE}.title` as const; -// kibana.alert.evaluation.conditions - human readable string that shows the consditions set by the user -const ALERT_EVALUATION_CONDITIONS = `${ALERT_NAMESPACE}.evaluation.conditions` as const; - -export { ALERT_TITLE, ALERT_EVALUATION_CONDITIONS }; diff --git a/x-pack/plugins/stack_alerts/server/rule_types/es_query/rule_type.ts b/x-pack/plugins/stack_alerts/server/rule_types/es_query/rule_type.ts index eabe7bf346669..d0f7f7b816d8e 100644 --- a/x-pack/plugins/stack_alerts/server/rule_types/es_query/rule_type.ts +++ b/x-pack/plugins/stack_alerts/server/rule_types/es_query/rule_type.ts @@ -8,11 +8,8 @@ import { i18n } from '@kbn/i18n'; import { CoreSetup } from '@kbn/core/server'; import { extractReferences, injectReferences } from '@kbn/data-plugin/common'; -import { IRuleTypeAlerts } from '@kbn/alerting-plugin/server'; -import { ALERT_EVALUATION_VALUE } from '@kbn/rule-data-utils'; import { StackAlert } from '@kbn/alerts-as-data-utils'; -import { STACK_AAD_INDEX_NAME } from '..'; -import { ALERT_TITLE, ALERT_EVALUATION_CONDITIONS } from './fields'; +import { STACK_ALERTS_AAD_CONFIG } from '..'; import { RuleType } from '../../types'; import { ActionContext } from './action_context'; import { @@ -149,18 +146,6 @@ export function getRuleType( } ); - const alerts: IRuleTypeAlerts = { - context: STACK_AAD_INDEX_NAME, - mappings: { - fieldMap: { - [ALERT_TITLE]: { type: 'keyword', array: false, required: false }, - [ALERT_EVALUATION_CONDITIONS]: { type: 'keyword', array: false, required: false }, - [ALERT_EVALUATION_VALUE]: { type: 'keyword', array: false, required: false }, - }, - }, - shouldWrite: true, - }; - return { id: ES_QUERY_ID, name: ruleTypeName, @@ -216,6 +201,6 @@ export function getRuleType( }, producer: STACK_ALERTS_FEATURE_ID, doesSetRecoveryContext: true, - alerts, + alerts: STACK_ALERTS_AAD_CONFIG, }; } diff --git a/x-pack/plugins/stack_alerts/server/rule_types/index_threshold/rule_type.test.ts b/x-pack/plugins/stack_alerts/server/rule_types/index_threshold/rule_type.test.ts index e4f990b20f1a7..1e0aab0bb7930 100644 --- a/x-pack/plugins/stack_alerts/server/rule_types/index_threshold/rule_type.test.ts +++ b/x-pack/plugins/stack_alerts/server/rule_types/index_threshold/rule_type.test.ts @@ -183,6 +183,7 @@ describe('ruleType', () => { threshold: [1], }; + const ruleName = uuidv4(); await ruleType.executor({ executionId: uuidv4(), startedAt: new Date(), @@ -200,7 +201,7 @@ describe('ruleType', () => { spaceId: uuidv4(), rule: { id: uuidv4(), - name: uuidv4(), + name: ruleName, tags: [], consumer: '', producer: '', @@ -225,7 +226,36 @@ describe('ruleType', () => { flappingSettings: DEFAULT_FLAPPING_SETTINGS, }); - expect(alertServices.alertFactory.create).toHaveBeenCalledWith('all documents'); + expect(alertServices.alertsClient.report).toHaveBeenCalledWith({ + actionGroup: 'threshold met', + context: { + conditions: 'foo is less than 1', + date: '1970-01-01T00:00:00.000Z', + group: 'all documents', + message: `alert '${ruleName}' is active for group 'all documents': + +- Value: 0 +- Conditions Met: foo is less than 1 over 5m +- Timestamp: 1970-01-01T00:00:00.000Z`, + title: `alert ${ruleName} group all documents met threshold`, + value: 0, + }, + id: 'all documents', + payload: { + kibana: { + alert: { + evaluation: { conditions: 'foo is less than 1', value: 0 }, + reason: `alert '${ruleName}' is active for group 'all documents': + +- Value: 0 +- Conditions Met: foo is less than 1 over 5m +- Timestamp: 1970-01-01T00:00:00.000Z`, + title: `alert ${ruleName} group all documents met threshold`, + }, + }, + }, + state: {}, + }); }); it('should ensure a null result does not fire actions', async () => { diff --git a/x-pack/plugins/stack_alerts/server/rule_types/index_threshold/rule_type.ts b/x-pack/plugins/stack_alerts/server/rule_types/index_threshold/rule_type.ts index 4b9a7e69ac31c..caec66b632b5d 100644 --- a/x-pack/plugins/stack_alerts/server/rule_types/index_threshold/rule_type.ts +++ b/x-pack/plugins/stack_alerts/server/rule_types/index_threshold/rule_type.ts @@ -11,22 +11,26 @@ import { TIME_SERIES_BUCKET_SELECTOR_FIELD, } from '@kbn/triggers-actions-ui-plugin/server'; import { isGroupAggregation } from '@kbn/triggers-actions-ui-plugin/common'; -import { RuleType, RuleExecutorOptions, StackAlertsStartDeps } from '../../types'; -import { Params, ParamsSchema } from './rule_type_params'; -import { ActionContext, BaseActionContext, addMessages } from './action_context'; +import { StackAlert } from '@kbn/alerts-as-data-utils'; +import { ALERT_EVALUATION_VALUE, ALERT_REASON } from '@kbn/rule-data-utils'; +import { expandFlattenedAlert } from '@kbn/alerting-plugin/server/alerts_client/lib'; +import { ALERT_EVALUATION_CONDITIONS, ALERT_TITLE, STACK_ALERTS_AAD_CONFIG } from '..'; import { ComparatorFns, getComparatorScript, getHumanReadableComparator, STACK_ALERTS_FEATURE_ID, } from '../../../common'; +import { ActionContext, BaseActionContext, addMessages } from './action_context'; +import { Params, ParamsSchema } from './rule_type_params'; +import { RuleType, RuleExecutorOptions, StackAlertsStartDeps } from '../../types'; export const ID = '.index-threshold'; export const ActionGroupId = 'threshold met'; export function getRuleType( data: Promise -): RuleType { +): RuleType { const ruleTypeName = i18n.translate('xpack.stackAlerts.indexThreshold.alertTypeTitle', { defaultMessage: 'Index threshold', }); @@ -204,10 +208,11 @@ export function getRuleType( executor, producer: STACK_ALERTS_FEATURE_ID, doesSetRecoveryContext: true, + alerts: STACK_ALERTS_AAD_CONFIG, }; async function executor( - options: RuleExecutorOptions + options: RuleExecutorOptions ) { const { rule: { id: ruleId, name }, @@ -215,9 +220,9 @@ export function getRuleType( params, logger, } = options; - const { alertFactory, scopedClusterClient } = services; + const { alertsClient, scopedClusterClient } = services; - const alertLimit = alertFactory.alertLimit.getValue(); + const alertLimit = alertsClient!.getAlertLimitValue(); const compareFn = ComparatorFns.get(params.thresholdComparator); if (compareFn == null) { @@ -310,12 +315,23 @@ export function getRuleType( conditions: humanFn, }; const actionContext = addMessages(name, baseContext, params); - const alert = alertFactory.create(alertId); - alert.scheduleActions(ActionGroupId, actionContext); + + alertsClient!.report({ + id: alertId, + actionGroup: ActionGroupId, + state: {}, + context: actionContext, + payload: expandFlattenedAlert({ + [ALERT_REASON]: actionContext.message, + [ALERT_TITLE]: actionContext.title, + [ALERT_EVALUATION_CONDITIONS]: actionContext.conditions, + [ALERT_EVALUATION_VALUE]: actionContext.value, + }), + }); logger.debug(`scheduled actionGroup: ${JSON.stringify(actionContext)}`); } - alertFactory.alertLimit.setLimitReached(result.truncated); + alertsClient!.setAlertLimitReached(result.truncated); const { getRecoveredAlerts } = services.alertFactory.done(); for (const recoveredAlert of getRecoveredAlerts()) { @@ -330,7 +346,16 @@ export function getRuleType( )} ${params.threshold.join(' and ')}`, }; const recoveryContext = addMessages(name, baseContext, params, true); - recoveredAlert.setContext(recoveryContext); + alertsClient?.setAlertData({ + id: alertId, + context: recoveryContext, + payload: expandFlattenedAlert({ + [ALERT_REASON]: recoveryContext.message, + [ALERT_TITLE]: recoveryContext.title, + [ALERT_EVALUATION_CONDITIONS]: recoveryContext.conditions, + [ALERT_EVALUATION_VALUE]: recoveryContext.value, + }), + }); } return { state: {} }; diff --git a/x-pack/test/alerting_api_integration/spaces_only/tests/alerting/group3/builtin_alert_types/index_threshold/alert.ts b/x-pack/test/alerting_api_integration/spaces_only/tests/alerting/group3/builtin_alert_types/index_threshold/alert.ts index 46f8a0dc955f3..3de5e761b2622 100644 --- a/x-pack/test/alerting_api_integration/spaces_only/tests/alerting/group3/builtin_alert_types/index_threshold/alert.ts +++ b/x-pack/test/alerting_api_integration/spaces_only/tests/alerting/group3/builtin_alert_types/index_threshold/alert.ts @@ -9,6 +9,7 @@ import expect from '@kbn/expect'; import { ESTestIndexTool, ES_TEST_INDEX_NAME } from '@kbn/alerting-api-integration-helpers'; +import { STACK_AAD_INDEX_NAME } from '@kbn/stack-alerts-plugin/server/rule_types'; import { Spaces } from '../../../../../scenarios'; import { FtrProviderContext } from '../../../../../../common/ftr_provider_context'; import { getUrlPrefix, ObjectRemover, getEventLog } from '../../../../../../common/lib'; @@ -33,6 +34,11 @@ export default function ruleTests({ getService }: FtrProviderContext) { const es = getService('es'); const esTestIndexTool = new ESTestIndexTool(es, retry); const esTestIndexToolOutput = new ESTestIndexTool(es, retry, ES_TEST_OUTPUT_INDEX_NAME); + const esTestIndexToolAAD = new ESTestIndexTool( + es, + retry, + `.internal.alerts-${STACK_AAD_INDEX_NAME}.alerts-default-000001` + ); describe('rule', async () => { let endDate: string; @@ -60,6 +66,7 @@ export default function ruleTests({ getService }: FtrProviderContext) { await esTestIndexTool.destroy(); await esTestIndexToolOutput.destroy(); await deleteDataStream(es, ES_TEST_DATA_STREAM_NAME); + await esTestIndexToolAAD.removeAll(); }); // The tests below create two alerts, one that will fire, one that will @@ -86,6 +93,9 @@ export default function ruleTests({ getService }: FtrProviderContext) { }); const docs = await waitForDocs(2); + const messagePattern = + /alert 'always fire' is active for group \'all documents\':\n\n- Value: \d+\n- Conditions Met: count is greater than -1 over 15s\n- Timestamp: \d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}.\d{3}Z/; + for (const doc of docs) { const { group } = doc._source; const { name, title, message } = doc._source.params; @@ -96,10 +106,17 @@ export default function ruleTests({ getService }: FtrProviderContext) { // we'll check title and message in this test, but not subsequent ones expect(title).to.be('alert always fire group all documents met threshold'); - const messagePattern = - /alert 'always fire' is active for group \'all documents\':\n\n- Value: \d+\n- Conditions Met: count is greater than -1 over 15s\n- Timestamp: \d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}.\d{3}Z/; expect(message).to.match(messagePattern); } + + const aadDocs = await esTestIndexToolAAD.getAll(1); + + // @ts-ignore + const alertDoc = aadDocs.body.hits.hits[0]._source.kibana.alert; + expect(alertDoc.reason).to.match(messagePattern); + expect(alertDoc.title).to.be('alert always fire group all documents met threshold'); + expect(alertDoc.evaluation.conditions).to.be('count is greater than -1'); + expect(alertDoc.evaluation.value).greaterThan(0); }); it('runs correctly: count grouped <= =>', async () => { From 58198a2f60da71fe7e927fc2e7331a603c8e8cfa Mon Sep 17 00:00:00 2001 From: Sander Philipse <94373878+sphilipse@users.noreply.github.com> Date: Wed, 6 Sep 2023 18:52:01 +0200 Subject: [PATCH 57/97] [Search] Fix licensing check for platinum connectors (#165870) ## Summary This fixes a licensing check on dedicated for platinum connectors. --- .../components/new_index/select_connector/select_connector.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/new_index/select_connector/select_connector.tsx b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/new_index/select_connector/select_connector.tsx index ce8cb3c699478..01c7d83939bba 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/new_index/select_connector/select_connector.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/new_index/select_connector/select_connector.tsx @@ -228,7 +228,7 @@ export const SelectConnector: React.FC = () => { {filteredConnectors.map((connector) => ( Date: Wed, 6 Sep 2023 10:51:13 -0700 Subject: [PATCH 58/97] [DOCS] Automate generative AI connector screenshots (#165420) --- .../connectors/action-types/gen-ai.asciidoc | 2 + .../connectors/images/gen-ai-connector.png | Bin 198821 -> 250790 bytes .../connectors/images/gen-ai-params-test.png | Bin 183534 -> 175054 bytes .../generative_ai_connector.ts | 48 ++++++++++++++++++ .../stack_connectors/index.ts | 1 + 5 files changed, 51 insertions(+) create mode 100644 x-pack/test/screenshot_creation/apps/response_ops_docs/stack_connectors/generative_ai_connector.ts diff --git a/docs/management/connectors/action-types/gen-ai.asciidoc b/docs/management/connectors/action-types/gen-ai.asciidoc index 749e3dcd2c1e9..df67b6c13f412 100644 --- a/docs/management/connectors/action-types/gen-ai.asciidoc +++ b/docs/management/connectors/action-types/gen-ai.asciidoc @@ -14,6 +14,7 @@ You can create connectors in *{stack-manage-app} > {connectors-ui}*. For exampl [role="screenshot"] image::management/connectors/images/gen-ai-connector.png[Generative AI connector] +// NOTE: This is an autogenerated screenshot. Do not edit it directly. [float] [[gen-ai-connector-configuration]] @@ -65,6 +66,7 @@ as you're creating or editing the connector in {kib}. For example: [role="screenshot"] image::management/connectors/images/gen-ai-params-test.png[Generative AI params test] +// NOTE: This is an autogenerated screenshot. Do not edit it directly. The Generative AI actions have the following configuration properties. diff --git a/docs/management/connectors/images/gen-ai-connector.png b/docs/management/connectors/images/gen-ai-connector.png index 7306f6b28383c41c54a34f84963a41067febe46f..e84205723d7cdc3021a407feaa7991066b05cff9 100644 GIT binary patch literal 250790 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 TUWSkNbM=zdFQ}hyJp6wE0M4N> literal 198821 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≥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 tZ8h*jI#1;M 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 O)q9$E3vNGp@&5n}mMXXa literal 183534 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 K<)Vw$A^!&&;G>ZM diff --git a/x-pack/test/screenshot_creation/apps/response_ops_docs/stack_connectors/generative_ai_connector.ts b/x-pack/test/screenshot_creation/apps/response_ops_docs/stack_connectors/generative_ai_connector.ts new file mode 100644 index 0000000000000..bbfbd62f68b33 --- /dev/null +++ b/x-pack/test/screenshot_creation/apps/response_ops_docs/stack_connectors/generative_ai_connector.ts @@ -0,0 +1,48 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { 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'); + const actionBody = + `{\n` + + `"model": "gpt-3.5-turbo",\n` + + `"messages": [{\n` + + `"role": "user",\n` + + `"content": "You are a cyber security analyst using Elastic Security. I would like you to evaluate the event below and format your output neatly in markdown syntax. Add your description, an accuracy rating, and a threat rating."\n` + + `}]`; + + describe('connector types', function () { + beforeEach(async () => { + await pageObjects.common.navigateToApp('connectors'); + await pageObjects.header.waitUntilLoadingHasFinished(); + }); + + it('generative ai connector screenshots', async () => { + await pageObjects.common.navigateToApp('connectors'); + await pageObjects.header.waitUntilLoadingHasFinished(); + await actions.common.openNewConnectorForm('gen-ai'); + await testSubjects.setValue('nameInput', 'OpenAI test connector'); + await testSubjects.setValue('secrets.apiKey-input', 'testkey'); + await commonScreenshots.takeScreenshot('gen-ai-connector', screenshotDirectories, 1920, 1200); + await testSubjects.click('create-connector-flyout-save-test-btn'); + await testSubjects.click('toastCloseButton'); + const editor = await testSubjects.find('kibanaCodeEditor'); + await editor.clearValue(); + await testSubjects.setValue('kibanaCodeEditor', actionBody, { + clearWithKeyboard: true, + }); + await commonScreenshots.takeScreenshot('gen-ai-params-test', 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 7e995c1290b74..7c795623c9033 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 @@ -55,5 +55,6 @@ export default function ({ loadTestFile, getService }: FtrProviderContext) { loadTestFile(require.resolve('./connectors')); loadTestFile(require.resolve('./connector_types')); + loadTestFile(require.resolve('./generative_ai_connector')); }); } From 118ea87a0845d61da53b9346a48c1bc54d5a988b Mon Sep 17 00:00:00 2001 From: Nathan Reese Date: Wed, 6 Sep 2023 12:18:54 -0600 Subject: [PATCH 59/97] [maps][alerting] fix ES query rule boundary field changed when editing the rule (#165155) Fixes https://github.com/elastic/kibana/issues/163959 While digging into the original issue, it was determined that the existing components were unsalvageable. Fixing all of the issues would have required more work than just starting over. Problems with original components include: 1) updating rule state on component load. This is the cause of the reported bug. 2) lack of loading state when performing async tasks, like loading data views. 3) not displaying validation errors. When users clicked "save" with missing configuration, no UI notifications were displayed 4) Heavy use of EuiExpression made it impossible to view all configuration in a single time Now, geo containment form: 1) Only updates rule state when users interact with inputs. 2) Displays loading state when performing async tasks, like loading data views. 3) Displays validation errors 4) Has a simpler UI that allows users to see all configuration information at the same time. Screen Shot 2023-08-30 at 5 34 00 PM Screen Shot 2023-08-30 at 5 34 48 PM --------- Co-authored-by: kibanamachine <42973632+kibanamachine@users.noreply.github.com> --- ...-types-tracking-containment-conditions.png | Bin 86140 -> 0 bytes .../rule-types/geo-rule-types.asciidoc | 40 +-- .../index_pattern_select.tsx | 7 +- .../rule_types/geo_containment/index.ts | 4 +- ...inment_alert_type_expression.test.tsx.snap | 278 ---------------- .../entity_by_expression.test.tsx.snap | 30 -- .../expressions/boundary_index_expression.tsx | 176 ----------- .../expressions/entity_by_expression.test.tsx | 95 ------ .../expressions/entity_by_expression.tsx | 92 ------ .../expressions/entity_index_expression.tsx | 172 ---------- ...containment_alert_type_expression.test.tsx | 88 ------ .../geo_containment/query_builder/index.tsx | 298 ------------------ .../geo_index_pattern_select.test.tsx.snap | 61 ---- .../expression_with_popover.tsx | 79 ----- .../geo_index_pattern_select.test.tsx | 73 ----- .../geo_index_pattern_select.tsx | 178 ----------- .../rule_form/boundary_form.test.tsx | 92 ++++++ .../rule_form/boundary_form.tsx | 233 ++++++++++++++ .../rule_form/data_view_select.tsx | 58 ++++ .../rule_form/entity_form.test.tsx | 95 ++++++ .../geo_containment/rule_form/entity_form.tsx | 277 ++++++++++++++++ .../geo_containment/rule_form/index.ts | 11 + .../geo_containment/rule_form/query_input.tsx | 98 ++++++ .../geo_containment/rule_form/rule_form.tsx | 63 ++++ .../single_field_select.tsx | 7 +- .../rule_types/geo_containment/types.ts | 3 - .../geo_containment/validation.test.ts | 2 +- .../rule_types/geo_containment/validation.ts | 2 +- .../translations/translations/fr-FR.json | 18 -- .../translations/translations/ja-JP.json | 18 -- .../translations/translations/zh-CN.json | 18 -- 31 files changed, 944 insertions(+), 1722 deletions(-) delete mode 100644 docs/user/alerting/images/alert-types-tracking-containment-conditions.png delete mode 100644 x-pack/plugins/stack_alerts/public/rule_types/geo_containment/query_builder/__snapshots__/geo_containment_alert_type_expression.test.tsx.snap delete mode 100644 x-pack/plugins/stack_alerts/public/rule_types/geo_containment/query_builder/expressions/__snapshots__/entity_by_expression.test.tsx.snap delete mode 100644 x-pack/plugins/stack_alerts/public/rule_types/geo_containment/query_builder/expressions/boundary_index_expression.tsx delete mode 100644 x-pack/plugins/stack_alerts/public/rule_types/geo_containment/query_builder/expressions/entity_by_expression.test.tsx delete mode 100644 x-pack/plugins/stack_alerts/public/rule_types/geo_containment/query_builder/expressions/entity_by_expression.tsx delete mode 100644 x-pack/plugins/stack_alerts/public/rule_types/geo_containment/query_builder/expressions/entity_index_expression.tsx delete mode 100644 x-pack/plugins/stack_alerts/public/rule_types/geo_containment/query_builder/geo_containment_alert_type_expression.test.tsx delete mode 100644 x-pack/plugins/stack_alerts/public/rule_types/geo_containment/query_builder/index.tsx delete mode 100644 x-pack/plugins/stack_alerts/public/rule_types/geo_containment/query_builder/util_components/__snapshots__/geo_index_pattern_select.test.tsx.snap delete mode 100644 x-pack/plugins/stack_alerts/public/rule_types/geo_containment/query_builder/util_components/expression_with_popover.tsx delete mode 100644 x-pack/plugins/stack_alerts/public/rule_types/geo_containment/query_builder/util_components/geo_index_pattern_select.test.tsx delete mode 100644 x-pack/plugins/stack_alerts/public/rule_types/geo_containment/query_builder/util_components/geo_index_pattern_select.tsx create mode 100644 x-pack/plugins/stack_alerts/public/rule_types/geo_containment/rule_form/boundary_form.test.tsx create mode 100644 x-pack/plugins/stack_alerts/public/rule_types/geo_containment/rule_form/boundary_form.tsx create mode 100644 x-pack/plugins/stack_alerts/public/rule_types/geo_containment/rule_form/data_view_select.tsx create mode 100644 x-pack/plugins/stack_alerts/public/rule_types/geo_containment/rule_form/entity_form.test.tsx create mode 100644 x-pack/plugins/stack_alerts/public/rule_types/geo_containment/rule_form/entity_form.tsx create mode 100644 x-pack/plugins/stack_alerts/public/rule_types/geo_containment/rule_form/index.ts create mode 100644 x-pack/plugins/stack_alerts/public/rule_types/geo_containment/rule_form/query_input.tsx create mode 100644 x-pack/plugins/stack_alerts/public/rule_types/geo_containment/rule_form/rule_form.tsx rename x-pack/plugins/stack_alerts/public/rule_types/geo_containment/{query_builder/util_components => rule_form}/single_field_select.tsx (92%) diff --git a/docs/user/alerting/images/alert-types-tracking-containment-conditions.png b/docs/user/alerting/images/alert-types-tracking-containment-conditions.png deleted file mode 100644 index b6b5dbf20ff35424db715e200eb3ac02a7380d5e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 86140 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 diff --git a/docs/user/alerting/rule-types/geo-rule-types.asciidoc b/docs/user/alerting/rule-types/geo-rule-types.asciidoc index cfed5152e7657..f8c750acea62c 100644 --- a/docs/user/alerting/rule-types/geo-rule-types.asciidoc +++ b/docs/user/alerting/rule-types/geo-rule-types.asciidoc @@ -2,51 +2,25 @@ [[geo-alerting]] == Tracking containment -<> offers the tracking containment rule type which runs an {es} query over indices to determine whether any -documents are currently contained within any boundaries from the specified boundary index. -In the event that an entity is contained within a boundary, an alert may be generated. +The tracking containment rule alerts when an entity is contained or no longer contained within a boundary. [float] === Requirements To create a tracking containment rule, the following requirements must be present: -- *Tracks index or data view*: An index containing a `geo_point` or `geo_shape` field, `date` field, -and some form of entity identifier. An entity identifier is a `keyword` or `number` -field that consistently identifies the entity to be tracked. The data in this index should be dynamically -updating so that there are entity movements to alert upon. -- *Boundaries index or data view*: An index containing `geo_shape` data, such as boundary data and bounding box data. -This data is presumed to be static (not updating). Shape data matching the query is -harvested once when the rule is created and anytime after when the rule is re-enabled -after disablement. +- *Entities index*: An index containing a `geo_point` or `geo_shape` field, `date` field, and entity identifier. An entity identifier is a `keyword`, `number`, or `ip` field that identifies the entity. Entity data is expected to be updating so that there are entity movements to alert upon. +- *Boundaries index*: An index containing `geo_shape` data. +Boundaries data is expected to be static (not updating). Boundaries are collected once when the rule is created and anytime after when boundary configuration is modified. -By design, current interval entity locations (_current_ is determined by `date` in -the *Tracked index or data view*) are queried to determine if they are contained -within any monitored boundaries. Entity -data should be somewhat "real time", meaning the dates of new documents aren’t older +Entity locations are queried to determine if they are contained within any monitored boundaries. +Entity data should be somewhat "real time", meaning the dates of new documents aren’t older than the current time minus the amount of the interval. If data older than `now - ` is ingested, it won't trigger a rule. -[float] -=== Rule conditions - -Tracking containment rules have three clauses that define the condition to detect, -as well as two Kuery bars used to provide additional filtering context for each of the indices. - -[role="screenshot"] -image::user/alerting/images/alert-types-tracking-containment-conditions.png[Define the condition to detect,width=75%] -// NOTE: This is an autogenerated screenshot. Do not edit it directly. - -Index (entity):: This clause requires an *index or data view*, a *time field* that will be used for the *time window*, and a *`geo_point` or `geo_shape` field* for tracking. -Index (Boundary):: This clause requires an *index or data view*, a *`geo_shape` field* -identifying boundaries, and an optional *Human-readable boundary name* for better alerting -messages. - [float] === Actions -Conditions for how a rule is tracked can be specified uniquely for each individual action. -A rule can be triggered either when a containment condition is met or when an entity -is no longer contained. +A rule can be triggered either when a containment condition is met or when an entity is no longer contained. [role="screenshot"] image::user/alerting/images/alert-types-tracking-containment-action-options.png[Action frequency options for an action,width=75%] diff --git a/src/plugins/unified_search/public/index_pattern_select/index_pattern_select.tsx b/src/plugins/unified_search/public/index_pattern_select/index_pattern_select.tsx index 7cd8b9d0251d8..f7148db93ce19 100644 --- a/src/plugins/unified_search/public/index_pattern_select/index_pattern_select.tsx +++ b/src/plugins/unified_search/public/index_pattern_select/index_pattern_select.tsx @@ -14,10 +14,7 @@ import { EuiComboBox, EuiComboBoxProps } from '@elastic/eui'; import type { DataViewsContract } from '@kbn/data-views-plugin/public'; export type IndexPatternSelectProps = Required< - Omit< - EuiComboBoxProps, - 'isLoading' | 'onSearchChange' | 'options' | 'selectedOptions' | 'onChange' - >, + Omit, 'onSearchChange' | 'options' | 'selectedOptions' | 'onChange'>, 'placeholder' > & { onChange: (indexPatternId?: string) => void; @@ -155,7 +152,7 @@ export default class IndexPatternSelect extends Component { return { id: '.geo-containment', description: i18n.translate('xpack.stackAlerts.geoContainment.descriptionText', { - defaultMessage: 'Alert when an entity is contained within a geo boundary.', + defaultMessage: 'Alert when an entity is contained or no longer contained within a boundary.', }), iconClass: 'globe', documentationUrl: null, - ruleParamsExpression: lazy(() => import('./query_builder')), + ruleParamsExpression: lazy(() => import('./rule_form')), validate: validateExpression, requiresAppContext: false, }; diff --git a/x-pack/plugins/stack_alerts/public/rule_types/geo_containment/query_builder/__snapshots__/geo_containment_alert_type_expression.test.tsx.snap b/x-pack/plugins/stack_alerts/public/rule_types/geo_containment/query_builder/__snapshots__/geo_containment_alert_type_expression.test.tsx.snap deleted file mode 100644 index abef05ed9b343..0000000000000 --- a/x-pack/plugins/stack_alerts/public/rule_types/geo_containment/query_builder/__snapshots__/geo_containment_alert_type_expression.test.tsx.snap +++ /dev/null @@ -1,278 +0,0 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP - -exports[`should render BoundaryIndexExpression 1`] = ` - - - - - - - - - - - - } -/> -`; - -exports[`should render EntityIndexExpression 1`] = ` - - - - - - } - labelType="label" - > - - - - - - - } -/> -`; - -exports[`should render EntityIndexExpression w/ invalid flag if invalid 1`] = ` - - - - - - } - labelType="label" - > - - - - - - - } -/> -`; diff --git a/x-pack/plugins/stack_alerts/public/rule_types/geo_containment/query_builder/expressions/__snapshots__/entity_by_expression.test.tsx.snap b/x-pack/plugins/stack_alerts/public/rule_types/geo_containment/query_builder/expressions/__snapshots__/entity_by_expression.test.tsx.snap deleted file mode 100644 index 16b77c6b2d5ab..0000000000000 --- a/x-pack/plugins/stack_alerts/public/rule_types/geo_containment/query_builder/expressions/__snapshots__/entity_by_expression.test.tsx.snap +++ /dev/null @@ -1,30 +0,0 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP - -exports[`should render entity by expression with aggregatable field options for entity 1`] = ` -

-`; diff --git a/x-pack/plugins/stack_alerts/public/rule_types/geo_containment/query_builder/expressions/boundary_index_expression.tsx b/x-pack/plugins/stack_alerts/public/rule_types/geo_containment/query_builder/expressions/boundary_index_expression.tsx deleted file mode 100644 index f53b1bfab5982..0000000000000 --- a/x-pack/plugins/stack_alerts/public/rule_types/geo_containment/query_builder/expressions/boundary_index_expression.tsx +++ /dev/null @@ -1,176 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import React, { Fragment, FunctionComponent, useEffect, useRef } from 'react'; -import { EuiFormRow } from '@elastic/eui'; -import { i18n } from '@kbn/i18n'; -import { DataPublicPluginStart } from '@kbn/data-plugin/public'; -import { UnifiedSearchPublicPluginStart } from '@kbn/unified-search-plugin/public'; -import { HttpSetup } from '@kbn/core/public'; -import { useKibana } from '@kbn/kibana-react-plugin/public'; -import { IErrorObject } from '@kbn/triggers-actions-ui-plugin/public'; -import { DataViewField, DataView } from '@kbn/data-plugin/common'; -import { ES_GEO_SHAPE_TYPES, GeoContainmentAlertParams } from '../../types'; -import { GeoIndexPatternSelect } from '../util_components/geo_index_pattern_select'; -import { SingleFieldSelect } from '../util_components/single_field_select'; -import { ExpressionWithPopover } from '../util_components/expression_with_popover'; - -interface Props { - ruleParams: GeoContainmentAlertParams; - errors: IErrorObject; - boundaryIndexPattern: DataView; - boundaryNameField?: string; - setBoundaryIndexPattern: (boundaryIndexPattern?: DataView) => void; - setBoundaryGeoField: (boundaryGeoField?: string) => void; - setBoundaryNameField: (boundaryNameField?: string) => void; - data: DataPublicPluginStart; - unifiedSearch: UnifiedSearchPublicPluginStart; -} - -interface KibanaDeps { - http: HttpSetup; -} - -export const BoundaryIndexExpression: FunctionComponent = ({ - ruleParams, - errors, - boundaryIndexPattern, - boundaryNameField, - setBoundaryIndexPattern, - setBoundaryGeoField, - setBoundaryNameField, - data, - unifiedSearch, -}) => { - // eslint-disable-next-line react-hooks/exhaustive-deps - const BOUNDARY_NAME_ENTITY_TYPES = ['string', 'number', 'ip']; - const { http } = useKibana().services; - const IndexPatternSelect = (unifiedSearch.ui && unifiedSearch.ui.IndexPatternSelect) || null; - const { boundaryGeoField } = ruleParams; - // eslint-disable-next-line react-hooks/exhaustive-deps - const nothingSelected: DataViewField = { - name: '', - type: 'string', - } as DataViewField; - - const usePrevious = (value: T): T | undefined => { - const ref = useRef(); - useEffect(() => { - ref.current = value; - }); - return ref.current; - }; - - const oldIndexPattern = usePrevious(boundaryIndexPattern); - const fields = useRef<{ - geoFields: DataViewField[]; - boundaryNameFields: DataViewField[]; - }>({ - geoFields: [], - boundaryNameFields: [], - }); - useEffect(() => { - if (oldIndexPattern !== boundaryIndexPattern) { - fields.current.geoFields = - (boundaryIndexPattern.fields && - boundaryIndexPattern.fields.length && - boundaryIndexPattern.fields.filter((field: DataViewField) => - ES_GEO_SHAPE_TYPES.includes(field.type) - )) || - []; - if (fields.current.geoFields.length) { - setBoundaryGeoField(fields.current.geoFields[0].name); - } - - fields.current.boundaryNameFields = [ - ...(boundaryIndexPattern.fields ?? []).filter((field: DataViewField) => { - return ( - BOUNDARY_NAME_ENTITY_TYPES.includes(field.type) && - !field.name.startsWith('_') && - !field.name.endsWith('keyword') - ); - }), - nothingSelected, - ]; - if (fields.current.boundaryNameFields.length) { - setBoundaryNameField(fields.current.boundaryNameFields[0].name); - } - } - }, [ - BOUNDARY_NAME_ENTITY_TYPES, - boundaryIndexPattern, - nothingSelected, - oldIndexPattern, - setBoundaryGeoField, - setBoundaryNameField, - ]); - - const indexPopover = ( - - - { - if (!_indexPattern) { - return; - } - setBoundaryIndexPattern(_indexPattern); - }} - value={boundaryIndexPattern.id} - IndexPatternSelectComponent={IndexPatternSelect} - indexPatternService={data.indexPatterns} - http={http} - includedGeoTypes={ES_GEO_SHAPE_TYPES} - /> - - - - - - { - setBoundaryNameField(name === nothingSelected.name ? undefined : name); - }} - fields={fields.current.boundaryNameFields} - /> - - - ); - - return ( - - ); -}; diff --git a/x-pack/plugins/stack_alerts/public/rule_types/geo_containment/query_builder/expressions/entity_by_expression.test.tsx b/x-pack/plugins/stack_alerts/public/rule_types/geo_containment/query_builder/expressions/entity_by_expression.test.tsx deleted file mode 100644 index 7d1ef64448311..0000000000000 --- a/x-pack/plugins/stack_alerts/public/rule_types/geo_containment/query_builder/expressions/entity_by_expression.test.tsx +++ /dev/null @@ -1,95 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import React from 'react'; -import { mount } from 'enzyme'; -import { EntityByExpression, getValidIndexPatternFields } from './entity_by_expression'; -import { DataViewField } from '@kbn/data-views-plugin/public'; - -const defaultProps = { - errors: { - index: [], - indexId: [], - geoField: [], - entity: [], - dateField: [], - boundaryType: [], - boundaryIndexTitle: [], - boundaryIndexId: [], - boundaryGeoField: [], - name: ['Name is required.'], - interval: [], - alertTypeId: [], - actionConnectors: [], - }, - entity: 'FlightNum', - setAlertParamsEntity: (arg: string) => {}, - indexFields: [ - { - count: 0, - name: 'DestLocation', - type: 'geo_point', - esTypes: ['geo_point'], - scripted: false, - searchable: true, - aggregatable: true, - readFromDocValues: true, - }, - { - count: 0, - name: 'FlightNum', - type: 'string', - esTypes: ['keyword'], - scripted: false, - searchable: true, - aggregatable: true, - readFromDocValues: true, - }, - { - count: 0, - name: 'OriginLocation', - type: 'geo_point', - esTypes: ['geo_point'], - scripted: false, - searchable: true, - aggregatable: true, - readFromDocValues: true, - }, - { - count: 0, - name: 'timestamp', - type: 'date', - esTypes: ['date'], - scripted: false, - searchable: true, - aggregatable: true, - readFromDocValues: true, - }, - ] as DataViewField[], - isInvalid: false, -}; - -test('should render entity by expression with aggregatable field options for entity', async () => { - const component = mount(); - expect(component.render()).toMatchSnapshot(); -}); -// - -test('should only use valid index fields', async () => { - // Only the string index field should match - const indexFields = getValidIndexPatternFields(defaultProps.indexFields); - expect(indexFields.length).toEqual(1); - - // Set all agg fields to false, invalidating them for use - const invalidIndexFields = defaultProps.indexFields.map((field) => ({ - ...field, - aggregatable: false, - })); - - const noIndexFields = getValidIndexPatternFields(invalidIndexFields as DataViewField[]); - expect(noIndexFields.length).toEqual(0); -}); diff --git a/x-pack/plugins/stack_alerts/public/rule_types/geo_containment/query_builder/expressions/entity_by_expression.tsx b/x-pack/plugins/stack_alerts/public/rule_types/geo_containment/query_builder/expressions/entity_by_expression.tsx deleted file mode 100644 index b0b02fe27f8ef..0000000000000 --- a/x-pack/plugins/stack_alerts/public/rule_types/geo_containment/query_builder/expressions/entity_by_expression.tsx +++ /dev/null @@ -1,92 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import React, { FunctionComponent, useEffect, useRef } from 'react'; -import { EuiFormRow } from '@elastic/eui'; -import { i18n } from '@kbn/i18n'; -import _ from 'lodash'; -import { DataViewField } from '@kbn/data-views-plugin/public'; -import { IErrorObject } from '@kbn/triggers-actions-ui-plugin/public'; -import { SingleFieldSelect } from '../util_components/single_field_select'; -import { ExpressionWithPopover } from '../util_components/expression_with_popover'; - -interface Props { - errors: IErrorObject; - entity: string; - setAlertParamsEntity: (entity: string) => void; - indexFields: DataViewField[]; - isInvalid: boolean; -} - -const ENTITY_TYPES = ['string', 'number', 'ip']; -export function getValidIndexPatternFields(fields: DataViewField[]): DataViewField[] { - return fields.filter((field) => { - const isSpecifiedSupportedField = ENTITY_TYPES.includes(field.type); - const hasLeadingUnderscore = field.name.startsWith('_'); - const isAggregatable = !!field.aggregatable; - return isSpecifiedSupportedField && isAggregatable && !hasLeadingUnderscore; - }); -} - -export const EntityByExpression: FunctionComponent = ({ - errors, - entity, - setAlertParamsEntity, - indexFields, - isInvalid, -}) => { - const usePrevious = (value: T): T | undefined => { - const ref = useRef(); - useEffect(() => { - ref.current = value; - }); - return ref.current; - }; - - const oldIndexFields = usePrevious(indexFields); - const fields = useRef<{ - indexFields: DataViewField[]; - }>({ - indexFields: [], - }); - useEffect(() => { - if (!_.isEqual(oldIndexFields, indexFields)) { - fields.current.indexFields = getValidIndexPatternFields(indexFields); - if (!entity && fields.current.indexFields.length) { - setAlertParamsEntity(fields.current.indexFields[0].name); - } - } - }, [indexFields, oldIndexFields, setAlertParamsEntity, entity]); - - const indexPopover = ( - - _entity && setAlertParamsEntity(_entity)} - fields={fields.current.indexFields} - /> - - ); - - return ( - - ); -}; diff --git a/x-pack/plugins/stack_alerts/public/rule_types/geo_containment/query_builder/expressions/entity_index_expression.tsx b/x-pack/plugins/stack_alerts/public/rule_types/geo_containment/query_builder/expressions/entity_index_expression.tsx deleted file mode 100644 index fe75c7b22dcc2..0000000000000 --- a/x-pack/plugins/stack_alerts/public/rule_types/geo_containment/query_builder/expressions/entity_index_expression.tsx +++ /dev/null @@ -1,172 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import React, { Fragment, FunctionComponent, useEffect, useRef } from 'react'; -import { EuiFormRow } from '@elastic/eui'; -import { FormattedMessage } from '@kbn/i18n-react'; -import { i18n } from '@kbn/i18n'; -import { DataPublicPluginStart } from '@kbn/data-plugin/public'; -import { UnifiedSearchPublicPluginStart } from '@kbn/unified-search-plugin/public'; -import { HttpSetup } from '@kbn/core/public'; -import { useKibana } from '@kbn/kibana-react-plugin/public'; -import { - IErrorObject, - RuleTypeParamsExpressionProps, -} from '@kbn/triggers-actions-ui-plugin/public'; -import { DataViewField, DataView } from '@kbn/data-plugin/common'; -import { ES_GEO_FIELD_TYPES } from '../../types'; -import { GeoIndexPatternSelect } from '../util_components/geo_index_pattern_select'; -import { SingleFieldSelect } from '../util_components/single_field_select'; -import { ExpressionWithPopover } from '../util_components/expression_with_popover'; - -interface Props { - dateField: string; - geoField: string; - errors: IErrorObject; - setAlertParamsDate: (date: string) => void; - setAlertParamsGeoField: (geoField: string) => void; - setRuleProperty: RuleTypeParamsExpressionProps['setRuleProperty']; - setIndexPattern: (indexPattern: DataView) => void; - indexPattern: DataView; - isInvalid: boolean; - data: DataPublicPluginStart; - unifiedSearch: UnifiedSearchPublicPluginStart; -} - -interface KibanaDeps { - http: HttpSetup; -} - -export const EntityIndexExpression: FunctionComponent = ({ - setAlertParamsDate, - setAlertParamsGeoField, - errors, - setIndexPattern, - indexPattern, - isInvalid, - dateField: timeField, - geoField, - data, - unifiedSearch, -}) => { - const { http } = useKibana().services; - const IndexPatternSelect = (unifiedSearch.ui && unifiedSearch.ui.IndexPatternSelect) || null; - - const usePrevious = (value: T): T | undefined => { - const ref = useRef(); - useEffect(() => { - ref.current = value; - }); - return ref.current; - }; - - const oldIndexPattern = usePrevious(indexPattern); - const fields = useRef<{ - dateFields: DataViewField[]; - geoFields: DataViewField[]; - }>({ - dateFields: [], - geoFields: [], - }); - useEffect(() => { - if (oldIndexPattern !== indexPattern) { - fields.current.geoFields = - (indexPattern.fields && - indexPattern.fields.length && - indexPattern.fields.filter((field: DataViewField) => - ES_GEO_FIELD_TYPES.includes(field.type) - )) || - []; - if (fields.current.geoFields.length) { - setAlertParamsGeoField(fields.current.geoFields[0].name); - } - - fields.current.dateFields = - (indexPattern.fields && - indexPattern.fields.length && - indexPattern.fields.filter((field: DataViewField) => field.type === 'date')) || - []; - if (fields.current.dateFields.length) { - setAlertParamsDate(fields.current.dateFields[0].name); - } - } - }, [indexPattern, oldIndexPattern, setAlertParamsDate, setAlertParamsGeoField]); - - const indexPopover = ( - - - { - // reset time field and expression fields if indices are deleted - if (!_indexPattern) { - return; - } - setIndexPattern(_indexPattern); - }} - value={indexPattern.id} - IndexPatternSelectComponent={IndexPatternSelect} - indexPatternService={data.indexPatterns} - http={http} - includedGeoTypes={ES_GEO_FIELD_TYPES} - /> - - - } - > - - _timeField && setAlertParamsDate(_timeField) - } - fields={fields.current.dateFields} - /> - - - - _geoField && setAlertParamsGeoField(_geoField) - } - fields={fields.current.geoFields} - /> - - - ); - - return ( - - ); -}; diff --git a/x-pack/plugins/stack_alerts/public/rule_types/geo_containment/query_builder/geo_containment_alert_type_expression.test.tsx b/x-pack/plugins/stack_alerts/public/rule_types/geo_containment/query_builder/geo_containment_alert_type_expression.test.tsx deleted file mode 100644 index 5ef79b7379035..0000000000000 --- a/x-pack/plugins/stack_alerts/public/rule_types/geo_containment/query_builder/geo_containment_alert_type_expression.test.tsx +++ /dev/null @@ -1,88 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import React from 'react'; -import { shallow } from 'enzyme'; -import { EntityIndexExpression } from './expressions/entity_index_expression'; -import { BoundaryIndexExpression } from './expressions/boundary_index_expression'; -import { IErrorObject } from '@kbn/triggers-actions-ui-plugin/public'; -import { DataView } from '@kbn/data-plugin/common'; -import { dataPluginMock } from '@kbn/data-plugin/public/mocks'; -import { unifiedSearchPluginMock } from '@kbn/unified-search-plugin/public/mocks'; - -const dataStartMock = dataPluginMock.createStartContract(); -const unifiedSearchStartMock = unifiedSearchPluginMock.createStartContract(); - -const alertParams = { - index: '', - indexId: '', - geoField: '', - entity: '', - dateField: '', - boundaryType: '', - boundaryIndexTitle: '', - boundaryIndexId: '', - boundaryGeoField: '', -}; - -test('should render EntityIndexExpression', async () => { - const component = shallow( - {}} - setAlertParamsGeoField={() => {}} - setRuleProperty={() => {}} - setIndexPattern={() => {}} - indexPattern={'' as unknown as DataView} - isInvalid={false} - data={dataStartMock} - unifiedSearch={unifiedSearchStartMock} - /> - ); - - expect(component).toMatchSnapshot(); -}); - -test('should render EntityIndexExpression w/ invalid flag if invalid', async () => { - const component = shallow( - {}} - setAlertParamsGeoField={() => {}} - setRuleProperty={() => {}} - setIndexPattern={() => {}} - indexPattern={'' as unknown as DataView} - isInvalid={true} - data={dataStartMock} - unifiedSearch={unifiedSearchStartMock} - /> - ); - - expect(component).toMatchSnapshot(); -}); - -test('should render BoundaryIndexExpression', async () => { - const component = shallow( - {}} - setBoundaryGeoField={() => {}} - setBoundaryNameField={() => {}} - boundaryNameField={'testNameField'} - data={dataStartMock} - unifiedSearch={unifiedSearchStartMock} - /> - ); - - expect(component).toMatchSnapshot(); -}); diff --git a/x-pack/plugins/stack_alerts/public/rule_types/geo_containment/query_builder/index.tsx b/x-pack/plugins/stack_alerts/public/rule_types/geo_containment/query_builder/index.tsx deleted file mode 100644 index d49ee6c15b83a..0000000000000 --- a/x-pack/plugins/stack_alerts/public/rule_types/geo_containment/query_builder/index.tsx +++ /dev/null @@ -1,298 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import React, { Fragment, useEffect, useState } from 'react'; -import { EuiCallOut, EuiFlexItem, EuiSpacer, EuiTitle } from '@elastic/eui'; -import { FormattedMessage } from '@kbn/i18n-react'; -import { i18n } from '@kbn/i18n'; -import { fromKueryExpression, luceneStringToDsl } from '@kbn/es-query'; -import type { RuleTypeParamsExpressionProps } from '@kbn/triggers-actions-ui-plugin/public'; -import type { DataView, DataViewsPublicPluginStart } from '@kbn/data-views-plugin/public'; -import type { Query } from '@kbn/es-query'; -import { QueryStringInput } from '@kbn/unified-search-plugin/public'; -import { useKibana } from '@kbn/kibana-react-plugin/public'; -import type { HttpSetup } from '@kbn/core-http-browser'; -import type { DocLinksStart } from '@kbn/core-doc-links-browser'; -import type { IUiSettingsClient } from '@kbn/core-ui-settings-server'; -import type { CoreStart } from '@kbn/core/public'; -import type { IStorageWrapper } from '@kbn/kibana-utils-plugin/public'; -import type { UsageCollectionStart } from '@kbn/usage-collection-plugin/public'; -import { STACK_ALERTS_FEATURE_ID } from '../../../../common/constants'; -import { BoundaryIndexExpression } from './expressions/boundary_index_expression'; -import { EntityByExpression } from './expressions/entity_by_expression'; -import { EntityIndexExpression } from './expressions/entity_index_expression'; -import type { GeoContainmentAlertParams } from '../types'; - -const DEFAULT_VALUES = { - TRACKING_EVENT: '', - ENTITY: '', - INDEX: '', - INDEX_ID: '', - DATE_FIELD: '', - BOUNDARY_TYPE: 'entireIndex', // Only one supported currently. Will eventually be more - GEO_FIELD: '', - BOUNDARY_INDEX: '', - BOUNDARY_INDEX_ID: '', - BOUNDARY_GEO_FIELD: '', - BOUNDARY_NAME_FIELD: '', - DELAY_OFFSET_WITH_UNITS: '0m', -}; - -interface KibanaDeps { - http: HttpSetup; - docLinks: DocLinksStart; - dataViews: DataViewsPublicPluginStart; - uiSettings: IUiSettingsClient; - notifications: CoreStart['notifications']; - storage: IStorageWrapper; - usageCollection: UsageCollectionStart; -} - -function validateQuery(query: Query) { - try { - // eslint-disable-next-line @typescript-eslint/no-unused-expressions - query.language === 'kuery' ? fromKueryExpression(query.query) : luceneStringToDsl(query.query); - } catch (err) { - return false; - } - return true; -} - -export const GeoContainmentAlertTypeExpression: React.FunctionComponent< - RuleTypeParamsExpressionProps -> = ({ ruleParams, ruleInterval, setRuleParams, setRuleProperty, errors, data, unifiedSearch }) => { - const { - index, - indexId, - indexQuery, - geoField, - entity, - dateField, - boundaryType, - boundaryIndexTitle, - boundaryIndexId, - boundaryIndexQuery, - boundaryGeoField, - boundaryNameField, - } = ruleParams; - - const { http, docLinks, uiSettings, notifications, storage, usageCollection, dataViews } = - useKibana().services; - - const [indexPattern, _setIndexPattern] = useState({ - id: '', - title: '', - } as DataView); - const setIndexPattern = (_indexPattern?: DataView) => { - if (_indexPattern) { - _setIndexPattern(_indexPattern); - if (_indexPattern.title) { - setRuleParams('index', _indexPattern.title); - } - if (_indexPattern.id) { - setRuleParams('indexId', _indexPattern.id); - } - } - }; - const [indexQueryInput, setIndexQueryInput] = useState( - indexQuery || { - query: '', - language: 'kuery', - } - ); - const [boundaryIndexPattern, _setBoundaryIndexPattern] = useState({ - id: '', - title: '', - } as DataView); - const setBoundaryIndexPattern = (_indexPattern?: DataView) => { - if (_indexPattern) { - _setBoundaryIndexPattern(_indexPattern); - if (_indexPattern.title) { - setRuleParams('boundaryIndexTitle', _indexPattern.title); - } - if (_indexPattern.id) { - setRuleParams('boundaryIndexId', _indexPattern.id); - } - } - }; - const [boundaryIndexQueryInput, setBoundaryIndexQueryInput] = useState( - boundaryIndexQuery || { - query: '', - language: 'kuery', - } - ); - - const hasExpressionErrors = false; - const expressionErrorMessage = i18n.translate( - 'xpack.stackAlerts.geoContainment.fixErrorInExpressionBelowValidationMessage', - { - defaultMessage: 'Expression contains errors.', - } - ); - - useEffect(() => { - const initToDefaultParams = async () => { - setRuleProperty('params', { - ...ruleParams, - index: index ?? DEFAULT_VALUES.INDEX, - indexId: indexId ?? DEFAULT_VALUES.INDEX_ID, - entity: entity ?? DEFAULT_VALUES.ENTITY, - dateField: dateField ?? DEFAULT_VALUES.DATE_FIELD, - boundaryType: boundaryType ?? DEFAULT_VALUES.BOUNDARY_TYPE, - geoField: geoField ?? DEFAULT_VALUES.GEO_FIELD, - boundaryIndexTitle: boundaryIndexTitle ?? DEFAULT_VALUES.BOUNDARY_INDEX, - boundaryIndexId: boundaryIndexId ?? DEFAULT_VALUES.BOUNDARY_INDEX_ID, - boundaryGeoField: boundaryGeoField ?? DEFAULT_VALUES.BOUNDARY_GEO_FIELD, - boundaryNameField: boundaryNameField ?? DEFAULT_VALUES.BOUNDARY_NAME_FIELD, - }); - if (!data.indexPatterns) { - return; - } - if (indexId) { - const _indexPattern = await data.indexPatterns.get(indexId); - setIndexPattern(_indexPattern); - } - if (boundaryIndexId) { - const _boundaryIndexPattern = await data.indexPatterns.get(boundaryIndexId); - setBoundaryIndexPattern(_boundaryIndexPattern); - } - }; - initToDefaultParams(); - // eslint-disable-next-line react-hooks/exhaustive-deps - }, []); - - return ( - - {hasExpressionErrors ? ( - - - - - - ) : null} - - -
- -
-
- - setRuleParams('dateField', _date)} - setAlertParamsGeoField={(_geoField) => setRuleParams('geoField', _geoField)} - setRuleProperty={setRuleProperty} - setIndexPattern={setIndexPattern} - indexPattern={indexPattern} - isInvalid={!indexId || !dateField || !geoField} - data={data} - unifiedSearch={unifiedSearch} - /> - setRuleParams('entity', entityName)} - indexFields={indexPattern.fields} - isInvalid={indexId && dateField && geoField ? !entity : false} - /> - - - { - if (query.language) { - if (validateQuery(query)) { - setRuleParams('indexQuery', query); - } - setIndexQueryInput(query); - } - }} - appName={STACK_ALERTS_FEATURE_ID} - deps={{ - unifiedSearch, - notifications, - http, - docLinks, - uiSettings, - data, - dataViews, - storage, - usageCollection, - }} - /> - - - -
- -
-
- - - _geoField && setRuleParams('boundaryGeoField', _geoField) - } - setBoundaryNameField={(_boundaryNameField: string | undefined) => - _boundaryNameField - ? setRuleParams('boundaryNameField', _boundaryNameField) - : setRuleParams('boundaryNameField', '') - } - boundaryNameField={boundaryNameField} - data={data} - unifiedSearch={unifiedSearch} - /> - - - { - if (query.language) { - if (validateQuery(query)) { - setRuleParams('boundaryIndexQuery', query); - } - setBoundaryIndexQueryInput(query); - } - }} - appName={STACK_ALERTS_FEATURE_ID} - deps={{ - unifiedSearch, - notifications, - http, - docLinks, - uiSettings, - data, - dataViews, - storage, - usageCollection, - }} - /> - - -
- ); -}; - -// eslint-disable-next-line import/no-default-export -export { GeoContainmentAlertTypeExpression as default }; diff --git a/x-pack/plugins/stack_alerts/public/rule_types/geo_containment/query_builder/util_components/__snapshots__/geo_index_pattern_select.test.tsx.snap b/x-pack/plugins/stack_alerts/public/rule_types/geo_containment/query_builder/util_components/__snapshots__/geo_index_pattern_select.test.tsx.snap deleted file mode 100644 index f5f4c35f0edde..0000000000000 --- a/x-pack/plugins/stack_alerts/public/rule_types/geo_containment/query_builder/util_components/__snapshots__/geo_index_pattern_select.test.tsx.snap +++ /dev/null @@ -1,61 +0,0 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP - -exports[`should render with error when data view does not have geo_point field 1`] = ` - - - - - -`; - -exports[`should render without error after mounting 1`] = ` - - - - - -`; diff --git a/x-pack/plugins/stack_alerts/public/rule_types/geo_containment/query_builder/util_components/expression_with_popover.tsx b/x-pack/plugins/stack_alerts/public/rule_types/geo_containment/query_builder/util_components/expression_with_popover.tsx deleted file mode 100644 index 9509e3a534f44..0000000000000 --- a/x-pack/plugins/stack_alerts/public/rule_types/geo_containment/query_builder/util_components/expression_with_popover.tsx +++ /dev/null @@ -1,79 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import React, { ReactNode, useState } from 'react'; -import { - EuiButtonIcon, - EuiExpression, - EuiFlexGroup, - EuiFlexItem, - EuiPopover, - EuiPopoverTitle, -} from '@elastic/eui'; -import { i18n } from '@kbn/i18n'; - -export const ExpressionWithPopover: ({ - popoverContent, - expressionDescription, - defaultValue, - value, - isInvalid, -}: { - popoverContent: ReactNode; - expressionDescription: ReactNode; - defaultValue?: ReactNode; - value?: ReactNode; - isInvalid?: boolean; -}) => JSX.Element = ({ popoverContent, expressionDescription, defaultValue, value, isInvalid }) => { - const [popoverOpen, setPopoverOpen] = useState(false); - - return ( - setPopoverOpen(true)} - isInvalid={isInvalid} - /> - } - isOpen={popoverOpen} - closePopover={() => setPopoverOpen(false)} - ownFocus - anchorPosition="downLeft" - zIndex={8000} - display="block" - > -
- - - {expressionDescription} - - setPopoverOpen(false)} - /> - - - - {popoverContent} -
-
- ); -}; diff --git a/x-pack/plugins/stack_alerts/public/rule_types/geo_containment/query_builder/util_components/geo_index_pattern_select.test.tsx b/x-pack/plugins/stack_alerts/public/rule_types/geo_containment/query_builder/util_components/geo_index_pattern_select.test.tsx deleted file mode 100644 index 01abe69d5f8c1..0000000000000 --- a/x-pack/plugins/stack_alerts/public/rule_types/geo_containment/query_builder/util_components/geo_index_pattern_select.test.tsx +++ /dev/null @@ -1,73 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import React from 'react'; -import { shallow } from 'enzyme'; -import { GeoIndexPatternSelect } from './geo_index_pattern_select'; -import { DataViewsContract } from '@kbn/data-plugin/public'; -import { HttpSetup } from '@kbn/core/public'; - -class MockIndexPatternSelectComponent extends React.Component { - render() { - return 'MockIndexPatternSelectComponent'; - } -} - -function makeMockIndexPattern(id: string, fields: unknown) { - return { - id, - fields, - }; -} - -const mockIndexPatternService: DataViewsContract = { - get(id: string) { - if (id === 'foobar_with_geopoint') { - return makeMockIndexPattern(id, [{ type: 'geo_point' }]); - } else if (id === 'foobar_without_geopoint') { - return makeMockIndexPattern(id, [{ type: 'string' }]); - } - }, -} as unknown as DataViewsContract; - -test('should render without error after mounting', async () => { - const component = shallow( - {}} - value={'foobar_with_geopoint'} - includedGeoTypes={['geo_point']} - indexPatternService={mockIndexPatternService} - IndexPatternSelectComponent={MockIndexPatternSelectComponent} - /> - ); - - // Ensure all promises resolve - await new Promise((resolve) => process.nextTick(resolve)); - // Ensure the state changes are reflected - component.update(); - expect(component).toMatchSnapshot(); -}); - -test('should render with error when data view does not have geo_point field', async () => { - const component = shallow( - {}} - value={'foobar_without_geopoint'} - includedGeoTypes={['geo_point']} - indexPatternService={mockIndexPatternService} - IndexPatternSelectComponent={MockIndexPatternSelectComponent} - /> - ); - - // Ensure all promises resolve - await new Promise((resolve) => process.nextTick(resolve)); - // Ensure the state changes are reflected - component.update(); - expect(component).toMatchSnapshot(); -}); diff --git a/x-pack/plugins/stack_alerts/public/rule_types/geo_containment/query_builder/util_components/geo_index_pattern_select.tsx b/x-pack/plugins/stack_alerts/public/rule_types/geo_containment/query_builder/util_components/geo_index_pattern_select.tsx deleted file mode 100644 index b2a235feb1a80..0000000000000 --- a/x-pack/plugins/stack_alerts/public/rule_types/geo_containment/query_builder/util_components/geo_index_pattern_select.tsx +++ /dev/null @@ -1,178 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import React, { Component } from 'react'; -import { EuiCallOut, EuiFormRow, EuiLink, EuiSpacer } from '@elastic/eui'; -import { i18n } from '@kbn/i18n'; -import { FormattedMessage } from '@kbn/i18n-react'; -import { DataViewsContract } from '@kbn/data-plugin/public'; -import { HttpSetup } from '@kbn/core/public'; -import { DataView } from '@kbn/data-plugin/common'; - -interface Props { - onChange: (indexPattern: DataView) => void; - value: string | undefined; - // eslint-disable-next-line @typescript-eslint/no-explicit-any - IndexPatternSelectComponent: any; - indexPatternService: DataViewsContract | undefined; - http: HttpSetup; - includedGeoTypes: string[]; -} - -interface State { - doesIndexPatternHaveGeoField: boolean; - noIndexPatternsExist: boolean; -} - -export class GeoIndexPatternSelect extends Component { - private _isMounted: boolean = false; - - state = { - doesIndexPatternHaveGeoField: false, - noIndexPatternsExist: false, - }; - - componentWillUnmount() { - this._isMounted = false; - } - - componentDidMount() { - this._isMounted = true; - if (this.props.value) { - this._loadIndexPattern(this.props.value); - } - } - - _loadIndexPattern = async (indexPatternId: string) => { - if (!indexPatternId || indexPatternId.length === 0 || !this.props.indexPatternService) { - return; - } - - let indexPattern; - try { - indexPattern = await this.props.indexPatternService.get(indexPatternId); - } catch (err) { - return; - } - - if (!this._isMounted || indexPattern.id !== indexPatternId) { - return; - } - - this.setState({ - doesIndexPatternHaveGeoField: indexPattern.fields.some((field) => { - return this.props.includedGeoTypes.includes(field.type); - }), - }); - - return indexPattern; - }; - - _onIndexPatternSelect = async (indexPatternId: string) => { - const indexPattern = await this._loadIndexPattern(indexPatternId); - if (indexPattern) { - this.props.onChange(indexPattern); - } - }; - - _onNoIndexPatterns = () => { - this.setState({ noIndexPatternsExist: true }); - }; - - _renderNoIndexPatternWarning() { - if (!this.state.noIndexPatternsExist) { - return null; - } - - return ( - <> - -

- - - - -

-

- - - - -

-
- - - ); - } - - render() { - const IndexPatternSelectComponent = this.props.IndexPatternSelectComponent; - const isIndexPatternInvalid = !!this.props.value && !this.state.doesIndexPatternHaveGeoField; - const error = isIndexPatternInvalid - ? i18n.translate('xpack.stackAlerts.geoContainment.noGeoFieldInIndexPattern.message', { - defaultMessage: - 'Data view does not contain any allowed geospatial fields. Must have one of type {geoFields}.', - values: { - geoFields: this.props.includedGeoTypes.join(', '), - }, - }) - : ''; - - return ( - <> - {this._renderNoIndexPatternWarning()} - - - {IndexPatternSelectComponent ? ( - - ) : ( -
- )} - - - ); - } -} diff --git a/x-pack/plugins/stack_alerts/public/rule_types/geo_containment/rule_form/boundary_form.test.tsx b/x-pack/plugins/stack_alerts/public/rule_types/geo_containment/rule_form/boundary_form.test.tsx new file mode 100644 index 0000000000000..971d8e24df7d9 --- /dev/null +++ b/x-pack/plugins/stack_alerts/public/rule_types/geo_containment/rule_form/boundary_form.test.tsx @@ -0,0 +1,92 @@ +/* + * 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 React from 'react'; +import { act } from 'react-dom/test-utils'; +import { BoundaryForm } from './boundary_form'; +import { mountWithIntl, nextTick } from '@kbn/test-jest-helpers'; +import type { DataPublicPluginStart } from '@kbn/data-plugin/public'; +import type { GeoContainmentAlertParams } from '../types'; +import type { UnifiedSearchPublicPluginStart } from '@kbn/unified-search-plugin/public'; + +jest.mock('./query_input', () => { + return { + QueryInput: () =>
mock query input
, + }; +}); + +test('should not call prop callbacks on render', async () => { + const DATA_VIEW_TITLE = 'my-boundaries*'; + const DATA_VIEW_ID = '1234'; + const mockDataView = { + id: DATA_VIEW_ID, + fields: [ + { + name: 'location', + type: 'geo_shape', + }, + ], + title: DATA_VIEW_TITLE, + }; + const props = { + data: { + indexPatterns: { + get: async () => mockDataView, + }, + } as unknown as DataPublicPluginStart, + getValidationError: () => null, + ruleParams: { + boundaryIndexTitle: DATA_VIEW_TITLE, + boundaryIndexId: DATA_VIEW_ID, + boundaryGeoField: 'location', + boundaryNameField: 'name', + boundaryIndexQuery: { + query: 'population > 1000', + language: 'kuery', + }, + } as unknown as GeoContainmentAlertParams, + setDataViewId: jest.fn(), + setDataViewTitle: jest.fn(), + setGeoField: jest.fn(), + setNameField: jest.fn(), + setQuery: jest.fn(), + unifiedSearch: { + ui: { + IndexPatternSelect: () => { + return '
mock IndexPatternSelect
'; + }, + }, + } as unknown as UnifiedSearchPublicPluginStart, + }; + + const wrapper = mountWithIntl(); + await act(async () => { + await nextTick(); + wrapper.update(); + }); + + // Assert that geospatial dataView fields are loaded + // to ensure test is properly awaiting async useEffect + let geoFieldsLoaded = false; + wrapper.findWhere((n) => { + if ( + n.name() === 'SingleFieldSelect' && + n.props().value === 'location' && + n.props().fields.length === 1 + ) { + geoFieldsLoaded = true; + } + return false; + }); + expect(geoFieldsLoaded).toBe(true); + + expect(props.setDataViewId).not.toHaveBeenCalled(); + expect(props.setDataViewTitle).not.toHaveBeenCalled(); + expect(props.setGeoField).not.toHaveBeenCalled(); + expect(props.setNameField).not.toHaveBeenCalled(); + expect(props.setQuery).not.toHaveBeenCalled(); +}); diff --git a/x-pack/plugins/stack_alerts/public/rule_types/geo_containment/rule_form/boundary_form.tsx b/x-pack/plugins/stack_alerts/public/rule_types/geo_containment/rule_form/boundary_form.tsx new file mode 100644 index 0000000000000..9674ee3a7fb02 --- /dev/null +++ b/x-pack/plugins/stack_alerts/public/rule_types/geo_containment/rule_form/boundary_form.tsx @@ -0,0 +1,233 @@ +/* + * 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 React, { useEffect, useState } from 'react'; +import { i18n } from '@kbn/i18n'; +import { FormattedMessage } from '@kbn/i18n-react'; +import { EuiFormRow, EuiPanel, EuiSkeletonText, EuiSpacer, EuiTitle } from '@elastic/eui'; +import type { DataPublicPluginStart } from '@kbn/data-plugin/public'; +import type { DataView, DataViewField } from '@kbn/data-views-plugin/public'; +import type { Query } from '@kbn/es-query'; +import type { UnifiedSearchPublicPluginStart } from '@kbn/unified-search-plugin/public'; +import type { GeoContainmentAlertParams } from '../types'; +import { DataViewSelect } from './data_view_select'; +import { SingleFieldSelect } from './single_field_select'; +import { QueryInput } from './query_input'; + +export const BOUNDARY_GEO_FIELD_TYPES = ['geo_shape']; + +function getGeoFields(fields: DataViewField[]) { + return fields.filter((field: DataViewField) => BOUNDARY_GEO_FIELD_TYPES.includes(field.type)); +} + +function getNameFields(fields: DataViewField[]) { + return fields.filter( + (field: DataViewField) => + ['string', 'number', 'ip'].includes(field.type) && + !field.name.startsWith('_') && + !field.name.endsWith('keyword') + ); +} + +interface Props { + data: DataPublicPluginStart; + getValidationError: (key: string) => string | null; + ruleParams: GeoContainmentAlertParams; + setDataViewId: (id: string) => void; + setDataViewTitle: (title: string) => void; + setGeoField: (fieldName: string) => void; + setNameField: (fieldName: string | undefined) => void; + setQuery: (query: Query) => void; + unifiedSearch: UnifiedSearchPublicPluginStart; +} + +export const BoundaryForm = (props: Props) => { + const [isLoading, setIsLoading] = useState(false); + const [dataView, setDataView] = useState(); + const [dataViewNotFound, setDataViewNotFound] = useState(false); + const [geoFields, setGeoFields] = useState([]); + const [nameFields, setNameFields] = useState([]); + + useEffect(() => { + if (!props.ruleParams.boundaryIndexId || props.ruleParams.boundaryIndexId === dataView?.id) { + return; + } + + let ignore = false; + setIsLoading(true); + setDataViewNotFound(false); + props.data.indexPatterns + .get(props.ruleParams.boundaryIndexId) + .then((nextDataView) => { + if (!ignore) { + setDataView(nextDataView); + setGeoFields(getGeoFields(nextDataView.fields)); + setNameFields(getNameFields(nextDataView.fields)); + setIsLoading(false); + } + }) + .catch(() => { + if (!ignore) { + setDataViewNotFound(true); + setIsLoading(false); + } + }); + + return () => { + ignore = true; + }; + }, [props.ruleParams.boundaryIndexId, dataView?.id, props.data.indexPatterns]); + + function getDataViewError() { + const validationError = props.getValidationError('boundaryIndexTitle'); + if (validationError) { + return validationError; + } + + if (dataView && geoFields.length === 0) { + return i18n.translate('xpack.stackAlerts.geoContainment.noGeoFieldInIndexPattern.message', { + defaultMessage: + 'Data view does not contain geospatial fields. Must have one of type: {geoFieldTypes}.', + values: { + geoFieldTypes: BOUNDARY_GEO_FIELD_TYPES.join(', '), + }, + }); + } + + if (dataViewNotFound) { + return i18n.translate('xpack.stackAlerts.geoContainment.dataViewNotFound', { + defaultMessage: `Unable to find data view '{id}'`, + values: { id: props.ruleParams.indexId }, + }); + } + + return null; + } + + const dataViewError = getDataViewError(); + const geoFieldError = props.getValidationError('boundaryGeoField'); + + return ( + + +
+ +
+
+ + + + + + { + if (!nextDataView.id) { + return; + } + props.setDataViewId(nextDataView.id); + props.setDataViewTitle(nextDataView.title); + + const nextGeoFields = getGeoFields(nextDataView.fields); + if (nextGeoFields.length) { + props.setGeoField(nextGeoFields[0].name); + } else if ('boundaryGeoField' in props.ruleParams) { + props.setGeoField(''); + } + + // do not attempt to auto select name field + // its optional plus there can be many matches so auto selecting the correct field is improbable + if ('boundaryNameField' in props.ruleParams) { + props.setNameField(undefined); + } + }} + unifiedSearch={props.unifiedSearch} + /> + + + {props.ruleParams.boundaryIndexId && ( + <> + + { + if (fieldName) { + props.setGeoField(fieldName); + } + }} + fields={geoFields} + /> + + + + { + if (fieldName) { + props.setNameField(fieldName); + } + }} + fields={nameFields} + /> + + + + { + props.setQuery(query); + }} + query={props.ruleParams.boundaryIndexQuery} + /> + + + )} + +
+ ); +}; diff --git a/x-pack/plugins/stack_alerts/public/rule_types/geo_containment/rule_form/data_view_select.tsx b/x-pack/plugins/stack_alerts/public/rule_types/geo_containment/rule_form/data_view_select.tsx new file mode 100644 index 0000000000000..5b162a1fb5ff0 --- /dev/null +++ b/x-pack/plugins/stack_alerts/public/rule_types/geo_containment/rule_form/data_view_select.tsx @@ -0,0 +1,58 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React, { useState } from 'react'; +import useMountedState from 'react-use/lib/useMountedState'; +import { i18n } from '@kbn/i18n'; +import type { DataPublicPluginStart } from '@kbn/data-plugin/public'; +import type { UnifiedSearchPublicPluginStart } from '@kbn/unified-search-plugin/public'; +import type { DataView } from '@kbn/data-views-plugin/public'; + +interface Props { + data: DataPublicPluginStart; + dataViewId?: string; + isInvalid: boolean; + onChange: (dataview: DataView) => void; + unifiedSearch: UnifiedSearchPublicPluginStart; +} + +export const DataViewSelect = (props: Props) => { + const [isLoading, setIsLoading] = useState(false); + const isMounted = useMountedState(); + + return ( + { + if (!dataViewId) { + return; + } + try { + setIsLoading(true); + const dataView = await props.data.indexPatterns.get(dataViewId); + if (isMounted()) { + props.onChange(dataView); + setIsLoading(false); + } + } catch (error) { + // ignore indexPatterns.get error, + // if data view does not exist, select will not update rule params + if (isMounted()) { + setIsLoading(false); + } + } + }} + placeholder={i18n.translate('xpack.stackAlerts.geoContainment.dataViewSelectPlaceholder', { + defaultMessage: 'Select data view', + })} + /> + ); +}; diff --git a/x-pack/plugins/stack_alerts/public/rule_types/geo_containment/rule_form/entity_form.test.tsx b/x-pack/plugins/stack_alerts/public/rule_types/geo_containment/rule_form/entity_form.test.tsx new file mode 100644 index 0000000000000..da0f52897dd42 --- /dev/null +++ b/x-pack/plugins/stack_alerts/public/rule_types/geo_containment/rule_form/entity_form.test.tsx @@ -0,0 +1,95 @@ +/* + * 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 React from 'react'; +import { act } from 'react-dom/test-utils'; +import { EntityForm } from './entity_form'; +import { mountWithIntl, nextTick } from '@kbn/test-jest-helpers'; +import type { DataPublicPluginStart } from '@kbn/data-plugin/public'; +import type { GeoContainmentAlertParams } from '../types'; +import type { UnifiedSearchPublicPluginStart } from '@kbn/unified-search-plugin/public'; + +jest.mock('./query_input', () => { + return { + QueryInput: () =>
mock query input
, + }; +}); + +test('should not call prop callbacks on render', async () => { + const DATA_VIEW_TITLE = 'my-entities*'; + const DATA_VIEW_ID = '1234'; + const mockDataView = { + id: DATA_VIEW_ID, + fields: [ + { + name: 'location', + type: 'geo_point', + }, + ], + title: DATA_VIEW_TITLE, + }; + const props = { + data: { + indexPatterns: { + get: async () => mockDataView, + }, + } as unknown as DataPublicPluginStart, + getValidationError: () => null, + ruleParams: { + index: DATA_VIEW_TITLE, + indexId: DATA_VIEW_ID, + geoField: 'location', + entity: 'entity_id', + dateField: 'time', + indexQuery: { + query: 'population > 1000', + language: 'kuery', + }, + } as unknown as GeoContainmentAlertParams, + setDataViewId: jest.fn(), + setDataViewTitle: jest.fn(), + setDateField: jest.fn(), + setEntityField: jest.fn(), + setGeoField: jest.fn(), + setQuery: jest.fn(), + unifiedSearch: { + ui: { + IndexPatternSelect: () => { + return '
mock IndexPatternSelect
'; + }, + }, + } as unknown as UnifiedSearchPublicPluginStart, + }; + + const wrapper = mountWithIntl(); + await act(async () => { + await nextTick(); + wrapper.update(); + }); + + // Assert that geospatial dataView fields are loaded + // to ensure test is properly awaiting async useEffect + let geoFieldsLoaded = false; + wrapper.findWhere((n) => { + if ( + n.name() === 'SingleFieldSelect' && + n.props().value === 'location' && + n.props().fields.length === 1 + ) { + geoFieldsLoaded = true; + } + return false; + }); + expect(geoFieldsLoaded).toBe(true); + + expect(props.setDataViewId).not.toHaveBeenCalled(); + expect(props.setDataViewTitle).not.toHaveBeenCalled(); + expect(props.setDateField).not.toHaveBeenCalled(); + expect(props.setEntityField).not.toHaveBeenCalled(); + expect(props.setGeoField).not.toHaveBeenCalled(); + expect(props.setQuery).not.toHaveBeenCalled(); +}); diff --git a/x-pack/plugins/stack_alerts/public/rule_types/geo_containment/rule_form/entity_form.tsx b/x-pack/plugins/stack_alerts/public/rule_types/geo_containment/rule_form/entity_form.tsx new file mode 100644 index 0000000000000..3923b494fa045 --- /dev/null +++ b/x-pack/plugins/stack_alerts/public/rule_types/geo_containment/rule_form/entity_form.tsx @@ -0,0 +1,277 @@ +/* + * 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 React, { useEffect, useState } from 'react'; +import { i18n } from '@kbn/i18n'; +import { FormattedMessage } from '@kbn/i18n-react'; +import { EuiFormRow, EuiPanel, EuiSkeletonText, EuiSpacer, EuiTitle } from '@elastic/eui'; +import type { DataPublicPluginStart } from '@kbn/data-plugin/public'; +import type { DataView, DataViewField } from '@kbn/data-views-plugin/public'; +import type { UnifiedSearchPublicPluginStart } from '@kbn/unified-search-plugin/public'; +import type { Query } from '@kbn/es-query'; +import type { GeoContainmentAlertParams } from '../types'; +import { DataViewSelect } from './data_view_select'; +import { SingleFieldSelect } from './single_field_select'; +import { QueryInput } from './query_input'; + +export const ENTITY_GEO_FIELD_TYPES = ['geo_point', 'geo_shape']; + +function getDateFields(fields: DataViewField[]) { + return fields.filter((field: DataViewField) => field.type === 'date'); +} + +function getEntityFields(fields: DataViewField[]) { + return fields.filter( + (field: DataViewField) => + field.aggregatable && + ['string', 'number', 'ip'].includes(field.type) && + !field.name.startsWith('_') + ); +} + +function getGeoFields(fields: DataViewField[]) { + return fields.filter((field: DataViewField) => ENTITY_GEO_FIELD_TYPES.includes(field.type)); +} + +interface Props { + data: DataPublicPluginStart; + getValidationError: (key: string) => string | null; + ruleParams: GeoContainmentAlertParams; + setDataViewId: (id: string) => void; + setDataViewTitle: (title: string) => void; + setDateField: (fieldName: string) => void; + setEntityField: (fieldName: string) => void; + setGeoField: (fieldName: string) => void; + setQuery: (query: Query) => void; + unifiedSearch: UnifiedSearchPublicPluginStart; +} + +export const EntityForm = (props: Props) => { + const [isLoading, setIsLoading] = useState(false); + const [dataView, setDataView] = useState(); + const [dataViewNotFound, setDataViewNotFound] = useState(false); + const [dateFields, setDateFields] = useState([]); + const [entityFields, setEntityFields] = useState([]); + const [geoFields, setGeoFields] = useState([]); + + useEffect(() => { + if (!props.ruleParams.indexId || props.ruleParams.indexId === dataView?.id) { + return; + } + + let ignore = false; + setIsLoading(true); + setDataViewNotFound(false); + props.data.indexPatterns + .get(props.ruleParams.indexId) + .then((nextDataView) => { + if (!ignore) { + setDataView(nextDataView); + setDateFields(getDateFields(nextDataView.fields)); + setEntityFields(getEntityFields(nextDataView.fields)); + setGeoFields(getGeoFields(nextDataView.fields)); + setIsLoading(false); + } + }) + .catch(() => { + if (!ignore) { + setDataViewNotFound(true); + setIsLoading(false); + } + }); + + return () => { + ignore = true; + }; + }, [props.ruleParams.indexId, dataView?.id, props.data.indexPatterns]); + + function getDataViewError() { + const validationError = props.getValidationError('index'); + if (validationError) { + return validationError; + } + + if (dataView && dateFields.length === 0) { + return i18n.translate('xpack.stackAlerts.geoContainment.noDateFieldInIndexPattern.message', { + defaultMessage: 'Data view does not contain date fields.', + }); + } + + if (dataView && geoFields.length === 0) { + return i18n.translate('xpack.stackAlerts.geoContainment.noGeoFieldInIndexPattern.message', { + defaultMessage: + 'Data view does not contain geospatial fields. Must have one of type: {geoFieldTypes}.', + values: { + geoFieldTypes: ENTITY_GEO_FIELD_TYPES.join(', '), + }, + }); + } + + if (dataViewNotFound) { + return i18n.translate('xpack.stackAlerts.geoContainment.dataViewNotFound', { + defaultMessage: `Unable to find data view '{id}'`, + values: { id: props.ruleParams.indexId }, + }); + } + + return null; + } + + const dataViewError = getDataViewError(); + const dateFieldError = props.getValidationError('dateField'); + const geoFieldError = props.getValidationError('geoField'); + const entityFieldError = props.getValidationError('entity'); + + return ( + + +
+ +
+
+ + + + + + { + if (!nextDataView.id) { + return; + } + props.setDataViewId(nextDataView.id); + props.setDataViewTitle(nextDataView.title); + + const nextDateFields = getDateFields(nextDataView.fields); + if (nextDateFields.length) { + props.setDateField(nextDateFields[0].name); + } else if ('dateField' in props.ruleParams) { + props.setDateField(''); + } + + // do not attempt to auto select entity field + // there can be many matches so auto selecting the correct field is improbable + if ('entity' in props.ruleParams) { + props.setEntityField(''); + } + + const nextGeoFields = getGeoFields(nextDataView.fields); + if (nextGeoFields.length) { + props.setGeoField(nextGeoFields[0].name); + } else if ('geoField' in props.ruleParams) { + props.setGeoField(''); + } + }} + unifiedSearch={props.unifiedSearch} + /> + + + {props.ruleParams.indexId && ( + <> + + { + if (fieldName) { + props.setDateField(fieldName); + } + }} + fields={dateFields} + /> + + + + { + if (fieldName) { + props.setGeoField(fieldName); + } + }} + fields={geoFields} + /> + + + + { + if (fieldName) { + props.setEntityField(fieldName); + } + }} + fields={entityFields} + /> + + + + { + props.setQuery(query); + }} + query={props.ruleParams.indexQuery} + /> + + + )} + +
+ ); +}; diff --git a/x-pack/plugins/stack_alerts/public/rule_types/geo_containment/rule_form/index.ts b/x-pack/plugins/stack_alerts/public/rule_types/geo_containment/rule_form/index.ts new file mode 100644 index 0000000000000..dba9cea07ed8d --- /dev/null +++ b/x-pack/plugins/stack_alerts/public/rule_types/geo_containment/rule_form/index.ts @@ -0,0 +1,11 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { RuleForm } from './rule_form'; + +// eslint-disable-next-line import/no-default-export +export default RuleForm; diff --git a/x-pack/plugins/stack_alerts/public/rule_types/geo_containment/rule_form/query_input.tsx b/x-pack/plugins/stack_alerts/public/rule_types/geo_containment/rule_form/query_input.tsx new file mode 100644 index 0000000000000..c07ce2ec8e090 --- /dev/null +++ b/x-pack/plugins/stack_alerts/public/rule_types/geo_containment/rule_form/query_input.tsx @@ -0,0 +1,98 @@ +/* + * 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 React, { useState } from 'react'; +import { QueryStringInput } from '@kbn/unified-search-plugin/public'; +import { useKibana } from '@kbn/kibana-react-plugin/public'; +import type { DataView, DataViewsPublicPluginStart } from '@kbn/data-views-plugin/public'; +import type { Query } from '@kbn/es-query'; +import { fromKueryExpression, luceneStringToDsl } from '@kbn/es-query'; +import type { HttpSetup } from '@kbn/core-http-browser'; +import type { DocLinksStart } from '@kbn/core-doc-links-browser'; +import type { IUiSettingsClient } from '@kbn/core-ui-settings-server'; +import type { CoreStart } from '@kbn/core/public'; +import type { IStorageWrapper } from '@kbn/kibana-utils-plugin/public'; +import type { UsageCollectionStart } from '@kbn/usage-collection-plugin/public'; +import type { UnifiedSearchPublicPluginStart } from '@kbn/unified-search-plugin/public'; +import type { DataPublicPluginStart } from '@kbn/data-plugin/public'; +import { STACK_ALERTS_FEATURE_ID } from '../../../../common/constants'; + +function validateQuery(query: Query) { + try { + // eslint-disable-next-line @typescript-eslint/no-unused-expressions + query.language === 'kuery' ? fromKueryExpression(query.query) : luceneStringToDsl(query.query); + } catch (err) { + return false; + } + return true; +} + +interface Props { + dataView?: DataView; + onChange: (query: Query) => void; + query?: Query; +} + +export const QueryInput = (props: Props) => { + const { + data, + dataViews, + docLinks, + http, + notifications, + storage, + uiSettings, + unifiedSearch, + usageCollection, + } = useKibana<{ + data: DataPublicPluginStart; + dataViews: DataViewsPublicPluginStart; + docLinks: DocLinksStart; + http: HttpSetup; + notifications: CoreStart['notifications']; + uiSettings: IUiSettingsClient; + storage: IStorageWrapper; + unifiedSearch: UnifiedSearchPublicPluginStart; + usageCollection: UsageCollectionStart; + }>().services; + + const [localQuery, setLocalQuery] = useState( + props.query || { + query: '', + language: 'kuery', + } + ); + + return ( + { + if (query.language) { + setLocalQuery(query); + if (validateQuery(query)) { + props.onChange(query); + } + } + }} + appName={STACK_ALERTS_FEATURE_ID} + deps={{ + unifiedSearch, + notifications, + http, + docLinks, + uiSettings, + data, + dataViews, + storage, + usageCollection, + }} + /> + ); +}; diff --git a/x-pack/plugins/stack_alerts/public/rule_types/geo_containment/rule_form/rule_form.tsx b/x-pack/plugins/stack_alerts/public/rule_types/geo_containment/rule_form/rule_form.tsx new file mode 100644 index 0000000000000..52e6baae16536 --- /dev/null +++ b/x-pack/plugins/stack_alerts/public/rule_types/geo_containment/rule_form/rule_form.tsx @@ -0,0 +1,63 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React from 'react'; +import { EuiSpacer } from '@elastic/eui'; +import type { Query } from '@kbn/es-query'; +import type { RuleTypeParamsExpressionProps } from '@kbn/triggers-actions-ui-plugin/public'; +import type { GeoContainmentAlertParams } from '../types'; +import { BoundaryForm } from './boundary_form'; +import { EntityForm } from './entity_form'; + +export const RuleForm: React.FunctionComponent< + RuleTypeParamsExpressionProps +> = (props) => { + function getValidationError(key: string) { + return props.errors[key]?.length > 0 && key in props.ruleParams + ? (props.errors[key] as string[])[0] + : null; + } + + return ( + <> + props.setRuleParams('indexId', id)} + setDataViewTitle={(title: string) => props.setRuleParams('index', title)} + setDateField={(fieldName: string) => props.setRuleParams('dateField', fieldName)} + setEntityField={(fieldName: string) => props.setRuleParams('entity', fieldName)} + setGeoField={(fieldName: string) => props.setRuleParams('geoField', fieldName)} + setQuery={(query: Query) => props.setRuleParams('indexQuery', query)} + unifiedSearch={props.unifiedSearch} + /> + + + + { + props.setRuleParams('boundaryIndexId', id); + // TODO remove unused param 'boundaryType' + props.setRuleParams('boundaryType', 'entireIndex'); + }} + setDataViewTitle={(title: string) => props.setRuleParams('boundaryIndexTitle', title)} + setGeoField={(fieldName: string) => props.setRuleParams('boundaryGeoField', fieldName)} + setNameField={(fieldName: string | undefined) => + props.setRuleParams('boundaryNameField', fieldName) + } + setQuery={(query: Query) => props.setRuleParams('boundaryIndexQuery', query)} + unifiedSearch={props.unifiedSearch} + /> + + + + ); +}; diff --git a/x-pack/plugins/stack_alerts/public/rule_types/geo_containment/query_builder/util_components/single_field_select.tsx b/x-pack/plugins/stack_alerts/public/rule_types/geo_containment/rule_form/single_field_select.tsx similarity index 92% rename from x-pack/plugins/stack_alerts/public/rule_types/geo_containment/query_builder/util_components/single_field_select.tsx rename to x-pack/plugins/stack_alerts/public/rule_types/geo_containment/rule_form/single_field_select.tsx index 7783c943301f3..71ef2d301a9c7 100644 --- a/x-pack/plugins/stack_alerts/public/rule_types/geo_containment/query_builder/util_components/single_field_select.tsx +++ b/x-pack/plugins/stack_alerts/public/rule_types/geo_containment/rule_form/single_field_select.tsx @@ -33,13 +33,14 @@ function fieldsToOptions(fields?: DataViewField[]): Array void; fields: DataViewField[]; } -export function SingleFieldSelect({ placeholder, value, onChange, fields }: Props) { +export function SingleFieldSelect({ isInvalid, placeholder, value, onChange, fields }: Props) { function renderOption( option: EuiComboBoxOptionOption, searchValue: string, @@ -71,6 +72,7 @@ export function SingleFieldSelect({ placeholder, value, onChange, fields }: Prop return ( ); } diff --git a/x-pack/plugins/stack_alerts/public/rule_types/geo_containment/types.ts b/x-pack/plugins/stack_alerts/public/rule_types/geo_containment/types.ts index b34dd9ec4f8d2..4eb717a23e437 100644 --- a/x-pack/plugins/stack_alerts/public/rule_types/geo_containment/types.ts +++ b/x-pack/plugins/stack_alerts/public/rule_types/geo_containment/types.ts @@ -22,6 +22,3 @@ export interface GeoContainmentAlertParams extends RuleTypeParams { indexQuery?: Query; boundaryIndexQuery?: Query; } - -export const ES_GEO_FIELD_TYPES = ['geo_point', 'geo_shape']; -export const ES_GEO_SHAPE_TYPES = ['geo_shape']; diff --git a/x-pack/plugins/stack_alerts/public/rule_types/geo_containment/validation.test.ts b/x-pack/plugins/stack_alerts/public/rule_types/geo_containment/validation.test.ts index 5312f5018d933..30aef903c6ef5 100644 --- a/x-pack/plugins/stack_alerts/public/rule_types/geo_containment/validation.test.ts +++ b/x-pack/plugins/stack_alerts/public/rule_types/geo_containment/validation.test.ts @@ -105,7 +105,7 @@ describe('expression params validation', () => { }; expect(validateExpression(initialParams).errors.boundaryIndexTitle.length).toBeGreaterThan(0); expect(validateExpression(initialParams).errors.boundaryIndexTitle[0]).toBe( - 'Boundary data view title is required.' + 'Boundary data view is required.' ); }); diff --git a/x-pack/plugins/stack_alerts/public/rule_types/geo_containment/validation.ts b/x-pack/plugins/stack_alerts/public/rule_types/geo_containment/validation.ts index 71fd748ea5df1..04fb961ac559b 100644 --- a/x-pack/plugins/stack_alerts/public/rule_types/geo_containment/validation.ts +++ b/x-pack/plugins/stack_alerts/public/rule_types/geo_containment/validation.ts @@ -69,7 +69,7 @@ export const validateExpression = (alertParams: GeoContainmentAlertParams): Vali if (!boundaryIndexTitle) { errors.boundaryIndexTitle.push( i18n.translate('xpack.stackAlerts.geoContainment.error.requiredBoundaryIndexTitleText', { - defaultMessage: 'Boundary data view title is required.', + defaultMessage: 'Boundary data view is required.', }) ); } diff --git a/x-pack/plugins/translations/translations/fr-FR.json b/x-pack/plugins/translations/translations/fr-FR.json index 14688c6898e1f..c3d6b1732732f 100644 --- a/x-pack/plugins/translations/translations/fr-FR.json +++ b/x-pack/plugins/translations/translations/fr-FR.json @@ -35656,7 +35656,6 @@ "xpack.stackAlerts.geoContainment.boundariesFetchError": "Impossible de récupérer les limites du suivi de l’endiguement, erreur : {error}", "xpack.stackAlerts.geoContainment.entityContainmentFetchError": "Impossible de récupérer l’endiguement des entités, erreur : {error}", "xpack.stackAlerts.geoContainment.noBoundariesError": "Aucune limite de suivi de l’endiguement trouvée. Assurez-vous que l’index \"{index}\" a des documents.", - "xpack.stackAlerts.geoContainment.noGeoFieldInIndexPattern.message": "La vue de données ne contient aucun champ géospatial autorisé. Il doit en contenir un de type {geoFields}.", "xpack.stackAlerts.indexThreshold.alertTypeContextSubjectTitle": "le groupe {group} de l'alerte {name} a atteint le seuil", "xpack.stackAlerts.indexThreshold.alertTypeRecoveryContextSubjectTitle": "groupe {group} de l'alerte {name} récupéré", "xpack.stackAlerts.indexThreshold.invalidComparatorErrorMessage": "thresholdComparator spécifié non valide : {comparator}", @@ -35747,12 +35746,8 @@ "xpack.stackAlerts.geoContainment.actionVariableContextFromEntityDocumentIdLabel": "ID du document de l'entité contenue", "xpack.stackAlerts.geoContainment.actionVariableContextFromEntityLocationLabel": "Emplacement de l'entité", "xpack.stackAlerts.geoContainment.alertTypeTitle": "Suivi de l'endiguement", - "xpack.stackAlerts.geoContainment.boundaryNameSelect": "Sélectionner un nom de limite", "xpack.stackAlerts.geoContainment.boundaryNameSelectLabel": "Nom de limite lisible par l'utilisateur (facultatif)", "xpack.stackAlerts.geoContainment.descriptionText": "Alerte lorsqu'une entité est contenue dans une limite géographique.", - "xpack.stackAlerts.geoContainment.entityByLabel": "par", - "xpack.stackAlerts.geoContainment.entityIndexLabel": "index", - "xpack.stackAlerts.geoContainment.entityIndexSelect": "Sélectionner une vue de données et un champ de point géographique", "xpack.stackAlerts.geoContainment.error.requiredBoundaryGeoFieldText": "Le champ de limite géographique est requis.", "xpack.stackAlerts.geoContainment.error.requiredBoundaryIndexTitleText": "Le titre de la vue de données de limite est requis.", "xpack.stackAlerts.geoContainment.error.requiredBoundaryTypeText": "Le type de limite est requis.", @@ -35760,25 +35755,12 @@ "xpack.stackAlerts.geoContainment.error.requiredEntityText": "L'entité est requise.", "xpack.stackAlerts.geoContainment.error.requiredGeoFieldText": "Le champ géographique est requis.", "xpack.stackAlerts.geoContainment.error.requiredIndexTitleText": "La vue de données est requise.", - "xpack.stackAlerts.geoContainment.fixErrorInExpressionBelowValidationMessage": "L'expression contient des erreurs.", "xpack.stackAlerts.geoContainment.geofieldLabel": "Champ géospatial", - "xpack.stackAlerts.geoContainment.indexLabel": "index", - "xpack.stackAlerts.geoContainment.indexPatternSelectLabel": "Vue de données", - "xpack.stackAlerts.geoContainment.indexPatternSelectPlaceholder": "Sélectionner la vue de données", - "xpack.stackAlerts.geoContainment.noIndexPattern.doThisLinkTextDescription": "Créez une vue de données.", - "xpack.stackAlerts.geoContainment.noIndexPattern.doThisPrefixDescription": "Vous devrez ", - "xpack.stackAlerts.geoContainment.noIndexPattern.getStartedLinkText": "Commencez avec des échantillons d'ensembles de données.", - "xpack.stackAlerts.geoContainment.noIndexPattern.hintDescription": "Vous n'avez aucune donnée ? ", - "xpack.stackAlerts.geoContainment.noIndexPattern.messageTitle": "Aucune vue de données n'a été trouvée", "xpack.stackAlerts.geoContainment.notGeoContained": "Plus contenu", - "xpack.stackAlerts.geoContainment.selectBoundaryIndex": "Sélectionner une limite", - "xpack.stackAlerts.geoContainment.selectEntity": "Sélectionner une entité", "xpack.stackAlerts.geoContainment.selectGeoLabel": "Sélectionner un champ géographique", - "xpack.stackAlerts.geoContainment.selectLabel": "Sélectionner un champ géographique", "xpack.stackAlerts.geoContainment.selectTimeLabel": "Sélectionner un champ temporel", "xpack.stackAlerts.geoContainment.timeFieldLabel": "Champ temporel", "xpack.stackAlerts.geoContainment.topHitsSplitFieldSelectPlaceholder": "Sélectionner un champ d'entité", - "xpack.stackAlerts.geoContainment.ui.expressionPopover.closePopoverLabel": "Fermer", "xpack.stackAlerts.indexThreshold.actionGroupThresholdMetTitle": "Seuil atteint", "xpack.stackAlerts.indexThreshold.actionVariableContextConditionsLabel": "Chaîne décrivant le comparateur de seuil et le seuil", "xpack.stackAlerts.indexThreshold.actionVariableContextDateLabel": "Date à laquelle l'alerte a dépassé le seuil.", diff --git a/x-pack/plugins/translations/translations/ja-JP.json b/x-pack/plugins/translations/translations/ja-JP.json index 6849a96b4bd4a..3936b78eb1a01 100644 --- a/x-pack/plugins/translations/translations/ja-JP.json +++ b/x-pack/plugins/translations/translations/ja-JP.json @@ -35655,7 +35655,6 @@ "xpack.stackAlerts.geoContainment.boundariesFetchError": "追跡包含境界を取得できません。エラー:{error}", "xpack.stackAlerts.geoContainment.entityContainmentFetchError": "エンティティコンテインメントを取得できません。エラー:{error}", "xpack.stackAlerts.geoContainment.noBoundariesError": "追跡包含境界が見つかりません。インデックス\"{index}\"にドキュメントがあることを確認します。", - "xpack.stackAlerts.geoContainment.noGeoFieldInIndexPattern.message": "データビューには許可された地理空間フィールドが含まれていません。{geoFields}型のいずれかが必要です。", "xpack.stackAlerts.indexThreshold.alertTypeContextSubjectTitle": "アラート{name}グループ{group}がしきい値を満たしました", "xpack.stackAlerts.indexThreshold.alertTypeRecoveryContextSubjectTitle": "アラート{name}グループ{group}が回復されました", "xpack.stackAlerts.indexThreshold.invalidComparatorErrorMessage": "無効なthresholdComparatorが指定されました:{comparator}", @@ -35746,12 +35745,8 @@ "xpack.stackAlerts.geoContainment.actionVariableContextFromEntityDocumentIdLabel": "含まれるエンティティドキュメントの ID", "xpack.stackAlerts.geoContainment.actionVariableContextFromEntityLocationLabel": "エンティティの場所", "xpack.stackAlerts.geoContainment.alertTypeTitle": "追跡包含", - "xpack.stackAlerts.geoContainment.boundaryNameSelect": "境界名を選択", "xpack.stackAlerts.geoContainment.boundaryNameSelectLabel": "人間が読み取れる境界名(任意)", "xpack.stackAlerts.geoContainment.descriptionText": "エンティティが地理的境界に含まれるときにアラートを発行します。", - "xpack.stackAlerts.geoContainment.entityByLabel": "グループ基準", - "xpack.stackAlerts.geoContainment.entityIndexLabel": "インデックス", - "xpack.stackAlerts.geoContainment.entityIndexSelect": "データビューと地理ポイントフィールドを選択", "xpack.stackAlerts.geoContainment.error.requiredBoundaryGeoFieldText": "境界地理フィールドは必須です。", "xpack.stackAlerts.geoContainment.error.requiredBoundaryIndexTitleText": "境界データビュータイトルが必要です。", "xpack.stackAlerts.geoContainment.error.requiredBoundaryTypeText": "境界タイプは必須です。", @@ -35759,25 +35754,12 @@ "xpack.stackAlerts.geoContainment.error.requiredEntityText": "エンティティは必須です。", "xpack.stackAlerts.geoContainment.error.requiredGeoFieldText": "地理フィールドは必須です。", "xpack.stackAlerts.geoContainment.error.requiredIndexTitleText": "データビューが必要です。", - "xpack.stackAlerts.geoContainment.fixErrorInExpressionBelowValidationMessage": "下の表現のエラーを修正してください。", "xpack.stackAlerts.geoContainment.geofieldLabel": "地理空間フィールド", - "xpack.stackAlerts.geoContainment.indexLabel": "インデックス", - "xpack.stackAlerts.geoContainment.indexPatternSelectLabel": "データビュー", - "xpack.stackAlerts.geoContainment.indexPatternSelectPlaceholder": "データビューを選択", - "xpack.stackAlerts.geoContainment.noIndexPattern.doThisLinkTextDescription": "データビューを作成します。", - "xpack.stackAlerts.geoContainment.noIndexPattern.doThisPrefixDescription": "次のことが必要です ", - "xpack.stackAlerts.geoContainment.noIndexPattern.getStartedLinkText": "サンプルデータセットで始めましょう。", - "xpack.stackAlerts.geoContainment.noIndexPattern.hintDescription": "データがない場合", - "xpack.stackAlerts.geoContainment.noIndexPattern.messageTitle": "データビューが見つかりませんでした", "xpack.stackAlerts.geoContainment.notGeoContained": "含まれていません", - "xpack.stackAlerts.geoContainment.selectBoundaryIndex": "境界を選択", - "xpack.stackAlerts.geoContainment.selectEntity": "エンティティを選択", "xpack.stackAlerts.geoContainment.selectGeoLabel": "ジオフィールドを選択", - "xpack.stackAlerts.geoContainment.selectLabel": "ジオフィールドを選択", "xpack.stackAlerts.geoContainment.selectTimeLabel": "時刻フィールドを選択", "xpack.stackAlerts.geoContainment.timeFieldLabel": "時間フィールド", "xpack.stackAlerts.geoContainment.topHitsSplitFieldSelectPlaceholder": "エンティティフィールドを選択", - "xpack.stackAlerts.geoContainment.ui.expressionPopover.closePopoverLabel": "閉じる", "xpack.stackAlerts.indexThreshold.actionGroupThresholdMetTitle": "しきい値一致", "xpack.stackAlerts.indexThreshold.actionVariableContextConditionsLabel": "しきい値比較基準としきい値を説明する文字列", "xpack.stackAlerts.indexThreshold.actionVariableContextDateLabel": "アラートがしきい値を超えた日付。", diff --git a/x-pack/plugins/translations/translations/zh-CN.json b/x-pack/plugins/translations/translations/zh-CN.json index 9e1a41ddaea15..a75699cf01fca 100644 --- a/x-pack/plugins/translations/translations/zh-CN.json +++ b/x-pack/plugins/translations/translations/zh-CN.json @@ -35649,7 +35649,6 @@ "xpack.stackAlerts.geoContainment.boundariesFetchError": "无法提取跟踪限制边界,错误:{error}", "xpack.stackAlerts.geoContainment.entityContainmentFetchError": "无法提取实体限制,错误:{error}", "xpack.stackAlerts.geoContainment.noBoundariesError": "找不到跟踪限制边界。确保索引“{index}”包含文档。", - "xpack.stackAlerts.geoContainment.noGeoFieldInIndexPattern.message": "数据视图不包含任何允许的地理空间字段。必须具有一个类型 {geoFields}。", "xpack.stackAlerts.indexThreshold.alertTypeContextSubjectTitle": "告警 {name} 组 {group} 达到阈值", "xpack.stackAlerts.indexThreshold.alertTypeRecoveryContextSubjectTitle": "告警 {name} 组 {group} 已恢复", "xpack.stackAlerts.indexThreshold.invalidComparatorErrorMessage": "指定的 thresholdComparator 无效:{comparator}", @@ -35740,12 +35739,8 @@ "xpack.stackAlerts.geoContainment.actionVariableContextFromEntityDocumentIdLabel": "所包含实体文档的 ID", "xpack.stackAlerts.geoContainment.actionVariableContextFromEntityLocationLabel": "实体的位置", "xpack.stackAlerts.geoContainment.alertTypeTitle": "跟踪限制", - "xpack.stackAlerts.geoContainment.boundaryNameSelect": "选择边界名称", "xpack.stackAlerts.geoContainment.boundaryNameSelectLabel": "可人工读取的边界名称(可选)", "xpack.stackAlerts.geoContainment.descriptionText": "实体包含在地理边界内时告警。", - "xpack.stackAlerts.geoContainment.entityByLabel": "依据", - "xpack.stackAlerts.geoContainment.entityIndexLabel": "索引", - "xpack.stackAlerts.geoContainment.entityIndexSelect": "选择数据视图和地理点字段", "xpack.stackAlerts.geoContainment.error.requiredBoundaryGeoFieldText": "边界地理字段必填。", "xpack.stackAlerts.geoContainment.error.requiredBoundaryIndexTitleText": "边界数据视图标题必填。", "xpack.stackAlerts.geoContainment.error.requiredBoundaryTypeText": "“边界类型”必填。", @@ -35753,25 +35748,12 @@ "xpack.stackAlerts.geoContainment.error.requiredEntityText": "“实体”必填。", "xpack.stackAlerts.geoContainment.error.requiredGeoFieldText": "“地理”字段必填。", "xpack.stackAlerts.geoContainment.error.requiredIndexTitleText": "需要数据视图。", - "xpack.stackAlerts.geoContainment.fixErrorInExpressionBelowValidationMessage": "表达式包含错误。", "xpack.stackAlerts.geoContainment.geofieldLabel": "地理空间字段", - "xpack.stackAlerts.geoContainment.indexLabel": "索引", - "xpack.stackAlerts.geoContainment.indexPatternSelectLabel": "数据视图", - "xpack.stackAlerts.geoContainment.indexPatternSelectPlaceholder": "选择数据视图", - "xpack.stackAlerts.geoContainment.noIndexPattern.doThisLinkTextDescription": "创建数据视图。", - "xpack.stackAlerts.geoContainment.noIndexPattern.doThisPrefixDescription": "您将需要 ", - "xpack.stackAlerts.geoContainment.noIndexPattern.getStartedLinkText": "开始使用一些样例数据集。", - "xpack.stackAlerts.geoContainment.noIndexPattern.hintDescription": "没有任何数据?", - "xpack.stackAlerts.geoContainment.noIndexPattern.messageTitle": "找不到任何数据视图", "xpack.stackAlerts.geoContainment.notGeoContained": "不再包含", - "xpack.stackAlerts.geoContainment.selectBoundaryIndex": "选择边界", - "xpack.stackAlerts.geoContainment.selectEntity": "选择实体", "xpack.stackAlerts.geoContainment.selectGeoLabel": "选择地理字段", - "xpack.stackAlerts.geoContainment.selectLabel": "选择地理字段", "xpack.stackAlerts.geoContainment.selectTimeLabel": "选择时间字段", "xpack.stackAlerts.geoContainment.timeFieldLabel": "时间字段", "xpack.stackAlerts.geoContainment.topHitsSplitFieldSelectPlaceholder": "选择实体字段", - "xpack.stackAlerts.geoContainment.ui.expressionPopover.closePopoverLabel": "关闭", "xpack.stackAlerts.indexThreshold.actionGroupThresholdMetTitle": "已达到阈值", "xpack.stackAlerts.indexThreshold.actionVariableContextConditionsLabel": "描述阈值比较运算符和阈值的字符串", "xpack.stackAlerts.indexThreshold.actionVariableContextDateLabel": "告警超过阈值的日期。", From 2ec121850c433a526bf32d68e91cdcb0aa301417 Mon Sep 17 00:00:00 2001 From: Nathan Reese Date: Wed, 6 Sep 2023 12:20:11 -0600 Subject: [PATCH 60/97] [maps][file upload] remove number_of_shards index setting (#165390) closes https://github.com/elastic/kibana/issues/165366 closes https://github.com/elastic/kibana/issues/165367 close https://github.com/elastic/kibana/issues/165697 replaces https://github.com/elastic/kibana/pull/165337 Serverless elasticsearch does not support index setting `number_of_shards` PR resolves issue be removing `number_of_shards`. When `number_of_shards` was introduced way back when, the default value was 5. Now the default value is one. Therefore there is no point providing the setting since its the same as the default. Just removing so code works across both serverless and traditional deployments PR also cleans up some types that are duplicative of elasticsearch types --------- Co-authored-by: kibanamachine <42973632+kibanamachine@users.noreply.github.com> Co-authored-by: Tiago Costa --- .../components/combined_fields/utils.test.ts | 18 +++++----- .../components/combined_fields/utils.ts | 19 +++++------ .../components/import_view/import_view.js | 2 +- x-pack/plugins/file_upload/common/index.ts | 1 - x-pack/plugins/file_upload/common/types.ts | 16 --------- .../public/components/geo_upload_wizard.tsx | 6 +--- .../file_upload/public/importer/importer.ts | 21 +++++------- .../file_upload/public/importer/types.ts | 20 +++++------ .../plugins/file_upload/server/import_data.ts | 34 ++++++++++--------- x-pack/plugins/file_upload/server/routes.ts | 10 ++++-- x-pack/plugins/maps/common/types.ts | 13 ------- .../create_new_index_pattern.ts | 5 +-- .../server/data_indexing/create_doc_source.ts | 14 ++++---- 13 files changed, 73 insertions(+), 106 deletions(-) diff --git a/x-pack/plugins/data_visualizer/public/application/common/components/combined_fields/utils.test.ts b/x-pack/plugins/data_visualizer/public/application/common/components/combined_fields/utils.test.ts index 4bd84554eef60..30cda39cef9d2 100644 --- a/x-pack/plugins/data_visualizer/public/application/common/components/combined_fields/utils.test.ts +++ b/x-pack/plugins/data_visualizer/public/application/common/components/combined_fields/utils.test.ts @@ -24,10 +24,10 @@ test('addCombinedFieldsToMappings', () => { }, properties: { lat: { - type: 'number', + type: 'float' as 'float', }, lon: { - type: 'number', + type: 'float' as 'float', }, }, }; @@ -37,10 +37,10 @@ test('addCombinedFieldsToMappings', () => { }, properties: { lat: { - type: 'number', + type: 'float', }, lon: { - type: 'number', + type: 'float', }, location: { type: 'geo_point', @@ -56,13 +56,13 @@ test('removeCombinedFieldsFromMappings', () => { }, properties: { lat: { - type: 'number', + type: 'float' as 'float', }, lon: { - type: 'number', + type: 'float' as 'float', }, location: { - type: 'geo_point', + type: 'geo_point' as 'geo_point', }, }, }; @@ -72,10 +72,10 @@ test('removeCombinedFieldsFromMappings', () => { }, properties: { lat: { - type: 'number', + type: 'float', }, lon: { - type: 'number', + type: 'float', }, }, }); diff --git a/x-pack/plugins/data_visualizer/public/application/common/components/combined_fields/utils.ts b/x-pack/plugins/data_visualizer/public/application/common/components/combined_fields/utils.ts index cd3bf01224e43..3910be982b2d0 100644 --- a/x-pack/plugins/data_visualizer/public/application/common/components/combined_fields/utils.ts +++ b/x-pack/plugins/data_visualizer/public/application/common/components/combined_fields/utils.ts @@ -8,11 +8,8 @@ import { i18n } from '@kbn/i18n'; import { cloneDeep } from 'lodash'; import { v4 as uuidv4 } from 'uuid'; -import type { - FindFileStructureResponse, - IngestPipeline, - Mappings, -} from '@kbn/file-upload-plugin/common'; +import type { MappingTypeMapping } from '@elastic/elasticsearch/lib/api/typesWithBodyKey'; +import type { FindFileStructureResponse, IngestPipeline } from '@kbn/file-upload-plugin/common'; import { CombinedField } from './types'; const COMMON_LAT_NAMES = ['latitude', 'lat']; @@ -28,23 +25,23 @@ export function getDefaultCombinedFields(results: FindFileStructureResponse) { } export function addCombinedFieldsToMappings( - mappings: Mappings, + mappings: MappingTypeMapping, combinedFields: CombinedField[] -): Mappings { - const updatedMappings = { ...mappings }; +): MappingTypeMapping { + const updatedMappings = { properties: {}, ...mappings }; combinedFields.forEach((combinedField) => { updatedMappings.properties[combinedField.combinedFieldName] = { - type: combinedField.mappingType, + type: combinedField.mappingType as any, }; }); return updatedMappings; } export function removeCombinedFieldsFromMappings( - mappings: Mappings, + mappings: MappingTypeMapping, combinedFields: CombinedField[] ) { - const updatedMappings = { ...mappings }; + const updatedMappings = { properties: {}, ...mappings }; combinedFields.forEach((combinedField) => { delete updatedMappings.properties[combinedField.combinedFieldName]; }); diff --git a/x-pack/plugins/data_visualizer/public/application/file_data_visualizer/components/import_view/import_view.js b/x-pack/plugins/data_visualizer/public/application/file_data_visualizer/components/import_view/import_view.js index db6929c7d4a66..0da5486e8d19d 100644 --- a/x-pack/plugins/data_visualizer/public/application/file_data_visualizer/components/import_view/import_view.js +++ b/x-pack/plugins/data_visualizer/public/application/file_data_visualizer/components/import_view/import_view.js @@ -37,7 +37,7 @@ import { import { MODE as DATAVISUALIZER_MODE } from '../file_data_visualizer_view/constants'; const DEFAULT_TIME_FIELD = '@timestamp'; -const DEFAULT_INDEX_SETTINGS = { number_of_shards: 1 }; +const DEFAULT_INDEX_SETTINGS = {}; const CONFIG_MODE = { SIMPLE: 0, ADVANCED: 1 }; const DEFAULT_STATE = { diff --git a/x-pack/plugins/file_upload/common/index.ts b/x-pack/plugins/file_upload/common/index.ts index 5d312835c3e06..eb5fcdc6b1c00 100644 --- a/x-pack/plugins/file_upload/common/index.ts +++ b/x-pack/plugins/file_upload/common/index.ts @@ -14,5 +14,4 @@ export type { FindFileStructureResponse, InputOverrides, IngestPipeline, - Mappings, } from './types'; diff --git a/x-pack/plugins/file_upload/common/types.ts b/x-pack/plugins/file_upload/common/types.ts index 46c3153e702ce..e8906bbfe469c 100644 --- a/x-pack/plugins/file_upload/common/types.ts +++ b/x-pack/plugins/file_upload/common/types.ts @@ -124,22 +124,6 @@ export interface ImportDocMessage { export type ImportDoc = ImportDocMessage | string | object; -export interface Settings { - pipeline?: string; - index: string; - body: any[]; - [key: string]: any; -} - -export interface Mappings { - _meta?: { - created_by: string; - }; - properties: { - [key: string]: any; - }; -} - export interface IngestPipelineWrapper { id: string; pipeline: IngestPipeline; diff --git a/x-pack/plugins/file_upload/public/components/geo_upload_wizard.tsx b/x-pack/plugins/file_upload/public/components/geo_upload_wizard.tsx index b3d1711b1d2a8..643642958e2b5 100644 --- a/x-pack/plugins/file_upload/public/components/geo_upload_wizard.tsx +++ b/x-pack/plugins/file_upload/public/components/geo_upload_wizard.tsx @@ -15,7 +15,6 @@ import { ImportCompleteView } from './import_complete_view'; import type { FileUploadComponentProps, FileUploadGeoResults } from '../lazy_load_bundle'; import { ImportResults } from '../importer'; import { GeoFileImporter } from '../importer/geo'; -import type { Settings } from '../../common/types'; import { hasImportPermission } from '../api'; import { getPartialImportMessage } from './utils'; @@ -103,9 +102,6 @@ export class GeoUploadWizard extends Component // // create index // - const settings = { - number_of_shards: 1, - } as unknown as Settings; const mappings = { properties: { geometry: { @@ -127,7 +123,7 @@ export class GeoUploadWizard extends Component this._geoFileImporter.setGeoFieldType(this.state.geoFieldType); const initializeImportResp = await this._geoFileImporter.initializeImport( this.state.indexName, - settings, + {}, mappings, ingestPipeline ); diff --git a/x-pack/plugins/file_upload/public/importer/importer.ts b/x-pack/plugins/file_upload/public/importer/importer.ts index 630c35aa794c7..14629e041082d 100644 --- a/x-pack/plugins/file_upload/public/importer/importer.ts +++ b/x-pack/plugins/file_upload/public/importer/importer.ts @@ -7,18 +7,15 @@ import { chunk, intersection } from 'lodash'; import moment from 'moment'; +import type { + IndicesIndexSettings, + MappingTypeMapping, +} from '@elastic/elasticsearch/lib/api/typesWithBodyKey'; import { i18n } from '@kbn/i18n'; import { isPopulatedObject } from '@kbn/ml-is-populated-object'; import { getHttp } from '../kibana_services'; import { MB } from '../../common/constants'; -import type { - ImportDoc, - ImportFailure, - ImportResponse, - Mappings, - Settings, - IngestPipeline, -} from '../../common/types'; +import type { ImportDoc, ImportFailure, ImportResponse, IngestPipeline } from '../../common/types'; import { CreateDocsResponse, IImporter, ImportResults } from './types'; const CHUNK_SIZE = 5000; @@ -63,8 +60,8 @@ export abstract class Importer implements IImporter { public async initializeImport( index: string, - settings: Settings, - mappings: Mappings, + settings: IndicesIndexSettings, + mappings: MappingTypeMapping, pipeline: IngestPipeline ) { updatePipelineTimezone(pipeline); @@ -279,8 +276,8 @@ export function callImportRoute({ id: string | undefined; index: string; data: ImportDoc[]; - settings: Settings | unknown; - mappings: Mappings | unknown; + settings: IndicesIndexSettings; + mappings: MappingTypeMapping; ingestPipeline: { id?: string; pipeline?: IngestPipeline; diff --git a/x-pack/plugins/file_upload/public/importer/types.ts b/x-pack/plugins/file_upload/public/importer/types.ts index 0ef8ace26f546..2a5efaa0d1dc9 100644 --- a/x-pack/plugins/file_upload/public/importer/types.ts +++ b/x-pack/plugins/file_upload/public/importer/types.ts @@ -6,17 +6,15 @@ */ import type { - ImportFailure, - IngestPipeline, - ImportDoc, - ImportResponse, - Mappings, - Settings, -} from '../../common/types'; + IndicesIndexSettings, + MappingTypeMapping, +} from '@elastic/elasticsearch/lib/api/typesWithBodyKey'; + +import type { ImportFailure, IngestPipeline, ImportDoc, ImportResponse } from '../../common/types'; export interface ImportConfig { - settings: Settings; - mappings: Mappings; + settings: IndicesIndexSettings; + mappings: MappingTypeMapping; pipeline: IngestPipeline; } @@ -44,8 +42,8 @@ export interface IImporter { read(data: ArrayBuffer): { success: boolean }; initializeImport( index: string, - settings: Settings, - mappings: Mappings, + settings: IndicesIndexSettings, + mappings: MappingTypeMapping, pipeline: IngestPipeline ): Promise; import( diff --git a/x-pack/plugins/file_upload/server/import_data.ts b/x-pack/plugins/file_upload/server/import_data.ts index f8555cbd7f1d3..198ad2afd5f8d 100644 --- a/x-pack/plugins/file_upload/server/import_data.ts +++ b/x-pack/plugins/file_upload/server/import_data.ts @@ -6,22 +6,21 @@ */ import { IScopedClusterClient } from '@kbn/core/server'; +import type { + BulkRequest, + IndicesCreateRequest, + IndicesIndexSettings, + MappingTypeMapping, +} from '@elastic/elasticsearch/lib/api/typesWithBodyKey'; import { INDEX_META_DATA_CREATED_BY } from '../common/constants'; -import { - ImportResponse, - ImportFailure, - InputData, - Settings, - Mappings, - IngestPipelineWrapper, -} from '../common/types'; +import { ImportResponse, ImportFailure, InputData, IngestPipelineWrapper } from '../common/types'; export function importDataProvider({ asCurrentUser }: IScopedClusterClient) { async function importData( id: string | undefined, index: string, - settings: Settings, - mappings: Mappings, + settings: IndicesIndexSettings, + mappings: MappingTypeMapping, ingestPipeline: IngestPipelineWrapper, data: InputData ): Promise { @@ -89,8 +88,12 @@ export function importDataProvider({ asCurrentUser }: IScopedClusterClient) { } } - async function createIndex(index: string, settings: Settings, mappings: Mappings) { - const body: { mappings: Mappings; settings?: Settings } = { + async function createIndex( + index: string, + settings: IndicesIndexSettings, + mappings: MappingTypeMapping + ) { + const body: IndicesCreateRequest['body'] = { mappings: { _meta: { created_by: INDEX_META_DATA_CREATED_BY, @@ -103,7 +106,6 @@ export function importDataProvider({ asCurrentUser }: IScopedClusterClient) { body.settings = settings; } - // @ts-expect-error settings.index is not compatible await asCurrentUser.indices.create({ index, body }, { maxRetries: 0 }); } @@ -115,12 +117,12 @@ export function importDataProvider({ asCurrentUser }: IScopedClusterClient) { body.push(data[i]); } - const settings: Settings = { index, body }; + const bulkRequest: BulkRequest = { index, body }; if (pipelineId !== undefined) { - settings.pipeline = pipelineId; + bulkRequest.pipeline = pipelineId; } - const resp = await asCurrentUser.bulk(settings, { maxRetries: 0 }); + const resp = await asCurrentUser.bulk(bulkRequest, { maxRetries: 0 }); if (resp.errors) { throw resp; } else { diff --git a/x-pack/plugins/file_upload/server/routes.ts b/x-pack/plugins/file_upload/server/routes.ts index 0fbcbd413c238..707314b5bd4a2 100644 --- a/x-pack/plugins/file_upload/server/routes.ts +++ b/x-pack/plugins/file_upload/server/routes.ts @@ -8,8 +8,12 @@ import { schema } from '@kbn/config-schema'; import { IScopedClusterClient } from '@kbn/core/server'; import { CoreSetup, Logger } from '@kbn/core/server'; +import type { + IndicesIndexSettings, + MappingTypeMapping, +} from '@elastic/elasticsearch/lib/api/typesWithBodyKey'; import { MAX_FILE_SIZE_BYTES } from '../common/constants'; -import type { IngestPipelineWrapper, InputData, Mappings, Settings } from '../common/types'; +import type { IngestPipelineWrapper, InputData } from '../common/types'; import { wrapError } from './error_wrapper'; import { importDataProvider } from './import_data'; import { getTimeFieldRange } from './get_time_field_range'; @@ -29,8 +33,8 @@ function importData( client: IScopedClusterClient, id: string | undefined, index: string, - settings: Settings, - mappings: Mappings, + settings: IndicesIndexSettings, + mappings: MappingTypeMapping, ingestPipeline: IngestPipelineWrapper, data: InputData ) { diff --git a/x-pack/plugins/maps/common/types.ts b/x-pack/plugins/maps/common/types.ts index 5b202fd7811e5..76af2ac979404 100644 --- a/x-pack/plugins/maps/common/types.ts +++ b/x-pack/plugins/maps/common/types.ts @@ -17,19 +17,6 @@ export interface MatchingIndexesResp { error?: Error; } -export interface IndexSourceMappings { - _meta?: { - created_by: string; - }; - properties: { - [key: string]: any; - }; -} - -export interface BodySettings { - [key: string]: any; -} - export interface WriteSettings { index: string; body: object; diff --git a/x-pack/plugins/maps/public/classes/layers/wizards/new_vector_layer_wizard/create_new_index_pattern.ts b/x-pack/plugins/maps/public/classes/layers/wizards/new_vector_layer_wizard/create_new_index_pattern.ts index 90e0bceec7ef6..31762e7ef0375 100644 --- a/x-pack/plugins/maps/public/classes/layers/wizards/new_vector_layer_wizard/create_new_index_pattern.ts +++ b/x-pack/plugins/maps/public/classes/layers/wizards/new_vector_layer_wizard/create_new_index_pattern.ts @@ -5,8 +5,9 @@ * 2.0. */ +import type { MappingTypeMapping } from '@elastic/elasticsearch/lib/api/typesWithBodyKey'; import { getHttp } from '../../../../kibana_services'; -import { CreateDocSourceResp, IndexSourceMappings } from '../../../../../common/types'; +import { CreateDocSourceResp } from '../../../../../common/types'; import { INDEX_SOURCE_API_PATH } from '../../../../../common/constants'; export const createNewIndexAndPattern = async ({ @@ -14,7 +15,7 @@ export const createNewIndexAndPattern = async ({ defaultMappings = {}, }: { indexName: string; - defaultMappings: IndexSourceMappings | {}; + defaultMappings: MappingTypeMapping | {}; }) => { return await getHttp().fetch({ path: `/${INDEX_SOURCE_API_PATH}`, diff --git a/x-pack/plugins/maps/server/data_indexing/create_doc_source.ts b/x-pack/plugins/maps/server/data_indexing/create_doc_source.ts index 435e56a8b60a9..12dc618a96578 100644 --- a/x-pack/plugins/maps/server/data_indexing/create_doc_source.ts +++ b/x-pack/plugins/maps/server/data_indexing/create_doc_source.ts @@ -5,12 +5,15 @@ * 2.0. */ +import type { + IndicesCreateRequest, + MappingTypeMapping, +} from '@elastic/elasticsearch/lib/api/typesWithBodyKey'; import { ElasticsearchClient, IScopedClusterClient } from '@kbn/core/server'; import { DataViewsCommonService } from '@kbn/data-plugin/server'; -import { CreateDocSourceResp, IndexSourceMappings, BodySettings } from '../../common/types'; +import { CreateDocSourceResp } from '../../common/types'; import { MAPS_NEW_VECTOR_LAYER_META_CREATED_BY } from '../../common/constants'; -const DEFAULT_SETTINGS = { number_of_shards: 1 }; const DEFAULT_META = { _meta: { created_by: MAPS_NEW_VECTOR_LAYER_META_CREATED_BY, @@ -19,7 +22,7 @@ const DEFAULT_META = { export async function createDocSource( index: string, - mappings: IndexSourceMappings, + mappings: MappingTypeMapping, { asCurrentUser }: IScopedClusterClient, indexPatternsService: DataViewsCommonService ): Promise { @@ -41,15 +44,14 @@ export async function createDocSource( async function createIndex( indexName: string, - mappings: IndexSourceMappings, + mappings: MappingTypeMapping, asCurrentUser: ElasticsearchClient ) { - const body: { mappings: IndexSourceMappings; settings: BodySettings } = { + const body: IndicesCreateRequest['body'] = { mappings: { ...DEFAULT_META, ...mappings, }, - settings: DEFAULT_SETTINGS, }; await asCurrentUser.indices.create({ index: indexName, body }); From d3031e7a8c25b60156398211cf0ba15171edc3c0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Yulia=20=C4=8Cech?= <6585477+yuliacech@users.noreply.github.com> Date: Wed, 6 Sep 2023 20:43:19 +0200 Subject: [PATCH 61/97] [Index details page] Implement "settings" tab (#165456) ## Summary Fixes https://github.com/elastic/kibana/issues/164573 This PR implements the Settings tab on the new index details page. The tab load the settings from the API and displays them in a code block. When "edit mode" is enabled, a subset of settings that can be changed are displayed in a code editor. When the "save" button is clicked, only updated settings are sent to the API. I also added a button to reset the changes in the code editor. ### How to test 1. Add `xpack.index_management.dev.enableIndexDetailsPage: true` to the file `./config/kibana.dev.yml` 2. Start ES and Kibana `yarn es snapshot` and `yarn start` 3. Add at least one sample data set 4. Navigate to index management and click any index name in the indices list 5. Click the "Settings" tab 6. Enable "edit mode" 7. Try saving the updated settings 8. Try saving without changing any settings (for example by deleting a line from the editor, no settings are actually changed, but the editor content is changed which enables the "save" button) 9. Try saving an incorrect setting value, for example `index.priority: test`. ### Screenshots #### Loading indicator https://github.com/elastic/kibana/assets/6585477/4743e470-0f4f-48e7-a8ef-37a562431e1e #### Loading error Screenshot 2023-09-01 at 18 37 14 #### Read only mode Screenshot 2023-09-01 at 18 31 27 #### Edit mode Screenshot 2023-09-01 at 18 31 40 #### Loading indicator while updating the settings https://github.com/elastic/kibana/assets/6585477/1aa976e8-24ed-4a7a-bfad-93daf25627f1 #### No settings changed warning https://github.com/elastic/kibana/assets/6585477/f9731e58-8c42-4395-9f99-34fdb5f4fff4 #### Error updating the settings Screenshot 2023-09-01 at 18 32 05 ### 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) - [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 --- .../helpers/http_requests.ts | 7 +- .../index_details_page.helpers.ts | 59 ++++ ...ge.test.ts => index_details_page.test.tsx} | 142 ++++++++- .../index_details_page/mocks.ts | 31 ++ .../index_management/common/types/indices.ts | 5 + ...st.js.snap => flatten_object.test.ts.snap} | 0 .../{edit_settings.js => edit_settings.ts} | 0 ..._object.test.js => flatten_object.test.ts} | 0 .../{flatten_object.js => flatten_object.ts} | 8 +- .../index_list/details_page/details_page.tsx | 10 +- .../details_page/details_page_settings.tsx | 89 ++++++ .../details_page_settings_content.tsx | 280 ++++++++++++++++++ .../details_page/details_page_stats.tsx | 4 +- .../public/application/services/api.ts | 15 +- .../public/application/services/index.ts | 1 + .../application/services/use_request.ts | 4 +- 16 files changed, 634 insertions(+), 21 deletions(-) rename x-pack/plugins/index_management/__jest__/client_integration/index_details_page/{index_details_page.test.ts => index_details_page.test.tsx} (73%) rename x-pack/plugins/index_management/public/application/lib/__snapshots__/{flatten_object.test.js.snap => flatten_object.test.ts.snap} (100%) rename x-pack/plugins/index_management/public/application/lib/{edit_settings.js => edit_settings.ts} (100%) rename x-pack/plugins/index_management/public/application/lib/{flatten_object.test.js => flatten_object.test.ts} (100%) rename x-pack/plugins/index_management/public/application/lib/{flatten_object.js => flatten_object.ts} (72%) create mode 100644 x-pack/plugins/index_management/public/application/sections/home/index_list/details_page/details_page_settings.tsx create mode 100644 x-pack/plugins/index_management/public/application/sections/home/index_list/details_page/details_page_settings_content.tsx diff --git a/x-pack/plugins/index_management/__jest__/client_integration/helpers/http_requests.ts b/x-pack/plugins/index_management/__jest__/client_integration/helpers/http_requests.ts index 9811255af25b0..8b6e4b444c135 100644 --- a/x-pack/plugins/index_management/__jest__/client_integration/helpers/http_requests.ts +++ b/x-pack/plugins/index_management/__jest__/client_integration/helpers/http_requests.ts @@ -94,8 +94,11 @@ const registerHttpRequestMockHelpers = ( const setCreateTemplateResponse = (response?: HttpResponse, error?: ResponseError) => mockResponse('POST', `${API_BASE_PATH}/index_templates`, response, error); - const setLoadIndexSettingsResponse = (response?: HttpResponse, error?: ResponseError) => - mockResponse('GET', `${API_BASE_PATH}/settings/:name`, response, error); + const setLoadIndexSettingsResponse = ( + indexName: string, + response?: HttpResponse, + error?: ResponseError + ) => mockResponse('GET', `${API_BASE_PATH}/settings/${indexName}`, response, error); const setLoadIndexMappingResponse = ( indexName: string, diff --git a/x-pack/plugins/index_management/__jest__/client_integration/index_details_page/index_details_page.helpers.ts b/x-pack/plugins/index_management/__jest__/client_integration/index_details_page/index_details_page.helpers.ts index cdf5e9f5ab841..a92df925be1a6 100644 --- a/x-pack/plugins/index_management/__jest__/client_integration/index_details_page/index_details_page.helpers.ts +++ b/x-pack/plugins/index_management/__jest__/client_integration/index_details_page/index_details_page.helpers.ts @@ -44,6 +44,17 @@ export interface IndexDetailsPageTestBed extends TestBed { isErrorDisplayed: () => boolean; clickErrorReloadButton: () => Promise; }; + settings: { + getCodeBlockContent: () => string; + getDocsLinkHref: () => string; + isErrorDisplayed: () => boolean; + clickErrorReloadButton: () => Promise; + clickEditModeSwitch: () => Promise; + getCodeEditorContent: () => string; + updateCodeEditorContent: (value: string) => Promise; + saveSettings: () => Promise; + resetChanges: () => Promise; + }; clickBackToIndicesButton: () => Promise; discoverLinkExists: () => boolean; contextMenu: { @@ -123,6 +134,53 @@ export const setup = async ( }, }; + const settings = { + getCodeBlockContent: () => { + return find('indexDetailsSettingsCodeBlock').text(); + }, + getDocsLinkHref: () => { + return find('indexDetailsSettingsDocsLink').prop('href'); + }, + isErrorDisplayed: () => { + return exists('indexDetailsSettingsError'); + }, + clickErrorReloadButton: async () => { + await act(async () => { + find('indexDetailsSettingsReloadButton').simulate('click'); + }); + component.update(); + }, + clickEditModeSwitch: async () => { + await act(async () => { + find('indexDetailsSettingsEditModeSwitch').simulate('click'); + }); + component.update(); + }, + getCodeEditorContent: () => { + return find('indexDetailsSettingsEditor').prop('data-currentvalue'); + }, + updateCodeEditorContent: async (value: string) => { + // the code editor is mocked as an input so need to set data-currentvalue attribute to change the value + find('indexDetailsSettingsEditor').getDOMNode().setAttribute('data-currentvalue', value); + await act(async () => { + find('indexDetailsSettingsEditor').simulate('change'); + }); + component.update(); + }, + saveSettings: async () => { + await act(async () => { + find('indexDetailsSettingsSave').simulate('click'); + }); + component.update(); + }, + resetChanges: async () => { + await act(async () => { + find('indexDetailsSettingsResetChanges').simulate('click'); + }); + component.update(); + }, + }; + const clickBackToIndicesButton = async () => { await act(async () => { find('indexDetailsBackToIndicesButton').simulate('click'); @@ -199,6 +257,7 @@ export const setup = async ( clickIndexDetailsTab, getActiveTabContent, mappings, + settings, clickBackToIndicesButton, discoverLinkExists, contextMenu, diff --git a/x-pack/plugins/index_management/__jest__/client_integration/index_details_page/index_details_page.test.ts b/x-pack/plugins/index_management/__jest__/client_integration/index_details_page/index_details_page.test.tsx similarity index 73% rename from x-pack/plugins/index_management/__jest__/client_integration/index_details_page/index_details_page.test.ts rename to x-pack/plugins/index_management/__jest__/client_integration/index_details_page/index_details_page.test.tsx index ddd1d44ac9440..62fe47b2529d4 100644 --- a/x-pack/plugins/index_management/__jest__/client_integration/index_details_page/index_details_page.test.ts +++ b/x-pack/plugins/index_management/__jest__/client_integration/index_details_page/index_details_page.test.tsx @@ -9,8 +9,33 @@ import { setupEnvironment } from '../helpers'; import { IndexDetailsPageTestBed, setup } from './index_details_page.helpers'; import { act } from 'react-dom/test-utils'; import { IndexDetailsSection } from '../../../public/application/sections/home/index_list/details_page'; -import { testIndexMappings, testIndexMock, testIndexName, testIndexStats } from './mocks'; +import { + testIndexEditableSettings, + testIndexMappings, + testIndexMock, + testIndexName, + testIndexSettings, + testIndexStats, +} from './mocks'; import { API_BASE_PATH, INTERNAL_API_BASE_PATH } from '../../../common'; +import React from 'react'; + +jest.mock('@kbn/kibana-react-plugin/public', () => { + const original = jest.requireActual('@kbn/kibana-react-plugin/public'); + return { + ...original, + // Mocking CodeEditor, which uses React Monaco under the hood + CodeEditor: (props: any) => ( + ) => { + props.onChange(e.currentTarget.getAttribute('data-currentvalue')); + }} + /> + ), + }; +}); describe('', () => { let testBed: IndexDetailsPageTestBed; @@ -24,6 +49,7 @@ describe('', () => { httpRequestsMockHelpers.setLoadIndexDetailsResponse(testIndexName, testIndexMock); httpRequestsMockHelpers.setLoadIndexStatsResponse(testIndexName, testIndexStats); httpRequestsMockHelpers.setLoadIndexMappingResponse(testIndexName, testIndexMappings); + httpRequestsMockHelpers.setLoadIndexSettingsResponse(testIndexName, testIndexSettings); await act(async () => { testBed = await setup(httpSetup, { @@ -171,7 +197,7 @@ describe('', () => { expect(tabContent).toEqual('Documents'); }); - describe('mappings tab', () => { + describe('Mappings tab', () => { it('loads mappings from the API', async () => { await testBed.actions.clickIndexDetailsTab(IndexDetailsSection.Mappings); expect(httpSetup.get).toHaveBeenLastCalledWith(`${API_BASE_PATH}/mapping/${testIndexName}`, { @@ -189,7 +215,7 @@ describe('', () => { expect(tabContent).toEqual(JSON.stringify(testIndexMappings, null, 2)); }); - it('sets the docs link href from the documenation service', async () => { + it('sets the docs link href from the documentation service', async () => { await testBed.actions.clickIndexDetailsTab(IndexDetailsSection.Mappings); const docsLinkHref = testBed.actions.mappings.getDocsLinkHref(); // the url from the mocked docs mock @@ -226,10 +252,112 @@ describe('', () => { }); }); - it('settings tab', async () => { - await testBed.actions.clickIndexDetailsTab(IndexDetailsSection.Settings); - const tabContent = testBed.actions.getActiveTabContent(); - expect(tabContent).toEqual('Settings'); + describe('Settings tab', () => { + it('loads settings from the API', async () => { + await testBed.actions.clickIndexDetailsTab(IndexDetailsSection.Settings); + expect(httpSetup.get).toHaveBeenLastCalledWith(`${API_BASE_PATH}/settings/${testIndexName}`, { + asSystemRequest: undefined, + body: undefined, + query: undefined, + version: undefined, + }); + }); + + it('displays the settings in the code block', async () => { + await testBed.actions.clickIndexDetailsTab(IndexDetailsSection.Settings); + + const tabContent = testBed.actions.settings.getCodeBlockContent(); + expect(tabContent).toEqual(JSON.stringify(testIndexSettings, null, 2)); + }); + + it('sets the docs link href from the documentation service', async () => { + await testBed.actions.clickIndexDetailsTab(IndexDetailsSection.Settings); + const docsLinkHref = testBed.actions.settings.getDocsLinkHref(); + // the url from the mocked docs mock + expect(docsLinkHref).toEqual( + 'https://www.elastic.co/guide/en/elasticsearch/reference/mocked-test-branch/index-modules.html#index-modules-settings' + ); + }); + + describe('error loading settings', () => { + beforeEach(async () => { + httpRequestsMockHelpers.setLoadIndexSettingsResponse(testIndexName, undefined, { + statusCode: 400, + message: `Was not able to load settings`, + }); + await act(async () => { + testBed = await setup(httpSetup); + }); + + testBed.component.update(); + await testBed.actions.clickIndexDetailsTab(IndexDetailsSection.Settings); + }); + + it('there is an error prompt', async () => { + expect(testBed.actions.settings.isErrorDisplayed()).toBe(true); + }); + + it('resends a request when reload button is clicked', async () => { + // already sent 3 requests while setting up the component + const numberOfRequests = 3; + expect(httpSetup.get).toHaveBeenCalledTimes(numberOfRequests); + await testBed.actions.settings.clickErrorReloadButton(); + expect(httpSetup.get).toHaveBeenCalledTimes(numberOfRequests + 1); + }); + }); + + describe('edit settings', () => { + beforeEach(async () => { + await testBed.actions.clickIndexDetailsTab(IndexDetailsSection.Settings); + await testBed.actions.settings.clickEditModeSwitch(); + }); + + it('displays the editable settings (flattened and filtered)', () => { + const editorContent = testBed.actions.settings.getCodeEditorContent(); + expect(editorContent).toEqual(JSON.stringify(testIndexEditableSettings, null, 2)); + }); + + it('updates the settings', async () => { + const updatedSettings = { ...testIndexEditableSettings, 'index.priority': '2' }; + await testBed.actions.settings.updateCodeEditorContent(JSON.stringify(updatedSettings)); + await testBed.actions.settings.saveSettings(); + expect(httpSetup.put).toHaveBeenLastCalledWith( + `${API_BASE_PATH}/settings/${testIndexName}`, + { + asSystemRequest: undefined, + body: JSON.stringify({ 'index.priority': '2' }), + query: undefined, + version: undefined, + } + ); + }); + + it('reloads the settings after an update', async () => { + const numberOfRequests = 2; + expect(httpSetup.get).toHaveBeenCalledTimes(numberOfRequests); + const updatedSettings = { ...testIndexEditableSettings, 'index.priority': '2' }; + await testBed.actions.settings.updateCodeEditorContent(JSON.stringify(updatedSettings)); + await testBed.actions.settings.saveSettings(); + expect(httpSetup.get).toHaveBeenCalledTimes(numberOfRequests + 1); + expect(httpSetup.get).toHaveBeenLastCalledWith( + `${API_BASE_PATH}/settings/${testIndexName}`, + { + asSystemRequest: undefined, + body: undefined, + query: undefined, + version: undefined, + } + ); + }); + + it('resets the changes in the editor', async () => { + const updatedSettings = { ...testIndexEditableSettings, 'index.priority': '2' }; + await testBed.actions.settings.updateCodeEditorContent(JSON.stringify(updatedSettings)); + await testBed.actions.settings.resetChanges(); + const editorContent = testBed.actions.settings.getCodeEditorContent(); + expect(editorContent).toEqual(JSON.stringify(testIndexEditableSettings, null, 2)); + }); + }); }); it('pipelines tab', async () => { diff --git a/x-pack/plugins/index_management/__jest__/client_integration/index_details_page/mocks.ts b/x-pack/plugins/index_management/__jest__/client_integration/index_details_page/mocks.ts index 7666c1ac0dee6..67ff8d57a1eb8 100644 --- a/x-pack/plugins/index_management/__jest__/client_integration/index_details_page/mocks.ts +++ b/x-pack/plugins/index_management/__jest__/client_integration/index_details_page/mocks.ts @@ -42,6 +42,37 @@ export const testIndexMappings = { }, }; +// Mocking partial index settings response +export const testIndexSettings = { + settings: { + index: { + routing: { + allocation: { + include: { + _tier_preference: 'data_content', + }, + }, + }, + number_of_shards: '1', + }, + }, + defaults: { + index: { + flush_after_merge: '512mb', + max_script_fields: '32', + query: { + default_field: ['*'], + }, + priority: '1', + }, + }, +}; +export const testIndexEditableSettings = { + 'index.priority': '1', + 'index.query.default_field': ['*'], + 'index.routing.allocation.include._tier_preference': 'data_content', +}; + // Mocking partial index stats response export const testIndexStats = { _shards: { diff --git a/x-pack/plugins/index_management/common/types/indices.ts b/x-pack/plugins/index_management/common/types/indices.ts index 608ee392a3f9e..ab6080f30fdb2 100644 --- a/x-pack/plugins/index_management/common/types/indices.ts +++ b/x-pack/plugins/index_management/common/types/indices.ts @@ -83,3 +83,8 @@ export interface Index { primary_size?: string; documents_deleted?: number; } + +export interface IndexSettingsResponse { + settings: IndexSettings; + defaults: IndexSettings; +} diff --git a/x-pack/plugins/index_management/public/application/lib/__snapshots__/flatten_object.test.js.snap b/x-pack/plugins/index_management/public/application/lib/__snapshots__/flatten_object.test.ts.snap similarity index 100% rename from x-pack/plugins/index_management/public/application/lib/__snapshots__/flatten_object.test.js.snap rename to x-pack/plugins/index_management/public/application/lib/__snapshots__/flatten_object.test.ts.snap diff --git a/x-pack/plugins/index_management/public/application/lib/edit_settings.js b/x-pack/plugins/index_management/public/application/lib/edit_settings.ts similarity index 100% rename from x-pack/plugins/index_management/public/application/lib/edit_settings.js rename to x-pack/plugins/index_management/public/application/lib/edit_settings.ts diff --git a/x-pack/plugins/index_management/public/application/lib/flatten_object.test.js b/x-pack/plugins/index_management/public/application/lib/flatten_object.test.ts similarity index 100% rename from x-pack/plugins/index_management/public/application/lib/flatten_object.test.js rename to x-pack/plugins/index_management/public/application/lib/flatten_object.test.ts diff --git a/x-pack/plugins/index_management/public/application/lib/flatten_object.js b/x-pack/plugins/index_management/public/application/lib/flatten_object.ts similarity index 72% rename from x-pack/plugins/index_management/public/application/lib/flatten_object.js rename to x-pack/plugins/index_management/public/application/lib/flatten_object.ts index ddc6f2851f65f..5dae932938a3a 100644 --- a/x-pack/plugins/index_management/public/application/lib/flatten_object.js +++ b/x-pack/plugins/index_management/public/application/lib/flatten_object.ts @@ -7,14 +7,14 @@ import _ from 'lodash'; -export const flattenObject = (nestedObj, flattenArrays) => { - const stack = []; // track key stack - const flatObj = {}; +export const flattenObject = (nestedObj: any) => { + const stack = [] as any[]; // track key stack + const flatObj = {} as any; const dot = '.'; (function flattenObj(obj) { _.keys(obj).forEach(function (key) { stack.push(key); - if (!flattenArrays && Array.isArray(obj[key])) flatObj[stack.join(dot)] = obj[key]; + if (Array.isArray(obj[key])) flatObj[stack.join(dot)] = obj[key]; else if (_.isObject(obj[key])) flattenObj(obj[key]); else flatObj[stack.join(dot)] = obj[key]; stack.pop(); diff --git a/x-pack/plugins/index_management/public/application/sections/home/index_list/details_page/details_page.tsx b/x-pack/plugins/index_management/public/application/sections/home/index_list/details_page/details_page.tsx index 80f79d9ab3c76..17cbeb7649449 100644 --- a/x-pack/plugins/index_management/public/application/sections/home/index_list/details_page/details_page.tsx +++ b/x-pack/plugins/index_management/public/application/sections/home/index_list/details_page/details_page.tsx @@ -21,6 +21,7 @@ import { SectionLoading } from '@kbn/es-ui-shared-plugin/public'; import { Index } from '../../../../../../common'; import { INDEX_OPEN } from '../../../../../../common/constants'; +import { Error } from '../../../../../shared_imports'; import { loadIndex } from '../../../../services'; import { useAppContext } from '../../../../app_context'; import { DiscoverLink } from '../../../../lib/discover_link'; @@ -29,6 +30,7 @@ import { DetailsPageError } from './details_page_error'; import { ManageIndexButton } from './manage_index_button'; import { DetailsPageStats } from './details_page_stats'; import { DetailsPageMappings } from './details_page_mappings'; +import { DetailsPageSettings } from './details_page_settings'; export enum IndexDetailsSection { Overview = 'overview', @@ -86,7 +88,7 @@ export const DetailsPage: React.FunctionComponent< }) => { const { config } = useAppContext(); const [isLoading, setIsLoading] = useState(false); - const [error, setError] = useState(); + const [error, setError] = useState(null); const [index, setIndex] = useState(); const fetchIndexDetails = useCallback(async () => { @@ -198,8 +200,10 @@ export const DetailsPage: React.FunctionComponent< component={DetailsPageMappings} />
Settings
} + path={`/${Section.Indices}/:indexName/${IndexDetailsSection.Settings}`} + render={(props: RouteComponentProps<{ indexName: string }>) => ( + + )} /> & { isIndexOpen: boolean } +> = ({ + match: { + params: { indexName }, + }, + isIndexOpen, +}) => { + const { isLoading, data, error, resendRequest } = useLoadIndexSettings(indexName); + + if (isLoading) { + return ( + + + + ); + } + if (error || !data) { + return ( + + + + } + body={ + <> + + + + + + + + + } + /> + ); + } + return ( + + ); +}; diff --git a/x-pack/plugins/index_management/public/application/sections/home/index_list/details_page/details_page_settings_content.tsx b/x-pack/plugins/index_management/public/application/sections/home/index_list/details_page/details_page_settings_content.tsx new file mode 100644 index 0000000000000..f418548e5c843 --- /dev/null +++ b/x-pack/plugins/index_management/public/application/sections/home/index_list/details_page/details_page_settings_content.tsx @@ -0,0 +1,280 @@ +/* + * 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 React, { useState, FunctionComponent, useCallback } from 'react'; +import { + EuiButton, + EuiCallOut, + EuiCodeBlock, + EuiFlexGroup, + EuiFlexItem, + EuiIcon, + EuiLink, + EuiPanel, + EuiSpacer, + EuiSwitch, + EuiSwitchEvent, + EuiText, +} from '@elastic/eui'; +import { css } from '@emotion/react'; +import _ from 'lodash'; +import { FormattedMessage } from '@kbn/i18n-react'; +import { i18n } from '@kbn/i18n'; +import { CodeEditor } from '@kbn/kibana-react-plugin/public'; +import { IndexSettingsResponse } from '../../../../../../common'; +import { Error } from '../../../../../shared_imports'; +import { documentationService, updateIndexSettings } from '../../../../services'; +import { notificationService } from '../../../../services/notification'; +import { flattenObject } from '../../../../lib/flatten_object'; +import { readOnlySettings, settingsToDisplay } from '../../../../lib/edit_settings'; + +const getEditableSettings = ( + data: Props['data'], + isIndexOpen: boolean +): { originalSettings: Record; settingsString: string } => { + const { defaults, settings } = data; + // settings user has actually set + const flattenedSettings = flattenObject(settings); + // settings with their defaults + const flattenedDefaults = flattenObject(defaults); + const filteredDefaults = _.pick(flattenedDefaults, settingsToDisplay); + const newSettings = { ...filteredDefaults, ...flattenedSettings }; + // store these to be used as autocomplete values later + readOnlySettings.forEach((e) => delete newSettings[e]); + // can't change codec on open index + if (isIndexOpen) { + delete newSettings['index.codec']; + } + const settingsString = JSON.stringify(newSettings, null, 2); + return { originalSettings: newSettings, settingsString }; +}; + +interface Props { + isIndexOpen: boolean; + data: IndexSettingsResponse; + indexName: string; + reloadIndexSettings: () => void; +} + +export const DetailsPageSettingsContent: FunctionComponent = ({ + isIndexOpen, + data, + indexName, + reloadIndexSettings, +}) => { + const [isEditMode, setIsEditMode] = useState(false); + const onEditModeChange = (event: EuiSwitchEvent) => { + setUpdateError(null); + setIsEditMode(event.target.checked); + }; + + const { originalSettings, settingsString } = getEditableSettings(data, isIndexOpen); + const [editableSettings, setEditableSettings] = useState(settingsString); + const [isLoading, setIsLoading] = useState(false); + const [updateError, setUpdateError] = useState(null); + + const resetChanges = useCallback(() => { + setUpdateError(null); + setEditableSettings(settingsString); + }, [settingsString]); + + const updateSettings = useCallback(async () => { + setUpdateError(null); + setIsLoading(true); + try { + const editedSettings = JSON.parse(editableSettings); + // don't set if the values have not changed + Object.keys(originalSettings).forEach((key) => { + if (_.isEqual(originalSettings[key], editedSettings[key])) { + delete editedSettings[key]; + } + }); + + if (Object.keys(editedSettings).length !== 0) { + const { error } = await updateIndexSettings(indexName, editedSettings); + if (error) { + setIsLoading(false); + setUpdateError(error); + } else { + setIsLoading(false); + setIsEditMode(false); + notificationService.showSuccessToast( + i18n.translate('xpack.idxMgmt.indexDetails.settings.updateSuccessMessage', { + defaultMessage: 'Successfully updated settings for index {indexName}', + values: { indexName }, + }) + ); + reloadIndexSettings(); + } + } else { + setIsLoading(false); + setIsEditMode(false); + notificationService.showWarningToast( + i18n.translate('xpack.idxMgmt.indexDetails.settings.noChangeWarning', { + defaultMessage: 'No settings changed', + }) + ); + } + } catch (e) { + setIsLoading(false); + setUpdateError({ + error: i18n.translate('xpack.idxMgmt.indexDetails.settings.updateError', { + defaultMessage: 'Unable to update settings', + }), + }); + } + }, [originalSettings, editableSettings, indexName, reloadIndexSettings]); + return ( + // using "rowReverse" to keep the card on the left side to be on top of the code block on smaller screens + + + + + + + + + + + + + + + + + + } + checked={isEditMode} + onChange={onEditModeChange} + /> + + + + + + + + + + + + + + + {updateError && ( + <> + + +

+ {updateError.error} + {updateError.message && : {updateError.message}} +

+
+ + )} + + + + +
+
+ + + + {isEditMode ? ( + + ) : ( + + {JSON.stringify(data, null, 2)} + + )} + + +
+ ); +}; diff --git a/x-pack/plugins/index_management/public/application/sections/home/index_list/details_page/details_page_stats.tsx b/x-pack/plugins/index_management/public/application/sections/home/index_list/details_page/details_page_stats.tsx index 3e4319a03a9da..91fbf54728bfd 100644 --- a/x-pack/plugins/index_management/public/application/sections/home/index_list/details_page/details_page_stats.tsx +++ b/x-pack/plugins/index_management/public/application/sections/home/index_list/details_page/details_page_stats.tsx @@ -25,7 +25,7 @@ import { import { css } from '@emotion/react'; import { IndicesStatsResponse } from '@elastic/elasticsearch/lib/api/types'; -import { SectionLoading } from '../../../../../shared_imports'; +import { SectionLoading, Error } from '../../../../../shared_imports'; import { loadIndexStatistics, documentationService } from '../../../../services'; interface Props { @@ -41,7 +41,7 @@ export const DetailsPageStats: FunctionComponent< isIndexOpen, }) => { const [isLoading, setIsLoading] = useState(false); - const [error, setError] = useState(); + const [error, setError] = useState(); const [indexStats, setIndexStats] = useState(); const fetchIndexStats = useCallback(async () => { diff --git a/x-pack/plugins/index_management/public/application/services/api.ts b/x-pack/plugins/index_management/public/application/services/api.ts index 3daee29ec62e8..b209e4632bd3c 100644 --- a/x-pack/plugins/index_management/public/application/services/api.ts +++ b/x-pack/plugins/index_management/public/application/services/api.ts @@ -34,7 +34,13 @@ import { UIM_TEMPLATE_SIMULATE, INTERNAL_API_BASE_PATH, } from '../../../common/constants'; -import { TemplateDeserialized, TemplateListItem, DataStream, Index } from '../../../common'; +import { + TemplateDeserialized, + TemplateListItem, + DataStream, + Index, + IndexSettingsResponse, +} from '../../../common'; import { TAB_SETTINGS, TAB_MAPPING, TAB_STATS } from '../constants'; import { useRequest, sendRequest } from './use_request'; import { httpService } from './http'; @@ -334,3 +340,10 @@ export function loadIndexStatistics(indexName: string) { method: 'get', }); } + +export function useLoadIndexSettings(indexName: string) { + return useRequest({ + path: `${API_BASE_PATH}/settings/${encodeURIComponent(indexName)}`, + method: 'get', + }); +} diff --git a/x-pack/plugins/index_management/public/application/services/index.ts b/x-pack/plugins/index_management/public/application/services/index.ts index 5512171b358af..979f4268dc362 100644 --- a/x-pack/plugins/index_management/public/application/services/index.ts +++ b/x-pack/plugins/index_management/public/application/services/index.ts @@ -27,6 +27,7 @@ export { loadIndex, useLoadIndexMappings, loadIndexStatistics, + useLoadIndexSettings, } from './api'; export { sortTable } from './sort_table'; diff --git a/x-pack/plugins/index_management/public/application/services/use_request.ts b/x-pack/plugins/index_management/public/application/services/use_request.ts index 4746890361d59..93719a19c5a75 100644 --- a/x-pack/plugins/index_management/public/application/services/use_request.ts +++ b/x-pack/plugins/index_management/public/application/services/use_request.ts @@ -16,9 +16,9 @@ import { import { httpService } from './http'; -export const sendRequest = ( +export const sendRequest = ( config: SendRequestConfig -): Promise> => { +): Promise> => { return _sendRequest(httpService.httpClient, config); }; From 053d14253b5d85c26f8fad012b34640b2477c798 Mon Sep 17 00:00:00 2001 From: Tiago Costa Date: Wed, 6 Sep 2023 19:53:02 +0100 Subject: [PATCH 62/97] skip flaky suite (#165645) --- .../cypress/e2e/investigations/timeline_templates/export.cy.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/x-pack/test/security_solution_cypress/cypress/e2e/investigations/timeline_templates/export.cy.ts b/x-pack/test/security_solution_cypress/cypress/e2e/investigations/timeline_templates/export.cy.ts index f0bda2b4e3703..36e5205099b71 100644 --- a/x-pack/test/security_solution_cypress/cypress/e2e/investigations/timeline_templates/export.cy.ts +++ b/x-pack/test/security_solution_cypress/cypress/e2e/investigations/timeline_templates/export.cy.ts @@ -18,6 +18,7 @@ import { cleanKibana } from '../../../tasks/common'; import { searchByTitle } from '../../../tasks/table_pagination'; // FLAKY: https://github.com/elastic/kibana/issues/165760 +// FLAKY: https://github.com/elastic/kibana/issues/165645 describe('Export timelines', { tags: ['@ess', '@serverless', '@brokenInServerless'] }, () => { before(() => { cleanKibana(); From 78a2590f5f1d409147b035f78fa472dec23a5462 Mon Sep 17 00:00:00 2001 From: Tiago Costa Date: Wed, 6 Sep 2023 19:54:46 +0100 Subject: [PATCH 63/97] skip flaky suite (#165650) --- .../e2e/investigations/timelines/discover/cell_actions.cy.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/x-pack/test/security_solution_cypress/cypress/e2e/investigations/timelines/discover/cell_actions.cy.ts b/x-pack/test/security_solution_cypress/cypress/e2e/investigations/timelines/discover/cell_actions.cy.ts index 0325117e6c017..468b3cdf2f6fc 100644 --- a/x-pack/test/security_solution_cypress/cypress/e2e/investigations/timelines/discover/cell_actions.cy.ts +++ b/x-pack/test/security_solution_cypress/cypress/e2e/investigations/timelines/discover/cell_actions.cy.ts @@ -22,11 +22,12 @@ const INITIAL_START_DATE = 'Jan 18, 2021 @ 20:33:29.186'; const INITIAL_END_DATE = 'Jan 19, 2024 @ 20:33:29.186'; const TIMESTAMP_COLUMN_NAME = '@timestamp'; +// FLAKY: https://github.com/elastic/kibana/issues/165650 describe( `Discover Datagrid Cell Actions`, { env: { ftrConfig: { enableExperimental: ['discoverInTimeline'] } }, - tags: ['@ess', '@serverless'], + tags: ['@ess', '@serverless', '@brokenInServerless'], }, () => { beforeEach(() => { From c67b30467206fbe0007e732fc66e251d316f310d Mon Sep 17 00:00:00 2001 From: Tiago Costa Date: Wed, 6 Sep 2023 20:00:11 +0100 Subject: [PATCH 64/97] skip flaky suite (#165651) --- .../cypress/e2e/exceptions/entry/multiple_conditions.cy.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/x-pack/test/security_solution_cypress/cypress/e2e/exceptions/entry/multiple_conditions.cy.ts b/x-pack/test/security_solution_cypress/cypress/e2e/exceptions/entry/multiple_conditions.cy.ts index 5c71da0e14a35..daa65f293881e 100644 --- a/x-pack/test/security_solution_cypress/cypress/e2e/exceptions/entry/multiple_conditions.cy.ts +++ b/x-pack/test/security_solution_cypress/cypress/e2e/exceptions/entry/multiple_conditions.cy.ts @@ -28,9 +28,10 @@ import { import { DETECTIONS_RULE_MANAGEMENT_URL } from '../../../urls/navigation'; +// FLAKY: https://github.com/elastic/kibana/issues/165651 describe( 'Add multiple conditions and validate the generated exceptions', - { tags: ['@ess', '@serverless'] }, + { tags: ['@ess', '@serverless', '@brokenInServerless'] }, () => { beforeEach(() => { cy.task('esArchiverResetKibana'); From f0d530c7648f0022eaebd950e647523f0fe62522 Mon Sep 17 00:00:00 2001 From: Tiago Costa Date: Wed, 6 Sep 2023 20:02:39 +0100 Subject: [PATCH 65/97] skip flaky suite (#165744) --- .../cypress/e2e/investigations/timelines/export.cy.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/x-pack/test/security_solution_cypress/cypress/e2e/investigations/timelines/export.cy.ts b/x-pack/test/security_solution_cypress/cypress/e2e/investigations/timelines/export.cy.ts index 56020248a9133..c676f08a950ad 100644 --- a/x-pack/test/security_solution_cypress/cypress/e2e/investigations/timelines/export.cy.ts +++ b/x-pack/test/security_solution_cypress/cypress/e2e/investigations/timelines/export.cy.ts @@ -20,7 +20,8 @@ import { createTimeline } from '../../../tasks/api_calls/timelines'; import { expectedExportedTimeline, getTimeline } from '../../../objects/timeline'; import { cleanKibana } from '../../../tasks/common'; -describe('Export timelines', { tags: ['@ess', '@serverless'] }, () => { +// FLAKY: https://github.com/elastic/kibana/issues/165744 +describe('Export timelines', { tags: ['@ess', '@serverless', '@brokenInServerless'] }, () => { before(() => { cleanKibana(); login(); From f879c5123d9dbc9f16e7eaef4ff0d1fd89d58c43 Mon Sep 17 00:00:00 2001 From: Tiago Costa Date: Wed, 6 Sep 2023 20:03:46 +0100 Subject: [PATCH 66/97] skip flaky suite (#165740) --- .../rules_table/rules_table_persistent_state.cy.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/rule_management/rules_table/rules_table_persistent_state.cy.ts b/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/rule_management/rules_table/rules_table_persistent_state.cy.ts index 675fa704f5430..30c35ba44288a 100644 --- a/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/rule_management/rules_table/rules_table_persistent_state.cy.ts +++ b/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/rule_management/rules_table/rules_table_persistent_state.cy.ts @@ -111,6 +111,7 @@ describe('Rules table: persistent state', { tags: ['@ess', '@serverless'] }, () }); // Flaky on serverless + // FLAKY: https://github.com/elastic/kibana/issues/165740 describe( 'while on a happy path', { tags: ['@ess', '@serverless', '@brokenInServerless'] }, From 9884f6a4d0137965225d9b0b7eb6b6cedb280794 Mon Sep 17 00:00:00 2001 From: Tiago Costa Date: Wed, 6 Sep 2023 20:05:01 +0100 Subject: [PATCH 67/97] skip flaky suite (#165736) --- .../rule_details_flow/add_edit_endpoint_exception.cy.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/x-pack/test/security_solution_cypress/cypress/e2e/exceptions/rule_details_flow/add_edit_endpoint_exception.cy.ts b/x-pack/test/security_solution_cypress/cypress/e2e/exceptions/rule_details_flow/add_edit_endpoint_exception.cy.ts index cdf0b56347063..5102647f381d6 100644 --- a/x-pack/test/security_solution_cypress/cypress/e2e/exceptions/rule_details_flow/add_edit_endpoint_exception.cy.ts +++ b/x-pack/test/security_solution_cypress/cypress/e2e/exceptions/rule_details_flow/add_edit_endpoint_exception.cy.ts @@ -44,7 +44,8 @@ import { } from '../../../screens/exceptions'; import { createEndpointExceptionList } from '../../../tasks/api_calls/exceptions'; -describe('Add endpoint exception from rule details', { tags: ['@ess', '@serverless'] }, () => { +// FLAKY: https://github.com/elastic/kibana/issues/165736 +describe('Add endpoint exception from rule details', { tags: ['@ess', '@serverless', '@brokenInServerless'] }, () => { const ITEM_NAME = 'Sample Exception List Item'; before(() => { From c54fc020a000d9363cbc40bc50487f1e080e282a Mon Sep 17 00:00:00 2001 From: Tiago Costa Date: Wed, 6 Sep 2023 20:06:22 +0100 Subject: [PATCH 68/97] skip flaky suite (#165712) --- .../cypress/e2e/explore/cases/connector_options.cy.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/x-pack/test/security_solution_cypress/cypress/e2e/explore/cases/connector_options.cy.ts b/x-pack/test/security_solution_cypress/cypress/e2e/explore/cases/connector_options.cy.ts index b355da43ff179..da72f94935162 100644 --- a/x-pack/test/security_solution_cypress/cypress/e2e/explore/cases/connector_options.cy.ts +++ b/x-pack/test/security_solution_cypress/cypress/e2e/explore/cases/connector_options.cy.ts @@ -28,7 +28,8 @@ import { CASES_URL } from '../../../urls/navigation'; import { CONNECTOR_CARD_DETAILS, CONNECTOR_TITLE } from '../../../screens/case_details'; import { cleanKibana } from '../../../tasks/common'; -describe('Cases connector incident fields', { tags: ['@ess', '@serverless'] }, () => { +// FLAKY: https://github.com/elastic/kibana/issues/165712 +describe('Cases connector incident fields', { tags: ['@ess', '@serverless', '@brokenInServerless'] }, () => { before(() => { cleanKibana(); login(); From 5103f76e839b1dc13f4239e45264d000ec9ca8eb Mon Sep 17 00:00:00 2001 From: Tiago Costa Date: Wed, 6 Sep 2023 20:07:22 +0100 Subject: [PATCH 69/97] skip flaky suite (#165710) --- .../security_solution_cypress/cypress/e2e/urls/not_found.cy.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/x-pack/test/security_solution_cypress/cypress/e2e/urls/not_found.cy.ts b/x-pack/test/security_solution_cypress/cypress/e2e/urls/not_found.cy.ts index fc1e08db5512e..0233442eef259 100644 --- a/x-pack/test/security_solution_cypress/cypress/e2e/urls/not_found.cy.ts +++ b/x-pack/test/security_solution_cypress/cypress/e2e/urls/not_found.cy.ts @@ -24,7 +24,8 @@ import { NOT_FOUND } from '../../screens/common/page'; const mockRuleId = '5a4a0460-d822-11eb-8962-bfd4aff0a9b3'; -describe('Display not found page', { tags: ['@ess', '@serverless'] }, () => { +// FLAKY: https://github.com/elastic/kibana/issues/165710 +describe('Display not found page', { tags: ['@ess', '@serverless', '@brokenInServerless'] }, () => { beforeEach(() => { login(); visit(TIMELINES_URL); From 2d4c54cf98d0ab691da3a4e97b19f738619a001d Mon Sep 17 00:00:00 2001 From: Tiago Costa Date: Wed, 6 Sep 2023 20:09:29 +0100 Subject: [PATCH 70/97] skip flaky suite (#165699) --- .../e2e/detection_response/value_lists/value_lists.cy.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/value_lists/value_lists.cy.ts b/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/value_lists/value_lists.cy.ts index ad104df5789ca..4cacc2ddeb24b 100644 --- a/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/value_lists/value_lists.cy.ts +++ b/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/value_lists/value_lists.cy.ts @@ -34,8 +34,9 @@ const TEXT_LIST_FILE_NAME = 'value_list.txt'; const IPS_LIST_FILE_NAME = 'ip_list.txt'; const CIDRS_LIST_FILE_NAME = 'cidr_list.txt'; +// FLAKY: https://github.com/elastic/kibana/issues/165699 describe('value lists', () => { - describe('management modal', { tags: ['@ess', '@serverless'] }, () => { + describe('management modal', { tags: ['@ess', '@serverless', '@brokenInServerless'] }, () => { beforeEach(() => { login(); deleteValueLists([TEXT_LIST_FILE_NAME, IPS_LIST_FILE_NAME, CIDRS_LIST_FILE_NAME]); From ae405b11087ac108bcdf0a5c1463490b04308d41 Mon Sep 17 00:00:00 2001 From: Tiago Costa Date: Wed, 6 Sep 2023 20:11:00 +0100 Subject: [PATCH 71/97] skip flaky suite (#165663) --- .../e2e/investigations/timelines/discover/discover_state.cy.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/x-pack/test/security_solution_cypress/cypress/e2e/investigations/timelines/discover/discover_state.cy.ts b/x-pack/test/security_solution_cypress/cypress/e2e/investigations/timelines/discover/discover_state.cy.ts index 510dc37f14f55..6848fcafe3027 100644 --- a/x-pack/test/security_solution_cypress/cypress/e2e/investigations/timelines/discover/discover_state.cy.ts +++ b/x-pack/test/security_solution_cypress/cypress/e2e/investigations/timelines/discover/discover_state.cy.ts @@ -34,11 +34,12 @@ import { ALERTS, CSP_FINDINGS } from '../../../../screens/security_header'; const INITIAL_START_DATE = 'Jan 18, 2021 @ 20:33:29.186'; const INITIAL_END_DATE = 'Jan 19, 2024 @ 20:33:29.186'; +// FLAKY: https://github.com/elastic/kibana/issues/165663 describe( 'Discover State', { env: { ftrConfig: { enableExperimental: ['discoverInTimeline'] } }, - tags: ['@ess', '@serverless'], + tags: ['@ess', '@serverless', '@brokenInServerless'], }, () => { beforeEach(() => { From 8fbdd538870db9a71479feb07385c8408c9419e1 Mon Sep 17 00:00:00 2001 From: Tiago Costa Date: Wed, 6 Sep 2023 20:12:25 +0100 Subject: [PATCH 72/97] skip flaky suite (#165685) --- .../dashboards/entity_analytics_serverless_splash_screen.cy.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/x-pack/test/security_solution_cypress/cypress/e2e/explore/dashboards/entity_analytics_serverless_splash_screen.cy.ts b/x-pack/test/security_solution_cypress/cypress/e2e/explore/dashboards/entity_analytics_serverless_splash_screen.cy.ts index 7ae72fa4e3f4d..db5e0fa1bb67f 100644 --- a/x-pack/test/security_solution_cypress/cypress/e2e/explore/dashboards/entity_analytics_serverless_splash_screen.cy.ts +++ b/x-pack/test/security_solution_cypress/cypress/e2e/explore/dashboards/entity_analytics_serverless_splash_screen.cy.ts @@ -11,10 +11,11 @@ import { ENTITY_ANALYTICS_URL } from '../../../urls/navigation'; import { PAYWALL_DESCRIPTION } from '../../../screens/entity_analytics_serverless_splash'; +// FLAKY: https://github.com/elastic/kibana/issues/165685 describe( 'Entity Analytics Dashboard in Serverless', { - tags: '@serverless', + tags: ['@serverless', '@brokenInServerless'], env: { ftrConfig: { productTypes: [ From bd4c1a9f2bb56136b4c5b5aa6379385172ba6de3 Mon Sep 17 00:00:00 2001 From: Tiago Costa Date: Wed, 6 Sep 2023 20:13:56 +0100 Subject: [PATCH 73/97] skip flaky suite (#165690) --- .../shared_exception_list_page/manage_lists.cy.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/x-pack/test/security_solution_cypress/cypress/e2e/exceptions/shared_exception_lists_management/shared_exception_list_page/manage_lists.cy.ts b/x-pack/test/security_solution_cypress/cypress/e2e/exceptions/shared_exception_lists_management/shared_exception_list_page/manage_lists.cy.ts index 238d39bcd6e17..9f2b655fdfbb4 100644 --- a/x-pack/test/security_solution_cypress/cypress/e2e/exceptions/shared_exception_lists_management/shared_exception_list_page/manage_lists.cy.ts +++ b/x-pack/test/security_solution_cypress/cypress/e2e/exceptions/shared_exception_lists_management/shared_exception_list_page/manage_lists.cy.ts @@ -47,9 +47,10 @@ const getExceptionList2 = () => ({ let exceptionListResponse: Cypress.Response; +// FLAKY: https://github.com/elastic/kibana/issues/165690 describe( 'Manage lists from "Shared Exception Lists" page', - { tags: ['@ess', '@serverless'] }, + { tags: ['@ess', '@serverless', '@brokenInServerless'] }, () => { describe('Create/Export/Delete List', () => { before(() => { From ad9cca3c08e40574c62d7948e7163abf9392e71b Mon Sep 17 00:00:00 2001 From: Tiago Costa Date: Wed, 6 Sep 2023 20:15:10 +0100 Subject: [PATCH 74/97] fix(NA): eslint check --- .../add_edit_endpoint_exception.cy.ts | 240 +++++++++--------- 1 file changed, 122 insertions(+), 118 deletions(-) diff --git a/x-pack/test/security_solution_cypress/cypress/e2e/exceptions/rule_details_flow/add_edit_endpoint_exception.cy.ts b/x-pack/test/security_solution_cypress/cypress/e2e/exceptions/rule_details_flow/add_edit_endpoint_exception.cy.ts index 5102647f381d6..f3b84ebb98f7a 100644 --- a/x-pack/test/security_solution_cypress/cypress/e2e/exceptions/rule_details_flow/add_edit_endpoint_exception.cy.ts +++ b/x-pack/test/security_solution_cypress/cypress/e2e/exceptions/rule_details_flow/add_edit_endpoint_exception.cy.ts @@ -45,149 +45,153 @@ import { import { createEndpointExceptionList } from '../../../tasks/api_calls/exceptions'; // FLAKY: https://github.com/elastic/kibana/issues/165736 -describe('Add endpoint exception from rule details', { tags: ['@ess', '@serverless', '@brokenInServerless'] }, () => { - const ITEM_NAME = 'Sample Exception List Item'; - - before(() => { - cy.task('esArchiverResetKibana'); - cy.task('esArchiverLoad', { archiveName: 'auditbeat' }); - login(); - deleteAlertsAndRules(); - // create rule with exception - createEndpointExceptionList<{ - id: string; - list_id: string; - type: - | 'detection' - | 'rule_default' - | 'endpoint' - | 'endpoint_trusted_apps' - | 'endpoint_events' - | 'endpoint_host_isolation_exceptions' - | 'endpoint_blocklists'; - namespace_type: 'agnostic' | 'single'; - }>().then((response) => { - createRule( - getNewRule({ - query: 'event.code:*', - index: ['auditbeat*'], - exceptions_list: [ - { - id: response.body.id, - list_id: response.body.list_id, - type: response.body.type, - namespace_type: response.body.namespace_type, - }, - ], - rule_id: '2', - }) - ); +describe( + 'Add endpoint exception from rule details', + { tags: ['@ess', '@serverless', '@brokenInServerless'] }, + () => { + const ITEM_NAME = 'Sample Exception List Item'; + + before(() => { + cy.task('esArchiverResetKibana'); + cy.task('esArchiverLoad', { archiveName: 'auditbeat' }); + login(); + deleteAlertsAndRules(); + // create rule with exception + createEndpointExceptionList<{ + id: string; + list_id: string; + type: + | 'detection' + | 'rule_default' + | 'endpoint' + | 'endpoint_trusted_apps' + | 'endpoint_events' + | 'endpoint_host_isolation_exceptions' + | 'endpoint_blocklists'; + namespace_type: 'agnostic' | 'single'; + }>().then((response) => { + createRule( + getNewRule({ + query: 'event.code:*', + index: ['auditbeat*'], + exceptions_list: [ + { + id: response.body.id, + list_id: response.body.list_id, + type: response.body.type, + namespace_type: response.body.namespace_type, + }, + ], + rule_id: '2', + }) + ); + }); }); - }); - beforeEach(() => { - login(); - visitWithoutDateRange(DETECTIONS_RULE_MANAGEMENT_URL); - goToRuleDetails(); - goToEndpointExceptionsTab(); - }); + beforeEach(() => { + login(); + visitWithoutDateRange(DETECTIONS_RULE_MANAGEMENT_URL); + goToRuleDetails(); + goToEndpointExceptionsTab(); + }); - after(() => { - cy.task('esArchiverUnload', 'auditbeat'); - }); + after(() => { + cy.task('esArchiverUnload', 'auditbeat'); + }); - it('creates an exception item', () => { - // when no exceptions exist, empty component shows with action to add exception - cy.get(NO_EXCEPTIONS_EXIST_PROMPT).should('exist'); + it('creates an exception item', () => { + // when no exceptions exist, empty component shows with action to add exception + cy.get(NO_EXCEPTIONS_EXIST_PROMPT).should('exist'); - // open add exception modal - openExceptionFlyoutFromEmptyViewerPrompt(); + // open add exception modal + openExceptionFlyoutFromEmptyViewerPrompt(); - // submit button is disabled if no paramerters were added - cy.get(CONFIRM_BTN).should('have.attr', 'disabled'); + // submit button is disabled if no paramerters were added + cy.get(CONFIRM_BTN).should('have.attr', 'disabled'); - // for endpoint exceptions, must specify OS - selectOs('windows'); + // for endpoint exceptions, must specify OS + selectOs('windows'); - // add exception item conditions - addExceptionConditions({ - field: 'event.code', - operator: 'is', - values: ['foo'], - }); + // add exception item conditions + addExceptionConditions({ + field: 'event.code', + operator: 'is', + values: ['foo'], + }); - // Name is required so want to check that submit is still disabled - cy.get(CONFIRM_BTN).should('have.attr', 'disabled'); + // Name is required so want to check that submit is still disabled + cy.get(CONFIRM_BTN).should('have.attr', 'disabled'); - // add exception item name - addExceptionFlyoutItemName(ITEM_NAME); + // add exception item name + addExceptionFlyoutItemName(ITEM_NAME); - // Option to add to rule or add to list should NOT appear - cy.get(ADD_TO_RULE_OR_LIST_SECTION).should('not.exist'); + // Option to add to rule or add to list should NOT appear + cy.get(ADD_TO_RULE_OR_LIST_SECTION).should('not.exist'); - // not testing close alert functionality here, just ensuring that the options appear as expected - cy.get(CLOSE_SINGLE_ALERT_CHECKBOX).should('not.exist'); - cy.get(CLOSE_ALERTS_CHECKBOX).should('exist'); + // not testing close alert functionality here, just ensuring that the options appear as expected + cy.get(CLOSE_SINGLE_ALERT_CHECKBOX).should('not.exist'); + cy.get(CLOSE_ALERTS_CHECKBOX).should('exist'); - // submit - submitNewExceptionItem(); + // submit + submitNewExceptionItem(); - // new exception item displays - cy.get(EXCEPTION_ITEM_VIEWER_CONTAINER).should('have.length', 1); - }); + // new exception item displays + cy.get(EXCEPTION_ITEM_VIEWER_CONTAINER).should('have.length', 1); + }); - it('edits an endpoint exception item', () => { - const NEW_ITEM_NAME = 'Exception item-EDITED'; - const ITEM_FIELD = 'event.code'; - const FIELD_DIFFERENT_FROM_EXISTING_ITEM_FIELD = 'agent.type'; + it('edits an endpoint exception item', () => { + const NEW_ITEM_NAME = 'Exception item-EDITED'; + const ITEM_FIELD = 'event.code'; + const FIELD_DIFFERENT_FROM_EXISTING_ITEM_FIELD = 'agent.type'; - // displays existing exception items - cy.get(EXCEPTION_ITEM_VIEWER_CONTAINER).should('have.length', 1); - cy.get(NO_EXCEPTIONS_EXIST_PROMPT).should('not.exist'); - cy.get(EXCEPTION_CARD_ITEM_NAME).should('have.text', ITEM_NAME); - cy.get(EXCEPTION_CARD_ITEM_CONDITIONS).should('have.text', ` ${ITEM_FIELD}IS foo`); + // displays existing exception items + cy.get(EXCEPTION_ITEM_VIEWER_CONTAINER).should('have.length', 1); + cy.get(NO_EXCEPTIONS_EXIST_PROMPT).should('not.exist'); + cy.get(EXCEPTION_CARD_ITEM_NAME).should('have.text', ITEM_NAME); + cy.get(EXCEPTION_CARD_ITEM_CONDITIONS).should('have.text', ` ${ITEM_FIELD}IS foo`); - // open edit exception modal - openEditException(); + // open edit exception modal + openEditException(); - // edit exception item name - editExceptionFlyoutItemName(NEW_ITEM_NAME); + // edit exception item name + editExceptionFlyoutItemName(NEW_ITEM_NAME); - // check that the existing item's field is being populated - cy.get(EXCEPTION_ITEM_CONTAINER) - .eq(0) - .find(FIELD_INPUT_PARENT) - .eq(0) - .should('have.text', ITEM_FIELD); - cy.get(VALUES_INPUT).should('have.text', 'foo'); + // check that the existing item's field is being populated + cy.get(EXCEPTION_ITEM_CONTAINER) + .eq(0) + .find(FIELD_INPUT_PARENT) + .eq(0) + .should('have.text', ITEM_FIELD); + cy.get(VALUES_INPUT).should('have.text', 'foo'); - // edit conditions - editException(FIELD_DIFFERENT_FROM_EXISTING_ITEM_FIELD, 0, 0); + // edit conditions + editException(FIELD_DIFFERENT_FROM_EXISTING_ITEM_FIELD, 0, 0); - // submit - submitEditedExceptionItem(); + // submit + submitEditedExceptionItem(); - // new exception item displays - cy.get(EXCEPTION_ITEM_VIEWER_CONTAINER).should('have.length', 1); + // new exception item displays + cy.get(EXCEPTION_ITEM_VIEWER_CONTAINER).should('have.length', 1); - // check that updates stuck - cy.get(EXCEPTION_CARD_ITEM_NAME).should('have.text', NEW_ITEM_NAME); - cy.get(EXCEPTION_CARD_ITEM_CONDITIONS).should('have.text', ' agent.typeIS foo'); - }); + // check that updates stuck + cy.get(EXCEPTION_CARD_ITEM_NAME).should('have.text', NEW_ITEM_NAME); + cy.get(EXCEPTION_CARD_ITEM_CONDITIONS).should('have.text', ' agent.typeIS foo'); + }); - it('allows user to search for items', () => { - cy.get(EXCEPTION_ITEM_VIEWER_CONTAINER).should('have.length', 1); + it('allows user to search for items', () => { + cy.get(EXCEPTION_ITEM_VIEWER_CONTAINER).should('have.length', 1); - // can search for an exception value - searchForExceptionItem('foo'); + // can search for an exception value + searchForExceptionItem('foo'); - // new exception item displays - cy.get(EXCEPTION_ITEM_VIEWER_CONTAINER).should('have.length', 1); + // new exception item displays + cy.get(EXCEPTION_ITEM_VIEWER_CONTAINER).should('have.length', 1); - // displays empty search result view if no matches found - searchForExceptionItem('abc'); + // displays empty search result view if no matches found + searchForExceptionItem('abc'); - // new exception item displays - cy.get(NO_EXCEPTIONS_SEARCH_RESULTS_PROMPT).should('exist'); - }); -}); + // new exception item displays + cy.get(NO_EXCEPTIONS_SEARCH_RESULTS_PROMPT).should('exist'); + }); + } +); From 19162dcbfc2b3c358eff383b99c6d64dd3d9cbe0 Mon Sep 17 00:00:00 2001 From: Tiago Costa Date: Wed, 6 Sep 2023 20:15:36 +0100 Subject: [PATCH 75/97] fix(NA): eslint check --- .../e2e/explore/cases/connector_options.cy.ts | 112 ++++++++++-------- 1 file changed, 60 insertions(+), 52 deletions(-) diff --git a/x-pack/test/security_solution_cypress/cypress/e2e/explore/cases/connector_options.cy.ts b/x-pack/test/security_solution_cypress/cypress/e2e/explore/cases/connector_options.cy.ts index da72f94935162..21650dffb2912 100644 --- a/x-pack/test/security_solution_cypress/cypress/e2e/explore/cases/connector_options.cy.ts +++ b/x-pack/test/security_solution_cypress/cypress/e2e/explore/cases/connector_options.cy.ts @@ -29,61 +29,69 @@ import { CONNECTOR_CARD_DETAILS, CONNECTOR_TITLE } from '../../../screens/case_d import { cleanKibana } from '../../../tasks/common'; // FLAKY: https://github.com/elastic/kibana/issues/165712 -describe('Cases connector incident fields', { tags: ['@ess', '@serverless', '@brokenInServerless'] }, () => { - before(() => { - cleanKibana(); - login(); - }); - - beforeEach(() => { - login(); - cy.intercept('GET', '/api/cases/configure/connectors/_find', getMockConnectorsResponse()); - cy.intercept('POST', `/api/actions/connector/${getConnectorIds().sn}/_execute`, (req) => { - const response = - req.body.params.subAction === 'getChoices' - ? getExecuteResponses().servicenow.choices - : { status: 'ok', data: [] }; - req.reply(response); - }); - cy.intercept('POST', `/api/actions/connector/${getConnectorIds().jira}/_execute`, (req) => { - const response = - req.body.params.subAction === 'issueTypes' - ? getExecuteResponses().jira.issueTypes - : getExecuteResponses().jira.fieldsByIssueType; - req.reply(response); +describe( + 'Cases connector incident fields', + { tags: ['@ess', '@serverless', '@brokenInServerless'] }, + () => { + before(() => { + cleanKibana(); + login(); }); - cy.intercept( - 'POST', - `/api/actions/connector/${getConnectorIds().resilient}/_execute`, - (req) => { - const response = - req.body.params.subAction === 'incidentTypes' - ? getExecuteResponses().resilient.incidentTypes - : getExecuteResponses().resilient.severity; + beforeEach(() => { + login(); + cy.intercept('GET', '/api/cases/configure/connectors/_find', getMockConnectorsResponse()); + cy.intercept('POST', `/api/actions/connector/${getConnectorIds().sn}/_execute`, (req) => { + const response = + req.body.params.subAction === 'getChoices' + ? getExecuteResponses().servicenow.choices + : { status: 'ok', data: [] }; req.reply(response); - } - ); - cy.intercept('POST', `/api/cases/**/connector/${getConnectorIds().resilient}/_push`, (req) => { - req.reply(getCaseResponse()); + }); + cy.intercept('POST', `/api/actions/connector/${getConnectorIds().jira}/_execute`, (req) => { + const response = + req.body.params.subAction === 'issueTypes' + ? getExecuteResponses().jira.issueTypes + : getExecuteResponses().jira.fieldsByIssueType; + req.reply(response); + }); + cy.intercept( + 'POST', + `/api/actions/connector/${getConnectorIds().resilient}/_execute`, + (req) => { + const response = + req.body.params.subAction === 'incidentTypes' + ? getExecuteResponses().resilient.incidentTypes + : getExecuteResponses().resilient.severity; + + req.reply(response); + } + ); + cy.intercept( + 'POST', + `/api/cases/**/connector/${getConnectorIds().resilient}/_push`, + (req) => { + req.reply(getCaseResponse()); + } + ); }); - }); - it('Correct incident fields show when connector is changed', () => { - visitWithoutDateRange(CASES_URL); - goToCreateNewCase(); - fillCasesMandatoryfields(getCase1()); - fillJiraConnectorOptions(getJiraConnectorOptions()); - fillServiceNowConnectorOptions(getServiceNowConnectorOptions()); - fillIbmResilientConnectorOptions(getIbmResilientConnectorOptions()); - createCase(); + it('Correct incident fields show when connector is changed', () => { + visitWithoutDateRange(CASES_URL); + goToCreateNewCase(); + fillCasesMandatoryfields(getCase1()); + fillJiraConnectorOptions(getJiraConnectorOptions()); + fillServiceNowConnectorOptions(getServiceNowConnectorOptions()); + fillIbmResilientConnectorOptions(getIbmResilientConnectorOptions()); + createCase(); - cy.get(CONNECTOR_TITLE).should('have.text', getIbmResilientConnectorOptions().title); - cy.get(CONNECTOR_CARD_DETAILS).should( - 'have.text', - `Incident Types: ${getIbmResilientConnectorOptions().incidentTypes.join(', ')}Severity: ${ - getIbmResilientConnectorOptions().severity - }` - ); - }); -}); + cy.get(CONNECTOR_TITLE).should('have.text', getIbmResilientConnectorOptions().title); + cy.get(CONNECTOR_CARD_DETAILS).should( + 'have.text', + `Incident Types: ${getIbmResilientConnectorOptions().incidentTypes.join(', ')}Severity: ${ + getIbmResilientConnectorOptions().severity + }` + ); + }); + } +); From c30e5d20148c0cd7f256b26246c5975859094bae Mon Sep 17 00:00:00 2001 From: Tiago Costa Date: Wed, 6 Sep 2023 20:17:17 +0100 Subject: [PATCH 76/97] skip flaky suite (#165734) --- .../cypress/e2e/exceptions/entry/multiple_conditions.cy.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/x-pack/test/security_solution_cypress/cypress/e2e/exceptions/entry/multiple_conditions.cy.ts b/x-pack/test/security_solution_cypress/cypress/e2e/exceptions/entry/multiple_conditions.cy.ts index daa65f293881e..0f709e852100a 100644 --- a/x-pack/test/security_solution_cypress/cypress/e2e/exceptions/entry/multiple_conditions.cy.ts +++ b/x-pack/test/security_solution_cypress/cypress/e2e/exceptions/entry/multiple_conditions.cy.ts @@ -29,6 +29,7 @@ import { import { DETECTIONS_RULE_MANAGEMENT_URL } from '../../../urls/navigation'; // FLAKY: https://github.com/elastic/kibana/issues/165651 +// FLAKY: https://github.com/elastic/kibana/issues/165734 describe( 'Add multiple conditions and validate the generated exceptions', { tags: ['@ess', '@serverless', '@brokenInServerless'] }, From 6677cce0ae62b6413284f11997fcfd5778c8fd11 Mon Sep 17 00:00:00 2001 From: Tiago Costa Date: Wed, 6 Sep 2023 20:18:28 +0100 Subject: [PATCH 77/97] skip flaky suite (#165692) --- .../cypress/e2e/explore/network/overflow_items.cy.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/x-pack/test/security_solution_cypress/cypress/e2e/explore/network/overflow_items.cy.ts b/x-pack/test/security_solution_cypress/cypress/e2e/explore/network/overflow_items.cy.ts index 9ac413d75a6d2..0023054fb44a2 100644 --- a/x-pack/test/security_solution_cypress/cypress/e2e/explore/network/overflow_items.cy.ts +++ b/x-pack/test/security_solution_cypress/cypress/e2e/explore/network/overflow_items.cy.ts @@ -22,7 +22,8 @@ import { NETWORK_URL } from '../../../urls/navigation'; const testDomainOne = 'myTest'; const testDomainTwo = 'myTest2'; -describe('Overflow items', { tags: ['@ess', '@serverless'] }, () => { +// FLAKY: https://github.com/elastic/kibana/issues/165692 +describe('Overflow items', { tags: ['@ess', '@serverless', '@brokenInServerless'] }, () => { context('Network stats and tables', () => { before(() => { cy.task('esArchiverLoad', { archiveName: 'network' }); From c60fdb91cfe2271d46b96e69e599042174d61d36 Mon Sep 17 00:00:00 2001 From: Tiago Costa Date: Wed, 6 Sep 2023 20:19:25 +0100 Subject: [PATCH 78/97] skip flaky suite (#165747) --- .../e2e/investigations/timelines/discover/discover_state.cy.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/x-pack/test/security_solution_cypress/cypress/e2e/investigations/timelines/discover/discover_state.cy.ts b/x-pack/test/security_solution_cypress/cypress/e2e/investigations/timelines/discover/discover_state.cy.ts index 6848fcafe3027..a6d796585261f 100644 --- a/x-pack/test/security_solution_cypress/cypress/e2e/investigations/timelines/discover/discover_state.cy.ts +++ b/x-pack/test/security_solution_cypress/cypress/e2e/investigations/timelines/discover/discover_state.cy.ts @@ -35,6 +35,7 @@ const INITIAL_START_DATE = 'Jan 18, 2021 @ 20:33:29.186'; const INITIAL_END_DATE = 'Jan 19, 2024 @ 20:33:29.186'; // FLAKY: https://github.com/elastic/kibana/issues/165663 +// FLAKY: https://github.com/elastic/kibana/issues/165747 describe( 'Discover State', { From 308b50dbdf75a9a6b97fc5cd3ef8258ae0774678 Mon Sep 17 00:00:00 2001 From: Tiago Costa Date: Wed, 6 Sep 2023 20:20:22 +0100 Subject: [PATCH 79/97] skip flaky suite (#165652) --- .../cypress/e2e/exceptions/entry/multiple_conditions.cy.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/x-pack/test/security_solution_cypress/cypress/e2e/exceptions/entry/multiple_conditions.cy.ts b/x-pack/test/security_solution_cypress/cypress/e2e/exceptions/entry/multiple_conditions.cy.ts index 0f709e852100a..e1e396af156b5 100644 --- a/x-pack/test/security_solution_cypress/cypress/e2e/exceptions/entry/multiple_conditions.cy.ts +++ b/x-pack/test/security_solution_cypress/cypress/e2e/exceptions/entry/multiple_conditions.cy.ts @@ -30,6 +30,7 @@ import { DETECTIONS_RULE_MANAGEMENT_URL } from '../../../urls/navigation'; // FLAKY: https://github.com/elastic/kibana/issues/165651 // FLAKY: https://github.com/elastic/kibana/issues/165734 +// FLAKY: https://github.com/elastic/kibana/issues/165652 describe( 'Add multiple conditions and validate the generated exceptions', { tags: ['@ess', '@serverless', '@brokenInServerless'] }, From 2ef3520f05c67768749187b3b80df7ff627ac061 Mon Sep 17 00:00:00 2001 From: Tiago Costa Date: Wed, 6 Sep 2023 20:22:32 +0100 Subject: [PATCH 80/97] skip flaky suite (#165661) --- .../e2e/investigations/timeline_templates/creation.cy.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/x-pack/test/security_solution_cypress/cypress/e2e/investigations/timeline_templates/creation.cy.ts b/x-pack/test/security_solution_cypress/cypress/e2e/investigations/timeline_templates/creation.cy.ts index f31d75cf960ff..9b47afd241567 100644 --- a/x-pack/test/security_solution_cypress/cypress/e2e/investigations/timeline_templates/creation.cy.ts +++ b/x-pack/test/security_solution_cypress/cypress/e2e/investigations/timeline_templates/creation.cy.ts @@ -48,7 +48,8 @@ import { openTimeline, waitForTimelinesPanelToBeLoaded } from '../../../tasks/ti import { TIMELINES_URL } from '../../../urls/navigation'; -describe('Timeline Templates', { tags: ['@ess', '@serverless'] }, () => { +// FLAKY: https://github.com/elastic/kibana/issues/165661 +describe('Timeline Templates', { tags: ['@ess', '@serverless', '@brokenInServerless'] }, () => { before(() => { cleanKibana(); }); From a892d68a5cc40d03d0e2210c9d83b387466fe627 Mon Sep 17 00:00:00 2001 From: Tiago Costa Date: Wed, 6 Sep 2023 20:23:29 +0100 Subject: [PATCH 81/97] skip flaky suite (#165735) --- .../common/examples/search_examples/search_example.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/x-pack/test_serverless/functional/test_suites/common/examples/search_examples/search_example.ts b/x-pack/test_serverless/functional/test_suites/common/examples/search_examples/search_example.ts index 5638afc5b106d..67a2e41d50314 100644 --- a/x-pack/test_serverless/functional/test_suites/common/examples/search_examples/search_example.ts +++ b/x-pack/test_serverless/functional/test_suites/common/examples/search_examples/search_example.ts @@ -16,6 +16,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { const toasts = getService('toasts'); // Failing: See https://github.com/elastic/kibana/issues/165730 + // FLAKY: https://github.com/elastic/kibana/issues/165735 describe.skip('Search example', () => { describe('with bfetch', () => { testSearchExample(); From a2899ee68c3f8f19236248ce26e7a72fdab4828e Mon Sep 17 00:00:00 2001 From: Tiago Costa Date: Wed, 6 Sep 2023 20:57:46 +0100 Subject: [PATCH 82/97] fix(NA): re arrange brokenInServerless into the top --- .../manage_exceptions.cy.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/x-pack/test/security_solution_cypress/cypress/e2e/exceptions/shared_exception_lists_management/manage_exceptions.cy.ts b/x-pack/test/security_solution_cypress/cypress/e2e/exceptions/shared_exception_lists_management/manage_exceptions.cy.ts index 3df8598d86fa2..982fef4d31fd4 100644 --- a/x-pack/test/security_solution_cypress/cypress/e2e/exceptions/shared_exception_lists_management/manage_exceptions.cy.ts +++ b/x-pack/test/security_solution_cypress/cypress/e2e/exceptions/shared_exception_lists_management/manage_exceptions.cy.ts @@ -38,7 +38,8 @@ import { waitForExceptionsTableToBeLoaded, } from '../../../tasks/exceptions_table'; -describe('Add, edit and delete exception', { tags: ['@ess', '@serverless'] }, () => { +// FLAKY: https://github.com/elastic/kibana/issues/165795 +describe('Add, edit and delete exception', { tags: ['@ess', '@serverless', '@brokenInServerless'] }, () => { before(() => { cy.task('esArchiverResetKibana'); cy.task('esArchiverLoad', { archiveName: 'exceptions' }); @@ -60,10 +61,9 @@ describe('Add, edit and delete exception', { tags: ['@ess', '@serverless'] }, () const FIELD_DIFFERENT_FROM_EXISTING_ITEM_FIELD = 'agent.name'; const EXCEPTION_LIST_NAME = 'Newly created list'; - // FLAKY: https://github.com/elastic/kibana/issues/165795 describe( 'Add, Edit and delete Exception item', - { tags: ['@ess', '@serverless', '@brokenInServerless'] }, + { tags: ['@ess', '@serverless'] }, () => { it('should create exception item from Shared Exception List page and linked to a Rule', () => { // Click on "Create shared exception list" button on the header From fbf64ce90dd792493be036e86a11e8887b5cbf7a Mon Sep 17 00:00:00 2001 From: Tiago Costa Date: Wed, 6 Sep 2023 20:58:07 +0100 Subject: [PATCH 83/97] fix(NA): eslint checks --- .../manage_exceptions.cy.ts | 58 +++++++++---------- 1 file changed, 29 insertions(+), 29 deletions(-) diff --git a/x-pack/test/security_solution_cypress/cypress/e2e/exceptions/shared_exception_lists_management/manage_exceptions.cy.ts b/x-pack/test/security_solution_cypress/cypress/e2e/exceptions/shared_exception_lists_management/manage_exceptions.cy.ts index 982fef4d31fd4..20baf9de25e10 100644 --- a/x-pack/test/security_solution_cypress/cypress/e2e/exceptions/shared_exception_lists_management/manage_exceptions.cy.ts +++ b/x-pack/test/security_solution_cypress/cypress/e2e/exceptions/shared_exception_lists_management/manage_exceptions.cy.ts @@ -39,32 +39,32 @@ import { } from '../../../tasks/exceptions_table'; // FLAKY: https://github.com/elastic/kibana/issues/165795 -describe('Add, edit and delete exception', { tags: ['@ess', '@serverless', '@brokenInServerless'] }, () => { - before(() => { - cy.task('esArchiverResetKibana'); - cy.task('esArchiverLoad', { archiveName: 'exceptions' }); - - createRule(getNewRule()); - }); - - beforeEach(() => { - login(); - visitWithoutDateRange(EXCEPTIONS_URL); - waitForExceptionsTableToBeLoaded(); - }); - after(() => { - cy.task('esArchiverUnload', 'exceptions'); - }); - - const exceptionName = 'My item name'; - const exceptionNameEdited = 'My item name edited'; - const FIELD_DIFFERENT_FROM_EXISTING_ITEM_FIELD = 'agent.name'; - const EXCEPTION_LIST_NAME = 'Newly created list'; - - describe( - 'Add, Edit and delete Exception item', - { tags: ['@ess', '@serverless'] }, - () => { +describe( + 'Add, edit and delete exception', + { tags: ['@ess', '@serverless', '@brokenInServerless'] }, + () => { + before(() => { + cy.task('esArchiverResetKibana'); + cy.task('esArchiverLoad', { archiveName: 'exceptions' }); + + createRule(getNewRule()); + }); + + beforeEach(() => { + login(); + visitWithoutDateRange(EXCEPTIONS_URL); + waitForExceptionsTableToBeLoaded(); + }); + after(() => { + cy.task('esArchiverUnload', 'exceptions'); + }); + + const exceptionName = 'My item name'; + const exceptionNameEdited = 'My item name edited'; + const FIELD_DIFFERENT_FROM_EXISTING_ITEM_FIELD = 'agent.name'; + const EXCEPTION_LIST_NAME = 'Newly created list'; + + describe('Add, Edit and delete Exception item', { tags: ['@ess', '@serverless'] }, () => { it('should create exception item from Shared Exception List page and linked to a Rule', () => { // Click on "Create shared exception list" button on the header // Click on "Create exception item" @@ -148,6 +148,6 @@ describe('Add, edit and delete exception', { tags: ['@ess', '@serverless', '@bro cy.get(EMPTY_EXCEPTIONS_VIEWER).should('exist'); }); - } - ); -}); + }); + } +); From 118e75633f511f51a4b37878ba1deee1f53c3a2f Mon Sep 17 00:00:00 2001 From: Brad White Date: Wed, 6 Sep 2023 14:26:28 -0600 Subject: [PATCH 84/97] [kbn/es] Always guide user to auth for Docker pull errors (#165777) ## Summary Expands on #165422 to always guide towards Docker auth for pull issues. ## Testing - No credentials (error `denied: requested access to the resource is denied`) 1. Run `docker logout docker.elastic.co` 2. Run `yarn es serverless` - Bad credentials (error `unauthorized: authentication required`) 1. Visit https://docker-auth.elastic.co/github_auth and login to invalidate current token 2. Run `yarn es serverless` --- packages/kbn-es/src/utils/docker.ts | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/packages/kbn-es/src/utils/docker.ts b/packages/kbn-es/src/utils/docker.ts index 7a014d9fc19b9..7734cddc3c614 100644 --- a/packages/kbn-es/src/utils/docker.ts +++ b/packages/kbn-es/src/utils/docker.ts @@ -340,11 +340,12 @@ export async function maybePullDockerImage(log: ToolingLog, image: string) { await execa('docker', ['pull', image], { // inherit is required to show Docker pull output stdio: ['ignore', 'inherit', 'pipe'], - }).catch(({ message, stderr }) => { + }).catch(({ message }) => { throw createCliError( - stderr.includes('unauthorized: authentication required') - ? `Error authenticating with ${DOCKER_REGISTRY}. Visit https://docker-auth.elastic.co/github_auth to login.` - : message + `Error pulling image. This is likely an issue authenticating with ${DOCKER_REGISTRY}. +Visit ${chalk.bold.cyan('https://docker-auth.elastic.co/github_auth')} to login. + +${message}` ); }); } From 7db844bc66b02337dfb3f58d7b9db94d08f9fee2 Mon Sep 17 00:00:00 2001 From: Ash <1849116+ashokaditya@users.noreply.github.com> Date: Wed, 6 Sep 2023 22:27:19 +0200 Subject: [PATCH 85/97] [Security Solution][Endpoint][Response Actions] Remove redundant title tooltips on user and status badges (#165335) ## Summary Removes redundant hover tooltips that are visible on the user and status columns on the response actions history table. see elastic/kibana/issues/139076 --------- Co-authored-by: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> --- .../components/actions_log_table.tsx | 10 +++++++--- .../components/hooks.tsx | 12 ++++++------ ...us_badge.tsx => response_action_status_badge.tsx} | 8 +++++--- 3 files changed, 18 insertions(+), 12 deletions(-) rename x-pack/plugins/security_solution/public/management/components/endpoint_response_actions_list/components/{status_badge.tsx => response_action_status_badge.tsx} (65%) diff --git a/x-pack/plugins/security_solution/public/management/components/endpoint_response_actions_list/components/actions_log_table.tsx b/x-pack/plugins/security_solution/public/management/components/endpoint_response_actions_list/components/actions_log_table.tsx index 4e7e443972abc..81e1e6b7843fc 100644 --- a/x-pack/plugins/security_solution/public/management/components/endpoint_response_actions_list/components/actions_log_table.tsx +++ b/x-pack/plugins/security_solution/public/management/components/endpoint_response_actions_list/components/actions_log_table.tsx @@ -33,7 +33,7 @@ import { FormattedDate } from '../../../../common/components/formatted_date'; import { ARIA_LABELS, TABLE_COLUMN_NAMES, UX_MESSAGES } from '../translations'; import { getActionStatus, getUiCommand } from './hooks'; import { getEmptyValue } from '../../../../common/components/empty_value'; -import { StatusBadge } from './status_badge'; +import { ResponseActionStatusBadge } from './response_action_status_badge'; import { ActionsLogExpandedTray } from './action_log_expanded_tray'; import { useTestIdGenerator } from '../../../hooks/use_test_id_generator'; import { MANAGEMENT_PAGE_SIZE_OPTIONS } from '../../../common/constants'; @@ -42,7 +42,7 @@ import { useUrlPagination } from '../../../hooks/use_url_pagination'; const emptyValue = getEmptyValue(); // Truncated usernames -const StyledFacetButton = euiStyled(EuiFacetButton)` +const StyledFacetButton = euiStyled(EuiFacetButton).attrs({ title: undefined })` .euiText { margin-top: 0.38rem; overflow-y: visible !important; @@ -128,6 +128,10 @@ const getResponseActionListTableColumns = ({ - (false); useEffect(() => { if (selectedAgentIdsFromUrl && selectedAgentIdsFromUrl.length > 0) { @@ -240,7 +240,7 @@ export const useActionsLogFilter = ({ ? RESPONSE_ACTION_STATUS.map((statusName) => ({ key: statusName, label: ( - { return ( - + // We've a EuiTooltip that wraps this component, + // Thus we don't need to add a title tooltip as well. + {status} ); } ); -StatusBadge.displayName = 'StatusBadge'; +ResponseActionStatusBadge.displayName = 'ResponseActionStatusBadge'; From b1b9340c10febaaa24d39bb96173fb60769d9248 Mon Sep 17 00:00:00 2001 From: Matthew Kime Date: Wed, 6 Sep 2023 15:52:02 -0500 Subject: [PATCH 86/97] [data views] Disable rollup ui elements on serverless (#164098) ## Summary While rollup functionality is deprecated in serverless, its still possible to import a rollup data view. Lets hide any mention of this since it will be lacking all rollup functionality. --- packages/kbn-optimizer/limits.yml | 2 +- .../__snapshots__/utils.test.ts.snap | 1 + .../edit_index_pattern/edit_index_pattern.tsx | 20 +++- .../index_pattern_table.tsx | 4 +- .../public/components/utils.test.ts | 1 + .../public/components/utils.ts | 12 ++- .../public/data_views_service_public.ts | 8 ++ src/plugins/data_views/public/mocks.ts | 4 +- src/plugins/data_views/public/plugin.ts | 6 +- src/plugins/data_views/public/types.ts | 6 +- x-pack/plugins/rollup/public/plugin.ts | 5 +- .../test_suites/common/data_view_mgmt.ts | 99 ++++++++++++++----- 12 files changed, 127 insertions(+), 41 deletions(-) diff --git a/packages/kbn-optimizer/limits.yml b/packages/kbn-optimizer/limits.yml index a3bee52c09267..ce349c219dddc 100644 --- a/packages/kbn-optimizer/limits.yml +++ b/packages/kbn-optimizer/limits.yml @@ -31,7 +31,7 @@ pageLoadAssetSize: dataViewEditor: 28082 dataViewFieldEditor: 27000 dataViewManagement: 5000 - dataViews: 47000 + dataViews: 47300 dataVisualizer: 27530 devTools: 38637 discover: 99999 diff --git a/src/plugins/data_view_management/public/components/__snapshots__/utils.test.ts.snap b/src/plugins/data_view_management/public/components/__snapshots__/utils.test.ts.snap index 59bdcb5d4360e..5329da0bd89fb 100644 --- a/src/plugins/data_view_management/public/components/__snapshots__/utils.test.ts.snap +++ b/src/plugins/data_view_management/public/components/__snapshots__/utils.test.ts.snap @@ -11,6 +11,7 @@ Array [ "sort": "0test name", "tags": Array [ Object { + "data-test-subj": "default-tag", "key": "default", "name": "Default", }, diff --git a/src/plugins/data_view_management/public/components/edit_index_pattern/edit_index_pattern.tsx b/src/plugins/data_view_management/public/components/edit_index_pattern/edit_index_pattern.tsx index adbdd1cd2681f..2ab485fdb1de1 100644 --- a/src/plugins/data_view_management/public/components/edit_index_pattern/edit_index_pattern.tsx +++ b/src/plugins/data_view_management/public/components/edit_index_pattern/edit_index_pattern.tsx @@ -77,7 +77,9 @@ export const EditIndexPattern = withRouter( indexPattern.fields.getAll().filter((field) => field.type === 'conflict') ); const [defaultIndex, setDefaultIndex] = useState(uiSettings.get('defaultIndex')); - const [tags, setTags] = useState>([]); + const [tags, setTags] = useState< + Array<{ key: string; 'data-test-subj': string; name: string }> + >([]); const [showEditDialog, setShowEditDialog] = useState(false); const [relationships, setRelationships] = useState([]); const [allowedTypes, setAllowedTypes] = useState([]); @@ -108,8 +110,10 @@ export const EditIndexPattern = withRouter( }, [indexPattern]); useEffect(() => { - setTags(getTags(indexPattern, indexPattern.id === defaultIndex)); - }, [defaultIndex, indexPattern]); + setTags( + getTags(indexPattern, indexPattern.id === defaultIndex, dataViews.getRollupsEnabled()) + ); + }, [defaultIndex, indexPattern, dataViews]); const setDefaultPattern = useCallback(() => { uiSettings.set('defaultIndex', indexPattern.id); @@ -125,7 +129,9 @@ export const EditIndexPattern = withRouter( }, }); - const isRollup = new URLSearchParams(useLocation().search).get('type') === 'rollup'; + const isRollup = + new URLSearchParams(useLocation().search).get('type') === 'rollup' && + dataViews.getRollupsEnabled(); const displayIndexPatternEditor = showEditDialog ? ( { @@ -237,7 +243,11 @@ export const EditIndexPattern = withRouter( {tags.map((tag) => ( {tag.key === 'default' ? ( - + {tag.name} ) : ( diff --git a/src/plugins/data_view_management/public/components/index_pattern_table/index_pattern_table.tsx b/src/plugins/data_view_management/public/components/index_pattern_table/index_pattern_table.tsx index 0d0215e6342d7..12d9e1773e138 100644 --- a/src/plugins/data_view_management/public/components/index_pattern_table/index_pattern_table.tsx +++ b/src/plugins/data_view_management/public/components/index_pattern_table/index_pattern_table.tsx @@ -164,7 +164,9 @@ export const IndexPatternTable = ({ chrome.docTitle.change(title); - const isRollup = new URLSearchParams(useLocation().search).get('type') === 'rollup'; + const isRollup = + new URLSearchParams(useLocation().search).get('type') === 'rollup' && + dataViews.getRollupsEnabled(); const ContextWrapper = useMemo( () => (spaces ? spaces.ui.components.getSpacesContextProvider : getEmptyFunctionComponent), diff --git a/src/plugins/data_view_management/public/components/utils.test.ts b/src/plugins/data_view_management/public/components/utils.test.ts index b5ea7b7dc240a..fedeb8b67ca15 100644 --- a/src/plugins/data_view_management/public/components/utils.test.ts +++ b/src/plugins/data_view_management/public/components/utils.test.ts @@ -24,6 +24,7 @@ const indexPatternContractMock = { ]) ), get: jest.fn().mockReturnValue(Promise.resolve({})), + getRollupsEnabled: jest.fn().mockReturnValue(true), } as unknown as jest.Mocked; test('getting index patterns', async () => { diff --git a/src/plugins/data_view_management/public/components/utils.ts b/src/plugins/data_view_management/public/components/utils.ts index 722ad5059a598..1818753162f6d 100644 --- a/src/plugins/data_view_management/public/components/utils.ts +++ b/src/plugins/data_view_management/public/components/utils.ts @@ -37,7 +37,7 @@ export async function getIndexPatterns(defaultIndex: string, dataViewsService: D const indexPatternsListItems = existingIndexPatterns.map((idxPattern) => { const { id, title, namespaces, name } = idxPattern; const isDefault = defaultIndex === id; - const tags = getTags(idxPattern, isDefault); + const tags = getTags(idxPattern, isDefault, dataViewsService.getRollupsEnabled()); const displayName = name ? name : title; return { @@ -68,18 +68,24 @@ export async function getIndexPatterns(defaultIndex: string, dataViewsService: D ); } -export const getTags = (indexPattern: DataViewListItem | DataView, isDefault: boolean) => { +export const getTags = ( + indexPattern: DataViewListItem | DataView, + isDefault: boolean, + rollupsEnabled: boolean +) => { const tags = []; if (isDefault) { tags.push({ key: 'default', name: defaultIndexPatternListName, + 'data-test-subj': 'default-tag', }); } - if (isRollup(indexPattern.type)) { + if (isRollup(indexPattern.type) && rollupsEnabled) { tags.push({ key: 'rollup', name: rollupIndexPatternListName, + 'data-test-subj': 'rollup-tag', }); } return tags; diff --git a/src/plugins/data_views/public/data_views_service_public.ts b/src/plugins/data_views/public/data_views_service_public.ts index 73f4fb6987fa0..565fc8dc16708 100644 --- a/src/plugins/data_views/public/data_views_service_public.ts +++ b/src/plugins/data_views/public/data_views_service_public.ts @@ -29,6 +29,8 @@ export interface DataViewsServicePublicDeps extends DataViewsServiceDeps { showAllIndices?: boolean; isRollupIndex: (indexName: string) => boolean; }) => Promise; + + getRollupsEnabled: () => boolean; scriptedFieldsEnabled: boolean; } @@ -45,6 +47,7 @@ export class DataViewsServicePublic extends DataViewsService { isRollupIndex: (indexName: string) => boolean; }) => Promise; public hasData: HasDataService; + private rollupsEnabled: boolean = false; public readonly scriptedFieldsEnabled: boolean; /** @@ -57,6 +60,11 @@ export class DataViewsServicePublic extends DataViewsService { this.getCanSaveSync = deps.getCanSaveSync; this.hasData = deps.hasData; this.getIndices = deps.getIndices; + this.rollupsEnabled = deps.getRollupsEnabled(); this.scriptedFieldsEnabled = deps.scriptedFieldsEnabled; } + + getRollupsEnabled() { + return this.rollupsEnabled; + } } diff --git a/src/plugins/data_views/public/mocks.ts b/src/plugins/data_views/public/mocks.ts index 2178cf4503003..e9d5b487b8b00 100644 --- a/src/plugins/data_views/public/mocks.ts +++ b/src/plugins/data_views/public/mocks.ts @@ -11,7 +11,9 @@ import { DataViewsPlugin, DataViewsContract } from '.'; export type Setup = jest.Mocked>; export type Start = jest.Mocked>; -const createSetupContract = (): Setup => ({}); +const createSetupContract = (): Setup => ({ + enableRollups: jest.fn(), +}); const createStartContract = (): Start => { return { diff --git a/src/plugins/data_views/public/plugin.ts b/src/plugins/data_views/public/plugin.ts index 98558c803da10..b6997b107410f 100644 --- a/src/plugins/data_views/public/plugin.ts +++ b/src/plugins/data_views/public/plugin.ts @@ -40,6 +40,7 @@ export class DataViewsPublicPlugin > { private readonly hasData = new HasData(); + private rollupsEnabled: boolean = false; constructor(private readonly initializerContext: PluginInitializerContext) {} @@ -59,7 +60,9 @@ export class DataViewsPublicPlugin }), }); - return {}; + return { + enableRollups: () => (this.rollupsEnabled = true), + }; } public start( @@ -96,6 +99,7 @@ export class DataViewsPublicPlugin getCanSaveAdvancedSettings: () => Promise.resolve(application.capabilities.advancedSettings.save === true), getIndices: (props) => getIndices({ ...props, http: core.http }), + getRollupsEnabled: () => this.rollupsEnabled, scriptedFieldsEnabled: config.scriptedFieldsEnabled === false ? false : true, // accounting for null value }); } diff --git a/src/plugins/data_views/public/types.ts b/src/plugins/data_views/public/types.ts index fde0828748f93..08c8eeb62fc2e 100644 --- a/src/plugins/data_views/public/types.ts +++ b/src/plugins/data_views/public/types.ts @@ -109,8 +109,9 @@ export interface DataViewsPublicStartDependencies { /** * Data plugin public Setup contract */ -// eslint-disable-next-line @typescript-eslint/no-empty-interface -export interface DataViewsPublicPluginSetup {} +export interface DataViewsPublicPluginSetup { + enableRollups: () => void; +} export interface DataViewsServicePublic extends DataViewsServicePublicMethods { getCanSaveSync: () => boolean; @@ -120,6 +121,7 @@ export interface DataViewsServicePublic extends DataViewsServicePublicMethods { showAllIndices?: boolean; isRollupIndex: (indexName: string) => boolean; }) => Promise; + getRollupsEnabled: () => boolean; scriptedFieldsEnabled: boolean; } diff --git a/x-pack/plugins/rollup/public/plugin.ts b/x-pack/plugins/rollup/public/plugin.ts index 27e8ad8b59d34..dfa54d0c4e267 100644 --- a/x-pack/plugins/rollup/public/plugin.ts +++ b/x-pack/plugins/rollup/public/plugin.ts @@ -11,6 +11,7 @@ import type { HomePublicPluginSetup } from '@kbn/home-plugin/public'; import { ManagementSetup } from '@kbn/management-plugin/public'; import { IndexManagementPluginSetup } from '@kbn/index-management-plugin/public'; import { UsageCollectionSetup } from '@kbn/usage-collection-plugin/public'; +import { DataViewsPublicPluginSetup } from '@kbn/data-views-plugin/public/types'; import { rollupBadgeExtension, rollupToggleExtension } from './extend_index_management'; import { UIM_APP_NAME } from '../common'; // @ts-ignore @@ -23,6 +24,7 @@ export interface RollupPluginSetupDependencies { management: ManagementSetup; indexManagement?: IndexManagementPluginSetup; usageCollection?: UsageCollectionSetup; + dataViews: DataViewsPublicPluginSetup; } export class RollupPlugin implements Plugin { @@ -30,7 +32,7 @@ export class RollupPlugin implements Plugin { setup( core: CoreSetup, - { home, management, indexManagement, usageCollection }: RollupPluginSetupDependencies + { home, management, indexManagement, usageCollection, dataViews }: RollupPluginSetupDependencies ) { const { ui: { enabled: isRollupUiEnabled }, @@ -62,6 +64,7 @@ export class RollupPlugin implements Plugin { } if (isRollupUiEnabled) { + dataViews.enableRollups(); const pluginName = i18n.translate('xpack.rollupJobs.appTitle', { defaultMessage: 'Rollup Jobs', }); diff --git a/x-pack/test_serverless/functional/test_suites/common/data_view_mgmt.ts b/x-pack/test_serverless/functional/test_suites/common/data_view_mgmt.ts index 3bbf9eec4b20f..1b6972162f8ee 100644 --- a/x-pack/test_serverless/functional/test_suites/common/data_view_mgmt.ts +++ b/x-pack/test_serverless/functional/test_suites/common/data_view_mgmt.ts @@ -7,6 +7,8 @@ import expect from 'expect'; import { DATA_VIEW_PATH } from '@kbn/data-views-plugin/server'; +import { ELASTIC_HTTP_VERSION_HEADER } from '@kbn/core-http-common'; +import { INITIAL_REST_VERSION } from '@kbn/data-views-plugin/server/constants'; import { FtrProviderContext } from '../../ftr_provider_context'; const archivePath = 'test/api_integration/fixtures/es_archiver/index_patterns/basic_index'; @@ -21,37 +23,82 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { // FLAKY: https://github.com/elastic/kibana/issues/165796 // FLAKY: https://github.com/elastic/kibana/issues/165425 describe.skip('Data View Management', function () { - let dataViewId = ''; - - before(async () => { - await esArchiver.load(archivePath); - - const response = await supertest - .post(DATA_VIEW_PATH) - .set('kbn-xsrf', 'some-xsrf-token') - .send({ - data_view: { - title: 'basic_index', - }, - override: true, - }); + describe('disables scripted fields', function () { + let dataViewId = ''; - expect(response.status).toBe(200); - dataViewId = response.body.data_view.id; - }); + before(async () => { + await esArchiver.load(archivePath); + + const response = await supertest + .post(DATA_VIEW_PATH) + .set('kbn-xsrf', 'some-xsrf-token') + .send({ + data_view: { + title: 'basic_index', + }, + override: true, + }); + + expect(response.status).toBe(200); + dataViewId = response.body.data_view.id; + }); + + after(async () => { + await esArchiver.unload(archivePath); + await supertest + .delete(`${DATA_VIEW_PATH}/${dataViewId}`) + .set('kbn-xsrf', 'some-xsrf-token'); + }); - after(async () => { - await esArchiver.unload(archivePath); - await supertest.delete(`${DATA_VIEW_PATH}/${dataViewId}`).set('kbn-xsrf', 'some-xsrf-token'); + it('Scripted fields tab is missing', async () => { + await PageObjects.common.navigateToUrl('management', 'kibana/dataViews', { + shouldUseHashForSubUrl: false, + }); + await testSubjects.click('detail-link-basic_index'); + await testSubjects.exists('tab-indexedFields'); + await testSubjects.missingOrFail('tab-scriptedFields'); + }); }); - it('Scripted fields tab is missing', async () => { - await PageObjects.common.navigateToUrl('management', 'kibana/dataViews', { - shouldUseHashForSubUrl: false, + describe('disables rollups', function () { + let dataViewId = ''; + before(async () => { + await esArchiver.load( + 'test/api_integration/fixtures/es_archiver/index_patterns/basic_index' + ); + + const response = await supertest + .post(DATA_VIEW_PATH) + .set('kbn-xsrf', 'some-xsrf-token') + .send({ + data_view: { + title: 'basic_index', + type: 'rollup', + }, + override: true, + }) + .set(ELASTIC_HTTP_VERSION_HEADER, INITIAL_REST_VERSION); + dataViewId = response.body.data_view.id; + }); + + after(async () => { + await esArchiver.unload( + 'test/api_integration/fixtures/es_archiver/index_patterns/basic_index' + ); + await supertest + .delete(`${DATA_VIEW_PATH}/${dataViewId}`) + .set('kbn-xsrf', 'some-xsrf-token'); + }); + + it('hides rollup UI tags', async () => { + await PageObjects.common.navigateToUrl('management', 'kibana/dataViews', { + shouldUseHashForSubUrl: false, + }); + await testSubjects.exists('detail-link-basic_index'); + await testSubjects.missingOrFail('rollup-tag'); + await testSubjects.click('detail-link-basic_index'); + await testSubjects.missingOrFail('rollup-tag'); }); - await testSubjects.click('detail-link-basic_index'); - await testSubjects.exists('tab-indexedFields'); - await testSubjects.missingOrFail('tab-scriptedFields'); }); }); } From 49ff1f152e43bc19fbdeb426fd28be372e50b3e4 Mon Sep 17 00:00:00 2001 From: Philippe Oberti Date: Wed, 6 Sep 2023 23:19:47 +0200 Subject: [PATCH 87/97] [Security Solution] expandable flyout - change no prevalence data message for 8.10 fix (#165845) ## Summary Unfortunately, the prevalence sections of the new expandable flyout has an issue and data is inconsistently being shown on the UI. We do not have time to put a proper fix in place for `8.10`, so it was decided to change the no-data message to be consistent between the overview section and the details section. ### 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) Co-authored-by: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> Co-authored-by: christineweng <18648970+christineweng@users.noreply.github.com> --- .../public/flyout/right/components/translations.ts | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/x-pack/plugins/security_solution/public/flyout/right/components/translations.ts b/x-pack/plugins/security_solution/public/flyout/right/components/translations.ts index b9c6fd2692ac3..f623d4ee2f7db 100644 --- a/x-pack/plugins/security_solution/public/flyout/right/components/translations.ts +++ b/x-pack/plugins/security_solution/public/flyout/right/components/translations.ts @@ -167,8 +167,7 @@ export const PREVALENCE_TITLE = i18n.translate( export const PREVALENCE_NO_DATA = i18n.translate( 'xpack.securitySolution.flyout.documentDetails.prevalenceNoData', { - defaultMessage: - 'Over the last 30 days, the highlighted fields for this alert were observed frequently on other host and user events.', + defaultMessage: 'No prevalence data available.', } ); From 977d7f86287f78566841c336a9e71dc83af4e2a0 Mon Sep 17 00:00:00 2001 From: Lisa Cawley Date: Wed, 6 Sep 2023 14:39:40 -0700 Subject: [PATCH 88/97] [DOCS] Move preconfigured PagerDuty connector details (#165361) --- .../connector-apis-passthru.asciidoc | 32 ++++++++++++-- .../action-types/pagerduty.asciidoc | 32 ++------------ .../pre-configured-connectors.asciidoc | 21 +++++++++ docs/settings/alert-action-settings.asciidoc | 3 ++ .../plugins/actions/docs/openapi/bundled.json | 43 ++++++++++++++++++- .../plugins/actions/docs/openapi/bundled.yaml | 31 ++++++++++++- .../schemas/config_properties_pagerduty.yaml | 8 +++- .../schemas/secrets_properties_pagerduty.yaml | 9 +++- ...}@api@actions@connector@{connectorid}.yaml | 2 +- 9 files changed, 141 insertions(+), 40 deletions(-) diff --git a/docs/api-generated/connectors/connector-apis-passthru.asciidoc b/docs/api-generated/connectors/connector-apis-passthru.asciidoc index aefb065281d3a..004946cfdb335 100644 --- a/docs/api-generated/connectors/connector-apis-passthru.asciidoc +++ b/docs/api-generated/connectors/connector-apis-passthru.asciidoc @@ -1006,6 +1006,7 @@ Any modifications made to this file will be overwritten.
  • config_properties_index - Connector request properties for an index connector
  • config_properties_jira - Connector request properties for a Jira connector
  • config_properties_opsgenie - Connector request properties for an Opsgenie connector
  • +
  • config_properties_pagerduty - Connector request properties for a PagerDuty connector
  • config_properties_resilient - Connector request properties for a IBM Resilient connector
  • config_properties_servicenow - Connector request properties for a ServiceNow ITSM connector
  • config_properties_servicenow_itom - Connector request properties for a ServiceNow ITSM connector
  • @@ -1089,6 +1090,7 @@ Any modifications made to this file will be overwritten.
  • secrets_properties_genai - Connector secrets properties for a generative AI connector
  • secrets_properties_jira - Connector secrets properties for a Jira connector
  • secrets_properties_opsgenie - Connector secrets properties for an Opsgenie connector
  • +
  • secrets_properties_pagerduty - Connector secrets properties for a PagerDuty connector
  • secrets_properties_resilient - Connector secrets properties for IBM Resilient connector
  • secrets_properties_servicenow - Connector secrets properties for ServiceNow ITOM, ServiceNow ITSM, and ServiceNow SecOps connectors
  • secrets_properties_slack_api - Connector secrets properties for a Web API Slack connector
  • @@ -1100,6 +1102,7 @@ Any modifications made to this file will be overwritten.
  • update_connector_request_index - Update index connector request
  • update_connector_request_jira - Update Jira connector request
  • update_connector_request_opsgenie - Update Opsgenie connector request
  • +
  • update_connector_request_pagerduty - Update PagerDuty connector request
  • update_connector_request_resilient - Update IBM Resilient connector request
  • update_connector_request_serverlog - Update server log connector request
  • update_connector_request_servicenow - Update ServiceNow ITSM connector or ServiceNow SecOps request
  • @@ -1409,6 +1412,13 @@ Any modifications made to this file will be overwritten.
    apiUrl
    String The Opsgenie URL. For example, https://api.opsgenie.com or https://api.eu.opsgenie.com. If you are using the xpack.actions.allowedHosts setting, add the hostname to the allowed hosts.